<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
/**
 * @class  installView
 * @author NAVER (developers@xpressengine.com)
 * @brief View class of install module
 */
class installView extends install
{
	public static $checkEnv = false;
	public static $rewriteCheckFilePath = 'files/cache/tmpRewriteCheck.txt';
	public static $rewriteCheckString = '';

	/**
	 * @brief Initialization
	 */
	function init()
	{
		// Stop if already installed.
		if (Context::isInstalled())
		{
			throw new Rhymix\Framework\Exception('msg_already_installed');
		}

		// Set the browser title.
		Context::setBrowserTitle(lang('introduce_title'));

		// Specify the template path.
		$this->setTemplatePath($this->module_path.'tpl');

		// Set default frontend configurations.
		config('view.jquery_version', 3);
		config('view.minify_scripts', 'none');
		config('view.concat_scripts', 'none');

		// Check the environment.
		$oInstallController = getController('install');
		self::$checkEnv = $oInstallController->checkInstallEnv();
		if (self::$checkEnv)
		{
			$oInstallController->makeDefaultDirectory();
		}
	}

	/**
	 * @brief Index page
	 */
	function dispInstallIndex()
	{
		// If there is an autoinstall config file, use it.
		if (file_exists(RX_BASEDIR . 'config/install.config.php'))
		{
			include RX_BASEDIR . 'config/install.config.php';

			if (isset($install_config) && is_array($install_config))
			{
				$oInstallController = getController('install');
				$output = $oInstallController->procInstall($install_config);
				if (!$output->toBool())
				{
					return $output;
				}
				else
				{
					$this->setRedirectUrl(RX_BASEURL);
				}
			}
		}

		// Otherwise, display the license agreement screen.
		Context::set('lang_type', Context::getLangType());
		$this->setTemplateFile('license_agreement');
	}

	/**
	 * @brief Display messages about installation environment
	 */
	function dispInstallCheckEnv()
	{
		// Create a temporary file for mod_rewrite check.
		self::$rewriteCheckString = Rhymix\Framework\Security::getRandom(32);
		FileHandler::writeFile(RX_BASEDIR . self::$rewriteCheckFilePath, self::$rewriteCheckString);

		// Check if the web server is nginx.
		Context::set('use_nginx', stripos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false);
		$this->setTemplateFile('check_env');
	}

	/**
	 * @brief Configure the database
	 */
	function dispInstallDBConfig()
	{
		// Display check_env if it is not installable
		if(!self::$checkEnv)
		{
			return $this->dispInstallCheckEnv();
		}

		// Delete mod_rewrite check file
		FileHandler::removeFile(RX_BASEDIR . self::$rewriteCheckFilePath);

		// Save mod_rewrite check status.
		if(Context::get('rewrite') === 'Y')
		{
			Context::set('use_rewrite', $_SESSION['use_rewrite'] = 'Y');
		}

		Context::set('error_return_url', getNotEncodedUrl('', 'act', Context::get('act')));
		$this->setTemplateFile('db_config');
	}

	/**
	 * @brief Display a screen to enter DB and administrator's information
	 */
	function dispInstallOtherConfig()
	{
		// Display check_env if not installable
		if(!self::$checkEnv)
		{
			return $this->dispInstallCheckEnv();
		}

		// Get list of time zones.
		Context::set('timezones', Rhymix\Framework\DateTime::getTimezoneList());

		// Automatically select a time zone for the user.
		Context::set('selected_timezone', $this->detectUserTimeZone());

		// Always use SSL if installing via SSL.
		Context::set('use_ssl', RX_SSL ? 'always' : 'none');
		Context::set('sitelock_ip_range', $this->detectUserIPRange());
		$this->setTemplateFile('other_config');
	}

	/**
	 * Detect the IP range of the user.
	 */
	function detectUserIPRange()
	{
		if (RX_CLIENT_IP_VERSION === 4)
		{
			return preg_replace('/\.\d+$/', '.*', RX_CLIENT_IP);
		}
		elseif (function_exists('inet_pton'))
		{
			$binary = inet_pton(RX_CLIENT_IP);
			$binary = substr($binary, 0, 8) . str_repeat(chr(0), 8);
			return inet_ntop($binary) . '/64';
		}
		else
		{
			return RX_CLIENT_IP;
		}
	}

	/**
	 * Detect best time zone for the user.
	 */
	function detectUserTimeZone()
	{
		switch (Context::getLangType())
		{
			case 'ko': return 'Asia/Seoul';
			case 'en': return 'Europe/London';
			case 'ja': return 'Asia/Tokyo';
			case 'zh-CN': return 'Asia/Shanghai';
			case 'zh-TW': return 'Asia/Taipei';
			case 'de': return 'Europe/Berlin';
			case 'es': return 'Europe/Madrid';
			case 'fr': return 'Europe/Paris';
			case 'mn': return 'Asia/Ulaanbaatar';
			case 'ru': return 'Europe/Moscow';
			case 'tr': return 'Europe/Istanbul';
			case 'vi': return 'Asia/Ho_Chi_Minh';
			default: return 'UTC';
		}
	}
}
/* End of file install.view.php */
/* Location: ./modules/install/install.view.php */
