Spade

Mini Shell

Directory:~$ /home/lmsyaran/public_html/administrator/components/com_hikamarket/helpers/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ /home/lmsyaran/public_html/administrator/components/com_hikamarket/helpers/helper.php

<?php
/**
 * @package    HikaMarket for Joomla!
 * @version    3.1.1
 * @author     Obsidev S.A.R.L.
 * @copyright  (C) 2011-2020 OBSIDEV. All rights reserved.
 * @license    GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php
jimport('joomla.application.component.controller');
jimport('joomla.application.component.view');

$hikashopHelperFile =
rtrim(JPATH_ADMINISTRATOR,DS).DS.'components'.DS.'com_hikashop'.DS.'helpers'.DS.'helper.php';
if(!file_exists($hikashopHelperFile)) {
	throw new RuntimeException('HikaShop not installed ( www.hikashop.com
)', 500);
	exit;
}
if(!defined('HIKASHOP_COMPONENT'))
	include_once($hikashopHelperFile);

define('HIKAMARKET_COMPONENT','com_hikamarket');
define('HIKAMARKET_LIVE',rtrim(JURI::root(),'/').'/');
define('HIKAMARKET_ROOT',rtrim(JPATH_ROOT,DS).DS);
define('HIKAMARKET_FRONT',rtrim(JPATH_SITE,DS).DS.'components'.DS.HIKAMARKET_COMPONENT.DS);
define('HIKAMARKET_BACK',rtrim(JPATH_ADMINISTRATOR,DS).DS.'components'.DS.HIKAMARKET_COMPONENT.DS);
define('HIKAMARKET_HELPER',HIKAMARKET_BACK.'helpers'.DS);
define('HIKAMARKET_BUTTON',HIKAMARKET_BACK.'buttons');
define('HIKAMARKET_CLASS',HIKAMARKET_BACK.'classes'.DS);
define('HIKAMARKET_INC',HIKAMARKET_BACK.'inc'.DS);
define('HIKAMARKET_VIEW',HIKAMARKET_BACK.'views'.DS);
define('HIKAMARKET_TYPE',HIKAMARKET_BACK.'types'.DS);
define('HIKAMARKET_MEDIA',HIKAMARKET_ROOT.'media'.DS.HIKAMARKET_COMPONENT.DS);
define('HIKAMARKET_DBPREFIX','#__hikamarket_');

define('HIKAMARKET_NAME','HikaMarket');
define('HIKAMARKET_LNAME','hikamarket');
define('HIKAMARKET_TEMPLATE',HIKASHOP_FRONT.'templates'.DS);
define('HIKAMARKET_URL','https://www.hikashop.com/');
define('HIKAMARKET_UPDATEURL',HIKAMARKET_URL.'index.php?option=com_updateme&ctrl=update&task=');
define('HIKAMARKET_HELPURL',HIKAMARKET_URL.'index.php?option=com_updateme&ctrl=doc&component='.HIKAMARKET_LNAME.'&page=');
define('HIKAMARKET_REDIRECT',HIKAMARKET_URL.'index.php?option=com_updateme&ctrl=redirect&page=');

$app = JFactory::getApplication();
if($app->isAdmin()) {
	define('HIKAMARKET_CONTROLLER',HIKAMARKET_BACK.'controllers'.DS);
	define('HIKAMARKET_IMAGES','../media/'.HIKAMARKET_COMPONENT.'/images/');
	define('HIKAMARKET_CSS','../media/'.HIKAMARKET_COMPONENT.'/css/');
	define('HIKAMARKET_JS','../media/'.HIKAMARKET_COMPONENT.'/js/');
	define('HIKAMARKET_SWF','../media/'.HIKAMARKET_COMPONENT.'/swf/');
	$css_type = 'backend';
} else {
	define('HIKAMARKET_CONTROLLER',HIKAMARKET_FRONT.'controllers'.DS);
	define('HIKAMARKET_IMAGES',JURI::base(true).'/media/'.HIKAMARKET_COMPONENT.'/images/');
	define('HIKAMARKET_CSS',JURI::base(true).'/media/'.HIKAMARKET_COMPONENT.'/css/');
	define('HIKAMARKET_JS',JURI::base(true).'/media/'.HIKAMARKET_COMPONENT.'/js/');
	define('HIKAMARKET_SWF',JURI::base(true).'/media/'.HIKAMARKET_COMPONENT.'/swf/');
	$css_type = 'frontend';
}
$lang = JFactory::getLanguage();
$lang->load(HIKAMARKET_COMPONENT, JPATH_SITE);

class hikamarket {

	private static $configCache = array();

	public static function get($name) {
		$namespace = 'hikamarket';
		if(substr($name,0,5) == 'shop.') {
			$namespace = 'hikashop';
			$name = substr($name,5);
		}
		if(substr($name,0,7) == 'serial.') {
			$namespace = 'hikaserial';
			$name = substr($name,7);
		}
		list($group,$class) = explode('.',$name,2);
		if($group == 'controller') {
			if($namespace == 'hikamarket')
				$className = $class . 'Market' . ucfirst($group);
			else if($namespace == 'hikaserial')
				$className = $class . 'Serial' . ucfirst($group);
			else
				$className = $class . ucfirst($group);
		} elseif(strpos($class, '-') === false) {
			$className = $namespace . ucfirst($class) . ucfirst($group);
		} else {
			$blocks = explode('-', $class);
			$blocks = array_map('ucfirst', $blocks);
			$className = $namespace . implode('', $blocks) .
ucfirst($group);
		}
		if(class_exists($className.'Override'))
			$className .= 'Override';
		if(!class_exists($className)) {
			$class = str_replace('-', DS, $class);
			$const = constant(strtoupper($namespace . '_' . $group));
			$app = JFactory::getApplication();
			$path =
JPATH_THEMES.DS.$app->getTemplate().DS.'html'.DS.'com_'.$namespace.DS.'administrator'.DS;
			$constOverride = str_replace(HIKASHOP_BACK, $path, $const);

			jimport('joomla.filesystem.file');
			if(JFile::exists($constOverride . $class . '.override.php'))
{
				include_once($constOverride . $class . '.override.php');
				$className .= 'Override';
			} elseif(JFile::exists($const . $class . '.php')) {
				include_once $const . $class . '.php';
			} elseif($group == 'controller') {
				self::getPluginController($class);
			}
			if(!class_exists($className)) {
				return null;
			}
		}

		$args = func_get_args();
		array_shift($args);
		switch(count($args)) {
			case 4:
				return new $className($args[0], $args[1], $args[2], $args[3]);
			case 3:
				return new $className($args[0], $args[1], $args[2]);
			case 2:
				return new $className($args[0], $args[1]);
			case 1:
				return new $className($args[0]);
		}
		return new $className();
	}

	public static function &config($market = true, $reload = false) {
		if(self::$configCache === null)
			self::$configCache = array();
		if(!$market) {
			if(!isset(self::$configCache['shop']) ||
self::$configCache['shop'] === null)
				self::$configCache['shop'] =& hikashop_config();
			if(self::$configCache['shop'] === null || $reload ||
!is_object(self::$configCache['shop']) ||
self::$configCache['shop']->get('configClassInit',
0) == 0) {
				self::$configCache['shop'] =
self::get('shop.class.config');
				if( self::$configCache['shop'] === null )
die(HIKASHOP_NAME.' config not found');
				self::$configCache['shop']->load();
			}
			return self::$configCache['shop'];
		}
		if(!isset(self::$configCache['market']) ||
self::$configCache['market'] === null || $reload){
			self::$configCache['market'] =
self::get('class.config');
			if( self::$configCache['market'] === null )
die(HIKAMARKET_NAME.' config not found');
			self::$configCache['market']->load();
		}
		return self::$configCache['market'];
	}

	public static function level($level) {
		$config = self::config();
		return ($config->get($config->get('level'), 0) >=
$level);
	}

	public static function import($type, $name, $dispatcher = null) {
		$type = preg_replace('#[^A-Z0-9_\.-]#i', '', $type);
		$name = preg_replace('#[^A-Z0-9_\.-]#i', '', $name);
		$path = JPATH_PLUGINS.DS.$type.DS.$name.DS.$name.'.php';

		$instance = false;
		if(file_exists($path)) {
			require_once($path);
			$className = 'plg'.$type.$name;
			if(class_exists($className)) {
				if($dispatcher == null) {
					if(defined('HIKASHOP_J40') && HIKASHOP_J40)
						$dispatcher =
JFactory::getContainer()->get('dispatcher');
					else
						$dispatcher = JDispatcher::getInstance();
				}
				$instance = new $className($dispatcher, array('name' =>
$name, 'type' => $type));
			}
		}
		return $instance;
	}

	public static function completeLink($link, $popup = false, $redirect =
false, $js = false) {
		$namespace = HIKAMARKET_COMPONENT;
		if(substr($link,0,5)=='shop.'){
			$namespace = HIKASHOP_COMPONENT;
			$link=substr($link,5);
		}
		if($popup === 'ajax') $link .= '&tmpl=raw';
		else if($popup) $link .= '&tmpl=component';
		$ret =
JRoute::_('index.php?option='.$namespace.'&ctrl='.$link,
!$redirect);
		if(!$js)
			return $ret;

		if(strpos($link, '{') !== false && strpos($ret,
'{') === false)
			return JURI::root(true) .
'/index.php?option='.$namespace.'&ctrl='.$link;
		return str_replace('&amp;', '&', $ret);
	}

	public static function table($name, $component = true) {
		if( $component === true || $component === 'market' ) {
			if( substr($name, 0, 5) == 'shop.' ) {
				return HIKASHOP_DBPREFIX . substr($name, 5);
			}
			if( substr($name, 0, 7) == 'joomla.' ) {
				return '#__'.substr($name, 7);
			}
			return HIKAMARKET_DBPREFIX . $name;
		}
		if( $component === 'shop' ) {
			return HIKASHOP_DBPREFIX . $name;
		}
		return '#__'.$name;
	}

	public static function secureField($fieldName) {
		if (!is_string($fieldName) ||
preg_match('|[^a-z0-9#_.-]|i',$fieldName) !== 0 ){
			die('field "'.$fieldName .'" not
secured');
		}
		return $fieldName;
	}

	public static function limitString($string, $limit, $replacement =
'...', $tooltip = false) {
		if(empty($string) || !is_string($string))
			return '';
		$l = strlen($string);
		if($l <= $limit)
			return $string;

		$nbExtra = $l - $limit + strlen($replacement);
		$new_string = substr($string, 0, $l - ceil(($l + $nbExtra) / 2)) .
$replacement . substr($string, floor(($l + $nbExtra) / 2));
		if($tooltip)
			return hikamarket::tooltip($string, '', '',
$new_string, '', 0);
		return $new_string;
	}

	public static function getLayout($controller, $layout, $params, &$js)
{
		$app = JFactory::getApplication();
		$component = HIKAMARKET_COMPONENT;
		$base_path = HIKAMARKET_FRONT;
		if($app->isAdmin()) {
			$base_path = HIKAMARKET_BACK;
		}
		if( substr($controller, 0, 5) == 'shop.' ) {
			$controller = substr($controller, 5);
			$component = HIKASHOP_COMPONENT;
			$base_path = HIKASHOP_FRONT;
			if($app->isAdmin()) {
				$base_path = HIKASHOP_BACK;
			}
		}
		$base_path = rtrim($base_path, DS);
		$document = JFactory::getDocument();

		$ctrl = new HikaShopBridgeController(array(
			'name' => $controller,
			'base_path' => $base_path
		));
		$viewType = $document->getType();

		$view = $ctrl->getView('', $viewType, '',
array('base_path' => $base_path));
		$folder	=
$base_path.DS.'views'.DS.$view->getName().DS.'tmpl';
		$view->addTemplatePath($folder);
		$folder	=
JPATH_BASE.DS.'templates'.DS.$app->getTemplate().DS.'html'.DS.$component.DS.$view->getName();
		$view->addTemplatePath($folder);
		$old = $view->setLayout($layout);
		ob_start();
		$view->display(null, $params);
		$js = @$view->js;
		if(!empty($old))
			$view->setLayout($old);
		return ob_get_clean();
	}

	public static function getPluginController($ctrl) {
		if(empty($ctrl))
			return false;

		$app = JFactory::getApplication();
		JPluginHelper::importPlugin('hikamarket');
		JPluginHelper::importPlugin('hikashop');
		$controllers =
$app->triggerEvent('onHikamarketPluginController',
array($ctrl));

		if(empty($controllers))
			return false;
		foreach($controllers as $k => &$c) {
			if(!is_array($c) && is_string($c))
				$c = array('name' => $c);
			if(empty($c['name'])) {
				unset($controllers[$k]);
				continue;
			}
			if(empty($c['type']))
				$c['type'] = 'hikamarket';
		}
		unset($c);

		if(count($controllers) > 1)
			return false;

		$controller = reset($controllers);

		if(empty($controller['prefix']))
			$controller['prefix'] = 'ctrl';

		$type = preg_replace('#[^A-Z0-9_\.-]#i', '',
$controller['type']);
		$name = preg_replace('#[^_A-Z0-9_\.-]#i', '',
$controller['name']);
		$prefix = preg_replace('#[^_A-Z0-9]#i', '',
$controller['prefix']);
		$path = JPATH_PLUGINS.DS.$type.DS.$name.DS;

		jimport('joomla.filesystem.folder');
		jimport('joomla.filesystem.file');

		if(!empty($controller['component']) &&
preg_match('#^com_[_a-zA-Z0-9]+$#',
$controller['component'])) {
			$path =
rtrim(JPATH_SITE,DS).DS.'components'.DS.$controller['component'].DS;
			$file = isset($controller['file']) ?
preg_replace('#[^A-Z0-9_\.-]#i', '',
$controller['file']) : $name;
			if(JFile::exists($path.'controllers'.DS.$file.'.php')
&&
JFolder::exists($path.'views'.DS.$name.'market'.DS)) {
				include_once($path.'controllers'.DS.$file.'.php');
				return true;
			}
		}

		if(!JFile::exists($path.$name.'_'.$prefix.'.php') ||
!JFolder::exists($path.'views'.DS))
			return false;

		include_once($path.$name.'_'.$prefix.'.php');
		return true;
	}

	public static function getCID($field = '', $int = true) {
		$res = hikaInput::get()->get('cid', array(),
'array');
		if(!empty($res))
			$res = reset($res);
		if(empty($res) && !empty($field))
			$res = hikaInput::get()->getCmd($field, 0);
		if($int)
			return intval($res);
		return $res;
	}

	public static function getMenu($title = '', $tpl = null) {
		$document = JFactory::getDocument();
		$app = JFactory::getApplication();
		$base_path = rtrim(HIKASHOP_BACK, DS);
		$controller = new HikaShopBridgeController(
			array(
				'base_path' => $base_path,
				'name' => 'menu'
			)
		);
		$viewType = $document->getType();
		$view = $controller->getView('', $viewType, '',
array('base_path' => $base_path));
		$folder	=
JPATH_BASE.DS.'templates'.DS.$app->getTemplate().DS.'html'.DS.HIKASHOP_COMPONENT.DS.$view->getName();
		$view->addTemplatePath($folder);
		$view->setLayout('default');
		ob_start();
		$view->display($tpl, $title);
		return ob_get_clean();
	}

	public static function setTitle($name, $picture, $link) {
		$shopConfig = hikamarket::config(false);
		$menu_style = $shopConfig->get('menu_style',
'title_bottom');
		if(HIKASHOP_J30) $menu_style = 'content_top';
		$html = '<a class="hikamarket_title_link
hikamarket_title_j'.(int)HIKASHOP_JVERSION.'"
href="'.hikamarket::completeLink($link).'">'.$name.'</a>';
		if($menu_style != 'content_top') {
			$html = hikamarket::getMenu($html);
		}
		JToolBarHelper::title('<i class="fas
fa-'.$picture.' hika-title-icons"></i>'.$html,
' hika-hide');

		$doc = JFactory::getDocument();
		$app = JFactory::getApplication();
		$doc->setTitle($app->getCfg('sitename'). ' - '
.JText::_('JADMINISTRATION').' - '.$name);
	}

	public static function footer() {
		$app = JFactory::getApplication();
		$config = self::config();
		$shopConfig = self::config(false);

		if(!$app->isAdmin() &&
$shopConfig->get('show_footer',true)=='-1') return
'';

		$description =
$config->get('description_'.strtolower($config->get('level')),'Joomla!<sup>&reg;</sup>
Ecommerce System');
		$link = HIKAMARKET_URL;
		$aff = $shopConfig->get('partner_id');
		if(!empty($aff)){
			$link.='?partner_id='.$aff;
		}
		$text = '<!-- HikaMarket Component powered by '.$link.'
-->'."\r\n".'<!-- version
'.$config->get('level').' :
'.$config->get('version').' -->';
		if(hikaInput::get()->getInt('marketbuild',0)) $text .=
'<!-- 2007200006 -->';
		if(!$shopConfig->get('show_footer',true))
			return $text;

		$text .= '<div class="hikamarket_footer"
style="text-align:center" align="center"><a
href="'.$link.'" target="_blank"
title="'.HIKAMARKET_NAME.' :
'.strip_tags($description).'">'.HIKAMARKET_NAME;
		if($app->isAdmin()) {
			$text .= ' '.$config->get('level').'
'.$config->get('version');
		}
		$text .= ',
'.$description.'</a></div>'."\r\n";
		return $text;
	}

	public static function initModule() {
		static $done = false;
		$fe = hikaInput::get()->getInt('hikamarket_front_end_main',
0);
		if($done || !empty($fe))
			return true;

		$done = true;
		$lang = JFactory::getLanguage();
		$override_path =
hikashop_getLanguagePath(JPATH_ROOT).'/overrides/'.$lang->getTag().'.override.ini';
		$lang->load(HIKASHOP_COMPONENT, JPATH_SITE);
		if(file_exists($override_path))
			hikashop_loadTranslationFile($override_path);
		return true;
	}

	public static function tooltip($desc, $title = '', $image =
'tooltip.png', $name = '', $href = '', $link
= 1) {
		self::loadJslib('tooltip');
		$desc = htmlspecialchars($desc, ENT_COMPAT, 'UTF-8');
		$title = htmlspecialchars($title, ENT_COMPAT, 'UTF-8');
		if(!$name) $name = JHTML::_('image', $image,
'Tooltip', null, true);
		if($href) $name = '<a href="' . $href .
'">' . $name . '</a>';
		if($title) $desc =
'&lt;strong&gt;'.$title.'&lt;/strong&gt;&lt;br/&gt;'
. $desc;
		return '<span data-toggle="hk-tooltip"
data-title="' . $desc . '">' . $name .
'</span>';
	}

	public static function cancelBtn($url = '') {
		$cancel_url =
hikaInput::get()->getString('cancel_redirect');
		if(!empty($cancel_url) || !empty($url)) {
			$toolbar = JToolBar::getInstance('toolbar');
			if(!empty($cancel_url))
				$toolbar->appendButton('Link', 'cancel',
JText::_('HIKA_CANCEL'), base64_decode($cancel_url) );
			else
				$toolbar->appendButton('Link', 'cancel',
JText::_('HIKA_CANCEL'), $url );
		} else {
			JToolBarHelper::cancel();
		}
	}

	public static function loadVendor($full = false, $reset = false) {
		static $vendor = null;
		$app = JFactory::getApplication();

		if($reset) {
			$app->setUserState(HIKAMARKET_COMPONENT.'.vendor_id',
null);
			$vendor = null;
			return true;
		}

		if(!isset($vendor)) {
			$user_id = self::loadUser(false, false);
			$vendor_id =
(int)$app->getUserState(HIKAMARKET_COMPONENT.'.vendor_id');

			if(empty($user_id)) {
				if($vendor_id != 0)
					$app->setUserState(HIKAMARKET_COMPONENT.'.vendor_id',
null);
				return null;
			}

			if($vendor_id == -1) {
				$vendor = false;
				return null;
			}

			$vendorClass = self::get('class.vendor');
			if(empty($vendor_id)) {
				$vendor = $vendorClass->get($user_id, 'user');
			} else {
				$vendor = $vendorClass->get($vendor_id);
			}

			if($vendor === null) {
				$user = JFactory::getUser();
				$administrator = $user->authorise('core.admin');

				if($administrator) {
					$vendor = $vendorClass->get(1);
				}
			}

			if($vendor === null) {
				$config = hikamarket::config();
				$auto_registration =
(int)$config->get('allow_registration', 0);
				if($auto_registration === 3) {
					$shopuser = self::loadUser(true);
					if(!empty($shopuser)) {
						$vendor_creation = $vendorClass->onAfterUserCreate($shopuser,
true);
						if(!empty($vendor_creation))
							$vendor = $vendorClass->get($vendor_creation->vendor_id);
					}
				}
			}
		}

		if($vendor === null || $vendor === false) {
			$vendor = false;
			$app->setUserState(HIKAMARKET_COMPONENT.'.vendor_id', -1);
			return null;
		}

		$app->setUserState(HIKAMARKET_COMPONENT.'.vendor_id',
$vendor->vendor_id);

		if($full)
			return $vendor;
		return $vendor->vendor_id;
	}

	public static function loginVendor() {
		$vendor = self::loadVendor(true, false);
		$app = JFactory::getApplication();

		if($vendor === null) {
			$user = JFactory::getUser();
			if($user->guest) {
				$app->enqueueMessage(JText::_('PLEASE_LOGIN_FIRST'));
				global $Itemid;
				$url = '';
				if(!empty($Itemid)) { $url = '&Itemid=' . $Itemid; }
				$url = 'index.php?option=com_users&view=login' . $url;
				$app->redirect(JRoute::_($url .
'&return='.urlencode(base64_encode(hikamarket::currentUrl())),
false));
				return false;
			} else {
				$app->enqueueMessage(JText::_('PLEASE_LOGIN_AS_VENDOR'));
				$app->redirect('index.php');
				return false;
			}
		} else if($vendor->vendor_id > 1 &&
$vendor->vendor_published == 0) {
			$app->enqueueMessage(JText::_('VENDOR_EXPIRED'));
			$app->redirect('index.php');
			return false;
		}
		return true;
	}

	public static function isVendorProduct($product_id, $vendor_id = -1) {
		static $vendorProductCache = array();

		if($vendor_id === null || $vendor_id == -1) {
			$vendor_id = self::loadVendor(false, false);
			if($vendor_id == null)
				return false;
		}

		if(!empty($vendor_id) && (int)$vendor_id == 0)
			return false;
		if(!empty($product_id) && (int)$product_id <= 0)
			return false;

		if($vendor_id == 1)
			return true;

		if((int)$vendor_id > 1 && (int)$product_id > 0) {
			if(empty($vendorProductCache[$vendor_id]))
				$vendorProductCache[$vendor_id] = array();

			if(isset($vendorProductCache[$vendor_id][$product_id]))
				return $vendorProductCache[$vendor_id][$product_id];

			$db = JFactory::getDBO();
			$query = 'SELECT count(pr.product_id) '.
					' FROM ' . hikamarket::table('shop.product') .
' AS pr '.
					' LEFT JOIN ' . hikamarket::table('shop.product')
. ' AS pa ON (pr.product_type = ' .
$db->Quote('variant') . ' AND pa.product_id =
pr.product_parent_id) '.
					' WHERE pr.product_id = '. (int)$product_id . ' AND
(pr.product_vendor_id = ' . (int)$vendor_id . ' OR
(pr.product_vendor_id = 0 AND pa.product_vendor_id = ' .
(int)$vendor_id . '))';
			$db->setQuery($query);
			$vendorProductCache[$vendor_id][$product_id] =
((int)$db->loadResult() == 1);

			return $vendorProductCache[$vendor_id][$product_id];
		}
		return true;
	}

	public static function isVendorCategory($category_id, $vendor_id = -1,
$check_extra_categories = false) {
		static $vendorCategoryCache = array();

		if($vendor_id === null || $vendor_id == -1) {
			$vendor_id = self::loadVendor(false, false);
			if($vendor_id == null)
				return false;
		} else
			$vendor_id = (int)$vendor_id;

		if(!empty($vendor_id) && (int)$vendor_id == 0)
			return false;
		if(!empty($category_id) && (int)$category_id <= 0)
			return false;

		if($vendor_id == 1)
			return true;

		$config = hikamarket::config();
		$vendor_chroot_category =
(int)$config->get('vendor_chroot_category', 0);
		$chroot_category = (int)$config->get('vendor_root_category',
0);

		if($vendor_id > 1 && $category_id == 0)
			return ( ($vendor_chroot_category == 0) || ($vendor_chroot_category == 2
&& ($chroot_category == 0 || $chroot_category == 1)) );

		if($vendor_id > 1 && $category_id > 0) {
			if($vendor_chroot_category == 0)
				return true;

			$db = JFactory::getDBO();

			if(!in_array($vendor_chroot_category, array(1,2)))
				return false;

			if(empty($vendorCategoryCache[$vendor_id]))
				$vendorCategoryCache[$vendor_id] = array();

			$keyCategory = (int)$category_id;
			if($check_extra_categories)
				$keyCategory .= 'ex';

			if(isset($vendorCategoryCache[$vendor_id][$keyCategory]))
				return $vendorCategoryCache[$vendor_id][$keyCategory];

			$extra_categories = array();
			if($check_extra_categories) {
				$vendorClass = self::get('class.vendor');
				$vendor = self::loadVendor(true, false);
				$extra_categories = $vendorClass->getExtraCategories($vendor);
				if(!empty($extra_categories)) {
					if($vendor_chroot_category == 2)
						$extra_categories = array_merge(array((int)$chroot_category),
$extra_categories);
					hikamarket::toInteger($extra_categories);
				}
			}

			$query = 'SELECT cat.category_id '.
					' FROM '.hikamarket::table('shop.category').'
AS cat '.
					' INNER JOIN
'.hikamarket::table('shop.category').' AS rootcat ON
(cat.category_left >= rootcat.category_left AND cat.category_right <=
rootcat.category_right) '.
					' WHERE cat.category_id = ' . (int)$category_id;

			if($vendor_chroot_category == 1) {
				if(empty($extra_categories))
					$query .= ' AND rootcat.category_namekey = '.
$db->Quote('vendor_'.$vendor_id);
				else
					$query .= ' AND (rootcat.category_namekey = '.
$db->Quote('vendor_'.$vendor_id) . ' OR
rootcat.category_id IN ('.implode(',',
$extra_categories).'))';
			} else if($vendor_chroot_category == 2) {
				if(empty($extra_categories))
					$query .= ' AND rootcat.category_id = ' .
(int)$chroot_category;
				else
					$query .= ' AND rootcat.category_id IN (' .
implode(',', $extra_categories) . ')';
			}

			$db->setQuery($query);
			$ret = $db->loadResult();

			$vendorCategoryCache[$vendor_id][$keyCategory] = !empty($ret);
			return $vendorCategoryCache[$vendor_id][$keyCategory];
		}
		return true;
	}

	public static function isVendorOrder($order_id, $vendor_id = -1) {
		static $vendorOrderCache = array();

		if($vendor_id === null || $vendor_id == -1) {
			$vendor_id = self::loadVendor(false, false);
			if($vendor_id == null)
				return false;
		} else
			$vendor_id = (int)$vendor_id;

		if(!empty($vendor_id) && (int)$vendor_id == 0)
			return false;
		if(!empty($order_id) && (int)$order_id <= 0)
			return false;

		if($vendor_id == 1)
			return true;

		if($vendor_id > 1 && $order_id > 0) {
			if(empty($vendorOrderCache[$vendor_id]))
				$vendorOrderCache[$vendor_id] = array();

			if(isset($vendorOrderCache[$vendor_id][$order_id]))
				return $vendorOrderCache[$vendor_id][$order_id];

			$db = JFactory::getDBO();
			$query = 'SELECT count(hko.order_id) FROM ' .
hikamarket::table('shop.order') . ' AS hko '.
				' WHERE hko.order_type IN
(\'sale\',\'subsale\') AND hko.order_id = '.
(int)$order_id . ' AND hko.order_vendor_id = ' .
(int)$vendor_id;
			$db->setQuery($query);
			$vendorOrderCache[$vendor_id][$order_id] = ((int)$db->loadResult() ==
1);

			return $vendorOrderCache[$vendor_id][$order_id];
		}
		return true;
	}

	public static function isEditableOrder($order_id) {
		static $editableOrderCache = array();

		if((int)$order_id <= 0)
			return false;

		if(isset($editableOrderCache[$order_id]))
			return $editableOrderCache[$order_id];

		$db = JFactory::getDBO();
		$query = 'SELECT o.order_type, COUNT(DISTINCT op.order_vendor_id) as
vendor_count '.
			' FROM ' . hikamarket::table('shop.order') . '
AS o '.
			' LEFT JOIN ' . hikamarket::table('shop.order') .
' AS op ON (o.order_parent_id > 0 AND o.order_parent_id =
op.order_parent_id AND op.order_type = ' .
$db->Quote('subsale') . ') ' .
			' WHERE (o.order_id = ' . (int)$order_id . ')';
		$db->setQuery($query);
		$ret = $db->loadObject();

		$editableOrderCache[$order_id] = ((int)$ret->vendor_count == 1 ||
$ret->order_type == 'sale');

		return $editableOrderCache[$order_id];
	}

	public static function isVendorDiscount($discount_id, $vendor_id = -1) {
		static $vendorDiscountCache = array();

		if($vendor_id === null || $vendor_id == -1) {
			$vendor_id = self::loadVendor(false, false);
			if($vendor_id == null)
				return false;
		} else
			$vendor_id = (int)$vendor_id;

		if(!empty($vendor_id) && (int)$vendor_id == 0)
			return false;
		if(!empty($discount_id) && (int)$discount_id <= 0)
			return false;

		if($vendor_id == 1)
			return true;

		if($vendor_id > 1 && $discount_id > 0) {
			if(empty($vendorDiscountCache[$vendor_id]))
				$vendorDiscountCache[$vendor_id] = array();

			if(isset($vendorDiscountCache[$vendor_id][$discount_id]))
				return $vendorDiscountCache[$vendor_id][$discount_id];

			$db = JFactory::getDBO();
			$query = 'SELECT count(a.discount_id) FROM ' .
hikamarket::table('shop.discount') . ' AS a WHERE
a.discount_id = '. (int)$discount_id . ' AND
a.discount_target_vendor = ' . (int)$vendor_id;
			$db->setQuery($query);
			$vendorDiscountCache[$vendor_id][$discount_id] =
((int)$db->loadResult() == 1);

			return $vendorDiscountCache[$vendor_id][$discount_id];
		}
		return true;
	}

	public static function isVendorCharacteristic($characteristic_id,
$characteristic_parent = 0, $vendor_id = -1) {
		static $vendorCharacteristicCache = array();

		if($vendor_id === null || $vendor_id == -1) {
			$vendor_id = self::loadVendor(false, false);
			if($vendor_id == null)
				return false;
		} else
			$vendor_id = (int)$vendor_id;

		if(!empty($vendor_id) && (int)$vendor_id == 0)
			return false;
		if(!empty($characteristic_id) && (int)$characteristic_id <=
0)
			return false;

		if(empty($vendorCharacteristicCache[$vendor_id]))
			$vendorCharacteristicCache[$vendor_id] = array();

		if(isset($vendorCharacteristicCache[$vendor_id][$characteristic_id]))
			return $vendorCharacteristicCache[$vendor_id][$characteristic_id];

		$characteristic_parent = (int)$characteristic_parent;
		if((int)$characteristic_parent > 0) {
			$r = self::isVendorCharacteristic($characteristic_parent, 0,
$vendor_id);
			if(!$r)
				$r = self::isVendorCharacteristic($characteristic_parent, 0, 1);
			if(!$r) {
				$vendorCharacteristicCache[$vendor_id][$characteristic_id] = false;
				return false;
			}
		}

		$vendor_ids = array((int)$vendor_id);
		if($vendor_id == 1)
			$vendor_ids[] = 0;

		$db = JFactory::getDBO();
		$query = 'SELECT count(c.characteristic_id) FROM ' .
hikamarket::table('shop.characteristic') . ' AS c '.
			' WHERE c.characteristic_id = '. (int)$characteristic_id .
' AND c.characteristic_parent_id = ' .
(int)$characteristic_parent .
			' AND c.characteristic_vendor_id IN (' .
implode(',', $vendor_ids) . ')';
		$db->setQuery($query);
		$vendorCharacteristicCache[$vendor_id][$characteristic_id] =
((int)$db->loadResult() == 1);

		return $vendorCharacteristicCache[$vendor_id][$characteristic_id];
	}

	public static function isVendorPlugin($plugin_id, $plugin_type =
'', $vendor_id = -1) {
		static $vendorPluginCache = array();

		if(empty($plugin_type))
			return false;

		if($vendor_id === null || $vendor_id == -1) {
			$vendor_id = self::loadVendor(false, false);
			if($vendor_id == null)
				return false;
		} else
			$vendor_id = (int)$vendor_id;

		if(!empty($vendor_id) && (int)$vendor_id == 0)
			return false;
		if(!empty($plugin_id) && (int)$plugin_id <= 0)
			return false;

		if($vendor_id == 1)
			return true;

		$plugin_id = (int)$plugin_id;
		$config = self::config();
		$plugin_vendor_config =
(int)$config->get('plugin_vendor_config', 0);
		if($plugin_vendor_config == 0)
			return false;

		if(empty($vendorPluginCache[$vendor_id]))
			$vendorPluginCache[$vendor_id] = array();
		if(empty($vendorPluginCache[$vendor_id][$plugin_type]))
			$vendorPluginCache[$vendor_id][$plugin_type] = array();

		$types = array(
			'plugin' => array(
				'id' => 'plugin_id',
				'table' => 'shop.plugin',
				'key' => 'plugin_vendor_id'
			),
			'payment' => array(
				'id' => 'payment_id',
				'table' => 'shop.payment',
				'key' => 'payment_vendor_id'
			),
			'shipping' => array(
				'id' => 'shipping_id',
				'table' => 'shop.shipping',
				'key' => 'shipping_vendor_id'
			)
		);

		if(empty($types[$plugin_type]))
			return false;

		$p = $types[$plugin_type];

		if(isset($vendorPluginCache[$vendor_id][$plugin_type][$plugin_id]))
			return $vendorPluginCache[$vendor_id][$plugin_type][$plugin_id];

		if($plugin_vendor_config == 1) {
			$db = JFactory::getDBO();
			$query = 'SELECT count(p.'.$p['id'].') FROM
' . hikamarket::table($p['table']) . ' AS p '.
				' WHERE p.'.$p['id'].' = ' .
(int)$plugin_id . ' AND p.'.$p['key'].' = ' .
(int)$vendor_id;
			$db->setQuery($query);
			$vendorPluginCache[$vendor_id][$plugin_type][$plugin_id] =
((int)$db->loadResult() == 1);

			return $vendorPluginCache[$vendor_id][$plugin_type][$plugin_id];
		}

		return false;
	}

	public static function isVendorCustomer($customer_id, $vendor_id = -1) {
		static $vendorCustomerCache = array();

		if($vendor_id === null || $vendor_id == -1) {
			$vendor_id = self::loadVendor(false, false);
			if($vendor_id == null)
				return false;
		} else
			$vendor_id = (int)$vendor_id;

		if(!empty($vendor_id) && (int)$vendor_id == 0)
			return false;
		if(!empty($customer_id) && (int)$customer_id <= 0)
			return false;

		if($vendor_id == 1)
			return true;

		if($vendor_id > 1 && $customer_id > 0) {
			if(empty($vendorCustomerCache[$vendor_id]))
				$vendorCustomerCache[$vendor_id] = array();

			if(isset($vendorCustomerCache[$vendor_id][$customer_id]))
				return $vendorCustomerCache[$vendor_id][$customer_id];

			$db = JFactory::getDBO();
			$query = 'SELECT count(cv.customer_id) FROM ' .
hikamarket::table('customer_vendor') . ' AS cv WHERE
cv.customer_id = '. (int)$customer_id . ' AND cv.vendor_id =
' . (int)$vendor_id;
			$db->setQuery($query);
			$vendorCustomerCache[$vendor_id][$customer_id] =
((int)$db->loadResult() == 1);

			return $vendorCustomerCache[$vendor_id][$customer_id];
		}
		return true;
	}

	public static function getCartVendors() {
		static $currentCart = null;

		if($currentCart == null) {
			$cartClass = hikamarket::get('shop.class.cart');
			$currentCart = $cartClass->loadFullCart(true);
		}

		if(empty($currentCart->products))
			return null;

		$vendors = array();
		foreach($currentCart->products as $product) {
			$p = (int)@$product->product_vendor_id;
			if($p == 1)
				$p = 0;

			$vendors[$p] = $p;
		}

		if(count($vendors) == 1)
			return reset($vendors);
		return $vendors;
	}

	public static function acl($action) {
		$action = strtolower($action);

		$user_access = self::getAclUser(null);
		if($user_access === false)
			return false;

		$vendor_access = self::getAclVendor(null);
		if($vendor_access === false)
			return false;

		if(strpos($action, '/') === false)
			$action = str_replace('_', '/', $action);

		$ret = false;
		if(!empty($user_access)) {
			$ret = self::aclTest($action, $user_access);
			if($ret === false)
				return false;
		}

		$vendor_ret = self::aclTest($action, $vendor_access);

		if($vendor_ret === false)
			return false;
		if($ret === 1 && $vendor_ret !== -1)
			return true;
		if($ret === -1 && $vendor_ret !== -1)
			return true;
		if($vendor_ret)
			return true;
		return false;
	}

	public static function aclOr($actions) {
		if(!is_array($actions) || empty($actions) || self::getAclUser(null) ===
false || self::getAclVendor(null) === false)
			return false;
		foreach($actions as $action) {
			$r = self::acl($action);
			if($r === true)
				return true;
		}
		return false;
	}

	public static function aclAnd($actions) {
		if(!is_array($actions) || empty($actions) || self::getAclUser(null) ===
false || self::getAclVendor(null) === false)
			return false;
		foreach($actions as $action) {
			$r = self::acl($action);
			if($r === false)
				return false;
		}
		return true;
	}

	public static function getAclUser($user = null) {
		if($user === null)
			$user = self::loadUser(true, false);

		if(!empty($user) && is_int($user) && (int)$user > 0)
{
			$userClass = self::get('shop.class.user');
			$user = $userClass->get( (int)$user );
			if(empty($user))
				$user = null;
		}

		if($user === null)
			return false;

		static $user_accesses = array();
		$user_access = array();

		if(isset($user_accesses[(int)$user->user_id]))
			$user_access = $user_accesses[(int)$user->user_id];

		if(!empty($user_access))
			return $user_access;

		if(!empty($user->user_vendor_access)) {
			if($user->user_vendor_access == 'all')
				$user->user_vendor_access = '*';
			if(!empty($user->user_vendor_access) &&
strpos($user->user_vendor_access, '/') === false) // Compat
				$user->user_vendor_access = str_replace('_',
'/', $user->user_vendor_access);
			$user_access = explode(',',
trim(strtolower($user->user_vendor_access), ','));
			sort($user_access, SORT_STRING);
		}
		$user_accesses[(int)$user->user_id] = $user_access;
		return $user_access;
	}

	public static function getAclVendor($vendor = null) {
		if($vendor === null)
			$vendor = self::loadVendor(true, false);

		if(!empty($vendor) && is_int($vendor) && (int)$vendor
> 0) {
			$vendorClass = self::get('class.vendor');
			$vendor = $vendorClass->get( (int)$vendor );
			if(empty($vendor))
				$vendor = null;
		}

		if($vendor === null)
			return false;

		static $vendor_accesses = array();
		$vendor_access = array();

		if(isset($vendor_accesses[(int)$vendor->vendor_id]))
			$vendor_access = $vendor_accesses[(int)$vendor->vendor_id];

		if(!empty($vendor_access))
			return $vendor_access;

		if(!empty($vendor->vendor_access)) {
			if($vendor->vendor_access == 'all')
				$vendor->vendor_access = '*';

			if(is_string($vendor->vendor_access)) {
				if(!empty($vendor->vendor_access) &&
strpos($vendor->vendor_access, '/') === false) // ACL Compat
					$vendor->vendor_access = str_replace('_', '/',
$vendor->vendor_access);
				$vendor_access = explode(',',
trim(strtolower($vendor->vendor_access), ','));
			} else {
				$vendor->vendor_access = implode(',',
$vendor->vendor_access);
				if(!empty($vendor->vendor_access) &&
strpos($vendor->vendor_access, '/') === false) // ACL Compat
					$vendor->vendor_access = str_replace('_', '/',
$vendor->vendor_access);
				$vendor_access = explode(',',
trim(strtolower($vendor->vendor_access), ','));
			}
			sort($vendor_access, SORT_STRING);

			if(reset($vendor_access) == '@0')
				$vendor_access[] = array_shift($vendor_access);

			if(strpos($vendor->vendor_access, '@') !== false) {
				$config = self::config();
				$joomla_acl = self::get('type.joomla_acl');
				$gs = $joomla_acl->getList();
				$groups = array();
				foreach($gs as $g) {
					$groups[$g->id] = $g;
				}
				unset($gs);

				$vendor_extra_access = array();
				foreach($vendor_access as $k => $ax) {
					if(substr($ax,0,1) != '@')
						continue;

					unset($vendor_access[$k]);
					$ax_id = (int)substr($ax,1);
					if($ax_id == 0) {
						$default_access = $config->get('store_default_access',
'all');
						if($default_access == 'all') $default_access =
'*';
						if(!empty($default_access) && strpos($default_access,
'/') === false) // ACL Compat
							$default_access = str_replace('_', '/',
$default_access);
						$accesses = explode(',', trim(strtolower($default_access),
','));
						sort($accesses, SORT_STRING);
						$vendor_extra_access = array_merge($vendor_extra_access, $accesses);
					} else {
						$group = (isset($groups[$ax_id])) ? $group = $groups[$ax_id] : null;
						while(!empty($group)) {
							$default_access =
$config->get('vendor_acl_'.$group->id, '');
							if(!empty($default_access) && strpos($default_access,
'/') === false) // ACL Compat
								$default_access = str_replace('_', '/',
$default_access);
							$accesses = explode(',', trim(strtolower($default_access),
','));
							sort($accesses, SORT_STRING);
							array_push($vendor_extra_access, '-');
							$vendor_extra_access = array_merge($vendor_extra_access,
$accesses);
							$group = (isset($groups[$group->parent_id])) ? $group =
$groups[$group->parent_id] : null;
						}
					}
				}
				$vendor_access = array_merge($vendor_access, $vendor_extra_access);
			}
		} else {
			$config = self::config();
			$default_access = $config->get('store_default_access',
'all');
			if($default_access == 'all')
				$default_access = '*';
			if(!empty($default_access) && strpos($default_access,
'/') === false) // ACL Compat
				$default_access = str_replace('_', '/',
$default_access);
			$vendor_access = explode(',',
trim(strtolower($default_access), ','));
			sort($vendor_access, SORT_STRING);
		}

		$vendor_accesses[(int)$vendor->vendor_id] = $vendor_access;
		return $vendor_access;
	}

	public static function aclTest($action, $access) {
		$ret = false;
		$actlen = strlen($action);
		if(is_string($access)) {
			$access = explode(',', trim(strtolower($access),
','));
			sort($access, SORT_STRING);
		}
		if(empty($access))
			$access = array();

		$me = 0;
		$parentInc = false; $parentBan = false;
		$childInc = false; $childBan = false;
		foreach($access as $a) {
			if($a == '-' && ($me != 0 || $parentBan ||
$parentInc))
				break;

			if($a == '*') { $ret = true; continue; }
			if($a == '!') { $ret = false; continue; }
			if($a == $action) { $me = 1; continue; }
			if($a == ('!'.$action)) { $me = -1; continue; }

			$l = strlen($a);
			if((!$childInc || $childInc > $actlen) &&
substr_compare($action, $a, 0, $actlen) == 0) { $childInc = $actlen;
continue; }
			if((!$childBan || $childBan > $actlen) &&
substr_compare('!'.$action, $a, 0, $actlen + 1) == 0) { $childBan
= $actlen; continue; }
			if($l > 0) {
				if((!$parentInc || $parentInc < $l) && substr_compare($a,
$action, 0, $l) == 0) { $parentInc = $l; continue; }
				if((!$parentBan || $parentBan < $l) && substr_compare($a,
'!'.$action, 0, $l) == 0) { $parentBan = $l - 1; continue; }
			}
		}

		if($me == 1) {
			$ret = true;
		} else if($me == -1) {
			$ret = false;
		} else if($parentBan || $parentInc) {
			if($parentBan && $parentInc) {
				$ret = ($parentInc > $parentBan);
			} else if($parentBan)
				$ret = false;
			else
				$ret = true;
		}
		if($ret && $childBan) { $ret = 1; }
		if(!$ret && $childInc) { $ret = -1; }

		return $ret;
	}

	public static function addACLFilters(&$filters, $field, $table =
'', $type = 'user', $allowNull = false, $target_id = 0)
{
		if($type == 'user')
			return hikashop_addACLFilters($filters, $field, $table, 2, $allowNull,
$target_id);

		if(empty($target_id) || (int)$target_id == 0) {
			$vendor = self::loadVendor(true);
		} else {
			$vendorClass = self::get('class.vendor');
			$vendor = $vendorClass->get($target_id);
		}
		if(empty($vendor) || empty($vendor->vendor_access))
			return;

		if(!empty($table))
			$table.='.';

		$acl_filters = array($table . $field . " = 'all'");
		$vendor_access = explode(',', $vendor->vendor_access);
		foreach($vendor_access as $access) {
			if(substr($access, 0, 1) == '@') {
				$acl_filters[] = $table . $field . " LIKE '%," .
(int)substr($access, 1) . ",%'";
			}
		}
		unset($vendor_access);
		if($allowNull)
			$acl_filters[] = 'ISNULL(' . $table . $field . ')';

		$filters[] = '(' . implode(' OR ', $acl_filters) .
')';
	}

	public static function deny($redirect = '', $msg = '',
$type = '', $tmpl = '') {
		if(empty($msg))
			$msg = JText::_('HIKAM_PAGE_DENY');
		if(empty($type))
			$type = 'error';

		if(empty($tmpl))
			$tmpl = hikaInput::get()->getString('tmpl', '');

		if($tmpl == 'json') {
			ob_end_clean();
			echo '{err:"' . str_replace(array('\\',
'"'), array('\\\\', '\\"'), $msg) .
'"}';
			exit;
		}

		$app = JFactory::getApplication();
		$app->enqueueMessage($msg, $type);
		if(empty($redirect)) {
			if($tmpl == 'component') {
				$app->redirect('index.php?tmpl=component');
			}
			$app->redirect('index.php');
			return false;
		}

		if($tmpl == 'component') {
			$app->redirect(hikamarket::completeLink($redirect, true, true));
		}
		$app->redirect(hikamarket::completeLink($redirect, false, true));
		return false;
	}

	public static function getFormToken() {
		static $token = null;
		if($token == null) {
			if(HIKASHOP_J30)
				$token = JSession::getFormToken();
			else
				$token = JUtility::getToken();
		}
		return $token;
	}

	public static function loadJslib($name) {
		static $marketLibs = array();
		$doc = JFactory::getDocument();
		$name = strtolower($name);
		if(isset($marketLibs[$name]))
			return $marketLibs[$name];

		$ret = true;
		switch($name) {
			case 'otree':
				$doc->addScript(HIKAMARKET_JS.'otree.js?v='.HIKAMARKET_RESSOURCE_VERSION);
				$doc->addStyleSheet(HIKAMARKET_CSS.'otree.css?v='.HIKAMARKET_RESSOURCE_VERSION);
				$ret = true;
				break;
			case 'leaflet':
				$doc->addScript(HIKAMARKET_JS.'leaflet.js?v='.HIKAMARKET_RESSOURCE_VERSION);
				$doc->addStyleSheet(HIKAMARKET_CSS.'leaflet.css?v='.HIKAMARKET_RESSOURCE_VERSION);
				$ret = true;
				break;
			default:
				$ret = false;
				break;
		}

		if(!$ret)
			$ret = hikashop_loadJslib($name);

		$marketLibs[$name] = $ret;
		return $ret;
	}

	public static function orderStatus($order_status) {
		$order_upper = HikaStringHelper::strtoupper(trim($order_status));
		$order_upper = str_replace(array('
','(',')','[',']','=','"','\''),
'_', $order_upper);
		$tmp = 'ORDER_STATUS_' . $order_upper;
		$ret = JText::_($tmp);
		if($ret != $tmp)
			return $ret;
		$ret = JText::_($order_upper);
		if($ret != $order_upper)
			return $ret;
		return $order_status;
	}

	public static function cloning(&$object) {
		if(is_array($object)) {
			$ret = array();
			foreach($object as $k => $v) {
				$ret[$k] = self::cloning($v);
			}
			return $ret;
		}
		if(is_object($object)) {
			$ret = new stdClass();
			foreach(get_object_vars($object) as $k => $v) {
				$ret->$k = self::cloning($v);
			}
			return $ret;
		}
		return $object;
	}

	public static function headerNoCache() {
		if(headers_sent())
			return false;
		header('Cache-Control: no-store, no-cache, must-revalidate');
		header('Cache-Control: post-check=0, pre-check=0', false);
		header('Pragma: no-cache');
		return true;
	}

	public static function addUserACLFilters(&$filters, $field, $table =
'', $level = 2, $allowNull = false, $user_id = 0) {
		if(!empty($level) && !hikashop_level($level))
			return;

		if(empty($user_id) || (int)$user_id == 0) {
			$my = JFactory::getUser();
		} else {
			$userClass = self::get('shop.class.user');
			$hkUser = $userClass->get($user_id);
			$my = JFactory::getUser($hkUser->user_cms_id);
		}

		jimport('joomla.access.access');
		$config = self::config(false);
		$userGroups = JAccess::getGroupsByUser($my->id,
(bool)$config->get('inherit_parent_group_access'));
//$my->authorisedLevels();

		if(!empty($userGroups)) {
			if(!empty($table))
				$table .= '.';
			$acl_filters = array($table . $field . ' =
\'all\'');
			foreach($userGroups as $userGroup) {
				$acl_filters[] = $table . $field . ' LIKE \'%,' .
(int)$userGroup . ',%\'';
			}
			if($allowNull)
				$acl_filters[] = 'ISNULL(' . $table . $field .
')';
			$filters[] = '(' . implode(' OR ', $acl_filters) .
')';
		}
	}

	public static function addVendorACLFilters(&$filters, $field, $table =
'', $level = 1, $allowNull = false, $vendor_id = 0) {
		if(!empty($level) && !hikamarket::level($level))
			return;

		if(empty($vendor_id) || (int)$vendor_id == 0) {
			$vendor = self::loadVendor(true);
		} else {
			$vendorClass = self::get('class.vendor');
			$vendor = $vendorClass->get($vendor_id);
		}

		if(empty($vendor))
			return;

		$vendorGroups = array();
		$vendor_access = explode(',',
trim(strtolower($vendor->vendor_access), ','));
		foreach($vendor_access as $access) {
			if(substr($access, 0, 1) == '@')
				$vendorGroups[] = (int)substr($access, 1);
		}

		if(!empty($table))
			$table .= '.';
		$acl_filters = array($table . $field . ' =
\'all\'');
		foreach($vendorGroups as $vendorGroup) {
			$acl_filters[] = $table . $field . ' LIKE \'%,' .
(int)$vendorGroup . ',%\'';
		}
		if($allowNull)
			$acl_filters[] = 'ISNULL(' . $table . $field . ')';
		$filters[] = '(' . implode(' OR ', $acl_filters) .
')';
	}

	public static function getProductEditionUrl($product_id, $parameters =
'') {
		$config = self::config();

		$edition_itemid = (int)$config->get('edition_default_menu',
0);
		if(empty($edition_itemid))
			$edition_itemid = (int)$config->get('vendor_default_menu',
0);

		$url_itemid = (!empty($edition_itemid)) ?
'&Itemid='.$edition_itemid : '';

		if(!empty($parameters))
			$parameters = '&' . $parameters;

		switch($config->get('product_edit_cancel_url',
'')) {
			case 'product':
				return
hikamarket::completeLink('product&task=edit&cancel_action=product&cid='
. $product_id . $parameters . $url_itemid);
			case 'current_url':
				$current_url = base64_encode(hikamarket::currentUrl());
				return
hikamarket::completeLink('product&task=edit&cancel_action=url&cid='
. $product_id . $parameters . '&cancel_url=' . $current_url .
$url_itemid);
			case 'listing':
				return
hikamarket::completeLink('product&task=edit&cid=' .
$product_id . $parameters . $url_itemid);
		}
		return
hikamarket::completeLink('product&task=edit&cancel_action=product&cid='
. $product_id . $parameters . $url_itemid);
	}

	public static function toInteger(&$array) {
		if(is_array($array))
			$array = array_map('intval', $array);
		else
			$array = array();
	}

	public static function loadUser($full = false, $reset = false) {
		return hikashop_loadUser($full, $reset);
	}

	public static function isAllowed($allowedGroups, $id = null, $type =
'user') {
		return hikashop_isAllowed($allowedGroups, $id, $type);
	}

	public static function display($messages, $type = 'success',
$return = false, $close = true) {
		return hikashop_display($messages, $type, $return, $close);
	}

	public static function createDir($dir, $report = true) {
		return hikashop_createDir($dir, $report);
	}

	public static function search($searchString, $object, $exclude =
'') {
		static $displaySearch = null;
		if($displaySearch === null) {
			$app = JFactory::getApplication();
			if($app->isAdmin()) {
				$displaySearch = true;
			} else {
				$config = self::config();
				$displaySearch = $config->get('display_search', true);
			}
		}
		if(empty($displaySearch))
			return $object;
		return hikashop_search($searchString, $object, $exclude);
	}

	public static function getDate($time = 0, $format = '%d %B %Y
%H:%M') {
		return hikashop_getDate($time, $format);
	}

	public static function currentUrl($checkInRequest = '') {
		return hikashop_currentUrl($checkInRequest);
	}

	public static function increasePerf() {
		return hikashop_increasePerf();
	}

	public static function cleanBuffers() {
		return hikashop_cleanBuffers();
	}

	public static function encodeNumber(&$data, $type = 'order',
$format = '') {
		return hikashop_encode($data, $type, $format);
	}

	public static function toFloat($val) {
		return hikashop_toFloat($val);
	}

	public static function getTime($date) {
		return hikashop_getTime($date);
	}

	public static function getCurrency() {
		return hikashop_getCurrency();
	}

	public static function getZone($type = 'shipping') {
		return hikashop_getZone($type);
	}

	public static function getEscaped($text, $extra = false) {
		return hikashop_getEscaped($text, $extra);
	}

	public static function cleanUrl($url, $forceInternURL = false) {
		return hikashop_cleanUrl($url, $forceInternURL);
	}

	public static function absoluteUrl($text) {
		return hikashop_absoluteUrl($text);
	}

	public static function setPageTitle($title) {
		return hikashop_setPageTitle($title);
	}

	public static function disallowUrlRedirect($url) {
		return hikashop_disallowUrlRedirect($url);
	}

	public static function unserialize($data) {
		if(!is_string($data))
			return false;
		if(!preg_match_all('#[OC]:[0-9]+:"([-_a-zA-Z0-9]+)":[0-9]+:\{#iU',
$data, $matches))
			return unserialize($data);
		if(!empty($matches[1])) {
			foreach($matches[1] as $m) {
				if($m != 'stdClass')
					return false;
			}
		}
		return unserialize($data);
	}

}

class hikamarketController extends hikashopBridgeController {

	protected $type = '';
	protected $publish_return_view = 'listing';
	protected $rights = array(
		'display' => array(),
		'add' => array(),
		'edit' => array(),
		'modify' => array(),
		'delete' => array()
	);
	protected $pluginCtrl = null;
	protected $default_task = 'listing';

	public function __construct($config = array(), $skip = false) {
		if($skip)
			return;

		if(!empty($this->pluginCtrl)) {
			$config['base_path'] =
JPATH_PLUGINS.DS.$this->pluginCtrl[0].DS.$this->pluginCtrl[1].DS;
		}

		parent::__construct($config);
		$this->registerDefaultTask($this->default_task);
	}

	protected function renderingLayout($name = '', $options =
array()) {
		if(empty($name)) return false;
		if(!empty($options) && isset($options['hidemainmenu']))
{
			hikaInput::get()->set('hidemainmenu', 1);
		}
		hikaInput::get()->set('layout', $name);
		return $this->display();
	}

	public function listing() {
		return $this->renderingLayout('listing');
	}

	public function show() {
		return $this->renderingLayout('show');
	}

	public function edit() {
		return $this->renderingLayout('form',
array('hidemainmenu' => 1));
	}

	public function add() {
		return $this->renderingLayout('form',
array('hidemainmenu' => 1));
	}

	public function apply() {
		$status = $this->store();
		return $this->edit();
	}

	public function save() {
		$this->store();
		return $this->listing();
	}

	public function store() {
		return false;
	}

	protected function adminStore($token = false) {
		$app = JFactory::getApplication();
		if($token) {
			JSession::checkToken() || die('Invalid Token');
		}
		if(empty($this->type))
			return false;
		$class = hikamarket::get('class.'.$this->type);
		if( $class === null )
			return false;
		$status = $class->saveForm();
		if($status) {
			$app->enqueueMessage(JText::_('HIKAM_SUCC_SAVED'),
'message');
			hikaInput::get()->set('cid', $status);
			hikaInput::get()->set('fail', null);
		} else {
			$app->enqueueMessage(JText::_('ERROR_SAVING'),
'error');
			if(!empty($class->errors)) {
				foreach($class->errors as $err) {
					$app->enqueueMessage($err, 'error');
				}
			}
		}
		return $status;
	}

	protected function adminRemove() {
		JSession::checkToken() || die('Invalid Token');
		$cids = hikaInput::get()->get('cid', array(),
'array');
		$class = hikamarket::get('class.'.$this->type);
		$num = $class->delete($cids);
		if($num) {
			$app = JFactory::getApplication();
			$app->enqueueMessage(JText::sprintf('SUCC_DELETE_ELEMENTS',
count($cids)), 'message');
		}
		return $this->listing();
	}

	public function publish() {
		$cid = hikaInput::get()->post->get('cid', array(),
'array');
		hikamarket::toInteger($cid);
		return $this->toggle($cid,1);
	}

	public function unpublish() {
		$cid = hikaInput::get()->post->get('cid', array(),
'array');
		hikamarket::toInteger($cid);
		return $this->toggle($cid,0);
	}

	public function display($tpl = null, $params = null) {
		if(HIKASHOP_J30) {
			$document = JFactory::getDocument();
			$view = $this->getView('', $document->getType(),
'', array('base_path' => $this->basePath));
			if($view->getLayout() == 'default' &&
hikaInput::get()->getString('layout', '') !=
'')
				$view->setLayout(hikaInput::get()->getString('layout'));
		}

		$shopConfig = hikamarket::config(false);
		$menu_style = $shopConfig->get('menu_style',
'title_bottom');
		if(HIKASHOP_J30) $menu_style = 'content_top';
		if($menu_style == 'content_top') {
			$app = JFactory::getApplication();
			if($app->isAdmin() &&
hikaInput::get()->getString('tmpl') !== 'component')
{
				echo hikamarket::getMenu();
			}
		}
		return parent::display($tpl, $params);
	}

	private function toggle($cid, $publish) {
		if(empty($cid)) {
			throw new RuntimeException('No items selected', 500);
			return;
		}

		if(isset($this->dispatch) && in_array($this->dispatch,
'toggle') ) {
			$app = JFactory::getApplication();
			JPluginHelper::importPlugin('hikamarket');
			$unset = array();
			$objs = array();
			foreach($cid as $k => $id){
				$element = new stdClass();
				$name = reset($this->toggle);
				$element->$name = $id;
				$publish_name = key($this->toggle);
				$element->$publish_name = (int)$publish;
				$do = true;
				$app->triggerEvent('onBefore'.ucfirst($this->type).'Update',
array(&$element, &$do));
				if(!$do) {
					$unset[] = $k;
				} else {
					$objs[$k] = &$element;
				}
			}
			if(!empty($unset)) {
				foreach($unset as $u) {
					unset($cid[$u]);
				}
			}
		}

		$cids = implode(',', $cid);
		$db = JFactory::getDBO();
		$query = 'UPDATE '.hikamarket::table($this->type).' SET
'.key($this->toggle).' = '.(int)$publish.' WHERE
'.reset($this->toggle).' IN ( '.$cids.' )';
		$db->setQuery($query);
		if(!$db->execute()) {
			throw new RuntimeException($db->getErrorMsg(), 500);
			return;
		} elseif(isset($this->dispatch) &&
in_array($this->dispatch, 'toggle')) {
			if(!empty($objs)) {
				foreach($objs as $element) {
					$app->triggerEvent('onAfter'.ucfirst($this->type).'Update',
array(&$element));
				}
			}
		}
		$task = $this->publish_return_view;
		return $this->$task();
	}

	public function getModel($name = '', $prefix = '',
$config = array(),$do = false) {
		if($do) return parent::getModel($name, $prefix , $config);
		return false;
	}

	public function execute($task) {
		if(HIKASHOP_J30) {
			if(empty($task))
				$task = @$this->taskMap['__default'];
			if(!empty($task) && !$this->authorize($task)) {
				throw new
JAccessExceptionNotallowed(JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'),
403);
			}
		}
		return parent::execute($task);
	}

	public function authorize($task) {
		if($this->isIn($task, array('modify','delete')))
{
			if(JSession::checkToken('request')) {
				return true;
			}
			return false;
		}
		return $this->isIn($task);
	}

	public function authorise($task) {
		return $this->authorize($task);
	}

	public function isIn($task, $lists = array('*')) {
		if(!is_array($lists)) {
			$lists = array($lists);
		}
		$task = strtolower($task);
		foreach($lists as $list) {
			if($list == '*') {
				foreach($this->rights as $rights) {
					if(!empty($rights) && in_array($task, $rights)) {
						return true;
					}
				}
			} elseif(!empty($this->rights[$list]) && in_array($task,
$this->rights[$list])) {
				return true;
			}
		}
		return false;
	}

	protected function saveorder() {
		if(empty($this->ordering)) {
			return $this->listing();
		}

		if(!empty($this->ordering['table']) &&
!empty($this->ordering['pkey']) &&
(empty($this->ordering['groupMap']) ||
isset($this->ordering['groupVal'])) &&
!empty($this->ordering['orderingMap'])) {
			$orderClass = hikamarket::get('shop.helper.order');
			$orderClass->pkey = $this->ordering['pkey'];
			$orderClass->table = $this->ordering['table'];
			$orderClass->groupMap = $this->ordering['groupMap'];
			$orderClass->groupVal = $this->ordering['groupVal'];
			$orderClass->orderingMap =
$this->ordering['orderingMap'];
			if(!empty($this->ordering['main_pkey'])) {
				$orderClass->main_pkey = $this->ordering['main_pkey'];
			}
			$orderClass->save(false);
		}
		return $this->listing();
	}

	public function getUploadSetting($upload_key, $caller = '') {
		return false;
	}

	public function manageUpload($upload_key, &$ret, $uploadConfig,
$caller = '') { }
}

class hikamarketClass extends JObject {
	protected $db;
	protected $tables = array();
	protected $pkeys = array();
	protected $namekeys = array();
	protected $toggle = array();
	protected $deleteToggle = array();

	public function  __construct($config = array()){
		$this->db = JFactory::getDBO();
		return parent::__construct($config);
	}

	public function get($element, $default = null) {
		if(empty($element))
			return null;
		$pkey = end($this->pkeys);
		$namekey = end($this->namekeys);
		$table = $this->getTable(); //
hikamarket::table(end($this->tables));
		if(!is_numeric($element) && !empty($namekey)) {
			$pkey = $namekey;
		}
		$query = 'SELECT * FROM '.$table.' WHERE
'.$pkey.' = '.$this->db->Quote($element);
		$this->db->setQuery($query, 0, 1);
		$ret = $this->db->loadObject();
		return $ret;
	}

	public function getRaw($element, $default = null) {
		static $multiTranslation = null;
		if(empty($element))
			return null;
		$pkey = end($this->pkeys);
		$namekey = end($this->namekeys);
		$table = $this->getTable(); //
hikamarket::table(end($this->tables));
		if(!is_numeric($element) && !empty($namekey)) {
			$pkey = $namekey;
		}
		if($multiTranslation === null) {
			$translationHelper =
hikamarket::get('shop.helper.translation');
			$multiTranslation = $translationHelper->isMulti(true);
		}
		$query = 'SELECT * FROM '.$table.' WHERE
'.$pkey.' = '.$this->db->Quote($element);
		$this->db->setQuery($query, 0, 1);
		if($multiTranslation) {
			$app = JFactory::getApplication();
			if(!$app->isAdmin() &&
class_exists('JFalangDatabase')) {
				$ret = $this->db->loadObject('stdClass', false);
			} elseif(!$app->isAdmin() &&
(class_exists('JFDatabase') ||
class_exists('JDatabaseMySQLx'))) {
				$ret = $this->db->loadObject(false);
			} else {
				$ret = $this->db->loadObject();
			}
		} else {
			$ret = $this->db->loadObject();
		}
		return $ret;
	}

	public function save(&$element) {
		if(empty($this->tables))
			return false;
		$pkey = end($this->pkeys);
		if(empty($pkey)) {
			$pkey = end($this->namekeys);
		} elseif(empty($element->$pkey)) {
			$t = end($this->namekeys);
			if(!empty($t)) {
				if(!empty($element->$t)) {
					$pkey = $t;
				} else {
					$element->$t = $this->getNamekey($element);
					if($element->$t === false)
						return false;
				}
			}
		}
		$table = $this->getTable(); //
hikamarket::table(end($this->tables));
		$obj =& $element;

		if(empty($element->$pkey)) {
			$this->db->setQuery($this->getInsert($table, $obj));
			$status = $this->db->execute();
		} else {
			if( count( (array)$element ) > 1 ) {
				$status = $this->db->updateObject($table, $obj, $pkey);
			} else {
				$status = true;
			}
		}
		if($status)
			return empty($element->$pkey) ? $this->db->insertid() :
$element->$pkey;
		return false;
	}

	private function getInsert($table, &$obj, $keyName = null) {
		$sql = 'INSERT IGNORE INTO
'.$this->db->quoteName($table).' ( %s ) VALUES ( %s )
';
		$fields = array();
		$values = array();
		foreach (get_object_vars($obj) as $k => $v) {
			if(is_array($v) || is_object($v) || $v === null || $k[0] ==
'_' ) {
				continue;
			}
			$fields[] = $this->db->quoteName($k);
			$values[] = $this->db->Quote($v);
		}
		return sprintf($sql, implode(',', $fields),
implode(',', $values));
	}

	public function delete(&$elements) {
		if(empty($this->tables))
			return false;
		if(empty($elements))
			return false;
		if(!is_array($elements))
			$elements = array($elements);

		$isNumeric = is_numeric(reset($elements));
		foreach($elements as $key => $val) {
			$elements[$key] = $this->db->Quote($val);
		}

		$columns = $isNumeric ? $this->pkeys : $this->namekeys;

		if(empty($columns) || empty($elements))
			return false;

		$otherElements = array();
		$otherColumn = '';
		foreach($columns as $i => $column) {
			if(empty($column)) {
				$query = 'SELECT
'.($isNumeric?end($this->pkeys):end($this->namekeys)).'
FROM '.hikamarket::table(end($this->tables)).' WHERE
'.($isNumeric?end($this->pkeys):end($this->namekeys)).' IN
( '.implode(',',$elements).');';
				$this->db->setQuery($query);
				$otherElements = $this->db->loadColumn();

				foreach($otherElements as $key => $val) {
					$otherElements[$key] = $this->db->Quote($val);
				}
				break;
			}
		}

		$tables = array();
		if(is_array($this->tables)) {
			foreach($this->tables as $i => $oneTable) {
				$tables[$i] = hikamarket::table($oneTable);
			}
		} else {
			$tables[0] = hikamarket::table($this->tables);
		}

		$result = true;
		foreach($tables as $i => $oneTable) {
			$column = $columns[$i];
			if(empty($column)) {
				$whereIn = ' WHERE
'.($isNumeric?$this->namekeys[$i]:$this->pkeys[$i]).' IN
('.implode(',',$otherElements).')';
			} else {
				$whereIn = ' WHERE '.$column.' IN
('.implode(',',$elements).')';
			}
			$query = 'DELETE FROM '.$oneTable.$whereIn;
			$this->db->setQuery($query);
			$result = $this->db->execute() && $result;
		}
		return $result;
	}

	public function toggleId($task, $value = null) {
		if(!empty($this->toggle[$task]))
			return $this->toggle[$task];
		return false;
	}

	public function toggle($task, $key, $value = null) {
		return null;
	}

	public function toggleDelete($value1 = '', $value2 =
'') {
		if(!empty($this->deleteToggle))
			return $this->deleteToggle;
		return false;
	}

	public function getTable() {
		if(!empty($this->tables))
			return hikamarket::table(end($this->tables));
		return false;
	}
}

class hikamarketView extends hikashopBridgeView {
	protected $triggerView = false;
	public $toolbar = array();

	public function display($tpl = null) {
		if($this->triggerView) {
			$app = JFactory::getApplication();
			JPluginHelper::importPlugin('hikamarket');
			$view =& $this;
			$app->triggerEvent('onHikamarketBeforeDisplayView',
array(&$view));
		}

		if(!empty($this->toolbar)) {
			$toolbarHelper = hikamarket::get('helper.toolbar');
			$toolbarHelper->process($this->toolbar);
		}

		parent::display($tpl);

		if($this->triggerView)
			$app->triggerEvent('onHikamarketAfterDisplayView',
array(&$view));
	}

	protected function &getPageInfo($default = '', $dir =
'asc', $filters = array()) {
		$app = JFactory::getApplication();

		$pageInfo = new stdClass();
		$pageInfo->search =
$app->getUserStateFromRequest($this->paramBase.'.search',
'search', '', 'string');

		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$filter_fullorder =
hikaInput::get()->getString('filter_fullorder', null);
		if($filter_fullorder != null && strpos($filter_fullorder, '
') !== false) {
			$filter_fullorder = explode(' ', $filter_fullorder, 2);
			$filter_fullorder[1] = strtolower($filter_fullorder[1]);
			if($filter_fullorder[1] == 'asc' || $filter_fullorder[1] ==
'desc') {
				$app->setUserState($this->paramBase.'.filter_order',
$filter_fullorder[0]);
				$app->setUserState($this->paramBase.'.filter_order_Dir',
$filter_fullorder[1]);
				if(hikaInput::get()->getString('filter_order', null) ==
null) {
					hikaInput::get()->set('filter_order', 
$filter_fullorder[0]);
					hikaInput::get()->set('filter_order_Dir', 
$filter_fullorder[1]);
				}
			}
		}
		$pageInfo->filter->order->value =
$app->getUserStateFromRequest($this->paramBase.'.filter_order',
'filter_order', $default, 'cmd');
		$pageInfo->filter->order->dir =
$app->getUserStateFromRequest($this->paramBase.'.filter_order_Dir',
'filter_order_Dir',	$dir, 'word');

		$pageInfo->limit = new stdClass();
		$pageInfo->limit->value =
$app->getUserStateFromRequest($this->paramBase.'.list_limit',
'limit', $app->getCfg('list_limit'),
'int');
		if(empty($pageInfo->limit->value))
			$pageInfo->limit->value = 500;
		if((hikaInput::get()->getVar('search', null) != null
&& $cid = hikaInput::get()->getVar('search', null) !=
$app->getUserState($this->paramBase.'.search')) ||
hikaInput::get()->getVar('limit',
$pageInfo->limit->value) !=
$app->getUserState($this->paramBase.'.list_limit')) {
			$app->setUserState($this->paramBase.'.limitstart',0);
			$pageInfo->limit->start = 0;
		} else {
			$pageInfo->limit->start =
$app->getUserStateFromRequest($this->paramBase.'.limitstart',
'limitstart', 0, 'int');
		}

		if(!empty($filters)) {
			$reset = false;
			foreach($filters as $k => $v) {
				$type = 'string';
				if(is_int($v)) $type = 'int';

				if(!$reset) $oldValue =
$app->getUserState($this->paramBase.'.filter_'.$k, $v);
				$newValue =
$app->getUserStateFromRequest($this->paramBase.'.filter_'.$k,
'filter_'.$k, $v, $type);
				$reset = $reset || ($oldValue != $newValue);
				$pageInfo->filter->$k = $newValue;
			}
			if($reset) {
				$app->setUserState($this->paramBase.'.limitstart',0);
				$pageInfo->limit->start = 0;
			}
		}

		$pageInfo->search =
HikaStringHelper::strtolower($app->getUserStateFromRequest($this->paramBase.'.search',
'search', '', 'string'));
		$pageInfo->search = trim($pageInfo->search);

		$this->assignRef('pageInfo', $pageInfo);
		return $pageInfo;
	}

	protected function getPageInfoTotal($query, $countValue = '*')
{
		if(empty($this->pageInfo))
			return false;

		$db = JFactory::getDBO();
		$app = JFactory::getApplication();

		$db->setQuery('SELECT COUNT('.$countValue.')
'.$query);
		if(empty($this->pageInfo->elements))
			$this->pageInfo->elements = new stdClass();
		$this->pageInfo->elements->total = (int)$db->loadResult();
		if((int)$this->pageInfo->limit->start >=
$this->pageInfo->elements->total) {
			$this->pageInfo->limit->start = 0;
			$app->setUserState($this->paramBase.'.limitstart', 0);
		}
	}

	protected function processFilters(&$filters, &$order, $searchMap =
array(), $orderingAccept = array()) {
		if(!empty($this->pageInfo->search)) {
			$db = JFactory::getDBO();
			$searchVal = '\'%' .
$db->escape(HikaStringHelper::strtolower($this->pageInfo->search),
true) . '%\'';
			if(is_array($filters))
				$filters[] = '('.implode(' LIKE '.$searchVal.'
OR ',$searchMap).' LIKE '.$searchVal.')';
		}
		if(!empty($filters)) {
			if(is_array($filters))
				$filters = ' WHERE ('. implode(') AND (', $filters)
. ')';
		} else {
			$filters = '';
		}

		if(!empty($this->pageInfo->filter->order->value)) {
			$t = '';
			if(strpos($this->pageInfo->filter->order->value,
'.') !== false)
				list($t,$v) = explode('.',
$this->pageInfo->filter->order->value, 2);

			$dir = strtolower($this->pageInfo->filter->order->dir);
			if(!in_array($dir, array('asc', 'desc')))
				$this->pageInfo->filter->order->dir = 'ASC';

			if(empty($orderingAccept) || in_array($t.'.', $orderingAccept)
|| in_array($this->pageInfo->filter->order->value,
$orderingAccept))
				$order = ' ORDER BY
'.$this->pageInfo->filter->order->value.'
'.strtoupper($this->pageInfo->filter->order->dir);
		}
	}

	protected function getPagination($max = 500, $limit = 100) {
		if(empty($this->pageInfo))
			return false;

		if($this->pageInfo->limit->value == $max)
			$this->pageInfo->limit->value = $limit;

			$pagination = hikashop_get('helper.pagination',
$this->pageInfo->elements->total,
$this->pageInfo->limit->start,
$this->pageInfo->limit->value);
		$this->assignRef('pagination', $pagination);
		return $pagination;
	}

	protected function getOrdering($value = '', $doOrdering = true)
{
		$this->assignRef('doOrdering', $doOrdering);

		$ordering = new stdClass();
		$ordering->ordering = false;

		if($doOrdering) {
			$ordering->ordering = false;
			$ordering->orderUp = 'orderup';
			$ordering->orderDown = 'orderdown';
			$ordering->reverse = false;
			if(!empty($this->pageInfo) &&
$this->pageInfo->filter->order->value == $value) {
				$ordering->ordering = true;
				if($this->pageInfo->filter->order->dir == 'desc')
{
					$ordering->orderUp = 'orderdown';
					$ordering->orderDown = 'orderup';
					$ordering->reverse = true;
				}
			}
		}
		$this->assignRef('ordering', $ordering);
		return $ordering;
	}

	protected function loadRef($refs) {
		foreach($refs as $key => $name) {
			$obj = hikamarket::get($name);
			if(!empty($obj))
				$this->assignRef($key, $obj);
			unset($obj);
		}
	}

	protected function loadHkLayout($layout, $params = array()) {
		$backup_paths = $this->_path['template'];

		$layout_path = rtrim(JPath::clean(HIKAMARKET_FRONT), '\/') .
'/views/layouts/tmpl';

		$app = JFactory::getApplication();
		$component = JApplicationHelper::getComponentName();
		$component = preg_replace('/[^A-Z0-9_\.-]/i', '',
$component);
		$fallback = JPATH_THEMES . '/' . $app->getTemplate() .
'/html/' . $component . '/layouts';

		$this->_path['template'] = array();
		$this->_addPath('template', array($layout_path,
$fallback));

		if(!isset($this->params) || (empty($this->params) &&
is_array($this->params)))
			$this->params = new JRegistry();

		$backup_params = array();
		foreach($params as $k => $v) {
			$backup_params[$k] = $this->params->get($k, null);
			$this->params->set($k, $v);
		}

		$current_name = $this->getName();
		$this->_name = 'layouts';

		$current_layout = $this->getLayout();
		$this->setLayout($layout);

		$ret = $this->loadTemplate();

		$this->setLayout($current_layout);

		$this->_name = $current_name;

		$this->_path['template'] = $backup_paths;

		foreach($backup_params as $k => $v) {
			$this->params->set($k, $v);
		}

		return $ret;
	}

	public function escape($var, $search = false) {
		if($search === false || empty($this->pageInfo) ||
empty($this->pageInfo->search))
			return parent::escape($var);
		return hikamarket::search($this->pageInfo->search,
parent::escape($var));
	}

	public function search($var, $escape = false) {
		if(empty($this->pageInfo) || empty($this->pageInfo->search))
			return $escape ? parent::escape($var) : $var;
		return hikamarket::search($this->pageInfo->search, $escape ?
parent::escape($var) : $var);
	}

	public function loadTemplate($tpl = null){
		$config = hikashop_config();
		$active = $config->get('display_view_files', 0);
		if(!$active)
			return parent::loadTemplate($tpl);

		$app = JFactory::getApplication();
		if($app->isAdmin() && $active != 2)
			return parent::loadTemplate($tpl);

		return '<div
class="hikashop_view_files_border"><div
class="hikashop_view_files_title"><span>'.
			$this->getName().' /
'.$this->getLayout().(!empty($tpl)?'_':'').$tpl.'.php</span></div><div
class="hikashop_view_files_wrapper">'.
			parent::loadTemplate($tpl).
			'</div></div>';
	}

	public function assignRef($name, &$ref) {
		$this->$name =& $ref;
	}
}

spl_autoload_register(function($classname) {
	if($classname == 'hikamarketPlugin') {
		include_once __DIR__ . '/plugin.php';
		return;
	}
	if(substr($classname, 0, 10) != 'hikamarket')
		return;
});

$configMarket = hikamarket::config();
define('HIKAMARKET_RESSOURCE_VERSION', str_replace('.',
'', $configMarket->get('version')));
$doc = JFactory::getDocument();
$doc->addScript(HIKAMARKET_JS.'hikamarket.js?v='.HIKAMARKET_RESSOURCE_VERSION);
$cssMarket = $configMarket->get('css_'.$css_type,
'default');
if(!empty($cssMarket))
	$doc->addStyleSheet(HIKAMARKET_CSS.$css_type.'_'.$cssMarket.'.css?v='.HIKAMARKET_RESSOURCE_VERSION);
if(!$app->isAdmin()) {
	$styleCssMarket =
$configMarket->get('css_style','');
	if(!empty($styleCssMarket))
		$doc->addStyleSheet(HIKAMARKET_CSS.'style_'.$styleCssMarket.'.css?v='.HIKAMARKET_RESSOURCE_VERSION);
}
if(!empty($cssMarket) || !empty($styleCssMarket)) {
	$lang = JFactory::getLanguage();
	if($lang->isRTL())
		$doc->addStyleSheet(HIKAMARKET_CSS.'rtl.css?v='.HIKAMARKET_RESSOURCE_VERSION);
}
if(($app->isAdmin() && HIKASHOP_BACK_RESPONSIVE) ||
(!$app->isAdmin() && HIKASHOP_RESPONSIVE))
	$doc->addScriptDeclaration("\r\n".'window.Oby.ready(function(){setTimeout(function(){window.hikamarket.noChzn();},100);});');