<?php
/**
* @author:  Bunzia Alexander <nifus@mail.ru> <http://www.weblancer.net/users/nifus/>
* @copyright: Copyright (c) 2010, Bunzia Alexander
* @version: 1.0
* @license: http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @package: HiLo CMS
*/


include_once(MAIN_SOURCE_PATH.'/modules/admin/lang/'.MAIN_LANG.'/lang.php');

	//	класс для формирования зароса
class m_query extends query{

	
	public function __construct($alias){
		$this -> set_table( MAIN_MODULES_TBL );
		$this -> set_alias($alias);
		return true;
	}
	
	public function include_pages($alias,$cols=''){
		$this -> include_table(MAIN_PAGES_TBL,$alias,'m_id',$cols );
		return true;
	}
	
	public function where_id($id){
		$id = intval($id);
		if ( empty($id) ){
			return false;
		}
		return $this -> set_where( $this -> alias.'.m_id',$id);
	}
	
	public function where_active($id){
		$id = intval($id);
		if ( empty($id) ){
			return false;
		}
		return $this -> set_where( $this -> alias.'.m_status',$id);
	}
	
	public function where_path($path){
		if ( !modules::is_path($path) ){
			return false;
		}
		return $this -> set_where( $this -> alias.'.m_path',$path);
	}
	
	/**
  * Сортируем модули 
  * 
  * @var: str $v ASC/DESC
  * @return: bool
  */
	public function orderby_pos($v){
		return 	$this -> set_orderby($this -> alias.'.m_pos',$v);
	}
	
 
/****************
*	функции-обработчики алиасов при выборе из таблицы
******************/
	
	/*
	
	public function count_blocks($id){
	global $MAIN_DB;
		$sql = "SELECT COUNT(*) FROM ".MAIN_PLB_TBL." WHERE f_id='$id'";
		list($count) = $MAIN_DB -> fetch_array( $MAIN_DB -> query($sql) );
		return $count;
	}
	
	*/
}



class modules{
	
	public $debug = false;
	private $info = array();
	private $main_key = false;
	private $last_error=false;
	private $set_info = array();

	private function __construct( $array ){
		$this -> info = $array;
		$this -> main_key = $array['m_id'];
	}
	
			//	загрузка модуля по его id
	static function load_id($id){
		$m = new m_query('m');
		if ( !$m -> where_id($id) ){
			return false;
		}
		$m -> get('*');
		if (  $m -> get_count_rows()==0 ){
			return FALSE;
		}
		return new modules($m -> row());
	}
	
	static function load_path($id){
		$m = new m_query('m');
		if ( !$m -> where_path($id) ){
			return false;
		}
		$m -> get('*');
		if (  $m -> get_count_rows()==0 ){
			return FALSE;
		}
		return new modules($m -> row());
	}
	
	static function create(){
		return new modules( array('m_id'=>0) );
	}
	
	public function update(){
	global $MAIN_DB;

		if ( false===$this -> main_key ){
			$this -> make_error(ERROR_500,A_EMPTY_ID);
		}
		if ( !empty($this -> error) ){
			return $this -> error;
		}
		if ( sizeof($this -> set_info)==0 ){
			$this -> make_error(ERROR_500,A_EMPTY_ARRAY);
		}
		$sql = array();
		foreach( $this -> set_info as $k=>$v ){
			$sql[]="`$k`='".sys_in_sql($v)."'";
		}
		$sql = "
			UPDATE ".$MAIN_DB -> prefix("system_modules")." 
			SET ".implode(',',$sql)." 
			WHERE m_id='".$this -> main_key."'";
		if ( !empty($this -> debug) ){
			die($sql);
		}
		$MAIN_DB -> query($sql);
		return true;
	}
	
	public function insert(){
	global $MAIN_DB;
			//	при инициализации значений произошла ошибка
		if ( false!==$this -> error() ){
			return $this -> error();
		}
		if ( sizeof($this -> set_info)==0 ){
			$this -> make_error(ERROR_500,A_EMPTY_ARRAY);
		}
			//	так как запись новая, нужно проверить уникальные ключи на повторение
		if ( modules::exists_module($this -> set_info['m_path']) ){
			$this -> make_error(ERROR_MESSAGE, sprintf(A_EXISTS_MODULE,$this -> set_info['m_path']));
			return false;
		} 
		
		$sql = array();
		foreach( $this -> set_info as $k=>$v ){
			$sql[]="`$k`='".sys_in_sql($v)."'";
		}
		$sql = "INSERT INTO ".$MAIN_DB -> prefix("system_modules")." SET ".implode(',',$sql)."";
		
		
		if ( !empty($this -> debug) ){
			die($sql);
		}
		$MAIN_DB -> query($sql);
		return $MAIN_DB -> insert_id();
	}
	
		//	удаление объекта лучше делать частью объекта
	public function delete(){
	global $MAIN_DB;
		$id = $this -> id();
		if ( empty($id) ){
			$this -> make_error(ERROR_500,A_EMPTY_ID);
		}
		include_once(MAIN_SOURCE_PATH.'/modules/admin/inc/class.pages.php');
		$p = new pagesQuery('f');
		$p -> where_mid($id);
		$p -> get('f.f_id');
		while( list($f_id) = $p -> row() ){
			
			$page = pages::load_id($f_id);
			
			if ( false===$page ){
				die('continue');
			}
			$page -> delete();
		}
		
		$sql = "DELETE FROM ".$MAIN_DB -> prefix("system_modules")." WHERE m_id='$id'";
		$MAIN_DB -> query($sql);
		return true;
	}
	
	
	public function get($k){
		if ( isset($this -> info[$k]) ){
			return $this -> info[$k];
		} 
		$this -> make_error(ERROR_500, sprintf(A_NOT_VAR,$k) );
	}
	
	public function set($k,$v){
		if ( method_exists($this,'set_'.$k) ){
			$f = 'set_'.$k;
			return $this -> $f($v);
		}
		$this -> set_info[$k] = $v;
		return true;
	}
	


/***************************	
*	SET - функции. Это уникальные обработчики для значений заносимых в базу данных
***********************/
	public function set_m_name($v){
		if ( empty($v) ){
			$this -> make_error(ERROR_MESSAGE,'Ошибка: название модуля не указано');
			return false;
		}
		$this -> set_info['m_name']=$v;
		return true;
	}
	
	public function set_m_path($v){
		if ( empty($v) ){
			$this -> make_error(ERROR_MESSAGE,'Ошибка: адрес модуля не указан');
			return false;
		}
		$this -> set_info['m_path']=$v;
		return true;
	}
	

	
	
/***************************
*	GET
****************************/
	
	public function id(){
		return $this -> info['m_id']; 
	}
	public function path(){
		return $this -> info['m_path']; 
	}
	public function name(){
		return $this -> info['m_name']; 
	}
	
/****************************	
*		СТАТИЧНЫЕ ФУНКЦИИ ОТНОСЯЩИЕСЯ К МОДУЛЮ
*******************************/

		//	проверяем название каталога для модуля
	static function is_path($p){
		if ( empty($p) ){
			return false;
		}
		if ( preg_match('#[^a-z_0-9]#i',$p) ){
			return false;
		}
		return true;
	}
	

	
	static function exists_module($v){
		$u = new m_query('m');
		$u -> where_path($v);
		//$u -> set_debug(1);
		$u -> get('COUNT(*)');
		list($count) = $u -> row();
		if ( $count>0 ){
			return true;
		}
		return false;
	}
	
	protected function make_error($type,$msg){
		switch($type){
		
			case(ERROR_MESSAGE):
				$this -> last_error = $msg;
				break;
		}
	}
	
	public function error(){
  		return $this -> last_error;
	}
	
	
		//	модуль поддерживает или нет работу с комментариями
	public function exists_comments(){
		$path = $this -> path();
		if ( !file_exists(MAIN_SOURCE_PATH.'/modules/'.$path.'/inc/class.comments.php') ){
			return false;
		}
		return true;
	}
	
	
	/*************
	*	Это список модулей, которые будут пользоваться общей таблицей категорий
	*	Какой-то механизм внедрять смысла нет, по-этому здесь просто централизованное хранилище
	*
	*	@project 	poremontu
	*	@return		array
	*
	***********/
	static function use_category(){
		return array('news','articles','blogs','faq','gallery');
	}
	  
	/**
	* получаем список модулей
	*
	*/
	static function list_active(){
	
	  $modules = array();
	  $m = new m_query('m');
	  $m -> where_active(1);
	  $m -> get('m_path');
	  while( list($m_path) = $m -> row() ){
	    $modules[]=$m_path;
	  }
		return $modules;
	}
	
	
	
	
	
	
}

?>
