<?php
/**
 * Copyright ETS Software Technology Co., Ltd
 *
 * NOTICE OF LICENSE
 *
 * This file is not open source! Each license that you purchased is only available for 1 website only.
 * If you want to use this file on more websites (or projects), you need to purchase additional licenses.
 * You are not allowed to redistribute, resell, lease, license, sub-license or offer our resources to any third party.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future.
 *
 * @author ETS Software Technology Co., Ltd
 * @copyright  ETS Software Technology Co., Ltd
 * @license    Valid for 1 website (or project) for each purchase of license
 */

if ((bool)Configuration::get('PS_MOBILE_DEVICE'))
    require_once(_PS_MODULE_DIR_ . '/mobile_theme/Mobile_Detect.php');

// Retro 1.3, 'class_exists' cause problem with autoload...
if (version_compare(_PS_VERSION_, '1.4', '<')) {
    // Not exist for 1.3
    class Shop extends ObjectModel
    {
        public $id = 1;
        public $id_shop_group = 1;

        public function __construct()
        {
        }

        public static function getShops($active = false)
        {
            return array(
                array(
                    'id_shop' => 1,
                    'name' => 'Default shop',
                    'active' => $active
                )
            );
        }

        public static function getCurrentShop()
        {
            return 1;
        }
    }

    class Logger
    {
        public static function AddLog($message, $severity = 2)
        {
            $fp = fopen(dirname(__FILE__) . '/../logs.txt', 'a+');
            fwrite($fp, '[' . (int)$severity . '] ' . Tools::safeOutput($message));
            fclose($fp);
        }
    }

}

// Not exist for 1.3 and 1.4
class Context
{
    /**
     * @var Context
     */
    protected static $instance;

    /**
     * @var Cart
     */
    public $cart;

    /**
     * @var Customer
     */
    public $customer;

    /**
     * @var Cookie
     */
    public $cookie;

    /**
     * @var Link
     */
    public $link;

    /**
     * @var Country
     */
    public $country;

    /**
     * @var Employee
     */
    public $employee;

    /**
     * @var Controller
     */
    public $controller;

    /**
     * @var Language
     */
    public $language;

    /**
     * @var Currency
     */
    public $currency;

    /**
     * @var AdminTab
     */
    public $tab;

    /**
     * @var Shop
     */
    public $shop;

    /**
     * @var Smarty
     */
    public $smarty;

    /**
     * @ var Mobile Detect
     */
    public $mobile_detect;

    /**
     * @var boolean|string mobile device of the customer
     */
    protected $mobile_device;

    public function __construct()
    {
        global $cookie, $cart, $smarty, $link;

        $this->tab = null;

        $this->cookie = $cookie;
        $this->cart = $cart;
        $this->smarty = $smarty;
        $this->link = $link;

        $this->controller = new ControllerBackwardModule();
        if (is_object($cookie)) {
            $this->currency = new Currency((int)$cookie->id_currency);
            $this->language = new Language((int)$cookie->id_lang);
            $this->country = new Country((int)$cookie->id_country);
            $this->customer = new CustomerBackwardModule((int)$cookie->id_customer);
            $this->employee = new Employee((int)$cookie->id_employee);
        } else {
            $this->currency = null;
            $this->language = null;
            $this->country = null;
            $this->customer = null;
            $this->employee = null;
        }

        $this->shop = new ShopBackwardModule();

        if ((bool)Configuration::get('PS_MOBILE_DEVICE'))
            $this->mobile_detect = new Mobile_Detect();
    }

    public function getMobileDevice()
    {
        if (is_null($this->mobile_device)) {
            $this->mobile_device = false;
            if ($this->checkMobileContext()) {
                switch ((int)Configuration::get('PS_MOBILE_DEVICE')) {
                    case 0: // Only for mobile device
                        if ($this->mobile_detect->isMobile() && !$this->mobile_detect->isTablet())
                            $this->mobile_device = true;
                        break;
                    case 1: // Only for touchpads
                        if ($this->mobile_detect->isTablet() && !$this->mobile_detect->isMobile())
                            $this->mobile_device = true;
                        break;
                    case 2: // For touchpad or mobile devices
                        if ($this->mobile_detect->isMobile() || $this->mobile_detect->isTablet())
                            $this->mobile_device = true;
                        break;
                }
            }
        }

        return $this->mobile_device;
    }

    protected function checkMobileContext()
    {
        return isset($_SERVER['HTTP_USER_AGENT'])
            && (bool)Configuration::get('PS_MOBILE_DEVICE')
            && !Context::getContext()->cookie->no_mobile;
    }

    /**
     * Get a singleton context
     *
     * @return Context
     */
    public static function getContext()
    {
        if (!isset(self::$instance))
            self::$instance = new Context();
        return self::$instance;
    }

    /**
     * Clone current context
     *
     * @return Context
     */
    public function cloneContext()
    {
        return clone($this);
    }

    /**
     * @return int Shop context type (Shop::CONTEXT_ALL, etc.)
     */
    public static function shop()
    {
        if (!self::$instance->shop->getContextType())
            return ShopBackwardModule::CONTEXT_ALL;
        return self::$instance->shop->getContextType();
    }
}

/**
 * Class Shop for Backward compatibility
 */
class ShopBackwardModule extends Shop
{
    const CONTEXT_ALL = 1;

    public $id = 1;
    public $id_shop_group = 1;


    public function getContextType()
    {
        return ShopBackwardModule::CONTEXT_ALL;
    }

    // Simulate shop for 1.3 / 1.4
    public function getID()
    {
        return 1;
    }

    /**
     * Get shop theme name
     *
     * @return string
     */
    public function getTheme()
    {
        return _THEME_NAME_;
    }

    public static function isFeatureActive()
    {
        return false;
    }
}

/**
 * Class Controller for a Backward compatibility
 * Allow to use method declared in 1.5
 */
class ControllerBackwardModule
{
    /**
     * @param $js_uri
     * @return void
     */
    public function addJS($js_uri)
    {
        Tools::addJS($js_uri);
    }

    /**
     * @param $css_uri
     * @param string $css_media_type
     * @return void
     */
    public function addCSS($css_uri, $css_media_type = 'all')
    {
        Tools::addCSS($css_uri, $css_media_type);
    }

    public function addJquery()
    {
        if (_PS_VERSION_ < '1.5')
            $this->addJS(_PS_JS_DIR_ . 'jquery/jquery-1.4.4.min.js');
        elseif (_PS_VERSION_ >= '1.5')
            $this->addJS(_PS_JS_DIR_ . 'jquery/jquery-1.7.2.min.js');
    }

}

/**
 * Class Customer for a Backward compatibility
 * Allow to use method declared in 1.5
 */
class CustomerBackwardModule extends Customer
{
    public $logged = false;

    /**
     * Check customer informations and return customer validity
     *
     * @param boolean $with_guest
     * @return boolean customer validity
     * @since 1.5.0
     */
    public function isLogged($with_guest = false)
    {
        if (!$with_guest && $this->is_guest == 1)
            return false;

        /* Customer is valid only if it can be load and if object password is the same as database one */
        if ($this->logged == 1 && $this->id && Validate::isUnsignedId($this->id) && Customer::checkPassword($this->id, $this->passwd))
            return true;
        return false;
    }
}
