<?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");

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

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/';

$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();
					LabConfig::$cfg['noDBErrorHandler']=true;
					if(!Db::i()->link) $errors[]="Подключение к базе данных не удалось";
					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.0');
		$result[]=array('title'=>'Версия PHP не ниже 5.0', 'status'=>$status, 'is_ok'=>$is_ok);
		$is_ok=function_exists('mysql_connect');
		$status=$is_ok?'да':'нет';
		$result[]=array('title'=>'Поддержка MySQL', 'status'=>$status, 'is_ok'=>$is_ok);
		prepareConfig();
		$status=mysql_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))
					{
						include dirname(__FILE__)."/version.php";
						Tpl::i()->assign('version', $version);
						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']);
						
						Db::i()->query("INSERT INTO ?_users (user_id, group_id, register_date, `status`, login, pass, email) VALUES(1, 1, NOW(), 1, ?, ?, ?)", $_POST['login'], User::PassHash($_POST['pass']), $_POST['email']);
						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_id AS ARRAY_KEY, module FROM ?_modules");
		if ($modules) foreach($modules as $module_id=>$module)
		{
			if (file_exists(LAB_PATH_MODULES.'/'.$module.'/config.xml')) make_conf_file(LAB_PATH_MODULES.'/'.$module.'/config.xml', '-1_'.$module_id);
		}
		file_put_contents(LAB_PATH_DATA.'/install.lock', null);
		@chmod(LAB_PATH_DATA.'/install.lock', 0666);
		User::setResetSession();
		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, $file)
{
	Tpl::i()->assign('config_tmp', array());
	//$xml = simplexml_load_file(LAB_PATH_KERNEL.'/install/config.xml');
	$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);
			$default[$default_conf['name']]=$default_conf['default'];
		}
		if ($file=='core' && array_key_exists('email', $default)) $default['email']=$_POST['email'];
		if (count($default))
		{
			Tpl::i()->assign('config_tmp', $default);
			file_put_contents(LAB_PATH_DATA.'/configs/'.$file.'.conf', Tpl::i()->fetch(dirname(__FILE__).'/template/conf.tpl'));
			@chmod(LAB_PATH_DATA.'/configs/'.$file.'.conf', 0666);
		}
	}
}

function prepareConfig()
{
	LabConfig::$cfg=array('mysql'=>array(	'dbuser'=>$_POST['dbuser'],
									'dbpasswd'=>$_POST['dbpasswd'],
									'dblocation'=>$_POST['dblocation'],
									'dbname'=>$_POST['dbname'],
									'prefix'=>$_POST['prefix']."_"),
									'debug_mode'=>1,
									'debug_console'=>0);
}