shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

d_seo_module.php (161802B)


      1 <?php
      2 class ControllerExtensionModuleDSEOModule extends Controller {
      3 	private $codename = 'd_seo_module';
      4 	private $route = 'extension/module/d_seo_module';
      5 	private $config_file = 'd_seo_module';
      6 	private $extension = array();
      7 	private $error = array();
      8 
      9 	public function __construct($registry) {
     10 		parent::__construct($registry);
     11 
     12         $this->extension = json_decode(file_get_contents(DIR_SYSTEM . 'library/d_shopunity/extension/' . $this->codename . '.json'), true);
     13         $this->d_shopunity = (file_exists(DIR_SYSTEM . 'library/d_shopunity/extension/d_shopunity.json'));
     14         $this->d_validator = (file_exists(DIR_SYSTEM . 'library/d_shopunity/extension/d_validator.json'));
     15 	}
     16 	
     17 	public function index() {		
     18 		$this->dashboard();
     19 	}
     20 	
     21 	public function dashboard() {
     22 		$this->load->language($this->route);
     23 
     24 		$this->load->model($this->route);
     25 		$this->load->model('setting/setting');
     26 		$this->load->model('localisation/language');
     27 		$this->load->model('tool/image');
     28 		
     29 		if ($this->d_shopunity) {
     30 			$this->load->model('extension/d_shopunity/mbooth');
     31 				
     32 			$this->model_extension_d_shopunity_mbooth->validateDependencies($this->codename);
     33 		}
     34 
     35 		if ($this->d_validator) {
     36             $this->load->model('extension/d_shopunity/d_validator');
     37             $this->model_extension_d_shopunity_d_validator->installCompatibility();
     38         }
     39 		
     40 		if (file_exists(DIR_APPLICATION . 'model/extension/module/d_twig_manager.php')) {
     41 			$this->load->model('extension/module/d_twig_manager');
     42 			
     43 			$this->model_extension_module_d_twig_manager->installCompatibility();
     44 		}
     45 		
     46 		$this->update();
     47 		
     48 		if (isset($this->request->get['store_id'])) { 
     49 			$store_id = $this->request->get['store_id']; 
     50 		} else {  
     51 			$store_id = 0;
     52 		}
     53 		
     54 		$url_token = '';
     55 		
     56 		if (isset($this->session->data['token'])) {
     57 			$url_token .=  'token=' . $this->session->data['token'];
     58 		}
     59 		
     60 		if (isset($this->session->data['user_token'])) {
     61 			$url_token .=  'user_token=' . $this->session->data['user_token'];
     62 		}
     63 		
     64 		$url_store = 'store_id=' . $store_id;
     65 		
     66 		// Styles and Scripts
     67 		$this->document->addStyle('view/stylesheet/d_bootstrap_extra/bootstrap.css');
     68 		$this->document->addScript('view/javascript/d_bootstrap_switch/js/bootstrap-switch.min.js');
     69         $this->document->addStyle('view/javascript/d_bootstrap_switch/css/bootstrap-switch.css');
     70 		$this->document->addStyle('view/stylesheet/d_admin_style/core/normalize/normalize.css');
     71 		$this->document->addStyle('view/stylesheet/d_admin_style/themes/light/light.css');
     72 		$this->document->addStyle('view/stylesheet/d_seo_module.css');
     73 
     74 		// Heading
     75 		$this->document->setTitle($this->language->get('heading_title_main'));
     76 		$data['heading_title'] = $this->language->get('heading_title_main');
     77 
     78 		// Variable
     79 		$data['codename'] = $this->codename;
     80 		$data['route'] = $this->route;
     81 		$data['version'] = $this->extension['version'];
     82 		$data['extension_id'] = $this->extension['extension_id'];
     83 		$data['config'] = $this->config_file;
     84 		$data['d_shopunity'] = $this->d_shopunity;
     85 		$data['store_id'] = $store_id;
     86 		$data['url_token'] = $url_token;
     87 		$data['stores'] = $this->{'model_extension_module_' . $this->codename}->getStores();
     88 		$data['languages'] = $this->{'model_extension_module_' . $this->codename}->getLanguages();
     89 
     90 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
     91 		$data['installed'] = in_array($this->codename, $installed_seo_extensions) ? true : false;
     92 
     93 		if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
     94 			$data['server'] = HTTPS_SERVER;
     95 			$data['catalog'] = HTTPS_CATALOG;
     96 		} else {
     97 			$data['server'] = HTTP_SERVER;
     98 			$data['catalog'] = HTTP_CATALOG;
     99 		}
    100 										
    101 		// Action
    102 		$data['href_dashboard'] = $this->url->link($this->route . '/dashboard', $url_token . '&' . $url_store, true);
    103 		$data['href_setting'] = $this->url->link($this->route . '/setting', $url_token . '&' . $url_store, true);
    104 		$data['href_multi_store_field'] = $this->url->link($this->route . '/multi_store_field', $url_token . '&' . $url_store, true);
    105 		$data['href_target_keyword'] = $this->url->link($this->route . '/target_keyword', $url_token . '&' . $url_store, true);
    106 		$data['href_export_import'] = $this->url->link($this->route . '/export_import', $url_token . '&' . $url_store, true);
    107 		$data['href_instruction'] = $this->url->link($this->route . '/instruction', $url_token . '&' . $url_store, true);
    108 			
    109 		$data['module_link'] = $this->url->link($this->route, $url_token . '&' . $url_store, true);
    110 		$data['setup'] = $this->url->link($this->route . '/setupExtension', $url_token, true);
    111 		$data['install'] = $this->url->link($this->route . '/installExtension', $url_token, true);
    112 		$data['uninstall'] = $this->url->link($this->route . '/uninstallExtension', $url_token, true);
    113 					
    114 		if (VERSION >= '3.0.0.0') {
    115 			$data['cancel'] = $this->url->link('marketplace/extension', $url_token . '&type=module', true);
    116 		} elseif (VERSION >= '2.3.0.0') {
    117 			$data['cancel'] = $this->url->link('extension/extension', $url_token . '&type=module', true);
    118 		} else {
    119 			$data['cancel'] = $this->url->link('extension/module', $url_token, true);
    120 		}
    121 		
    122 		// Tab
    123 		$data['text_dashboard'] = $this->language->get('text_dashboard');
    124 		$data['text_settings'] = $this->language->get('text_settings');
    125 		$data['text_multi_store_fields'] = $this->language->get('text_multi_store_fields');
    126 		$data['text_target_keywords'] = $this->language->get('text_target_keywords');
    127 		$data['text_export_import'] = $this->language->get('text_export_import');
    128 		$data['text_instructions'] = $this->language->get('text_instructions');
    129 		
    130 		// Button
    131 		$data['button_cancel'] = $this->language->get('button_cancel');
    132 		$data['button_setup'] = $this->language->get('button_setup');
    133 		$data['button_install'] = $this->language->get('button_install');
    134 		$data['button_view'] = $this->language->get('button_view');
    135 		$data['button_reset'] = $this->language->get('button_reset');
    136 		
    137 		// Text
    138 		$data['text_edit'] = $this->language->get('text_edit');
    139 		$data['text_install'] = $this->language->get('text_install');
    140 		$data['text_setup'] = $this->language->get('text_setup');
    141 		$data['text_full_setup'] = $this->language->get('text_full_setup');
    142 		$data['text_custom_setup'] = $this->language->get('text_custom_setup');
    143 		$data['text_seo_extensions'] = $this->language->get('text_seo_extensions');
    144 		$data['text_quick_setup'] = $this->language->get('text_quick_setup');
    145 		$data['text_implemented'] = $this->language->get('text_implemented');
    146 		$data['text_details'] = $this->language->get('text_details');
    147 		$data['text_no_control_elements'] = $this->language->get('text_no_control_elements');
    148 		$data['text_powered_by'] = $this->language->get('text_powered_by');
    149 		
    150 		// Help
    151 		$data['help_setup'] = $this->language->get('help_setup');
    152 		$data['help_full_setup'] = $this->language->get('help_full_setup');
    153 		$data['help_custom_setup'] = $this->language->get('help_custom_setup');
    154 								
    155 		// Notification
    156 		foreach ($this->error as $key => $error) {
    157 			$data['error'][$key] = $error;
    158 		}
    159 
    160 		if (isset($this->session->data['success'])) {
    161 			$data['success'] = $this->session->data['success'];
    162 			unset($this->session->data['success']);
    163 		} else {
    164 			$data['success'] = '';
    165 		}
    166 		
    167 		if (!file_exists(DIR_SYSTEM . '/library/d_shopunity/extension/d_seo_module_pack.json')) {
    168 			$data['d_seo_module_pack']['info'] = $this->language->get('help_d_seo_module_pack');
    169 			$data['d_seo_module_pack']['extension_id'] = 130;
    170 		}
    171 
    172 		// Breadcrumbs
    173 		$data['breadcrumbs'] = array();
    174 
    175 		$data['breadcrumbs'][] = array(
    176 			'text' => $this->language->get('text_home'),
    177 			'href' => $this->url->link('common/dashboard', $url_token, true)
    178 		);
    179 				
    180 		if (VERSION >= '3.0.0.0') {
    181 			$data['breadcrumbs'][] = array(
    182 				'text' => $this->language->get('text_modules'),
    183 				'href' => $this->url->link('marketplace/extension', $url_token . '&type=module', true)
    184 			);
    185 		} elseif (VERSION >= '2.3.0.0') {
    186 			$data['breadcrumbs'][] = array(
    187 				'text' => $this->language->get('text_modules'),
    188 				'href' => $this->url->link('extension/extension', $url_token . '&type=module', true)
    189 			);
    190 		} else {
    191 			$data['breadcrumbs'][] = array(
    192 				'text' => $this->language->get('text_modules'),
    193 				'href' => $this->url->link('extension/module', $url_token, true)
    194 			);
    195 		}
    196 
    197 		$data['breadcrumbs'][] = array(
    198 			'text' => $this->language->get('text_seo_module'),
    199 			'href' => $this->url->link($this->route, $url_token . '&' . $url_store, true)
    200 		);
    201 		
    202 		$data['header'] = $this->load->controller('common/header');
    203 		$data['column_left'] = $this->load->controller('common/column_left');
    204 		$data['footer'] = $this->load->controller('common/footer');
    205 				
    206 		if ($data['installed']) {
    207 			$control_extensions = array();
    208 		
    209 			$seo_extensions = $this->{'model_extension_module_' . $this->codename}->getSEOExtensions();
    210 		
    211 			foreach ($seo_extensions as $seo_extension) {
    212 				$info = $this->load->controller('extension/' . $this->codename . '/' . $seo_extension . '/control_extensions');
    213 				if ($info) $control_extensions = array_merge($control_extensions, $info);
    214 			}
    215 		
    216 			$control_extensions = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($control_extensions, 'sort_order');
    217 		
    218 			$data['control_extensions'] = array();
    219 		
    220 			foreach ($control_extensions as $control_extension) {
    221 				if (isset($control_extension['code']) && isset($control_extension['name']) && isset($control_extension['image']) && isset($control_extension['href'])) {				
    222 					$url_extension_code = 'extension_code=' . $control_extension['code'];
    223 								
    224 					$control_extension['install_href'] = $this->url->link('extension/module/' . $this->codename . '/installControlExtension', $url_token . '&' . $url_extension_code, true);
    225 					$control_extension['installed'] = in_array($control_extension['code'], $installed_seo_extensions) ? true : false;
    226 										
    227 					$data['control_extensions'][] = $control_extension;
    228 				}
    229 			}
    230 		
    231 			$control_elements = array();
    232 		
    233 			foreach ($installed_seo_extensions as $installed_seo_extension) {
    234 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/control_elements', array('store_id' => $store_id));
    235 				if ($info) $control_elements = array_merge($control_elements, $info);
    236 			}
    237 		
    238 			$data['quick_setup_total'] = 0;
    239 			$data['implemented_total'] = 0;
    240 			$data['control_elements'] = array();
    241 		
    242 			foreach ($control_elements as $control_element) {
    243 				if (isset($control_element['extension_code']) && isset($control_element['element_code']) && isset($control_element['name']) && isset($control_element['description']) && isset($control_element['confirm']) && isset($control_element['implemented'])) {						
    244 					$url_extension_code = 'extension_code=' . $control_element['extension_code'];
    245 					$url_element_code = 'element_code=' . $control_element['element_code'];
    246 								
    247 					$control_element['edit_href'] = $this->url->link('extension/module/' . $this->codename . '/executeControlElement', $url_token . '&' . $url_store . '&' . $url_extension_code . '&' . $url_element_code, true);
    248 				
    249 					if ($control_element['implemented']) {
    250 						$data['implemented_total']++;
    251 					} else {
    252 						$data['quick_setup_total']++;
    253 					}
    254 				
    255 					$data['control_elements'][] = $control_element;
    256 				}
    257 			}
    258 		
    259 			$data['control_elements'] = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($data['control_elements'], 'weight', SORT_DESC);
    260 			
    261 			$this->response->setOutput($this->load->view($this->route . '/dashboard', $data));
    262 		} else {
    263 			// Setting
    264 			$this->config->load($this->config_file);
    265 			$config_feature_setting = ($this->config->get($this->codename . '_feature_setting')) ? $this->config->get($this->codename . '_feature_setting') : array();
    266 		
    267 			$data['features'] = array();
    268 		
    269 			foreach ($config_feature_setting as $feature) {
    270 				if (substr($feature['name'], 0, strlen('text_')) == 'text_') {
    271 					$feature['name'] = $this->language->get($feature['name']);
    272 				}
    273 						
    274 				$data['features'][] = $feature;
    275 			}
    276 			
    277 			$this->response->setOutput($this->load->view($this->route . '/install', $data));
    278 		}
    279 	}
    280 
    281 	public function setting() {		
    282 		$this->load->language($this->route);
    283 
    284 		$this->load->model($this->route);
    285 		$this->load->model('setting/setting');
    286 		$this->load->model('localisation/language');
    287 		
    288 		if ($this->d_shopunity) {
    289 			$this->load->model('extension/d_shopunity/mbooth');
    290 				
    291 			$this->model_extension_d_shopunity_mbooth->validateDependencies($this->codename);
    292 		}
    293 		
    294 		if (file_exists(DIR_APPLICATION . 'model/extension/module/d_twig_manager.php')) {
    295 			$this->load->model('extension/module/d_twig_manager');
    296 			
    297 			$this->model_extension_module_d_twig_manager->installCompatibility();
    298 		}
    299 		
    300 		$this->update();
    301 		
    302 		if (isset($this->request->get['store_id'])) { 
    303 			$store_id = $this->request->get['store_id']; 
    304 		} else {  
    305 			$store_id = 0;
    306 		}
    307 		
    308 		$url_token = '';
    309 		
    310 		if (isset($this->session->data['token'])) {
    311 			$url_token .=  'token=' . $this->session->data['token'];
    312 		}
    313 		
    314 		if (isset($this->session->data['user_token'])) {
    315 			$url_token .=  'user_token=' . $this->session->data['user_token'];
    316 		}
    317 		
    318 		$url_store = 'store_id=' . $store_id;
    319 		
    320 		// Styles and Scripts
    321 		$this->document->addStyle('view/stylesheet/d_bootstrap_extra/bootstrap.css');
    322 		$this->document->addScript('view/javascript/d_bootstrap_switch/js/bootstrap-switch.min.js');
    323         $this->document->addStyle('view/javascript/d_bootstrap_switch/css/bootstrap-switch.css');
    324 		$this->document->addStyle('view/stylesheet/d_admin_style/core/normalize/normalize.css');
    325 		$this->document->addStyle('view/stylesheet/d_admin_style/themes/light/light.css');
    326 		$this->document->addStyle('view/stylesheet/d_seo_module.css');
    327 
    328 		// Heading
    329 		$this->document->setTitle($this->language->get('heading_title_main'));
    330 		$data['heading_title'] = $this->language->get('heading_title_main');
    331 
    332 		// Variable
    333 		$data['codename'] = $this->codename;
    334 		$data['route'] = $this->route;
    335 		$data['version'] = $this->extension['version'];
    336 		$data['config'] = $this->config_file;
    337 		$data['d_shopunity'] = $this->d_shopunity;
    338 		$data['store_id'] = $store_id;
    339 		$data['stores'] = $this->{'model_extension_module_' . $this->codename}->getStores();
    340 		$data['languages'] = $this->{'model_extension_module_' . $this->codename}->getLanguages();
    341 
    342 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
    343 		$data['installed'] = in_array($this->codename, $installed_seo_extensions) ? true : false;
    344 
    345 		if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
    346 			$data['server'] = HTTPS_SERVER;
    347 			$data['catalog'] = HTTPS_CATALOG;
    348 		} else {
    349 			$data['server'] = HTTP_SERVER;
    350 			$data['catalog'] = HTTP_CATALOG;
    351 		}
    352 		
    353 		$data['catalog_url_info'] = $this->{'model_extension_module_' . $this->codename}->getURLInfo($data['catalog']);
    354 								
    355 		// Action
    356 		$data['href_dashboard'] = $this->url->link($this->route . '/dashboard', $url_token . '&' . $url_store, true);
    357 		$data['href_setting'] = $this->url->link($this->route . '/setting', $url_token . '&' . $url_store, true);
    358 		$data['href_multi_store_field'] = $this->url->link($this->route . '/multi_store_field', $url_token . '&' . $url_store, true);
    359 		$data['href_target_keyword'] = $this->url->link($this->route . '/target_keyword', $url_token . '&' . $url_store, true);
    360 		$data['href_export_import'] = $this->url->link($this->route . '/export_import', $url_token . '&' . $url_store, true);
    361 		$data['href_instruction'] = $this->url->link($this->route . '/instruction', $url_token . '&' . $url_store, true);
    362 			
    363 		$data['module_link'] = $this->url->link($this->route, $url_token . '&' . $url_store, true);
    364 		$data['action'] = $this->url->link($this->route . '/save', $url_token . '&' . $url_store, true);
    365 		$data['setup'] = $this->url->link($this->route . '/setupExtension', $url_token, true);
    366 		$data['install'] = $this->url->link($this->route . '/installExtension', $url_token, true);
    367 		$data['uninstall'] = $this->url->link($this->route . '/uninstallExtension', $url_token, true);
    368 		$data['store_setting'] = $this->url->link('setting/setting', $url_token, true);
    369 			
    370 		if (VERSION >= '3.0.0.0') {
    371 			$data['cancel'] = $this->url->link('marketplace/extension', $url_token . '&type=module', true);
    372 		} elseif (VERSION >= '2.3.0.0') {
    373 			$data['cancel'] = $this->url->link('extension/extension', $url_token . '&type=module', true);
    374 		} else {
    375 			$data['cancel'] = $this->url->link('extension/module', $url_token, true);
    376 		}
    377 		
    378 		// Tab
    379 		$data['text_dashboard'] = $this->language->get('text_dashboard');
    380 		$data['text_settings'] = $this->language->get('text_settings');
    381 		$data['text_multi_store_fields'] = $this->language->get('text_multi_store_fields');
    382 		$data['text_target_keywords'] = $this->language->get('text_target_keywords');
    383 		$data['text_export_import'] = $this->language->get('text_export_import');
    384 		$data['text_instructions'] = $this->language->get('text_instructions');
    385 		$data['text_basic_settings'] = $this->language->get('text_basic_settings');
    386 		$data['text_htaccess'] = $this->language->get('text_htaccess');
    387 		$data['text_robots'] = $this->language->get('text_robots');
    388 
    389 		// Button
    390 		$data['button_save'] = $this->language->get('button_save');
    391 		$data['button_save_and_stay'] = $this->language->get('button_save_and_stay');
    392 		$data['button_cancel'] = $this->language->get('button_cancel');
    393 		$data['button_setup'] = $this->language->get('button_setup');
    394 		$data['button_uninstall'] = $this->language->get('button_uninstall');
    395 		$data['button_view_store_setting'] = $this->language->get('button_view_store_setting');
    396 		
    397 		// Entry
    398 		$data['entry_status'] = $this->language->get('entry_status');
    399 		$data['entry_list_limit'] = $this->language->get('entry_list_limit');
    400 		$data['entry_uninstall'] = $this->language->get('entry_uninstall');
    401 		$data['entry_text'] = $this->language->get('entry_text');
    402 
    403 		// Text
    404 		$data['text_edit'] = $this->language->get('text_edit');
    405 		$data['text_install'] = $this->language->get('text_install');
    406 		$data['text_setup'] = $this->language->get('text_setup');
    407 		$data['text_full_setup'] = $this->language->get('text_full_setup');
    408 		$data['text_custom_setup'] = $this->language->get('text_custom_setup');
    409 		$data['text_yes'] = $this->language->get('text_yes');
    410 		$data['text_no'] = $this->language->get('text_no');
    411 		$data['text_enabled'] = $this->language->get('text_enabled');
    412 		$data['text_disabled'] = $this->language->get('text_disabled');
    413 		$data['text_powered_by'] = $this->language->get('text_powered_by');
    414 		$data['text_uninstall_confirm'] = $this->language->get('text_uninstall_confirm');
    415 				
    416 		// Help
    417 		$data['help_setup'] = $this->language->get('help_setup');
    418 		$data['help_full_setup'] = $this->language->get('help_full_setup');
    419 		$data['help_custom_setup'] = $this->language->get('help_custom_setup');
    420 		$data['help_htaccess_setting'] = $this->language->get('help_htaccess_setting');
    421 		$data['help_htaccess_subfolder'] = $this->language->get('help_htaccess_subfolder');
    422 		$data['help_robots'] = $this->language->get('help_robots');
    423 		
    424 		// Notification
    425 		foreach ($this->error as $key => $error) {
    426 			$data['error'][$key] = $error;
    427 		}
    428 
    429 		if (isset($this->session->data['success'])) {
    430 			$data['success'] = $this->session->data['success'];
    431 			unset($this->session->data['success']);
    432 		} else {
    433 			$data['success'] = '';
    434 		}
    435 
    436 		// Breadcrumbs
    437 		$data['breadcrumbs'] = array();
    438 
    439 		$data['breadcrumbs'][] = array(
    440 			'text' => $this->language->get('text_home'),
    441 			'href' => $this->url->link('common/dashboard', $url_token, true)
    442 		);
    443 				
    444 		if (VERSION >= '3.0.0.0') {
    445 			$data['breadcrumbs'][] = array(
    446 				'text' => $this->language->get('text_modules'),
    447 				'href' => $this->url->link('marketplace/extension', $url_token . '&type=module', true)
    448 			);
    449 		} elseif (VERSION >= '2.3.0.0') {
    450 			$data['breadcrumbs'][] = array(
    451 				'text' => $this->language->get('text_modules'),
    452 				'href' => $this->url->link('extension/extension', $url_token . '&type=module', true)
    453 			);
    454 		} else {
    455 			$data['breadcrumbs'][] = array(
    456 				'text' => $this->language->get('text_modules'),
    457 				'href' => $this->url->link('extension/module', $url_token, true)
    458 			);
    459 		}
    460 
    461 		$data['breadcrumbs'][] = array(
    462 			'text' => $this->language->get('text_seo_module'),
    463 			'href' => $this->url->link($this->route, $url_token . '&' . $url_store, true)
    464 		);
    465 		
    466 		$data['header'] = $this->load->controller('common/header');
    467 		$data['column_left'] = $this->load->controller('common/column_left');
    468 		$data['footer'] = $this->load->controller('common/footer');
    469 		
    470 		if ($data['installed']) {
    471 			// Setting
    472 			$this->config->load($this->config_file);
    473 			$data['setting'] = ($this->config->get($this->codename . '_setting')) ? $this->config->get($this->codename . '_setting') : array();
    474 				
    475 			$setting = $this->model_setting_setting->getSetting('module_' . $this->codename, $store_id);
    476 			$status = isset($setting['module_' . $this->codename . '_status']) ? $setting['module_' . $this->codename . '_status'] : false;
    477 			$setting = isset($setting['module_' . $this->codename . '_setting']) ? $setting['module_' . $this->codename . '_setting'] : array();
    478 		
    479 			$data['status'] = $status;
    480 		
    481 			if (!empty($setting)) {
    482 				$data['setting'] = array_replace_recursive($data['setting'], $setting);
    483 			}
    484 						
    485 			$data['htaccess'] = $this->{'model_extension_module_' . $this->codename}->getFileData('htaccess');		
    486 			$data['robots'] = $this->{'model_extension_module_' . $this->codename}->getFileData('robots');
    487 		
    488 			if (!$data['htaccess']['status'] && !trim($data['htaccess']['text'])) {
    489 				$data['htaccess']['text'] = str_replace('[catalog_url_path]', $data['catalog_url_info']['path'], $data['setting']['default_htaccess']);
    490 			}
    491 		
    492 			if (!$data['robots']['status'] && !trim($data['robots']['text'])) {
    493 				$data['robots']['text'] = str_replace('[catalog_url]', $data['catalog'], $data['setting']['default_robots']);
    494 				$data['robots']['text'] = str_replace('[catalog_url_host]', $data['catalog_url_info']['host'], $data['robots']['text']);
    495 			}
    496 			
    497 			$this->response->setOutput($this->load->view($this->route . '/setting', $data));
    498 		} else {
    499 			// Setting
    500 			$this->config->load($this->config_file);
    501 			$config_feature_setting = ($this->config->get($this->codename . '_feature_setting')) ? $this->config->get($this->codename . '_feature_setting') : array();
    502 		
    503 			$data['features'] = array();
    504 		
    505 			foreach ($config_feature_setting as $feature) {
    506 				if (substr($feature['name'], 0, strlen('text_')) == 'text_') {
    507 					$feature['name'] = $this->language->get($feature['name']);
    508 				}
    509 						
    510 				$data['features'][] = $feature;
    511 			}
    512 			
    513 			$this->response->setOutput($this->load->view($this->route . '/install', $data));
    514 		}
    515 	}
    516 	
    517 	public function multi_store_field() {
    518 		$this->load->language($this->route);
    519 
    520 		$this->load->model($this->route);
    521 		$this->load->model('setting/setting');
    522 		$this->load->model('localisation/language');
    523 		
    524 		if ($this->d_shopunity) {
    525 			$this->load->model('extension/d_shopunity/mbooth');
    526 				
    527 			$this->model_extension_d_shopunity_mbooth->validateDependencies($this->codename);
    528 		}
    529 		
    530 		if (file_exists(DIR_APPLICATION . 'model/extension/module/d_twig_manager.php')) {
    531 			$this->load->model('extension/module/d_twig_manager');
    532 			
    533 			$this->model_extension_module_d_twig_manager->installCompatibility();
    534 		}
    535 		
    536 		$this->update();
    537 		
    538 		if (isset($this->request->get['store_id'])) { 
    539 			$store_id = $this->request->get['store_id']; 
    540 		} else {  
    541 			$store_id = 0;
    542 		}
    543 		
    544 		$url_token = '';
    545 		
    546 		if (isset($this->session->data['token'])) {
    547 			$url_token .=  'token=' . $this->session->data['token'];
    548 		}
    549 		
    550 		if (isset($this->session->data['user_token'])) {
    551 			$url_token .=  'user_token=' . $this->session->data['user_token'];
    552 		}
    553 		
    554 		$url_store = 'store_id=' . $store_id;
    555 		
    556 		// Styles and Scripts
    557 		$this->document->addStyle('view/stylesheet/d_bootstrap_extra/bootstrap.css');
    558 		$this->document->addScript('view/javascript/d_bootstrap_switch/js/bootstrap-switch.min.js');
    559         $this->document->addStyle('view/javascript/d_bootstrap_switch/css/bootstrap-switch.css');
    560 		$this->document->addStyle('view/stylesheet/d_admin_style/core/normalize/normalize.css');
    561 		$this->document->addStyle('view/stylesheet/d_admin_style/themes/light/light.css');
    562 		$this->document->addStyle('view/stylesheet/d_seo_module.css');
    563 
    564 		// Heading
    565 		$this->document->setTitle($this->language->get('heading_title_main'));
    566 		$data['heading_title'] = $this->language->get('heading_title_main');
    567 
    568 		// Variable
    569 		$data['codename'] = $this->codename;
    570 		$data['route'] = $this->route;
    571 		$data['version'] = $this->extension['version'];
    572 		$data['config'] = $this->config_file;
    573 		$data['d_shopunity'] = $this->d_shopunity;
    574 		$data['store_id'] = $store_id;
    575 		$data['stores'] = $this->{'model_extension_module_' . $this->codename}->getStores();
    576 		$data['languages'] = $this->{'model_extension_module_' . $this->codename}->getLanguages();
    577 
    578 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
    579 		$data['installed'] = in_array($this->codename, $installed_seo_extensions) ? true : false;
    580 
    581 		if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
    582 			$data['server'] = HTTPS_SERVER;
    583 			$data['catalog'] = HTTPS_CATALOG;
    584 		} else {
    585 			$data['server'] = HTTP_SERVER;
    586 			$data['catalog'] = HTTP_CATALOG;
    587 		}
    588 		
    589 		// Action
    590 		$data['href_dashboard'] = $this->url->link($this->route . '/dashboard', $url_token . '&' . $url_store, true);
    591 		$data['href_setting'] = $this->url->link($this->route . '/setting', $url_token . '&' . $url_store, true);
    592 		$data['href_multi_store_field'] = $this->url->link($this->route . '/multi_store_field', $url_token . '&' . $url_store, true);
    593 		$data['href_target_keyword'] = $this->url->link($this->route . '/target_keyword', $url_token . '&' . $url_store, true);
    594 		$data['href_export_import'] = $this->url->link($this->route . '/export_import', $url_token . '&' . $url_store, true);
    595 		$data['href_instruction'] = $this->url->link($this->route . '/instruction', $url_token . '&' . $url_store, true);
    596 			
    597 		$data['action'] = $this->url->link($this->route . '/save', $url_token, true);
    598 		$data['setup'] = $this->url->link($this->route . '/setupExtension', $url_token, true);
    599 		$data['install'] = $this->url->link($this->route . '/installExtension', $url_token, true);
    600 					
    601 		if (VERSION >= '3.0.0.0') {
    602 			$data['cancel'] = $this->url->link('marketplace/extension', $url_token . '&type=module', true);
    603 		} elseif (VERSION >= '2.3.0.0') {
    604 			$data['cancel'] = $this->url->link('extension/extension', $url_token . '&type=module', true);
    605 		} else {
    606 			$data['cancel'] = $this->url->link('extension/module', $url_token, true);
    607 		}
    608 		
    609 		// Tab
    610 		$data['text_dashboard'] = $this->language->get('text_dashboard');
    611 		$data['text_settings'] = $this->language->get('text_settings');
    612 		$data['text_multi_store_fields'] = $this->language->get('text_multi_store_fields');
    613 		$data['text_target_keywords'] = $this->language->get('text_target_keywords');
    614 		$data['text_export_import'] = $this->language->get('text_export_import');
    615 		$data['text_instructions'] = $this->language->get('text_instructions');
    616 		
    617 		// Button
    618 		$data['button_save'] = $this->language->get('button_save');
    619 		$data['button_save_and_stay'] = $this->language->get('button_save_and_stay');
    620 		$data['button_cancel'] = $this->language->get('button_cancel');
    621 		$data['button_setup'] = $this->language->get('button_setup');
    622 						
    623 		// Column
    624 		$data['column_field'] = $this->language->get('column_field');
    625 		$data['column_multi_store_status'] = $this->language->get('column_multi_store_status');
    626 				
    627 		// Text
    628 		$data['text_edit'] = $this->language->get('text_edit');
    629 		$data['text_install'] = $this->language->get('text_install');
    630 		$data['text_setup'] = $this->language->get('text_setup');
    631 		$data['text_full_setup'] = $this->language->get('text_full_setup');
    632 		$data['text_custom_setup'] = $this->language->get('text_custom_setup');
    633 		$data['text_yes'] = $this->language->get('text_yes');
    634 		$data['text_no'] = $this->language->get('text_no');
    635 		$data['text_enabled'] = $this->language->get('text_enabled');
    636 		$data['text_disabled'] = $this->language->get('text_disabled');
    637 		$data['text_powered_by'] = $this->language->get('text_powered_by');
    638 		
    639 		// Help
    640 		$data['help_setup'] = $this->language->get('help_setup');
    641 		$data['help_full_setup'] = $this->language->get('help_full_setup');
    642 		$data['help_custom_setup'] = $this->language->get('help_custom_setup');
    643 				
    644 		// Notification
    645 		foreach ($this->error as $key => $error) {
    646 			$data['error'][$key] = $error;
    647 		}
    648 
    649 		if (isset($this->session->data['success'])) {
    650 			$data['success'] = $this->session->data['success'];
    651 			unset($this->session->data['success']);
    652 		} else {
    653 			$data['success'] = '';
    654 		}
    655 
    656 		// Breadcrumbs
    657 		$data['breadcrumbs'] = array();
    658 
    659 		$data['breadcrumbs'][] = array(
    660 			'text' => $this->language->get('text_home'),
    661 			'href' => $this->url->link('common/dashboard', $url_token, true)
    662 		);
    663 				
    664 		if (VERSION >= '3.0.0.0') {
    665 			$data['breadcrumbs'][] = array(
    666 				'text' => $this->language->get('text_modules'),
    667 				'href' => $this->url->link('marketplace/extension', $url_token . '&type=module', true)
    668 			);
    669 		} elseif (VERSION >= '2.3.0.0') {
    670 			$data['breadcrumbs'][] = array(
    671 				'text' => $this->language->get('text_modules'),
    672 				'href' => $this->url->link('extension/extension', $url_token . '&type=module', true)
    673 			);
    674 		} else {
    675 			$data['breadcrumbs'][] = array(
    676 				'text' => $this->language->get('text_modules'),
    677 				'href' => $this->url->link('extension/module', $url_token, true)
    678 			);
    679 		}
    680 
    681 		$data['breadcrumbs'][] = array(
    682 			'text' => $this->language->get('text_seo_module'),
    683 			'href' => $this->url->link($this->route, $url_token . '&' . $url_store, true)
    684 		);
    685 		
    686 		$data['header'] = $this->load->controller('common/header');
    687 		$data['column_left'] = $this->load->controller('common/column_left');
    688 		$data['footer'] = $this->load->controller('common/footer');
    689 		
    690 		if ($data['installed']) {
    691 			$data['field_setting'] = $this->getFieldInfo();
    692 			
    693 			$this->response->setOutput($this->load->view($this->route . '/multi_store_field', $data));
    694 		} else {
    695 			// Setting
    696 			$this->config->load($this->config_file);
    697 			$config_feature_setting = ($this->config->get($this->codename . '_feature_setting')) ? $this->config->get($this->codename . '_feature_setting') : array();
    698 		
    699 			$data['features'] = array();
    700 		
    701 			foreach ($config_feature_setting as $feature) {
    702 				if (substr($feature['name'], 0, strlen('text_')) == 'text_') {
    703 					$feature['name'] = $this->language->get($feature['name']);
    704 				}
    705 						
    706 				$data['features'][] = $feature;
    707 			}
    708 			
    709 			$this->response->setOutput($this->load->view($this->route . '/install', $data));
    710 		}
    711 	}
    712 	
    713 	public function target_keyword() {
    714 		$this->load->language($this->route);
    715 		
    716 		$this->load->model($this->route);
    717 		$this->load->model('setting/setting');
    718 		$this->load->model('localisation/language');
    719 		
    720 		if ($this->d_shopunity) {		
    721 			$this->load->model('extension/d_shopunity/mbooth');
    722 				
    723 			$this->model_extension_d_shopunity_mbooth->validateDependencies($this->codename);
    724 		}
    725 		
    726 		if (file_exists(DIR_APPLICATION . 'model/extension/module/d_twig_manager.php')) {
    727 			$this->load->model('extension/module/d_twig_manager');
    728 			
    729 			$this->model_extension_module_d_twig_manager->installCompatibility();
    730 		}
    731 		
    732 		$this->update();
    733 		
    734 		if (isset($this->request->get['store_id'])) { 
    735 			$store_id = $this->request->get['store_id']; 
    736 		} else {  
    737 			$store_id = 0;
    738 		}
    739 		
    740 		if (isset($this->request->get['sheet_code'])) { 
    741 			$sheet_code = $this->request->get['sheet_code']; 
    742 		} else {  
    743 			$sheet_code = 'category';
    744 		}
    745 		
    746 		if (isset($this->request->get['page'])) {
    747 			$page = $this->request->get['page'];
    748 		} else {
    749 			$page = 1;
    750 		}
    751 		
    752 		$url_token = '';
    753 		
    754 		if (isset($this->session->data['token'])) {
    755 			$url_token .= 'token=' . $this->session->data['token'];
    756 		}
    757 		
    758 		if (isset($this->session->data['user_token'])) {
    759 			$url_token .= 'user_token=' . $this->session->data['user_token'];
    760 		}
    761 		
    762 		$url_store = 'store_id=' . $store_id;
    763 		$url_sheet = 'sheet_code=' . $sheet_code;
    764 		$url_page = 'page=' . $page;
    765 				
    766 		// Styles and Scripts
    767 		$this->document->addStyle('view/stylesheet/d_bootstrap_extra/bootstrap.css');
    768 		$this->document->addScript('view/javascript/d_bootstrap_switch/js/bootstrap-switch.min.js');
    769         $this->document->addStyle('view/javascript/d_bootstrap_switch/css/bootstrap-switch.css');
    770 		$this->document->addStyle('view/stylesheet/d_admin_style/core/normalize/normalize.css');
    771 		$this->document->addStyle('view/stylesheet/d_admin_style/themes/light/light.css');
    772 		$this->document->addStyle('view/stylesheet/d_seo_module.css');
    773 						
    774 		// Heading
    775 		$this->document->setTitle($this->language->get('heading_title_main'));
    776 		$data['heading_title'] = $this->language->get('heading_title_main');
    777 		
    778 		// Variable
    779 		$data['codename'] = $this->codename;
    780 		$data['route'] = $this->route;
    781 		$data['version'] = $this->extension['version'];
    782 		$data['config'] = $this->config_file;
    783 		$data['d_shopunity'] = $this->d_shopunity;
    784 		$data['store_id'] = $store_id;
    785 		$data['sheet_code'] = $sheet_code;
    786 		$data['page'] = $page;
    787 		$data['url_token'] = $url_token;
    788 		$data['stores'] = $this->{'model_extension_module_' . $this->codename}->getStores();
    789 		$data['languages'] = $this->{'model_extension_module_' . $this->codename}->getLanguages();
    790 		
    791 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
    792 		$data['installed'] = in_array($this->codename, $installed_seo_extensions) ? true : false;
    793 						
    794 		if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
    795 			$data['server'] = HTTPS_SERVER;
    796 			$data['catalog'] = HTTPS_CATALOG;
    797 		} else {
    798 			$data['server'] = HTTP_SERVER;
    799 			$data['catalog'] = HTTP_CATALOG;
    800 		}
    801 						
    802 		// Action
    803 		$data['href_dashboard'] = $this->url->link($this->route . '/dashboard', $url_token . '&' . $url_store, true);
    804 		$data['href_setting'] = $this->url->link($this->route . '/setting', $url_token . '&' . $url_store, true);
    805 		$data['href_multi_store_field'] = $this->url->link($this->route . '/multi_store_field', $url_token . '&' . $url_store, true);
    806 		$data['href_target_keyword'] = $this->url->link($this->route . '/target_keyword', $url_token . '&' . $url_store, true);
    807 		$data['href_export_import'] = $this->url->link($this->route . '/export_import', $url_token . '&' . $url_store, true);
    808 		$data['href_instruction'] = $this->url->link($this->route . '/instruction', $url_token . '&' . $url_store, true);
    809 		
    810 		$data['module_link'] = $this->url->link($this->route, $url_token . '&' . $url_store, true);
    811 		$data['store_url'] = $this->url->link($this->route . '/target_keyword', $url_token . '&' . $url_sheet, true);
    812 		$data['setup'] = $this->url->link($this->route . '/setupExtension', $url_token, true);
    813 		$data['install'] = $this->url->link($this->route . '/installExtension', $url_token, true);
    814 		
    815 		if (VERSION >= '3.0.0.0') {
    816 			$data['cancel'] = $this->url->link('marketplace/extension', $url_token . '&type=module', true);
    817 		} elseif (VERSION >= '2.3.0.0') {
    818 			$data['cancel'] = $this->url->link('extension/extension', $url_token . '&type=module', true);
    819 		} else {
    820 			$data['cancel'] = $this->url->link('extension/module', $url_token, true);
    821 		}
    822 		
    823 		// Tab
    824 		$data['text_dashboard'] = $this->language->get('text_dashboard');
    825 		$data['text_settings'] = $this->language->get('text_settings');
    826 		$data['text_multi_store_fields'] = $this->language->get('text_multi_store_fields');
    827 		$data['text_target_keywords'] = $this->language->get('text_target_keywords');
    828 		$data['text_export_import'] = $this->language->get('text_export_import');
    829 		$data['text_instructions'] = $this->language->get('text_instructions');
    830 								
    831 		// Button
    832 		$data['button_save'] = $this->language->get('button_save');
    833 		$data['button_save_and_stay'] = $this->language->get('button_save_and_stay');
    834 		$data['button_cancel'] = $this->language->get('button_cancel');	
    835 		$data['button_setup'] = $this->language->get('button_setup');
    836 		$data['button_filter'] = $this->language->get('button_filter');
    837 		$data['button_clear_filter'] = $this->language->get('button_clear_filter');
    838 		$data['button_create_default_target_keywords'] = $this->language->get('button_create_default_target_keywords');
    839 		$data['button_add_target_keyword'] = $this->language->get('button_add_target_keyword');
    840 		$data['button_delete_target_keywords'] = $this->language->get('button_delete_target_keywords');	
    841 						
    842 		// Column
    843 		$data['column_route'] = $this->language->get('column_route');
    844 		$data['column_target_keyword'] = $this->language->get('column_target_keyword');
    845 		
    846 		// Entry
    847 		$data['entry_route'] = $this->language->get('entry_route');
    848 		$data['entry_target_keyword'] = $this->language->get('entry_target_keyword');
    849 				
    850 		// Text
    851 		$data['text_edit'] = $this->language->get('text_edit');
    852 		$data['text_install'] = $this->language->get('text_install');
    853 		$data['text_setup'] = $this->language->get('text_setup');
    854 		$data['text_full_setup'] = $this->language->get('text_full_setup');
    855 		$data['text_custom_setup'] = $this->language->get('text_custom_setup');
    856 		$data['text_yes'] = $this->language->get('text_yes');
    857 		$data['text_no'] = $this->language->get('text_no');
    858 		$data['text_enabled'] = $this->language->get('text_enabled');
    859 		$data['text_disabled'] = $this->language->get('text_disabled');
    860 		$data['text_powered_by'] = $this->language->get('text_powered_by');
    861 		
    862 		$data['text_no_results'] = $this->language->get('text_no_results');
    863 		$data['text_add_target_keyword'] = $this->language->get('text_add_target_keyword');
    864 		$data['text_delete_target_keywords_confirm'] = $this->language->get('text_delete_target_keywords_confirm');
    865 		$data['text_create_default_target_keywords_confirm'] = $this->language->get('text_create_default_target_keywords_confirm');
    866 		
    867 		// Help
    868 		$data['help_setup'] = $this->language->get('help_setup');
    869 		$data['help_full_setup'] = $this->language->get('help_full_setup');
    870 		$data['help_custom_setup'] = $this->language->get('help_custom_setup');
    871 		
    872 		// Notification
    873 		foreach ($this->error as $key => $error) {
    874 			$data['error'][$key] = $error;
    875 		}
    876 		
    877 		if (isset($this->session->data['success'])) {
    878 			$data['success'] = $this->session->data['success'];
    879 			unset($this->session->data['success']);
    880 		} else {
    881 			$data['success'] = '';
    882 		}
    883 		
    884 		if (isset($this->request->post['selected'])) {
    885 			$data['selected'] = (array)$this->request->post['selected'];
    886 		} else {
    887 			$data['selected'] = array();
    888 		}
    889 		
    890 		if (isset($this->request->post['clear_filter'])) {
    891 			if ($this->request->post['clear_filter']) {	
    892 				unset($this->request->post['filter']);
    893 				unset($this->session->data[$this->codename . '_filter_' . $sheet_code]);
    894 			}
    895 		}
    896 		
    897 		if (isset($this->request->post['filter'])) {
    898 			$filter = $this->request->post['filter'];
    899 			$i = 0;
    900 			
    901 			foreach($filter as $value) {
    902 				if ($value) $i++;
    903 			}
    904 			
    905 			if ($i > 0) {
    906 				$this->session->data[$this->codename . '_filter_' . $sheet_code] = $filter;
    907 			} else {
    908 				$filter = array();
    909 				unset($this->session->data[$this->codename . '_filter_' . $sheet_code]);
    910 			}
    911 		} elseif (isset($this->session->data[$this->codename . '_filter_' . $sheet_code])) {
    912 			$filter = $this->session->data[$this->codename . '_filter_' . $sheet_code];
    913 		} else {
    914 			$filter = array();
    915 			unset($this->session->data[$this->codename . '_filter_' . $sheet_code]);
    916 		}
    917 		
    918 		// Breadcrumbs
    919 		$data['breadcrumbs'] = array();
    920 
    921 		$data['breadcrumbs'][] = array(
    922 			'text' => $this->language->get('text_home'),
    923 			'href' => $this->url->link('common/dashboard', $url_token, true)
    924 		);
    925 
    926 		if (VERSION >= '3.0.0.0') {
    927 			$data['breadcrumbs'][] = array(
    928 				'text' => $this->language->get('text_modules'),
    929 				'href' => $this->url->link('marketplace/extension', $url_token . '&type=module', true)
    930 			);
    931 		} elseif (VERSION >= '2.3.0.0') {
    932 			$data['breadcrumbs'][] = array(
    933 				'text' => $this->language->get('text_modules'),
    934 				'href' => $this->url->link('extension/extension', $url_token . '&type=module', true)
    935 			);
    936 		} else {
    937 			$data['breadcrumbs'][] = array(
    938 				'text' => $this->language->get('text_modules'),
    939 				'href' => $this->url->link('extension/module', $url_token, true)
    940 			);
    941 		}
    942 
    943 		$data['breadcrumbs'][] = array(
    944 			'text' => $this->language->get('text_seo_module'),
    945 			'href' => $this->url->link($this->route, $url_token . '&' . $url_store, true)
    946 		);
    947 		
    948 		$data['header'] = $this->load->controller('common/header');
    949 		$data['column_left'] = $this->load->controller('common/column_left');
    950 		$data['footer'] = $this->load->controller('common/footer');
    951 		
    952 		if ($data['installed']) {		
    953 			// Setting 		
    954 			$this->config->load($this->config_file);
    955 			$data['setting'] = ($this->config->get($this->codename . '_setting')) ? $this->config->get($this->codename . '_setting') : array();
    956 			
    957 			$setting = $this->model_setting_setting->getSetting('module_' . $this->codename, $store_id);
    958 			$setting = isset($setting['module_' . $this->codename . '_setting']) ? $setting['module_' . $this->codename . '_setting'] : array();
    959 										
    960 			if (!empty($setting)) {
    961 				$data['setting'] = array_replace_recursive($data['setting'], $setting);
    962 			}
    963 
    964 			$target_setting = array();
    965 		
    966 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
    967 		
    968 			foreach ($installed_seo_extensions as $installed_seo_extension) {
    969 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/target_config');
    970 				if ($info) $target_setting = array_replace_recursive($target_setting, $info);
    971 			}
    972 		
    973 			$sheets = array();
    974 		
    975 			foreach ($target_setting['sheet'] as $sheet) {
    976 				if (isset($sheet['code']) && isset($sheet['icon']) && isset($sheet['name']) && isset($sheet['sort_order'])) {								
    977 					$sheets[] = array(
    978 						'code'			=> $sheet['code'],
    979 						'icon'			=> $sheet['icon'],
    980 						'name'			=> $sheet['name'],
    981 						'sort_order'	=> $sheet['sort_order'],
    982 						'url'			=> $this->url->link($this->route . '/target_keyword', $url_token . '&' . $url_store . '&sheet_code=' . $sheet['code'], true)
    983 					);
    984 				}
    985 			}
    986 						
    987 			$sheets = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($sheets, 'sort_order');
    988 			
    989 			$filter_data = array(
    990 				'store_id'			=> $store_id,
    991 				'sheet_code'		=> $sheet_code,
    992 				'filter'	  	  	=> $filter
    993 			);
    994 			
    995 			$target_elements = array();
    996 						
    997 			foreach ($installed_seo_extensions as $installed_seo_extension) {
    998 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/target_elements', $filter_data);
    999 				if ($info) $target_elements = array_replace_recursive($target_elements, $info);
   1000 			}
   1001 				
   1002 			$data['target_elements'] = array();
   1003 		
   1004 			$i = 0;
   1005 			
   1006 			foreach ($target_elements as $target_element) {
   1007 				if (isset($target_element['target_keyword'])) {
   1008 					foreach ($target_element['target_keyword'] as $language_id => $target_keyword) {
   1009 						foreach ($target_keyword as $sort_order => $keyword) {
   1010 							$field_data = array(
   1011 								'field_code' => 'target_keyword',
   1012 								'filter' => array(
   1013 									'store_id' => $store_id,
   1014 									'keyword' => $keyword
   1015 								)
   1016 							);
   1017 			
   1018 							$target_keywords = $this->getFieldElements($field_data);
   1019 							$store_target_keywords = reset($target_keywords);
   1020 							
   1021 							if ((count($target_keywords) > 1) || (count(reset($store_target_keywords)) > 1)) {
   1022 								$target_element['target_keyword_duplicate'][$language_id][$sort_order] = 1;
   1023 							}
   1024 						}
   1025 					}
   1026 				}
   1027 				
   1028 				if (($i >= (($page - 1) * $data['setting']['list_limit'])) && ($i < ((($page - 1) * $data['setting']['list_limit']) + $data['setting']['list_limit']))) {
   1029 					$data['target_elements'][] = $target_element;
   1030 				}
   1031 			
   1032 				$i++;
   1033 			
   1034 				if ($i == ((($page - 1) * $data['setting']['list_limit']) + $data['setting']['list_limit'])) break;
   1035 			}
   1036 							
   1037 			$pagination = new Pagination();
   1038 			$pagination->total = count($target_elements);
   1039 			$pagination->page = $page;
   1040 			$pagination->limit = $data['setting']['list_limit'];
   1041 			$pagination->url = $this->url->link($this->route . '/target_keyword', $url_token . '&' . $url_store . '&' . $url_sheet . '&page={page}', true);
   1042 
   1043 			$data['pagination'] = $pagination->render();
   1044 
   1045 			$data['results'] = sprintf($this->language->get('text_pagination'), (count($target_elements)) ? (($page - 1) * $data['setting']['list_limit']) + 1 : 0, ((($page - 1) * $data['setting']['list_limit']) > (count($target_elements) - $data['setting']['list_limit'])) ? count($target_elements) : ((($page - 1) * $data['setting']['list_limit']) + $data['setting']['list_limit']), count($target_elements), ceil(count($target_elements) / $data['setting']['list_limit']));
   1046 			
   1047 			$data['sheets'] = $sheets;
   1048 			$data['filter'] = $filter;
   1049 
   1050 			$this->response->setOutput($this->load->view($this->route . '/target_keyword', $data));
   1051 		} else {
   1052 			// Setting
   1053 			$this->config->load($this->config_file);
   1054 			$config_feature_setting = ($this->config->get($this->codename . '_feature_setting')) ? $this->config->get($this->codename . '_feature_setting') : array();
   1055 		
   1056 			$data['features'] = array();
   1057 		
   1058 			foreach ($config_feature_setting as $feature) {
   1059 				if (substr($feature['name'], 0, strlen('text_')) == 'text_') {
   1060 					$feature['name'] = $this->language->get($feature['name']);
   1061 				}
   1062 						
   1063 				$data['features'][] = $feature;
   1064 			}
   1065 			
   1066 			$this->response->setOutput($this->load->view($this->route . '/install', $data));
   1067 		}
   1068 	}
   1069 	
   1070 	public function export_import() {
   1071 		$this->load->language($this->route);
   1072 		
   1073 		$this->load->model($this->route);
   1074 		$this->load->model('setting/setting');
   1075 		$this->load->model('localisation/language');
   1076 		
   1077 		if ($this->d_shopunity) {		
   1078 			$this->load->model('extension/d_shopunity/mbooth');
   1079 				
   1080 			$this->model_extension_d_shopunity_mbooth->validateDependencies($this->codename);
   1081 		}
   1082 		
   1083 		if (file_exists(DIR_APPLICATION . 'model/extension/module/d_twig_manager.php')) {
   1084 			$this->load->model('extension/module/d_twig_manager');
   1085 			
   1086 			$this->model_extension_module_d_twig_manager->installCompatibility();
   1087 		}
   1088 		
   1089 		$this->update();
   1090 
   1091 		if (isset($this->request->get['store_id'])) { 
   1092 			$store_id = $this->request->get['store_id']; 
   1093 		} else {  
   1094 			$store_id = 0;
   1095 		}
   1096 		
   1097 		$url_token = '';
   1098 		
   1099 		if (isset($this->session->data['token'])) {
   1100 			$url_token .= 'token=' . $this->session->data['token'];
   1101 		}
   1102 		
   1103 		if (isset($this->session->data['user_token'])) {
   1104 			$url_token .= 'user_token=' . $this->session->data['user_token'];
   1105 		}
   1106 		
   1107 		$url_store = 'store_id=' . $store_id;
   1108 				
   1109 		// Styles and Scripts
   1110 		$this->document->addStyle('view/stylesheet/d_bootstrap_extra/bootstrap.css');
   1111 		$this->document->addScript('view/javascript/d_bootstrap_switch/js/bootstrap-switch.min.js');
   1112         $this->document->addStyle('view/javascript/d_bootstrap_switch/css/bootstrap-switch.css');
   1113 		$this->document->addStyle('view/stylesheet/d_admin_style/core/normalize/normalize.css');
   1114 		$this->document->addStyle('view/stylesheet/d_admin_style/themes/light/light.css');
   1115 		$this->document->addStyle('view/stylesheet/d_seo_module.css');
   1116 				
   1117 		// Heading
   1118 		$this->document->setTitle($this->language->get('heading_title_main'));
   1119 		$data['heading_title'] = $this->language->get('heading_title_main');
   1120 		
   1121 		// Variable
   1122 		$data['codename'] = $this->codename;
   1123 		$data['route'] = $this->route;
   1124 		$data['version'] = $this->extension['version'];
   1125 		$data['config'] = $this->config_file;
   1126 		$data['d_shopunity'] = $this->d_shopunity;
   1127 		$data['store_id'] = $store_id;
   1128 		$data['stores'] = $this->{'model_extension_module_' . $this->codename}->getStores();
   1129 				
   1130 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1131 		$data['installed'] = in_array($this->codename, $installed_seo_extensions) ? true : false;
   1132 						
   1133 		if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
   1134 			$data['server'] = HTTPS_SERVER;
   1135 			$data['catalog'] = HTTPS_CATALOG;
   1136 		} else {
   1137 			$data['server'] = HTTP_SERVER;
   1138 			$data['catalog'] = HTTP_CATALOG;
   1139 		}
   1140 										
   1141 		// Action
   1142 		$data['href_dashboard'] = $this->url->link($this->route . '/dashboard', $url_token . '&' . $url_store, true);
   1143 		$data['href_setting'] = $this->url->link($this->route . '/setting', $url_token . '&' . $url_store, true);
   1144 		$data['href_multi_store_field'] = $this->url->link($this->route . '/multi_store_field', $url_token . '&' . $url_store, true);
   1145 		$data['href_target_keyword'] = $this->url->link($this->route . '/target_keyword', $url_token . '&' . $url_store, true);
   1146 		$data['href_export_import'] = $this->url->link($this->route . '/export_import', $url_token . '&' . $url_store, true);
   1147 		$data['href_instruction'] = $this->url->link($this->route . '/instruction', $url_token . '&' . $url_store, true);
   1148 		
   1149 		$data['module_link'] = $this->url->link($this->route, $url_token . '&' . $url_store, true);
   1150 		$data['setup'] = $this->url->link($this->route . '/setupExtension', $url_token, true);
   1151 		$data['install'] = $this->url->link($this->route . '/installExtension', $url_token, true);
   1152 		$data['export'] = $this->url->link($this->route . '/export', $url_token, true);
   1153 		$data['import'] = $this->url->link($this->route . '/import', $url_token, true);
   1154 		
   1155 		if (VERSION >= '3.0.0.0') {
   1156 			$data['cancel'] = $this->url->link('marketplace/extension', $url_token . '&type=module', true);
   1157 		} elseif (VERSION >= '2.3.0.0') {
   1158 			$data['cancel'] = $this->url->link('extension/extension', $url_token . '&type=module', true);
   1159 		} else {
   1160 			$data['cancel'] = $this->url->link('extension/module', $url_token, true);
   1161 		}
   1162 		
   1163 		// Tab
   1164 		$data['text_dashboard'] = $this->language->get('text_dashboard');
   1165 		$data['text_settings'] = $this->language->get('text_settings');
   1166 		$data['text_multi_store_fields'] = $this->language->get('text_multi_store_fields');
   1167 		$data['text_target_keywords'] = $this->language->get('text_target_keywords');
   1168 		$data['text_export_import'] = $this->language->get('text_export_import');
   1169 		$data['text_instructions'] = $this->language->get('text_instructions');
   1170 		
   1171 		$data['text_export'] = $this->language->get('text_export');
   1172 		$data['text_import'] = $this->language->get('text_import');
   1173 				
   1174 		// Button
   1175 		$data['button_cancel'] = $this->language->get('button_cancel');	
   1176 		$data['button_setup'] = $this->language->get('button_setup');
   1177 		$data['button_export'] = $this->language->get('button_export');
   1178 		$data['button_import'] = $this->language->get('button_import');
   1179 				
   1180 		// Entry
   1181 		$data['entry_store'] = $this->language->get('entry_store');
   1182 		$data['entry_sheet'] = $this->language->get('entry_sheet');
   1183 		$data['entry_export'] = $this->language->get('entry_export');
   1184 		$data['entry_upload'] = $this->language->get('entry_upload');
   1185 		$data['entry_import'] = $this->language->get('entry_import');
   1186 				
   1187 		// Text
   1188 		$data['text_edit'] = $this->language->get('text_edit');
   1189 		$data['text_install'] = $this->language->get('text_install');
   1190 		$data['text_setup'] = $this->language->get('text_setup');
   1191 		$data['text_full_setup'] = $this->language->get('text_full_setup');
   1192 		$data['text_custom_setup'] = $this->language->get('text_custom_setup');
   1193 		$data['text_yes'] = $this->language->get('text_yes');
   1194 		$data['text_no'] = $this->language->get('text_no');
   1195 		$data['text_enabled'] = $this->language->get('text_enabled');
   1196 		$data['text_disabled'] = $this->language->get('text_disabled');
   1197 		$data['text_powered_by'] = $this->language->get('text_powered_by');
   1198 		
   1199 		// Help
   1200 		$data['help_setup'] = $this->language->get('help_setup');
   1201 		$data['help_full_setup'] = $this->language->get('help_full_setup');
   1202 		$data['help_custom_setup'] = $this->language->get('help_custom_setup');
   1203 		
   1204 		// Notification
   1205 		foreach ($this->error as $key => $error) {
   1206 			$data['error'][$key] = $error;
   1207 		}
   1208 		
   1209 		if (isset($this->session->data['success'])) {
   1210 			$data['success'] = $this->session->data['success'];
   1211 			unset($this->session->data['success']);
   1212 		} else {
   1213 			$data['success'] = '';
   1214 		}
   1215 		
   1216 		// Breadcrumbs
   1217 		$data['breadcrumbs'] = array();
   1218 
   1219 		$data['breadcrumbs'][] = array(
   1220 			'text' => $this->language->get('text_home'),
   1221 			'href' => $this->url->link('common/dashboard', $url_token, true)
   1222 		);
   1223 
   1224 		if (VERSION >= '3.0.0.0') {
   1225 			$data['breadcrumbs'][] = array(
   1226 				'text' => $this->language->get('text_modules'),
   1227 				'href' => $this->url->link('marketplace/extension', $url_token . '&type=module', true)
   1228 			);
   1229 		} elseif (VERSION >= '2.3.0.0') {
   1230 			$data['breadcrumbs'][] = array(
   1231 				'text' => $this->language->get('text_modules'),
   1232 				'href' => $this->url->link('extension/extension', $url_token . '&type=module', true)
   1233 			);
   1234 		} else {
   1235 			$data['breadcrumbs'][] = array(
   1236 				'text' => $this->language->get('text_modules'),
   1237 				'href' => $this->url->link('extension/module', $url_token, true)
   1238 			);
   1239 		}
   1240 
   1241 		$data['breadcrumbs'][] = array(
   1242 			'text' => $this->language->get('text_seo_module'),
   1243 			'href' => $this->url->link($this->route, $url_token . '&' . $url_store, true)
   1244 		);
   1245 		
   1246 		$data['header'] = $this->load->controller('common/header');
   1247 		$data['column_left'] = $this->load->controller('common/column_left');
   1248 		$data['footer'] = $this->load->controller('common/footer');
   1249 		
   1250 		if ($data['installed']) {
   1251 			// Setting 		
   1252 			$this->config->load($this->config_file);
   1253 			$data['setting'] = ($this->config->get($this->codename)) ? $this->config->get($this->codename) : array();
   1254 		
   1255 			$setting = $this->model_setting_setting->getSetting('module_' . $this->codename, $store_id);
   1256 			$setting = isset($setting['module_' . $this->codename . '_setting']) ? $setting['module_' . $this->codename . '_setting'] : array();
   1257 		
   1258 			if (!empty($setting)) {
   1259 				$data['setting'] = array_replace_recursive($data['setting'], $setting);
   1260 			}
   1261 			
   1262 			$this->response->setOutput($this->load->view($this->route . '/export_import', $data));
   1263 		} else {
   1264 			// Setting
   1265 			$this->config->load($this->config_file);
   1266 			$config_feature_setting = ($this->config->get($this->codename . '_feature_setting')) ? $this->config->get($this->codename . '_feature_setting') : array();
   1267 		
   1268 			$data['features'] = array();
   1269 		
   1270 			foreach ($config_feature_setting as $feature) {
   1271 				if (substr($feature['name'], 0, strlen('text_')) == 'text_') {
   1272 					$feature['name'] = $this->language->get($feature['name']);
   1273 				}
   1274 						
   1275 				$data['features'][] = $feature;
   1276 			}
   1277 			
   1278 			$this->response->setOutput($this->load->view($this->route . '/install', $data));
   1279 		}
   1280 	}
   1281 	
   1282 	public function instruction() {
   1283 		$this->load->language($this->route);
   1284 		
   1285 		$this->load->model($this->route);
   1286 		$this->load->model('setting/setting');
   1287 		$this->load->model('localisation/language');
   1288 		
   1289 		if ($this->d_shopunity) {		
   1290 			$this->load->model('extension/d_shopunity/mbooth');
   1291 				
   1292 			$this->model_extension_d_shopunity_mbooth->validateDependencies($this->codename);
   1293 		}
   1294 		
   1295 		if (file_exists(DIR_APPLICATION . 'model/extension/module/d_twig_manager.php')) {
   1296 			$this->load->model('extension/module/d_twig_manager');
   1297 			
   1298 			$this->model_extension_module_d_twig_manager->installCompatibility();
   1299 		}
   1300 		
   1301 		$this->update();
   1302 		
   1303 		if (isset($this->request->get['store_id'])) { 
   1304 			$store_id = $this->request->get['store_id']; 
   1305 		} else {  
   1306 			$store_id = 0;
   1307 		}
   1308 		
   1309 		$url_token = '';
   1310 		
   1311 		if (isset($this->session->data['token'])) {
   1312 			$url_token .= 'token=' . $this->session->data['token'];
   1313 		}
   1314 		
   1315 		if (isset($this->session->data['user_token'])) {
   1316 			$url_token .= 'user_token=' . $this->session->data['user_token'];
   1317 		}
   1318 		
   1319 		$url_store = 'store_id=' . $store_id;
   1320 		
   1321 		// Styles and Scripts
   1322 		$this->document->addStyle('view/stylesheet/d_bootstrap_extra/bootstrap.css');
   1323 		$this->document->addScript('view/javascript/d_bootstrap_switch/js/bootstrap-switch.min.js');
   1324         $this->document->addStyle('view/javascript/d_bootstrap_switch/css/bootstrap-switch.css');
   1325 		$this->document->addStyle('view/stylesheet/d_admin_style/core/normalize/normalize.css');
   1326 		$this->document->addStyle('view/stylesheet/d_admin_style/themes/light/light.css');
   1327 		$this->document->addStyle('view/stylesheet/d_seo_module.css');
   1328 				
   1329 		// Heading
   1330 		$this->document->setTitle($this->language->get('heading_title_main'));
   1331 		$data['heading_title'] = $this->language->get('heading_title_main');
   1332 		
   1333 		// Variable
   1334 		$data['codename'] = $this->codename;
   1335 		$data['route'] = $this->route;
   1336 		$data['version'] = $this->extension['version'];
   1337 		$data['config'] = $this->config_file;
   1338 		$data['d_shopunity'] = $this->d_shopunity;
   1339 		$data['store_id'] = $store_id;
   1340 						
   1341 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1342 		$data['installed'] = in_array($this->codename, $installed_seo_extensions) ? true : false;
   1343 						
   1344 		if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
   1345 			$data['server'] = HTTPS_SERVER;
   1346 			$data['catalog'] = HTTPS_CATALOG;
   1347 		} else {
   1348 			$data['server'] = HTTP_SERVER;
   1349 			$data['catalog'] = HTTP_CATALOG;
   1350 		}
   1351 						
   1352 		// Action
   1353 		$data['href_dashboard'] = $this->url->link($this->route . '/dashboard', $url_token . '&' . $url_store, true);
   1354 		$data['href_setting'] = $this->url->link($this->route . '/setting', $url_token . '&' . $url_store, true);
   1355 		$data['href_multi_store_field'] = $this->url->link($this->route . '/multi_store_field', $url_token . '&' . $url_store, true);
   1356 		$data['href_target_keyword'] = $this->url->link($this->route . '/target_keyword', $url_token . '&' . $url_store, true);
   1357 		$data['href_export_import'] = $this->url->link($this->route . '/export_import', $url_token . '&' . $url_store, true);
   1358 		$data['href_instruction'] = $this->url->link($this->route . '/instruction', $url_token . '&' . $url_store, true);
   1359 		
   1360 		$data['setup'] = $this->url->link($this->route . '/setupExtension', $url_token, true);
   1361 		$data['install'] = $this->url->link($this->route . '/installExtension', $url_token, true);
   1362 		
   1363 		if (VERSION >= '3.0.0.0') {
   1364 			$data['cancel'] = $this->url->link('marketplace/extension', $url_token . '&type=module', true);
   1365 		} elseif (VERSION >= '2.3.0.0') {
   1366 			$data['cancel'] = $this->url->link('extension/extension', $url_token . '&type=module', true);
   1367 		} else {
   1368 			$data['cancel'] = $this->url->link('extension/module', $url_token, true);
   1369 		}
   1370 		
   1371 		// Tab
   1372 		$data['text_dashboard'] = $this->language->get('text_dashboard');
   1373 		$data['text_settings'] = $this->language->get('text_settings');
   1374 		$data['text_multi_store_fields'] = $this->language->get('text_multi_store_fields');
   1375 		$data['text_target_keywords'] = $this->language->get('text_target_keywords');
   1376 		$data['text_export_import'] = $this->language->get('text_export_import');
   1377 		$data['text_instructions'] = $this->language->get('text_instructions');
   1378 						
   1379 		// Button
   1380 		$data['button_cancel'] = $this->language->get('button_cancel');	
   1381 		$data['button_setup'] = $this->language->get('button_setup');
   1382 												
   1383 		// Text
   1384 		$data['text_edit'] = $this->language->get('text_edit');
   1385 		$data['text_install'] = $this->language->get('text_install');
   1386 		$data['text_setup'] = $this->language->get('text_setup');
   1387 		$data['text_full_setup'] = $this->language->get('text_full_setup');
   1388 		$data['text_custom_setup'] = $this->language->get('text_custom_setup');
   1389 		$data['text_yes'] = $this->language->get('text_yes');
   1390 		$data['text_no'] = $this->language->get('text_no');
   1391 		$data['text_enabled'] = $this->language->get('text_enabled');
   1392 		$data['text_disabled'] = $this->language->get('text_disabled');
   1393 		$data['text_powered_by'] = $this->language->get('text_powered_by');
   1394 		$data['text_instructions_full'] = $this->language->get('text_instructions_full');
   1395 				
   1396 		// Help
   1397 		$data['help_setup'] = $this->language->get('help_setup');
   1398 		$data['help_full_setup'] = $this->language->get('help_full_setup');
   1399 		$data['help_custom_setup'] = $this->language->get('help_custom_setup');
   1400 		
   1401 		// Notification
   1402 		foreach ($this->error as $key => $error) {
   1403 			$data['error'][$key] = $error;
   1404 		}
   1405 		
   1406 		if (isset($this->session->data['success'])) {
   1407 			$data['success'] = $this->session->data['success'];
   1408 			unset($this->session->data['success']);
   1409 		} else {
   1410 			$data['success'] = '';
   1411 		}
   1412 		
   1413 		// Breadcrumbs
   1414 		$data['breadcrumbs'] = array();
   1415 
   1416 		$data['breadcrumbs'][] = array(
   1417 			'text' => $this->language->get('text_home'),
   1418 			'href' => $this->url->link('common/dashboard', $url_token, true)
   1419 		);
   1420 
   1421 		if (VERSION >= '3.0.0.0') {
   1422 			$data['breadcrumbs'][] = array(
   1423 				'text' => $this->language->get('text_modules'),
   1424 				'href' => $this->url->link('marketplace/extension', $url_token . '&type=module', true)
   1425 			);
   1426 		} elseif (VERSION >= '2.3.0.0') {
   1427 			$data['breadcrumbs'][] = array(
   1428 				'text' => $this->language->get('text_modules'),
   1429 				'href' => $this->url->link('extension/extension', $url_token . '&type=module', true)
   1430 			);
   1431 		} else {
   1432 			$data['breadcrumbs'][] = array(
   1433 				'text' => $this->language->get('text_modules'),
   1434 				'href' => $this->url->link('extension/module', $url_token, true)
   1435 			);
   1436 		}
   1437 
   1438 		$data['breadcrumbs'][] = array(
   1439 			'text' => $this->language->get('text_seo_module'),
   1440 			'href' => $this->url->link($this->route, $url_token . '&' . $url_store, true)
   1441 		);
   1442 		
   1443 		$data['header'] = $this->load->controller('common/header');
   1444 		$data['column_left'] = $this->load->controller('common/column_left');
   1445 		$data['footer'] = $this->load->controller('common/footer');
   1446 		
   1447 		if ($data['installed']) {
   1448 			$this->response->setOutput($this->load->view($this->route . '/instruction', $data));
   1449 		} else {
   1450 			// Setting
   1451 			$this->config->load($this->config_file);
   1452 			$config_feature_setting = ($this->config->get($this->codename . '_feature_setting')) ? $this->config->get($this->codename . '_feature_setting') : array();
   1453 		
   1454 			$data['features'] = array();
   1455 		
   1456 			foreach ($config_feature_setting as $feature) {
   1457 				if (substr($feature['name'], 0, strlen('text_')) == 'text_') {
   1458 					$feature['name'] = $this->language->get($feature['name']);
   1459 				}
   1460 						
   1461 				$data['features'][] = $feature;
   1462 			}
   1463 			
   1464 			$this->response->setOutput($this->load->view($this->route . '/install', $data));
   1465 		}
   1466 	}
   1467 
   1468 	public function save() {
   1469 		$this->load->language($this->route);
   1470 
   1471 		$this->load->model($this->route);
   1472 		$this->load->model('setting/setting');
   1473 		
   1474 		if (isset($this->request->get['store_id'])) { 
   1475 			$store_id = $this->request->get['store_id']; 
   1476 		} else {  
   1477 			$store_id = 0;
   1478 		}
   1479 
   1480 		if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {			
   1481 			$old_setting = $this->model_setting_setting->getSetting('module_' . $this->codename, $store_id);
   1482 			
   1483 			$new_setting = array_replace_recursive($old_setting, $this->request->post);
   1484 						
   1485 			if (isset($this->request->post['module_' . $this->codename . '_status']) && $this->request->post['module_' . $this->codename . '_status']) {
   1486 				$new_setting['module_' . $this->codename . '_setting']['control_element']['enable_status']['implemented'] = 1;
   1487 			}
   1488 
   1489 			if (isset($this->request->post['htaccess'])) {
   1490 				$this->{'model_extension_module_' . $this->codename}->saveFileData('htaccess', $this->request->post['htaccess']);
   1491 				
   1492 				if (isset($this->request->post['htaccess']['status']) && $this->request->post['htaccess']['status']) {
   1493 					$new_setting['module_' . $this->codename . '_setting']['control_element']['enable_htaccess']['implemented'] = 1;
   1494 				}
   1495 			}
   1496 			
   1497 			if (isset($this->request->post['robots'])) {
   1498 				$this->{'model_extension_module_' . $this->codename}->saveFileData('robots', $this->request->post['robots']);
   1499 				
   1500 				if (isset($this->request->post['robots']['status']) && $this->request->post['robots']['status']) {
   1501 					$new_setting['module_' . $this->codename . '_setting']['control_element']['enable_robots']['implemented'] = 1;
   1502 				}
   1503 			}
   1504 
   1505 			$this->model_setting_setting->editSetting('module_' . $this->codename, $new_setting, $store_id);
   1506 			
   1507 			$save_data = array(
   1508 				'old_setting'		=> $old_setting,
   1509 				'new_setting'		=> $new_setting,
   1510 				'store_id'			=> $store_id
   1511 			);			
   1512 
   1513 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1514 		
   1515 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   1516 				$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/save', $save_data);
   1517 			}			
   1518 			
   1519 			$data['success'] = $this->language->get('success_save');
   1520 		}
   1521 
   1522 		$data['error'] = $this->error;
   1523 
   1524 		$this->response->setOutput(json_encode($data));
   1525 	}
   1526 	
   1527 	public function installControlExtension() {
   1528 		$this->load->language($this->route);
   1529 		
   1530 		$data = array();
   1531 						
   1532 		if (isset($this->request->get['extension_code']) && $this->validate()) {
   1533 			$extension_code	= $this->request->get['extension_code'];
   1534 			
   1535 			if ($extension_code) {
   1536 				$info = $this->load->controller('extension/' . $this->codename . '/' . $extension_code . '/control_install_extension');
   1537 				if ($info) $data = $info;
   1538 			}
   1539 		}
   1540 						
   1541 		$this->response->setOutput(json_encode($data));
   1542 	}
   1543 	
   1544 	public function executeControlElement() {
   1545 		$this->load->language($this->route);
   1546 
   1547 		$this->load->model($this->route);
   1548 		$this->load->model('setting/setting');
   1549 		
   1550 		if (isset($this->request->get['store_id'])) { 
   1551 			$store_id = $this->request->get['store_id']; 
   1552 		} else {  
   1553 			$store_id = 0;
   1554 		}
   1555 				
   1556 		if (isset($this->request->get['extension_code']) && isset($this->request->get['element_code']) && $this->validate()) {
   1557 			$extension_code	= $this->request->get['extension_code'];
   1558 			$element_code = $this->request->get['element_code'];
   1559 			
   1560 			if ($extension_code && $element_code) {
   1561 				$control_element_data = array(
   1562 					'store_id'			=> $store_id,
   1563 					'element_code'		=> $element_code
   1564 				);
   1565 			
   1566 				$info = $this->load->controller('extension/' . $this->codename . '/' . $extension_code . '/control_execute_element', $control_element_data);
   1567 				
   1568 				if (isset($info['error'])) {
   1569 					$this->error = array_replace_recursive($this->error, $info['error']);
   1570 				}
   1571 			}
   1572 		}
   1573 		
   1574 		if (!$this->error) {					
   1575 			$data['success'] = $this->language->get('success_execute');
   1576 		}
   1577 		
   1578 		$data['error'] = $this->error;
   1579 					
   1580 		$this->response->setOutput(json_encode($data));
   1581 	}
   1582 	
   1583 	public function createDefaultTargetElements() {
   1584 		$this->load->language($this->route);
   1585 		
   1586 		$this->load->model($this->route);
   1587 		
   1588 		if (isset($this->request->get['store_id'])) { 
   1589 			$store_id = $this->request->get['store_id']; 
   1590 		} else {  
   1591 			$store_id = 0;
   1592 		}
   1593 		
   1594 		$this->config->load($this->config_file);
   1595 		$config_setting = ($this->config->get($this->codename . '_setting')) ? $this->config->get($this->codename . '_setting') : array();
   1596 								
   1597 		if ($this->validate()) {
   1598 			$this->{'model_extension_module_' . $this->codename}->createDefaultTargetElements($config_setting['default_target_keywords'], $store_id);
   1599 						
   1600 			$data['success'] = $this->language->get('success_create_default_target_keywords');
   1601 		}
   1602 		
   1603 		$data['error'] = $this->error;
   1604 				
   1605 		$this->response->setOutput(json_encode($data));
   1606 	}
   1607 	
   1608 	public function addTargetElement() {
   1609 		$this->load->language($this->route);
   1610 		
   1611 		$this->load->model($this->route);
   1612 		
   1613 		if (isset($this->request->get['store_id'])) { 
   1614 			$store_id = $this->request->get['store_id']; 
   1615 		} else {  
   1616 			$store_id = 0;
   1617 		}
   1618 				
   1619 		if (isset($this->request->post['target_element']) && $this->validateAddTargetElement()) {			
   1620 			$target_element_data = $this->request->post['target_element'];
   1621 			$target_element_data['store_id'] = $store_id;
   1622 						
   1623 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1624 			
   1625 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   1626 				$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/add_target_element', $target_element_data);
   1627 			}
   1628 									
   1629 			$data['success'] = $this->language->get('success_add_target_keyword');
   1630 		}
   1631 		
   1632 		$data['error'] = $this->error;
   1633 				
   1634 		$this->response->setOutput(json_encode($data));
   1635 	}
   1636 	
   1637 	public function editTargetElement() {
   1638 		$this->load->language($this->route);
   1639 		
   1640 		$this->load->model($this->route);
   1641 		
   1642 		if (isset($this->request->get['store_id'])) { 
   1643 			$store_id = $this->request->get['store_id']; 
   1644 		} else {  
   1645 			$store_id = 0;
   1646 		}
   1647 		
   1648 		if (isset($this->request->post['route']) && isset($this->request->post['language_id']) && isset($this->request->post['target_keyword']) && $this->validateEditTargetElement()) {
   1649 			$target_element_data = array(
   1650 				'route'				=> $this->request->post['route'],
   1651 				'store_id'			=> $store_id,
   1652 				'language_id'		=> $this->request->post['language_id'],
   1653 				'target_keyword'	=> $this->request->post['target_keyword']
   1654 			);
   1655 		
   1656 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1657 			
   1658 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   1659 				$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/edit_target_element', $target_element_data);
   1660 			}
   1661 		}
   1662 			
   1663 		$data['error'] = $this->error;
   1664 		
   1665 		$this->response->setOutput(json_encode($data));
   1666 	}
   1667 		
   1668 	public function deleteTargetElements() {
   1669 		$this->load->language($this->route);
   1670 		
   1671 		$this->load->model($this->route);
   1672 		
   1673 		if (isset($this->request->get['store_id'])) { 
   1674 			$store_id = $this->request->get['store_id']; 
   1675 		} else {  
   1676 			$store_id = 0;
   1677 		}
   1678 				
   1679 		if (isset($this->request->post['selected']) && $this->validate()) {
   1680 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1681 			
   1682 			foreach ($this->request->post['selected'] as $route) {			
   1683 				$target_element_data = array(
   1684 					'route'				=> $route,
   1685 					'store_id'			=> $store_id
   1686 				);
   1687 			
   1688 				foreach ($installed_seo_extensions as $installed_seo_extension) {
   1689 					$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/delete_target_element', $target_element_data);
   1690 				}
   1691 			}
   1692 			
   1693 			$data['success'] = $this->language->get('success_delete_target_keywords');
   1694 		}
   1695 		
   1696 		$data['error'] = $this->error;
   1697 				
   1698 		$this->response->setOutput(json_encode($data));
   1699 	}
   1700 	
   1701 	public function export() {
   1702 		$this->load->language($this->route);
   1703 		
   1704 		$this->load->model($this->route);
   1705 		$this->load->model('setting/setting');
   1706 		$this->load->model('localisation/language');
   1707 		
   1708 		if (isset($this->request->post['store_id'])) { 
   1709 			$store_id = $this->request->post['store_id']; 
   1710 		} else {  
   1711 			$store_id = 0;
   1712 		}
   1713 		
   1714 		if (isset($this->request->post['sheet_codes'])) { 
   1715 			$sheet_codes = $this->request->post['sheet_codes']; 
   1716 		} else {  
   1717 			$sheet_codes = array();
   1718 		}
   1719 		
   1720 		// Setting
   1721 		$target_setting = array();
   1722 		
   1723 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1724 		
   1725 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   1726 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/target_config');
   1727 			if ($info) $target_setting = array_replace_recursive($target_setting, $info);
   1728 		}
   1729 								
   1730 		$sheets = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($target_setting['sheet'], 'sort_order');
   1731 		
   1732 		$store = $this->{'model_extension_module_' . $this->codename}->getStore($store_id);
   1733 		$languages = $this->{'model_extension_module_' . $this->codename}->getLanguages();
   1734 		
   1735 		if (file_exists(DIR_SYSTEM . 'library/d_excel_reader_writer.php')) {
   1736 			$d_excel_reader_writer = new d_excel_reader_writer();
   1737 					
   1738 			foreach ($sheet_codes as $sheet_code) {			
   1739 				if ($sheet_code == 'target_keyword') {
   1740 					// Set the column widths				
   1741 					$column_widths = array(max(strlen('route') + 4, 30) + 1);
   1742 					
   1743 					foreach ($languages as $language) {
   1744 						$column_widths[] = max(strlen('target_keyword') + 4, 30) + 1;
   1745 					}
   1746 					
   1747 					$d_excel_reader_writer->setColumnWidths($column_widths);
   1748 		
   1749 					// The heading row and column styles									
   1750 					$header = array('route' => 'string');
   1751 					
   1752 					foreach ($languages as $language) {
   1753 						$header['target_keyword' . '(' . $language['code'] . ')'] = 'string';
   1754 					}
   1755 					
   1756 					$d_excel_reader_writer->writeSheetHeader($sheet_code, $header);
   1757 											
   1758 					// The actual custom pages data				
   1759 					foreach ($sheets as $sheet) {
   1760 						$export_data = array(
   1761 							'store_id'			=> $store_id,
   1762 							'sheet_code'		=> $sheet['code']
   1763 						);
   1764 			
   1765 						$target_elements = array();
   1766 						
   1767 						foreach ($installed_seo_extensions as $installed_seo_extension) {
   1768 							$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/export_target_elements', $export_data);
   1769 							if ($info) $target_elements = array_replace_recursive($target_elements, $info);
   1770 						}
   1771 						
   1772 						foreach ($target_elements as $route => $target_element) {
   1773 							$data = array(html_entity_decode($target_element['route'], ENT_QUOTES,'UTF-8'));
   1774 							
   1775 							foreach ($languages as $language) {
   1776 								if (isset($target_element['target_keyword'][$language['language_id']])) {
   1777 									$data[] = html_entity_decode($target_element['target_keyword'][$language['language_id']], ENT_QUOTES, 'UTF-8');
   1778 								} else {
   1779 									$data[] = '';
   1780 								}
   1781 							}
   1782 							
   1783 							$d_excel_reader_writer->writeSheetRow($sheet_code, $data);
   1784 						}
   1785 					}
   1786 				}
   1787 			}
   1788 						
   1789 			$filename = $this->codename . ' ' . $store['name'] . ' ' . date('Y-m-d') . '.xlsx';
   1790 					
   1791 			$this->response->addHeader('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
   1792 			$this->response->addHeader('Content-Disposition: attachment;filename="' . $filename . '"');
   1793 			$this->response->addHeader('Cache-Control: max-age=0');
   1794 			
   1795 			$this->response->setOutput($d_excel_reader_writer->writeToString());
   1796 		}
   1797 	}
   1798 	
   1799 	public function import() {
   1800 		$this->load->language($this->route);
   1801 		
   1802 		$this->load->model($this->route);
   1803 		$this->load->model('setting/setting');
   1804 		$this->load->model('localisation/language');
   1805 		
   1806 		if (isset($this->request->post['store_id'])) { 
   1807 			$store_id = $this->request->post['store_id']; 
   1808 		} else {  
   1809 			$store_id = 0;
   1810 		}
   1811 		
   1812 		// Setting
   1813 		$target_setting = array();
   1814 		
   1815 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1816 		
   1817 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   1818 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/target_config');
   1819 			if ($info) $target_setting = array_replace_recursive($target_setting, $info);
   1820 		}
   1821 								
   1822 		$sheets = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($target_setting['sheet'], 'sort_order');
   1823 		
   1824 		$languages = $this->{'model_extension_module_' . $this->codename}->getLanguages();
   1825 		
   1826 		if (($this->request->server['REQUEST_METHOD'] == 'POST') && ($this->validateImport())) {
   1827 			if ((isset($this->request->files['upload'])) && (is_uploaded_file($this->request->files['upload']['tmp_name'])) && file_exists(DIR_SYSTEM . 'library/d_excel_reader_writer.php')) {
   1828 				$filepath = $this->request->files['upload']['tmp_name'];
   1829 				$filename = $this->request->files['upload']['name'];
   1830 				$mimetype = $this->request->files['upload']['type'];
   1831 				
   1832 				$d_excel_reader_writer = new d_excel_reader_writer();
   1833 				
   1834 				// parse uploaded spreadsheet file
   1835 				$reader = $d_excel_reader_writer->readFromFile($filepath, $filename, $mimetype);
   1836 								
   1837 				// get worksheet if there
   1838 				$sheet_codes = $reader->Sheets();
   1839 				
   1840 				// get worksheet if there				
   1841 				foreach ($sheet_codes as $sheet_index => $sheet_code) {
   1842 					if ($sheet_code == 'target_keyword') {				
   1843 						$reader->ChangeSheet($sheet_index);
   1844 						
   1845 						$elements = array();
   1846 						$header = array();
   1847 						
   1848 						foreach ($reader as $row => $row_data) {
   1849 							if (!$header) {
   1850 								$header = $row_data;
   1851 																							
   1852 								continue;
   1853 							}
   1854 							
   1855 							foreach ($header as $col => $col_data) {
   1856 								$cell = isset($row_data[$col]) ? $row_data[$col] : '';
   1857 								$elements[$row][$header[$col]] = htmlspecialchars($cell);
   1858 							}
   1859 						}
   1860 								
   1861 						$target_elements = array();
   1862 					
   1863 						foreach ($elements as $element) {
   1864 							$target_element = array();
   1865 						
   1866 							if (isset($element['route']) && $element['route']) {
   1867 								$target_element['route'] = $element['route'];
   1868 							} else {
   1869 								continue;
   1870 							}
   1871 						
   1872 							$target_element['target_keyword'] = array();
   1873 						
   1874 							foreach ($languages as $language) {
   1875 								if (isset($element['target_keyword' . '(' . $language['code'] . ')'])) {
   1876 									$target_element['target_keyword'][$language['language_id']] = $element['target_keyword' . '(' . $language['code'] . ')'];
   1877 								}
   1878 							}
   1879 						
   1880 							$target_elements[] = $target_element;
   1881 						}
   1882 						
   1883 						$import_data = array(
   1884 							'store_id'			=> $store_id,
   1885 							'target_elements'	=> $target_elements
   1886 						);
   1887 										
   1888 						foreach ($installed_seo_extensions as $installed_seo_extension) {
   1889 							$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/import_target_elements', $import_data);
   1890 							
   1891 							if (isset($info['error'])) {
   1892 								$this->error = array_replace_recursive($this->error, $info['error']);
   1893 							}
   1894 						}
   1895 					}
   1896 				}
   1897 			}
   1898 		}
   1899 						
   1900 		$data['error'] = $this->error;
   1901 		
   1902 		if (!$this->error) {
   1903 			$data['success'] = $this->language->get('success_import');
   1904 		}
   1905 				
   1906 		$this->response->setOutput(json_encode($data));
   1907 	}
   1908 	
   1909 	public function setupExtension() {
   1910 		$this->load->model($this->route);
   1911 						
   1912 		$seo_extensions = $this->{'model_extension_module_' . $this->codename}->getSEOExtensions();
   1913 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1914 		
   1915 		// Install SEO Modules
   1916 		foreach ($seo_extensions as $seo_extension) {
   1917 			if (!in_array($seo_extension, $installed_seo_extensions)) {
   1918 				$info = $this->load->controller('extension/' . $this->codename . '/' . $seo_extension . '/control_install_extension');
   1919 				
   1920 				if (isset($info['error'])) {
   1921 					$this->error = array_replace_recursive($this->error, $info['error']);
   1922 				}
   1923 			}
   1924 		}
   1925 				
   1926 		if (!$this->error) {
   1927 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   1928 			
   1929 			$stores = $this->{'model_extension_module_' . $this->codename}->getStores();
   1930 				
   1931 			foreach ($stores as $store) {
   1932 				$control_elements = array();
   1933 		
   1934 				foreach ($installed_seo_extensions as $installed_seo_extension) {
   1935 					$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/control_elements', array('store_id' => $store['store_id']));
   1936 					if ($info) $control_elements = array_merge($control_elements, $info);
   1937 				}
   1938 				
   1939 				$control_elements = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($control_elements, 'weight', SORT_DESC);
   1940 				
   1941 				foreach ($control_elements as $control_element) {
   1942 					if (isset($control_element['extension_code']) && isset($control_element['element_code']) && isset($control_element['name']) && isset($control_element['description']) && isset($control_element['confirm']) && isset($control_element['implemented'])) {								
   1943 						if ($control_element['extension_code'] && $control_element['element_code']) {
   1944 							$control_element_data = array(
   1945 								'store_id'			=> $store['store_id'],
   1946 								'element_code'		=> $control_element['element_code']
   1947 							);
   1948 			
   1949 							$info = $this->load->controller('extension/' . $this->codename . '/' . $control_element['extension_code'] . '/control_execute_element', $control_element_data);
   1950 				
   1951 							if (isset($info['error'])) {
   1952 								$this->error = array_replace_recursive($this->error, $info['error']);
   1953 							}
   1954 						}
   1955 					}
   1956 				}
   1957 			}
   1958 		}
   1959 		
   1960 		$this->load->language($this->route);
   1961 		
   1962 		if (!$this->error) {
   1963 			$data['success'] = $this->language->get('success_install');
   1964 		}
   1965 		
   1966 		$data['error'] = $this->error;
   1967 
   1968 		$this->response->setOutput(json_encode($data));
   1969 	}
   1970 	
   1971 	public function installExtension() {
   1972 		$this->load->language($this->route);
   1973 
   1974 		$this->load->model($this->route);
   1975 		$this->load->model('setting/setting');
   1976 		$this->load->model('user/user_group');
   1977 		
   1978 		if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
   1979 			$server = HTTPS_SERVER;
   1980 			$catalog = HTTPS_CATALOG;
   1981 		} else {
   1982 			$server = HTTP_SERVER;
   1983 			$catalog = HTTP_CATALOG;
   1984 		}
   1985 		
   1986 		$catalog_url_info = $this->{'model_extension_module_' . $this->codename}->getURLInfo($catalog);
   1987 				
   1988 		if ($this->validateInstall()) {
   1989 			$this->{'model_extension_module_' . $this->codename}->installExtension();
   1990 						
   1991 			if (file_exists(DIR_APPLICATION . 'model/extension/module/d_event_manager.php')) {
   1992 				$this->load->model('extension/module/d_event_manager');
   1993 				
   1994 				$this->model_extension_module_d_event_manager->installCompatibility();				
   1995 				$this->model_extension_module_d_event_manager->deleteEvent($this->codename);
   1996 							
   1997 				if (VERSION >= '2.3.0.0') {
   1998 					$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/common/column_left/before', 'extension/module/d_seo_module/column_left_before');
   1999 				} else {
   2000 					$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/common/menu/after', 'extension/module/d_seo_module/menu_after');
   2001 					$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/common/dashboard/after', 'extension/module/d_seo_module/dashboard_after');
   2002 				}
   2003 				
   2004 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/common/header/after', 'extension/module/d_seo_module/header_after');
   2005 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/localisation/language/addLanguage/after', 'extension/module/d_seo_module/language_add_language_after');
   2006 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/localisation/language/editLanguage/after', 'extension/module/d_seo_module/language_edit_language_after');
   2007 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/localisation/language/deleteLanguage/after', 'extension/module/d_seo_module/language_delete_language_after');
   2008 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/setting/setting/after', 'extension/module/d_seo_module/setting_after');
   2009 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/setting/store_form/after', 'extension/module/d_seo_module/store_form_after');
   2010 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/setting/store/addStore/after', 'extension/module/d_seo_module/store_add_store_after');
   2011 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/setting/store/editStore/after', 'extension/module/d_seo_module/store_edit_store_after');
   2012 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/setting/store/deleteStore/after', 'extension/module/d_seo_module/store_delete_store_after');
   2013 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/catalog/category_form/after', 'extension/module/d_seo_module/category_form_after');
   2014 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/category/addCategory/after', 'extension/module/d_seo_module/category_add_category_after');
   2015 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/category/editCategory/after', 'extension/module/d_seo_module/category_edit_category_after');
   2016 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/category/deleteCategory/after', 'extension/module/d_seo_module/category_delete_category_after');
   2017 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/catalog/product_form/after', 'extension/module/d_seo_module/product_form_after');
   2018 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/product/addProduct/after', 'extension/module/d_seo_module/product_add_product_after');
   2019 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/product/editProduct/after', 'extension/module/d_seo_module/product_edit_product_after');
   2020 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/product/deleteProduct/after', 'extension/module/d_seo_module/product_delete_product_after');
   2021 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/catalog/manufacturer_form/after', 'extension/module/d_seo_module/manufacturer_form_after');
   2022 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/manufacturer/addManufacturer/after', 'extension/module/d_seo_module/manufacturer_add_manufacturer_after');
   2023 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/manufacturer/editManufacturer/after', 'extension/module/d_seo_module/manufacturer_edit_manufacturer_after');
   2024 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/manufacturer/deleteManufacturer/after', 'extension/module/d_seo_module/manufacturer_delete_manufacturer_after');
   2025 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/view/catalog/information_form/after', 'extension/module/d_seo_module/information_form_after');
   2026 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/information/addInformation/after', 'extension/module/d_seo_module/information_add_information_after');
   2027 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/information/editInformation/after', 'extension/module/d_seo_module/information_edit_information_after');
   2028 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'admin/model/catalog/information/deleteInformation/after', 'extension/module/d_seo_module/information_delete_information_after');
   2029 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/common/header/before', 'extension/module/d_seo_module/header_before');
   2030 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/common/header/after', 'extension/module/d_seo_module/header_after');
   2031 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/common/footer/before', 'extension/module/d_seo_module/footer_before');
   2032 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/common/footer/after', 'extension/module/d_seo_module/footer_after');
   2033 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/common/home/before', 'extension/module/d_seo_module/home_before');
   2034 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/common/home/after', 'extension/module/d_seo_module/home_after');
   2035 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/category/before', 'extension/module/d_seo_module/category_before');
   2036 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/category/after', 'extension/module/d_seo_module/category_after');
   2037 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/model/catalog/category/getCategory/after', 'extension/module/d_seo_module/category_get_category_after');
   2038 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/model/catalog/category/getCategories/after', 'extension/module/d_seo_module/category_get_categories_after');
   2039 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/product/before', 'extension/module/d_seo_module/product_before');
   2040 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/product/after', 'extension/module/d_seo_module/product_after');
   2041 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/model/catalog/product/getProduct/after', 'extension/module/d_seo_module/product_get_product_after');
   2042 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/model/catalog/product/getProducts/after', 'extension/module/d_seo_module/product_get_products_after');
   2043 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/manufacturer_list/before', 'extension/module/d_seo_module/manufacturer_list_before');
   2044 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/manufacturer_list/after', 'extension/module/d_seo_module/manufacturer_list_after');
   2045 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/manufacturer_info/before', 'extension/module/d_seo_module/manufacturer_info_before');
   2046 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/manufacturer_info/after', 'extension/module/d_seo_module/manufacturer_info_after');
   2047 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/model/catalog/manufacturer/getManufacturer/after', 'extension/module/d_seo_module/manufacturer_get_manufacturer_after');
   2048 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/model/catalog/manufacturer/getManufacturers/after', 'extension/module/d_seo_module/manufacturer_get_manufacturers_after');
   2049 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/information/information/before', 'extension/module/d_seo_module/information_before');
   2050 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/information/information/after', 'extension/module/d_seo_module/information_after');
   2051 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/model/catalog/information/getInformation/after', 'extension/module/d_seo_module/information_get_information_after');
   2052 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/model/catalog/information/getInformations/after', 'extension/module/d_seo_module/information_get_informations_after');
   2053 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/search/before', 'extension/module/d_seo_module/search_before');
   2054 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/search/after', 'extension/module/d_seo_module/search_after');
   2055 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/special/before', 'extension/module/d_seo_module/special_before');
   2056 				$this->model_extension_module_d_event_manager->addEvent($this->codename, 'catalog/view/product/special/after', 'extension/module/d_seo_module/special_after');
   2057 			}
   2058 			
   2059 			if (file_exists(DIR_APPLICATION . 'model/extension/d_opencart_patch/modification.php')) {
   2060 				$this->load->model('extension/d_opencart_patch/modification');
   2061 		
   2062 				$this->model_extension_d_opencart_patch_modification->setModification($this->codename . '.xml', 1);
   2063 				$this->model_extension_d_opencart_patch_modification->refreshCache();
   2064 			}
   2065 			
   2066 			if (file_exists(DIR_APPLICATION . 'model/extension/d_opencart_patch/extension.php')) {
   2067 				$this->load->model('extension/d_opencart_patch/extension');
   2068 				$this->load->model('extension/d_opencart_patch/user');
   2069 				
   2070 				$user_group_id = $this->model_extension_d_opencart_patch_user->getGroupId();
   2071 				
   2072 				// Install SEO Module
   2073 				if (!$this->model_extension_d_opencart_patch_extension->isInstalled('d_seo_module')) {
   2074 					$this->model_extension_d_opencart_patch_extension->install('module', 'd_seo_module');
   2075 				
   2076 					$this->model_user_user_group->addPermission($user_group_id, 'access', 'extension/module/d_seo_module');
   2077 					$this->model_user_user_group->addPermission($user_group_id, 'modify', 'extension/module/d_seo_module');
   2078 				}
   2079 				
   2080 				$stores = $this->{'model_extension_module_' . $this->codename}->getStores();
   2081 				
   2082 				foreach ($stores as $store) {
   2083 					$setting = $this->model_setting_setting->getSetting('module_' . $this->codename, $store['store_id']);
   2084 										
   2085 					$setting['module_' . $this->codename . '_status'] = 1;
   2086 					$setting['module_' . $this->codename . '_setting']['control_element']['enable_status']['implemented'] = 1;
   2087 					$setting['module_' . $this->codename . '_setting']['control_element']['enable_seo_url']['implemented'] = 1;
   2088 					$setting['module_' . $this->codename . '_setting']['control_element']['enable_htaccess']['implemented'] = 1;
   2089 					$setting['module_' . $this->codename . '_setting']['control_element']['enable_robots']['implemented'] = 1;
   2090 								
   2091 					$this->model_setting_setting->editSetting('module_' . $this->codename, $setting, $store['store_id']);
   2092 				}
   2093 				
   2094 				$store_setting = $this->model_setting_setting->getSetting('config');
   2095 				$store_setting['config_seo_url'] = 1;
   2096 			
   2097 				$this->model_setting_setting->editSetting('config', $store_setting);
   2098 				
   2099 				$this->config->load($this->config_file);
   2100 				$config_setting = ($this->config->get($this->codename . '_setting')) ? $this->config->get($this->codename . '_setting') : array();
   2101 				
   2102 				$htaccess = $this->{'model_extension_module_' . $this->codename}->getFileData('htaccess');		
   2103 			
   2104 				if (!$htaccess['status'] && !trim($htaccess['text'])) {
   2105 					$htaccess['text'] = str_replace('[catalog_url_path]', $catalog_url_info['path'], $config_setting['default_htaccess']);
   2106 				}
   2107 			
   2108 				$htaccess['status'] = 1;
   2109 		
   2110 				$this->{'model_extension_module_' . $this->codename}->saveFileData('htaccess', $htaccess);
   2111 				
   2112 				$robots = $this->{'model_extension_module_' . $this->codename}->getFileData('robots');		
   2113 			
   2114 				if (!$robots['status'] && !trim($robots['text'])) {
   2115 					$robots['text'] = str_replace('[catalog_url]', $catalog, $config_setting['default_robots']);
   2116 					$robots['text'] = str_replace('[catalog_url_host]', $catalog_url_info['host'], $robots['text']);
   2117 				}
   2118 			
   2119 				$robots['status'] = 1;
   2120 			
   2121 				$this->{'model_extension_module_' . $this->codename}->saveFileData('robots', $robots);
   2122 												
   2123 				// Install SEO Module Target Keyword
   2124 				if (!$this->model_extension_d_opencart_patch_extension->isInstalled('d_seo_module_target_keyword')) {
   2125 					$this->model_extension_d_opencart_patch_extension->install('dashboard', 'd_seo_module_target_keyword');
   2126 			
   2127 					$setting = array(
   2128 						'dashboard_d_seo_module_target_keyword_status' => true,
   2129 						'dashboard_d_seo_module_target_keyword_width' => 12,
   2130 						'dashboard_d_seo_module_target_keyword_sort_order' => 20
   2131 					);
   2132 				
   2133 					$stores = $this->{'model_extension_module_' . $this->codename}->getStores();
   2134 				
   2135 					foreach ($stores as $store) {
   2136 						$setting['dashboard_d_seo_module_target_keyword_setting']['stores_id'][] = $store['store_id'];
   2137 					}
   2138 			
   2139 					$this->model_setting_setting->editSetting('dashboard_d_seo_module_target_keyword', $setting);
   2140 					
   2141 					$this->model_user_user_group->addPermission($user_group_id, 'access', 'extension/dashboard');
   2142 					$this->model_user_user_group->addPermission($user_group_id, 'modify', 'extension/dashboard');					
   2143 					$this->model_user_user_group->addPermission($user_group_id, 'access', 'extension/dashboard/d_seo_module_target_keyword');
   2144 					$this->model_user_user_group->addPermission($user_group_id, 'modify', 'extension/dashboard/d_seo_module_target_keyword');
   2145 				}
   2146 			}
   2147 			
   2148 			$data['success'] = $this->language->get('success_install');
   2149 		}
   2150 
   2151 		$data['error'] = $this->error;
   2152 
   2153 		$this->response->setOutput(json_encode($data));
   2154 	}
   2155 
   2156 	public function uninstallExtension() {
   2157 		$this->load->language($this->route);
   2158 
   2159 		$this->load->model($this->route);
   2160 		$this->load->model('setting/setting');
   2161 		$this->load->model('user/user_group');
   2162 						
   2163 		if ($this->validateUninstall()) {			
   2164 			$this->{'model_extension_module_' . $this->codename}->uninstallExtension();
   2165 			
   2166 			if (file_exists(DIR_APPLICATION . 'model/extension/module/d_event_manager.php')) {
   2167 				$this->load->model('extension/module/d_event_manager');
   2168 				
   2169 				$this->model_extension_module_d_event_manager->deleteEvent($this->codename);
   2170 			}
   2171 			
   2172 			if (file_exists(DIR_APPLICATION . 'model/extension/d_opencart_patch/modification.php')) {
   2173 				$this->load->model('extension/d_opencart_patch/modification');
   2174 		
   2175 				$this->model_extension_d_opencart_patch_modification->setModification($this->codename . '.xml', 0);
   2176 				$this->model_extension_d_opencart_patch_modification->refreshCache();
   2177 			}
   2178 			
   2179 			if (file_exists(DIR_APPLICATION . 'model/extension/d_opencart_patch/extension.php')) {
   2180 				$this->load->model('extension/d_opencart_patch/extension');
   2181 				$this->load->model('extension/d_opencart_patch/user');
   2182 				
   2183 				$user_group_id = $this->model_extension_d_opencart_patch_user->getGroupId();
   2184 				
   2185 				// Uninstall SEO Module Target Keyword
   2186 				if ($this->model_extension_d_opencart_patch_extension->isInstalled('d_seo_module_target_keyword')) {
   2187 					$this->model_extension_d_opencart_patch_extension->uninstall('dashboard', 'd_seo_module_target_keyword');
   2188 					$this->model_setting_setting->deleteSetting('dashboard_d_seo_module_target_keyword');
   2189 						
   2190 					$this->model_user_user_group->removePermission($user_group_id, 'access', 'extension/dashboard/d_seo_module_target_keyword');
   2191 					$this->model_user_user_group->removePermission($user_group_id, 'modify', 'extension/dashboard/d_seo_module_target_keyword');
   2192 				}
   2193 			}
   2194 			
   2195 			$data['success'] = $this->language->get('success_uninstall');
   2196 		}
   2197 
   2198 		$data['error'] = $this->error;
   2199 
   2200 		$this->response->setOutput(json_encode($data));
   2201 	}
   2202 	
   2203 	public function install() {
   2204 		if ($this->d_shopunity) {
   2205 			$this->load->model('extension/d_shopunity/mbooth');
   2206 			
   2207 			$this->model_extension_d_shopunity_mbooth->installDependencies($this->codename);
   2208 		}
   2209 		
   2210 		$this->update();
   2211 	}
   2212 	
   2213 	public function update() {
   2214 		$result = $this->db->query("SHOW TABLES LIKE '" . DB_PREFIX . "url_target'");
   2215 		
   2216 		if ($result->rows) {
   2217 			$this->db->query("DROP TABLE IF EXISTS " . DB_PREFIX . "url_target");
   2218 			
   2219 			$this->uninstallExtension();
   2220 			$this->installExtension();
   2221 		}
   2222 		
   2223 		if (file_exists(DIR_APPLICATION . 'model/extension/d_opencart_patch/modification.php')) {
   2224 			$this->load->model('extension/d_opencart_patch/modification');
   2225 			
   2226 			$result = $this->model_extension_d_opencart_patch_modification->getModificationByCode('d_seo_module');
   2227 			
   2228 			if ($result && (strpos($result['xml'], '$url_info = parse_url(str_replace') !== false)) {
   2229 				$this->model_extension_d_opencart_patch_modification->setModification($this->codename . '.xml', 0);
   2230 				$this->model_extension_d_opencart_patch_modification->setModification($this->codename . '.xml', 1);
   2231 				$this->model_extension_d_opencart_patch_modification->refreshCache();
   2232 			}
   2233 		}
   2234 	}
   2235 	
   2236 	public function header_after($route, $data, &$output) {
   2237 		$this->load->language($this->route);
   2238 		
   2239 		$this->load->model($this->route);
   2240 
   2241 		if (file_exists(DIR_SYSTEM . 'library/d_simple_html_dom.php')) {
   2242 			$menu_items = array();
   2243 
   2244 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2245 					
   2246 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   2247 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/header_menu');
   2248 				if ($info) $menu_items = array_merge($menu_items, $info);
   2249 			}
   2250 		
   2251 			$menu_items = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($menu_items, 'sort_order');
   2252 				
   2253 			$html_menu = '<li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-search fa-lg" style="margin-right: 5px"></i> <span class="hidden-xs hidden-sm hidden-md">' . $this->language->get('text_seo') . '</span> <i class="fa fa-caret-down fa-fw"></i></a><ul class="dropdown-menu dropdown-menu-right" style="min-width: 260px">';
   2254 		
   2255 			foreach ($menu_items as $menu_item) {
   2256 				$html_menu .= $menu_item['html'];
   2257 				
   2258 				if ($menu_item != end($menu_items)) {
   2259 					$html_menu .= '<li class="divider"></li>';
   2260 				}
   2261 			}
   2262 		
   2263 			$html_menu .= '</ul></li>';
   2264 		
   2265 			if ($menu_items) {
   2266 				$html_dom = new d_simple_html_dom();
   2267 				$html_dom->load((string)$output, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2268 		
   2269 				if ($html_dom->find('.navbar .nav')) {
   2270 					$html_dom->find('.navbar .nav li', 0)->outertext .= $html_menu;
   2271 				
   2272 					$output = (string)$html_dom;
   2273 				}
   2274 			}
   2275 		}
   2276 	}
   2277 		
   2278 	public function column_left_before($route, &$data) {
   2279 		$this->load->language($this->route);
   2280 		
   2281 		$this->load->model($this->route);
   2282 
   2283 		$menu_items = array();
   2284 
   2285 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2286 		
   2287 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2288 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/menu');
   2289 			if ($info) $menu_items = array_merge($menu_items, $info);
   2290 		}
   2291 		
   2292 		$menu_items = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($menu_items, 'sort_order');
   2293 
   2294 		if ($menu_items) {
   2295 			$data['menus'][] = array(
   2296 				'id'       => 'menu-seo',
   2297 				'icon'	   => 'fa-search',
   2298 				'name'	   => $this->language->get('text_seo'),
   2299 				'href'     => '',
   2300 				'children' => $menu_items
   2301 			);
   2302 		}
   2303 	}
   2304 	
   2305 	public function menu_after($route, $data, &$output) {
   2306 		$this->load->language($this->route);
   2307 		
   2308 		$this->load->model($this->route);
   2309 		
   2310 		if (file_exists(DIR_SYSTEM . 'library/d_simple_html_dom.php')) {
   2311 			$menu_items = array();
   2312 
   2313 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2314 					
   2315 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   2316 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/menu');
   2317 				if ($info) $menu_items = array_merge($menu_items, $info);
   2318 			}
   2319 		
   2320 			$menu_items = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($menu_items, 'sort_order');
   2321 				
   2322 			$html_menu = '<li id="menu-seo"><a class="parent"><i class="fa fa-search fa-fw"></i> <span>' . $this->language->get('text_seo') . '</span></a><ul>';
   2323 		
   2324 			foreach ($menu_items as $menu_item) {
   2325 				$html_menu .= '<li>';
   2326 			
   2327 				if ($menu_item['href']) {
   2328 					$html_menu .= '<a href="' . $menu_item['href'] . '">' . $menu_item['name'] . '</a>';
   2329 				} else {
   2330 					$html_menu .= '<a class="parent">' . $menu_item['name'] . '</a>';
   2331 				}
   2332 			
   2333 				if (isset($menu_item['children']) && $menu_item['children']) {
   2334 					$html_menu .= '<ul>';
   2335 				
   2336 					foreach ($menu_item['children'] as $children_1) {
   2337 						$html_menu .= '<li>';
   2338 					
   2339 						if ($children_1['href']) {
   2340 							$html_menu .= '<a href="' . $children_1['href'] . '">' . $children_1['name'] . '</a>';
   2341 						} else {
   2342 							$html_menu .= '<a class="parent">' . $children_1['name'] . '</a>';
   2343 						}
   2344 					
   2345 						if ($children_1['children']) {
   2346 							$html_menu .= '<ul>';
   2347 						
   2348 							foreach ($children_1['children'] as $children_2) {
   2349 								$html_menu .= '<li><a href="' . $children_2['href'] . '">' . $children_2['name'] . '</a></li>';
   2350 							}
   2351 						
   2352 							$html_menu .= '</ul>';
   2353 						}
   2354 					
   2355 						$html_menu .= '</li>';
   2356 					}
   2357 				
   2358 					$html_menu .= '</ul>';
   2359 				}
   2360 			
   2361 				$html_menu .= '</li>';
   2362 			}
   2363 		
   2364 			$html_menu .= '</ul></li>';
   2365 		
   2366 			if ($menu_items) {
   2367 				$html_dom = new d_simple_html_dom();
   2368 				$html_dom->load((string)$output, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2369 		
   2370 				$html_dom->find('#reports', 0)->outertext .= $html_menu;
   2371 				
   2372 				$output = (string)$html_dom;
   2373 			}
   2374 		}
   2375 	}
   2376 	
   2377 	public function dashboard_after($route, $data, &$output) {
   2378 		$this->load->language($this->route);
   2379 		
   2380 		$this->load->model($this->route);
   2381 		
   2382 		if (file_exists(DIR_SYSTEM . 'library/d_simple_html_dom.php')) {
   2383 			$dashboards = array();
   2384 
   2385 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2386 
   2387 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   2388 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/dashboard');
   2389 				if ($info) $dashboards = array_merge($dashboards, $info);
   2390 			}
   2391 		
   2392 			$dashboards = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($dashboards, 'sort_order');
   2393 				
   2394 			// Split the array so the columns width is not more than 12 on each row.
   2395 			$width = 0;
   2396 			$column = array();
   2397 			$rows = array();
   2398 		
   2399 			foreach ($dashboards as $dashboard) {
   2400 				$column[] = $dashboard;
   2401 			
   2402 				$width = ($width + $dashboard['width']);
   2403 			
   2404 				if ($width >= 12) {
   2405 					$rows[] = $column;
   2406 				
   2407 					$width = 0;
   2408 					$column = array();
   2409 				}
   2410 			}
   2411 		
   2412 			$html_dashboard = '';
   2413 		
   2414 			foreach ($rows as $row) {
   2415 				$html_dashboard .= '<div class="row">';
   2416 			
   2417 				foreach ($row as $dashboard_1) {
   2418 					$class = 'col-lg-' . $dashboard_1['width'] . ' col-md-3 col-sm-6';
   2419 				
   2420 					foreach ($row as $dashboard_2) {
   2421 						if ($dashboard_2['width'] > 3) {
   2422 							$class = 'col-lg-' . $dashboard_1['width'] . ' col-md-12 col-sm-12';
   2423 						}
   2424 					}
   2425 				
   2426 					$html_dashboard .= '<div class="' . $class . '">' . $dashboard_1['html'] . '</div>';
   2427 				}
   2428 			
   2429 				$html_dashboard .= '</div>';
   2430 			}
   2431 						
   2432 			if ($html_dashboard) {
   2433 				$html_dom = new d_simple_html_dom();
   2434 				$html_dom->load((string)$output, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2435 		
   2436 				$html_dom->find('#content .container-fluid', 1)->innertext .= $html_dashboard;
   2437 				
   2438 				$output = (string)$html_dom;
   2439 			}
   2440 		}
   2441 	}
   2442 
   2443 	public function language_add_language_after($route, $data, $output) {
   2444 		$this->load->model($this->route);
   2445 
   2446 		$data = $data[0];
   2447 		$data['language_id'] = $output;
   2448 
   2449 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2450 
   2451 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2452 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/language_add_language', $data);
   2453 		}
   2454 	}
   2455 	
   2456 	public function language_edit_language_after($route, $data, $output) {
   2457 		$this->load->model($this->route);
   2458 
   2459 		$language_id = $data[0];
   2460 		$data = $data[1];
   2461 		$data['language_id'] = $language_id;
   2462 
   2463 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2464 
   2465 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2466 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/language_edit_language', $data);
   2467 		}
   2468 	}
   2469 
   2470 	public function language_delete_language_after($route, $data, $output) {
   2471 		$this->load->model($this->route);
   2472 
   2473 		$data['language_id'] = $data[0];
   2474 
   2475 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2476 
   2477 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2478 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/language_delete_language', $data);
   2479 		}
   2480 	}
   2481 	
   2482 	public function setting_after($route, $data, &$output) {
   2483 		$this->load->language($this->route);
   2484 
   2485 		$this->load->model($this->route);
   2486 		
   2487 		if (file_exists(DIR_SYSTEM . 'library/d_simple_html_dom.php')) {
   2488 			$html_tab_general = '';
   2489 			$html_tab_general_language = array();
   2490 			$html_tab_store = '';
   2491 			$html_tab_local = '';
   2492 			$html_tab_option = '';
   2493 			$html_style = '';
   2494 			$html_script = '';
   2495 
   2496 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2497 			$languages = $this->{'model_extension_module_' . $this->codename}->getLanguages();
   2498 
   2499 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   2500 				$html_tab_general .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/setting_tab_general');
   2501 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/setting_tab_general_language');
   2502 				
   2503 				foreach ($languages as $language) {
   2504 					if (!isset($html_tab_general_language[$language['language_id']])) $html_tab_general_language[$language['language_id']] = '';
   2505 					
   2506 					if (isset($info[$language['language_id']])) {
   2507 						$html_tab_general_language[$language['language_id']] .= $info[$language['language_id']];
   2508 					}
   2509 				}
   2510 				
   2511 				$html_tab_store .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/setting_tab_store');
   2512 				$html_tab_local .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/setting_tab_local');
   2513 				$html_tab_option .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/setting_tab_option');
   2514 				$html_style .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/setting_style');
   2515 				$html_script .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/setting_script');
   2516 			}
   2517 			
   2518 			$html_dom = new d_simple_html_dom();
   2519 			$html_dom->load((string)$output, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2520 
   2521 			if ($html_tab_general) {
   2522 				$html_dom->find('#tab-general', 0)->innertext .= $html_tab_general;
   2523 			}
   2524 			
   2525 			if (reset($html_tab_general_language)) {
   2526 				$html_languages = '<ul class="nav nav-tabs" id="language">';
   2527 				
   2528 				foreach ($languages as $language) {
   2529 					$html_languages .= '<li' . (($language == reset($languages)) ? ' class="active"' : '') . '><a href="#language' . $language['language_id'] . '" data-toggle="tab"><img src="' . $language['flag'] . '" title="' . $language['name'] . '" /> ' . $language['name'] . '</a></li>';
   2530 				}
   2531 				
   2532 				$html_languages .= '</ul>';
   2533 				$html_languages .= '<div class="tab-language tab-content">';
   2534 				
   2535 				foreach ($languages as $language) {
   2536 					$html_languages .= '<div class="tab-pane' . (($language == reset($languages)) ? ' active' : '') . '" id="language' . $language['language_id'] . '"></div>';
   2537 				}
   2538 				
   2539 				$html_languages .= '</div>';
   2540 
   2541 				$html_dom->find('#tab-general', 0)->innertext = $html_languages . $html_dom->find('#tab-general', 0)->innertext;
   2542 				$html_dom->load((string)$html_dom, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2543 
   2544 				foreach ($languages as $language) {
   2545 					$html_dom->find('#tab-general #language' . $language['language_id'], 0)->innertext .= $html_tab_general_language[$language['language_id']];
   2546 				}
   2547 			}
   2548 			
   2549 			if ($html_tab_store) {
   2550 				$html_dom->find('#tab-store', 0)->innertext .= $html_tab_store;
   2551 			}
   2552 			
   2553 			if ($html_tab_local) {
   2554 				$html_dom->find('#tab-local', 0)->innertext .= $html_tab_local;
   2555 			}
   2556 			
   2557 			if ($html_tab_option) {
   2558 				$html_dom->find('#tab-option', 0)->innertext .= $html_tab_option;
   2559 			}
   2560 						
   2561 			if ($html_style) {
   2562 				$html_dom->find('#content', 0)->innertext .= $html_style;
   2563 			}
   2564 			
   2565 			if ($html_script) {
   2566 				$html_dom->find('#content', 0)->innertext .= $html_script;
   2567 			}
   2568 
   2569 			$output = (string)$html_dom;
   2570 		}
   2571 	}
   2572 		
   2573 	public function setting_validate($error) {
   2574 		$this->load->model($this->route);
   2575 				
   2576 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2577 
   2578 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2579 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/setting_validate', $error);
   2580 			if ($info != '') $error = $info;
   2581 		}
   2582 		
   2583 		return $error;
   2584 	}
   2585 	
   2586 	public function setting_edit_setting() {
   2587 		$this->load->model($this->route);
   2588 
   2589 		$data = $this->request->post;
   2590 		$data['store_id'] = 0;
   2591 		
   2592 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2593 
   2594 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2595 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/setting_edit_setting', $data);
   2596 		}
   2597 	}
   2598 	
   2599 	public function store_form_after($route, $data, &$output) {
   2600 		$this->load->language($this->route);
   2601 
   2602 		$this->load->model($this->route);
   2603 		
   2604 		if (file_exists(DIR_SYSTEM . 'library/d_simple_html_dom.php')) {
   2605 			$html_tab_general = '';
   2606 			$html_tab_general_language = array();
   2607 			$html_tab_store = '';
   2608 			$html_tab_local = '';
   2609 			$html_tab_option = '';
   2610 			$html_style = '';
   2611 			$html_script = '';
   2612 
   2613 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2614 			$languages = $this->{'model_extension_module_' . $this->codename}->getLanguages();
   2615 
   2616 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   2617 				$html_tab_general .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_form_tab_general');
   2618 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_form_tab_general_language');
   2619 				
   2620 				foreach ($languages as $language) {
   2621 					if (!isset($html_tab_general_language[$language['language_id']])) $html_tab_general_language[$language['language_id']] = '';
   2622 					
   2623 					if (isset($info[$language['language_id']])) {
   2624 						$html_tab_general_language[$language['language_id']] .= $info[$language['language_id']];
   2625 					}
   2626 				}
   2627 				
   2628 				$html_tab_store .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_form_tab_store');
   2629 				$html_tab_local .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_form_tab_local');
   2630 				$html_tab_option .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_form_tab_option');
   2631 				$html_style .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_form_style');
   2632 				$html_script .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_form_script');
   2633 			}
   2634 			
   2635 			$html_dom = new d_simple_html_dom();
   2636 			$html_dom->load((string)$output, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2637 
   2638 			if ($html_tab_general) {
   2639 				$html_dom->find('#tab-general', 0)->innertext .= $html_tab_general;
   2640 			}
   2641 			
   2642 			if (reset($html_tab_general_language)) {
   2643 				$html_languages = '<ul class="nav nav-tabs" id="language">';
   2644 				
   2645 				foreach ($languages as $language) {
   2646 					$html_languages .= '<li' . (($language == reset($languages)) ? ' class="active"' : '') . '><a href="#language' . $language['language_id'] . '" data-toggle="tab"><img src="' . $language['flag'] . '" title="' . $language['name'] . '" /> ' . $language['name'] . '</a></li>';
   2647 				}
   2648 				
   2649 				$html_languages .= '</ul>';
   2650 				$html_languages .= '<div class="tab-language tab-content">';
   2651 				
   2652 				foreach ($languages as $language) {
   2653 					$html_languages .= '<div class="tab-pane' . (($language == reset($languages)) ? ' active' : '') . '" id="language' . $language['language_id'] . '"></div>';
   2654 				}
   2655 				
   2656 				$html_languages .= '</div>';
   2657 
   2658 				$html_dom->find('#tab-general', 0)->innertext = $html_languages . $html_dom->find('#tab-general', 0)->innertext;
   2659 				$html_dom->load((string)$html_dom, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2660 
   2661 				foreach ($languages as $language) {
   2662 					$html_dom->find('#tab-general #language' . $language['language_id'], 0)->innertext .= $html_tab_general_language[$language['language_id']];
   2663 				}
   2664 			}
   2665 			
   2666 			if ($html_tab_store) {
   2667 				$html_dom->find('#tab-store', 0)->innertext .= $html_tab_store;
   2668 			}
   2669 			
   2670 			if ($html_tab_local) {
   2671 				$html_dom->find('#tab-local', 0)->innertext .= $html_tab_local;
   2672 			}
   2673 			
   2674 			if ($html_tab_option) {
   2675 				$html_dom->find('#tab-option', 0)->innertext .= $html_tab_option;
   2676 			}
   2677 						
   2678 			if ($html_style) {
   2679 				$html_dom->find('#content', 0)->innertext .= $html_style;
   2680 			}
   2681 			
   2682 			if ($html_script) {
   2683 				$html_dom->find('#content', 0)->innertext .= $html_script;
   2684 			}
   2685 
   2686 			$output = (string)$html_dom;
   2687 		}
   2688 	}
   2689 	
   2690 	public function store_validate_form($error) {
   2691 		$this->load->model($this->route);
   2692 				
   2693 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2694 
   2695 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2696 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_validate_form', $error);
   2697 			if ($info != '') $error = $info;
   2698 		}
   2699 		
   2700 		return $error;
   2701 	}
   2702 	
   2703 	public function store_add_store_after($route, $data, $output) {
   2704 		$this->load->model($this->route);
   2705 
   2706 		$data = $data[0];
   2707 		$data['store_id'] = $output;
   2708 
   2709 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2710 
   2711 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2712 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_add_store', $data);
   2713 		}
   2714 	}
   2715 
   2716 	public function store_edit_store_after($route, $data, $output) {
   2717 		$this->load->model($this->route);
   2718 
   2719 		$store_id = $data[0];
   2720 		$data = $data[1];
   2721 		$data['store_id'] = $store_id;
   2722 
   2723 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2724 
   2725 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2726 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_edit_store', $data);
   2727 		}
   2728 	}
   2729 	
   2730 	public function store_delete_store_after($route, $data, $output) {
   2731 		$this->load->model($this->route);
   2732 
   2733 		$data['store_id'] = $data[0];
   2734 
   2735 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2736 
   2737 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2738 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/store_delete_store', $data);
   2739 		}
   2740 	}
   2741 		
   2742 	public function category_form_after($route, $data, &$output) {
   2743 		$this->load->language($this->route);
   2744 
   2745 		$this->load->model($this->route);
   2746 		
   2747 		if (file_exists(DIR_SYSTEM . 'library/d_simple_html_dom.php')) {
   2748 			$html_tab_general = '';
   2749 			$html_tab_general_language = array();
   2750 			$html_tab_general_store = array();
   2751 			$html_tab_general_store_language = array();
   2752 			$html_tab_data = '';
   2753 			$html_style = '';
   2754 			$html_script = '';
   2755 
   2756 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2757 			$languages = $this->{'model_extension_module_' . $this->codename}->getLanguages();
   2758 			$stores = $this->{'model_extension_module_' . $this->codename}->getStores();
   2759 			unset($stores[0]);
   2760 			
   2761 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   2762 				$html_tab_general .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_form_tab_general');
   2763 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_form_tab_general_language');
   2764 				
   2765 				foreach ($languages as $language) {
   2766 					if (!isset($html_tab_general_language[$language['language_id']])) $html_tab_general_language[$language['language_id']] = '';
   2767 					
   2768 					if (isset($info[$language['language_id']])) {
   2769 						$html_tab_general_language[$language['language_id']] .= $info[$language['language_id']];
   2770 					}
   2771 				}
   2772 				
   2773 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_form_tab_general_store');
   2774 				
   2775 				foreach ($stores as $store) {
   2776 					if (!isset($html_tab_general_store[$store['store_id']])) $html_tab_general_store[$store['store_id']] = '';
   2777 					
   2778 					if (isset($info[$store['store_id']])) {
   2779 						$html_tab_general_store[$store['store_id']] .= $info[$store['store_id']];
   2780 					}
   2781 				}
   2782 				
   2783 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_form_tab_general_store_language');
   2784 				
   2785 				foreach ($stores as $store) {					
   2786 					foreach ($languages as $language) {
   2787 						if (!isset($html_tab_general_store_language[$store['store_id']][$language['language_id']])) $html_tab_general_store_language[$store['store_id']][$language['language_id']] = '';
   2788 						
   2789 						if (isset($info[$store['store_id']][$language['language_id']])) {
   2790 							$html_tab_general_store_language[$store['store_id']][$language['language_id']] .= $info[$store['store_id']][$language['language_id']];
   2791 						}
   2792 					}
   2793 				}
   2794 				
   2795 				$html_tab_data .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_form_tab_data');
   2796 				$html_style .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_form_style');
   2797 				$html_script .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_form_script');
   2798 			}
   2799 			
   2800 			$html_dom = new d_simple_html_dom();
   2801 			$html_dom->load((string)$output, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2802 
   2803 			if ($html_tab_general) {
   2804 				$html_dom->find('#tab-general', 0)->innertext .= $html_tab_general;
   2805 			}
   2806 			
   2807 			if (reset($html_tab_general_language)) {
   2808 				foreach ($languages as $language) {
   2809 					$html_dom->find('#tab-general #language' . $language['language_id'], 0)->innertext .= $html_tab_general_language[$language['language_id']];
   2810 				}
   2811 			}
   2812 			
   2813 			$html_tab_general_language = reset($html_tab_general_store_language);
   2814 			
   2815 			if ((count($stores)) && (reset($html_tab_general_store) || reset($html_tab_general_language))) {
   2816 				$html_stores = '<ul class="nav nav-tabs" id="store">';
   2817 								
   2818 				foreach ($stores as $store) {
   2819 					$html_stores .= '<li' . (($store == reset($stores)) ? ' class="active"' : '') . '><a href="#store_' . $store['store_id'] . '" data-toggle="tab">' . $store['name'] . '</a></li>';
   2820 				}
   2821 				
   2822 				$html_stores .= '</ul>';
   2823 				$html_stores .= '<div class="tab-store tab-content">';
   2824 				
   2825 				foreach ($stores as $store) {
   2826 					$html_store_languages = '';
   2827 						
   2828 					if (reset($html_tab_general_store_language[$store['store_id']])) {
   2829 						$html_store_languages = '<ul class="nav nav-tabs" id="store_' . $store['store_id'] . '_language">';
   2830 				
   2831 						foreach ($languages as $language) {
   2832 							$html_store_languages .= '<li' . (($language == reset($languages)) ? ' class="active"' : '') . '><a href="#store_' . $store['store_id'] . '_language_' . $language['language_id'] . '" data-toggle="tab"><img src="' . $language['flag'] . '" title="' . $language['name'] . '" /> ' . $language['name'] . '</a></li>';
   2833 						}
   2834 				
   2835 						$html_store_languages .= '</ul>';
   2836 						$html_store_languages .= '<div class="tab-language tab-content">';
   2837 				
   2838 						foreach ($languages as $language) {
   2839 							$html_store_languages .= '<div class="tab-pane' . (($language == reset($languages)) ? ' active' : '') . '" id="store_' . $store['store_id'] . '_language_' . $language['language_id'] . '">' . $html_tab_general_store_language[$store['store_id']][$language['language_id']] . '</div>';
   2840 						}
   2841 						
   2842 						$html_store_languages .= '</div>';
   2843 					}
   2844 									
   2845 					$html_stores .= '<div class="tab-pane' . (($store == reset($stores)) ? ' active' : '') . '" id="store_' . $store['store_id'] . '">' . $html_tab_general_store[$store['store_id']] . $html_store_languages . '</div>';
   2846 				}
   2847 				
   2848 				$html_stores .= '</div>';
   2849 				
   2850 				$html_dom->find('#tab-general', 0)->innertext .= $html_stores;
   2851 				$html_dom->load((string)$html_dom, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2852 			}
   2853 			
   2854 			if ($html_tab_data) {
   2855 				$html_dom->find('#tab-data', 0)->innertext .= $html_tab_data;
   2856 			}
   2857 						
   2858 			if ($html_style) {
   2859 				$html_dom->find('#content', 0)->innertext .= $html_style;
   2860 			}
   2861 			
   2862 			if ($html_script) {
   2863 				$html_dom->find('#content', 0)->innertext .= $html_script;
   2864 			}
   2865 
   2866 			$output = (string)$html_dom;
   2867 		}
   2868 	}
   2869 	
   2870 	public function category_validate_form($error) {
   2871 		$this->load->model($this->route);
   2872 				
   2873 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2874 
   2875 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2876 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_validate_form', $error);
   2877 			if ($info != '') $error = $info;
   2878 		}
   2879 		
   2880 		return $error;
   2881 	}
   2882 
   2883 	public function category_add_category_after($route, $data, $output) {
   2884 		$this->load->model($this->route);
   2885 
   2886 		$data = $data[0];
   2887 		$data['category_id'] = $output;
   2888 
   2889 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2890 
   2891 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2892 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_add_category', $data);
   2893 		}
   2894 	}
   2895 
   2896 	public function category_edit_category_after($route, $data, $output) {
   2897 		$this->load->model($this->route);
   2898 
   2899 		$category_id = $data[0];
   2900 		$data = $data[1];
   2901 		$data['category_id'] = $category_id;
   2902 
   2903 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2904 
   2905 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2906 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_edit_category', $data);
   2907 		}
   2908 	}
   2909 	
   2910 	public function category_delete_category_after($route, $data, $output) {
   2911 		$this->load->model($this->route);
   2912 
   2913 		$data['category_id'] = $data[0];
   2914 
   2915 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2916 
   2917 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   2918 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/category_delete_category', $data);
   2919 		}
   2920 	}
   2921 
   2922 	public function product_form_after($route, $data, &$output) {
   2923 		$this->load->language($this->route);
   2924 
   2925 		$this->load->model($this->route);
   2926 		
   2927 		if (file_exists(DIR_SYSTEM . 'library/d_simple_html_dom.php')) {
   2928 			$html_tab_general = '';
   2929 			$html_tab_general_language = array();
   2930 			$html_tab_general_store = array();
   2931 			$html_tab_general_store_language = array();
   2932 			$html_tab_data = '';
   2933 			$html_tab_links = '';
   2934 			$html_style = '';
   2935 			$html_script = '';
   2936 
   2937 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   2938 			$languages = $this->{'model_extension_module_' . $this->codename}->getLanguages();
   2939 			$stores = $this->{'model_extension_module_' . $this->codename}->getStores();
   2940 			unset($stores[0]);
   2941 			
   2942 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   2943 				$html_tab_general .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_form_tab_general');
   2944 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_form_tab_general_language');
   2945 				
   2946 				foreach ($languages as $language) {
   2947 					if (!isset($html_tab_general_language[$language['language_id']])) $html_tab_general_language[$language['language_id']] = '';
   2948 					
   2949 					if (isset($info[$language['language_id']])) {
   2950 						$html_tab_general_language[$language['language_id']] .= $info[$language['language_id']];
   2951 					}
   2952 				}
   2953 				
   2954 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_form_tab_general_store');
   2955 				
   2956 				foreach ($stores as $store) {
   2957 					if (!isset($html_tab_general_store[$store['store_id']])) $html_tab_general_store[$store['store_id']] = '';
   2958 					
   2959 					if (isset($info[$store['store_id']])) {
   2960 						$html_tab_general_store[$store['store_id']] .= $info[$store['store_id']];
   2961 					}
   2962 				}
   2963 				
   2964 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_form_tab_general_store_language');
   2965 				
   2966 				foreach ($stores as $store) {					
   2967 					foreach ($languages as $language) {
   2968 						if (!isset($html_tab_general_store_language[$store['store_id']][$language['language_id']])) $html_tab_general_store_language[$store['store_id']][$language['language_id']] = '';
   2969 						
   2970 						if (isset($info[$store['store_id']][$language['language_id']])) {
   2971 							$html_tab_general_store_language[$store['store_id']][$language['language_id']] .= $info[$store['store_id']][$language['language_id']];
   2972 						}
   2973 					}
   2974 				}
   2975 				
   2976 				$html_tab_data .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_form_tab_data');
   2977 				$html_tab_links .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_form_tab_links');
   2978 				$html_style .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_form_style');
   2979 				$html_script .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_form_script');
   2980 			}
   2981 			
   2982 			$html_dom = new d_simple_html_dom();
   2983 			$html_dom->load((string)$output, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   2984 			
   2985 			if ($html_tab_general) {
   2986 				$html_dom->find('#tab-general', 0)->innertext .= $html_tab_general;
   2987 			}
   2988 			
   2989 			if (reset($html_tab_general_language)) {
   2990 				foreach ($languages as $language) {
   2991 					$html_dom->find('#tab-general #language' . $language['language_id'], 0)->innertext .= $html_tab_general_language[$language['language_id']];
   2992 				}
   2993 			}
   2994 			
   2995 			$html_tab_general_language = reset($html_tab_general_store_language);
   2996 			
   2997 			if ((count($stores)) && (reset($html_tab_general_store) || reset($html_tab_general_language))) {
   2998 				$html_stores = '<ul class="nav nav-tabs" id="store">';
   2999 								
   3000 				foreach ($stores as $store) {
   3001 					$html_stores .= '<li' . (($store == reset($stores)) ? ' class="active"' : '') . '><a href="#store_' . $store['store_id'] . '" data-toggle="tab">' . $store['name'] . '</a></li>';
   3002 				}
   3003 				
   3004 				$html_stores .= '</ul>';
   3005 				$html_stores .= '<div class="tab-store tab-content">';
   3006 				
   3007 				foreach ($stores as $store) {
   3008 					$html_store_languages = '';
   3009 						
   3010 					if (reset($html_tab_general_store_language[$store['store_id']])) {
   3011 						$html_store_languages = '<ul class="nav nav-tabs" id="store_' . $store['store_id'] . '_language">';
   3012 				
   3013 						foreach ($languages as $language) {
   3014 							$html_store_languages .= '<li' . (($language == reset($languages)) ? ' class="active"' : '') . '><a href="#store_' . $store['store_id'] . '_language_' . $language['language_id'] . '" data-toggle="tab"><img src="' . $language['flag'] . '" title="' . $language['name'] . '" /> ' . $language['name'] . '</a></li>';
   3015 						}
   3016 				
   3017 						$html_store_languages .= '</ul>';
   3018 						$html_store_languages .= '<div class="tab-language tab-content">';
   3019 				
   3020 						foreach ($languages as $language) {
   3021 							$html_store_languages .= '<div class="tab-pane' . (($language == reset($languages)) ? ' active' : '') . '" id="store_' . $store['store_id'] . '_language_' . $language['language_id'] . '">' . $html_tab_general_store_language[$store['store_id']][$language['language_id']] . '</div>';
   3022 						}
   3023 						
   3024 						$html_store_languages .= '</div>';
   3025 					}
   3026 									
   3027 					$html_stores .= '<div class="tab-pane' . (($store == reset($stores)) ? ' active' : '') . '" id="store_' . $store['store_id'] . '">' . $html_tab_general_store[$store['store_id']] . $html_store_languages . '</div>';
   3028 				}
   3029 				
   3030 				$html_stores .= '</div>';
   3031 				
   3032 				$html_dom->find('#tab-general', 0)->innertext .= $html_stores;
   3033 				$html_dom->load((string)$html_dom, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   3034 			}
   3035 			
   3036 			if ($html_tab_data) {
   3037 				$html_dom->find('#tab-data', 0)->innertext .= $html_tab_data;
   3038 			}
   3039 			
   3040 			if ($html_tab_links) {
   3041 				$html_dom->find('#tab-links', 0)->innertext .= $html_tab_links;
   3042 			}
   3043 						
   3044 			if ($html_style) {
   3045 				$html_dom->find('#content', 0)->innertext .= $html_style;
   3046 			}
   3047 			
   3048 			if ($html_script) {
   3049 				$html_dom->find('#content', 0)->innertext .= $html_script;
   3050 			}
   3051 
   3052 			$output = (string)$html_dom;
   3053 		}
   3054 	}
   3055 	
   3056 	public function product_validate_form($error) {
   3057 		$this->load->model($this->route);
   3058 				
   3059 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3060 
   3061 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3062 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_validate_form', $error);
   3063 			if ($info != '') $error = $info;
   3064 		}
   3065 		
   3066 		return $error;
   3067 	}
   3068 
   3069 	public function product_add_product_after($route, $data, $output) {
   3070 		$this->load->model($this->route);
   3071 
   3072 		$data = $data[0];
   3073 		$data['product_id'] = $output;
   3074 
   3075 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3076 
   3077 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3078 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_add_product', $data);
   3079 		}
   3080 	}
   3081 
   3082 	public function product_edit_product_after($route, $data, $output) {
   3083 		$this->load->model($this->route);
   3084 
   3085 		$product_id = $data[0];
   3086 		$data = $data[1];
   3087 		$data['product_id'] = $product_id;
   3088 
   3089 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3090 
   3091 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3092 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_edit_product', $data);
   3093 		}
   3094 	}
   3095 	
   3096 	public function product_delete_product_after($route, $data, $output) {
   3097 		$this->load->model($this->route);
   3098 
   3099 		$data['product_id'] = $data[0];
   3100 
   3101 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3102 
   3103 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3104 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/product_delete_product', $data);
   3105 		}
   3106 	}
   3107 
   3108 	public function manufacturer_form_after($route, $data, &$output) {
   3109 		$this->load->language($this->route);
   3110 
   3111 		$this->load->model($this->route);
   3112 		
   3113 		if (file_exists(DIR_SYSTEM . 'library/d_simple_html_dom.php')) {
   3114 			$html_tab_general = '';
   3115 			$html_tab_general_language = array();
   3116 			$html_tab_general_store = array();
   3117 			$html_tab_general_store_language = array();
   3118 			$html_tab_data = '';
   3119 			$html_style = '';
   3120 			$html_script = '';
   3121 
   3122 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3123 			$languages = $this->{'model_extension_module_' . $this->codename}->getLanguages();
   3124 			$stores = $this->{'model_extension_module_' . $this->codename}->getStores();
   3125 			unset($stores[0]);
   3126 			
   3127 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   3128 				$html_tab_general .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_form_tab_general');
   3129 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_form_tab_general_language');
   3130 				
   3131 				foreach ($languages as $language) {
   3132 					if (!isset($html_tab_general_language[$language['language_id']])) $html_tab_general_language[$language['language_id']] = '';
   3133 					
   3134 					if (isset($info[$language['language_id']])) {
   3135 						$html_tab_general_language[$language['language_id']] .= $info[$language['language_id']];
   3136 					}
   3137 				}
   3138 				
   3139 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_form_tab_general_store');
   3140 				
   3141 				foreach ($stores as $store) {
   3142 					if (!isset($html_tab_general_store[$store['store_id']])) $html_tab_general_store[$store['store_id']] = '';
   3143 					
   3144 					if (isset($info[$store['store_id']])) {
   3145 						$html_tab_general_store[$store['store_id']] .= $info[$store['store_id']];
   3146 					}
   3147 				}
   3148 				
   3149 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_form_tab_general_store_language');
   3150 				
   3151 				foreach ($stores as $store) {					
   3152 					foreach ($languages as $language) {
   3153 						if (!isset($html_tab_general_store_language[$store['store_id']][$language['language_id']])) $html_tab_general_store_language[$store['store_id']][$language['language_id']] = '';
   3154 						
   3155 						if (isset($info[$store['store_id']][$language['language_id']])) {
   3156 							$html_tab_general_store_language[$store['store_id']][$language['language_id']] .= $info[$store['store_id']][$language['language_id']];
   3157 						}
   3158 					}
   3159 				}
   3160 				
   3161 				$html_tab_data .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_form_tab_data');
   3162 				$html_style .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_form_style');
   3163 				$html_script .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_form_script');
   3164 			}
   3165 
   3166 			$html_dom = new d_simple_html_dom();
   3167 			$html_dom->load((string)$output, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   3168 			
   3169 			if (VERSION >= '3.0.0.0') {
   3170 				$html_manufacturer_name = $html_dom->find('#form-manufacturer #tab-general .form-group', 0)->outertext;
   3171 				$html_dom->find('#form-manufacturer #tab-general .form-group', 0)->outertext = '';
   3172 				$html_manufacturer_data = $html_dom->find('#form-manufacturer #tab-general', 0)->innertext;
   3173 				$html_dom->find('#form-manufacturer #tab-general', 0)->innertext = $html_manufacturer_name;
   3174 				$html_dom->find('#form-manufacturer .nav-tabs a[href=#tab-general]', 0)->outertext .= '<li><a href="#tab-data" data-toggle="tab">' . $this->language->get('text_data') . '</a></li>';
   3175 				$html_dom->find('#form-manufacturer .tab-content #tab-general', 0)->outertext .= '<div class="tab-pane" id="tab-data">' . $html_manufacturer_data . '</div>';
   3176 			} else {
   3177 				$html_manufacturer_name = $html_dom->find('#form-manufacturer .form-group', 0)->outertext;
   3178 				$html_dom->find('#form-manufacturer .form-group', 0)->outertext = '';
   3179 				$html_manufacturer_data = $html_dom->find('#form-manufacturer', 0)->innertext;
   3180 				$html_dom->find('#form-manufacturer', 0)->innertext = '<ul class="nav nav-tabs"><li class="active"><a href="#tab-general" data-toggle="tab">' . $this->language->get('text_general') . '</a></li><li><a href="#tab-data" data-toggle="tab">' . $this->language->get('text_data') . '</a></li></ul><div class="tab-main tab-content"><div class="tab-pane active" id="tab-general">' . $html_manufacturer_name . '</div><div class="tab-pane" id="tab-data">' . $html_manufacturer_data . '</div></div>';
   3181 			}
   3182 			
   3183 			$html_dom->load((string)$html_dom, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   3184 
   3185 			if ($html_tab_general) {
   3186 				$html_dom->find('#tab-general', 0)->innertext .= $html_tab_general;
   3187 			}
   3188 			
   3189 			if (reset($html_tab_general_language)) {
   3190 				$html_languages = '<ul class="nav nav-tabs" id="language">';
   3191 				
   3192 				foreach ($languages as $language) {
   3193 					$html_languages .= '<li' . (($language == reset($languages)) ? ' class="active"' : '') . '><a href="#language' . $language['language_id'] . '" data-toggle="tab"><img src="' . $language['flag'] . '" title="' . $language['name'] . '" /> ' . $language['name'] . '</a></li>';
   3194 				}
   3195 				
   3196 				$html_languages .= '</ul>';
   3197 				$html_languages .= '<div class="tab-language tab-content">';
   3198 				
   3199 				foreach ($languages as $language) {
   3200 					$html_languages .= '<div class="tab-pane' . (($language == reset($languages)) ? ' active' : '') . '" id="language' . $language['language_id'] . '"></div>';
   3201 				}
   3202 				
   3203 				$html_languages .= '</div>';
   3204 
   3205 				$html_dom->find('#tab-general', 0)->innertext .= $html_languages;
   3206 				$html_dom->load((string)$html_dom, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   3207 
   3208 				foreach ($languages as $language) {
   3209 					$html_dom->find('#tab-general #language' . $language['language_id'], 0)->innertext .= $html_tab_general_language[$language['language_id']];
   3210 				}
   3211 			}
   3212 			
   3213 			$html_tab_general_language = reset($html_tab_general_store_language);
   3214 			
   3215 			if ((count($stores)) && (reset($html_tab_general_store) || reset($html_tab_general_language))) {
   3216 				$html_stores = '<ul class="nav nav-tabs" id="store">';
   3217 								
   3218 				foreach ($stores as $store) {
   3219 					$html_stores .= '<li' . (($store == reset($stores)) ? ' class="active"' : '') . '><a href="#store_' . $store['store_id'] . '" data-toggle="tab">' . $store['name'] . '</a></li>';
   3220 				}
   3221 				
   3222 				$html_stores .= '</ul>';
   3223 				$html_stores .= '<div class="tab-store tab-content">';
   3224 				
   3225 				foreach ($stores as $store) {
   3226 					$html_store_languages = '';
   3227 						
   3228 					if (reset($html_tab_general_store_language[$store['store_id']])) {
   3229 						$html_store_languages = '<ul class="nav nav-tabs" id="store_' . $store['store_id'] . '_language">';
   3230 				
   3231 						foreach ($languages as $language) {
   3232 							$html_store_languages .= '<li' . (($language == reset($languages)) ? ' class="active"' : '') . '><a href="#store_' . $store['store_id'] . '_language_' . $language['language_id'] . '" data-toggle="tab"><img src="' . $language['flag'] . '" title="' . $language['name'] . '" /> ' . $language['name'] . '</a></li>';
   3233 						}
   3234 				
   3235 						$html_store_languages .= '</ul>';
   3236 						$html_store_languages .= '<div class="tab-language tab-content">';
   3237 				
   3238 						foreach ($languages as $language) {
   3239 							$html_store_languages .= '<div class="tab-pane' . (($language == reset($languages)) ? ' active' : '') . '" id="store_' . $store['store_id'] . '_language_' . $language['language_id'] . '">' . $html_tab_general_store_language[$store['store_id']][$language['language_id']] . '</div>';
   3240 						}
   3241 						
   3242 						$html_store_languages .= '</div>';
   3243 					}
   3244 									
   3245 					$html_stores .= '<div class="tab-pane' . (($store == reset($stores)) ? ' active' : '') . '" id="store_' . $store['store_id'] . '">' . $html_tab_general_store[$store['store_id']] . $html_store_languages . '</div>';
   3246 				}
   3247 				
   3248 				$html_stores .= '</div>';
   3249 				
   3250 				$html_dom->find('#tab-general', 0)->innertext .= $html_stores;
   3251 				$html_dom->load((string)$html_dom, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   3252 			}
   3253 			
   3254 			if ($html_tab_data) {
   3255 				$html_dom->find('#tab-data', 0)->innertext .= $html_tab_data;
   3256 			}
   3257 						
   3258 			if ($html_style) {
   3259 				$html_dom->find('#content', 0)->innertext .= $html_style;
   3260 			}
   3261 			
   3262 			if ($html_script) {
   3263 				$html_dom->find('#content', 0)->innertext .= $html_script;
   3264 			}
   3265 
   3266 			$output = (string)$html_dom;
   3267 		}
   3268 	}
   3269 	
   3270 	public function manufacturer_validate_form($error) {
   3271 		$this->load->model($this->route);
   3272 				
   3273 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3274 
   3275 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3276 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_validate_form', $error);
   3277 			if ($info != '') $error = $info;
   3278 		}
   3279 		
   3280 		return $error;
   3281 	}
   3282 
   3283 	public function manufacturer_add_manufacturer_after($route, $data, $output) {
   3284 		$this->load->model($this->route);
   3285 
   3286 		$data = $data[0];
   3287 		$data['manufacturer_id'] = $output;
   3288 
   3289 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3290 
   3291 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3292 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_add_manufacturer', $data);
   3293 		}
   3294 	}
   3295 
   3296 	public function manufacturer_edit_manufacturer_after($route, $data, $output) {
   3297 		$this->load->model($this->route);
   3298 
   3299 		$manufacturer_id = $data[0];
   3300 		$data = $data[1];
   3301 		$data['manufacturer_id'] = $manufacturer_id;
   3302 
   3303 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3304 
   3305 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3306 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_edit_manufacturer', $data);
   3307 		}
   3308 	}
   3309 	
   3310 	public function manufacturer_delete_manufacturer_after($route, $data, $output) {
   3311 		$this->load->model($this->route);
   3312 
   3313 		$data['manufacturer_id'] = $data[0];
   3314 
   3315 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3316 
   3317 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3318 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/manufacturer_delete_manufacturer', $data);
   3319 		}
   3320 	}
   3321 
   3322 	public function information_form_after($route, $data, &$output) {
   3323 		$this->load->language($this->route);
   3324 
   3325 		$this->load->model($this->route);
   3326 		
   3327 		if (file_exists(DIR_SYSTEM . 'library/d_simple_html_dom.php')) {
   3328 			$html_tab_general = '';
   3329 			$html_tab_general_language = array();
   3330 			$html_tab_general_store = array();
   3331 			$html_tab_general_store_language = array();
   3332 			$html_tab_data = '';
   3333 			$html_style = '';
   3334 			$html_script = '';
   3335 
   3336 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3337 			$languages = $this->{'model_extension_module_' . $this->codename}->getLanguages();
   3338 			$stores = $this->{'model_extension_module_' . $this->codename}->getStores();
   3339 			unset($stores[0]);
   3340 			
   3341 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   3342 				$html_tab_general .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_form_tab_general');
   3343 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_form_tab_general_language');
   3344 				
   3345 				foreach ($languages as $language) {
   3346 					if (!isset($html_tab_general_language[$language['language_id']])) $html_tab_general_language[$language['language_id']] = '';
   3347 					
   3348 					if (isset($info[$language['language_id']])) {
   3349 						$html_tab_general_language[$language['language_id']] .= $info[$language['language_id']];
   3350 					}
   3351 				}
   3352 				
   3353 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_form_tab_general_store');
   3354 				
   3355 				foreach ($stores as $store) {
   3356 					if (!isset($html_tab_general_store[$store['store_id']])) $html_tab_general_store[$store['store_id']] = '';
   3357 					
   3358 					if (isset($info[$store['store_id']])) {
   3359 						$html_tab_general_store[$store['store_id']] .= $info[$store['store_id']];
   3360 					}
   3361 				}
   3362 				
   3363 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_form_tab_general_store_language');
   3364 				
   3365 				foreach ($stores as $store) {					
   3366 					foreach ($languages as $language) {
   3367 						if (!isset($html_tab_general_store_language[$store['store_id']][$language['language_id']])) $html_tab_general_store_language[$store['store_id']][$language['language_id']] = '';
   3368 						
   3369 						if (isset($info[$store['store_id']][$language['language_id']])) {
   3370 							$html_tab_general_store_language[$store['store_id']][$language['language_id']] .= $info[$store['store_id']][$language['language_id']];
   3371 						}
   3372 					}
   3373 				}
   3374 				
   3375 				$html_tab_data .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_form_tab_data');
   3376 				$html_style .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_form_style');
   3377 				$html_script .= $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_form_script');
   3378 			}
   3379 			
   3380 			$html_dom = new d_simple_html_dom();
   3381 			$html_dom->load((string)$output, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   3382 
   3383 			if ($html_tab_general) {
   3384 				$html_dom->find('#tab-general', 0)->innertext .= $html_tab_general;
   3385 			}
   3386 			
   3387 			if (reset($html_tab_general_language)) {
   3388 				foreach ($languages as $language) {
   3389 					$html_dom->find('#tab-general #language' . $language['language_id'], 0)->innertext .= $html_tab_general_language[$language['language_id']];
   3390 				}
   3391 			}
   3392 			
   3393 			$html_tab_general_language = reset($html_tab_general_store_language);
   3394 			
   3395 			if ((count($stores)) && (reset($html_tab_general_store) || reset($html_tab_general_language))) {
   3396 				$html_stores = '<ul class="nav nav-tabs" id="store">';
   3397 								
   3398 				foreach ($stores as $store) {
   3399 					$html_stores .= '<li' . (($store == reset($stores)) ? ' class="active"' : '') . '><a href="#store_' . $store['store_id'] . '" data-toggle="tab">' . $store['name'] . '</a></li>';
   3400 				}
   3401 				
   3402 				$html_stores .= '</ul>';
   3403 				$html_stores .= '<div class="tab-store tab-content">';
   3404 				
   3405 				foreach ($stores as $store) {
   3406 					$html_store_languages = '';
   3407 						
   3408 					if (reset($html_tab_general_store_language[$store['store_id']])) {
   3409 						$html_store_languages = '<ul class="nav nav-tabs" id="store_' . $store['store_id'] . '_language">';
   3410 				
   3411 						foreach ($languages as $language) {
   3412 							$html_store_languages .= '<li' . (($language == reset($languages)) ? ' class="active"' : '') . '><a href="#store_' . $store['store_id'] . '_language_' . $language['language_id'] . '" data-toggle="tab"><img src="' . $language['flag'] . '" title="' . $language['name'] . '" /> ' . $language['name'] . '</a></li>';
   3413 						}
   3414 				
   3415 						$html_store_languages .= '</ul>';
   3416 						$html_store_languages .= '<div class="tab-language tab-content">';
   3417 				
   3418 						foreach ($languages as $language) {
   3419 							$html_store_languages .= '<div class="tab-pane' . (($language == reset($languages)) ? ' active' : '') . '" id="store_' . $store['store_id'] . '_language_' . $language['language_id'] . '">' . $html_tab_general_store_language[$store['store_id']][$language['language_id']] . '</div>';
   3420 						}
   3421 						
   3422 						$html_store_languages .= '</div>';
   3423 					}
   3424 									
   3425 					$html_stores .= '<div class="tab-pane' . (($store == reset($stores)) ? ' active' : '') . '" id="store_' . $store['store_id'] . '">' . $html_tab_general_store[$store['store_id']] . $html_store_languages . '</div>';
   3426 				}
   3427 				
   3428 				$html_stores .= '</div>';
   3429 				
   3430 				$html_dom->find('#tab-general', 0)->innertext .= $html_stores;
   3431 				$html_dom->load((string)$html_dom, $lowercase = true, $stripRN = false, $defaultBRText = DEFAULT_BR_TEXT);
   3432 			}
   3433 			
   3434 			if ($html_tab_data) {
   3435 				$html_dom->find('#tab-data', 0)->innertext .= $html_tab_data;
   3436 			}
   3437 						
   3438 			if ($html_style) {
   3439 				$html_dom->find('#content', 0)->innertext .= $html_style;
   3440 			}
   3441 			
   3442 			if ($html_script) {
   3443 				$html_dom->find('#content', 0)->innertext .= $html_script;
   3444 			}
   3445 
   3446 			$output = (string)$html_dom;
   3447 		}
   3448 	}
   3449 	
   3450 	public function information_validate_form($error) {
   3451 		$this->load->model($this->route);
   3452 				
   3453 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3454 
   3455 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3456 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_validate_form', $error);
   3457 			if ($info != '') $error = $info;
   3458 		}
   3459 		
   3460 		return $error;
   3461 	}
   3462 
   3463 	public function information_add_information_after($route, $data, $output) {
   3464 		$this->load->model($this->route);
   3465 
   3466 		$data = $data[0];
   3467 		$data['information_id'] = $output;
   3468 
   3469 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3470 
   3471 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3472 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_add_information', $data);
   3473 		}
   3474 	}
   3475 
   3476 	public function information_edit_information_after($route, $data, $output) {
   3477 		$this->load->model($this->route);
   3478 
   3479 		$information_id = $data[0];
   3480 		$data = $data[1];
   3481 		$data['information_id'] = $information_id;
   3482 
   3483 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3484 
   3485 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3486 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_edit_information', $data);
   3487 		}
   3488 	}
   3489 	
   3490 	public function information_delete_information_after($route, $data, $output) {
   3491 		$this->load->model($this->route);
   3492 
   3493 		$data['information_id'] = $data[0];
   3494 
   3495 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3496 
   3497 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3498 			$this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/information_delete_information', $data);
   3499 		}
   3500 	}
   3501 		
   3502 	/*
   3503 	*	Return Field Info.
   3504 	*/	
   3505 	public function getFieldInfo() {	
   3506 		$_language = new Language();
   3507 		$_language->load($this->route);
   3508 				
   3509 		$this->load->model($this->route);
   3510 
   3511 		if ($this->config->get($this->codename . '_field_info')) {
   3512 			return $this->config->get($this->codename . '_field_info');
   3513 		}
   3514 				
   3515 		// Setting		
   3516 		$config_field_setting = array();
   3517 		
   3518 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3519 		
   3520 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3521 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/field_config');
   3522 			if ($info) $config_field_setting = array_replace_recursive($config_field_setting, $info);
   3523 		}
   3524 		
   3525 		$setting = $this->model_setting_setting->getSetting('module_' . $this->codename);
   3526 		$field_setting = isset($setting['module_' . $this->codename . '_field_setting']) ? $setting['module_' . $this->codename . '_field_setting'] : array();
   3527 					
   3528 		if (!empty($field_setting)) {
   3529 			$config_field_setting = array_replace_recursive($config_field_setting, $field_setting);
   3530 		}
   3531 		
   3532 		$field_setting = $config_field_setting;
   3533 		
   3534 		$sheets = array();
   3535 		
   3536 		foreach ($field_setting['sheet'] as $sheet) {
   3537 			if (isset($sheet['code']) && isset($sheet['name'])) {				
   3538 				$fields = array();
   3539 				
   3540 				if (isset($sheet['field'])) {
   3541 					foreach ($sheet['field'] as $field) {
   3542 						if (isset($field['code']) && isset($field['name']) && isset($field['description']) && isset($field['type']) && isset($field['multi_language']) && isset($field['multi_store']) && isset($field['required'])) {						
   3543 							$fields[$field['code']] = $field;
   3544 						}
   3545 					}
   3546 					
   3547 					$fields = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($fields, 'sort_order');
   3548 				}
   3549 				
   3550 				$sheet['field'] = array();
   3551 				
   3552 				foreach ($fields as $field) {
   3553 					$sheet['field'][$field['code']] = $field;
   3554 				}
   3555 				
   3556 				$sheets[$sheet['code']] = $sheet;
   3557 			}
   3558 		}
   3559 				
   3560 		$field_setting['sheet'] = $this->{'model_extension_module_' . $this->codename}->sortArrayByColumn($sheets, 'sort_order');
   3561 				
   3562 		$this->config->set($this->codename . '_field_info', $field_setting);
   3563 			
   3564 		return $field_setting;
   3565 	}
   3566 	
   3567 	/*
   3568 	*	Return Field Elements.
   3569 	*/	
   3570 	public function getFieldElements($data) {
   3571 		$this->load->model($this->route);
   3572 		
   3573 		$field_elements = array();
   3574 		
   3575 		if (isset($data['field_code']) && isset($data['filter'])) {
   3576 			$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3577 				
   3578 			foreach ($installed_seo_extensions as $installed_seo_extension) {
   3579 				$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/field_elements', $data);
   3580 				if ($info != '') $field_elements = array_replace_recursive($field_elements, $info);	
   3581 			}
   3582 		}
   3583 						
   3584 		return $field_elements;
   3585 	}
   3586 	
   3587 	/*
   3588 	*	Return Custom Page Exception Routes.
   3589 	*/	
   3590 	public function getCustomPageExceptionRoutes() {
   3591 		$this->load->model($this->route);
   3592 		
   3593 		if ($this->config->get($this->codename . '_custom_page_exception_routes')) {
   3594 			return $this->config->get($this->codename . '_custom_page_exception_routes');
   3595 		}
   3596 		
   3597 		$custom_page_exception_routes = array();
   3598 							
   3599 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3600 									
   3601 		foreach ($installed_seo_extensions as $installed_seo_extension) {
   3602 			$info = $this->load->controller('extension/' . $this->codename . '/' . $installed_seo_extension . '/custom_page_exception_routes');
   3603 			if ($info) $custom_page_exception_routes = array_merge($custom_page_exception_routes, $info);
   3604 		}
   3605 		
   3606 		$this->config->set($this->codename . '_custom_page_exception_routes', $custom_page_exception_routes);
   3607 		
   3608 		return $custom_page_exception_routes;
   3609 	}
   3610 	
   3611 	/*
   3612 	*	Return Target Keywords.
   3613 	*/	
   3614 	public function getTargetKeywords() {
   3615 		$filter = array();
   3616 		
   3617 		if (isset($this->request->post['route'])) {
   3618 			$filter['route'] = $this->request->post['route'];
   3619 		}
   3620 		
   3621 		if (isset($this->request->post['store_id'])) {
   3622 			$filter['store_id'] = $this->request->post['store_id'];
   3623 		}
   3624 		
   3625 		if (isset($this->request->post['language_id'])) {
   3626 			$filter['language_id'] = $this->request->post['language_id'];
   3627 		}
   3628 		
   3629 		if (isset($this->request->post['sort_order'])) {
   3630 			$filter['sort_order'] = $this->request->post['sort_order'];
   3631 		}
   3632 		
   3633 		if (isset($this->request->post['keyword'])) {
   3634 			$filter['keyword'] = $this->request->post['keyword'];
   3635 		}
   3636 		
   3637 		$field_data = array(
   3638 			'field_code' => 'target_keyword',
   3639 			'filter' => $filter
   3640 		);
   3641 			
   3642 		$data['target_keywords'] = $this->getFieldElements($field_data);
   3643 						
   3644 		$this->response->setOutput(json_encode($data));
   3645 	}
   3646 			
   3647 	/*
   3648 	*	Validator Functions.
   3649 	*/		
   3650 	private function validate($permission = 'modify') {
   3651 		if (!$this->user->hasPermission($permission, $this->route)) {
   3652 			$this->error['warning'] = $this->language->get('error_permission');
   3653 			
   3654 			return false;
   3655 		}
   3656 
   3657 		return true;
   3658 	}
   3659 	
   3660 	private function validateAddTargetElement($permission = 'modify') {						
   3661 		if (!$this->user->hasPermission($permission, $this->route)) {
   3662 			$this->error['warning'] = $this->language->get('error_permission');
   3663 			
   3664 			return false;
   3665 		}
   3666 		
   3667 		if (!preg_match('/[A-Za-z0-9]+\/[A-Za-z0-9]+/i', $this->request->post['target_element']['route']) && !preg_match('/[A-Za-z0-9]+\=[0-9]+/i', $this->request->post['target_element']['route'])) {
   3668 			$this->error['warning'] = $this->language->get('error_route');
   3669 			
   3670 			return false;
   3671 		}
   3672 		
   3673 		$field_data = array(
   3674 			'field_code' => 'target_keyword',
   3675 			'filter' => array(
   3676 				'route' => $this->request->post['target_element']['route'],
   3677 				'store_id' => $this->request->get['store_id']
   3678 			)
   3679 		);
   3680 			
   3681 		$target_keywords = $this->getFieldElements($field_data);
   3682 								
   3683 		if ($target_keywords) {
   3684 			$this->error['warning'] = sprintf($this->language->get('error_route_exists'), $this->request->post['target_element']['route']);
   3685 			
   3686 			return false;
   3687 		}
   3688 		
   3689 		foreach ($this->request->post['target_element']['target_keyword'] as $language_id => $target_keyword) {
   3690 			preg_match_all('/\[[^]]+\]/', $target_keyword, $keywords);
   3691 				
   3692 			if (!$keywords[0]) {
   3693 				$this->error['warning'] = sprintf($this->language->get('error_target_keyword'), $target_keyword);
   3694 				
   3695 				return false;
   3696 			}	
   3697 		}	
   3698 				
   3699 		return true;
   3700 	}
   3701 	
   3702 	private function validateEditTargetElement($permission = 'modify') {				
   3703 		if (!$this->user->hasPermission($permission, $this->route)) {
   3704 			$this->error['warning'] = $this->language->get('error_permission');
   3705 			
   3706 			return false;
   3707 		}
   3708 		
   3709 		preg_match_all('/\[[^]]+\]/', $this->request->post['target_keyword'], $keywords);
   3710 				
   3711 		if (!$keywords[0]) {
   3712 			$this->error['warning'] = sprintf($this->language->get('error_target_keyword'), $this->request->post['target_keyword']);
   3713 			
   3714 			return false;
   3715 		}	
   3716 						
   3717 		return true;
   3718 	}
   3719 		
   3720 	private function validateImport($permission = 'modify') {				
   3721 		if (!$this->user->hasPermission($permission, $this->route)) {
   3722 			$this->error['warning'] = $this->language->get('error_permission');
   3723 			
   3724 			return false;
   3725 		}
   3726 		
   3727 		if (!isset($this->request->files['upload']['name']) || !$this->request->files['upload']['name']) {
   3728 			$this->error['warning'] = $this->language->get('error_upload_name');
   3729 			
   3730 			return false;
   3731 		}
   3732 		
   3733 		$ext = strtolower(pathinfo($this->request->files['upload']['name'], PATHINFO_EXTENSION));
   3734 		
   3735 		if (($ext != 'xls') && ($ext != 'xlsx') && ($ext != 'ods')) {
   3736 			$this->error['warning'] = $this->language->get('error_upload_ext');
   3737 			
   3738 			return false;
   3739 		}
   3740 
   3741 		return true;
   3742 	}
   3743 
   3744 	private function validateInstall($permission = 'modify') {
   3745 		$this->load->model($this->route);
   3746 
   3747 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3748 		
   3749 		if (in_array($this->codename, $installed_seo_extensions)) {
   3750 			$this->error['warning'] = $this->language->get('error_installed');
   3751 			
   3752 			return false;
   3753 		}
   3754 		
   3755 		$installed_seo_extensions[] = $this->codename;
   3756 		
   3757 		$this->{'model_extension_module_' . $this->codename}->saveSEOExtensions($installed_seo_extensions);
   3758 
   3759 		return true;
   3760 	}
   3761 
   3762 	private function validateUninstall($permission = 'modify') {
   3763 		$this->load->model($this->route);
   3764 
   3765 		$installed_seo_extensions = $this->{'model_extension_module_' . $this->codename}->getInstalledSEOExtensions();
   3766 		
   3767 		if (count($installed_seo_extensions) > 1) {
   3768 			$this->error['warning'] = $this->language->get('error_dependencies');
   3769 			
   3770 			return false;
   3771 		}
   3772 		
   3773 		$key = array_search($this->codename, $installed_seo_extensions);
   3774 		
   3775 		if ($key !== false) unset($installed_seo_extensions[$key]);
   3776 				
   3777 		$this->{'model_extension_module_' . $this->codename}->saveSEOExtensions($installed_seo_extensions);
   3778 
   3779 		return true;
   3780 	}
   3781 }