<?php
/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
error_reporting(E_ALL & ~E_NOTICE);
if ($_SERVER['REQUEST_URI']=='/test') exit('1');

setlocale(LC_ALL, 'ru_RU');
setlocale(LC_NUMERIC, 'C');
mb_internal_encoding("UTF-8");

require_once LAB_PATH_KERNEL.'/functions/functions.php';

$aFolders=array('/cache',
				'/cache/smarty',
				'/template_c',
				'/backup');

if (!is_writable(LAB_PATH_DATA)) {
    echo("Пожалуйста, установите права на запись для каталога: ".LAB_PATH_DATA."<br />");
	exit;
} else {
	foreach ($aFolders as $sFolder) {
		if (!file_exists(LAB_PATH_DATA.$sFolder)) mkdir(LAB_PATH_DATA.$sFolder, 0777);
		elseif (!is_writable(LAB_PATH_DATA.$sFolder) && !chmod(LAB_PATH_DATA.$sFolder, 0777)) {
		    echo("Пожалуйста, установите права на запись для каталога: ".LAB_PATH_DATA.$sFolder."<br />");
			exit;
		}
	}
}


Tpl::i()->setCompileCheck(false);
Tpl::i()->force_compile=true;
Tpl::i()->template_dir = dirname(__FILE__).'/template/';

include dirname(__FILE__)."/version.php";
Tpl::i()->assign('version', $version);


$cmsini = @parse_ini_file(LAB_PATH_DATA."/cms.ini");
if ($cmsini['prefix']) $cmsini['prefix']=substr($cmsini['prefix'], 0, -1);

Tpl::i()->assign($cmsini);
Tpl::i()->assign(
	'code',
	(isset($cmsini['secure_code']))?$cmsini['secure_code']:substr(
		md5(microtime().md5(microtime())).md5(microtime().md5(microtime())), 0, rand(32, 64)
	)
);

$stage=(!empty($_GET['stage'])?intval($_GET['stage']):null);

if ($_SERVER['REQUEST_METHOD']!='POST') $stage=0;

switch($stage) {
	case(1):
		if ($_POST['send_db']) {
			$errors=array();
			if (!$_POST['dbuser'] || !$_POST['dblocation'] || !$_POST['dbname'] || !$_POST['prefix']) {
				$errors[]="Необходимо указать параметры соединения с БД";
			}
			if (!trim($_POST['login'])) $errors[]="Логин не может быть пустым";
			if (!trim($_POST['pass']))  $errors[]="Пароль не может быть пустым";
			if ($_POST['pass']!=$_POST['pass1']) $errors[]="Пароли не совпадают";
			if (!trim($_POST['email'])) $errors[]="Email не может быть пустым";
			
			if (!count($errors)) {
				prepareConfig();
				config::set('core.noDBErrorHandler', true);
				if (Db::i()->error) {
					$errors[]='Подключение к базе данных не удалось'
					.(Db::i()->error['message']?": ".Db::i()->error['message']:'');
				} else {
					Tpl::i()->assign('finish', true);
				}
				Tpl::i()->assign('is_errors', count($errors));
			}
			Tpl::i()->assign('errors', $errors);
		}
		Tpl::i()->display('stage1.tpl');
		break;
	case(2):
		/*
		Проверки установленных модулей
		*/
		$result=array();
		
		$status=phpversion();
		$is_ok=($status >= '5.2');
		$result[]=array('title'=>'Версия PHP не ниже 5.2', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=function_exists('mysqli_connect');
		$status=$is_ok?'да':'нет';
		$result[]=array('title'=>'Поддержка MySQLi', 'status'=>$status, 'is_ok'=>$is_ok);
		prepareConfig();
		$status=mysqli_get_server_info(Db::i()->link);
		$is_ok=($status>='4.1');
		$result[]=array('title'=>'Версия MySQL не ниже 4.1', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=function_exists('mb_substr');
		$status=$is_ok?'да':'нет';
		$result[]=array('title'=>'Поддержка многобайтовых кодировок mb_string', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=extension_loaded('simplexml');
		$status=$is_ok?'да':'нет';
		$result[]=array('title'=>'Поддержка модуля simplexml', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=function_exists('iconv');
		$status=$is_ok?'да':'нет';
		$result[]=array('title'=>'Поддержка модуля iconv', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=ini_get('file_uploads');
		$status=$is_ok?'да':'нет';
		$result[]=array('title'=>'Возможность загрузки файлов на сервер', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=!ini_get('safe_mode');
		$status=$is_ok?'выкл':'вкл';
		$result[]=array('title'=>'Режим Safe mode', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=!ini_get('magic_quotes_runtime');
		$status=$is_ok?'выкл':'вкл';
		$result[]=array('title'=>'Состояние директивы Magic Quotes Runtime', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=!ini_get('register_globals');
		$status=$is_ok?'выкл':'вкл';
		$result[]=array('title'=>'Состояние директивы Register Globals', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=extension_loaded('gd');
		$status=$is_ok?'да':'нет';
		$result[]=array('title'=>'Наличие библиотеки gd_lib', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=($_SERVER['DOCUMENT_ROOT']==dirname($_SERVER['SCRIPT_FILENAME']));
		$status=$is_ok?'да':'нет';
		$result[]=array('title'=>'Размещение файлов в корне веб-сервера', 'status'=>$status, 'is_ok'=>$is_ok);
		

		if (ini_get('allow_url_fopen')) {
			$test=file_get_contents(
				'http://'.$_SERVER['SERVER_NAME'].(($_SERVER['SERVER_PORT']!=80)?':'.$_SERVER['SERVER_PORT']:'').'/test'
			);
			$is_ok=($test==1);
			$status=$is_ok?'да':'нет';
			$result[]=array('title'=>'Модуль перенаправления mod_rewrite', 'status'=>$status, 'is_ok'=>$is_ok);
		}
		
		foreach ($aFolders as $sFolder) {
			$is_ok=is_writable(LAB_PATH_DATA.$sFolder);
			$status=$is_ok?'доступно':'не доступно';
			$result[]=array(
				'title'=>'Запись в каталог '.str_replace(LAB_PATH_ROOT, '', LAB_PATH_DATA).$sFolder,
				'status'=>$status,
				'is_ok'=>$is_ok
			);
		}

		$is_ok=is_writable(LAB_PATH_STORAGE);
		$status=$is_ok?'доступно':'не доступно';
		$result[]=array(
			'title'=>'Запись в каталог '.str_replace(LAB_PATH_ROOT, '', LAB_PATH_STORAGE),
			'status'=>$status,
			'is_ok'=>$is_ok
		);

		if (file_exists(LAB_PATH_DATA.'/cms.ini')) {
			$is_ok=is_writable(LAB_PATH_DATA.'/cms.ini');
			$status=$is_ok?'доступно':'не доступно';
			$result[]=array(
				'title'=>'Запись в файл '.str_replace(LAB_PATH_ROOT, '', LAB_PATH_DATA).'/cms.ini',
				'status'=>$status,
				'is_ok'=>$is_ok
			);
		}

		$continue=true;
		foreach ($result as $item) {
			if (!$item['is_ok']) {
				$continue=false;
				break;
			}
		}
		
		Tpl::i()->assign('continue', $continue);
		Tpl::i()->assign('ext', $result);
		Tpl::i()->display('stage2.tpl');
		break;
	case(3):
		if ($_SERVER['REQUEST_METHOD']=='POST') {
			$errors=array();
			if (!$_POST['dbuser'] || !$_POST['dblocation'] || !$_POST['dbname'] || !$_POST['prefix']) {
				$errors[]="Необходимо указать параметры соединения с БД";
			}
			if (!trim($_POST['login'])) $errors[]="Логин не может быть пустым";
			if (!trim($_POST['pass']))  $errors[]="Пароль не может быть пустым";
			if (!trim($_POST['email'])) $errors[]="Email не может быть пустым";
			
			if (!count($errors)) {
				prepareConfig();
				if (!Db::i()->link) $errors[]="Подключение к базе данных не удалось";
				
				if (!count($errors)) {
					Tpl::i()->assign($_POST);
					
					$ini=Tpl::i()->fetch(dirname(__FILE__).'/template/ini.tpl');
					file_put_contents(LAB_PATH_DATA.'/cms.ini', $ini);
					if (!Db::parse_mysql_dump(dirname(__FILE__)."/kernel.sql", false)) {
						$errors[]="Во время разворачивания базы данных произошли ошибки!";
					}
					if (file_exists(LAB_PATH_MODULES.'/lc_guide/uninstall.sql')) {
						if (!Db::parse_mysql_dump(LAB_PATH_MODULES.'/lc_guide/uninstall.sql', false)) {
							$errors[]="Во время разворачивания базы данных произошли ошибки!";
						}
					}
					if (file_exists(LAB_PATH_MODULES.'/lc_guide/install.sql')) {
						if (!Db::parse_mysql_dump(LAB_PATH_MODULES.'/lc_guide/install.sql', false)) {
							$errors[]="Во время разворачивания базы данных произошли ошибки!";
						}
					}
					
					@chmod(LAB_PATH_DATA.'/cms.ini', 0666);

					define('SECURECODE', $_POST['code']);
					
					require_once LAB_PATH_MODULES.'/login/class.user.php';
					$user=new login_user();
					$data=array('pass'=>$_POST['pass'],
								'login'=>$_POST['login'],
								'email'=>$_POST['email'],
								'user_id'=>1,
								'group_id'=>1,
								'status'=>1);
					$user->add($data);
					config::save('core.db_version', $version);
					Tpl::i()->assign('finish', true);
					
				}
			}
			Tpl::i()->assign('is_errors', count($errors));
			Tpl::i()->assign('errors', $errors);
		}
		Tpl::i()->display('stage3.tpl');
		break;
	case(4):
		prepareConfig();
		//создаем файл с дефолтными настройками
		make_conf_file(LAB_PATH_KERNEL.'/install/config.xml', 'core');
		$modules=Db::i()->selectCol("SELECT module FROM ?_modules");
		if ($modules) foreach ($modules as $module) {
			if (file_exists(LAB_PATH_MODULES.'/'.$module.'/config.xml')) {
				make_conf_file(LAB_PATH_MODULES.'/'.$module.'/config.xml', $module);
			}
		}
		file_put_contents(LAB_PATH_DATA.'/install.lock', null);
		@chmod(LAB_PATH_DATA.'/install.lock', 0666);
		Tpl::i()->display('stage4.tpl');
		break;
	default:

		Tpl::i()->display('stage0.tpl');
		break;


}

function logger($db, $sql)
{
	if (mb_substr($sql, 0, 10) == "  -- error") {
		Tpl::i()->append('sqls', array(Db::i()->error['query'], Db::i()->error['message']));
	}
	//elseif (mb_substr($sql, 0, 4) != "  --") Tpl::i()->append('sqls', array($sql, 0));
}

function make_conf_file($xml, $module)
{
	$xml = simplexml_load_file($xml);
	$data=$xml->xpath('configs/config');
	if (is_array($data) && count($data)) {
		foreach ($data as $conf) {
			$default_conf=get_object_vars($conf);
			if ($module_id=='core') $key='core.'.$default_conf['name'];
			else $key='module.'.$module.'.'.$default_conf['name'];
			
			config::save($key, $default_conf['default'], -1);
			if (!$module_id=='core' && $default_conf['name']=='email') {
				config::save('core.'.$default_conf['name'], $_POST['email'], -1);
			}
		}
	}
}

function prepareConfig()
{
	config::set('core.dbuser', $_POST['dbuser']);
	config::set('core.dbpasswd', $_POST['dbpasswd']);
	config::set('core.dblocation', $_POST['dblocation']);
	config::set('core.dbname', $_POST['dbname']);
	config::set('core.prefix', $_POST['prefix']."_");
	config::set('core.debug_mode', 1);
	config::set('core.debug_console', 1);
}