<?php
/**
* 2007-2014 PrestAddon
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestaddon.com for more information.
*
*  @author    PrestAddon SA <admin@prestaddon.com>
*  @copyright 2007-2014 PrestAddon
*  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

if (!defined('_PS_VERSION_'))
	exit;
class VtemAdvertising extends Module
{
	protected $max_image_size = 1048576;
	protected $default_language;
	protected $languages;
	public function __construct()
	{
		$this->name = 'vtemadvertising';
		$this->tab = 'others';
		$this->version = '1.0';
		$this->bootstrap = true;
		$this->secure_key = Tools::encrypt($this->name);
		$this->default_language = Language::getLanguage(Configuration::get('PS_LANG_DEFAULT'));
		$this->languages = Language::getLanguages();
		$this->author = 'PrestAddon';
		parent::__construct();
		$this->displayName = $this->l('VTEM Advertising');
		$this->description = $this->l('Configure the advertisings of the theme.');
		$this->uploads_path = _PS_MODULE_DIR_.$this->name.'/img/';
		$this->admin_tpl_path = _PS_MODULE_DIR_.$this->name.'/views/templates/admin/';
		$this->hooks_tpl_path = _PS_MODULE_DIR_.$this->name.'/';
	}
	public function install()
	{
		if (!parent::install()
		|| !$this->installDB()
		|| !$this->installFixtures(Language::getLanguages(true))
		|| !$this->registerHook('displayHeader')
		|| !$this->registerHook('displayTopColumn')
		|| !$this->registerHook('displayLeftColumn')
		|| !$this->registerHook('displayRightColumn')
		|| !$this->registerHook('displayHome')
		|| !$this->registerHook('displayFooter')
		|| !$this->registerHook('displayBackOfficeHeader')
		|| !$this->registerHook('actionObjectLanguageAddAfter'))
			return false;
		return true;
	}
	private function installDB()
	{
		return (
			Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'vtemadvertising`') && Db::getInstance()->Execute('
			CREATE TABLE `'._DB_PREFIX_.'vtemadvertising` (
					`id_item` int(10) unsigned NOT NULL AUTO_INCREMENT,
					`id_shop` int(10) unsigned NOT NULL,
					`id_lang` int(10) unsigned NOT NULL,
					`item_order` int(10) unsigned NOT NULL,
					`title` VARCHAR(100),
					`title_use` tinyint(1) unsigned NOT NULL DEFAULT "0",
					`hook` VARCHAR(100),
					`url` VARCHAR(100),
					`target` tinyint(1) unsigned NOT NULL DEFAULT "0",
					`image` VARCHAR(100),
					`image_w` VARCHAR(10),
					`image_h` VARCHAR(10),
					`html` TEXT,
					`item_class` VARCHAR(200),
					`active` tinyint(1) unsigned NOT NULL DEFAULT "1",
					PRIMARY KEY (`id_item`)
			) ENGINE = '._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8;'));
	}
	protected function installFixture($hook, $id_image, $id_shop, $id_lang, $id_class = '', $modhtml = '')
	{
		$result = true;
		$sizes = getimagesize((dirname(__FILE__).DIRECTORY_SEPARATOR.'img'.DIRECTORY_SEPARATOR.'banner-img'.(int)$id_image.'.jpg'));
		$width = (isset($sizes[0]) && $sizes[0])? (int)$sizes[0] : 0;
		$height = (isset($sizes[1]) && $sizes[1])? (int)$sizes[1] : 0;
		$result &= Db::getInstance()->Execute('
			INSERT INTO `'._DB_PREFIX_.'vtemadvertising` ( 
					`id_shop`, `id_lang`, `item_order`, `title`, `title_use`, `hook`, `url`, `target`, `image`, `image_w`, `image_h`, `html`, `item_class`, `active`
			) VALUES ( 
				"'.(int)$id_shop.'",
				"'.(int)$id_lang.'",
				"'.(int)$id_image.'",
				"",
				"0",
				"'.pSQL($hook).'",
				"#",
				"0",
				"banner-img'.(int)$id_image.'.jpg",
				'.$width.',
				'.$height.',
				"'.$modhtml.'",
				"'.$id_class.'",
				1)
			');
			return $result;
	}
	public function installFixtures($languages = null)
	{
		$result = true;
		$default_class = 'col-sm-4 hidden-xs, col-sm-4 hidden-xs, col-sm-4 hidden-xs'; // Class1, Class2, Class3,...
		$iclass = explode(',', $default_class);
		if ($languages === null)
			$languages = Language::getLanguages(true);
		foreach ($languages as $language)
		{
			//for ($i = 1; $i < 4; $i++)
				//$result &= $this->installFixture('top', $i, $this->context->shop->id, $language['id_lang'], (isset($iclass[$i - 1]) ? $iclass[$i - 1] : ''),'<h3 class=\"banner-title\">Lorem ipsum dolor</h3><div class=\"banner-content\">Duis aute irure dolor in reprehenderit in voluptate velit esse cillum</div>');
			for ($i = 1; $i < 4; $i++)
				$result &= $this->installFixture('home', $i, $this->context->shop->id, $language['id_lang'], (isset($iclass[$i - 1]) ? $iclass[$i - 1] : ''));
		}
		return $result;
	}
	public function uninstall()
	{
		$images = Db::getInstance()->executeS('SELECT image FROM `'._DB_PREFIX_.'vtemadvertising`');
		foreach ($images as $image)
			$this->deleteImage($image['image']);
		if (!Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'vtemadvertising`') || !parent::uninstall())
			return false;
		return true;
	}
	public function hookDisplayBackOfficeHeader()
	{
		if (Tools::getValue('configure') != $this->name)
			return;
		$this->context->controller->addCSS($this->_path.'views/templates/admin/css/admin.css');
		$this->context->controller->addJquery();
		$this->context->controller->addJS($this->_path.'views/templates/admin/js/admin.js');
	}
	public function hookActionObjectLanguageAddAfter($params)
	{
		return $this->installFixtures(array((int)$params['object']->id));
	}
	public function hookdisplayTopColumn()
	{
		return $this->hookdisplayTop();
	}
	public function hookdisplayTop()
	{
		$this->context->smarty->assign(array(
			'htmlitems' => $this->getItemsFromHook('top'),
			'hook' => 'top'
		));
		return $this->display(__FILE__, 'vtemadvertising.tpl');
	}
	public function hookDisplayHome()
	{
		$this->context->smarty->assign(array(
			'htmlitems' => $this->getItemsFromHook('home'),
			'hook' => 'home'
		));
		return $this->display(__FILE__, 'vtemadvertising.tpl');
	}
	public function hookDisplayLeftColumn()
	{
		$this->context->smarty->assign(array(
			'htmlitems' => $this->getItemsFromHook('left'),
			'hook' => 'left'
		));
		return $this->display(__FILE__, 'vtemadvertising.tpl');
	}
	public function hookDisplayRightColumn()
	{
		$this->context->smarty->assign(array(
			'htmlitems' => $this->getItemsFromHook('right'),
			'hook' => 'right'
		));
		return $this->display(__FILE__, 'vtemadvertising.tpl');
	}
	public function hookDisplayFooter()
	{
		$this->context->smarty->assign(array(
			'htmlitems' => $this->getItemsFromHook('footer'),
			'hook' => 'footer'
		));
		return $this->display(__FILE__, 'vtemadvertising.tpl');
	}
	protected function getItemsFromHook($hook)
	{
		if (!$hook)
			return false;
		return Db::getInstance()->ExecuteS('
		SELECT *
		FROM `'._DB_PREFIX_.'vtemadvertising`
		WHERE id_shop = '.(int)$this->context->shop->id.' AND id_lang = '.(int)$this->context->language->id.'
		AND hook = "'.pSQL($hook).'" AND active = 1
		ORDER BY item_order ASC');
	}
	protected function deleteImage($image)
	{
		$file_name = $this->uploads_path.$image;
		if (realpath(dirname($file_name)) != realpath($this->uploads_path))
			Tools::dieOrLog(sprintf('Could not find upload directory'));
		if ($image != '' && is_file($file_name) && !strpos($file_name, 'banner-img') && !strpos($file_name, 'bg-theme') && !strpos($file_name, 'footer-bg'))
			unlink($file_name);
	}
	protected function removeItem()
	{
		$id_item = (int)Tools::getValue('item_id');
		if ($image = Db::getInstance()->getValue('SELECT image FROM `'._DB_PREFIX_.'vtemadvertising` WHERE id_item = '.(int)$id_item))
			$this->deleteImage($image);
		Db::getInstance()->delete(_DB_PREFIX_.'vtemadvertising', 'id_item = '.(int)$id_item);
		if (Db::getInstance()->Affected_Rows() == 1)
		{
			Db::getInstance()->execute('
				UPDATE `'._DB_PREFIX_.'vtemadvertising` 
				SET item_order = item_order-1 
				WHERE (
					item_order > '.(int)Tools::getValue('item_order').' AND 
					id_shop = '.(int)$this->context->shop->id.' AND
					hook = "'.pSQL(Tools::getValue('item_hook')).'")'
			);
			$this->context->smarty->assign('confirmation', $this->l('Successful deletion.'));
		}
		else
			$this->context->smarty->assign('error', $this->l('Can\'t delete the slide.'));
	}
	protected function updateItem()
	{
		$id_item = (int)Tools::getValue('item_id');
		$title = Tools::getValue('item_title');
		$content = Tools::getValue('item_html');
		$item_class = Tools::getValue('item_class');
		if (!Validate::isCleanHtml($title, (int)Configuration::get('PS_ALLOW_HTML_IFRAME')))
		{
			$this->context->smarty->assign('error', $this->l('Invalid content'));
			return false;
		}
		$new_image = '';
		$image_w = (is_numeric(Tools::getValue('item_img_w'))) ? (int)Tools::getValue('item_img_w') : '';
		$image_h = (is_numeric(Tools::getValue('item_img_h'))) ? (int)Tools::getValue('item_img_h') : '';
		if (!empty($_FILES['item_img']['name']))
		{
			if ($old_image = Db::getInstance()->getValue('SELECT image FROM `'._DB_PREFIX_.'vtemadvertising` WHERE id_item = '.(int)$id_item))
				if (file_exists(dirname(__FILE__).'/img/'.$old_image))
					unlink(dirname(__FILE__).'/img/'.$old_image);
			if (!$image = $this->uploadImage($_FILES['item_img'], $image_w, $image_h))
				return false;
			$new_image = 'image = "'.pSQL($image).'",';
		}
		if (!Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'vtemadvertising` SET 
					title = "'.pSQL($title).'",
					title_use = '.(int)Tools::getValue('item_title_use').',
					hook = "'.pSQL(Tools::getValue('item_hook')).'",
					url = "'.pSQL(Tools::getValue('item_url')).'",
					target = '.(int)Tools::getValue('item_target').',
					'.$new_image.'
					image_w = '.(int)$image_w.',
					image_h = '.(int)$image_h.',
					active = '.(int)Tools::getValue('item_active').',
					html = "'.pSQL($content, true).'",
					item_class = "'.pSQL($item_class).'"
			WHERE id_item = '.(int)Tools::getValue('item_id')))
		{
			if ($image = Db::getInstance()->getValue('SELECT image FROM `'._DB_PREFIX_.'vtemadvertising` WHERE id_item = '.(int)Tools::getValue('item_id')))
				$this->deleteImage($image);
			$this->context->smarty->assign('error', $this->l('An error occurred while saving data.'));
			return false;
		}
		$this->context->smarty->assign('confirmation', $this->l('Successfully updated.'));
		return true;
	}
	protected function uploadImage($image, $image_w = '', $image_h = '')
	{
		$res = false;
		$img_man = ImageManager::validateUpload($image, $this->max_image_size);
		if (is_array($image) && ($img_man === false) && ($tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS')) && move_uploaded_file($image['tmp_name'], $tmp_name))
		{
			$type = Tools::strtolower(Tools::substr(strrchr($image['name'], '.'), 1));
			$img_name = Tools::encrypt($image['name'].sha1(microtime())).'.'.$type;
			Configuration::set('PS_IMAGE_QUALITY', 'png_all');
			if (ImageManager::resize($tmp_name, dirname(__FILE__).'/img/'.$img_name, $image_w, $image_h))
				$res = true;
		}
		if (!$res)
		{
			$this->context->smarty->assign('error', $this->l('An error occurred during the image upload.'));
			return false;
		}
		return $img_name;
	}
	public function getContent()
	{
		if (Tools::isSubmit('newItem'))
			$this->addItem();
		elseif (Tools::isSubmit('updateItem'))
			$this->updateItem();
		elseif (Tools::isSubmit('removeItem'))
			$this->removeItem();
		$html = $this->renderForm();
		return $html;
	}
	protected function addItem()
	{
		$title = Tools::getValue('item_title');
		$content = Tools::getValue('item_html');
		$item_class = Tools::getValue('item_class');
		if (!Validate::isCleanHtml($title, (int)Configuration::get('PS_ALLOW_HTML_IFRAME')))
		{
			$this->context->smarty->assign('error', $this->l('Invalid content'));
			return false;
		}
		if (!$current_order = (int)Db::getInstance()->getValue('
			SELECT item_order + 1
			FROM `'._DB_PREFIX_.'vtemadvertising` 
			WHERE 
					id_shop = '.(int)$this->context->shop->id.' 
					AND id_lang = '.(int)Tools::getValue('id_lang').'
					AND hook = "'.pSQL(Tools::getValue('item_hook')).'" 
					ORDER BY item_order DESC'))
			$current_order = 1;
		$image_w = is_numeric(Tools::getValue('item_img_w')) ? (int)Tools::getValue('item_img_w') : '';
		$image_h = is_numeric(Tools::getValue('item_img_h')) ? (int)Tools::getValue('item_img_h') : '';
		if (!empty($_FILES['item_img']['name']))
		{
			if (!$image = $this->uploadImage($_FILES['item_img'], $image_w, $image_h))
				return false;
		}
		else
		{
			$image = '';
			$image_w = '';
			$image_h = '';
		}
		if (!Db::getInstance()->Execute('
			INSERT INTO `'._DB_PREFIX_.'vtemadvertising` ( 
					`id_shop`, `id_lang`, `item_order`, `title`, `title_use`, `hook`, `url`, `target`, `image`, `image_w`, `image_h`, `html`, `item_class`, `active`
			) VALUES ( 
					"'.(int)$this->context->shop->id.'",
					"'.(int)Tools::getValue('id_lang').'",
					"'.(int)$current_order.'",
					"'.pSQL($title).'",
					"'.(int)Tools::getValue('item_title_use').'",
					"'.pSQL(Tools::getValue('item_hook')).'",
					"'.pSQL(Tools::getValue('item_url')).'",
					"'.(int)Tools::getValue('item_target').'",
					"'.pSQL($image).'",
					"'.pSQL($image_w).'",
					"'.pSQL($image_h).'",
					"'.pSQL($content).'",
					"'.pSQL($item_class).'",
					1)
			'))
		{
			if (!Tools::isEmpty($image))
				$this->deleteImage($image);
			$this->context->smarty->assign('error', $this->l('An error occurred while saving data.'));
			return false;
		}
		$this->context->smarty->assign('confirmation', $this->l('New item successfully added.'));
		return true;
	}
	protected function renderForm()
	{
		$id_shop = (int)$this->context->shop->id;
		$items = array();
		$hooks = array();
		$this_shop = $this->context->shop;
		$this_token = Tools::getAdminTokenLite('AdminModules');
		$this->context->smarty->assign('htmlcontent', array(
			'admin_tpl_path' => $this->admin_tpl_path,
			'hooks_tpl_path' => $this->hooks_tpl_path,
			'info' => array(
				'module' => $this->name,
				'name' => $this->displayName,
				'version' => $this->version,
				'psVersion' => _PS_VERSION_,
				'context' => (Configuration::get('PS_MULTISHOP_FEATURE_ACTIVE') == 0) ? 1 : ($this_shop->getTotalShops() != 1) ? $this_shop->getContext() : 1
			)
		));
		foreach ($this->languages as $language)
		{
			$hooks[$language['id_lang']] = array(
				'home',
				'top',
				'left',
				'right',
				'footer'
			);
			foreach ($hooks[$language['id_lang']] as $hook)
				$items[$language['id_lang']][$hook] = Db::getInstance()->ExecuteS('
					SELECT * FROM `'._DB_PREFIX_.'vtemadvertising` 
					WHERE id_shop = '.(int)$id_shop.' 
					AND id_lang = '.(int)$language['id_lang'].' 
					AND hook = "'.pSQL($hook).'" 
					ORDER BY item_order ASC'
				);
		}
		$this->context->smarty->assign('htmlitems', array(
			'items' => $items,
			'lang' => array(
				'default' => $this->default_language,
				'all' => $this->languages,
				'lang_dir' => _THEME_LANG_DIR_,
				'user' => $this->context->language->id
			),
			'postAction' => 'index.php?tab=AdminModules&configure='.$this->name.'&token='.$this_token.'&tab_module=other&module_name='.$this->name.'',
			'id_shop' => $id_shop
		));
		return $this->display(__FILE__, 'views/templates/admin/admin.tpl');
	}
}