* @copyright 2007-2015 Leotheme * @license http://leotheme.com - prestashop template provider */ if (!defined('_PS_VERSION_')) { # module validation exit; } include_once(_PS_MODULE_DIR_.'leoslideshow/classes/LeoSlideshowConfig.php'); include_once(_PS_MODULE_DIR_.'leoslideshow/classes/LeoSlideshowGroup.php'); include_once(_PS_MODULE_DIR_.'leoslideshow/classes/LeoSlideshowSlide.php'); include_once(_PS_MODULE_DIR_.'leoslideshow/classes/LeoSlideshowStatus.php'); include_once(_PS_MODULE_DIR_.'leoslideshow/libs/Helper.php'); class LeoSlideshow extends Module { private $html = ''; private $current_group = array('id_group' => 0, 'title' => ''); public $group_data = array( 'id_leoslideshow_groups' => '', 'title' => '', 'id_shop' => '', 'hook' => '', 'active' => '', 'auto_play' => '1', 'delay' => '9000', 'fullwidth' => '', 'width' => '960', 'height' => '350', 'md_width' => '12', 'sm_width' => '12', 'xs_width' => '12', 'touch_mobile' => '1', 'stop_on_hover' => '1', 'shuffle_mode' => '0', 'image_cropping' => '0', 'shadow_type' => '2', 'show_time_line' => '1', 'time_line_position' => 'top', 'background_color' => '#d9d9d9', 'margin' => '0px 0px 18px', 'padding' => '5px 5px', 'background_image' => '1', 'background_url' => '', 'navigator_type' => 'none', 'navigator_arrows' => 'verticalcentered', 'navigation_style' => 'round', 'offset_horizontal' => '0', 'offset_vertical' => '20', 'show_navigator' => '0', 'hide_navigator_after' => '200', 'thumbnail_width' => '100', 'thumbnail_height' => '50', #'thumbnail_amount' => '5', 'group_class' => '', 'start_with_slide' => '1', 'timer_show' => LeoSlideshowConfig::TIMER_SHOW_AUTO, 'timer' => '', 'tooltipX' => '5', 'tooltipY' => '-5', 'controlNav' => '1', 'controlNavTooltip' => '1', 'nav_thumbnail_width' => '', 'nav_thumbnail_height' => '', 'controlNavHoverOpacity' => '0.6', 'directionNav' => '1', 'directionNavHoverOpacity' => '0.6', 'keyboardNav' => '1', 'timerPosition' => 'top-right', 'timerX' => '10', 'timerY' => '10', 'timerOpacity' => '0.5', 'timerBg' => '#000', 'timerColor' => '#EEE', 'timerDiameter' => '30', 'timerPadding' => '4', 'timerStroke' => '3', 'timerBarStroke' => '1', 'timerBarStrokeColor' => '#EEE', 'blockCols' => '10', 'timerBarStrokeStyle' => 'solid', 'captionOpacity' => '1', 'fx' => 'random', 'animationSpeed' => '500', 'strips' => '20', 'blockRows' => '5', 'captionSpeed' => '500', 'enable_custom_html_bullet' => '0', ); private $hook_support = array( 'displayTop', 'displayNav1', 'displayNav2', 'displayNavFullWidth', 'displayHome', 'displayLeftColumn', 'displayRightColumn', 'displayFooterProduct', 'displayFooterBefore', 'displayFooter', 'displayFooterAfter', 'displayLeftColumnProduct', 'displayRightColumnProduct', 'displayProductButtons', 'displayReassurance', ); private $mod_current_slide = array(); public $slider_data = array( 'transition' => 'random', 'slot' => 7, 'rotation' => 0, 'duration' => 300, 'delay' => '5000', 'enable_link' => 1, 'target' => '', 'start_date_time' => '', 'end_date_time' => '', 'bullet_class' => '', ); public $theme_name; public $img_path; public $img_url; public $error_text = ''; public function __construct() { $this->name = 'leoslideshow'; $this->tab = 'front_office_features'; $this->version = '1.0.6'; $this->author = 'LeoTheme'; $this->need_instance = 0; $this->secure_key = Tools::encrypt($this->name); $this->bootstrap = true; parent::__construct(); $this->displayName = $this->l('Leo Slideshow for your homepage'); $this->description = $this->l('Adds image, text or video to your homepage.'); $this->theme_name = LeoSlideshowHelper::getThemeName(); $this->img_path = LeoSlideshowHelper::getImgThemeDir(); $this->img_url = LeoSlideshowHelper::getImgThemeUrl(); // Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'leoslideshow_groups` MODIFY `hook` varchar(64) DEFAULT NULL'); // Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'leoslideshow_groups` ADD `active_ap` tinyint(1) DEFAULT NULL'); // Configuration::updateValue('LEOSLIDESHOW_GROUP_DEFAULTTAB', '#fieldset_0'); } /** * @see Module::install() */ public function install() { // Prepare tab $tab = new Tab(); $tab->active = 1; $tab->class_name = 'AdminLeoSlideshow'; $tab->name = array(); foreach (Language::getLanguages(false) as $lang) { $tab->name[$lang['id_lang']] = 'LeoSlideShow'; } $tab->id_parent = -1; $tab->module = $this->name; $tab->add(); $tab1 = new Tab(); $tab1->active = 1; $tab1->class_name = 'AdminLeoSlideshowMenuModule'; $tab1->name = array(); foreach (Language::getLanguages(false) as $lang) { $tab1->name[$lang['id_lang']] = 'Leo Slideshow Configuration'; } $tab1->id_parent = Tab::getIdFromClassName('AdminParentModulesSf'); $tab1->module = $this->name; $tab1->add(); Configuration::updateValue('AP_INSTALLED_LEOSLIDESHOW', '1'); /* Adds Module */ if (parent::install() && Configuration::updateValue('LEOSLIDESHOW_GROUP_DE', '1') && Configuration::updateValue('LEOSLIDESHOW_GROUP_DEFAULTTAB', '#fieldset_0')) { $res = true; /* Sets up configuration */ $res &= $this->registerLeoHook(); /* Creates tables */ $res &= $this->createTables(); return (bool)$res; } return false; } /** * Adds samples */ private function installSamples() { if ($this->checkExistAnyGroup()) { return true; } # CHANGE POSITION HOOK DISPLAYHOME TO 1 foreach (Shop::getContextListShopID() as $shop_id) { $sql = 'UPDATE `' . _DB_PREFIX_ . 'hook_module` SET `position`=' . 1 . ' WHERE `id_module` = ' . (int)$this->id . ' AND `id_hook` = ' . (int) Hook::getIdByName('displayHome'). ' AND `id_shop` = ' . $shop_id; Db::getInstance()->execute($sql); } //insearch demo for group slider $mod_group = new LeoSlideshowGroup(); $context = Context::getContext(); //sample for group $mod_group->title = 'Sample Group'; $mod_group->hook = 'displayHome'; $mod_group->id_shop = $context->shop->id; $mod_group->active = 1; $mod_group->params = 'eyJkZWxheSI6IjkwMDAiLCJzdGFydF93aXRoX3NsaWRlIjoiMSIsInRpbWVyX3Nob3ciOiIzIiwic3RvcF9vbl9ob3ZlciI6IjEiLCJzaHVmZmxlX21vZGUiOiIwIiwiZnVsbHdpZHRoIjoiZnVsbHdpZHRoIiwibWRfd2lkdGgiOiIxMiIsInNtX3dpZHRoIjoiMTIiLCJ4c193aWR0aCI6IjEyIiwiaW1hZ2VfY3JvcHBpbmciOiIwIiwid2lkdGgiOiIxMDkwIiwiaGVpZ2h0IjoiNTQwIiwibWFyZ2luIjoiMHB4IDBweCAxOHB4IiwicGFkZGluZyI6IjVweCA1cHgiLCJiYWNrZ3JvdW5kX2ltYWdlIjoiMSIsImJhY2tncm91bmRfdXJsIjoiIiwiYmFja2dyb3VuZF9jb2xvciI6IiNkOWQ5ZDkiLCJncm91cF9jbGFzcyI6IiIsImNvbnRyb2xOYXYiOiIxIiwibmF2aWdhdG9yX3R5cGUiOiJidWxsZXQiLCJlbmFibGVfY3VzdG9tX2h0bWxfYnVsbGV0IjoiMCIsImNvbnRyb2xOYXZUb29sdGlwIjoiMCIsInRvb2x0aXBYIjoiNSIsInRvb2x0aXBZIjoiLTUiLCJuYXZfdGh1bWJuYWlsX3dpZHRoIjoiIiwibmF2X3RodW1ibmFpbF9oZWlnaHQiOiIiLCJjb250cm9sTmF2SG92ZXJPcGFjaXR5IjoiMC42IiwiZGlyZWN0aW9uTmF2IjoiMSIsImRpcmVjdGlvbk5hdkhvdmVyT3BhY2l0eSI6IjAuNiIsImtleWJvYXJkTmF2IjoiMSIsInRpbWVyIjoiMzYwQmFyIiwidGltZXJQb3NpdGlvbiI6InRvcC1yaWdodCIsInRpbWVyWCI6IjEwIiwidGltZXJZIjoiMTAiLCJ0aW1lck9wYWNpdHkiOiIwLjUiLCJ0aW1lckJnIjoiIzAwMCIsInRpbWVyQ29sb3IiOiIjRUVFIiwidGltZXJEaWFtZXRlciI6IjMwIiwidGltZXJQYWRkaW5nIjoiNCIsInRpbWVyU3Ryb2tlIjoiMyIsInRpbWVyQmFyU3Ryb2tlIjoiMSIsInRpbWVyQmFyU3Ryb2tlQ29sb3IiOiIjRUVFIiwidGltZXJCYXJTdHJva2VTdHlsZSI6InNvbGlkIiwiZngiOiJyYW5kb20iLCJhbmltYXRpb25TcGVlZCI6IjUwMCIsInN0cmlwcyI6IjIwIiwiYmxvY2tDb2xzIjoiMTAiLCJibG9ja1Jvd3MiOiI1IiwiY2FwdGlvblNwZWVkIjoiNTAwIiwiY2FwdGlvbk9wYWNpdHkiOiIxIn0='; $mod_group->active_ap = '0'; $mod_group->randkey = '1a9436d12827c870d10cc0d9b19b2c00'; $mod_group->add(); //sample for slider $languages = Language::getLanguages(false); $mod_slide = new LeoSlideshowSlide(); $mod_slide->id_group = $mod_group->id; $mod_slide->position = 0; $mod_slide->active = 1; $mod_slide->params = 'eyJkZWxheSI6IjUwMDAiLCJncm91cF9pZCI6IjEiLCJlbmFibGVfbGluayI6IjEiLCJ0YXJnZXQiOiJzYW1lIiwic3RhcnRfZGF0ZV90aW1lIjoiIiwiZW5kX2RhdGVfdGltZSI6IiIsImJ1bGxldF9jbGFzcyI6IiJ9'; # 1 foreach ($languages as $language) { $mod_slide->title[$language['id_lang']] = 'Sample slider 1'; $mod_slide->link[$language['id_lang']] = ''; $mod_slide->image[$language['id_lang']] = 'sample_slider_1.png'; $mod_slide->thumbnail[$language['id_lang']] = ''; $mod_slide->video[$language['id_lang']] = 'eyJ1c2V2aWRlbyI6IjAiLCJ2aWRlb2lkIjoiIiwidmlkZW9hdXRvIjoiMCIsImJhY2tncm91bmRfY29sb3IiOiIiLCJidWxsZXRfZGVzY3JpcHRpb24iOiIifQ=='; $mod_slide->layersparams[$language['id_lang']] = 'W3sibGF5ZXJfdmlkZW9fdHlwZSI6InlvdXR1YmUiLCJsYXllcl92aWRlb19pZCI6IiIsImxheWVyX3ZpZGVvX2hlaWdodCI6IjIwMCIsImxheWVyX3ZpZGVvX3dpZHRoIjoiMzAwIiwibGF5ZXJfdmlkZW9fdGh1bWIiOiIiLCJsYXllcl9pZCI6IjFfMSIsImxheWVyX2NvbnRlbnQiOiIiLCJsYXllcl90eXBlIjoidGV4dCIsImxheWVyX3N0YXR1cyI6IjEiLCJsYXllcl9jbGFzcyI6ImxhcmdlX3RleHQiLCJsYXllcl9jYXB0aW9uIjoiRnVsbHkgUmVzcG9uc2l2ZSBTb2x1dGlvbiIsImxheWVyX2ZvbnRfc2l6ZSI6IiIsImxheWVyX2JhY2tncm91bmRfY29sb3IiOiIiLCJsYXllcl9jb2xvciI6IiIsImxheWVyX2xpbmsiOiIiLCJsYXllcl90YXJnZXQiOiJzYW1lIiwibGF5ZXJfdG9wIjoiMTY5IiwibGF5ZXJfbGVmdCI6IjAiLCJsYXllcl90cmFuc2l0aW9uIjoid2lwZWxlZnQiLCJ0aW1lX3N0YXJ0IjpudWxsfSx7ImxheWVyX3ZpZGVvX3R5cGUiOiJ5b3V0dWJlIiwibGF5ZXJfdmlkZW9faWQiOiIiLCJsYXllcl92aWRlb19oZWlnaHQiOiIyMDAiLCJsYXllcl92aWRlb193aWR0aCI6IjMwMCIsImxheWVyX3ZpZGVvX3RodW1iIjoiIiwibGF5ZXJfaWQiOiIxXzIiLCJsYXllcl9jb250ZW50IjoiIiwibGF5ZXJfdHlwZSI6InRleHQiLCJsYXllcl9zdGF0dXMiOiIxIiwibGF5ZXJfY2xhc3MiOiJzbWFsbF90ZXh0IiwibGF5ZXJfY2FwdGlvbiI6IldvcmtzIG9uIERlc2t0b3BzLCBOb3RlYm9va3MsIFRhYmxldHMgX0FTTV8gU21hcnRwaG9uZXMiLCJsYXllcl9mb250X3NpemUiOiIiLCJsYXllcl9iYWNrZ3JvdW5kX2NvbG9yIjoiIiwibGF5ZXJfY29sb3IiOiIiLCJsYXllcl9saW5rIjoiIiwibGF5ZXJfdGFyZ2V0Ijoic2FtZSIsImxheWVyX3RvcCI6IjIyOSIsImxheWVyX2xlZnQiOiIwIiwibGF5ZXJfdHJhbnNpdGlvbiI6IndpcGVyaWdodCIsInRpbWVfc3RhcnQiOm51bGx9LHsibGF5ZXJfdmlkZW9fdHlwZSI6InlvdXR1YmUiLCJsYXllcl92aWRlb19pZCI6IiIsImxheWVyX3ZpZGVvX2hlaWdodCI6IjIwMCIsImxheWVyX3ZpZGVvX3dpZHRoIjoiMzAwIiwibGF5ZXJfdmlkZW9fdGh1bWIiOiIiLCJsYXllcl9pZCI6IjFfMyIsImxheWVyX2NvbnRlbnQiOiIiLCJsYXllcl90eXBlIjoidGV4dCIsImxheWVyX3N0YXR1cyI6IjEiLCJsYXllcl9jbGFzcyI6ImJpZ19ibGFjayIsImxheWVyX2NhcHRpb24iOiJTaG93IG5vdyIsImxheWVyX2ZvbnRfc2l6ZSI6IiIsImxheWVyX2JhY2tncm91bmRfY29sb3IiOiIiLCJsYXllcl9jb2xvciI6IiIsImxheWVyX2xpbmsiOiIiLCJsYXllcl90YXJnZXQiOiJzYW1lIiwibGF5ZXJfdG9wIjoiMjk3IiwibGF5ZXJfbGVmdCI6IjAiLCJsYXllcl90cmFuc2l0aW9uIjoid2lwZWRvd24iLCJ0aW1lX3N0YXJ0IjpudWxsfV0='; } $mod_slide->add(); #2 $mod_slide = new LeoSlideshowSlide(); $mod_slide->id_group = $mod_group->id; $mod_slide->position = 0; $mod_slide->active = 1; $mod_slide->params = 'eyJkZWxheSI6IjUwMDAiLCJncm91cF9pZCI6IjEiLCJlbmFibGVfbGluayI6IjEiLCJ0YXJnZXQiOiJzYW1lIiwic3RhcnRfZGF0ZV90aW1lIjoiIiwiZW5kX2RhdGVfdGltZSI6IiIsImJ1bGxldF9jbGFzcyI6IiJ9'; foreach ($languages as $language) { $mod_slide->title[$language['id_lang']] = 'Sample slider 2'; $mod_slide->link[$language['id_lang']] = ''; $mod_slide->image[$language['id_lang']] = 'sample_slider_2.jpg'; $mod_slide->thumbnail[$language['id_lang']] = ''; $mod_slide->video[$language['id_lang']] = 'eyJ1c2V2aWRlbyI6IjAiLCJ2aWRlb2lkIjoiIiwidmlkZW9hdXRvIjoiMCIsImJhY2tncm91bmRfY29sb3IiOiIiLCJidWxsZXRfZGVzY3JpcHRpb24iOiIifQ=='; $mod_slide->layersparams[$language['id_lang']] = 'W3sibGF5ZXJfdmlkZW9fdHlwZSI6InlvdXR1YmUiLCJsYXllcl92aWRlb19pZCI6IiIsImxheWVyX3ZpZGVvX2hlaWdodCI6IjIwMCIsImxheWVyX3ZpZGVvX3dpZHRoIjoiMzAwIiwibGF5ZXJfdmlkZW9fdGh1bWIiOiIiLCJsYXllcl9pZCI6IjFfMSIsImxheWVyX2NvbnRlbnQiOiIiLCJsYXllcl90eXBlIjoidGV4dCIsImxheWVyX3N0YXR1cyI6IjEiLCJsYXllcl9jbGFzcyI6ImxhcmdlX3RleHQiLCJsYXllcl9jYXB0aW9uIjoiU2xpZGVzaG93IiwibGF5ZXJfZm9udF9zaXplIjoiIiwibGF5ZXJfYmFja2dyb3VuZF9jb2xvciI6IiIsImxheWVyX2NvbG9yIjoiIiwibGF5ZXJfbGluayI6IiIsImxheWVyX3RhcmdldCI6InNhbWUiLCJsYXllcl90b3AiOiIxNTgiLCJsYXllcl9sZWZ0IjoiMCIsImxheWVyX3RyYW5zaXRpb24iOiJ3aXBlbGVmdCIsInRpbWVfc3RhcnQiOm51bGx9LHsibGF5ZXJfdmlkZW9fdHlwZSI6InlvdXR1YmUiLCJsYXllcl92aWRlb19pZCI6IiIsImxheWVyX3ZpZGVvX2hlaWdodCI6IjIwMCIsImxheWVyX3ZpZGVvX3dpZHRoIjoiMzAwIiwibGF5ZXJfdmlkZW9fdGh1bWIiOiIiLCJsYXllcl9pZCI6IjFfMiIsImxheWVyX2NvbnRlbnQiOiIiLCJsYXllcl90eXBlIjoidGV4dCIsImxheWVyX3N0YXR1cyI6IjEiLCJsYXllcl9jbGFzcyI6InNtYWxsX3RleHQiLCJsYXllcl9jYXB0aW9uIjoiVGV4dCwgSW1hZ2UsIFZpZGVvLCBTaG9ydGNvZGUsIEhUTUwgQ29udGVudCBMYXllcnMiLCJsYXllcl9mb250X3NpemUiOiIiLCJsYXllcl9iYWNrZ3JvdW5kX2NvbG9yIjoiIiwibGF5ZXJfY29sb3IiOiIiLCJsYXllcl9saW5rIjoiIiwibGF5ZXJfdGFyZ2V0Ijoic2FtZSIsImxheWVyX3RvcCI6IjIxOSIsImxheWVyX2xlZnQiOiIwIiwibGF5ZXJfdHJhbnNpdGlvbiI6IndpcGVyaWdodCIsInRpbWVfc3RhcnQiOm51bGx9LHsibGF5ZXJfdmlkZW9fdHlwZSI6InlvdXR1YmUiLCJsYXllcl92aWRlb19pZCI6IiIsImxheWVyX3ZpZGVvX2hlaWdodCI6IjIwMCIsImxheWVyX3ZpZGVvX3dpZHRoIjoiMzAwIiwibGF5ZXJfdmlkZW9fdGh1bWIiOiIiLCJsYXllcl9pZCI6IjFfMyIsImxheWVyX2NvbnRlbnQiOiIiLCJsYXllcl90eXBlIjoidGV4dCIsImxheWVyX3N0YXR1cyI6IjEiLCJsYXllcl9jbGFzcyI6ImJpZ19ibGFjayIsImxheWVyX2NhcHRpb24iOiJTaG93IG5vdyIsImxheWVyX2ZvbnRfc2l6ZSI6IiIsImxheWVyX2JhY2tncm91bmRfY29sb3IiOiIiLCJsYXllcl9jb2xvciI6IiIsImxheWVyX2xpbmsiOiIiLCJsYXllcl90YXJnZXQiOiJzYW1lIiwibGF5ZXJfdG9wIjoiMjcyIiwibGF5ZXJfbGVmdCI6IjAiLCJsYXllcl90cmFuc2l0aW9uIjoid2lwZXVwIiwidGltZV9zdGFydCI6bnVsbH1d'; } $mod_slide->add(); #3 $mod_slide = new LeoSlideshowSlide(); $mod_slide->id_group = $mod_group->id; $mod_slide->position = 0; $mod_slide->active = 1; $mod_slide->params = 'eyJkZWxheSI6IjUwMDAiLCJncm91cF9pZCI6IjEiLCJlbmFibGVfbGluayI6IjEiLCJ0YXJnZXQiOiJzYW1lIiwic3RhcnRfZGF0ZV90aW1lIjoiIiwiZW5kX2RhdGVfdGltZSI6IiIsImJ1bGxldF9jbGFzcyI6IiJ9'; foreach ($languages as $language) { $mod_slide->title[$language['id_lang']] = 'Sample slider 3'; $mod_slide->link[$language['id_lang']] = ''; $mod_slide->image[$language['id_lang']] = 'sample_slider_3.png'; $mod_slide->thumbnail[$language['id_lang']] = ''; $mod_slide->video[$language['id_lang']] = 'eyJ1c2V2aWRlbyI6IjAiLCJ2aWRlb2lkIjoiIiwidmlkZW9hdXRvIjoiMCIsImJhY2tncm91bmRfY29sb3IiOiIiLCJidWxsZXRfZGVzY3JpcHRpb24iOiIifQ=='; $mod_slide->layersparams[$language['id_lang']] = 'W3sibGF5ZXJfdmlkZW9fdHlwZSI6InlvdXR1YmUiLCJsYXllcl92aWRlb19pZCI6IiIsImxheWVyX3ZpZGVvX2hlaWdodCI6IjIwMCIsImxheWVyX3ZpZGVvX3dpZHRoIjoiMzAwIiwibGF5ZXJfdmlkZW9fdGh1bWIiOiIiLCJsYXllcl9pZCI6IjFfMSIsImxheWVyX2NvbnRlbnQiOiIiLCJsYXllcl90eXBlIjoidGV4dCIsImxheWVyX3N0YXR1cyI6IjEiLCJsYXllcl9jbGFzcyI6ImxhcmdlX3RleHQiLCJsYXllcl9jYXB0aW9uIjoiVHJ1ZSBNdWx0aS1NZWRpYSBDb250ZW50IiwibGF5ZXJfZm9udF9zaXplIjoiIiwibGF5ZXJfYmFja2dyb3VuZF9jb2xvciI6IiIsImxheWVyX2NvbG9yIjoiIiwibGF5ZXJfbGluayI6IiIsImxheWVyX3RhcmdldCI6InNhbWUiLCJsYXllcl90b3AiOiIxNTQiLCJsYXllcl9sZWZ0IjoiMCIsImxheWVyX3RyYW5zaXRpb24iOiJ3aXBlbGVmdCIsInRpbWVfc3RhcnQiOm51bGx9LHsibGF5ZXJfdmlkZW9fdHlwZSI6InlvdXR1YmUiLCJsYXllcl92aWRlb19pZCI6IiIsImxheWVyX3ZpZGVvX2hlaWdodCI6IjIwMCIsImxheWVyX3ZpZGVvX3dpZHRoIjoiMzAwIiwibGF5ZXJfdmlkZW9fdGh1bWIiOiIiLCJsYXllcl9pZCI6IjFfMiIsImxheWVyX2NvbnRlbnQiOiIiLCJsYXllcl90eXBlIjoidGV4dCIsImxheWVyX3N0YXR1cyI6IjEiLCJsYXllcl9jbGFzcyI6InNtYWxsX3RleHQiLCJsYXllcl9jYXB0aW9uIjoiSFRNTCA1LCBZb3V0dWJlIF9BU01fIFZpbWVvIFZpZGVvIFN1cHBvcnQiLCJsYXllcl9mb250X3NpemUiOiIiLCJsYXllcl9iYWNrZ3JvdW5kX2NvbG9yIjoiIiwibGF5ZXJfY29sb3IiOiIiLCJsYXllcl9saW5rIjoiIiwibGF5ZXJfdGFyZ2V0Ijoic2FtZSIsImxheWVyX3RvcCI6IjIwOCIsImxheWVyX2xlZnQiOiIwIiwibGF5ZXJfdHJhbnNpdGlvbiI6IndpcGVyaWdodCIsInRpbWVfc3RhcnQiOm51bGx9LHsibGF5ZXJfdmlkZW9fdHlwZSI6InlvdXR1YmUiLCJsYXllcl92aWRlb19pZCI6IiIsImxheWVyX3ZpZGVvX2hlaWdodCI6IjIwMCIsImxheWVyX3ZpZGVvX3dpZHRoIjoiMzAwIiwibGF5ZXJfdmlkZW9fdGh1bWIiOiIiLCJsYXllcl9pZCI6IjFfMyIsImxheWVyX2NvbnRlbnQiOiIiLCJsYXllcl90eXBlIjoidGV4dCIsImxheWVyX3N0YXR1cyI6IjEiLCJsYXllcl9jbGFzcyI6ImJpZ19ibGFjayIsImxheWVyX2NhcHRpb24iOiJTaG93IG5vdyIsImxheWVyX2ZvbnRfc2l6ZSI6IiIsImxheWVyX2JhY2tncm91bmRfY29sb3IiOiIiLCJsYXllcl9jb2xvciI6IiIsImxheWVyX2xpbmsiOiIiLCJsYXllcl90YXJnZXQiOiJzYW1lIiwibGF5ZXJfdG9wIjoiMjYzIiwibGF5ZXJfbGVmdCI6IjAiLCJsYXllcl90cmFuc2l0aW9uIjoid2lwZWxlZnQiLCJ0aW1lX3N0YXJ0IjpudWxsfV0='; } $mod_slide->add(); #COPY IMAGE TO THEME if (!is_dir(LeoSlideshowHelper::getImgThemeDir())) { mkdir(LeoSlideshowHelper::getImgThemeDir(), 0755, true); } $theme_dir = _PS_ROOT_DIR_.'/themes/'.LeoSlideshowHelper::getThemeName().'/'; $module_dir = _PS_MODULE_DIR_.'leoslideshow/'; include_once(_PS_MODULE_DIR_.'leoslideshow/libs/phpcopy.php'); PhpCopy::safeCopy($module_dir.'views/img/demo/', $theme_dir.'assets/img/modules/leoslideshow'); return true; } /** * @see Module::uninstall() */ public function uninstall() { $id_tab = (int)Tab::getIdFromClassName('AdminLeoSlideshow'); if ($id_tab) { $tab = new Tab($id_tab); $tab->delete(); } $id_tab = (int)Tab::getIdFromClassName('AdminLeoSlideshowMenuModule'); if ($id_tab) { $tab = new Tab($id_tab); $tab->delete(); } Configuration::deleteByName('LEOSLIDESHOW_GROUP_DEFAULTTAB'); Configuration::deleteByName('LEOSLIDESHOW_GROUP_DE'); /* Deletes Module */ if (parent::uninstall() && $this->unregisterLeoHook()) { /* Deletes tables */ $res = $this->deleteTables(); return $res; } return false; } /** * Creates tables */ protected function createTables() { if ($this->_installDataSample()) { return true; } /* Group */ $res = (bool)Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.$this->name.'_groups` ( `id_'.$this->name.'_groups` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `id_shop` int(10) unsigned NOT NULL, `hook` varchar(64) DEFAULT NULL, `active` tinyint(1) unsigned NOT NULL DEFAULT \'1\', `params` text NOT NULL, `active_ap` tinyint(1) DEFAULT NULL, `randkey` varchar(255) DEFAULT NULL, PRIMARY KEY (`id_'.$this->name.'_groups`, `id_shop`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8; '); /* Slides configuration */ $res &= Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.$this->name.'_slides` ( `id_'.$this->name.'_slides` int(10) unsigned NOT NULL AUTO_INCREMENT, `id_group` int(11) NOT NULL, `position` int(10) unsigned NOT NULL DEFAULT \'0\', `active` tinyint(1) unsigned NOT NULL DEFAULT \'1\', `params` text NOT NULL, PRIMARY KEY (`id_'.$this->name.'_slides`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8; '); /* Slides lang configuration */ $res &= Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.$this->name.'_slides_lang` ( `id_'.$this->name.'_slides` int(10) unsigned NOT NULL, `id_lang` int(10) unsigned NOT NULL, `title` varchar(255) NOT NULL, `link` varchar(255) NOT NULL, `image` varchar(255) NOT NULL, `thumbnail` varchar(255) NOT NULL, `video` text, `layersparams` text, PRIMARY KEY (`id_'.$this->name.'_slides`,`id_lang`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8; '); $res &= $this->installSamples(); return $res; } private function _installDataSample() { if (!file_exists(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php')) { return false; } require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php'); $data_sample_class = 'Datasample'; $sample = new $data_sample_class(1); return $sample->processImport($this->name); } /** * deletes tables */ protected function deleteTables() { //return true; return Db::getInstance()->execute(' DROP TABLE IF EXISTS `'._DB_PREFIX_.$this->name.'_groups`, `'._DB_PREFIX_.$this->name.'_slides`, `'._DB_PREFIX_.$this->name.'_slides_lang`; '); } public function postProcess() { if (count($this->errors) > 0) { $this->ajax = Tools::getValue('ajax') || Tools::isSubmit('ajax'); if ($this->ajax) { $array = array('hasError' => true, 'errors' => $this->errors[0]); die(Tools::jsonEncode($array)); } return; } if (Tools::isSubmit('importGroup')) { $this->importGroup(); } if (Tools::getIsset('leoajax') && Tools::getValue('leoajax') == 1) { $this->slideProcessAjax(); } if (Tools::getIsset('correctGroup') && Tools::getValue('correctGroup')) { $this->correctDataGroup(); } if (Tools::getIsset('copylang') && Tools::getValue('copylang')) { $this->copyLang(); } // Copy js, css, image, tpl if (Tools::getIsset('leo_copy_lib_to_theme') && Tools::getValue('leo_copy_lib_to_theme') == 1) { LeoSlideshowHelper::copyToTheme(); } //action for group if (Tools::isSubmit('editgroup') || Tools::isSubmit('submitGroup') || Tools::isSubmit('deletegroup') || Tools::isSubmit('addNewGroup') || Tools::isSubmit('exportgroup') || Tools::isSubmit('changeGStatus')) { if (Tools::isSubmit('submitGroup') || Tools::isSubmit('deletegroup') || Tools::isSubmit('changeGStatus')) { if ($this->postValidation()) { $this->_postProcess(); } } //save group id in config to edit in next time when open module if (Tools::isSubmit('submitGroup') || Tools::isSubmit('editgroup') || Tools::isSubmit('changeGStatus')) { Configuration::updateValue('LEOSLIDESHOW_GROUP_DE', (int)Tools::getValue('id_group')); } } elseif (Tools::isSubmit('showsliders') || Tools::isSubmit('submitSlider') || Tools::isSubmit('editSlider') || Tools::isSubmit('deleteSlider') || Tools::isSubmit('addNewSlider') || Tools::isSubmit('changeStatus')) { # Add new Slide if (Tools::isSubmit('submitSlider') || Tools::isSubmit('deleteSlider') || Tools::isSubmit('changeStatus') || Tools::getValue('duplicateSlider')) { if ($this->postValidation()) { $this->_postProcess(); } } } //export process if (Tools::getValue('exportGroup')) { $this->exportGroup(); } } public function getContent() { $this->errors = array(); if (!$this->access('configure')) { $this->errors[] = $this->trans('You do not have permission to configure this.', array(), 'Admin.Notifications.Error'); $this->html .= $this->displayError($this->trans('You do not have permission to configure this.', array(), 'Admin.Notifications.Error')); } $this->postProcess(); $media_dir = $this->getMediaDir(); $this->context->controller->addJS(__PS_BASE_URI__.$media_dir.'js/jquery-validation-1.9.0/jquery.validate.js'); $this->context->controller->addJS(__PS_BASE_URI__.$media_dir.'js/admin/show.js'); $this->context->controller->addCSS(__PS_BASE_URI__.$media_dir.'css/jquery-validation-1.9.0/screen.css'); $this->html .= $this->headerHTML(); if (Tools::isSubmit('submitUpdateModule')) { $id_tab = (int)Tab::getIdFromClassName('AdminLeoSlideshow'); if ($id_tab) { $tab = new Tab($id_tab); $tab->delete(); } //display manage image in left menu $tab = new Tab(); $tab->active = 1; $tab->class_name = 'AdminLeoSlideshow'; $tab->name = array(); foreach (Language::getLanguages(false) as $lang) { $tab->name[$lang['id_lang']] = 'LeoSlideShow'; } $tab->id_parent = -1; $tab->module = $this->name; $tab->add(); $this->_confirmations[] = 'Update and Correct Module is successful'; } //action for group if (Tools::isSubmit('editgroup') || Tools::isSubmit('submitGroup') || Tools::isSubmit('deletegroup') || Tools::isSubmit('addNewGroup') || Tools::isSubmit('exportgroup') || Tools::isSubmit('changeGStatus')) { $this->html .= $this->renderGroupList(); $this->html .= $this->renderGroupConfig(); } elseif (Tools::isSubmit('showsliders') || Tools::isSubmit('submitSlider') || Tools::isSubmit('editSlider') || Tools::isSubmit('deleteSlider') || Tools::isSubmit('addNewSlider') || Tools::isSubmit('changeStatus')) { # Add new Slide $this->html .= $this->renderList(); $this->html .= $this->renderConfig(); $this->html .= $this->renderSliderForm(); } else { # Action for slideshow $this->html .= $this->renderGroupList(); $this->html .= $this->renderGroupConfig(); } return $this->html; } public function getAllSlides() { $this->context = Context::getContext(); $id_shop = $this->context->shop->id; $sql = 'SELECT * FROM '._DB_PREFIX_.'leoslideshow_groups gr WHERE gr.id_shop = '.(int)$id_shop.' AND gr.randkey IS NOT NULL AND gr.randkey != "" ' . 'ORDER BY gr.id_leoslideshow_groups AND gr.randkey IS NOT NULL'; return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); } /** * this function is only for developer of leotheme.com * to correct data for group + slider */ public function correctDataGroup() { $id_group = Tools::getValue('id_group'); if ($id_group) { $mod_group = new LeoSlideshowGroup($id_group); if (Validate::isLoadedObject($mod_group)) { //correct group data $params = Tools::unSerialize($mod_group->params); if ($params) { $mod_group->params = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($params)); $mod_group->save(); } //correct slider $sliders = $this->getSlides($mod_group->id); foreach ($sliders as $slider) { $mod_slide = new LeoSlideshowSlide($slider['id_slide']); if (Validate::isLoadedObject($mod_slide)) { $tmp = Tools::unSerialize($mod_slide->params); if ($tmp) { $mod_slide->params = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($tmp)); } $tmp_slide = array(); foreach ($mod_slide->video as $key => $value) { $tmp = Tools::unSerialize($value); if ($tmp) { $tmp_slide[$key] = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($tmp)); } } if ($tmp_slide) { $mod_slide->video = $tmp_slide; } $tmp_slide = array(); foreach ($mod_slide->layersparams as $key => $value) { $tmp = Tools::unSerialize($value); if ($tmp) { $tmp_slide[$key] = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($tmp)); } } if ($tmp_slide) { $mod_slide->layersparams = $tmp_slide; } //print_r($sliderObj);die; $mod_slide->save(); } } } } } public function copyLang() { $id_group = Tools::getValue('id_group'); if ($id_group) { $sliders = $this->getSlides($id_group); $mod_slide = new LeoSlideshowSlide(); $defined = $mod_slide->getDefinition($mod_slide); $defined = $defined['fields']; foreach ($sliders as $slider) { $mod_slide = new LeoSlideshowSlide($slider['id_slide']); if ($mod_slide->id) { $languages = Language::getLanguages(false); $default_lang = (int)Configuration::get('PS_LANG_DEFAULT'); $tmp = array(); foreach ($languages as $language) { if ($language['id_lang'] == $default_lang) { # module validation foreach ($defined as $key => $val) { # module validation if (isset($val['lang']) && $val['lang'] == 1) { # module validation $tmp[$key] = $mod_slide->{$key}[$default_lang]; } } break; } } foreach ($languages as $language) { if ($language['id_lang'] != $default_lang) { foreach ($tmp as $key => $val) { if ($key == 'layersparams') { $layers_params = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($val), true); if (is_array($layers_params)) { // PARAMS IS VALID : NOT NULL, NOT EMPTY foreach ($layers_params as &$layer) { # module validation $layer['layer_id'] = str_replace($default_lang.'_', $language['id_lang'].'_', $layer['layer_id']); } $mod_slide->layersparams[$language['id_lang']] = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($layers_params)); } } else { # module validation $mod_slide->{$key}[$language['id_lang']] = $val; } } } } $mod_slide->update(); } } } $this->html .= $this->displayConfirmation($this->l('Copy language was successful')); } public function importGroup() { include_once(_PS_MODULE_DIR_.'leoslideshow/controllers/admin/AdminLeoSlideshow.php'); $controller_slide = new AdminLeoSlideshowController(); $res = $controller_slide->importGroup(); if (!$res) { # module validation $this->html .= $this->displayError('The file could not be import.'); } else { # module validation $this->html .= $this->displayConfirmation($this->l('Importing was successful')); } } public function renderList() { //get curent slider data if (Tools::isSubmit('id_slide') && $this->slideExists((int)Tools::getValue('id_slide'))) { # module validation $this->mod_current_slide = new LeoSlideshowSlide((int)Tools::getValue('id_slide')); } else { # module validation $this->mod_current_slide = new LeoSlideshowSlide(); } $slides = $this->getSlides(Tools::getValue('id_group')); foreach ($slides as $key => $slide) { $slides[$key]['status'] = $this->displayStatus($slide['id_slide'], $slide['active'], $slide['id_group'], $slide); } $mod_group = new LeoSlideshowGroup((int)Tools::getValue('id_group')); $id_shop = $this->context->shop->id; if ($id_shop != $mod_group->id_shop) { Tools::redirectAdmin(AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules')); } $this->group_data = array_merge($this->group_data, Tools::jsonDecode(LeoSlideshowSlide::base64Decode($mod_group->params), true)); // $arrayParam['secure_key'] = $this->secure_key; $this->context->smarty->assign(array( 'link' => $this->context->link, 'slides' => $slides, 'id_group' => Tools::getValue('id_group'), 'group_title' => $mod_group->title, 'languages' => $this->context->controller->getLanguages(), 'previewLink' => Context::getContext()->link->getModuleLink($this->name, 'preview', array('secure_key' => $this->secure_key)), 'msecure_key' => $this->secure_key, 'currentSliderID' => $this->mod_current_slide->id, 'leo_slider_list_link' => $this->context->link->getAdminLink('AdminModules').'&configure='.$this->name.'&leoajax=1', )); return $this->display(__FILE__, 'slide_list.tpl'); } /** * return group config form */ public function renderConfig() { $description = $this->l('Add New Slider'); if (!Tools::isSubmit('deleteSlider') && !Tools::isSubmit('addNewSlider') && !Tools::isSubmit('showsliders')) { $description = $this->l('You are editting slider:').' '.$this->mod_current_slide->title[$this->context->language->id]; } //$fullWidthVideo = array(array('id'=>0,'name'=>$this->l('No')),array('id'=>'youtube','name'=>'Youtube'),array('id'=>'vimeo','name'=>'Vimeo')); //general config $fields_form = array( 'form' => array( 'legend' => array( 'title' => $description, 'icon' => 'icon-cogs' ), //'description' =>$description, 'input' => array( array( 'type' => 'slider_button', 'name' => 'slider_button', 'lang' => false, ), array( 'type' => 'text', 'label' => $this->l('Slider Title'), 'name' => 'title', 'class' => 'slider-title', 'required' => 1, 'lang' => true, ), array( 'type' => 'switch', 'label' => $this->l('Enable'), 'name' => 'active_slide', 'is_bool' => true, 'values' => $this->getSwitchValue('active'), ), array( 'type' => 'text', 'label' => $this->l('Delay'), 'name' => 'slider[delay]', 'class' => 'fixed-width-xl digits', ), array( 'type' => 'select', 'label' => $this->l('Group'), 'name' => 'slider[group_id]', 'options' => array( 'query' => LeoSlideshowGroup::getGroupOption(), 'id' => 'id', 'name' => 'name', ) ), array( 'type' => 'switch', 'label' => $this->l('Enable Link'), 'name' => 'slider[enable_link]', 'is_bool' => true, 'lang' => true, 'values' => $this->getSwitchValue('enable_link'), ), array( 'type' => 'text', 'label' => $this->l('Link'), 'name' => 'link', 'lang' => true, ), array( 'type' => 'select', 'label' => $this->l('Link Open in'), 'name' => 'slider[target]', 'options' => array( 'query' => LeoSlideshowStatus::getInstance()->getSliderTargetOption(), 'id' => 'id', 'name' => 'name', ) ), array( 'type' => 'datetime', 'label' => $this->l('Start Date Time'), 'name' => 'slider[start_date_time]', 'lang' => false, ), array( 'type' => 'datetime', 'label' => $this->l('Start End Time'), 'name' => 'slider[end_date_time]', 'lang' => false, ), array( 'type' => 'text', 'label' => $this->l('Bullet Number Class'), 'name' => 'slider[bullet_class]', 'lang' => false, 'desc' => $this->l('Setting CSS Class for bullet, and must be enabled "Custom HTML Enable" in Group.'), 'class' => 'fixed-width-xl', ), array( 'type' => 'textarea', 'label' => $this->l('Bullet Description'), 'name' => 'bullet_description', 'rows' => 5, 'cols' => 60, 'lang' => true, 'desc' => $this->l('Showing Custom HTML in bullet, and must be enabled "Custom HTML Enable" in Group.'), ), //thumb + main image array( 'type' => 'file_lang', 'label' => $this->l('Thumbnail'), 'name' => 'thumbnail', 'lang' => true, ), array( 'type' => 'video_config', 'label' => $this->l('Video'), 'name' => 'slider[video]', 'lang' => true, ) ) ), ); if (Tools::getValue('id_slide') && $this->slideExists((int)Tools::getValue('id_slide'))) { $fields_form['form']['input'][] = array('type' => 'hidden', 'name' => 'id_slide'); } $fields_form['form']['input'][] = array('type' => 'hidden', 'name' => 'id_group'); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $helper->module = $this; $helper->name_controller = 'slideshow'; $id_langs = Language::getIDs(false); $lang = new Language($id_langs['0']); $helper->default_form_language = $lang->id; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $this->fields_form = array(); $helper->identifier = $this->identifier; $helper->submit_action = 'submitSlider'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $fields_value = $this->getSliderFieldsValues(); # Image External Link if(isset($fields_value['thumbnail']) && $fields_value['thumbnail']){ foreach ($this->context->controller->getLanguages() as $lang) { $id_lang = $lang['id_lang']; if ((!(Tools::substr($fields_value['thumbnail'][$id_lang], 0, 7) == 'http://')) && (!(Tools::substr($fields_value['thumbnail'][$id_lang], 0, 8) == 'https://'))) { $fields_value['thumbnail'][$id_lang] = $this->img_url . $fields_value['thumbnail'][$id_lang]; } } } $helper->tpl_vars = array( 'fields_value' => $this->getSliderFieldsValues(), 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id, 'sliderGroup' => $this->group_data, 'psBaseModuleUri' => $this->img_url, 'color' => true ); return $helper->generateForm(array($fields_form)); } /** * generate data */ public function getSliderFieldsValues() { $fields = array(); $slide = $this->mod_current_slide; if (isset($this->mod_current_slide->id) && $this->mod_current_slide->id) { $fields['id_slide'] = (int)$this->mod_current_slide->id; $slide = $this->mod_current_slide; $this->slider_data = array_merge($this->slider_data, Tools::jsonDecode(LeoSlideshowSlide::base64Decode($slide->params), true)); } $fields['active_slide'] = Tools::getValue('active_slide', $slide->active); $fields['has_picture'] = true; $fields['id_group'] = Tools::getValue('id_group', $slide->id_group); $languages = Language::getLanguages(false); foreach ($languages as $lang) { $fields['image'][$lang['id_lang']] = Tools::getValue('image_'.(int)$lang['id_lang'], $slide->image[$lang['id_lang']]); $fields['thumbnail'][$lang['id_lang']] = Tools::getValue('thumbnail_'.(int)$lang['id_lang'], $slide->thumbnail[$lang['id_lang']]); $fields['title'][$lang['id_lang']] = Tools::getValue('title_'.(int)$lang['id_lang'], $slide->title[$lang['id_lang']]); $fields['link'][$lang['id_lang']] = Tools::getValue('link_'.(int)$lang['id_lang'], $slide->link[$lang['id_lang']]); if ($slide->video) { if ($slide->video[(int)$lang['id_lang']]) { foreach (Tools::jsonDecode(LeoSlideshowSlide::base64Decode($slide->video[(int)$lang['id_lang']]), true) as $key => $value) { $fields[$key][$lang['id_lang']] = Tools::getValue($key.'_.'.(int)$lang['id_lang'], $value); } } } else { $fields['usevideo'][$lang['id_lang']] = 0; $fields['videoid'][$lang['id_lang']] = ''; $fields['videoauto'][$lang['id_lang']] = 0; $fields['background_color'][$lang['id_lang']] = ''; $fields['bullet_description'][$lang['id_lang']] = ''; } } //slider no lang foreach ($this->slider_data as $key => $value) { $fields['slider['.$key.']'] = Tools::getValue('slider['.$key.']', $value); } //DONGND:: fix id group with data import or duplicate $fields['slider[group_id]'] = Tools::getValue('id_group', $slide->id_group); //slider with lang return $fields; } /** * slider Editor */ public function renderSliderForm() { $layer_animation = array(array('id' => 'fade', 'name' => $this->l('Fade')), array('id' => 'sft', 'name' => $this->l('Short from Top')), array('id' => 'sfb', 'name' => $this->l('Short from Bottom')), array('id' => 'sfr', 'name' => $this->l('Short from Right')), array('id' => 'sfl', 'name' => $this->l('Short from Left')), array('id' => 'lft', 'name' => $this->l('Long from Top')), array('id' => 'lfb', 'name' => $this->l('Long from Bottom')), array('id' => 'lfr', 'name' => $this->l('Long from Right')), array('id' => 'lfl', 'name' => $this->l('Long from Left')), array('id' => 'randomrotate', 'name' => $this->l('Random Rotate'))); $layers = array(); if ($this->mod_current_slide->layersparams) { $layers = array(); //echo "
";print_r($this->_currentSlider->layersparams);die;

            foreach ($this->mod_current_slide->layersparams as $key => $val) {
                $layer = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($val), true);
                //$layer = $std->layers;
                if ($layer) {
//                    foreach ($layer as $k => &$l) {
                    foreach ($layer as $k => &$l) {
                        if (isset($l['layer_caption'])) {
                            $l['layer_caption'] = addslashes(str_replace("'", ''', html_entity_decode(str_replace(array('\n', '\r', '\t'), '', utf8_decode($l['layer_caption'])), ENT_QUOTES, 'UTF-8')));
                        }
                        
                        //DONGND:: fix data when add new language
                        if (isset($l['layer_id']) && $l['layer_id'] != ($key.'_'.($k+1))) {
                            // echo 'test';
                            $l['layer_id'] = $key.'_'.($k+1);
                        }
                    }
                }
                
                $content = Tools::jsonEncode($layer);
                $content = str_replace('\r\n', '', $content);
                $layers[] = array('langID' => $key, 'content' => $content);
            }
        }
        //echo "
";print_r($layers);die;
        $slide_img = $this->mod_current_slide->image;
        $slide_back = array();
        if ($this->mod_current_slide->video) {
            foreach ($this->mod_current_slide->video as $key => $val) {
                $video = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($val), true);
                $slide_back[$key] = '';
                if (isset($video['background_color'])) {
                    $slide_back[$key] = $video['background_color'];
                }
            }
        }
        //echo "
";print_r($sliderBack);die;
//            unset($layers['1']);
//            unset($layers['3']);

        # Image External Link
        if($slide_img){
            foreach ($this->context->controller->getLanguages() as $lang) {
                $id_lang = $lang['id_lang'];
                if ((!(Tools::substr($slide_img[$id_lang], 0, 7) == 'http://')) && (!(Tools::substr($slide_img[$id_lang], 0, 8) == 'https://')) && (!(Tools::substr($slide_img[$id_lang], 0, 10) == 'data:image'))    ) {
                    $slide_img[$id_lang] = $this->img_url . $slide_img[$id_lang];
                }
            }
        }
        
        
        $this->context->smarty->assign(array(
            'link' => $this->context->link,
            // 'leo_admin_module_link' => AdminController::$currentIndex.'&token='.Tools::getAdminTokenLite('AdminModules'),
            'leo_admin_module_link' => $this->context->link->getAdminLink('AdminModules'),
            'slideImg' => $slide_img,
            'sliderBack' => $slide_back,
            'languages' => $this->context->controller->getLanguages(),
            'id_language' => $this->context->language->id,
            'layerAnimation' => $layer_animation,
            'sliderGroup' => $this->group_data,
            'layers' => $layers,
            'ajaxfilelink' => Context::getContext()->link->getAdminLink('AdminLeoSlideshow'),
            'formLink' => _MODULE_DIR_.$this->name.'/ajax_'.$this->name.'.php?secure_key='.$this->secure_key.'&action=submitslider',
            'psBaseModuleUri' => $this->img_url,
            'previewLink' => Context::getContext()->link->getModuleLink($this->name, 'preview', array('secure_key' => $this->secure_key)),
            'msecure_key' => $this->secure_key,
            'id_group' => Tools::getValue('id_group'),
            'id_slide' => $this->mod_current_slide->id,
            'delay' => LeoSlideshowSlide::showDelay((int)Tools::getValue('id_slide'), $this->slider_data['delay'], $this->group_data['delay']),
        ));

        return $this->display(__FILE__, 'slider_editor.tpl');
    }

    public function checkExistAnyGroup()
    {
        $this->context = Context::getContext();
        $id_shop = $this->context->shop->id;
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT * FROM '._DB_PREFIX_.'leoslideshow_groups gr WHERE gr.id_shop = '.(int)$id_shop);
    }

    /**
     * get all slider data
     */
    public function getSlides($id_group, $active = null)
    {
        $this->context = Context::getContext();
        $id_lang = $this->context->language->id;

        $sql = 'SELECT lsl.`id_leoslideshow_slides` as id_slide, lsl.*,lsll.*
                    FROM '._DB_PREFIX_.'leoslideshow_slides lsl
                    LEFT JOIN '._DB_PREFIX_.'leoslideshow_slides_lang lsll ON (lsl.id_leoslideshow_slides = lsll.id_leoslideshow_slides)
                    WHERE lsl.id_group = '.(int)$id_group.'
                    AND lsll.id_lang = '.(int)$id_lang.($active ? ' AND lsl.`active` = 1' : ' ').'
                    ORDER BY lsl.position';
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
    }

    /**
     * return list group
     */
    public function renderGroupList()
    {
        $mod_group = new LeoSlideshowGroup();
        $id_shop = $this->context->shop->id;
        $groups = $mod_group->getGroups(null, $id_shop);

        foreach ($groups as $key => $group) {
            if ($group['id_leoslideshow_groups'] == Tools::getValue('id_group') || (!Tools::getValue('id_group') && !Tools::isSubmit('addNewGroup') && $group['id_leoslideshow_groups'] == Configuration::get('LEOSLIDESHOW_GROUP_DE'))) {
                $this->current_group['id_group'] = $group['id_leoslideshow_groups'];
                $this->current_group['title'] = $group['title'];

                $params = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($group['params']), true);
                if ($params) {
                    $group_result = array();
                }
                foreach ($params as $k => $v) {
                    $group_result[$k] = $v;
                }

                $group_result['title'] = $group['title'];
                $group_result['id_leoslideshow_groups'] = $group['id_leoslideshow_groups'];
                $group_result['id_shop'] = $group['id_shop'];
                $group_result['hook'] = $group['hook'];
                $group_result['active'] = $group['active'];

                if ($group_result) {
                    $this->group_data = array_merge($this->group_data, $group_result);
                }
            }

            $groups[$key]['status'] = $this->displayGStatus($group['id_leoslideshow_groups'], $group['active']);
        }
        $this->context->smarty->assign(array(
            'link' => $this->context->link,
            'groups' => $groups,
            'curentGroup' => $this->current_group['id_group'],
            'languages' => $this->context->controller->getLanguages(),
//            'exportLink' => Context::getContext()->link->getAdminLink('AdminLeoSlideshow').'&ajax=1&exportGroup=1',
            'previewLink' => Context::getContext()->link->getModuleLink($this->name, 'preview', array('secure_key' => $this->secure_key)),
            'msecure_key' => $this->secure_key
        ));

        return $this->display(__FILE__, 'group_list.tpl');
    }

    /**
     * return group config form
     */
    public function renderGroupConfig()
    {
        $description = $this->l('Add New Group');
        if (!Tools::isSubmit('deletegroup') && !Tools::isSubmit('addNewGroup') && $this->current_group['id_group']) {
            $description = $this->l('You are editting group:').' '.$this->current_group['title'];
        }

        $select_hook = array();
        $select_hook[] = array('id' => '', 'name' => '');
        foreach ($this->hook_support as $value) {
            $select_hook[] = array('id' => $value, 'name' => $value);
        }

        $full_width = array(array('id' => '', 'name' => $this->l('Boxed')),
            array('id' => 'fullwidth', 'name' => $this->l('Fullwidth')));

        $arr_col = array('12', '10', '9-6', '9', '8', '7-2', '6', '4-8', '4', '3', '2-4', '2');

        $hidden_config = array('hidden-lg-down' => $this->l('Hidden in Large devices'), 'hidden-md-down' => $this->l('Hidden in Medium devices'),
            'hidden-sm-down' => $this->l('Hidden in Small devices'), 'hidden-xs-down' => $this->l('Hidden in Extra small devices'), 'hidden-sp' => $this->l('Hidden in Smart Phone'));

        $fields_form = array();
        $fields_form[0]['form'] = array(
            
                // 'legend' => array(
                    // 'title' => $description,
                    // 'icon' => 'icon-cogs'
                // ),
                
                'input' => array(
                    array(
                        'type' => 'hidden',
                        'name' => 'LEOSLIDESHOW_GROUP_DEFAULTTAB',
                        'default' => '',
                    ),
                    array(
                        'type' => 'group_button',
                        'id_group' => $this->current_group['id_group'],
                        'name' => 'group_button',
                        'lang' => false,
                    ),
                    // array(
                        // 'type' => 'sperator_form',
                        // 'text' => $this->l('General Setting'),
                        // 'name' => 'sperator_form',
                        // 'show_button' => 1,
                        // 'lang' => false,
                    // ),
                    array(
                        'type' => 'text',
                        'label' => $this->l('Group Title'),
                        'name' => 'title_group',
                        'lang' => false,
                        'required' => 1
                    ),
                    array(
                        'type' => 'select',
                        'label' => $this->l('Show in Hook'),
                        'name' => 'hook_group',
                        'options' => array(
                            'query' => $select_hook,
                            'id' => 'id',
                            'name' => 'name',
                        )
                    ),
                    array(
                        'type' => 'text',
                        'label' => $this->l('Delay'),
                        'name' => 'group[delay]',
                        'class' => 'fixed-width-xl digits',
                        'desc' => $this->l('Enter Time(miniseconds) to show each slide. Default 5000'),
                    ),
                    array(
                        'type' => 'text',
                        'label' => $this->l('Starting Slide'),
                        'name' => 'group[start_with_slide]',
                        'class' => 'fixed-width-xl digits',
                        'desc' => $this->l('"Random Starting Slide" must be NO. The value is equal or greater than 0.'),
                        'lang' => false,
                    ),
                    array(
                        'type' => 'select',
                        'label' => $this->l('Timer Autorun '),
                        'name' => 'group[timer_show]',
                        'options' => array(
                            'query' => LeoSlideshowConfig::getTimerOption(),
                            'id' => 'id',
                            'name' => 'name',
                        ),
                    ),
                    array(
                        'type' => 'switch',
                        'label' => $this->l('Timer Stop On Hover'),
                        'name' => 'group[stop_on_hover]',
                        'is_bool' => true,
                        'values' => $this->getSwitchValue('stop_on_hover'),
                    ),
                    array(
                        'type' => 'switch',
                        'label' => $this->l('Random Starting Slide'),
                        'name' => 'group[shuffle_mode]',
                        'is_bool' => true,
                        'values' => $this->getSwitchValue('shuffle_mode'),
                        'desc' => $this->l('This override "Starting Slide" input'),
                    ),
                    array(
                        'type' => 'switch',
                        'label' => $this->l('Enable'),
                        'name' => 'active_group',
                        'is_bool' => true,
                        'values' => $this->getSwitchValue('active'),
                    ),
                    array(
                        'type' => 'select',
                        'label' => $this->l('Slideshow Width Mode'),
                        'name' => 'group[fullwidth]',
                        'class' => 'slideshow-mode',
                        'options' => array(
                            'query' => $full_width,
                            'id' => 'id',
                            'name' => 'name',
                        )
                    ),
                    array(
                        'type' => 'col_width',
                        'label' => $this->l('Medium and Large Desktops Width'),
                        'name' => 'group[md_width]',
                        'class' => 'mode-width mode-',
                        'lang' => false
                    ),
                    array(
                        'type' => 'col_width',
                        'label' => $this->l('Small devices Tablets Width'),
                        'name' => 'group[sm_width]',
                        'class' => 'mode-width mode-',
                        'arrayVal' => $arr_col,
                        'lang' => false
                    ),
                    array(
                        'type' => 'col_width',
                        'label' => $this->l('Extra small devices Phones'),
                        'name' => 'group[xs_width]',
                        'class' => 'mode-width mode-',
                        'arrayVal' => $arr_col,
                        'lang' => false
                    ),
                    array(
                        'type' => 'sperator_form',
                        'text' => $this->l('Mode Boxed: You can config width of slideshow. It will display float with other module'),
                        'class' => 'alert alert-warning mode-width mode-',
                        'name' => 'sperator_form',
                        'lang' => false,
                    ),
                    array(
                        'type' => 'sperator_form',
                        'text' => $this->l('Mode FullWidth: The slideshow will show 100% in container of hook_slideshow. You have to config width of other module in hook_slideshow'),
                        'class' => 'alert alert-warning mode-width mode-fullwidth',
                        'name' => 'sperator_form',
                        'lang' => false,
                    ),
                ),
                'submit' => array(
                    'title' => $this->l('Save'),
                    'class' => 'btn btn-default')
        );
        //DONGND:: image setting
        $fields_form[1]['form'] = array(
            'input' => array(
                array(
                        'type' => 'group_button',
                        'id_group' => $this->current_group['id_group'],
                        'name' => 'group_button',
                        'lang' => false,
                    ),
                // array(
                    // 'type' => 'sperator_form',
                    // 'text' => $this->l('Image Setting'),
                    // 'name' => 'sperator_form',
                    // 'lang' => false,
                // ),
                array(
                    'type' => 'switch',
                    'label' => $this->l('Image Cropping'),
                    'name' => 'group[image_cropping]',
                    'is_bool' => true,
                    'desc' => $this->l('Auto turn off is you use mode "Boxed" for slideshow'),
                    'values' => $this->getSwitchValue('image_cropping'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Image Width'),
                    'name' => 'group[width]',
                    'lang' => false,
                    'desc' => $this->l('Use for resize image and Max-Height')
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Image Height'),
                    'name' => 'group[height]',
                    'lang' => false,
                    'desc' => $this->l('Use for resize image and Max-Height')
                ),
            ),
            'submit' => array(
                    'title' => $this->l('Save'),
                    'class' => 'btn btn-default')
        );
        //DONGND:: css setting
        $fields_form[2]['form'] = array(
            'input' => array(
                # CSS SETTING
                array(
                    'type' => 'group_button',
                    'id_group' => $this->current_group['id_group'],
                    'name' => 'group_button',
                    'lang' => false,
                ),
                // array(
                    // 'type' => 'sperator_form',
                    // 'text' => $this->l('CSS Setting'),
                    // 'name' => 'sperator_form',
                    // 'lang' => false,
                // ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Margin'),
                    'name' => 'group[margin]',
                    'lang' => false,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Padding(border)'),
                    'name' => 'group[padding]',
                    'lang' => false,
                ),
                array(
                    'type' => 'switch',
                    'label' => $this->l('Show Background Image'),
                    'name' => 'group[background_image]',
                    'is_bool' => true,
                    'values' => $this->getSwitchValue('background_image'),
                    'desc' => $this->l('Yes, Frontend will show background image. No, Frontend will show background color. '),
                ),
                array(
                    'type' => 'group_background',
                    'label' => $this->l('Background Image'),
                    'name' => 'group[background_url]',
                    'id' => 'background_url',
                    'lang' => false
                ),
                array(
                    'type' => 'color',
                    'label' => $this->l('Background Color'),
                    'name' => 'group[background_color]',
                    'lang' => false,
                ),
                array(
                    'type' => 'group_class',
                    'label' => $this->l('Group Class'),
                    'name' => 'group[group_class]'
                ),
            ),
            'submit' => array(
                    'title' => $this->l('Save'),
                    'class' => 'btn btn-default')
        );
        
        //DONGND:: navigatior and direction
        $fields_form[3]['form'] = array(
            'input' => array(
                # Navigator
                array(
                        'type' => 'group_button',
                        'id_group' => $this->current_group['id_group'],
                        'name' => 'group_button',
                        'lang' => false,
                    ),
                // array(
                    // 'type' => 'sperator_form',
                    // 'text' => $this->l('Navigator and Direction'),
                    // 'name' => 'sperator_form',
                    // 'lang' => false,
                // ),
                array(
                    'type' => 'switch',
                    'label' => $this->l('Enable Navigator'),
                    'name' => 'group[controlNav]',
                    'is_bool' => true,
                    'values' => $this->getSwitchValue('controlNav'),
                ),
                array(
                    'type' => 'select',
                    'label' => $this->l('Navigator Type'),
                    'name' => 'group[navigator_type]',
                    'options' => array(
                        'query' => LeoSlideshowConfig::getNavigatorType(),
                        'id' => 'id',
                        'name' => 'name',
                    ),
                    'class' => 'form-action',
                ),
                array(
                    'type' => 'leo_switch',
                    'label' => $this->l('Custom HTML Enable'),
                    'name' => 'group[enable_custom_html_bullet]',
                    'is_bool' => true,
                    'values' => $this->getSwitchValue('controlNavTooltipp'),
                    'leo_desc' => $this->l('Showing custom HTML for bullets, and changing Custom HTML in editing slide.'),
                    'class' => 'groupnavigator_type_sub groupnavigator_type-'.LeoSlideshowConfig::IVIEW_NAV_BULLET,
                ),
                array(
                    'type' => 'leo_switch',
                    'label' => $this->l('Tooltip Thumbnai'),
                    'name' => 'group[controlNavTooltip]',
                    'is_bool' => true,
                    'values' => $this->getSwitchValue('controlNavTooltip'),
                    'leo_desc' => $this->l('Show Thumbnail Tooltip when hover over Bullet ( only with Background is Image )'),
                    'class' => 'groupnavigator_type_sub groupnavigator_type-'.LeoSlideshowConfig::IVIEW_NAV_BULLET,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('X position threshold'),
                    'name' => 'group[tooltipX]',
                    'class' => 'fixed-width-xl number groupnavigator_type_sub groupnavigator_type-'.LeoSlideshowConfig::IVIEW_NAV_BULLET,
                    'lang' => false,
                    'desc' => $this->l('Set Left for Tooltip Thumbnail in pixel'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Y position threshold'),
                    'name' => 'group[tooltipY]',
                    'class' => 'fixed-width-xl number groupnavigator_type_sub groupnavigator_type-'.LeoSlideshowConfig::IVIEW_NAV_BULLET,
                    'lang' => false,
                    'desc' => $this->l('Set Top Tooltip Thumbnail in pixel'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Thumbnail Width'),
                    'name' => 'group[nav_thumbnail_width]',
                    'lang' => false,
                    'class' => 'fixed-width-xl digits',
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Thumbnail Height'),
                    'name' => 'group[nav_thumbnail_height]',
                    'lang' => false,
                    'class' => 'fixed-width-xl digits',
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Opacity'),
                    'name' => 'group[controlNavHoverOpacity]',
                    'class' => 'fixed-width-xl number',
                    'desc' => $this->l('Set opacity for Navigator. Value from 0 to 1. Ex 0.6'),
                ),
                array(
                    'type' => 'switch',
                    'label' => $this->l('Enable Direction'),
                    'name' => 'group[directionNav]',
                    'is_bool' => true,
                    'values' => $this->getSwitchValue('directionNav'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Opacity'),
                    'name' => 'group[directionNavHoverOpacity]',
                    'class' => 'fixed-width-xl number',
                    'desc' => $this->l('Set opacity for Direction. Value from 0 to 1. Ex 0.6'),
                ),
                array(
                    'type' => 'switch',
                    'label' => $this->l('Key board'),
                    'name' => 'group[keyboardNav]',
                    'is_bool' => true,
                    'values' => $this->getSwitchValue('keyboardNav'),
                ),
            ),
            'submit' => array(
                    'title' => $this->l('Save'),
                    'class' => 'btn btn-default')
        );
        
        //DONGND:: timer options
        $fields_form[4]['form'] = array(
            'input' => array(
                # TIMER OPTIONS
                array(
                        'type' => 'group_button',
                        'id_group' => $this->current_group['id_group'],
                        'name' => 'group_button',
                        'lang' => false,
                    ),
                // array(
                    // 'type' => 'sperator_form',
                    // 'text' => $this->l('Timer Options'),
                    // 'name' => 'timer_option',
                    // 'lang' => false,
                    // 'class' => 'alert alert-info sperator_form',
                // ),
                array(
                    'type' => 'select',
                    'label' => $this->l('Timer Style'),
                    'name' => 'group[timer]',
                    'options' => array(
                        'query' => LeoSlideshowConfig::getTimerStyle(),
                        'id' => 'id',
                        'name' => 'name',
                    ),
                    'class' => 'form-action timer_option_sub',
                ),
                array(
                    'type' => 'select',
                    'label' => $this->l('Position'),
                    'name' => 'group[timerPosition]',
                    'options' => array(
                        'query' => LeoSlideshowConfig::getTimerPosition(),
                        'id' => 'id',
                        'name' => 'name',
                    ),
                    'class' => 'timer_option_sub',
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('X position threshold'),
                    'name' => 'group[timerX]',
                    'class' => 'fixed-width-xl digits timer_option_sub',
                    'lang' => false,
                    'desc' => $this->l('Enter digits to set Left or Right for Timer.'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Y position threshold'),
                    'name' => 'group[timerY]',
                    'class' => 'fixed-width-xl digits timer_option_sub',
                    'lang' => false,
                    'desc' => $this->l('Enter digits to set Top or Bottom for Timer.'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Opacity'),
                    'name' => 'group[timerOpacity]',
                    'class' => 'fixed-width-xl number timer_option_sub',
                    'desc' => $this->l('Set opacity for Timer in pixel. Value is 0 to 1. Ex 0.6'),
                    'lang' => false,
                ),
                array(
                    'type' => 'color',
                    'label' => $this->l('Background'),
                    'name' => 'group[timerBg]',
                    'class' => 'fixed-width-xl timer_option_sub',
                    'form_group_class' => 'form_sub',
                    'lang' => false,
                ),
                array(
                    'type' => 'color',
                    'label' => $this->l('Timer Color'),
                    'name' => 'group[timerColor]',
                    'class' => 'fixed-width-xl timer_option_sub',
                    'form_group_class' => 'form_sub',
                    'lang' => false,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Timer Diameter'),
                    'name' => 'group[timerDiameter]',
                    'class' => 'fixed-width-xl digits timer_option_sub',
                    'desc' => $this->l('Length of Running Line. Ex 360Bar is 30, Bar is 120, Pie 30.'),
                    'lang' => false,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Timer Padding'),
                    'name' => 'group[timerPadding]',
                    'class' => 'fixed-width-xl digits timer_option_sub',
                    'desc' => $this->l('Height of background. Ex 360Bar is 2, Bar is 4, Pie 4.'),
                    'lang' => false,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Timer Stroke'),
                    'name' => 'group[timerStroke]',
                    'class' => 'fixed-width-xl digits timer_option_sub grouptimer_sub grouptimer-'.LeoSlideshowConfig::IVIEW_TIMER_360BAR.' grouptimer-'.LeoSlideshowConfig::IVIEW_TIMER_BAR,
                    'desc' => $this->l('Height of Running Line. Ex 360Bar is 4, Bar is 4'),
                    'lang' => false,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Border'),
                    'name' => 'group[timerBarStroke]',
                    'class' => 'fixed-width-xl digits timer_option_sub fixed-width-xl grouptimer_sub grouptimer-Bar',
                    'desc' => $this->l('Border of Bar Timer'),
                    'lang' => false,
                ),
                array(
                    'type' => 'color',
                    'label' => $this->l('Border Color'),
                    'name' => 'group[timerBarStrokeColor]',
                    'form_group_class' => 'form_sub',
                    'class' => 'fixed-width-xl timer_option_sub grouptimer_sub grouptimer-Bar',
                    'desc' => $this->l("Color of Bar Timer's border"),
                    'lang' => false,
                ),
                array(
                    'type' => 'select',
                    'label' => $this->l('Border Style'),
                    'name' => 'group[timerBarStrokeStyle]',
                    'options' => array(
                        'query' => LeoSlideshowConfig::getTimerBarStrokeStyle(),
                        'id' => 'id',
                        'name' => 'name',
                    ),
                    'desc' => $this->l("Style of Bar Timer's border"),
                    'class' => 'fixed-width-xl timer_option_sub grouptimer_sub grouptimer-Bar',
                ),
            ),
            'submit' => array(
                    'title' => $this->l('Save'),
                    'class' => 'btn btn-default')
        );
        
        //DONGND:: animation
        $fields_form[5]['form'] = array(
            'input' => array(
                array(
                        'type' => 'group_button',
                        'id_group' => $this->current_group['id_group'],
                        'name' => 'group_button',
                        'lang' => false,
                    ),
                // array(
                    // 'type' => 'sperator_form',
                    // 'text' => $this->l('Animation'),
                    // 'name' => 'sperator_form',
                    // 'lang' => false,
                // ),
                array(
                    'type' => 'select',
                    'label' => $this->l('Animation'),
                    'name' => 'group[fx]',
                    'options' => array(
                        'query' => LeoSlideshowConfig::getFx(),
                        'id' => 'id',
                        'name' => 'name',
                    ),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Speed to change slide'),
                    'name' => 'group[animationSpeed]',
                    'class' => 'fixed-width-xl digits',
                    'desc' => $this->l('Enter Time(miniseconds) to change each slide. Ex 500'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Slide Strips'),
                    'name' => 'group[strips]',
                    'class' => 'fixed-width-xl digits',
                    'desc' => $this->l('Total number of strips in slide. Strip is bigger when enter small number. Ex 20'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Slide Column'),
                    'name' => 'group[blockCols]',
                    'class' => 'fixed-width-xl digits',
                    'desc' => $this->l('Number of columns in slide. Ex 10'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Slide Row'),
                    'name' => 'group[blockRows]',
                    'class' => 'fixed-width-xl digits',
                    'desc' => $this->l('Number of rows in slide. Ex 5'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Caption Speed'),
                    'name' => 'group[captionSpeed]',
                    'class' => 'fixed-width-xl digits',
                    'desc' => $this->l('Enter Time(miniseconds) to show caption. Ex 500'),
                ),
                array(
                    'type' => 'text',
                    'label' => $this->l('Caption Opacity'),
                    'name' => 'group[captionOpacity]',
                    'class' => 'fixed-width-xl number',
                    'desc' => $this->l('Set opacity for Caption. Value form 0 to 1. Ex 0.6'),
                ),
            ),
            'submit' => array(
                    'title' => $this->l('Save'),
                    'class' => 'btn btn-default')
        );

        if (Tools::isSubmit('id_group') && LeoSlideshowGroup::groupExists((int)Tools::getValue('id_group'))) {
            $fields_form[5]['form']['input'][] = array('type' => 'hidden', 'name' => 'id_group');
        } else if ($this->current_group['id_group'] && LeoSlideshowGroup::groupExists($this->current_group['id_group'])) {
            $fields_form[5]['form']['input'][] = array('type' => 'hidden', 'name' => 'id_group');
        }

        $helper = new HelperForm();
        $helper->show_toolbar = false;
        $helper->table = $this->table;
        $helper->module = $this;
        $helper->name_controller = 'slideshow';
        $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
        $helper->default_form_language = $lang->id;
        $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
        $this->fields_form = array();

        $helper->identifier = $this->identifier;
        $helper->submit_action = 'submitGroup';
        $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name;
        $helper->token = Tools::getAdminTokenLite('AdminModules');
        $helper->tpl_vars = array(
            'fields_value' => $this->getGroupFieldsValues(),
            'languages' => $this->context->controller->getLanguages(),
            'id_language' => $this->context->language->id,
//            'exportLink' => Context::getContext()->link->getAdminLink('AdminLeoSlideshow').'&exportGroup=1',
            'psBaseModuleUri' => $this->img_url,
            'ajaxfilelink' => Context::getContext()->link->getAdminLink('AdminLeoSlideshow'),
            'leo_width' => $arr_col,
            'hidden_config' => $hidden_config
        );

        $globalform = $helper->generateForm($fields_form);
        //DONGND::
        $this->context->smarty->assign(array(
            'globalform' => $globalform,
            'description' => $description,
            'default_tab' => Configuration::get('LEOSLIDESHOW_GROUP_DEFAULTTAB')
            // 'id_group' => Tools::getValue('id_group'),
            // 'group_title' => $mod_group->title,
            // 'languages' => $this->context->controller->getLanguages(),
            // 'previewLink' => Context::getContext()->link->getModuleLink($this->name, 'preview', array('secure_key' => $this->secure_key)),
            // 'msecure_key' => $this->secure_key,
            // 'currentSliderID' => $this->mod_current_slide->id
        ));
        return $this->display(__FILE__, 'panel.tpl');
    }

    public function getSwitchValue($id)
    {
        return array(array('id' => $id.'_on', 'value' => 1, 'label' => $this->l('Yes')),
            array('id' => $id.'_off', 'value' => 0, 'label' => $this->l('No')));
    }

    public function getGroupFieldsValues()
    {
        $group = array();
        $field = array('id_leoslideshow_groups', 'title', 'id_shop', 'hook', 'active');

        foreach ($this->group_data as $key => $value) {
            if (in_array($key, $field)) {
                if ($key == 'id_leoslideshow_groups') {
                    # module validation
                    $group['id_group'] = $value;
                } else {
                    # module validation
                    $group[$key.'_group'] = $value;
                }
                continue;
            }
            $group['group['.$key.']'] = $value;
        }
        
        $group['LEOSLIDESHOW_GROUP_DEFAULTTAB'] = Tools::getValue('LEOSLIDESHOW_GROUP_DEFAULTTAB', Configuration::get('LEOSLIDESHOW_GROUP_DEFAULTTAB'));
        // echo '
';
        // print_r($group);die();
        return $group;
    }

    public function postValidation()
    {
        $errors = array();

        if (Tools::isSubmit('submitGroup')) {
            if (Tools::isSubmit('id_group')) {
                if (!Validate::isInt(Tools::getValue('id_group')) && !LeoSlideshowGroup::groupExists(Tools::getValue('id_group'))) {
                    $errors[] = $this->l('Invalid id_group');
                }
            }
            $group_value = Tools::getValue('group');
            $arr_int = array(
                'delay' => $this->l('Invalid Delay value'),
                'width' => $this->l('Invalid Width value'),
                'height' => $this->l('Invalid Height value'),
            );

            foreach ($arr_int as $key => $value) {
                if (!Validate::isInt($group_value[$key]) && $group_value[$key] != '') {
                    $errors[] = $value;
                }
            }
            if (!Validate::isColor(Tools::getValue('background_color'))) {
                $errors[] = $this->l('Invalid Background color value');
            }
            
            if (LeoSlideshowConfig::getPermission() == false) {
                # CHECK VERSION
                if (Tools::isSubmit('id_group') == false) {
                    // Add new Group
                    $mod_group = new LeoSlideshowGroup();
                    $number_group = $mod_group->count();
                    
                    if ($number_group >= 1) {
                        $errors[] = $this->l("I'm so sorry, you are using free version of Leo slideshow module, could you please update module to pro version to use this function");
                        $errors[] = $this->display(__FILE__, 'error_freemodule.tpl');
                    }
                }
            }
        }

        /* Display errors if needed */
        if (count($errors)) {
            $this->error_text .= implode('
', $errors); $this->html .= $this->displayError(implode('
', $errors)); return false; } /* Returns if validation is ok */ return true; } public function getErrorLog() { return $this->error_text; } private function _postProcess() { $errors = array(); if (Tools::isSubmit('submitGroup')) { # ACTION - add,edit for GROUP /* Sets ID if needed */ if (Tools::getValue('id_group')) { $mod_group = new LeoSlideshowGroup((int)Tools::getValue('id_group')); if (!Validate::isLoadedObject($mod_group)) { $this->html .= $this->displayError($this->l('Invalid id_group')); return; } } else { $mod_group = new LeoSlideshowGroup(); } /* Sets position */ $mod_group->title = Tools::getValue('title_group'); /* Sets active */ $mod_group->active = (int)Tools::getValue('active_group'); $context = Context::getContext(); $mod_group->id_shop = $context->shop->id; $mod_group->hook = Tools::getValue('hook_group'); $params = Tools::getValue('group'); $mod_group->params = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($params)); // print_r(Tools::getValue('LEOSLIDESHOW_GROUP_DEFAULTTAB'));die(); Configuration::updateValue('LEOSLIDESHOW_GROUP_DEFAULTTAB', Tools::getValue('LEOSLIDESHOW_GROUP_DEFAULTTAB')); # TODO REMOVE CODE DEVELOPER if (property_exists('LeoSlideshowGroup', 'randkey') && empty($mod_group->randkey)) { $mod_group->randkey = LeoSlideshowHelper::genKey(); } /* Adds */ if (!Tools::getValue('id_group')) { if (!$mod_group->add()) { $errors[] = $this->displayError($this->l('The group could not be added.')); } else { $this->clearCache(); Tools::redirectAdmin(AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&editgroup=1&id_group='.$mod_group->id.'&conf=3'); } } else { # Update if (!$mod_group->update()) { $errors[] = $this->displayError($this->l('The group could not be updated.')); } else { $this->clearCache(); Tools::redirectAdmin(AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&editgroup=1&id_group='.$mod_group->id.'&conf=4'); } } # Save in config to edit next time $this->clearCache(); } elseif (Tools::isSubmit('changeGStatus') && Tools::isSubmit('id_group')) { # ACTION - Change status for GROUP : enable or disable a group $mod_group = new LeoSlideshowGroup((int)Tools::getValue('id_group')); $change_status = Tools::getValue('changeGStatus'); $mod_group->update_flag = false; if ($change_status == LeoSlideshowStatus::GROUP_STATUS_DISABLE && $mod_group->active != $change_status) { $mod_group->active = LeoSlideshowStatus::GROUP_STATUS_DISABLE; $mod_group->update_flag = true; } elseif ($change_status == LeoSlideshowStatus::GROUP_STATUS_ENABLE && $mod_group->active != $change_status) { $mod_group->active = LeoSlideshowStatus::GROUP_STATUS_ENABLE; $mod_group->update_flag = true; } if (true == $mod_group->update_flag) { $res = $mod_group->update(); $this->clearCache(); $this->html .= ($res ? $this->displayConfirmation($this->l('Change status of group was successful')) : $this->displayError($this->l('The configuration could not be updated.'))); } } elseif (Tools::isSubmit('deletegroup')) { $mod_group = new LeoSlideshowGroup((int)Tools::getValue('id_group')); # Delete slider of group $slider = $this->getSlides((int)Tools::getValue('id_group')); foreach ($slider as $value) { $mod_slide = new LeoSlideshowSlide($value['id_leoslideshow_slides']); $mod_slide->delete(); } $res = $mod_group->delete(); $this->clearCache(); if (!$res) { $this->html .= $this->displayError('Could not delete'); } else { $this->html .= $this->displayConfirmation($this->l('Group deleted')); } Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=leoslideshow&tab_module=leotheme&module_name=leoslideshow&conf=1'); } elseif (Tools::isSubmit('changeStatus')) { # ACTION - Change status for SLIDE : enable or disable a slide $mod_slide = new LeoSlideshowSlide((int)Tools::getValue('sslider')); $change_status = Tools::getValue('changeStatus'); $mod_slide->update_flag = false; if ($change_status === LeoSlideshowStatus::SLIDER_STATUS_DISABLE && $mod_slide->active != $change_status) { $mod_slide->active = LeoSlideshowStatus::SLIDER_STATUS_DISABLE; $mod_slide->update_flag = true; } elseif ($change_status === LeoSlideshowStatus::SLIDER_STATUS_ENABLE && $mod_slide->active != $change_status) { $mod_slide->active = LeoSlideshowStatus::SLIDER_STATUS_ENABLE; $mod_slide->update_flag = true; } if (true == $mod_slide->update_flag) { $res = $mod_slide->update(); $this->clearCache(); $this->html .= ($res ? $this->displayConfirmation($this->l('Change status of slide was successful')) : $this->displayError($this->l('The configuration could not be updated.'))); } } /* Display errors if needed */ if (count($errors)) { $this->html .= $this->displayError(implode('
', $errors)); } elseif (Tools::isSubmit('submitGroup')) { $this->html .= $this->displayConfirmation($this->l('Slide added')); } elseif (Tools::isSubmit('submitGroup')) { $this->html .= $this->displayConfirmation($this->l('Slide added')); } } /** * The function prepareHookForApPageBuilder duplicated logic from this function */ private function _prepareHook($hook_name) { if ($this->isCached('module:leoslideshow/views/templates/front/leoslideshow.tpl', $this->getCacheId($hook_name.'_'.$this->name))) { return true; } if (!is_dir(_PS_ROOT_DIR_.'/cache/'.$this->name)) { mkdir(_PS_ROOT_DIR_.'/cache/'.$this->name, 0755, true); } //get slider via hookname $group = LeoSlideshowGroup::getActiveGroupByHook($hook_name); if (!$group) { return false; } $sliders = $this->getSlides($group['id_leoslideshow_groups'], 1); $sliders = LeoSlideshowSlide::filterSlider($sliders, $this->slider_data); if (!$sliders) { return false; } $slider_params = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($group['params']), true); // echo '
';
        // print_r($slider_params);die();
        $slider_params = array_merge($group, $slider_params);
        $slider_params = array_merge($this->group_data, $slider_params);
        $mod_group = new LeoSlideshowGroup();
        $mod_group->setModule($this);
        $slider_params = $mod_group->setData($slider_params)->beforeLoad()->loadFrontEnd();

        if (isset($slider_params['fullwidth']) && (!empty($slider_params['fullwidth']) || $slider_params['fullwidth'] == 'boxed')) {
            $slider_params['image_cropping'] = false;
        }

        $slider_params['hide_navigator_after'] = $slider_params['show_navigator'] ? 0 : $slider_params['hide_navigator_after'];
        $slider_params['slider_class'] = trim(isset($slider_params['fullwidth']) && !empty($slider_params['fullwidth']) ? $slider_params['fullwidth'] : 'boxed');
        $slider_fullwidth = $slider_params['slider_class'] == 'boxed' ? 'off' : 'on';

        // generate back-ground
        if ($slider_params['background_image'] && $slider_params['background_url'] && file_exists($this->img_path.$slider_params['background_url'])) {
            $slider_params['background'] = 'background: url('.$this->img_url.$slider_params['background_url'].') no-repeat scroll left 0 '.$slider_params['background_color'].';';
        } else {
            $slider_params['background'] = 'background-color:'.$slider_params['background_color'];
        }

        //include library genimage
        if (!class_exists('PhpThumbFactory')) {
            require_once _PS_MODULE_DIR_.'leoslideshow/libs/phpthumb/ThumbLib.inc.php';
        }

        $white_main_img = __PS_BASE_URI__.'modules/'.$this->name.'/views/img/white50.png';

        //process slider
        foreach ($sliders as $key => $slider) {
            $slider['layers'] = array();
            $slider['params'] = array_merge($this->slider_data, Tools::jsonDecode(LeoSlideshowSlide::base64Decode($slider['params']), true));
            $slider['layersparams'] = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($slider['layersparams']), true);
            $slider['video'] = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($slider['video']), true);

            $slider['data_link'] = '';
            if ($slider['params']['enable_link'] && $slider['link']) {
                // $slider['data_link'] = 'data-link="'.$slider['link'].'"';
                // $slider['data_target'] = 'data-target="'.LeoSlideshowSlide::renderTarget($slider['params']['target']).'"';
                $slider['data_link'] = $slider['link'];
                $slider['data_target'] = LeoSlideshowSlide::renderTarget($slider['params']['target']);
            } else {
                $slider['data_target'] = '';
            }

            $slider['data_delay'] = (int)$slider['params']['delay'];

            //videoURL
            $slider['videoURL'] = '';
            $slider['video']['active'] = '0';
            if ($slider['video']['usevideo'] == 'youtube' || $slider['video']['usevideo'] == 'vimeo') {
                $slider['video']['active'] = '1';
                $slider['video']['videoURL'] = Tools::getCurrentUrlProtocolPrefix() . 'player.vimeo.com/video/'.$slider['video']['videoid'].'/';
                if ($slider['video']['usevideo'] == 'youtube') {
                    $slider['video']['videoURL'] = Tools::getCurrentUrlProtocolPrefix() . 'www.youtube.com/embed/'.$slider['video']['videoid'].'/';
                }
            }

            if ($slider['video']['videoauto'] == 1) {
                $slider['video']['videoauto'] = 'autoplay=1';
            } else {
                $slider['video']['videoauto'] = 'autoplay=0';
            }

            $slider['background_color'] = '';
            if (isset($slider_params['background_color']) && $slider_params['background_color']) {
                $slider['background_color'] = $slider_params['background_color'];
            }
            if (isset($slider['video']['background_color']) && $slider['video']['background_color']) {
                $slider['background_color'] = $slider['video']['background_color'];
            }

            LeoSlideshowSlide::getBackground($slider_params, $slider);

            if ($slider['image'] == '') {
                $slider['image'] = 'views/img/blank.gif';
            }

            if ($slider_params['image_cropping']) {
                //gender main_image
                if ($slider['image'] && file_exists($this->img_path.$slider['image'])) {
                    $slider['main_image'] = $this->renderThumb($slider['image'], $slider_params['width'], $slider_params['height']);
                } else {
                    $slider['main_image'] = $white_main_img;
                }

                if ($slider['thumbnail'] && file_exists($this->img_path.$slider['thumbnail'])) {
                    # module validation
                    //$slider['thumbnail'] = $this->renderThumb($slider['thumbnail'], $sliderParams['thumbnail_width'], $sliderParams['thumbnail_height']);
                } else if ($slider['image'] && file_exists($this->img_path.$slider['image'])) {
                    # module validation
                    //$slider['thumbnail'] = $this->renderThumb($slider['image'], $sliderParams['thumbnail_width'], $sliderParams['thumbnail_height']);
                } else {
                    $slider['thumbnail'] = $white_main_img;
                }
            } else {
                $slider['main_image'] = __PS_BASE_URI__.'modules/leoslideshow'.'/views/img/blank.gif';

                if ($slider['image'] && file_exists($this->img_path.$slider['image'])) {
                    $slider['main_image'] = $this->img_url.$slider['image'];
                }

                if ($slider['thumbnail'] && file_exists($this->img_path.$slider['thumbnail'])) {
                    $slider['thumbnail'] = $this->img_url.$slider['thumbnail'];
                } else if ($slider['image'] && file_exists($this->img_path.$slider['image'])) {
                    $slider['thumbnail'] = $slider['main_image'];
                } else {
                    $slider['thumbnail'] = $white_main_img;
                }
            }

            if (isset($slider['layersparams']) && $slider['layersparams']) {
                foreach ($slider['layersparams'] as $k => &$layer_css) {
                    if ($layer_css['layer_status'] == 0) {
                        unset($slider['layersparams'][$k]);
                        continue;
                    }

                    $layer_css_val = '';
                    if (isset($layer_css['layer_font_size']) && $layer_css['layer_font_size']) {
                        $layer_css_val = 'font-size:'.$layer_css['layer_font_size'];
                    }
                    if (isset($layer_css['layer_background_color']) && $layer_css['layer_background_color']) {
                        $layer_css_val .= ($layer_css_val != '' ? ';' : '').'background-color:'.$layer_css['layer_background_color'];
                    }
                    if (isset($layer_css['layer_color']) && $layer_css['layer_color']) {
                        $layer_css_val .= ($layer_css_val != '' ? ';' : '').'color:'.$layer_css['layer_color'];
                    }
                    $layer_css['css'] = $layer_css_val;
                    if (!isset($layer_css['layer_link'])) {
                        $layer_css['layer_link'] = $slider['link'];
                    } else {
                        $layer_css['layer_link'] = str_replace('_ASM_', '&', $layer_css['layer_link']);
                    }

                    $layer_css['layer_target'] = LeoSlideshowSlide::renderTarget($layer_css['layer_target']);
                    if (isset($layer_css['layer_caption']) && $layer_css['layer_caption']) {
                        $layer_css['layer_caption'] = utf8_decode($layer_css['layer_caption']);
                    }
                }
            }
            $sliders[$key] = $slider;
        }
        $slider_params['start_with_slide'] = LeoSlideshowGroup::showStartWithSlide($slider_params['start_with_slide'], $sliders);
        $sliders = LeoSlideshowSlide::showBulletCustomHTML($slider_params, $sliders);
        $slider_params['playLabel'] = LeoSlideshowHelper::l('Play');
        $slider_params['pauseLabel'] = LeoSlideshowHelper::l('Pause');
        $slider_params['closeLabel'] = LeoSlideshowHelper::l('Close');
        $slider_params['rtl'] = $this->context->language->is_rtl;
        // echo '
';
        // print_r($sliders);die();
        $this->smarty->assign(array(
            'sliderParams' => $slider_params,
            'sliders' => $sliders,
            'sliderIDRand' => rand(20, rand()),
            'sliderFullwidth' => $slider_fullwidth,
            'sliderImgUrl' => $this->img_url,
            'rand_num' => uniqid(),
        ));

        return true;
    }

    /**
     *
     */
    public function renderThumb($src_file, $width, $height)
    {
        $sub_folder = '/';
        if (!$src_file) {
            return '';
        }
        if (strpos($src_file, '/') !== false) {
            $path = @pathinfo($src_file);
            if (strpos($path['dirname'], '/') !== -1) {
                $sub_folder = $path['dirname'].'/';
                $folder_list = explode('/', $path['dirname']);
                $tmp_folder = '/';
                foreach ($folder_list as $value) {
                    if ($value) {
                        if (!is_dir(_PS_ROOT_DIR_.'/cache/'.$this->name.$tmp_folder.$value)) {
                            mkdir(_PS_ROOT_DIR_.'/cache/'.$this->name.$tmp_folder.$value, 0755, true);
                        }

                        $tmp_folder .= $value.'/';
                    }
                }
            }
            $image_name = $path['basename'];
        } else {
            $image_name = $src_file;
        }

        $path = '';
        if (file_exists($this->img_path.$src_file)) {
            //return image url
            $path = __PS_BASE_URI__.'cache/'.$this->name.$sub_folder.$width.'_'.$height.'_'.$image_name;
            $save_path = _PS_ROOT_DIR_.'/cache/'.$this->name.$sub_folder.$width.'_'.$height.'_'.$image_name;
            if (!file_exists($save_path)) {
                $thumb = PhpThumbFactory::create($this->img_path.$src_file);
                $thumb->adaptiveResize($width, $height);
                $thumb->save($save_path);
            }
        }

        return $path;
    }

    public function _processHook($hookName)
    {
        $id_slide = Tools::getValue('id_slide');
        $id_group = Tools::getValue('id_group');
        if (isset($id_slide) && isset($id_group) && $id_slide && $id_group) {
            # preview
            return;
        }

        if (!$this->_prepareHook($hookName)) {
            return false;
        }

        // return $this->display(__FILE__, ''.$this->name.'.tpl', $this->getCacheId($hookName.'_'.$this->name));
        return $this->fetch('module:leoslideshow/views/templates/front/leoslideshow.tpl', $this->getCacheId($hookName.'_'.$this->name));
    }

    public function hookHeader()
    {
        $media_dir = $this->getMediaDir();
        $this->context->controller->addJS(_PS_JS_DIR_.'jquery/jquery-migrate-1.2.1.min.js');
        $this->context->controller->addJS(_PS_JS_DIR_.'jquery/plugins/jquery.easing.js');

        $this->context->controller->addCSS(__PS_BASE_URI__.$media_dir.'css/typo/typo.css', 'all');
        // if (file_exists(_PS_THEME_DIR_.'modules/leoslideshow/css/typo/typo.css')) {
            // $this->context->controller->addCSS(_PS_THEME_DIR_.'modules/leoslideshow/css/typo/typo.css');
        // } else {
            // $this->context->controller->addCSS($this->_path.'css/typo/typo.css');
        // }
        $this->context->controller->addCSS(__PS_BASE_URI__.$media_dir.'css/iView/iview.css', 'all');
        $this->context->controller->addCSS(__PS_BASE_URI__.$media_dir.'css/iView/skin_4_responsive/style.css', 'all');
        $this->context->controller->addJqueryUI('ui.core');
        $this->context->controller->addJS(__PS_BASE_URI__.$media_dir.'js/iView/raphael-min.js');
        $this->context->controller->addJS(__PS_BASE_URI__.$media_dir.'js/iView/iview.js');
        $this->context->controller->addJS(__PS_BASE_URI__.$media_dir.'js/leoslideshow.js');
    }

    public function hookDisplayAfterBodyOpeningTag()
    {
        return $this->_processHook('displayAfterBodyOpeningTag');
    }
  
    public function hookDisplayTop()
    {
        return $this->_processHook('displayTop');
    }
    
    public function hookDisplayNav1()
    {
        return $this->_processHook('displayNav1');
    }

    public function hookDisplayNav2()
    {
        return $this->_processHook('displayNav2');
    }

    public function hookDisplayNavFullWidth()
    {
        return $this->_processHook('displayNavFullWidth');
    }

    public function hookDisplayHome()
    {
        return $this->_processHook('displayHome');
    }

    public function hookDisplayLeftColumn()
    {
        return $this->_processHook('displayLeftColumn');
    }

    public function hookDisplayRightColumn()
    {
        return $this->_processHook('displayRightColumn');
    }

    public function hookDisplayFooterProduct()
    {
        return $this->_processHook('displayFooterProduct');
    }

    public function hookDisplayFooterBefore()
    {
        return $this->_processHook('displayFooterBefore');
    }

    public function hookDisplayFooter()
    {
        return $this->_processHook('displayFooter');
    }

    public function hookDisplayFooterAfter()
    {
        return $this->_processHook('displayFooterAfter');
    }
    
    public function hookDisplayLeftColumnProduct()
    {
        return $this->_processHook('displayLeftColumnProduct');
    }
    
    public function hookDisplayRightColumnProduct()
    {
        return $this->_processHook('displayRightColumnProduct');
    }
    
    public function hookDisplayProductButtons()
    {
        return $this->_processHook('displayProductButtons');
    }
    
    public function hookDisplayReassurance()
    {
        return $this->_processHook('displayReassurance');
    }
    
    public function hookDisplayBeforeBodyClosingTag()
    {
        return $this->_processHook('displayBeforeBodyClosingTag');
    }

    public function clearCache()
    {
        foreach ($this->hook_support as $val) {
            $this->_clearCache(''.$this->name.'.tpl', $val.'_'.$this->name);
        }
    }

    public function hookActionShopDataDuplication($params)
    {
        $sql = 'SELECT gr.*
                FROM `'._DB_PREFIX_.'leoslideshow_groups` gr
                WHERE gr.`id_shop` = '.(int)$params['old_id_shop'];
        $group_list = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
        foreach ($group_list as $list) {
            $mod_group = new LeoSlideshowGroup();
            foreach ($list as $key => $value) {
                if ($key != 'id' && $key != 'id_shop') {
                    $mod_group->{$key} = $value;
                }
            }

            $mod_group->id_shop = (int)$params['new_id_shop'];
            $mod_group->add();

            //import slider
            $slide_list = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT sl.id_leoslideshow_slides as id
                            FROM `'._DB_PREFIX_.'leoslideshow_slides` sl
                            WHERE sl.`id_group` = '.(int)$list['id_leoslideshow_groups']);

            $fields = array('active', 'image', 'thumbnail', 'video', 'title', 'layersparams', 'title', 'position', 'link', 'params');
            foreach ($slide_list as $key => $value) {
                $mod_slide = new LeoSlideshowSlide($value['id']);
                $mod_new_slide = new LeoSlideshowSlide();
                $mod_new_slide->id_group = $mod_group->id;
                foreach ($fields as $field) {
                    $mod_new_slide->{$field} = $mod_slide->{$field};
                }

                $mod_new_slide->add();
            }
        }

        $this->clearCache();
    }

    public function headerHTML()
    {
        $media_dir = $this->getMediaDir();

        if (Tools::getValue('controller') != 'AdminModules' && Tools::getValue('configure') != $this->name) {
            return;
        }
        $this->context->controller->addCSS(__PS_BASE_URI__.$media_dir.'css/admin/style.css');
        if (defined('_LEO_MODE_DEV_') && _LEO_MODE_DEV_ === true) {
            if (file_exists(_PS_THEME_DIR_.'assets/css/modules/leoslideshow/views/css/typo/typo.css')) {
                $this->context->controller->addCSS(_PS_THEME_DIR_.'assets/css/modules/leoslideshow/views/css/typo/typo.css');
            } else {
                $this->context->controller->addCSS(__PS_BASE_URI__.$media_dir.'css/typo/typo.css');
            }
        } else {
            if (file_exists(_PS_THEME_DIR_.'assets/css/modules/leoslideshow/views/css/typo/typo.css')) {
                $this->context->controller->addCSS(_PS_THEME_DIR_.'assets/css/modules/leoslideshow/views/css/typo/typo.css');
            } else {
                if (file_exists(_PS_THEME_DIR_.'modules/leoslideshow/views/css/typo/typo.css')) {
                    $this->context->controller->addCSS(_PS_THEME_DIR_.'modules/leoslideshow/views/css/typo/typo.css');
                } else {
                    $this->context->controller->addCSS(__PS_BASE_URI__.$media_dir.'css/typo/typo.css');
                }
            }
        }
       
        $this->context->controller->addJS(_PS_JS_DIR_.'jquery/plugins/jquery.colorpicker.js');
        $this->context->controller->addJS(__PS_BASE_URI__.$media_dir.'js/admin/script.js');
        $this->context->controller->addJqueryUI('ui.core');
        $this->context->controller->addJqueryUI('ui.widget');
        $this->context->controller->addJqueryUI('ui.mouse');
        $this->context->controller->addJqueryUI('ui.draggable');
        $this->context->controller->addJqueryUI('ui.sortable');
        $this->context->controller->addCSS(_PS_JS_DIR_.'jquery/ui/themes/ui-lightness/jquery-ui-1.8.16.custom.css');
        $this->context->controller->addJqueryUI('ui.dialog');
        $this->context->controller->addJqueryPlugin('cooki-plugin');
    }

    public function getNextPosition()
    {
        $sql = 'SELECT MAX(hss.`position`) AS `next_position`
                FROM `'._DB_PREFIX_.''.$this->name.'_slides` hss, `'._DB_PREFIX_.''.$this->name.'` hs
                WHERE hss.`id_'.$this->name.'_slides` = hs.`id_'.$this->name.'_slides` AND hs.`id_shop` = '.(int)$this->context->shop->id;
        $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);

        return ( ++$row['next_position']);
    }

    public function displayGStatus($id_group, $active)
    {
        # Status Image
        $title = ((int)$active == 0 ? $this->l('Click to Enabled') : $this->l('Click to Disabled'));
        $img = ((int)$active == 0 ? 'disabled.gif' : 'enabled.gif');

        # Status Link
        if ($active == LeoSlideshowStatus::GROUP_STATUS_DISABLE) {
            $change_group_status = LeoSlideshowStatus::GROUP_STATUS_ENABLE;
        } elseif ($active == LeoSlideshowStatus::GROUP_STATUS_ENABLE) {
            $change_group_status = LeoSlideshowStatus::GROUP_STATUS_DISABLE;
        }

        $this->context->smarty->assign(array(
            'gstatus' => true,
            'status_link' => $this->context->link->getAdminLink('AdminModules').'&configure='.$this->name.'&changeGStatus='.$change_group_status.'&id_group='.(int)$id_group,
            'title' => $title,
            'img_link' => _PS_ADMIN_IMG_.$img,
        ));
        return $this->display(__FILE__, 'status.tpl');
    }

    public function displayStatus($id_slide, $active, $group_id, $slide)
    {
        # Status Image
        $title = ((int)$active == 0 ? $this->l('Click to Enabled') : $this->l('Click to Disabled'));
        $src_img = _PS_ADMIN_IMG_;
        $mod_slide = new LeoSlideshowSlide();
        $mod_slide->mergeSlider($slide)->mergeParams($this->slider_data);

        if ($mod_slide->getStatusTime() == LeoSlideshowStatus::SLIDER_STATUS_DISABLE) {
            $img = 'disabled.gif';
        } elseif ($mod_slide->getStatusTime() == LeoSlideshowStatus::SLIDER_STATUS_ENABLE) {
            $img = 'enabled.gif';
        } elseif ($mod_slide->getStatusTime() == LeoSlideshowStatus::SLIDER_STATUS_COMING) {
            $img = 'coming.png';
            $src_img = _MODULE_DIR_.'leoslideshow/views/img/admin/';
        }

        # Status Link
        if ($mod_slide->getStatusTime() == LeoSlideshowStatus::SLIDER_STATUS_DISABLE) {
            $change_slide_status = LeoSlideshowStatus::SLIDER_STATUS_ENABLE;
        } elseif ($mod_slide->getStatusTime() == LeoSlideshowStatus::SLIDER_STATUS_ENABLE) {
            $change_slide_status = LeoSlideshowStatus::SLIDER_STATUS_DISABLE;
        } elseif ($mod_slide->getStatusTime() == LeoSlideshowStatus::SLIDER_STATUS_COMING) {
            $change_slide_status = LeoSlideshowStatus::SLIDER_STATUS_DISABLE;
        }
        
        $this->context->smarty->assign(array(
            'status' => true,
            'status_link' => $this->context->link->getAdminLink('AdminModules').'&configure='.$this->name.'&changeStatus='.$change_slide_status.'&sslider='.(int)$id_slide.'&showsliders=1&id_group='.(int)$group_id,
            'title' => $title,
            'img_link' => $src_img.$img,
        ));
        
        return $this->display(__FILE__, 'status.tpl');
    }

    public function slideExists($id_slide)
    {
        $sql = 'SELECT `id_'.$this->name.'_slides`
                FROM `'._DB_PREFIX_.''.$this->name.'_slides`
                WHERE `id_'.$this->name.'_slides` = '.(int)$id_slide;
        $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);
        return ($row);
    }

    protected function getCacheId($name = null, $hook = '')
    {
        $cache_array = array(
            $name !== null ? $name : $this->name,
            $hook,
            date('Ymd'),
            (int)Tools::usingSecureMode(),
            (int)$this->context->shop->id,
            (int)Group::getCurrent()->id,
            (int)$this->context->language->id,
            (int)$this->context->currency->id,
            (int)$this->context->country->id,
            (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443)
        );
        return implode('|', $cache_array);
    }

    public function converParams($old_params = '')
    {
        $result = '';
        if ($old_params != '') {
            $data = Tools::unSerialize($old_params);
            $result = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($data));
        }
        return $result;
    }
    # ******************** SLIDE ********************

    public function slideProcessAjax()
    {
        $result = array();
        if (Tools::getValue('action') && Tools::getValue('action') == 'submitslider') {
            # ACTION - edit slide
            if (Tools::getValue('id_slide')) {
                $mod_slide = new LeoSlideshowSlide((int)Tools::getValue('id_slide'));
                $mod_slide->completeDatabase(array('lang' => true));
                if (!Validate::isLoadedObject($mod_slide)) {
                    $this->l('Invalid id_slide');
                    return;
                }
            } else {
                $mod_slide = new LeoSlideshowSlide();
            }

            $mod_slide->id_group = (int)Tools::getValue('id_group');
            $mod_slide->position = (int)Tools::getValue('position');
            $mod_slide->active = (int)Tools::getValue('active_slide');
            $mod_slide->params = LeoSlideshowSlide::base64Encode(Tools::jsonEncode(Tools::getValue('slider')));

            try {
                $post_slide = Tools::getValue('slider');
                $mod_slide->start_date_time = $post_slide['start_date_time'];
                $mod_slide->end_date_time = $post_slide['end_date_time'];
                $mod_slide->bullet_class = $post_slide['bullet_class'];
                $mod_slide->id_group = $post_slide['group_id'];

                $mod_slide->validate($this);
            } catch (Exception $exc) {
                $result = array('error' => 1, 'text' => $exc->getMessage());
                $this->clearCache();
                die(Tools::jsonEncode($result));
            }

            $languages = Language::getLanguages(false);
            $tmp_data = array();
            $tmp_back_color = '';

            foreach ($languages as $language) {
                $mod_slide->title[$language['id_lang']] = Tools::getValue('title_'.$language['id_lang']);
                //get data default
                $mod_slide->link[$language['id_lang']] = Tools::getValue('link_'.$language['id_lang']);
                $mod_slide->image[$language['id_lang']] = Tools::getValue('image_'.$language['id_lang']);
                $mod_slide->thumbnail[$language['id_lang']] = Tools::getValue('thumbnail_'.$language['id_lang']);

                $video = array();
                $video['usevideo'] = Tools::getValue('usevideo_'.$language['id_lang']);
                $video['videoid'] = Tools::getValue('videoid_'.$language['id_lang']);
                $video['videoauto'] = Tools::getValue('videoauto_'.$language['id_lang']);
                $video['background_color'] = Tools::getValue('background_color_'.$language['id_lang']);
                $video['bullet_description'] = Tools::getValue('bullet_description_'.$language['id_lang']);

                if ($video['background_color'] == '' && !Tools::getValue('id_slide')) {
                    $video['background_color'] = $tmp_back_color;
                } else {
                    $tmp_back_color = $video['background_color'];
                }

                $mod_slide->video[$language['id_lang']] = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($video));
                $layersparams = new stdClass();
                $layersparams->layers = array();

                if (Tools::getIsset('layers_'.$language['id_lang'])) {
                    $times = Tools::getValue('layer_time');
                    $layers = Tools::getValue('layers_'.$language['id_lang']);

                    foreach ($layers as $key => $value) {
                        $value['time_start'] = $times[$value['layer_id']];
                        //fix for php 5.2 and 5.3
                        $value['layer_caption'] = utf8_encode(str_replace(array('\'', '\"'), array("'", '"'), $value['layer_caption']));
                        $times[$value['layer_id']] = $value;
                    }
                    $k = 0;
                    foreach ($times as $key => $value) {
                        if (is_array($times) && $key == @$value['layer_id']) {
                            $value['layer_id'] = $language['id_lang'].'_'.($k + 1);
                            $layersparams->layers[$k] = $value;
                            $k++;
                        }
                    }
                    $mod_slide->layersparams[$language['id_lang']] = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($layersparams->layers));
                } else {
                    //when add new create sample data for other language
                    if (!Tools::getValue('id_slide') && isset($tmp_data['layersparams']) && $tmp_data['layersparams']) {
                        //set id again
                        foreach ($tmp_data['layersparams'] as &$tmp_layer) {
                            foreach ($tmp_layer as $key => &$value) {
                                if ($key == 'layer_id') {
                                    $valu = explode('_', $value);
                                    $value = str_replace($valu[0].'_', $language['id_lang'].'_', $value);
                                }
                            }
                        }
                        $mod_slide->layersparams[$language['id_lang']] = LeoSlideshowSlide::base64Encode(Tools::jsonEncode($tmp_data['layersparams']));
                    } else {
                        $mod_slide->layersparams[$language['id_lang']] = '';
                    }
                }

                //get data default if add new
                if (!Tools::getValue('id_slide') && $mod_slide->title && empty($tmp_data)) {
                    $tmp_data['title'] = $mod_slide->title[$language['id_lang']];
                    $tmp_data['link'] = $mod_slide->link[$language['id_lang']];
                    $tmp_data['video'] = $mod_slide->video[$language['id_lang']];
                    $tmp_data['image'] = $mod_slide->image[$language['id_lang']];
                    $tmp_data['thumbnail'] = $mod_slide->image[$language['id_lang']];
                    $tmp_data['id_lang'] = $language['id_lang'];
                    $tmp_data['image'] = $mod_slide->image[$language['id_lang']];
                }
                if (!Tools::getValue('id_slide') && !isset($tmp_data['layersparams'])) {
                    $tmp_data['layersparams'] = $layersparams->layers;
                }
            }

            if (!Tools::getValue('id_slide')) {
                # ACTION - add SLIDE
                 
                if (LeoSlideshowConfig::getPermission() == false) {
                    # CHECK VERSION
                    $number_group = $mod_slide->count();

                    if ($number_group >= 2) {
                        $errors = $this->display(__FILE__, 'error_freemodule1.tpl');
                        $result = array('error' => 2, 'text' => $errors );
                        die(Tools::jsonEncode($result));
                    }
                }
                # add default image
                foreach ($mod_slide->title as &$value) {
                    if ($value == '') {
                        $value = $tmp_data['title'];
                    }
                }

                foreach ($mod_slide->link as &$value) {
                    if ($value == '') {
                        $value = $tmp_data['link'];
                    }
                }

                foreach ($mod_slide->image as &$value) {
                    if ($value == '') {
                        $value = $tmp_data['image'];
                    }
                }

                foreach ($mod_slide->video as &$value) {
                    if ($value == '') {
                        $value = $tmp_data['video'];
                    }
                }

                if (!$mod_slide->add()) {
                    $result = array('error' => 1, 'text' => $this->l('The slide could not be added.'));
                }
            } elseif (!$mod_slide->update()) {
                /* Update */
                $result = array('error' => 1, 'text' => $this->l('The slide could not be updated.'));
            }
            $my_link = '&configure=leoslideshow&editSlider=1&id_slide='.$mod_slide->id.'&id_group='.$mod_slide->id_group.'&conf=4';
            $result = array('error' => 0, 'text' => $my_link);

            $this->clearCache();
            die(Tools::jsonEncode($result));
        }

        if (Tools::getValue('action') && Tools::getValue('action') == 'updateSlidesPosition' && Tools::getValue('slides')) {
            $slides = Tools::getValue('slides');

            foreach ($slides as $position => $id_slide) {
                $sql = 'UPDATE `'._DB_PREFIX_.'leoslideshow_slides` SET `position` = '.(int)$position.'
                        WHERE `id_leoslideshow_slides` = '.(int)$id_slide;
                $result = Db::getInstance()->execute($sql);
            }
            $this->clearCache();
            die(Tools::jsonEncode($result));
        }

        if (Tools::getValue('action') && Tools::getValue('action') == 'deleteSlider') {
            $id_slide = Tools::getValue('id_slide');
            $mod_slide = new LeoSlideshowSlide((int)$id_slide);
            if (!$mod_slide->delete()) {
                $result = array('error' => 1, 'text' => $this->l('The slide could not be delete.'));
            }

            $this->clearCache();
            die(Tools::jsonEncode($result));
        }

        if (Tools::getValue('action') && Tools::getValue('action') == 'duplicateSlider') {
            if (LeoSlideshowConfig::getPermission() == false) {
                # CHECK VERSION
                $mod_slide = new LeoSlideshowSlide();
                $number_group = $mod_slide->count();

                if ($number_group >= 2) {
                    $errors = $this->display(__FILE__, 'error_freemodule1.tpl');

                    $result = array('error' => 2, 'text' => $errors );
                    die(Tools::jsonEncode($result));
                }
            }
            
            
            $mod_slide = new LeoSlideshowSlide((int)Tools::getValue('id_slide'));
            $mod_new_slide = new LeoSlideshowSlide();

            $defined = $mod_new_slide->getDefinition('LeoSlideshowSlide');

            foreach ($defined['fields'] as $ke => $val) {
                # module validation
                unset($val);

                if ($ke == 'id') {
                    continue;
                }

                if ($ke == 'title') {
                    $tmp = array();
                    foreach ($mod_slide->title as $kt => $vt) {
                        $tmp[$kt] = $this->l('Duplicate of').' '.$vt;
                    }

                    $mod_new_slide->{$ke} = $tmp;
                } else {
                    $mod_new_slide->{$ke} = $mod_slide->{$ke};
                }
            }
            if (!$mod_new_slide->add()) {
                $result = array('error' => 1, 'text' => $this->l('The slide could not be duplicate.'));
            }

            $this->clearCache();
            die(Tools::jsonEncode($result));
        }
    }

    public function getSliderGroupById($id)
    {
        $this->context = Context::getContext();
        $id_shop = $this->context->shop->id;
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
                    SELECT *
                    FROM '._DB_PREFIX_.'leoslideshow_groups gr
                    WHERE gr.id_shop = '.(int)$id_shop.'
                    AND gr.id_leoslideshow_groups = '.(int)$id);
    }

    public function processHookCallBack($group_id)
    {
        $media_dir = $this->getMediaDir();
        $this->context->controller->addJS($this->_path.'js/jquery.themepunch.enablelog.js');
        $this->context->controller->addJS($this->_path.'js/jquery.themepunch.revolution.js');
        //$this->context->controller->addJS($this->_path.'js/jquery.themepunch.revolution.min.js');
        $this->context->controller->addJS($this->_path.'js/jquery.themepunch.tools.min.js');
        $this->context->controller->addCSS(__PS_BASE_URI__.$media_dir.'css/typo/typo.css', 'all');

        $slideshow_group_obj = new LeoSlideshowGroup($group_id);
        
        if ($slideshow_group_obj->active_ap != 1) {
            $slideshow_group_obj->hook = '';
            $slideshow_group_obj->active_ap = 1;
            $slideshow_group_obj->save();
        }
        
        $res = $this->prepareHookForApPageBuilder($group_id);
        if (!$res) {
            return false;
        } elseif ($res === 2) {
            return $this->l('If you load this Slideshow (not active) from ApPageBuilder module, please access ApPageBuilder module then delete it');
        }

        // return $this->display(__FILE__, ''.$this->name.'.tpl', $this->getCacheId($group_id.'_'.$this->name));
        return $this->fetch('module:leoslideshow/views/templates/front/leoslideshow.tpl', $this->getCacheId($group_id.'_'.$this->name));
    }

    private function prepareHookForApPageBuilder($group_id)
    {
        $tpl = 'module:leoslideshow/views/templates/front/leoslideshow.tpl';
        if (!$this->isCached($tpl, $this->getCacheId($group_id.'_'.$this->name))) {
            if (!is_dir(_PS_ROOT_DIR_.'/cache/'.$this->name)) {
                mkdir(_PS_ROOT_DIR_.'/cache/'.$this->name, 0755, true);
            }

            //get slider via hookname
            $group = $this->getSliderGroupById($group_id);
            if (!$group) {
                return false;
            } elseif ($group['active'] != 1) {
                return 2;
            }
            $sliders = $this->getSlides($group['id_leoslideshow_groups'], 1);
            $sliders = LeoSlideshowSlide::filterSlider($sliders, $this->slider_data);
            if (!$sliders) {
                return false;
            }

            $slider_params = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($group['params']), true);
            $slider_params = array_merge($group, $slider_params);
            $slider_params = array_merge($this->group_data, $slider_params);
            $mod_group = new LeoSlideshowGroup();
            $mod_group->setModule($this);
            $slider_params = $mod_group->setData($slider_params)->beforeLoad()->loadFrontEnd();

            if (isset($slider_params['fullwidth']) && (!empty($slider_params['fullwidth']) || $slider_params['fullwidth'] == 'boxed')) {
                $slider_params['image_cropping'] = false;
            }

            $slider_params['hide_navigator_after'] = $slider_params['show_navigator'] ? 0 : $slider_params['hide_navigator_after'];
            $slider_params['slider_class'] = trim(isset($slider_params['fullwidth']) && !empty($slider_params['fullwidth']) ? $slider_params['fullwidth'] : 'boxed');
            $slider_fullwidth = $slider_params['slider_class'] == 'boxed' ? 'off' : 'on';

            // generate back-ground
            if ($slider_params['background_image'] && $slider_params['background_url'] && file_exists($this->img_path.$slider_params['background_url'])) {
                $slider_params['background'] = 'background: url('.$this->img_url.$slider_params['background_url'].') no-repeat scroll left 0 '.$slider_params['background_color'].';';
            } else {
                $slider_params['background'] = 'background-color:'.$slider_params['background_color'];
            }

            //include library genimage
            if (!class_exists('PhpThumbFactory')) {
                require_once _PS_MODULE_DIR_.'leoslideshow/libs/phpthumb/ThumbLib.inc.php';
            }

            $white_main_img = __PS_BASE_URI__.'modules/'.$this->name.'/views/img/white50.png';

            //process slider

            foreach ($sliders as $key => $slider) {
                $slider['layers'] = array();
                $slider['params'] = array_merge($this->slider_data, Tools::jsonDecode(LeoSlideshowSlide::base64Decode($slider['params']), true));
                $slider['layersparams'] = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($slider['layersparams']), true);
                $slider['video'] = Tools::jsonDecode(LeoSlideshowSlide::base64Decode($slider['video']), true);

                $slider['data_link'] = '';
                if ($slider['params']['enable_link'] && $slider['link']) {
                    // $slider['data_link'] = 'data-link="'.$slider['link'].'"';
                    // $slider['data_target'] = 'data-target="'.LeoSlideshowSlide::renderTarget($slider['params']['target']).'"';
                    $slider['data_link'] = $slider['link'];
                    $slider['data_target'] = LeoSlideshowSlide::renderTarget($slider['params']['target']);
                } else {
                    $slider['data_target'] = '';
                }

                $slider['data_delay'] = (int)$slider['params']['delay'];

                //videoURL
                $slider['videoURL'] = '';
                $slider['video']['active'] = '0';
                if ($slider['video']['usevideo'] == 'youtube' || $slider['video']['usevideo'] == 'vimeo') {
                    $slider['video']['active'] = '1';
                    $slider['video']['videoURL'] = Tools::getCurrentUrlProtocolPrefix() . 'player.vimeo.com/video/'.$slider['video']['videoid'].'/';
                    if ($slider['video']['usevideo'] == 'youtube') {
                        $slider['video']['videoURL'] = Tools::getCurrentUrlProtocolPrefix() . 'www.youtube.com/embed/'.$slider['video']['videoid'].'/';
                    }
                }

                $slider['background_color'] = '';
                if (isset($slider_params['background_color']) && $slider_params['background_color']) {
                    $slider['background_color'] = $slider_params['background_color'];
                }
                if (isset($slider['video']['background_color']) && $slider['video']['background_color']) {
                    $slider['background_color'] = $slider['video']['background_color'];
                }

                LeoSlideshowSlide::getBackground($slider_params, $slider);

                if ($slider['image'] == '') {
                    $slider['image'] = 'views/img/blank.gif';
                }

                if ($slider_params['image_cropping']) {
                    //gender main_image
                    if ($slider['image'] && file_exists($this->img_path.$slider['image'])) {
                        $slider['main_image'] = $this->renderThumb($slider['image'], $slider_params['width'], $slider_params['height']);
                    } else {
                        $slider['main_image'] = $white_main_img;
                    }

                    if ($slider['thumbnail'] && file_exists($this->img_path.$slider['thumbnail'])) {
                        # module validation
                        //$slider['thumbnail'] = $this->renderThumb($slider['thumbnail'], $sliderParams['thumbnail_width'], $sliderParams['thumbnail_height']);
                    } else if ($slider['image'] && file_exists($this->img_path.$slider['image'])) {
                        # module validation
                        //$slider['thumbnail'] = $this->renderThumb($slider['image'], $sliderParams['thumbnail_width'], $sliderParams['thumbnail_height']);
                    } else {
                        $slider['thumbnail'] = $white_main_img;
                    }
                } else {
                    $slider['main_image'] = __PS_BASE_URI__.'modules/leoslideshow'.'/views/img/blank.gif';

                    if ($slider['image'] && file_exists($this->img_path.$slider['image'])) {
                        $slider['main_image'] = $this->img_url.$slider['image'];
                    }else if (((Tools::substr($slider['image'], 0, 7) == 'http://')) || ((Tools::substr($slider['image'], 0, 8) == 'https://')) || ((Tools::substr($slider['image'], 0, 10) == 'data:image'))) {
  		        # Image External Link
                        $slider['main_image'] = $slider['image'];
                    }

                    if ($slider['thumbnail'] && file_exists($this->img_path.$slider['thumbnail'])) {
                        $slider['thumbnail'] = $this->img_url.$slider['thumbnail'];
                    } else if ($slider['image'] && file_exists($this->img_path.$slider['image'])) {
                        $slider['thumbnail'] = $slider['main_image'];
                    }else if (((Tools::substr($slider['thumbnail'], 0, 7) == 'http://')) || ((Tools::substr($slider['thumbnail'], 0, 8) == 'https://')) || ((Tools::substr($slider['thumbnail'], 0, 10) == 'data:image'))) {
                        # Image External Link
                        $slider['thumbnail'] = $slider['thumbnail'];
                    } else {
                        $slider['thumbnail'] = $white_main_img;
                    }
                }

                if ($slider['layersparams']) {
                    foreach ($slider['layersparams'] as $k => &$layer_css) {
                        if ($layer_css['layer_status'] == 0) {
                            unset($slider['layersparams'][$k]);
                            continue;
                        }

                        $layer_css_val = '';
                        if (isset($layer_css['layer_font_size']) && $layer_css['layer_font_size']) {
                            $layer_css_val = 'font-size:'.$layer_css['layer_font_size'];
                        }
                        if (isset($layer_css['layer_background_color']) && $layer_css['layer_background_color']) {
                            $layer_css_val .= ($layer_css_val != '' ? ';' : '').'background-color:'.$layer_css['layer_background_color'];
                        }
                        if (isset($layer_css['layer_color']) && $layer_css['layer_color']) {
                            $layer_css_val .= ($layer_css_val != '' ? ';' : '').'color:'.$layer_css['layer_color'];
                        }
                        $layer_css['css'] = $layer_css_val;
                        if (!isset($layer_css['layer_link'])) {
                            $layer_css['layer_link'] = $slider['link'];
                        } else {
                            $layer_css['layer_link'] = str_replace('_ASM_', '&', $layer_css['layer_link']);
                        }

                        $layer_css['layer_target'] = LeoSlideshowSlide::renderTarget($layer_css['layer_target']);
                        if (isset($layer_css['layer_caption']) && $layer_css['layer_caption']) {
                            $layer_css['layer_caption'] = utf8_decode($layer_css['layer_caption']);
                        }
                        
                        if (isset($layer_css['layer_type']) && $layer_css['layer_type'] == 'image') {
                            if (((Tools::substr($layer_css['layer_content'], 0, 4) != 'http')) && ((Tools::substr($layer_css['layer_content'], 0, 8) != 'data:image'))) {
                                $layer_css['layer_content'] = $this->img_url. $layer_css['layer_content'];
                            }
                        }
                    }
                }
                $sliders[$key] = $slider;
            }
            $slider_params['start_with_slide'] = LeoSlideshowGroup::showStartWithSlide($slider_params['start_with_slide'], $sliders);
            $sliders = LeoSlideshowSlide::showBulletCustomHTML($slider_params, $sliders);
            $slider_params['rtl'] = $this->context->language->is_rtl;

            if (!isset($this->load_from_appagebuilder)) {
                // Default load via appabuilder
                $this->load_from_appagebuilder = 1;
            }
            $this->smarty->assign(array(
                'sliderParams' => $slider_params,
                'sliders' => $sliders,
                'sliderIDRand' => rand(20, rand()),
                'sliderFullwidth' => $slider_fullwidth,
                'sliderImgUrl' => $this->img_url,
                'load_from_appagebuilder' => $this->load_from_appagebuilder,
                'rand_num' => uniqid(),
            ));
        }
        return true;
    }
    
    /**
     * Run only one when install/change Theme_of_Leo
     */
    public function hookActionAdminBefore($params)
    {
        if (isset($params) && isset($params['controller']) && isset($params['controller']->theme_manager)) {
            // Validate : call hook from theme_manager
        } else {
            // Other module call this hook -> duplicate data
            return;
        }
        
        $this->unregisterHook('actionAdminBefore');
        
        # FIX : update Prestashop by 1-Click module -> NOT NEED RESTORE DATABASE
        $ap_version = Configuration::get('AP_CURRENT_VERSION');
        if ($ap_version != false) {
            $ps_version = Configuration::get('PS_VERSION_DB');
            $versionCompare =  version_compare($ap_version, $ps_version);
            if ($versionCompare != 0) {
                // Just update Prestashop
                Configuration::updateValue('AP_CURRENT_VERSION', $ps_version);
                return;
            }
        }
        
        # WHENE INSTALL THEME, INSERT HOOK FROM DATASAMPLE IN THEME
        $hook_from_theme = false;
        if (file_exists(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php')) {
            require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php');
            $sample = new Datasample();
            if ($sample->processHook($this->name)) {
                $hook_from_theme = true;
            };
        }
        
        # INSERT HOOK FROM MODULE_DATASAMPLE
        if ($hook_from_theme == false) {
            $this->registerLeoHook();
        }
        
        # WHEN INSTALL MODULE, NOT NEED RESTORE DATABASE IN THEME
        $install_module = (int)Configuration::get('AP_INSTALLED_LEOSLIDESHOW', 0);
        if ($install_module) {
            Configuration::updateValue('AP_INSTALLED_LEOSLIDESHOW', '0');    // next : allow restore sample
            return;
        }
        
        # INSERT DATABASE FROM THEME_DATASAMPLE
        if (file_exists(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php')) {
            require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php');
            $sample = new Datasample();
            $sample->processImport($this->name);
        }
    }
    
    /**
     * Common method
     * Resgister all hook for module
     */
    public function registerLeoHook()
    {
        $res = true;
        $res &= $this->registerHook('header');
        $res &= $this->registerHook('actionShopDataDuplication');
        foreach ($this->hook_support as $value) {
            $res &= $this->registerHook($value);
        }
        # Multishop create new shop
        $res &= $this->registerHook('actionAdminShopControllerSaveAfter');
        $res &= $this->registerHook('actionAdminControllerSetMedia');
        
        return $res;
    }

    /**
     * Common method
     * Unresgister all hook for module
     */
    public function unregisterLeoHook()
    {
        $res = true;
        $res &= $this->unregisterHook('header');
        $res &= $this->unregisterHook('actionShopDataDuplication');
        foreach ($this->hook_support as $value) {
            $res &= $this->unregisterHook($value);
        }
        $res &= $this->unregisterHook('actionAdminShopControllerSaveAfter');
        $res &= $this->unregisterHook('actionAdminControllerSetMedia');
        return $res;
    }
    
    /**
     * @Action Create new shop, choose theme then auto restore datasample.
     */
    public function hookActionAdminShopControllerSaveAfter($param)
    {
        if (Tools::getIsset('controller') !== false && Tools::getValue('controller') == 'AdminShop'
                && Tools::getIsset('submitAddshop') !== false && Tools::getValue('submitAddshop')
                && Tools::getIsset('theme_name') !== false && Tools::getValue('theme_name')) {
            $shop = $param['return'];

            if (file_exists(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php')) {
                require_once(_PS_MODULE_DIR_.'appagebuilder/libs/Helper.php');
                require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php');
                $sample = new Datasample();
                apPageHelper::$id_shop = $shop->id;
                $sample->_id_shop = $shop->id;
                $sample->processImport('leoslideshow');
            }
        }
    }

    /**
     * Add the CSS & JavaScript files you want to be loaded in the BO.
     */
    public function hookActionAdminControllerSetMedia()
    {
        $this->autoRestoreSampleData();
    }
    
    public function processCMS()
    {
        $cms = $this->smarty->smarty->getVariable('cms')->value;
        $cms['content'] = $this->doShortCode($cms['content']);
        $this->smarty->smarty->assign('cms', $cms);
    }
    
    public function getContentCMS($atts, $content = null)
    {
        $group_id = isset($atts['group_id']) ? (int)$atts['group_id'] : 0;
        $id_shop = (int)Context::getContext()->shop->id;
        
        $where = ' WHERE id_leoslideshow_groups = '.(int)$group_id.' AND id_shop = ' . (int)$id_shop;
        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT id_leoslideshow_groups FROM `'._DB_PREFIX_.'leoslideshow_groups` '.$where);
        
        
        if (is_array($result) && !empty($result)) {
            $str_group_id = '';
            foreach ($result as $slide) {
                $str_group_id .= ($str_group_id == '') ? $slide['id_leoslideshow_groups'] : ','.$slide['id_leoslideshow_groups'];
            }
            $this->load_from_appagebuilder = 0;
            $content = $this->processHookCallBack($str_group_id);
        } else {
            $content = $this->display(__FILE__, 'cms_error.tpl');
        }

        return $content;
    }
    
    public static function doShortCode($content, $hook_name = '')
    {
        // validate module
        unset($hook_name);
        $pattern = '\[(\[?)(leoslideshow)(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]*+(?:\[(?!\/\2\])[^\[]*+)*+)\[\/\2\])?)(\]?)';
        return preg_replace_callback("/$pattern/s", array(__CLASS__, 'doShortCodeTag'), $content);
    }
    public static function doShortCodeTag($m)
    {
        $attr = self::doShortcodeParseAtts($m[3]);
        if (isset($m[5])) {
            return $m[1] . call_user_func(array(new LeoSlideshow(), 'getContentCMS'), $attr, $m[5]) . $m[6];
        } else {
            return $m[1] . call_user_func(array(new LeoSlideshow(), 'getContentCMS'), $attr, null) . $m[6];
        }
    }
    
    public static function doShortcodeParseAtts($text)
    {
        $atts = array();
        $pattern = '/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/';
        $text = preg_replace("/[\x{00a0}\x{200b}]+/u", " ", $text);
        if (preg_match_all($pattern, $text, $match, PREG_SET_ORDER)) {
            foreach ($match as $m) {
                if (!empty($m[1])) {
                    $atts[Tools::strtolower($m[1])] = stripcslashes($m[2]);
                } elseif (!empty($m[3])) {
                    $atts[Tools::strtolower($m[3])] = stripcslashes($m[4]);
                } elseif (!empty($m[5])) {
                    $atts[Tools::strtolower($m[5])] = stripcslashes($m[6]);
                } elseif (isset($m[7]) and Tools::strlen($m[7])) {
                    $atts[] = stripcslashes($m[7]);
                } elseif (isset($m[8])) {
                    $atts[] = stripcslashes($m[8]);
                }
            }
        } else {
            $atts = ltrim($text);
        }
        return $atts;
    }
    
    // public function isCached($template, $cache_id = null, $compile_id = null)
    // {
        // if (version_compare(_PS_VERSION_, '1.7.4.0', '>=') || version_compare(Configuration::get('PS_VERSION_DB'), '1.7.4.0', '>=')) {
            // return false;
        // }
        // return parent::isCached($template, $cache_id, $compile_id);
    // }

    /**
     * FIX BUG 1.7.3.3 : install theme lose hook displayHome, displayLeoProfileProduct
     * because ajax not run hookActionAdminBefore();
     */
    public function autoRestoreSampleData()
    {
        if (Hook::isModuleRegisteredOnHook($this, 'actionAdminBefore', (int)Context::getContext()->shop->id)) {
            $theme_manager = new stdclass();
            $theme_manager->theme_manager = 'theme_manager';
            $this->hookActionAdminBefore(array(
                'controller' => $theme_manager,
            ));
        }
    }

    //DONGND:: update direction css, js, img for 1.7.4.0
    public function getMediaDir()
    {
        $media_dir = '';
        if (version_compare(_PS_VERSION_, '1.7.4.0', '>=') || version_compare(Configuration::get('PS_VERSION_DB'), '1.7.4.0', '>=')) {
            $media_dir = 'modules/'.$this->name.'/views/';
        } else {
            $media_dir = 'modules/'.$this->name.'/';
        }
        return $media_dir;
    }
    
    private function exportGroup()
    {
        $id_group = (int)Tools::getValue('id_group');
        
        $group = LeoSlideshowGroup::getGroupByID($id_group);
        $sliders = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
                    SELECT lsll.`id_lang`, lsl.`id_leoslideshow_slides` as id, lsl.*,lsll.*
                    FROM '._DB_PREFIX_.'leoslideshow_slides lsl
                    LEFT JOIN '._DB_PREFIX_.'leoslideshow_slides_lang lsll ON (lsl.id_leoslideshow_slides = lsll.id_leoslideshow_slides)
                    WHERE lsl.id_group = '.(int)$id_group.'
                    ORDER BY lsl.position');
        
        $language_field = array('title', 'link', 'image', 'thumbnail', 'video', 'layersparams');

        $languages = Language::getLanguages();
        $lang_list = array();
        foreach ($languages as $lang) {
            # module validation
            $lang_list[$lang['id_lang']] = $lang['iso_code'];
        }

        foreach ($sliders as $slider) {
            $curent_lang = 'en';
            foreach ($slider as $key => $value) {
                if ($key == 'id_lang') {
                    $curent_lang = $lang_list[$value];
                    continue;
                }
                if (in_array($key, $language_field)) {
                    $group['sliders'][$slider['id']][$key][$curent_lang] = $value;
                } else {
                    # module validation
                    $group['sliders'][$slider['id']][$key] = $value;
                }
            }
        }
        header('Content-Type: plain/text');
        header('Content-Disposition: Attachment; filename=export_group_'.Tools::getValue('id_group').'_'.time().'.txt');
        header('Pragma: no-cache');
        die(LeoSlideshowSlide::base64Encode(Tools::jsonEncode($group)));
    }
    
    /**
     * PERMISSION ACCOUNT demo@demo.com
     */
    public function getPermission($variable, $employee = null)
    {
        if ($variable == 'configure') {
            // Allow see form if permission is : configure, view
            $configure = Module::getPermissionStatic($this->id, 'configure', $employee);
            $view = Module::getPermissionStatic($this->id, 'view', $employee);
            return ($configure || $view);
        }
        
        return Module::getPermissionStatic($this->id, $variable, $employee);
    }
    
    /**
     * PERMISSION ACCOUNT demo@demo.com
     */
    public function access($action)
    {
        $employee = null;
        return Module::getPermissionStatic($this->id, $action, $employee);
    }
}