<?php
  // Filename: index.php
  //
  // Modul: Controller: PhPeppershop, Startseite
  //
  // Autoren: José Fontanil & Reto Glanzmann & Roland Bruehwiler & Glarotech GmbH
  //
  // Zweck: Startseite des PepperShop E-Commerce Systems.
  //
  // Sicherheitsstatus:        *** ADMIN ***
  //
  // Version: 7.0.0
  //
  // CVS-Version / Datum: $Id: index.php,v 1.143 2019/03/15 12:42:31 doerirem Exp $ $Dl: 24.05.19 15:12:47$
  //
  // -----------------------------------------------------------------------
  // PepperShop Shopsystem
  // Copyright (C) 2001-2019 Jose Fontanil, Reto Glanzmann, Roland Bruehwiler, Glarotech GmbH
  // 
  // Lizenz
  // ======
  // 
  // Die verbindliche PepperShop Lizenz ist in folgender 
  // Datei definiert: PepperShop_license.txt
  // -----------------------------------------------------------------------

  // -----------------------------------------------------------------------
  // Wenn der 'Haendlermodus' aktiviert wurde: Test ob Kunde eingeloggt ist
  // Pfadkonstante fuer USER_AUTH.php definieren (USER_AUTH.php --> Haendlermodus)
  define('AUTH_VIA_INDEX', 'yes'); // ACHTUNG: Diese Konstante wird in get_webroot_path() ausgewertet!
  define('AUTH_PATH', 'shop/');
 
  // Ruecksetzen allfaellig schon gesetzter Werte (Reset), falls keine Parameter angegeben worden sind:
  if (!is_array($_GET) || empty($_GET)) {
      $_GET['kat_aktiv']    = '0';
      $_GET['grp_aktiv']    = '';
      $_GET['kat_last']     = '0';
      $_GET['Kategorie_ID'] = '0';
      $_GET['Ziel_ID']      = '';
  }

  // Falls irregulaere land Werte uebergeben werden, diese hier ausfiltern!
  if(isset($_GET['land']) && strlen($_GET['land']) != 2){
      unset($_GET['land']);
  }

  // -----------------------------------------------------------------------
  // Benoetigte Dateien includen
  include_once('shop/always_include.php');

  // Der Aufruf der Startseite ist nicht fuer Path-Info Angaben ausgelegt. Dies fuehrt zu falschen CSS-Pfaden
  // und somit via SEO-Links zu einer riesigen Anzahl an falsch formatierten duplicate content Seiten. Wir
  // leiten hier den Besucher entsprechend um.
  if (isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO'] != '') {
      if (isset($_SERVER['REQUEST_URI']) && !empty($_SERVER['REQUEST_URI']) && $_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) {
          $current_url = $_SERVER['REQUEST_URI'];
      }
      elseif($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) {
          // REQUEST_URI ist nicht vorhanden. Wir emulieren dies mit PHP_SELF + QUERY_STRING
          $current_url = $_SERVER['PHP_SELF'];
          if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) $current_url.='?'.$_SERVER['QUERY_STRING'];
      }
      else {
          $current_url = '';
      }
      if($current_url != '') {
          // URL zusammenstellen (Schema + Host + URL + Path-Info wegschneiden (urlencoded mit /))
          $current_url = get_aktuelles_http_schema(true).str_replace(str_replace('%2F','/',rawurlencode($_SERVER['PATH_INFO'])),'',$current_url);
          redirect_user_to_permanently($current_url);
          // Programmabbruch nach Redirect
          exit;
      }
  }

  // Header-Redirect, falls Shop mit Session-ID in URL aufgerufen wurde, dies aber abgeschaltet ist (SESSION_ID_IN_URL = false)
  modul_check('seoperf_optimize');

  // Mobile PepperShop (Umleitung)
  if (modul_check('mobile_config')){
      $mobile_config = mobile_config::get_instance();
      $mobile_config->redirect_mobile_device('standard',$_GET);
  }

  // GeoIP Funktionalitaet als Modul
  if (GEOIP_MODUL_VERWENDEN && modul_check('geoip/geo')){
      $geoip = new geoip_erfassung($my_session);
  }

  // $preferred_lang = strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2))

  // Erkennung, ob es sich um ein Deeplink handelt. Wenn ja, leiten wir den
  // Shopkunden gleich weiter zu der angegebenen Kategorie.

  // Falls der PepperShop ueber einen Affiliate-Partner aufgerufen wurde, vermerken wir den Aufruf
  if (function_exists('check_affiliate_get_call')) check_affiliate_get_call();

  // Falls die GET-Variable land mitgegeben wurde und diese einen zweistelligen Laendercode enthaelt wird
  // ueberprueft, ob das gewaehlte Land existiert und von diesem Shop beliefert wird. Ist dieser Check
  // erfolgreich, wird das Land fuer den Kunden gesetzt
  if(isset($_GET['land'])) {
      $land = utf8_strtoupper($_GET['land']);
      $versandland_liste = new versandland_liste;
      $versandland_liste->get_versandlaender_beliefert();
      if(isset($versandland_liste->laender[$land])){
          $my_session->set_session_var('land',$land);
      }
      else{
          $land = new versandland;
          $my_session->set_session_var('land',$land->get_hauptland_id());
      }
  } // end if

  // Deep-Link Auswertung / Hintergrundinformationen:
  // Es ist moeglich, den Shop von einem externen Link so aufzurufen, dass dem Kunden direkt ein bestimmter Artikel
  // oder eine bestimmte Kategorie angezeigt wird. Damit dies geht, muss dem Shop entweder eine Artikel-ID oder eine
  // Kategorie-ID oder alternativ auch eine Artikel-Nr. angegeben werden.
  // Die ID's koennen direkt aus der Datenbank ausgelesen werden. Eine andere Moeglichkeit, die Kategorie- und
  // Artikel-ID herauszufinden besteht darin, den gewuenschten Artikel in der Artikelsuche anzeigen zu lassen
  // (einen Suchbegriff eingeben, der im gewuenschten Artikel enthalten ist, damit dieser im Suchresultat
  // angezeigt wird). Wenn man dann beim Suchergebnis mit der Maus ueber den Button "Artikel anzeigen" faehrt,
  // sieht man im Browser die Kategorie_ID (Kategorie_ID=..) und die Artikel_ID (Ziel..))).
  // Beispiel Deeplink:
  // 'url_zum_shop'/index.php?Artikel_ID='Artikel_ID'&Kategorie_ID='Kategorie_ID'
  // z.B. http://demo.phpeppershop.com/index.php?Artikel_ID=67&Kategorie_ID=14
  // Aufrufarten (moegliche Deeplink-relevante GET-Parameter):
  // 1.) Artikel_ID=abc&Kategorie_ID=xyz: Dies ist ein (externer) Standard Deeplink. Es wird der Artikel und seine Kategorie angegeben.
  // 2.) Kategorie_ID=xyz               : Nur die Kategorie waehlen. Die Artikel_ID kann weggelassen werden, wenn man einfach nur die Kategorie anspringen will.
  // 3.) Artikel_ID=abc                 : Nur die Artikel-ID. Wenn man die Kategorie weglaesst, ermittelt der Shop die erste Kategorie des Artikels. Dies veranlasst ev. auch eine Sprachaenderung.
  // 4.) Artikel_Nr=mno                 : Der Artikel wird ueber eine Artikel-Nr. identifiziert, ansonsten derselbe Aufruf wie 3.
  // 5.) Artikel_Nr=mno&Kategorie_ID=xyz: Der Artikel wird hier ueber seine Artikel-Nr. identifiziert, ansonsten derselbe Aufruf wie 1.
  // 6.) Kategorie_Nr=def               : Nur die Kategorie waehlen. Die Kategorie wird ueber die Kategorie-Nr. identifiziert, ansonsten derselbe Aufruf wie 2.
  // 7.) Artikel_Nr=mno&Kategorie_Nr=def: Der Artikel wird hier ueber seine Artikel-Nr. und die Kategorie-Nr. identifiziert, ansonsten derselbe Aufruf wie 1.
  // Sprachangaben werden mit &lang=en / fr / it / de / ... angegeben. Waehrungen mit waehrung=chf / eur / usd / gbp ... angegeben.
  if((isset($_GET['Artikel_ID']) && $_GET['Artikel_ID'] != '')
     || (isset($_GET['Artikel_Nr']) && $_GET['Artikel_Nr'] != '')
     || (isset($_GET['Kategorie_ID']) && $_GET['Kategorie_ID'] != '')
     || (isset($_GET['Kategorie_Nr']) && $_GET['Kategorie_Nr'] != '')) {


      // Artikel-ID aus Artikel-Nr ermitteln, falls Artikel-Nr uebergeben wurde
      if (isset($_GET['Artikel_Nr']) && $_GET['Artikel_Nr'] != '' && !isset($_GET['Artikel_ID'])) {
          // Als Artikelnummern lassen wir nicht alle moeglichen Zeichen durch, so dass die Security gewaehrleistet werden kann
          $artikel_nr_preg_muster = "/[^a-zA-Z0-9_\\-\\.,#\\/: ]/u";
          $artikel_nr = trim(strip_tags(str_replace(';','',preg_replace($artikel_nr_preg_muster,'',ensure_utf8($_GET['Artikel_Nr'])))));
          // wir versuchen nun einen Artikel mit dieser Artikel-Nr. ausfindig zu machen. Wenn dies gelingt wird vom Ersten (oder Einzigen) die Artikel-ID verwendet
          $Artikel_ID = get_from_db('Artikel_ID','artikel','Artikel_Nr=\''.$artikel_nr.'\'');
          if ($Artikel_ID !== false && is_array($Artikel_ID) && count($Artikel_ID) > 0) {
              // Wir uebernehmen die Artikel-ID in die Uebertragungsarrays. Artikel_Nr ueberschreibt somit eine Artikel_ID!
              $Artikel_ID = intval($Artikel_ID[0]['Artikel_ID']);
              $_GET['Artikel_ID'] = $Artikel_ID;
          }
      }

      // Kategorie-ID aus Kategorie-Nr ermitteln, falls eine Kategorie-Nr uebergeben wurde
      if (isset($_GET['Kategorie_Nr']) && $_GET['Kategorie_Nr'] != '' && !isset($_GET['Kategorie_ID'])) {
          // Als Kategorienummern lassen wir nicht alle moeglichen Zeichen durch, so dass die Security gewaehrleistet werden kann
          $kategorie_nr_preg_muster = "/[^a-zA-Z0-9_\\-\\.,#\\/:]/u";
          $kategorie_nr = trim(strip_tags(str_replace(';','',preg_replace($kategorie_nr_preg_muster,'',ensure_utf8($_GET['Kategorie_Nr'])))));
          // wir versuchen nun einen Kategorie mit dieser Kategorie-Nr. ausfindig zu machen. Wenn dies gelingt wird vom Ersten (oder Einzigen) die Kategorie-ID verwendet
          $Kategorie_ID = get_from_db('Kategorie_ID','kategorien','Kategorie_Nr=\''.$kategorie_nr.'\'');
          if ($Kategorie_ID !== false && is_array($Kategorie_ID) && count($Kategorie_ID) > 0) {
              // Wir uebernehmen die Kategorie-ID in die Uebertragungsarrays. Kategorie_Nr ueberschreibt somit eine Kategorie_ID!
              $Kategorie_ID = intval($Kategorie_ID[0]['Kategorie_ID']);
              $_GET['Kategorie_ID'] = $Kategorie_ID;
          }
      }

      // **** Parent-Artikel: Wenn die Artikel-ID oder die Artikel-Nr. eines Subartikels eingegeben wurde, loesen wir dies hier auf in die Artikel-ID des Parent-Artikels
      if (defined('PARENT_SUB_ARTIKEL') && PARENT_SUB_ARTIKEL == true && isset($_GET['Artikel_ID']) && $_GET['Artikel_ID'] != '') {
          // Auslesen der Parent Artikel-Nr, falls dieser Artikel ein Subartikel ist
          $parent_nr = get_from_db('parent_nr','artikel','Artikel_ID='.intval($_GET['Artikel_ID']));
          if ($parent_nr !== false && is_array($parent_nr) && count($parent_nr) > 0) {
              // Der SQL gab ein gueltiges Resultat zurueck, wir uebernehmen die 'erste' Parent-Nr.
              $parent_nr = $parent_nr[0]['parent_nr'];
              if ($parent_nr != '') {
                  // Die Parent-Nr. enthaelt einen Ausdruck ungleich leer, wir lesen nun die Artikel-ID des Parent-Artikels aus und verwenden diesen...
                  $Artikel_ID = get_from_db('Artikel_ID','artikel','Artikel_Nr=\''.$parent_nr.'\'');
                  if ($Artikel_ID !== false && is_array($Artikel_ID) && count($Artikel_ID) > 0) {
                      // Wir uebernehmen die Artikel-ID des Parent-Artikels in die Uebertragungsarrays
                      $Artikel_ID = intval($Artikel_ID[0]['Artikel_ID']);
                      $_GET['Artikel_ID'] = $Artikel_ID;
                  }
              }
          }
      }

      $redir_url = false;
      if(isset($_GET['Artikel_ID']) && intval($_GET['Artikel_ID']) > 0){
          // Artikellink fuer Weiterleitung zusammenstellen
          $artikellink_obj = new artikellink();
          $artikellink_obj->set_amp('&');
          $artikellink_obj->set_artikel_id(intval($_GET['Artikel_ID']));
          if(isset($_GET['Kategorie_ID']) && intval($_GET['Kategorie_ID']) > 0){
              $artikellink_obj->set_kategorie_id(intval($_GET['Kategorie_ID']));
          }
          if(isset($_GET['lang']) && utf8_strlen($_GET['lang']) == 2){
              $artikellink_obj->set_user_lang('reset'); // User-Lang auf ungueltigen Wert setzen, damit Language-Auswahl in Link integriert wird
              $artikellink_obj->set_link_lang($_GET['lang']);
          }
          $redir_url = $artikellink_obj->get_link();
      }
      elseif(isset($_GET['Kategorie_ID']) && intval($_GET['Kategorie_ID']) > 0){
          // Kategorienlink fuer Weiterleitung zusammenstellen
          $kategorielink_obj = new kategorielink();
          $kategorielink_obj->set_amp('&');
          $kategorielink_obj->set_kategorie_id($_GET['Kategorie_ID']);
          if(isset($_GET['lang']) && utf8_strlen($_GET['lang']) == 2){
              $kategorielink_obj->set_user_lang('reset'); // User-Lang auf ungueltigen Wert setzen, damit Language-Auswahl in Link integriert wird
              $kategorielink_obj->set_link_lang($_GET['lang']);
          }
          $redir_url = $kategorielink_obj->get_link();
      }

      // **** Weiterleitung (funktioniert nur, wenn vorher keine Header-Ausgaben getaetitgt wurden!)
      if($redir_url !== false){
          // Weiterleitung zum Artikel oder zur Kategorie
          $redir_url = remove_crlf($redir_url);
          header('Location: '.$redir_url, true, '301');
      }
      // falls kein Deeplink erstellt werden konnte, bleiben wir auf der Startseite

  }// Ende Deeplink-Verarbeitung

  // Falls die Seite SSL/TLS verschluesselt dargestellt werden soll, so wird das Flag $show_page_in_ssl gesetzt.
  // Wir leiten den Shopkunden dann zur entsprechenden Page weiter.
  if (isset($show_page_in_ssl) && $show_page_in_ssl == 'true') {
      switch($goto) {
          case 'kundenaccount':
              // My-Account
              $content_file = 'shop/kunde_account.php?darstellen=else';
              break;
          default:
              // Default = Kasse
              $content_file = 'shop/USER_BESTELLUNG_1.php?darstellen=1';
      }
      $webroot = get_shop_webroot('/');
      header('Location: '.$webroot.$content_file.sid_get('&'), true, '301');
  }

  // -------------------------------------------------------------------------------------------------------------
  // Changedir vornehmen um mainpage und weitere Templates mit 'Standardpfaden' includen zu koennen. In
  // HTML-Templates gibt es sogenannte Path-Prefix Korrekturvariablen um immer den korrekten Pfad zu verwenden.
  chdir('./shop/');

  // Neues Template-Objekt erzeugen
  $tpl = new tpl_pepper();

  // Parameter fuer diese Seite definieren
  $page_title = getshopname();
  $mainpage_parameter = array('javascript'           => '',                            // Header JavaScripts / dynamische Metatags
                              'javascript_erkennung' => get_javascript_erkennung(),    // JavaScript Weiterleitung
                              'body_attributes'      => '',                            // Body-Tag Attribute
                              'titel'                => $page_title,                   // Titel der Page (Shopname; Definition, siehe oben)
                              'stylesheet_path'      => get_aktuelles_http_schema(true).get_webroot_path().'shop/',   // Pfad fuer die Stylesheet-Datei von index.php aus
                              'auf_startseite'       => true                           // auf der Startseite
                             );
  // Initialisierung der Variable fuer die Ausgaben des Content-Slider-Moduls
  $content_slider_content = '';
  if (JQUERY_VERWENDEN === true && modul_check('jquery')) {
      if (modul_check('module/content_slider/content_slider') && content_slider::is_active()) {
          jquery::activate_plugin('content_slider',array());    
          $cs = new content_slider();
          $cs->get_active_entries();
          $content_slider_content = $cs->render_html();
      }
  } // end if

  $flexbox_content_top = "";
  if (modul_check('Admin/flexbox_editor', '.php', false, false)) {
      $flexbox_renderer = new pps\flexbox\renderer\flexbox();
      $flexbox_content_top = $flexbox_renderer->get_renderer_flexboxen('static_content', 'start_content_top');
  }

  $flexbox_content_bottom = "";
  if (modul_check('Admin/flexbox_editor', '.php', false, false)) {
      $flexbox_renderer = new pps\flexbox\renderer\flexbox();
      $flexbox_content_bottom  = $flexbox_renderer->get_renderer_flexboxen('static_content', 'start_content_bottom');
  }

  $mainpage = new mainpage($mainpage_parameter,'index'); // mainpage-Objekt

  // Pre-Content aus Template auslesen und Metatags uebernehmen
  $content = $mainpage->get_pre_content();

  // Inhalt des Content-Slider Moduls  einbinden:
  $content.= $content_slider_content;
  
  // Initialisierung der Variable fuer die Ausgaben des Startartikel-Moduls
  $startartikel_content = '';

  // Startartikel Modul Einbindung, fuellt Variable $startartikel_content + $startseite_artikel ab:
  $startartikel_content = ''; // Diese Variable wird nach include von startartikel.php populiert
  $startseite_artikel   = ''; // Diese Variable wird nach include von startartikel.php populiert
  $startartikel_filename = get_root_path().'shop/startartikel.php';
  if (modul_check('startartikel.php','',false) && is_readable($startartikel_filename) && file_exists(get_root_path().'shop/module/startartikel/startartikel_config.php')) {
      include_once(get_root_path().'shop/module/startartikel/startartikel_config.php');
      $startartikel_config = new startartikel_config();
      if ($startartikel_config->get('aktiv') == 'true') {
          include_once($startartikel_filename);
      }
  }

  // Startseiteninhalt laden - entweder via ueber Box-Content Menu aktivierte Static Page Loader Seite oder die Standard Startseite
  $startseite_html = false;
  if (modul_check('box_content')) {
      $startseite_html = box_content::get_startseite_aktiv();
  }
  if ($startseite_html === false) {
      // Template-File dem Template-Objekt zuordnen (File laden) und anzeigen (im Moment sind hier keine Blocks definiert)
      $tpl->load_template_file('start_content.tpl.html');
      $tpl->set_variable('pps_webroot_path',get_shop_webroot('/'));
      $content_inhalt = $tpl->get();
  }
  else {
      $content_inhalt = $startseite_html;
  }

  $content .= $flexbox_content_top;
  
  $content.= $content_inhalt;

  // Inhalt des Startartikel Moduls einbinden:
  $content.= $startartikel_content;

  $content .= $flexbox_content_bottom;


  // Metatags-Objekt mit Header-Informationen abfuellen
  include_once('metatags.def.php');
  $metatags_obj = static_metatags();
  if(!$metatags_obj->used){
      // hreflang
      $hreflang = new \pps\hreflang\hreflang_home($lang,get_active_languages());
      foreach ($hreflang->get_links() as $hreflang_link) {
          $metatags_obj->set_link_rel(
              $hreflang_link->get_rel(),
              $hreflang_link->get_absolute_link(),
              '',
              '',
              $hreflang_link->get_hreflang()
          );
      }

      // Das Metatags-Objekt wurde bis hier nicht fuer einen Artikel abgefuellt (z.B.) Darstellung der Starseite, wir fuellen das Objekt mit den Angaben der Seite ab
      $canonical_url = get_shop_webroot('shop/');
      if ($lang != DEFAULT_LANGUAGE) $canonical_url.= '?lang='.$my_session->get_session_var('lang');
      $metatags_obj->generate_for_home($page_title,$content_inhalt);
      $metatags_obj->parse_pre_content($content);
      $metatags_obj->cut_meta_info_instructions($content);
  }

  // Ausgabe des Pre-Contents und Inhalts der Seite
  echo $content;

  // Statistikeintrag machen
  $http_referer = '';
  $user_agent = '- not set -';
  if (isset($_SERVER['HTTP_REFERER'])) $http_referer = $_SERVER['HTTP_REFERER'];  
  if (isset($_SERVER['HTTP_USER_AGENT'])) $user_agent = $_SERVER['HTTP_USER_AGENT'];  
  
  insert_statistik_event(array('core','index','view',$http_referer,$_SERVER['QUERY_STRING'],$user_agent));

  // Post-Content ausgeben
  $mainpage->show_post_content();

  // Backup Einstellungen (Automatisierung je nach Administrationseinstellung)
  if (getcssarg('backup') == 'auto') {
      define('ADMIN_BACKUP_DIE_ON_ERROR',true);
      include_once('shop/Admin/ADMIN_backup.php');
  }

  // End of file -------------------------------------------------------------------------------------
?>
