<?php
/**
 *
 * Handle the category view
 *
 * @package	VirtueMart
 * @subpackage
 * @author Max Milbers
* @link https://virtuemart.net
 * @copyright Copyright (c) 2004 - 2024 VirtueMart Team. All rights reserved.
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
 * VirtueMart is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * @version $Id: view.html.php 11200 2025-09-29 17:40:53Z Milbo $
 */

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die('Restricted access');

/**
 * Handle the category view
 *
 * @package VirtueMart
 * @author Max Milbers
 */
class VirtuemartViewCategory extends VmView {

	public $combineTags = true;
	public function display($tpl = null) {

		//For BC, we convert first the new config param names to the old ones
		//Attention, this will be removed around 2020.
		if(VmConfig::get('legacylayouts',false)){
			VmConfig::set('show_featured', VmConfig::get('featured'));
			VmConfig::set('show_discontinued', VmConfig::get('discontinued'));
			VmConfig::set('show_topTen', VmConfig::get('topten'));
			VmConfig::set('show_recent', VmConfig::get('recent'));
			VmConfig::set('show_latest', VmConfig::get('latest'));

			VmConfig::set('featured_products_rows', VmConfig::get('featured_rows'));
			VmConfig::set('discontinued_products_rows', VmConfig::get('discontinued_rows'));
			VmConfig::set('topTen_products_rows', VmConfig::get('topten_rows'));
			VmConfig::set('recent_products_rows', VmConfig::get('recent_rows'));
			VmConfig::set('latest_products_rows', VmConfig::get('latest_rows'));
			VmConfig::set('omitLoaded_topTen', VmConfig::get('omitLoaded_topten'));
			VmConfig::set('showCategory', VmConfig::get('showcategory'));
		}


		$this->show_prices  = (int)VmConfig::get('show_prices',1);

		$document = JFactory::getDocument();

		$this->app = JFactory::getApplication();
		$pathway = $this->app->getPathway();

		if( vmAccess::isFEmanager('product.edit') ){
			$add_product_link = JURI::root() . 'index.php?option=com_virtuemart&tmpl=component&view=product&task=edit&virtuemart_product_id=0&managing=1' ;
			$add_product_link = $this->linkIcon($add_product_link, 'COM_VIRTUEMART_PRODUCT_FORM_NEW_PRODUCT', 'edit', false, false);
		} else {
			$add_product_link = "";
		}
		$this->assignRef('add_product_link', $add_product_link);

		$menus	= $this->app->getMenu();
		$menu = $menus->getActive();

		//vmdebug('My active menu item',$menu);
		if(!empty($menu->id)){
			$itemId = $menu->id;
		} else {

			$itemId = vRequest::getInt('Itemid',false);
			if($itemId){
				$menus->setActive($itemId);
				$menu = $menus->getActive();
			}
			if(empty($menu->id)){
				$menu = $menus->getDefault();
				vmdebug('$menu = $menus->getDefault',$itemId);
			}
		}

		if(empty($menu)){
			$menu = new stdClass;
			$menuParams = new JRegistry();
		} else {
			$menuParams = $menu->getParams();
		}

		$stf_itemid = $menuParams->get('stf_itemid',false);
		if(!empty($stf_itemid) ){
			$mstf=$menus->getItem($stf_itemid);
			if(!empty($mstf)){
				$menu = $mstf;
			}
		}

		ShopFunctionsF::setLastVisitedItemId($itemId);
		$this->Itemid = $itemId;

		$this->productModel = VmModel::getModel('product');

		$this->keyword = $this->productModel->keyword;

		$this->virtuemart_manufacturer_id = vRequest::getInt('virtuemart_manufacturer_id', -1 );
		if($this->virtuemart_manufacturer_id ===-1 and isset($menu->query['virtuemart_manufacturer_id'])){
			$this->virtuemart_manufacturer_id = $menu->query['virtuemart_manufacturer_id'];
			vRequest::setVar('virtuemart_manufacturer_id',$this->virtuemart_manufacturer_id);
		}
		//vmdebug('caetgory view $this->virtuemart_manufacturer_id',$this->virtuemart_manufacturer_id,$menu->query['virtuemart_manufacturer_id'],vRequest::getInt('virtuemart_manufacturer_id', -1 ),$_REQUEST);
		$this->categoryId = (int)vRequest::getInt('virtuemart_category_id', -1);
		if($this->categoryId === -1 and isset($menu->query['virtuemart_category_id'])){
			$this->categoryId = (int)$menu->query['virtuemart_category_id'];
			vRequest::setVar('virtuemart_category_id',$this->categoryId);
		} else if ( $this->categoryId === -1 and $this->virtuemart_manufacturer_id === -1 and empty($this->keyword)){

			$this->categoryId = ShopFunctionsF::getLastVisitedCategoryId();
		}

		if(empty($this->categoryId) and $this->virtuemart_manufacturer_id===''){

			vmInfo(vmText::_('COM_VIRTUEMART_MANU_NOT_FOUND'));

			return $this->handle404();
		}

		if ((int)$this->categoryId === -2) {
			//stAn - i'd rather suggest own layout for 404 here instead of guessing last category, etc..
			return $this->handle404();
			
		}
		if ($this->categoryId === -1 and $this->virtuemart_manufacturer_id){
			$this->categoryId = 0;
		}

		$this->setCanonicalLink($tpl,$document,$this->categoryId,$this->virtuemart_manufacturer_id);


		if($this->categoryId===-1) $this->categoryId = 0;
		if($this->virtuemart_manufacturer_id===-1) $this->virtuemart_manufacturer_id = 0;

		$prefix = '';



		if(empty($this->keyword)) $this->keyword = false;

		if(		(isset($menu->query['virtuemart_category_id']) and $menu->query['virtuemart_category_id']!=$this->categoryId) or
		(isset($menu->query['virtuemart_manufacturer_id']) and $menu->query['virtuemart_manufacturer_id']!=$this->virtuemart_manufacturer_id) or
		!empty($this->keyword ) ) {
			$prefix = 'stf_';
		}

		$paramNames = array('itemid'=>'',
		'categorylayout' => VmConfig::get('categorylayout', 0),
		'show_store_desc' => VmConfig::get('show_store_desc',1),
		'showcategory_desc' => VmConfig::get('showcategory_desc', 1),
		'showcategory' => VmConfig::get('showcategory',1),
		'categories_per_row' => VmConfig::get('categories_per_row',3),
		'showproducts' => VmConfig::get('showproducts',1),
		'showsearch' => VmConfig::get('showsearch',0),
		'productsublayout' => VmConfig::get('productsublayout', ''),
		'products_per_row' => VmConfig::get('products_per_row', 3),
		'featured' => VmConfig::get('featured',1),
		'featured_rows' => VmConfig::get('featured_rows',1),
		'omitLoaded_featured' => VmConfig::get('omitLoaded_featured',1),
		'featured_only_cat' => VmConfig::get('featured_only_cat',0),
		'discontinued' => VmConfig::get('discontinued',0),
		'discontinued_rows' => VmConfig::get('discontinued_rows',1),
		'omitLoaded_discontinued' => VmConfig::get('omitLoaded_discontinued',1),
		'discontinued_only_cat' => VmConfig::get('discontinued_only_cat',0),
		'latest' => VmConfig::get('latest',1),
		'latest_rows' => VmConfig::get('latest_rows',1),
		'omitLoaded_latest' => VmConfig::get('omitLoaded_latest',1),
		'latest_only_cat' => VmConfig::get('latest_only_cat',0),
		'topten' => VmConfig::get('topten',1),
		'topten_rows' => VmConfig::get('topten_rows',1),
		'omitLoaded_topten' => VmConfig::get('omitLoaded_topten',1),
		'topten_only_cat' => VmConfig::get('topten_only_cat',0),
		'recent' => VmConfig::get('recent',0),
		'recent_rows' => VmConfig::get('recent_rows',1),
		'omitLoaded_recent' => VmConfig::get('omitLoaded_recent',1),
		'recent_only_cat' => VmConfig::get('recent_only_cat',0)
		);

		$categoryModel = VmModel::getModel('category');

		// set search and keyword
		if ($this->productModel->keyword){
			$pathway->addItem(strip_tags(htmlspecialchars_decode($this->keyword)));
		}

		$this->category = $categoryModel->getCategory($this->categoryId, false);
		//vmdebug('$this->category category ',$this->category);
		foreach($paramNames as $k => $v){
			/*if(!isset($this->category->{$k}) or $this->category->{$k}==''){
				$this->{$k} = $menuParams->get($prefix.$k,$v);
			} else if(isset($this->category->{$k})){
				$this->{$k} = $this->category->{$k};
			}*/

			if(isset($this->category->{$k}) and $this->category->{$k}!=''){
				$this->{$k} = $this->category->{$k};
				vmdebug('Use setting set by category '.$k,$this->{$k});
			} else {
				$this->{$k} = $menuParams->get($prefix.$k,$v);
				//vmdebug('Use setting set by menu '.$k,$this->{$k});
			}
		}

		$this->storefront = $menuParams->get('storefront',0);

		$this->perRow = $this->products_per_row = empty($this->category->products_per_row)? $menuParams->get($prefix.'products_per_row',$paramNames['products_per_row']):$this->category->products_per_row;

		$vendorId = $this->category->virtuemart_vendor_id;
		if(empty($vendorId)) $vendorId = 1; //If we are in the root category, the id is empty

		//No redirect here, for category id = 0 means show ALL categories! note by Max Milbers
		if ((!empty($this->categoryId) and $this->categoryId!==-1 ) and (empty($this->category->slug) or !$this->category->published)) {

			return $this->handle404();
		}

		$ratingModel = VmModel::getModel('ratings');
		$this->productModel->withRating = $this->showRating = $ratingModel->showRating();

		$this->vmPagination = '';
		$this->orderByList = array();

		$this->searchcustom = '';
		$this->searchCustomValues = '';	//deprecated
		$this->searchCustomValuesAr = array ();

		$app = JFactory::getApplication();


		if(!empty($this->keyword) or $this->showsearch){

			$this->getSearchCustom();
			$this->searchAllCats = $app->getUserStateFromRequest('com_virtuemart.customfields.searchAllCats','searchAllCats',false);
		}


		shopFunctionsF::setLastVisitedCategoryId($this->categoryId);
		shopFunctionsF::setLastVisitedManuId($this->virtuemart_manufacturer_id);

		//We need to load the cart here, to get correct discounts
		if(!VmConfig::get('use_as_catalog',false)) $cart = VirtuemartCart::getCart();

		$imgAmount = VmConfig::get('prodimg_browse',1);
		$dynamic = vRequest::getInt('dynamic',false);
		$id = vRequest::getInt('virtuemart_product_id',false);
		$legacy = VmConfig::get('legacylayouts',1);

		$this->products = array();

		$this->productModel->cartattribute = (int)VmConfig::get('BrowseProductCartattributeOnly',1);
		if ($dynamic and $id) {
			$p = $this->productModel->getProduct ($id);
			$this->products['products'][] = $p;
			$this->productModel->addImages($this->products['products'], $imgAmount );
			$this->orderByList = array('orderby' => '', 'manufacturer' => '');
			if($legacy) {
				$this->vmPagination = $this->productModel->getPagination($this->perRow);
			}
		} else {

			$search_enabled = VmConfig::get('searchEnabled',1);
			//The search must be executed first
			if($search_enabled and !empty($this->keyword) or !empty($this->productModel->searchcustoms)) {
				vmdebug('Lets load the search',$this->keyword,$this->productModel->searchcustoms);
				// Load the products in the given category
				$ids = $this->productModel->sortSearchListQuery (TRUE, $this->categoryId);
				VirtueMartModelProduct::$_alreadyLoadedIds = array_merge(VirtueMartModelProduct::$_alreadyLoadedIds,$ids);
				$this->vmPagination = $this->productModel->getPagination($this->perRow);
				$this->orderByList = $this->productModel->getOrderByList($this->categoryId);
				$this->products['products'] = $this->productModel->getProducts ($ids);
				$this->productModel->addImages($this->products['products'], $imgAmount );
			}

			if($legacy) {

				if($this->showproducts){
					$opt = array('products');
				} else {
					$opt = array();
				}
			} else {
				$sequence = VmConfig::get('ProductGroupsSequence','');
				if(empty($sequence)){
					$opt = array('featured', 'discontinued', 'latest', 'topten', 'recent');
				} else {
					$opt = explode(',',$sequence);
				}

				if($this->showproducts and empty($this->keyword) and empty($this->productModel->searchcustoms)){
					$opt[] = 'products';
				}
			}

			foreach( $opt as $o ) {
				$o = trim($o);
				if($o == 'products') {
					VirtueMartModelProduct::$omitLoaded = VmConfig::get('omitLoaded');
					$ids = $this->productModel->sortSearchListQuery( TRUE, $this->categoryId );
					VirtueMartModelProduct::$_alreadyLoadedIds = array_merge( VirtueMartModelProduct::$_alreadyLoadedIds, $ids );
					$this->vmPagination = $this->productModel->getPagination( $this->perRow );
					$this->orderByList = $this->productModel->getOrderByList( $this->categoryId );

					$this->products['products'] = $this->productModel->getProducts( $ids );
					$this->productModel->addImages( $this->products['products'], $imgAmount );
				} else {
					//Lets check, if we use the new Frontpages settings
					VirtueMartModelProduct::$omitLoaded = VmConfig::get( 'omitLoaded_'.$o, true );
					if(!empty( $this->{$o} ) and !empty( $this->{$o.'_rows'} )) {
						$perRow = intval($this->perRow);
						if($this->{$o.'_only_cat'}  and $this->categoryId>0){
							$onlyCat = $this->categoryId;
						} else {
							$onlyCat = 0;

						}
						$this->products[$o] = $this->productModel->getProductListing( $o, $perRow * $this->{$o.'_rows'}, TRUE, TRUE, FALSE, $onlyCat, $onlyCat);
						$this->productModel->addImages( $this->products[$o], $imgAmount );
					}
				}
			}

		}
		$this->productModel->cartattribute = -1;

		if ($this->products) {

			$this->currency = CurrencyDisplay::getInstance( );
			$display_stock = VmConfig::get('display_stock',1);
			$showCustoms = (int)VmConfig::get('show_pcustoms',1);

			//Unset the empty product groups to avoid errors with old layouts
			foreach($this->products as $pType => $productSeries) {
				if($productSeries===false) unset($this->products[$pType]);
			}

			if($display_stock or $showCustoms){

				if(!$showCustoms){
					foreach($this->products as $pType => $productSeries){
						foreach($productSeries as $i => $productItem){
							$this->products[$pType][$i]->stock = $this->productModel->getStockIndicator($productItem);
						}
					}
				} else {

					foreach($this->products as $pType => $productSeries) {
						shopFunctionsF::sortLoadProductCustomsStockInd($this->products[$pType],$this->productModel);
					}
				}
			}
		}

		// Add feed links
		if ($this->products  && VmConfig::get('feed_cat_published', 0)==1) {

			$link = vmURI::getCurrentUrlBy('get').'&format=feed&limitstart=';

			$attribs = array('type' => 'application/rss+xml', 'title' => 'RSS 2.0');
			$document->addHeadLink(JRoute::_($link . '&type=rss'), 'alternate', 'rel', $attribs);
			$attribs = array('type' => 'application/atom+xml', 'title' => 'Atom 1.0');
			$document->addHeadLink(JRoute::_($link . '&type=atom'), 'alternate', 'rel', $attribs);
		}

		$this->showBasePrice = (vmAccess::manager() or vmAccess::isSuperVendor());

		// Add the category name to the pathway
		if ($this->category->parents) {
			foreach ($this->category->parents as $c){
				if(!empty($c->virtuemart_category_id) and !empty($c->category_name) and !empty($c->published)){
					$pathway->addItem(strip_tags(vmText::_($c->category_name)),JRoute::_('index.php?option=com_virtuemart&view=category&virtuemart_category_id='.$c->virtuemart_category_id, FALSE));
				} else vmdebug('parent category is empty',$this->category->parents);
			}
		}
		$catImgAmount = VmConfig::get('catimg_browse',1);
		$categoryModel->addImages($this->category,$catImgAmount);

		if($this->showcategory){

			$this->category->children = $categoryModel->getChildCategoryList( $vendorId, $this->categoryId, $categoryModel->getDefaultOrdering(), $categoryModel->_selectedOrderingDir );
			$categoryModel->addImages($this->category->children,$catImgAmount);
			//$this->category->has_children = (boolean)count($this->category->children);

			//Whatever fallback
			$this->category->haschildren = $this->category->has_children;

		} else {
			$this->category->children = false;
		}

		if (VmConfig::get('enable_content_plugin', 0)) {
			shopFunctionsF::triggerContentPlugin($this->category, 'category','category_description');
		}

		if(empty($this->category->category_template)){
			$this->category->category_template = VmConfig::get('categorytemplate');
		}

		if(!empty($this->categorylayout)){
			$this->category->category_layout = $this->categorylayout;
		}

		vmJsApi::jPrice();

		$this->productsLayout = 'products'; //VmConfig::get('productsublayout','products');
		if(!empty($this->productsublayout)){
			$this->productsLayout = $this->productsublayout;
		}


		VmTemplate::setVmTemplate($this,$this->category->category_template,0,$this->category->category_layout);


		$customtitle = '';
		$metadesc = '';
		$metakey = '';
		$metarobot = '';
		$metaauthor = '';

		$metadesc = $menuParams->get('menu-meta_description');
		$metakey = $menuParams->get('menu-meta_keywords');
		$metarobot = $menuParams->get('robots');
		$customtitle = $menuParams->get('page_title');


		if(($this->storefront and empty($prefix)) or $this->show_store_desc or empty($this->categoryId)){

			$vendorModel = VmModel::getModel('vendor');
			if(!empty($this->category->virtuemart_vendor_id)){
				$vendorModel->setId($this->category->virtuemart_vendor_id);
			} else {
				$vendorModel->setId(1);;
			}
			$this->vendor = $vendorModel->getVendor();
		}

		$this->manu_descr = '';

		if(($this->storefront and empty($prefix)) or (empty($this->categoryId) and empty($this->virtuemart_manufacturer_id)) ){

			if(empty($this->vendor->customtitle)){
				if(empty($customtitle)) {
					$customtitle = vmText::sprintf('COM_VIRTUEMART_HOME',$this->vendor->vendor_store_name);
				}
			} else {
				$customtitle = $this->vendor->customtitle;
			}

			if(!empty($this->vendor->metadesc)) $metadesc = $this->vendor->metadesc;
			if(!empty($this->vendor->metakey)) $metakey = $this->vendor->metakey;
			if(!empty($this->vendor->metarobot)) $metarobot = $this->vendor->metarobot;
			if(!empty($this->vendor->metaauthor)) $metaauthor = $this->vendor->metaauthor;

		} else {
			if(empty($this->categoryId)){
				$metaObj = VmModel::getModel('manufacturer')->getManufacturer($this->virtuemart_manufacturer_id);
				$this->manufacturer = $metaObj;
				$categoryModel->addImages($this->manufacturer,$catImgAmount);
				$this->manu_descr = $metaObj->mf_desc;
			} else {
				$metaObj = $this->category;
			}

			if (!empty($metaObj->metadesc)) {
				$metadesc = $metaObj->metadesc;
			}
			if (!empty($metaObj->metakey)) {
				$metakey = $metaObj->metakey;
			}
			if (!empty($metaObj->metarobot)) {
				$metarobot = $metaObj->metarobot;
			}
			if(!empty($metaObj->customtitle)){
				$customtitle = $metaObj->customtitle;
			}

			if ($this->app->getCfg('MetaAuthor') == '1' and !empty($this->category->metaauthor)) {
				$metaauthor = $this->category->metaauthor;
			}

		}

		if(empty($metadesc)){
			$description = '';
			if(!empty($this->categoryId)){
				$description=$this->category->category_description;
				$name=$this->category->category_name;
			} else if(!empty($this->virtuemart_manufacturer_id)){
				$metaObj = VmModel::getModel('manufacturer')->getManufacturer($this->virtuemart_manufacturer_id);
				$description=$metaObj->mf_desc;
				$name=$metaObj->mf_name;
			}
			$qdesc =  strip_tags(html_entity_decode($description,ENT_QUOTES)) ;
			$qdesc = str_replace(array("\n", "\r","\t"), "", $qdesc);
			$qdesc = str_replace(array("  "), " ", $qdesc);
			$qdesc = shopFunctionsF::limitStringByWord($qdesc,120);
			$metadesc = $this->category->category_name . ". ". $qdesc . ' ' .vmText::_('COM_VIRTUEMART_READ_MORE');
		}
//		quorvia get rid of any excess data
		$metadesc = str_replace(array("\n", "\r","\t"), "", $metadesc);
		$metadesc = str_replace(array("  "), " ", $metadesc);
		$document->setMetaData('description',$metadesc);
		$document->setMetaData('keywords', $metakey);
		$document->setMetaData('robots', $metarobot);
		$document->setMetaData('author', $metaauthor);

		// Set the titles
		if (!empty($customtitle)) {
			$title = strip_tags($customtitle);
		} elseif (!empty($this->category->category_name)) {
			$title = strip_tags($this->category->category_name);
		} else {
			$title = $this->setTitleByJMenu();
		}

		$title = vmText::_($title);

		if(vRequest::getInt('error')){
			$title .=' '.vmText::_('COM_VIRTUEMART_PRODUCT_NOT_FOUND');
		}
		if($this->keyword !== false and !empty($this->keyword)){
			$title .=' ('.vRequest::vmSpecialChars(strip_tags(htmlspecialchars_decode($this->keyword))).')';
		}

		if ($this->virtuemart_manufacturer_id>0 and  isset($metaObj->mf_name)){

			if(VmConfig::get('addManuNameToCatBrowseTitle',true)){
				// in case of multi mf, don't take the one of the 1rst product, but the mf name is in the $metaObj
				if (isset($metaObj->mf_name)) $title .=' '.$metaObj->mf_name;
			}

			// Override Category name when viewing manufacturers products !IMPORTANT AFTER page title.
			// in case of multi mf, don't take the one of the 1rst product, but the mf name is in the $metaObj
			if (isset($metaObj->mf_name) and isset($this->category->category_name)) $this->category->category_name = $metaObj->mf_name ;

		}

		$document->setTitle( $title );
		if ($this->app->getCfg('MetaTitle') == '1') {
			$document->setMetaData('title',  $title);
		}

		//Fallback for older layouts, will be removed vm3.4
		$this->fallback=false;
		if(count($this->products)===1 and isset($this->products['products'])){
			$this->products = $this->products['products'];
			$this->fallback=true;
			vmdebug('Fallback active');
		}

		if (VmConfig::get ('jdynupdate', 1)) {
			vmJsApi::jDynUpdate();
		}

		if(VmConfig::get ('ajax_category', 1)){
			vmJsApi::jDynUpdate('.category-view');
		}

		parent::display($tpl);
	}

	public function setTitleByJMenu(){
		$menus	= $this->app->getMenu();
		$menu = $menus->getActive();

		$title = 'VirtueMart Category View';
		if ($menu) $title = $menu->title;
		//@todo I think this sequence should be different
		// Check for empty title and add site name if param is set
		if (empty($title)) {
			$title = $this->app->getCfg('sitename');
		}
		elseif ($this->app->getCfg('sitename_pagetitles', 0) == 1) {
			$title = vmText::sprintf('JPAGETITLE', $this->app->getCfg('sitename'), $title);
		}
		elseif ($this->app->getCfg('sitename_pagetitles', 0) == 2) {
			$title = vmText::sprintf('JPAGETITLE', $title, $this->app->getCfg('sitename'));
		}
		return $title;
	}

	public function setCanonicalLink($tpl,$document,$categoryId,$manId){
		// Set Canonic link
		if (!empty($tpl)) {
			$format = $tpl;
		} else {
			$format = vRequest::getCmd('format', 'html');
		}
		if ($format == 'html') {

			// remove joomla canonical before adding it
			foreach ( $document->_links as $k => $array ) {
				if ( $array['relation'] == 'canonical' ) {
					unset($document->_links[$k]);
					break;
				}
			}

			$link = 'index.php?option=com_virtuemart&view=category';
			if($categoryId!==-1){
				$link .= '&virtuemart_category_id='.$categoryId;
			}
			if($manId!==-1 and !empty($manId)){
				$link .= '&virtuemart_manufacturer_id='.$manId;
			}
			//vmdebug('caetgory view setCanonicalLink',$link);
			$document->addHeadLink( JUri::getInstance()->toString(array('scheme', 'host', 'port')).JRoute::_($link, FALSE) , 'canonical', 'rel', '' );

		}
	}

	/*
	 * generate custom fields list to display as search in FE
	 */
	public function getSearchCustom() {

		$emptyOption  = array('virtuemart_custom_id' =>'', 'custom_title' => vmText::_('COM_VIRTUEMART_LIST_EMPTY_OPTION'));
		$this->custom_parent_id = vRequest::getInt('custom_parent_id', 0);
		$this->searchCustomList = '';

		$db =JFactory::getDBO();

		$q1= 'SELECT c.* FROM #__virtuemart_customs  as c ';
		if(!empty($this->categoryId)){
			$q1 .= 'INNER JOIN #__virtuemart_product_customfields as pc on (c.virtuemart_custom_id=pc.virtuemart_custom_id)
INNER JOIN #__virtuemart_product_categories as cat ON (pc.virtuemart_product_id=cat.virtuemart_product_id)';
		}
		$q1 .= ' WHERE';
		if(!empty($this->categoryId)){
			$q1 .= ' virtuemart_category_id="'.$this->categoryId.'" and';
		}
		$q1 .= ' searchable="1" and (field_type="S" or field_type="P") and c.published = 1 GROUP BY c.virtuemart_custom_id';

		$db->setQuery($q1);
		$this->selected = $db->loadObjectList();

//		if((int)VmConfig::get('debug_Sql',0))vmdebug('getSearchCustom '.str_replace('#__',$db->getPrefix(),$db->getQuery()),$this->selected);//,$this->categoryId,$this->selected);
		if($this->selected) {
			$app = JFactory::getApplication();
			foreach ($this->selected as $selected) {
				$valueOptions = array();
				if($selected->field_type=="S") {

					//if($selected->is_list) {
						//if($selected->is_list == "1") {
						$q2= 'SELECT pc.* FROM #__virtuemart_product_customfields  as pc ';
						$q2 .= 'INNER JOIN #__virtuemart_products as p on (pc.virtuemart_product_id=p.virtuemart_product_id)';
						if(!empty($this->categoryId)){
							$q2 .= 'INNER JOIN #__virtuemart_product_categories as cat on (pc.virtuemart_product_id=cat.virtuemart_product_id)';
						}
						$q2 .= ' WHERE virtuemart_custom_id="'.$selected->virtuemart_custom_id.'" and p.published="1" ';
						if(!empty($this->categoryId)){
							$q2 .= ' and virtuemart_category_id="'.$this->categoryId.'" ';
						}
						$q2 .= ' GROUP BY `customfield_value`';

						/*$q2 = 'SELECT * FROM `#__virtuemart_product_customfields` WHERE virtuemart_custom_id="'.$selected->virtuemart_custom_id.'" ';
						if(!empty($this->categoryId)){
							$q1 .= ' virtuemart_category_id="'.$this->categoryId.'" and';
						}
						$q2 = 'GROUP BY `customfield_value` ';*/
						$db->setQuery( $q2 );
						$Opts = $db->loadObjectList();
						//if((int)VmConfig::get('debug_Sql',0))vmdebug('getSearchCustom my  q2 '.str_replace('#__',$db->getPrefix(),$db->getQuery()),$Opts);//,$this->categoryId,$this->selected);

						if($Opts){
							foreach( $Opts as $k => $v ) {
								if(empty($v->customfield_value)){
									//vmdebug('getSearchCustom empty value for ',$k,$v);
									continue;
								}
								if(!isset($valueOptions[$v->customfield_value])) {
									$valueOptions[$v->customfield_value] = vmText::_($v->customfield_value);
								}
							}
							$valueOptions = array_merge(array($emptyOption), $valueOptions);

							$v = '';
							if(!empty($this->productModel->searchcustoms) and !empty($this->productModel->searchcustoms[$selected->virtuemart_custom_id])){
								$v = $this->productModel->searchcustoms[$selected->virtuemart_custom_id];
							}
							//$v = $app->getUserStateFromRequest ('com_virtuemart.customfields.'.$selected->virtuemart_custom_id, 'customfields['.$selected->virtuemart_custom_id.']', '', 'string');

							//deprecated $this->searchCustomValues
							$this->searchCustomValues .= '<div class="vm-search-custom-values-group"><div class="vm-custom-title-select">' .  vmText::_( $selected->custom_title ).'</div>'.JHtml::_( 'select.genericlist', $valueOptions, 'customfields['.$selected->virtuemart_custom_id.']', 'class="inputbox vm-chzn-select changeSendForm"', 'virtuemart_custom_id', 'custom_title', $v ) . '</div>';

							// Custom Search Values
							$selected->value_options    = $valueOptions;
							$selected->v                = $v;
							$this->searchCustomValuesAr[] = $selected;

						}

						//vmdebug('getSearchCustom '.$q2,$Opts,$valueOptions);
						/*} else if($selected->is_list == "2" and !empty($selected->custom_value)) {
							$valueOptions = array();
							$Opts = explode( ';', $selected->custom_value );
							foreach( $Opts as $k => $v ) {
								$valueOptions[$v] = $v;
							}
						}*/

				} else if($selected->field_type=="P"){
					//deprecated $this->searchCustomValues
					$v = vRequest::getString('customfields['.$selected->virtuemart_custom_id.']');
					$n = 'customfields['.$selected->virtuemart_custom_id.']';
					$this->searchCustomValues .= vmText::_( $selected->custom_title ).' <input name="'.$n.'" class="inputbox vm-chzn-select" type="text" size="20" value="'.$v.'"/>';

					$this->searchCustomValuesAr[] = $selected;
				} else {
				//Atm not written for other field types
				/*	$db->setQuery('SELECT `customfield_value` as virtuemart_custom_id,`custom_value` as custom_title FROM `#__virtuemart_product_customfields` WHERE virtuemart_custom_id='.$selected->virtuemart_custom_id);
					$valueOptions= $db->loadAssocList();

					$valueOptions = array_merge(array($emptyOption), $valueOptions);
					$this->searchCustomValues .= '<div class="vm-search-custom-values-group"><div class="vm-search-title">'. vmText::_($selected->custom_title).'</div> '.JHtml::_('select.genericlist', $valueOptions, 'customfields['.$selected->virtuemart_custom_id.']', 'class="inputbox vm-chzn-select"', 'virtuemart_custom_id', 'custom_title', 0) . '</div>';*/

				}
			}

			$this->combineTags = $app->getUserStateFromRequest('combineTags','combineTags', true,'int');
		}

		if(VmConfig::get('useCustomSearchTrigger',false)){
			// add search for declared plugins
			vDispatcher::importVMPlugins('vmcustom');
			$plgDisplay = vDispatcher::trigger('plgVmSelectSearchableCustom',array( &$this->options,&$this->searchCustomValuesAr,$this->custom_parent_id ) );
		}
		//vmTime('getSearchCustom after trigger','getSearchCustom');
		vmJsApi::chosenDropDowns();
	}

	public function handle404($cat = false){


		if ((int)VmConfig::get('handle_404',1)) {

			if (!headers_sent()) {
				header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
			}

			$redirect=false;
			if((int)VmConfig::get('redirect_404',false)){
				$jLangTag = vmText::$language->getTag();
				$db = JFactory::getDbo();
				$q = 'SELECT `id` FROM `#__menu` WHERE `home`="1" and (language="*" or language = "'.$jLangTag.'" ) ORDER BY `language` DESC';
				$db->setQuery($q);
				$this->Itemid = $db->loadResult();
				$this->app->redirect( JRoute::_('index.php?Itemid=' . $this->Itemid . '&error=404', FALSE) );
			} else {
				//Fallback
				$catLink = '';
				if ($cat and !empty($cat->category_parent_id) and $this->categoryId != $cat->category_parent_id) {
					$catLink = '&view=category&virtuemart_category_id=' .$cat->category_parent_id;
				} else {
					$last_category_id = shopFunctionsF::getLastVisitedCategoryId();
					if (!$last_category_id or $this->categoryId == $last_category_id) {
						$last_category_id = vRequest::getInt('virtuemart_category_id', false);
					}
					/*if ($last_category_id and $this->categoryId != $last_category_id) {
						$catLink = '&view=category&virtuemart_category_id=' . $last_category_id;
					}*/
				}
				$cat = VmModel::getModel('category')->getCategory($last_category_id, false, true);
				if(empty($cat->virtuemart_category_id) or !$cat->published){
					$last_category_id = 0;
				}
				vRequest::setVar('virtuemart_category_id', $last_category_id);
				vRequest::setVar('virtuemart_manufacturer_id', 0);

				if(!$cat or empty($cat->slug)){
					vmInfo(vmText::_('COM_VIRTUEMART_CAT_NOT_FOUND'));
				} else {
					if($cat->virtuemart_category_id>0 and !$cat->published){
						vmInfo('COM_VIRTUEMART_CAT_NOT_PUBL',$cat->category_name,$this->categoryId);
					}
				}
				//stAn - so that we can adjust the template as needed
				$this->is404 = true;
				$this->display();
			}
		} else {
			throw new RuntimeException('VirtueMart category not found.', 404);
		}

		$app = JFactory::getApplication();
		//stAn - without this, J5 might ovewrite 404 into 200 !!
		if (method_exists($app, 'setHeader')) {
			$app->setHeader('Status', "404 Not Found", 'true'); 
			//important for frontend proxy cache:
            $app->setHeader('Expires', 'Wed, 17 Aug 2005 00:00:00 GMT', true);
            $app->setHeader('Last-Modified', gmdate('D, d M Y H:i:s') . ' GMT', true);
            $app->setHeader('Cache-Control', 'no-store, no-cache, must-revalidate', false);
			$app->sendHeaders(); 
		}
		
		return;
	}
}


//no closing tag
