/**
  * Produces the Categories overview
  * @return  boolean               True on success, false otherwise
  */
 function view_categories()
 {
     global $_ARRAYLANG;
     if (isset($_REQUEST['tpl'])) {
         if ($_REQUEST['tpl'] == 'pricelists' || $_REQUEST['tpl'] == 'pricelist_edit') {
             return self::view_pricelists();
         }
     }
     $this->delete_categories();
     $this->store_category();
     $this->update_categories();
     $this->toggle_category();
     $i = 1;
     self::$pageTitle = $_ARRAYLANG['TXT_CATEGORIES'];
     self::$objTemplate->loadTemplateFile('module_shop_categories.html');
     self::$objTemplate->setGlobalVariable($_ARRAYLANG);
     // ID of the category to be edited, if any
     $category_id = isset($_REQUEST['category_id']) ? intval($_REQUEST['category_id']) : 0;
     // Get the tree array of all ShopCategories
     $arrShopCategories = ShopCategories::getTreeArray(true, false, false);
     // Default to the list tab
     $flagEditTabActive = false;
     $parent_id = 0;
     $name = '';
     $desc = '';
     $active = true;
     $virtual = false;
     $pictureFilename = NULL;
     $picturePath = $thumbPath = self::$defaultImage;
     if ($category_id) {
         // Edit the selected category:  Flip view to the edit tab
         $flagEditTabActive = true;
         $objCategory = ShopCategory::getById($category_id);
         if ($objCategory) {
             $parent_id = $objCategory->parent_id();
             $name = contrexx_raw2xhtml($objCategory->name());
             $desc = $objCategory->description();
             $active = $objCategory->active();
             $virtual = $objCategory->virtual();
             $pictureFilename = $objCategory->picture();
             if ($pictureFilename != '') {
                 $picturePath = \Cx\Core\Core\Controller\Cx::instanciate()->getWebsiteImagesShopWebPath() . '/' . $pictureFilename;
                 $thumbPath = \ImageManager::getThumbnailFilename(\Cx\Core\Core\Controller\Cx::instanciate()->getWebsiteImagesShopWebPath() . '/' . $pictureFilename);
             }
         }
     }
     $max_width = intval(\Cx\Core\Setting\Controller\Setting::getValue('thumbnail_max_width', 'Shop'));
     $max_height = intval(\Cx\Core\Setting\Controller\Setting::getValue('thumbnail_max_height', 'Shop'));
     if (empty($max_width)) {
         $max_width = 100000.0;
     }
     if (empty($max_height)) {
         $max_height = 100000.0;
     }
     $count = ShopCategories::getTreeNodeCount();
     self::$objTemplate->setVariable(array('TXT_SHOP_CATEGORY_ADD_OR_EDIT' => $category_id ? $_ARRAYLANG['TXT_SHOP_CATEGORY_EDIT'] : $_ARRAYLANG['TXT_SHOP_CATEGORY_NEW'], 'TXT_ADD_NEW_SHOP_GROUP' => $category_id ? $_ARRAYLANG['TXT_EDIT_PRODUCT_GROUP'] : $_ARRAYLANG['TXT_ADD_NEW_PRODUCT_GROUP'], 'SHOP_CATEGORY_ID' => $category_id, 'SHOP_CATEGORY_NAME' => $name, 'SHOP_CATEGORY_MENUOPTIONS' => ShopCategories::getMenuoptions($parent_id, false), 'SHOP_THUMB_IMG_HREF' => $thumbPath, 'SHOP_CATEGORY_IMAGE_FILENAME' => $pictureFilename == '' ? $_ARRAYLANG['TXT_SHOP_IMAGE_UNDEFINED'] : $pictureFilename, 'SHOP_PICTURE_REMOVE_DISPLAY' => $pictureFilename == '' ? \Html::CSS_DISPLAY_NONE : \Html::CSS_DISPLAY_INLINE, 'SHOP_CATEGORY_VIRTUAL_CHECKED' => $virtual ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_CATEGORY_ACTIVE_CHECKED' => $active ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_CATEGORY_DESCRIPTION' => $desc, 'SHOP_CATEGORY_EDIT_ACTIVE' => $flagEditTabActive ? 'active' : '', 'SHOP_CATEGORY_EDIT_DISPLAY' => $flagEditTabActive ? 'block' : 'none', 'SHOP_CATEGORY_LIST_ACTIVE' => $flagEditTabActive ? '' : 'active', 'SHOP_CATEGORY_LIST_DISPLAY' => $flagEditTabActive ? 'none' : 'block', 'SHOP_IMAGE_WIDTH' => $max_width, 'SHOP_IMAGE_HEIGHT' => $max_height, 'SHOP_TOTAL_CATEGORIES' => $count));
     if ($pictureFilename) {
         self::$objTemplate->setVariable(array('SHOP_PICTURE_IMG_HREF' => $picturePath));
     }
     // mediabrowser
     $mediaBrowserOptions = array('type' => 'button', 'data-cx-mb-startmediatype' => 'shop', 'data-cx-mb-views' => 'filebrowser', 'id' => 'media_browser_shop', 'style' => 'display:none');
     self::$objTemplate->setGlobalVariable(array('MEDIABROWSER_BUTTON' => self::getMediaBrowserButton($mediaBrowserOptions, 'setSelectedImage')));
     self::$objTemplate->parse('category_edit');
     // TODO: Add controls to fold parent categories
     //        $level_prev = null;
     $arrLanguages = \FWLanguage::getActiveFrontendLanguages();
     // Intended to show an edit link for all active frontend languages.
     // However, the design doesn't like it.  Limit to the current one.
     $arrLanguages = array(FRONTEND_LANG_ID => $arrLanguages[FRONTEND_LANG_ID]);
     foreach ($arrShopCategories as $arrShopCategory) {
         $category_id = $arrShopCategory['id'];
         $level = $arrShopCategory['level'];
         self::$objTemplate->setGlobalVariable(array('SHOP_ROWCLASS' => 'row' . (++$i % 2 + 1), 'SHOP_CATEGORY_ID' => $category_id, 'SHOP_CATEGORY_NAME' => htmlentities($arrShopCategory['name'], ENT_QUOTES, CONTREXX_CHARSET), 'SHOP_CATEGORY_ORD' => $arrShopCategory['ord'], 'SHOP_CATEGORY_LEVELSPACE' => str_repeat('|----', $level), 'SHOP_CATEGORY_ACTIVE' => $arrShopCategory['active'] ? $_ARRAYLANG['TXT_ACTIVE'] : $_ARRAYLANG['TXT_INACTIVE'], 'SHOP_CATEGORY_ACTIVE_VALUE' => intval($arrShopCategory['active']), 'SHOP_CATEGORY_ACTIVE_CHECKED' => $arrShopCategory['active'] ? \Html::ATTRIBUTE_CHECKED : '', 'SHOP_CATEGORY_ACTIVE_PICTURE' => $arrShopCategory['active'] ? 'status_green.gif' : 'status_red.gif', 'SHOP_CATEGORY_VIRTUAL_CHECKED' => $arrShopCategory['virtual'] ? \Html::ATTRIBUTE_CHECKED : ''));
         // All languages active
         foreach ($arrLanguages as $lang_id => $arrLanguage) {
             self::$objTemplate->setVariable(array('SHOP_CATEGORY_LANGUAGE_ID' => $lang_id, 'SHOP_CATEGORY_LANGUAGE_EDIT' => sprintf($_ARRAYLANG['TXT_SHOP_CATEGORY_LANGUAGE_EDIT'], $lang_id, $arrLanguage['lang'], $arrLanguage['name'])));
             self::$objTemplate->parse('category_language');
         }
         // TODO: Implement a folded hierarchy view
         //            self::$objTemplate->touchBlock('category_row');
         //            if ($level !== $level_prev) {
         //                self::$objTemplate->touchBlock('folder');
         //            }
         //            $level_prev = $level;
         self::$objTemplate->parse('category_row');
     }
     return true;
 }