Index: api/autocomplete/autocomplete.php
===================================================================
--- api/autocomplete/autocomplete.php	(nonexistent)
+++ api/autocomplete/autocomplete.php	(revision 1)
@@ -0,0 +1,94 @@
+<?php
+/* -----------------------------------------------------------------------------------------
+   $Id: autocomplete.php 13450 2021-03-05 16:29:46Z GTB $
+
+   modified eCommerce Shopsoftware
+   http://www.modified-shop.org
+
+   Copyright (c) 2009 - 2013 [www.modified-shop.org]
+   -----------------------------------------------------------------------------------------
+   Released under the GNU General Public License
+   ---------------------------------------------------------------------------------------*/
+
+  chdir('../../');
+  include('includes/application_top.php');
+
+
+  // include needed functions
+  require_once (DIR_FS_INC.'xtc_parse_search_string.inc.php');
+  
+  $module_smarty = new Smarty;
+  $module_smarty->assign('language', $_SESSION['language']);
+  
+  if (isset($_POST['queryString'])) {
+    
+    $from_str = $where_str = '';
+    
+    $queryString = stripslashes(trim(decode_utf8(urldecode($_POST['queryString']))));    
+    $categories_id = !empty($_POST['categories_id']) ? (int)$_POST['categories_id'] : false;
+    $inc_subcat = !empty($_POST['inc_subcat']) ? (int)$_POST['inc_subcat'] : null;
+
+    // create $search_keywords array
+    $keywordcheck = xtc_parse_search_string($queryString, $search_keywords);
+        
+    if ($keywordcheck === true && mb_strlen($queryString, $_SESSION['language_charset']) >= SEARCH_AC_MIN_LENGTH) {
+      
+      $from_str .= SEARCH_IN_ATTR == 'true' ? " LEFT OUTER JOIN ".TABLE_PRODUCTS_ATTRIBUTES." AS pa ON (p.products_id = pa.products_id) 
+                                                LEFT OUTER JOIN ".TABLE_PRODUCTS_OPTIONS_VALUES." AS pov ON (pa.options_values_id = pov.products_options_values_id) " : "";
+      $from_str .= SEARCH_IN_MANU == 'true' ? " LEFT OUTER JOIN ".TABLE_MANUFACTURERS." AS m ON (p.manufacturers_id = m.manufacturers_id) " : "";
+
+      if (SEARCH_IN_FILTER == 'true') {
+        $from_str .= "LEFT JOIN ".TABLE_PRODUCTS_TAGS." pt ON (pt.products_id = p.products_id)
+                      LEFT JOIN ".TABLE_PRODUCTS_TAGS_VALUES." ptv ON (ptv.options_id = pt.options_id AND ptv.values_id = pt.values_id AND ptv.status = '1' AND ptv.languages_id = '".(int)$_SESSION['languages_id']."') ";
+      }
+
+      //include subcategories if needed
+      if ($categories_id !== false) {
+        if ($inc_subcat == '1') {
+          $subcategories_array = array();
+          xtc_get_subcategories($subcategories_array, $categories_id);
+          $from_str .= " LEFT OUTER JOIN ".TABLE_PRODUCTS_TO_CATEGORIES." AS p2c ON (p.products_id = p2c.products_id) ";
+          $where_str .= " AND p2c.categories_id IN ('".$categories_id."' ";
+          foreach ($subcategories_array AS $scat) {
+            $where_str .= ", '".$scat."'";
+          }
+          $where_str .= ") ";
+        } else {
+          $from_str .= " LEFT OUTER JOIN ".TABLE_PRODUCTS_TO_CATEGORIES." AS p2c ON (p.products_id = p2c.products_id) ";
+          $where_str .= " AND p2c.categories_id = '".$categories_id."' ";
+        }
+      }
+      
+      include(DIR_WS_INCLUDES.'build_search_query.php');
+      
+      $where_str .= " ) ";
+                                                   
+      $autocomplete_search_query = "SELECT ".$product->default_select."
+                                      FROM ".TABLE_PRODUCTS." p 
+                                      JOIN ".TABLE_PRODUCTS_DESCRIPTION." pd 
+                                           ON p.products_id = pd.products_id
+                                              AND pd.language_id = '".(int)$_SESSION['languages_id']."'
+                                              AND trim(pd.products_name) != ''
+                                           ".$from_str."
+                                     WHERE p.products_status = '1' 
+                                            ".$where_str."
+                                            ".PRODUCTS_CONDITIONS_P."
+                                   GROUP BY p.products_id 
+                                   ORDER BY p.products_id ASC
+                                      LIMIT ".MAX_DISPLAY_ADVANCED_SEARCH_RESULTS;
+      
+      $autocomplete_search_query = xtc_db_query($autocomplete_search_query);                      
+      if (xtc_db_num_rows($autocomplete_search_query) > 0) {
+        $module_content = array();
+        while ($autocomplete_search = xtc_db_fetch_array($autocomplete_search_query)) {
+          $module_content[] = $product->buildDataArray($autocomplete_search);
+        }
+        $module_smarty->assign('module_content', $module_content);
+      } else {
+        $module_smarty->assign('error', 'true');
+      }
+      $module_smarty->caching = 0;
+      $module_smarty->display(CURRENT_TEMPLATE.'/module/autocomplete.html');
+    }
+  }
+?>
\ No newline at end of file
Index: templates/tpl_modified/lang/lang_english.custom
===================================================================
--- templates/tpl_modified/lang/lang_english.custom	(nonexistent)
+++ templates/tpl_modified/lang/lang_english.custom	(revision 1)
@@ -0,0 +1,45 @@
+zoomtext = 'For a larger view click on the thumbnail'
+products_desc = 'Products description'
+products_fsk18_check = 'This article can be purchased only after age verification.'
+products_manufacturer_model = 'MPN:'
+products_tags = 'Features'
+heading_products_tags = 'Product Features'
+
+first = '&laquo; first'
+back = '&laquo; back'
+overview = 'Overview'
+next = 'next &raquo;'
+last = 'last &raquo;'
+
+heading_miscellaneous = 'Payment methods'
+text_miscellaneous = 'Die Box kann unter tpl_modified/boxes/box_miscellaneous.html ver&auml;ndert werden. Die Sprachvariablen befinden sich in der Datei tpl_modified/lang/german/lang_german.custom.'
+
+ab_admin = 'Adminarea'
+ab_orders = 'Orders'
+ab_contentmanager = 'Content Manager'
+ab_customers = 'Customers'
+ab_category = 'Category/Products'
+ab_logoff = 'Logoff'
+ab_news = 'News'
+ab_offline = 'Shop Offline'
+ab_update = 'Update'
+ab_support = 'Support'
+ab_shop = 'Shop'
+ab_caching = 'Caching'
+
+ab_edit_content = 'Edit content'
+ab_edit_product = 'Edit product'
+ab_edit_attributes = 'Edit product attributes'
+ab_edit_category = 'Edit category'
+ab_edit_xsell = 'Edit cross selling'
+ab_edit_tags = 'Product features'
+
+info_reviews = 'Reviews:'
+info_review = 'Review:'
+
+heading_trustedshops = 'Trusted Shops'
+
+text_search_again = 'Sorry, we could not find a product matching your search request'
+
+listing_listview = 'List view'
+listing_boxview = 'Box view'
\ No newline at end of file
Index: templates/tpl_modified/lang/lang_german.custom
===================================================================
--- templates/tpl_modified/lang/lang_german.custom	(nonexistent)
+++ templates/tpl_modified/lang/lang_german.custom	(revision 1)
@@ -0,0 +1,45 @@
+zoomtext = 'F&uuml;r eine gr&ouml;&szlig;ere Ansicht klicken Sie auf das Vorschaubild'
+products_desc = 'Produktbeschreibung'
+products_fsk18_check = 'Dieser Artikel kann erst nach erfolgter Altersverifikation gekauft werden.'
+products_manufacturer_model = 'HAN:'
+products_tags = 'Eigenschaften'
+heading_products_tags = 'Produkteigenschaften'
+
+first = '&laquo; Erster'
+back = '&laquo; vorheriger'
+overview = '&Uuml;bersicht'
+next = 'n&auml;chster &raquo;'
+last = 'Letzter &raquo;'
+
+heading_miscellaneous = 'Zahlungsmethoden'
+text_miscellaneous = 'Die Box kann unter tpl_modified/boxes/box_miscellaneous.html ver&auml;ndert werden. Die Sprachvariablen befinden sich in der Datei tpl_modified/lang/german/lang_german.custom.'
+
+ab_admin = 'Adminbereich'
+ab_orders = 'Bestellungen'
+ab_contentmanager = 'Content Manager'
+ab_customers = 'Kunden'
+ab_category = 'Kategorien/Artikel'
+ab_logoff = 'Abmelden'
+ab_news = 'News'
+ab_offline = 'Shop Offline'
+ab_update = 'Update'
+ab_support = 'Support'
+ab_shop = 'Shop'
+ab_caching = 'Caching'
+
+ab_edit_content = 'Content bearbeiten'
+ab_edit_product = 'Artikel bearbeiten'
+ab_edit_attributes = 'Attribute editieren'
+ab_edit_category = 'Kategorie bearbeiten'
+ab_edit_xsell = 'Cross Selling bearbeiten'
+ab_edit_tags = 'Artikeleigenschaften'
+
+info_reviews = 'Bewertungen:'
+info_review = 'Bewertung:'
+
+heading_trustedshops = 'Trusted Shops'
+
+text_search_again = 'Die Suche ergab keine genauen Treffer'
+
+listing_listview = 'Listenansicht'
+listing_boxview = 'Boxansicht'
\ No newline at end of file
Index: templates/tpl_modified/module/autocomplete.html
===================================================================
--- templates/tpl_modified/module/autocomplete.html	(nonexistent)
+++ templates/tpl_modified/module/autocomplete.html	(revision 1)
@@ -0,0 +1,35 @@
+{config_load file="$language/lang_$language.conf" section="error_handler"}
+{config_load file="lang_`$language`.custom"}
+{config_load file="lang_`$language`.section" section="error_handler"}
+{if $error}
+  <span class="autocomplete_error">{#text_search_again#}</span>
+{else}
+  <ul id="autocomplete_main">
+    {foreach item=products_data from=$module_content}
+      <li class="cf autocomplete_content">
+        <a class="autocomplete cf" href="{$products_data.PRODUCTS_LINK}">
+          {if $products_data.PRODUCTS_IMAGE}
+            <span class="autocomplete_image cf"><img src="{$products_data.PRODUCTS_IMAGE}" alt="{$products_data.PRODUCTS_NAME|onlytext}" title="{$products_data.PRODUCTS_NAME|onlytext}" /></span>
+          {else}
+            <span class="autocomplete_image cf">&nbsp;</span>
+          {/if}
+          <span class="hl_text" style="width:145px;">{$products_data.PRODUCTS_NAME}</span>
+          <span class="hl_price" style="color:#555">
+            {foreach name=inner item=price_data from=$products_data.PRODUCTS_PRICE_ARRAY}
+              {include file="module/includes/price_box.html"}
+            {/foreach}
+            {if $products_data.PRODUCTS_PRICE_ARRAY.0.PRODUCTS_PRICE_FLAG != 'NotAllowed'}
+              {if $products_data.PRODUCTS_VPE}<div class="lb_vpe" style="position:inherit;font-weight: normal;">{$products_data.PRODUCTS_VPE}</div>{/if}
+            {/if}
+          </span>
+        </a>
+      </li>
+    {/foreach}            
+  </ul>
+  
+  <ul id="autocomplete_pagination" class="cf">
+    <li id="autocomplete_prev">&laquo;</li>
+    <li id="autocomplete_count"></li>
+    <li id="autocomplete_next">&raquo;</li>
+  </ul>
+{/if}
\ No newline at end of file
Index: templates/tpl_modified/module/sub_categories_listing.html
===================================================================
--- templates/tpl_modified/module/sub_categories_listing.html	(nonexistent)
+++ templates/tpl_modified/module/sub_categories_listing.html	(revision 1)
@@ -0,0 +1,18 @@
+{config_load file="$language/lang_$language.conf" section="categorie_listing"}
+{config_load file="lang_`$language`.custom"}
+{config_load file="lang_`$language`.section" section="categorie_listing"}
+{if isset($categories_content) && $categories_content != '' && $TR_COLS > 0}
+<h4>{#heading_more_categories#}</h4>
+<div class="subcats cf">
+  {foreach name=aussen item=categories_data from=$categories_content key=spalten}
+  <div class="subcatlist{if $smarty.foreach.aussen.iteration is div by $TR_COLS} last{/if}">
+    <a href="{$categories_data.CATEGORIES_LINK}">
+      {if $categories_data.CATEGORIES_IMAGE}<span class="subcat_image"><span class="subcat_image_inner"><img src="{$categories_data.CATEGORIES_IMAGE}" alt="{$categories_data.CATEGORIES_NAME|onlytext}" /></span></span>{/if}
+      <span class="subcat_title"><span class="subcat_title_inner">{$categories_data.CATEGORIES_NAME}</span></span>
+    </a>
+    {* <span class="subcat_desc">{$categories_data.CATEGORIES_DESCRIPTION}</span> *}
+  </div>
+  {if $smarty.foreach.aussen.iteration is div by $TR_COLS}<br class="clearfix" />{/if}
+  {/foreach}
+</div>
+{/if}
\ No newline at end of file
Index: templates/tpl_modified_responsive/lang/lang_english.custom
===================================================================
--- templates/tpl_modified_responsive/lang/lang_english.custom	(nonexistent)
+++ templates/tpl_modified_responsive/lang/lang_english.custom	(revision 1)
@@ -0,0 +1,46 @@
+zoomtext = 'For a larger view click on the thumbnail'
+products_desc = 'Products description'
+products_fsk18_check = 'This article can be purchased only after age verification.'
+products_manufacturer_model = 'MPN:'
+products_tags = 'Features'
+heading_products_tags = 'Product Features'
+
+first = '&laquo; first'
+back = '&laquo; back'
+overview = 'Overview'
+next = 'next &raquo;'
+last = 'last &raquo;'
+
+heading_miscellaneous = 'Payment methods'
+text_miscellaneous = 'Die Box kann unter tpl_modified_responsive/boxes/box_miscellaneous.html ver&auml;ndert werden. Die Sprachvariablen befinden sich in der Datei tpl_modified_responsive/lang/german/lang_german.custom.'
+
+ab_admin = 'Adminarea'
+ab_orders = 'Orders'
+ab_contentmanager = 'Content Manager'
+ab_customers = 'Customers'
+ab_category = 'Category/Products'
+ab_logoff = 'Logoff'
+ab_news = 'News'
+ab_offline = 'Shop Offline'
+ab_update = 'Update'
+ab_support = 'Support'
+ab_shop = 'Shop'
+ab_caching = 'Caching'
+
+ab_edit_content = 'Edit content'
+ab_edit_product = 'Edit product'
+ab_edit_attributes = 'Edit product attributes'
+ab_edit_category = 'Edit category'
+ab_edit_xsell = 'Edit cross selling'
+ab_edit_tags = 'Product features'
+
+info_reviews = 'Reviews:'
+info_review = 'Review:'
+
+heading_trustedshops = 'Trusted Shops'
+
+text_search_again = 'Sorry, we could not find a product matching your search request'
+
+listing_listview = 'List view'
+listing_boxview = 'Box view'
+header_menu = 'Menu'
\ No newline at end of file
Index: templates/tpl_modified_responsive/lang/lang_german.custom
===================================================================
--- templates/tpl_modified_responsive/lang/lang_german.custom	(nonexistent)
+++ templates/tpl_modified_responsive/lang/lang_german.custom	(revision 1)
@@ -0,0 +1,46 @@
+zoomtext = 'F&uuml;r eine gr&ouml;&szlig;ere Ansicht klicken Sie auf das Vorschaubild'
+products_desc = 'Produktbeschreibung'
+products_fsk18_check = 'Dieser Artikel kann erst nach erfolgter Altersverifikation gekauft werden.'
+products_manufacturer_model = 'HAN:'
+products_tags = 'Eigenschaften'
+heading_products_tags = 'Produkteigenschaften'
+
+first = '&laquo; Erster'
+back = '&laquo; vorheriger'
+overview = '&Uuml;bersicht'
+next = 'n&auml;chster &raquo;'
+last = 'Letzter &raquo;'
+
+heading_miscellaneous = 'Zahlungsmethoden'
+text_miscellaneous = 'Die Box kann unter tpl_modified_responsive/boxes/box_miscellaneous.html ver&auml;ndert werden. Die Sprachvariablen befinden sich in der Datei tpl_modified_responsive/lang/german/lang_german.custom.'
+
+ab_admin = 'Adminbereich'
+ab_orders = 'Bestellungen'
+ab_contentmanager = 'Content Manager'
+ab_customers = 'Kunden'
+ab_category = 'Kategorien/Artikel'
+ab_logoff = 'Abmelden'
+ab_news = 'News'
+ab_offline = 'Shop Offline'
+ab_update = 'Update'
+ab_support = 'Support'
+ab_shop = 'Shop'
+ab_caching = 'Caching'
+
+ab_edit_content = 'Content bearbeiten'
+ab_edit_product = 'Artikel bearbeiten'
+ab_edit_attributes = 'Attribute editieren'
+ab_edit_category = 'Kategorie bearbeiten'
+ab_edit_xsell = 'Cross Selling bearbeiten'
+ab_edit_tags = 'Artikeleigenschaften'
+
+info_reviews = 'Bewertungen:'
+info_review = 'Bewertung:'
+
+heading_trustedshops = 'Trusted Shops'
+
+text_search_again = 'Die Suche ergab keine genauen Treffer'
+
+listing_listview = 'Listenansicht'
+listing_boxview = 'Boxansicht'
+header_menu = 'Men&uuml;'
\ No newline at end of file
Index: templates/tpl_modified_responsive/module/autocomplete.html
===================================================================
--- templates/tpl_modified_responsive/module/autocomplete.html	(nonexistent)
+++ templates/tpl_modified_responsive/module/autocomplete.html	(revision 1)
@@ -0,0 +1,41 @@
+{config_load file="$language/lang_$language.conf" section="error_handler"}
+{config_load file="lang_`$language`.custom"}
+{config_load file="lang_`$language`.section" section="error_handler"}
+{if $error}
+  <span class="autocomplete_error">{#text_search_again#}</span>
+{else}
+  <ul id="autocomplete_main">
+    {foreach item=products_data from=$module_content}
+      <li class="cf autocomplete_content">
+        <a class="autocomplete cf" href="{$products_data.PRODUCTS_LINK}">
+          {if $products_data.PRODUCTS_IMAGE}
+            <span class="autocomplete_image cf">
+              {if $smarty.const.PICTURESET_ACTIVE === true}
+                <img class="lazyload" data-src="{$products_data.PRODUCTS_IMAGE|replace:"thumbnail_":"mini_"}" alt="{$products_data.PRODUCTS_NAME|onlytext}" title="{$products_data.PRODUCTS_NAME|onlytext}" />
+              {else}
+                <img class="lazyload" data-src="{$products_data.PRODUCTS_IMAGE}" alt="{$products_data.PRODUCTS_NAME|onlytext}" title="{$products_data.PRODUCTS_NAME|onlytext}" />
+              {/if}
+            </span>
+          {else}
+            <span class="autocomplete_image cf">&nbsp;</span>
+          {/if}
+          <span class="ac_text">{$products_data.PRODUCTS_NAME}</span>
+          <span class="ac_price">
+            {foreach name=inner item=price_data from=$products_data.PRODUCTS_PRICE_ARRAY}
+              {include file="module/includes/price_box.html"}
+            {/foreach}
+            {if $products_data.PRODUCTS_PRICE_ARRAY.0.PRODUCTS_PRICE_FLAG != 'NotAllowed'}
+              {if $products_data.PRODUCTS_VPE}<span class="ac_vpe">{$products_data.PRODUCTS_VPE}</div>{/if}
+            {/if}
+          </span>
+        </a>
+      </li>
+    {/foreach}
+  </ul>
+  
+  <ul id="autocomplete_pagination" class="cf">
+    <li id="autocomplete_prev">&laquo;</li>
+    <li id="autocomplete_count"></li>
+    <li id="autocomplete_next">&raquo;</li>
+  </ul>
+{/if}
\ No newline at end of file
Index: templates/tpl_modified_responsive/module/sub_categories_listing.html
===================================================================
--- templates/tpl_modified_responsive/module/sub_categories_listing.html	(nonexistent)
+++ templates/tpl_modified_responsive/module/sub_categories_listing.html	(revision 1)
@@ -0,0 +1,29 @@
+{config_load file="$language/lang_$language.conf" section="categorie_listing"}
+{config_load file="lang_`$language`.custom"}
+{config_load file="lang_`$language`.section" section="categorie_listing"}
+{if isset($categories_content) && $categories_content != '' && $TR_COLS > 0}
+<h4>{#heading_more_categories#}</h4>
+<div class="subcats cf">
+  {foreach name=aussen item=categories_data from=$categories_content key=spalten}
+  <div class="subcatlist">
+    <div class="subcatlist_inner cf">
+      <a href="{$categories_data.CATEGORIES_LINK}">
+        {if $categories_data.CATEGORIES_IMAGE != '' || (isset($categories_data.CATEGORIES_IMAGE_LIST) && $categories_data.CATEGORIES_IMAGE_LIST != '')}
+          <span class="subcat_image">
+            <span class="subcat_image_inner cf">
+              {if isset($categories_data.CATEGORIES_IMAGE_LIST) && $categories_data.CATEGORIES_IMAGE_LIST != ''}
+                <img class="lazyload" data-src="{$categories_data.CATEGORIES_IMAGE_LIST}" alt="{$categories_data.CATEGORIES_NAME|onlytext}" />
+              {else}
+                <img class="lazyload" data-src="{$categories_data.CATEGORIES_IMAGE}" alt="{$categories_data.CATEGORIES_NAME|onlytext}" />
+              {/if}
+              <noscript><img src="{$categories_data.CATEGORIES_IMAGE}" alt="{$categories_data.CATEGORIES_NAME|onlytext}" /></noscript>
+            </span>
+          </span>
+        {/if}
+        <span class="subcat_title"><span class="subcat_title_inner">{$categories_data.CATEGORIES_NAME}</span></span>
+      </a>
+    </div>
+  </div>
+  {/foreach}
+</div>
+{/if}
\ No newline at end of file
