/mnt/web601/b3/14/57451114/htdocs/httpdocs/admin/categories.php
<?php
/* --------------------------------------------------------------
   categories.php 2023-05-05
   Gambio GmbH
   http://www.gambio.de
   Copyright (c) 2023 Gambio GmbH
   Released under the GNU General Public License (Version 2)
   [http://www.gnu.org/licenses/gpl-2.0.html]

   IMPORTANT! THIS FILE IS DEPRECATED AND WILL BE REPLACED IN THE FUTURE. 
   MODIFY IT ONLY FOR FIXES. DO NOT APPEND IT WITH NEW FEATURES, USE THE
   NEW GX-ENGINE LIBRARIES INSTEAD.
   --------------------------------------------------------------

   based on:
   (c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
   (c) 2002-2003 osCommerce(categories.php,v 1.140 2003/03/24); www.oscommerce.com
   (c) 2003  nextcommerce (categories.php,v 1.37 2003/08/18); www.nextcommerce.org
   (c) 2003 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: categories.php 1249 2005-09-27 12:06:40Z gwinger $)

   Released under the GNU General Public License
   --------------------------------------------------------------
   Third Party contribution:
   Enable_Disable_Categories 1.3               Autor: Mikel Williams | mikel@ladykatcostumes.com
   New Attribute Manager v4b                   Autor: Mike G | mp3man@internetwork.net | http://downloads.ephing.com
   Category Descriptions (Version: 1.5 MS2)    Original Author:   Brian Lowe <blowe@wpcusrgrp.org> | Editor: Lord Illicious <shaolin-venoms@illicious.net>
   Customers Status v3.x  (c) 2002-2003 Copyright Elari elari@free.fr | www.unlockgsm.com/dload-osc/ | CVS : http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/elari/?sortby=date#dirlist

   Released under the GNU General Public License
   --------------------------------------------------------------*/

require_once ('includes/application_top.php');
// Include JS Language Vars
if(!isset($jsEngineLanguage))
{
	$jsEngineLanguage = array();
}
$languageTextManager = MainFactory::create_object('LanguageTextManager', array(), true);
$jsEngineLanguage['categories'] = $languageTextManager->get_section_array('categories');
$jsEngineLanguage['admin_buttons'] = $languageTextManager->get_section_array('admin_buttons');
$jsEngineLanguage['gm_general'] = $languageTextManager->get_section_array('gm_general');
$jsEngineLanguage['new_product'] = $languageTextManager->get_section_array('new_product');
$jsEngineLanguage['gm_product_images'] = $languageTextManager->get_section_array('gm_product_images');

// Search area.
$recentSearchArea = 'categories';

$coo_lang_file_master->init_from_lang_file('lang/' . basename($_SESSION['language']). '/admin/gm_product_images.php');
require_once ('includes/classes/'.FILENAME_IMAGEMANIPULATOR);
/* magnalister v1.0.1 */
if (function_exists('magnaExecute')) magnaExecute('magnaInventoryUpdate', array('action' => 'inventoryUpdate'), array('inventoryUpdate.php'));
/* END magnalister */
// BOF GM_MOD
include_once(DIR_FS_ADMIN . 'includes/gm/classes/GMProductUpload.php');
include_once(DIR_FS_ADMIN . 'includes/gm/classes/GMUpload.php');
include_once(DIR_FS_ADMIN . 'includes/gm/classes/GMAltText.php');
// EOF GM_MOD
require_once ('includes/classes/categories.php');
require_once (DIR_FS_INC.'xtc_get_tax_rate.inc.php');
require_once (DIR_FS_INC.'xtc_is_extension_file.inc.php');
require_once (DIR_FS_INC.'xtc_get_products_mo_images.inc.php');
require_once (DIR_WS_CLASSES.'currencies.php');

$currencies = new currencies();
$catfunc = new categories();

$db = StaticGXCoreLoader::getDatabaseQueryBuilder();
$languageProvider = MainFactory::create('LanguageProvider', $db);

/** @var CategoryReadService $categoryReadService */
$categoryReadService = StaticGXCoreLoader::getService('CategoryRead');
/** @var CategoryWriteService $categoryWriteService */
$categoryWriteService = StaticGXCoreLoader::getService('CategoryWrite');

/** @var ProductReadService $productReadService */
$productReadService = StaticGXCoreLoader::getService('ProductRead');
/** @var ProductWriteService $productWriteService */
$productWriteService = StaticGXCoreLoader::getService('ProductWrite');
$redirectUrl         = null;

//this is used only by group_prices
if (isset($_GET['function'])) {
	switch ($_GET['function']) {
		case 'delete' :
			if($_SESSION['coo_page_token']->is_valid($_GET['page_token']))
			{
				xtc_db_query("DELETE FROM personal_offers_by_customers_status_".(int) $_GET['statusID']."
								WHERE
									products_id = '".(int) $_GET['pID']."' AND
									quantity    = '".(double) $_GET['quantity']."'");
			}
			break;
	}
	xtc_redirect(xtc_href_link(FILENAME_CATEGORIES, 'cPath='.$_GET['cPath'].'&action=new_product&pID='.(int) $_GET['pID']));
}

// Multi-Status Change, separated from $_GET['action']
// --- MULTI STATUS ---
if (isset ($_POST['multi_status_on'])) {
	if($_SESSION['coo_page_token']->is_valid($_POST['page_token']))
	{
		//set multi_categories status=on
		if (is_array($_POST['multi_categories'])) {
			foreach ($_POST['multi_categories'] AS $category_id) {
				$catfunc->set_category_recursive($category_id, '1');
			}
		}
		//set multi_products status=on
		if (is_array($_POST['multi_products'])) {
			foreach ($_POST['multi_products'] AS $product_id) {
				$product_id = substr($product_id, strrpos($product_id, '_') + 1);
				$catfunc->set_product_status($product_id, '1');
			}
		}
		xtc_redirect(xtc_href_link(FILENAME_CATEGORIES, 'cPath='.$_GET['cPath'].'&'.xtc_get_all_get_params(array ('cPath', 'action', 'pID', 'cID'))));
	}
}

if (isset ($_POST['multi_status_off'])) {
	if($_SESSION['coo_page_token']->is_valid($_POST['page_token']))
	{
		//set multi_categories status=off
		if (is_array($_POST['multi_categories'])) {
			foreach ($_POST['multi_categories'] AS $category_id) {
				$catfunc->set_category_recursive($category_id, "0");
			}
		}
		//set multi_products status=off
		if (is_array($_POST['multi_products'])) {
			foreach ($_POST['multi_products'] AS $product_id) {
				$product_id = substr($product_id, strrpos($product_id, '_') + 1);
				$catfunc->set_product_status($product_id, "0");
			}
		}
		xtc_redirect(xtc_href_link(FILENAME_CATEGORIES, 'cPath='.$_GET['cPath'].'&'.xtc_get_all_get_params(array ('cPath', 'action', 'pID', 'cID'))));
	}
}
// --- MULTI STATUS ENDS ---

// POST data helper function for checkbox options value
function isOptionChecked($optionName)
{
	if(isset($_POST[$optionName]) && !empty($_POST[$optionName]))
	{
		return new BoolType(true);
	}
	
	return new BoolType(false);
}

//regular actions
if (isset($_REQUEST['action'])) {
	switch ($_REQUEST['action']) {

		case 'setcflag':
			if($_SESSION['coo_page_token']->is_valid($_GET['page_token']))
			{
				if (($_GET['flag'] == '0') || ($_GET['flag'] == '1')) {
					if ($_GET['cID']) {
						$catfunc->set_category_recursive($_GET['cID'], $_GET['flag']);
					}
				}
			}
			$coo_cache_control = MainFactory::create_object('CacheControl');
			$coo_cache_control->clear_content_view_cache();
			$coo_cache_control->clear_data_cache();
			$coo_cache_control->remove_reset_token();
			xtc_redirect(xtc_href_link(FILENAME_CATEGORIES, 'cPath='.$_GET['cPath'].'&cID='.$_GET['cID']));
			break;
			//EOB setcflag

		case 'setpflag':
			if($_SESSION['coo_page_token']->is_valid($_GET['page_token']))
			{
				if (($_GET['flag'] == '0') || ($_GET['flag'] == '1')) {
					if ($_GET['pID']) {
						$catfunc->set_product_status($_GET['pID'], $_GET['flag']);
					}
				}
				if ($_GET['pID']) {
					xtc_redirect(xtc_href_link(FILENAME_CATEGORIES, 'cPath='.$_GET['cPath'].'&pID='.$_GET['pID']));
				} else {
					xtc_redirect(xtc_href_link(FILENAME_CATEGORIES, 'cPath='.$_GET['cPath'].'&cID='.$_GET['cID']));
				}
			}
			break;
			//EOB setpflag

		case 'setsflag':
			if($_SESSION['coo_page_token']->is_valid($_GET['page_token']))
			{
				if (($_GET['flag'] == '0') || ($_GET['flag'] == '1')) {
					if ($_GET['pID']) {
						$catfunc->set_product_startpage($_GET['pID'], $_GET['flag']);
						if ($_GET['flag'] == '1') $catfunc->link_product($_GET['pID'], 0);
					}
				}
				if ($_GET['pID']) {
					xtc_redirect(xtc_href_link(FILENAME_CATEGORIES, 'cPath='.$_GET['cPath'].'&pID='.$_GET['pID']));
				} else {
					xtc_redirect(xtc_href_link(FILENAME_CATEGORIES, 'cPath='.$_GET['cPath'].'&cID='.$_GET['cID']));
				}
			}
			break;
			//EOB setsflag

		case 'update_category' :
      		if($_SESSION['coo_page_token']->is_valid($_POST['page_token']))
			{
				$category = $categoryReadService->getCategoryById(new IdType((int)$_POST['categories_id']));
				
				require DIR_FS_ADMIN . 'includes/modules/set_category_data.inc.php';
				require DIR_FS_ADMIN . 'includes/modules/set_stored_category_data.inc.php';
				
				$categoryWriteService->updateCategory($category);
				$t_categories_id = $category->getCategoryId();
				
				if(isOptionChecked('set_groups_recursive')->asBool())
				{
					// todo get rid of old xtc-function using new services
					xtc_set_groups($t_categories_id, $dbRowData);
				}
				
        /** @var SliderWriteServiceInterface $sliderWriteService */
        $sliderWriteService = StaticGXCoreLoader::getService('SliderWrite');
        if((int)$_POST['cat_slider'] > 0)
        {
          $sliderWriteService->saveSliderAssignmentForCategoryId(new IdType((int)$_POST['cat_slider']),
                                                                 new IdType($t_categories_id));
        }
        else
        {
          $sliderWriteService->deleteSliderAssignmentByCategoryId(new IdType($t_categories_id));
        }
				
				$coo_seo_boost = MainFactory::create_object('GMSEOBoost', [], true);
				$coo_seo_boost->repair('categories');
			}
			break;

		case 'insert_category' :
			if($_SESSION['coo_page_token']->is_valid($_POST['page_token']))
			{
				/** @var CategoryObjectService $categoryObjectService */
				$categoryObjectService = StaticGXCoreLoader::getService('CategoryObject');
				
				$category = $categoryObjectService->createCategoryObject();
				$category->setParentId(new IdType((int)$GLOBALS['current_category_id']));
				
				require DIR_FS_ADMIN . 'includes/modules/set_category_data.inc.php';
				
				$t_categories_id = $categoryWriteService->createCategory($category);
				$category        = $categoryReadService->getCategoryById(new IdType($t_categories_id));
				
				/** @var UserConfigurationService $userConfigurationService */
				$userConfigurationService = StaticGXCoreLoader::getService('UserConfiguration');
				$customerId = new IdType(0);
				foreach($_POST['editor_identifiers'] as $editorIdentifier => $type)
				{
					$finalIdentifier = str_replace('{id}', $t_categories_id, $editorIdentifier);
					$userConfigurationService->setUserConfiguration($customerId, $finalIdentifier, $type);
				}
				
				require DIR_FS_ADMIN . 'includes/modules/set_stored_category_data.inc.php';
				
				$categoryWriteService->updateCategory($category);
				
				if(isOptionChecked('set_groups_recursive')->asBool())
				{
					// todo get rid of old xtc-function using new services
					xtc_set_groups($t_categories_id, $dbRowData);
				}
				
				// START: add categorie relation to export_schemes table, if needed
				$query = xtc_db_query("SELECT `scheme_id`, `export_all_new_ones` FROM `export_schemes`");
				if(xtc_db_num_rows($query) > 0)
				{
					while($row = xtc_db_fetch_array($query))
					{
						if($row['export_all_new_ones'] === '1')
						{
							xtc_db_query("REPLACE INTO `export_scheme_categories` (`scheme_id`, `categories_id`, `selection_state`)" .
							             "VALUES ('".$row['scheme_id']."', '".$t_categories_id."', 'self_all_sub')");
						}
					}
				}
				// END: export_schemes
				
				// START: Slider
				if(array_key_exists('cat_slider', $_POST) && (int)$_POST['cat_slider'] > 0)
				{
          /** @var SliderWriteServiceInterface $sliderWriteService */
          $sliderWriteService = StaticGXCoreLoader::getService('SliderWrite');
          $sliderId           = new IdType((int)$_POST['cat_slider']);
          $sliderWriteService->saveSliderAssignmentForCategoryId($sliderId, new IdType($t_categories_id));
				}
				// END: Slider
				
				$seoBoost = MainFactory::create_object('GMSEOBoost', [], true);
				$seoBoost->repair('categories');
			}
			break;

		case 'update_product' :
			if($_SESSION['coo_page_token']->is_valid($_POST['page_token']))
			{
				$productId = (int)$_GET['pID'];
				$product = $productReadService->getProductById(new IdType($productId));
				
				require DIR_FS_ADMIN . 'includes/modules/set_product_data.inc.php';
				require DIR_FS_ADMIN . 'includes/modules/set_stored_product_data.inc.php';
				
				$productWriteService->updateProduct($product);
				
				/** @var \StockLogger $stockLogger */
				$stockLogger = MainFactory::create('StockLogger');
				$stockLogger->addLogEntry(
					new IdType($productId),
					new DecimalType($product->getQuantity()),
					new NonEmptyStringType('Artikel bearbeitet')
				);
				
				/** @var UserConfigurationService $userConfigurationService */
				$userConfigurationService = StaticGXCoreLoader::getService('UserConfiguration');
				$customerId = new IdType(0);
				if(array_key_exists('editor_identifiers', $_POST))
				{
					foreach($_POST['editor_identifiers'] as $editorIdentifier => $type)
					{
						$finalIdentifier = str_replace('{id}', $productId, $editorIdentifier);
						$userConfigurationService->setUserConfiguration($customerId, $finalIdentifier, $type);
					}
				}
				
				$categoryId = end(explode('_', $_GET['cPath']));
				$cPath = 'cPath=' . $_GET['cPath'];
				
				if(!in_array($categoryId, $_POST['categories']))
				{
					$cPath = xtc_get_path(end($_POST['categories']));
				}
				
				$redirectUrl = xtc_href_link(FILENAME_CATEGORIES, $cPath . '&' . xtc_get_all_get_params(['action', 'cPath']));
				
				if(($_SESSION['gm_redirect'] ?? null) > 0)
				{
					$redirectUrl = xtc_href_link(FILENAME_CATEGORIES, $cPath . '&action=new_product&pID=' . (int)$productId . '&gm_redirect=' . $_SESSION['gm_redirect'] . '#gm_anchor');
				}
				
				if(isset($_POST['gm_update']))
				{
					$redirectUrl = xtc_href_link(FILENAME_CATEGORIES, $cPath . '&action=new_product&pID=' . $productId);
				}
			}
			break;

		case 'insert_product' :
			if($_SESSION['coo_page_token']->is_valid($_POST['page_token']))
			{
				$productObjectService = StaticGXCoreLoader::getService('ProductObject');
				$product = $productObjectService->createProductObject();
				
				require DIR_FS_ADMIN . 'includes/modules/set_product_data.inc.php';
				
				$productId = $productWriteService->createProduct($product);
				$product = $productReadService->getProductById(new IdType($productId));
				
				/** @var UserConfigurationService $userConfigurationService */
				$userConfigurationService = StaticGXCoreLoader::getService('UserConfiguration');
				$customerId = new IdType(0);
				if(array_key_exists('editor_identifiers', $_POST))
				{
					foreach($_POST['editor_identifiers'] as $editorIdentifier => $type)
					{
						$finalIdentifier = str_replace('{id}', $productId, $editorIdentifier);
						$userConfigurationService->setUserConfiguration($customerId, $finalIdentifier, $type);
					}
				}
				
				require DIR_FS_ADMIN . 'includes/modules/set_stored_product_data.inc.php';
				
				$productWriteService->updateProduct($product);
                
                /** @var \StockLogger $stockLogger */
                $stockLogger = MainFactory::create('StockLogger');
                $stockLogger->addLogEntry(
                    new IdType($productId),
                    new DecimalType($product->getQuantity()),
                    new NonEmptyStringType('Artikel angelegt')
                );
                
                $categoryId = end(explode('_', $_GET['cPath']));
				$cPath = 'cPath=' . $_GET['cPath'];
				
				if(!in_array($categoryId, $_POST['categories']))
				{
					$cPath = xtc_get_path(end($_POST['categories']));
				}
				
				$redirectUrl = xtc_href_link(FILENAME_CATEGORIES,
				                             $cPath . '&pID=' . $productId . '&' . xtc_get_all_get_params([
					                                                                                          'action',
					                                                                                          'cPath',
					                                                                                          'pID'
				                                                                                          ]));
				
				if($_SESSION['gm_redirect'] ?? null > 0)
				{
					$redirectUrl = xtc_href_link(FILENAME_CATEGORIES, $cPath . '&action=new_product&pID=' . (int)$productId . '&gm_redirect=' . $_SESSION['gm_redirect'] . '#gm_anchor');
				}
				
				if(isset($_POST['gm_update']))
				{
					$redirectUrl = xtc_href_link(FILENAME_CATEGORIES, $cPath . '&action=new_product&pID=' . $productId);
				}
			}
			break;

		case 'edit_crossselling' :
			$catfunc->edit_cross_sell($_REQUEST);
			if(isset($_POST['gm_update']))
			{
				$redirectUrl = xtc_href_link(FILENAME_CATEGORIES,
				                             '&action=edit_crossselling&current_product_id='
				                             . $_POST['current_product_id'] . '&cPath=' . $_POST['cPath']);
			}
			break;

		case 'multi_action_confirm' :
			if($_SESSION['coo_page_token']->is_valid($_POST['page_token']))
			{
				// --- MULTI DELETE ---
				if(isset($_POST['multi_delete_confirm']))
				{
					/** @var SliderWriteServiceInterface $sliderWriteService */
					$sliderWriteService = StaticGXCoreLoader::getService('SliderWrite');
					
					//delete multi_categories
					if(is_array($_POST['multi_categories'] ?? null))
					{
						$urlRewriteStorageContentType = new NonEmptyStringType('category');
						foreach($_POST['multi_categories'] AS $category_id)
						{
							$categoryIdType = new IdType((int)$category_id);
							$categoryWriteService->deleteCategoryById($categoryIdType);
							$sliderWriteService->deleteSliderAssignmentByCategoryId($categoryIdType);
						}
					}
					
					//delete multi_products
					if(is_array($_POST['multi_products'] ?? null) && is_array($_POST['multi_products_categories'] ?? null)) {
                        $urlRewriteStorageContentType = new NonEmptyStringType('product');
                        $urlRewriteStorage            = MainFactory::create('UrlRewriteStorage',
                                                                            $urlRewriteStorageContentType,
                                                                            $db,
                                                                            $languageProvider);
                        $coo_cache_control            = MainFactory::create_object('CacheControl');

                        foreach ($_POST['multi_products'] as $product_id) {
                            $product_id    = substr($product_id, strrpos($product_id, '_') + 1);
                            $productIdType = new IdType((int)$product_id);

                            /**
                             * This will ensure that deleted categories are no longer part of the products categories.
                             */
                            $products_categories = $_POST['multi_products_categories'];
							$deleted_categories = $_POST['multi_categories'] ?? null;
							if($deleted_categories !== null) {
                                foreach ($products_categories as $productId => $categories) {
                                    foreach ($categories as $categoryId => $category) {
                                        foreach ($deleted_categories as $deletedCategory) {
                                            if ($category === $deletedCategory) {
                                                unset($products_categories[$productId][$categoryId]);
                                            }
                                        }
                                    }
                                }
                            }
							
                            if(isset($products_categories[$product_id])) {
                                // convert multi_products_categories array to id collection
                                $categoryIds = MainFactory::create('IdCollection',
                                                                   array_map(function ($e) {
                                                                       return new IdType($e);
                                                                   },
                                                                       $products_categories[$product_id]));

                                $productWriteService->unlinkProduct($productIdType, $categoryIds);
                            }

                            $urlRewriteStorage->delete($productIdType);
                            $sliderWriteService->deleteSliderAssignmentByProductId($productIdType);

                            $coo_cache_control->rebuild_products_categories_index([$product_id]);
                            $coo_cache_control->rebuild_products_properties_index([$product_id]);
                        }
                    }
                }
				// --- MULTI DELETE ENDS ---

				// --- MULTI MOVE ---
				if (isset ($_POST['multi_move_confirm'])) {
					//move multi_categories
					if (is_array($_POST['multi_categories'] ?? null) && xtc_not_null($_POST['move_to_category_id'] ?? null)) {
						foreach ($_POST['multi_categories'] AS $category_id) {
							$dest_category_id = xtc_db_prepare_input($_POST['move_to_category_id']);
							if ($category_id != $dest_category_id) {
								$catfunc->move_category($category_id, $dest_category_id);
							}
						}
					}
					//move multi_products
					if (is_array($_POST['multi_products'] ?? null) && xtc_not_null($_POST['move_to_category_id'] ?? null)) {
						foreach ($_POST['multi_products'] AS $product_id) {
							$category_id = substr($product_id, 0, strrpos($product_id, '_'));
							$product_id = substr($product_id, strrpos($product_id, '_') + 1);
							$product_id = xtc_db_prepare_input($product_id);
							$src_category_id = xtc_db_prepare_input($_POST['src_category_id']);
							if (!isset($_POST['src_category_id']) || empty($_POST['src_category_id']))
							{
								$src_category_id = $category_id;
							}
							$dest_category_id = xtc_db_prepare_input($_POST['move_to_category_id']);
							$catfunc->move_product($product_id, $src_category_id, $dest_category_id);
						}
					}
					$redirectUrl = xtc_href_link(FILENAME_CATEGORIES, 'cPath='.$dest_category_id.'&'.xtc_get_all_get_params(array ('cPath', 'action', 'pID', 'cID')));
					break;
				}
				// --- MULTI MOVE ENDS ---

				// --- MULTI COPY ---
				if (isset ($_POST['multi_copy_confirm'])) {
					//copy multi_categories
					if (is_array($_POST['multi_categories'] ?? null) && (is_array($_POST['dest_cat_ids'] ?? null) || xtc_not_null($_POST['dest_category_id'] ?? null))) {
						$_SESSION['copied'] = array ();
						foreach ($_POST['multi_categories'] AS $category_id) {
							if (is_array($_POST['dest_cat_ids'] ?? null)) {
								foreach ($_POST['dest_cat_ids'] AS $dest_category_id) {
									if ($_POST['copy_as'] == 'link') {
										$catfunc->copy_category($category_id, $dest_category_id, 'link');
									}
									elseif ($_POST['copy_as'] == 'duplicate') {
										$catfunc->copy_category($category_id, $dest_category_id, 'duplicate');
									} else {
										$messageStack->add_session('Copy type not specified.', 'error');
									}
								}
							}
							elseif (xtc_not_null($_POST['dest_category_id'] ?? null)) {
								$dest_category_id = (int)$_POST['dest_category_id'];
								if ($_POST['copy_as'] == 'link') {
									$catfunc->copy_category($category_id, $dest_category_id, 'link');
								}
								elseif ($_POST['copy_as'] == 'duplicate') {
									$catfunc->copy_category($category_id, $dest_category_id, 'duplicate');
								} else {
									$messageStack->add_session('Copy type not specified.', 'error');
								}
							}
						}
						
						// START: add categorie relation to export_schemes table, if needed
						if(count($_SESSION['copied']) > 0)
						{
							$query = xtc_db_query("SELECT `scheme_id`, `export_all_new_ones` FROM `export_schemes`");
							if(xtc_db_num_rows($query) > 0)
							{
								while($row = xtc_db_fetch_array($query))
								{
									if($row['export_all_new_ones'] === '1')
									{
										foreach($_SESSION['copied'] AS $copiedCategorie)
										{
											xtc_db_query("REPLACE INTO `export_scheme_categories` (`scheme_id`, `categories_id`, `selection_state`)"
											             . "VALUES ('" . $row['scheme_id'] . "', '" . $copiedCategorie
											             . "', 'self_all_sub')");
										}
									}
								}
							}
						}
						// END: export_schemes
						
						unset ($_SESSION['copied']);
					}
					//copy multi_products
					if (is_array($_POST['multi_products'] ?? null) && (is_array($_POST['dest_cat_ids'] ?? null) || xtc_not_null($_POST['dest_category_id'] ?? null))) {
						foreach ($_POST['multi_products'] AS $product_id) {
							$product_id = substr($product_id, strrpos($product_id, '_') + 1);
							$product_id = xtc_db_prepare_input($product_id);
							if (is_array($_POST['dest_cat_ids'] ?? null)) {
								foreach ($_POST['dest_cat_ids'] AS $dest_category_id) {
									$dest_category_id = xtc_db_prepare_input($dest_category_id);
									if ($_POST['copy_as'] == 'link') {
										$catfunc->link_product($product_id, $dest_category_id);
									}
									elseif ($_POST['copy_as'] == 'duplicate') {
										$catfunc->duplicate_product($product_id, $dest_category_id);
									} else {
										$messageStack->add_session('Copy type not specified.', 'error');
									}
								}
							}
							elseif (xtc_not_null($_POST['dest_category_id'] ?? null)) {
								$dest_category_id = xtc_db_prepare_input($_POST['dest_category_id']);
								if ($_POST['copy_as'] == 'link') {
									$catfunc->link_product($product_id, $dest_category_id);
								}
								elseif ($_POST['copy_as'] == 'duplicate') {
									$catfunc->duplicate_product($product_id, $dest_category_id);
								} else {
									$messageStack->add_session('Copy type not specified.', 'error');
								}
							}
						}
					}
					
					$cPath = 'cPath=' . $_GET['cPath'];
					if(empty($_POST['dest_cat_ids']) || count($_POST['dest_cat_ids']) === 1)
					{
						$cPath = xtc_get_path($dest_category_id);
					}
					
					$redirectUrl = xtc_href_link(FILENAME_CATEGORIES, $cPath.'&'.xtc_get_all_get_params(array ('cPath', 'action', 'pID', 'cID')));
					break;
				}
				// --- MULTI COPY ENDS ---
				
				$cPath = 'cPath=' . $_GET['cPath'];
				if(!empty($_POST['move_to_category_id']))
				{
					$cPath = xtc_get_path($_POST['move_to_category_id']);
				}
				
				$redirectUrl = xtc_href_link(FILENAME_CATEGORIES, $cPath.'&'.xtc_get_all_get_params(array ('cPath', 'action', 'pID', 'cID')));
			}
			break;
			#EOB multi_action_confirm

	} //EOB switch action
} //EOB if action

// CATEGORIES-FILTER
$coo_feature_helper = MainFactory::create_object('FeatureFunctionHelper');
$coo_control        = MainFactory::create_object('FeatureControl');
$feature_array      = $coo_control->get_feature_array();

// check if the catalog image directory exists
if (is_dir(DIR_FS_CATALOG_IMAGES)) {
	if (!is_writeable(DIR_FS_CATALOG_IMAGES))
		$messageStack->add(ERROR_CATALOG_IMAGE_DIRECTORY_NOT_WRITEABLE . DIR_FS_CATALOG_IMAGES, 'error');
} else {
	$messageStack->add(ERROR_CATALOG_IMAGE_DIRECTORY_DOES_NOT_EXIST . DIR_FS_CATALOG_IMAGES, 'error');
}


$coo_admin_categories_extender_component = MainFactory::create_object('AdminCategoriesExtenderComponent');
$coo_admin_categories_extender_component->set_data('GET', $_GET);
$coo_admin_categories_extender_component->set_data('POST', $_POST);
if(isset($productId) && is_numeric($productId))
{
	$coo_admin_categories_extender_component->set_data('products_id', $productId);
}
if(isset($t_categories_id) && is_numeric($t_categories_id))
{
	$coo_admin_categories_extender_component->set_data('categories_id', $t_categories_id);
}
$coo_admin_categories_extender_component->proceed();

if(xtc_not_null($redirectUrl))
{
	xtc_redirect($redirectUrl);
}


// redirect to categories overview to prevent adding content twice
if(isset($_GET['action'])
	&& in_array($_GET['action'], array('insert_category', 'insert_product', 'update_product', 'update_category')) == true )
{
	if($_GET['action'] === 'insert_product')
	{
		$_GET['pID'] = $productId;
	}
	
	xtc_redirect(xtc_href_link(FILENAME_CATEGORIES, xtc_get_all_get_params(array('action'))));
}

// end of pre-checks and actions, HTML output follows
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html <?php echo HTML_PARAMS; ?>>
	<head>
		<meta http-equiv="x-ua-compatible" content="IE=edge">
		<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $_SESSION['language_charset']; ?>">
		<?php
		if(preg_match('/MSIE [\d]{2}\./i', $_SERVER['HTTP_USER_AGENT']))
		{
		?>
		<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />
		<?php
		}
		?>
		<title><?php echo TITLE; ?></title>
		<link rel="stylesheet" type="text/css" href="html/assets/styles/legacy/stylesheet.css">
		<link rel="stylesheet" type="text/css" href="html/assets/styles/legacy/lightbox.css">
		<link rel="stylesheet" type="text/css" href="html/assets/styles/legacy/buttons.css">
		<link rel="stylesheet" type="text/css" href="html/assets/styles/legacy/feature_set.css">
		<link rel="stylesheet" type="text/css" href="html/assets/styles/legacy/scrollpane.css">
		<link rel="stylesheet" type="text/css" href="html/assets/styles/legacy/article_tabs.min.css">
		<script type="text/javascript" src="html/assets/javascript/legacy/gm/general.js"></script>
		<script type="text/javascript" src="html/assets/javascript/legacy/gm/categories.js"></script>

		<?php
		$coo_js_options_control = MainFactory::create_object('JSOptionsControl', array(false));
		$t_js_options_array =  $coo_js_options_control->get_options_array($_GET);
		?>
		<script type="text/javascript"> var js_options = <?php echo json_encode($t_js_options_array) ?>; </script>
</head>
<body style="margin: 0; background-color: #FFFFFF">

		<div id="spiffycalendar" class="text"></div>
		<!-- header //-->
		<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
		<!-- header_eof //-->

		<!-- body //-->
		<table width="100%" style="border:none" class="hide-second-tr">
			<tr>
				<td class="columnLeft2" width="<?php echo BOX_WIDTH; ?>" valign="top">
    				<!-- left_navigation //-->
					<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
					<!-- left_navigation_eof //-->
				</td>
				<!-- body_text //-->
				<td class="boxCenter" valign="top" width="100%">
            <?php
            //----- new_category / edit_category (when ALLOW_CATEGORY_DESCRIPTIONS is 'true') -----
            if (isset($_GET['action']) && ($_GET['action'] === 'new_category' || $_GET['action'] === 'edit_category')) {
	            include DIR_FS_ADMIN . 'html/compatibility/new_category.php';
            }
            elseif (isset($_GET['action']) && $_GET['action'] === 'new_product') {
	            include DIR_FS_ADMIN . 'html/compatibility/product/new_product.inc.php';
            }
            elseif (isset($_GET['action']) && $_GET['action'] === 'edit_crossselling') {
              include (DIR_WS_MODULES.'cross_selling.php');
            } else {
              //set $cPath to 0 if not set - FireFox workaround, didn't work when de/activating categories and $cPath wasn't set
              if (!$cPath) { $cPath = '0'; }
              include (DIR_WS_MODULES.'categories_view.php');
            }
            ?>
          <!-- close tables from above modules //-->
        </td>
				<!-- body_text_eof //-->
			</tr>
		</table>
		<!-- body_eof //-->

		<!-- footer //-->
        <?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
		<!-- footer_eof //-->
		<script type="text/javascript" src="<?php echo DIR_WS_ADMIN; ?>html/assets/javascript/legacy/gm/google_categories_administration.js"></script>
		<script type="text/javascript" src="<?php echo DIR_WS_ADMIN; ?>html/assets/javascript/legacy/gm/max_upload_files.js"></script>
		<script type="text/javascript" src="<?php echo DIR_WS_ADMIN; ?>html/assets/javascript/legacy/gm/lightbox_plugin.js"></script>
		<script type="text/javascript" src="<?php echo DIR_WS_ADMIN; ?>html/assets/javascript/legacy/gm/lightbox_google_admin_categories.js"></script>
		<script type="text/javascript" src="<?php echo DIR_WS_ADMIN; ?>includes/ckeditor/ckeditor.js"></script>
	</body>
</html>
<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>

Unexpected error occurred...

Class "main_ORIGIN" not found