<?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
*/

class admin_pages_page extends DefaultObject
{
	protected $allowed_keys=array('title', 'description', 'keywords', 'tree_id', 'use_comments', 'text');
	
	public function __construct($id=null)
	{
		$this->data['id']=&$this->data['page_id'];
		if ($id) $this->loadDataById($id);
	}
	
	public function loadDataById($id)
	{
		if ($data=Db::i()->selectRow(
			"SELECT * FROM ?_pages p
			LEFT JOIN ?_tree t ON p.tree_id=t.tree_id
			WHERE page_id=?", $id
		)) {
			$this->set($data);
		}
	}
	
	public function loadDataByTreeId($tree_id)
	{
		if ($data=Db::i()->selectRow(
			"SELECT * FROM ?_pages p
			LEFT JOIN ?_tree t ON p.tree_id=t.tree_id
			WHERE p.tree_id=?", $tree_id
		)) {
			$this->set($data);
		}
	}
	
	public function add(&$data)
	{
		$this->getPath($data);
		//если создаем дочернюю ноду, то проверяем все существующие пути
		//если же создаем страницу на существующей ноде, то проверяем все пути кроме этой ноды
		if (!$this->_checkUrlFree($data['path'])) return;
		//если создаем дочернюю страницу, надо создать сначала ноду
		$data['tree_id']=$this->_createNode($data);
		
		$path=$data['path'];
		
		$this->addPage($data);
		$page=Factory::create('admin_pages.page');
		$data['path']=$path;
		$page->set($data);
		return $page;
	}
	
	public function addPage(&$data)
	{
		$this->_filterKeys($data);
		$data['use_comments']=$data['use_comments']?1:0;
		$data['created']=$data['updated']=time();
		$data['id']=Db::i()->query("INSERT INTO ?_pages (?#) VALUES(?a)", array_keys($data), array_values($data));
	}
	
	
	public function delete()
	{
		//удаляем страницу
		Db::i()->query("DELETE FROM ?_pages WHERE page_id=?", $this->id);
		if ($this->tree_id) {
			//удаляем ноду
			Db::i()->query("DELETE FROM ?_tree WHERE tree_id=?", $this->tree_id);
			//дочерние ноды переносим к родителю
			Db::i()->query("UPDATE ?_tree SET parent_id=? WHERE parent_id=?", $this->parent_id, $this->tree_id);
			//удаляем прикрепленные к узлу модули
			Db::i()->query("DELETE FROM ?_includes WHERE tree_id=?", $this->tree_id);
		}
		$this->_resetItemCache();
	}
	
	public function getPath(&$data)
	{
		if ($data['path']) {
			$data['path']=Url::filter($data['path']);
		} else {
			$data['path']=Url::filter($data['title']);
		}
		return $data['path'];
	}
	
	protected function _checkUrlFree($url, $tree_id=false)
	{
		if ($page_title=Db::i()->selectCell(
			"SELECT name FROM ?_tree
			WHERE path=? { AND tree_id!=?}",
			$url, $tree_id?$tree_id:DBSIMPLE_SKIP
		)) {
			return LabCMS::i()->error(sprintf(_m("Данный URL адрес уже используется узлом \"%s\""), $page_title), true);
		}
		return true;
	}
	
	public function update($data)
	{
		$update=array();
		if (isset($data['path'])) {
			$this->getPath($data);
			//если создаем дочернюю ноду, то проверяем все существующие пути
			//если же создаем страницу на существующей ноде, то проверяем все пути кроме этой ноды
			if (!$this->_checkUrlFree($data['path'], $this->tree_id)) return;
			if ($data['path']!=$this->path) $update['path']=$data['path'];
		}
		
		//если создаем/переносим страницу
		if (isset($data['parent_id']) && $data['parent_id']!=$this->parent_id) $update['parent_id']=$data['parent_id'];
		
		$this->_filterKeys($data);
		$data['use_comments']=empty($data['use_comments'])?0:1;
		$data['updated']=time();
		
		$this->_updateDB($data);
		//если путь изменился, то меняем его для текущей ноды
		if (count($update)) {
			Db::i()->query('UPDATE ?_tree SET ?a WHERE tree_id=?', $update, $this->tree_id);
		}
		$this->_resetItemCache();
		$this->set($data);
		$this->set($update);
		return $this;
	}

	protected function _updateDB(&$data)
	{
		return Db::i()->query('UPDATE ?_pages SET ?a WHERE page_id=?', $data, $this->id);
	}
	
	protected function _resetItemCache()
	{
		Cache_Generic::init()->remove('admin_page_'.$this->tree_id);
	}
	
	protected function _assignModule($tree_id)
	{
		//Подключаем модуль страниц к выбранному узлу. Если узел не менялся, то ничего не произойдет.
		Db::i()->query(
			"INSERT IGNORE INTO ?_includes (tree_id, module_id) VALUES(?, ?)",
			$tree_id, LabCMS::i()->getModuleId()
		);
	}
	
	protected function _createNode(&$data)
	{
		$data['tree_id']=Db::i()->query(
			"INSERT INTO ?_tree (parent_id, name, menu, sitemap, path, `show`)
			VALUES (?, ?, 1, 1, ?, 1)",
			$data['parent_id'], $data['title'], $data['path']
		);
		//делаем ноду последней в списке
		Db::i()->query("UPDATE ?_tree SET pos=tree_id WHERE tree_id=?", $data['tree_id']);
		
		//подключаем к ноде модуль
		$this->_assignModule($data['tree_id']);
		return $data['tree_id'];
	}
	
	public function buildEditForm($extended=false, $new=false)
	{
		$form = Factory::create('HTML_QuickForm2', null, 'post', array('action'=>'#'));
		$token=$form->addElement('hidden', 'token', array('value' => User::i()->token));
		
		$title=$form->addElement('text', 'title', null, array('label' => _m('Заголовок страницы (title)')));
		
		$description=$form->addElement(
			'textarea', 'description', array('id'=>'description'),
			array(
				'label' => '<a onclick="return toggle_block(\'description\');" href="#">'
				.'Описание страницы (meta description)</a>'
			)
		);
		
		$keywords=$form->addElement(
			'textarea', 'keywords', array('id'=>'keywords'),
			array(
				'label' => '<a onclick="return toggle_block(\'keywords\');" href="#">Ключевые слова (meta keywords)</a>'
			)
		);
		
		if ($extended) {
			$tree_id=$form->addElement(
				'select', 'parent_id', null, array('label' => _m('Родитель'), 'options'=>$this->tree())
			);
			$child=$form->addElement('text', 'path', null, array('label' => 'URL'));
		}
		
		$child=$form->addElement(
			'checkbox', 'use_comments', null, array('label' => _m('Разрешить комментарии для этой страницы'))
		);
		if (!config::get('use_comments')) {
			$form->addElement(
				'static', '', null,
				array(
					'content'=>'<span style="color:red; font-size:80%">'
					.'(в настройках модуля комментарии в настоящий момент отключены)</span>'
				)
			);
		}
		
		if ($extended && !$this->tree_id) {
			$form->addElement('submit', null, array('value'=>_m('Создать')));
		} else {
			$form->addElement('submit', null, array('value'=>_m('Сохранить')));
			if ($extended) $form->addElement('submit', 'save_copy', array('value'=>_m('Сохранить копию')));
		}
		
		
		//передаем название поля к которому надо прикрепить визуальный редактор
		Tpl::i()->assign('field', 'text');
		$form->addElement('static', '', null, array('content'=>Tpl::i()->fetch('WYSIWYG/editor.tpl')));
		
		$text=$form->addElement('textarea', 'text', array('id'=>'text', 'rows'=>30));
		
		$title->addRule('required', _m('Не введено название страницы'), null, $this->validation);
		
		if ($this->id) $form->addDataSource(Factory::create('HTML_QuickForm2_DataSource_Array', $this->data));
		
		$form->addElement('static', '', null, array('content'=>$this->_getJs()));
		
		return $form;
	}
	
	protected function _getJs()
	{
		return "
			<script type=\"text/javascript\">
			toggle_block('description');
			toggle_block('keywords');

			function toggle_block(id)
			{
				if (elmnt=document.getElementById(id))
				{
					if (elmnt.style.display=='block' || elmnt.style.display=='')
						elmnt.style.display='none';
					else
						elmnt.style.display='block';
				}
				return false;
			}
			</script>
		";
	}
	
	protected function tree($parent_id=0, $level=0, $tree_select=array(0=>' '))
	{
		$result=Db::i()->select(
			"SELECT t.tree_id,  name,  pos FROM ?_tree t
			WHERE t.parent_id=? ORDER BY pos", $parent_id
		);
		if (count($result)) {
			foreach ($result as $tree) {
				if ($tree['tree_id']==$this->tree_id) continue;
				$margin="";
				for($i=0; $i<$level*3; $i++) $margin.="&nbsp;";
				$tree_select[$tree['tree_id']]=$margin.$tree['name'];
				$tree_select+=$this->tree($tree['tree_id'], $level+1, $tree_select);
			}
			return $tree_select;
		} else {
			return array();
		}
	}
}