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



/**
* admin_pages 
* 
* Управление страницами
*/
class admin_pages{
	private $error = false;
	private $act = 'index';
	private $JsHttpRequest = false;
	
	public function __construct(){
	global $MAIN_PAGE;
		define('M_PATH',MAIN_SOURCE_PATH.'/modules/'.$MAIN_PAGE -> dirname() );
		define('M_URL',MAIN_SOURCE_URL.'/modules/'.$MAIN_PAGE -> dirname() );
		define('A_CHARSET', $MAIN_PAGE -> charset() );
		include_once(M_PATH.'/inc/url.php');
		include_once(M_PATH.'/lang/ru/lang.php');
		include_once(M_PATH.'/inc/class.pages.php');
		include_once(M_PATH.'/inc/class.modules.php');
		include_once(M_PATH.'/inc/class.blocks.php');
		include_once(MAIN_SOURCE_PATH.'/inc/class.html.php');
		include(MAIN_SOURCE_PATH.'/ext/ajax/JsHttpRequest.php');
		$this -> JsHttpRequest = new JsHttpRequest( A_CHARSET );
		$this -> act = !empty($_REQUEST['act']) ? $_REQUEST['act'] : $this -> act;
		$GLOBALS['_RESULT']['id_request'] = !empty($_REQUEST['id_request']) ? $_REQUEST['id_request'] : 0;
		admin_pages::inc_check_new_modules();		//	проверка новых модулей
	}
	
	public function get(){
		//sleep(2);
		$func = $this -> act;
		if ( !method_exists($this ,$func) ){
			sys_error(ERROR_404);
		}
		return $this -> $func();
	}
	
	
	
		//	главная, формирует список страниц
	private function index(){
		$t = new PHPTAL( M_PATH.'/tmpl/control_pages/main.html' );
		$p = new pagesQuery('f');
		$p -> include_modules('m','m.*');
		$p -> include_tmpl('t','t.*');
		$p -> where_main_rows();
		$p -> orderby_mid('ASC');
		$p -> orderby_active('ASC');
		//$p -> set_debug(1);
		$p -> get('
			f.f_id,f.f_name,
			f.f_meta_title,
			f.f_active,f.f_id AS count_blocks,
			f.f_id AS blocks_url,
			f.f_id as lang_links'
		,false);
		$modules= array();
		while( $row = $p -> row() ){
			if ( !isset($modules[$row['m_id']]) ){
				$modules[$row['m_id']] = arr_to_obj($row);
			}
			$modules[$row['m_id']] -> pages[$row['f_id']]=arr_to_obj($row);
		}		
		$t -> modules = $modules;
		
				  //  список модулей
		include_once(MAIN_SOURCE_PATH.'/modules/admin/inc/class.module.php');
		$s = new select_box();
	  $s -> empty_record(true,0);
	  $m = new m_query('m');
	  $m -> where_active(1);
	  $m -> get('m_path,m_name');
	  while( $row = $m -> row() ){
		  $s -> set($row['m_path'],$row['m_name']);
		}		
		$t -> module_list = $s -> get();
		return $t -> execute();
	}
	
	
		
	
		/*		AJAX	*/
		
		
	
		//	перезагружаем таблицу со списком страниц, согласно правилам сортировки и фильтрации
	private function ajax_reload(){
		sys_block_disable();
			//	макрос таблицы
		$t = new PHPTAL( M_PATH.'/tmpl/control_pages/inc/page_row.html' );
			//	выполнять макрос
		$t -> execute = true;
			//	выбираем страницы
		$p = new pagesQuery('f');
		$p -> include_tmpl('t','t.*');
		$p -> include_modules('m','m.*');
		$p -> orderby_mid('ASC');
		$p -> where_mpath($_POST['filter_module']);
		$p -> where_main_rows();
			//	сортировка указанная пользователем
		if ( !empty($_REQUEST['orderby_key']) ){
			$p -> $_REQUEST['orderby_key']( $_REQUEST['orderby_value']);
		}else{
			$p -> orderby_active('ASC');
		}
		$p -> get('
			f.f_id,f.f_name,
			f.f_meta_title,
			f.f_active,f.f_id AS count_blocks,
			f.f_id AS blocks_url,
			f.f_id as lang_links'
		,false);
		$modules= array();
		while( $row = $p -> row() ){
			if ( !isset($modules[$row['m_id']]) ){
				$modules[$row['m_id']] = arr_to_obj($row);
			}
			$modules[$row['m_id']] -> pages[$row['f_id']]=arr_to_obj($row);
		}		
		$t -> modules = $modules;
		$GLOBALS['_RESULT']['content'] = $t -> execute();
		exit();
	}
	

		
  /**
  * Обновляем страницу id
  *
  */
  private function ajax_update(){
    sys_block_disable();
    
      // загружаем модуль из базы
    $m = modules::load_id($_REQUEST['id']);
    if ( false===$m ){
      sys_error(ERROR_501,A_EMPTY_ID);
    }
    if ( !file_exists(MAIN_SOURCE_PATH.'/modules/'.$m -> path().'/info.php') ){
      sys_error(ERROR_501,A_NOT_FOUND_FILE);
    }
    include_once(MAIN_SOURCE_PATH.'/modules/'.$m -> path().'/lang/'.MAIN_LANG.'/lang.php');
    include_once(MAIN_SOURCE_PATH.'/modules/'.$m -> path().'/info.php');
    if ( !is_array($m_info) || sizeof($m_info)==0 ){
      sys_error(ERROR_501,M_ADMIN_BAD_INFO_FILE);
    }
      // обновляем имя
    $m -> set('m_name',$m_info['name']);
    if ( !$m -> update() ){
      sys_error(ERROR_501,$m -> error() );
    }
      //  выполняем установку
      
    include_once( MAIN_SOURCE_PATH.'/modules/'.$m -> path().'/inc/system.php');
    $f = $m -> path().'_setup';
    if ( function_exists($f) ){
    
      if (false===$f() )
      {
        sys_error(ERROR_501, 'ошибка установки модуля ');
      }
    }
    
    $setup_pages = array();
      // перебираем страницы
    foreach( $m_info['page'] as $k=>$v ){
        // загружаем страницу $k
      $p = pages::load_pname($k);
        // если страницы нет, то вставляем новую страницу
      if ( false===$p){
        $p = pages::create();
        $p -> set('f_active',1);
        $p -> set('f_name',$v);
        $p -> set('p_name',$k);
        $p -> set('m_dirname',$m -> path());
        $p -> set('m_id',$m -> id() );
        $p -> set('f_func',$k);
        $p -> set('lang',MAIN_LANG);
        $p_id = $p -> insert();
        if ( false===$p_id ){
          sys_error(ERROR_501, $p -> error() );
        }
        $p -> set('link_id',$p_id);
        $p -> update();
        pages::add_langs($p_id);
       
        
        $setup_pages[]=$k;
      }else{
          // обновляем старую страницу
        $p -> set('f_name',$v);
        $p -> set('p_name',$k);
        $p -> set('m_dirname',$m -> path());
        $p -> set('m_id',$m -> id() );
        $p -> set('f_func',$k);
        $p_id = $p -> update();
        if ( false===$p_id ){
           sys_error(ERROR_501, $p -> error() );
        }
        pages::add_langs($p_id);
        $setup_pages[]=$k;
      }
    }
    unset($p);
      //  полчим список страниц модуля id
    $pages = new pagesQuery('p');
    $pages -> where_mid($_REQUEST['id']);
    $pages -> get('f_id,p_name');
    while( $row = $pages -> row() ){
         // страница присутствует в обновлённом модуле, значит пропускаем её 
      if ( in_array($row['p_name'],$setup_pages) ){
        continue;
      }
      $row['obj_page'] = pages::load_id($row['f_id']) ;
      if ( false===$row['obj_page'] ){
          sys_error(ERROR_501,$row['obj_page'] -> error() );
      }
        //  удаляем страницу
      $row['obj_page'] -> delete();
    }
    
   
      // пишем в базу блоки модуля
    $setup_blocks = array();
    foreach( $m_info['block'] as $block ){
      $b = blocks::query('b');
      $b -> where_parser_name($block['parser_name']);
      $b -> where_path( $m -> path() );
        // $b -> set_debug(1);
      if ( !$b -> get('COUNT(*)',false) ){
        die( $b -> error() );
      }
      list($count) = $b -> row();
      if ( $count>0 ){
        $setup_blocks[]=$block['parser_name'];
        continue;	
      }
      $p =  blocks::create();
      $p -> set('b_name',$block['name']);
      $p -> set('m_path',$m -> path() );
      $p -> set('b_func',$block['file']);
      $p -> set('b_parser_name',$block['parser_name']);
      //$p -> set_debug(1);
      if ( !$p -> insert() ){
        sys_error( ERROR_500, $p -> error() );
      }
      $setup_blocks[]=$block['parser_name'];
    }
      // удаляем блоки которые остались за бортом
    $b = blocks::query('b');
    $b -> where_path( $m -> path() );
    $b -> get('b.b_id,b.b_parser_name',false);
    while( list($b_id,$b_parser_name) = $b -> row() ){
      if ( in_array($b_parser_name,$setup_blocks) ){
          //  пропускаем блоки, которые только что были установленны
        continue;
      }
      $bl = blocks::load_id($b_id) ;
      if ( false===$bl ){
          sys_error(ERROR_500,$bl -> error() );
      }
      $bl -> delete();
    }
    
      //  удалим все старые плагины
    include_once(M_PATH.'/inc/class.plugins.php');
    $p = new pluginsQuery('p');
    $p -> where_module( $m -> path() );
    $p -> get('plugin_id,name');
    while( $row = $p -> row() ){
      if ( empty($m_info['plugin'][ $row['name'] ]) ){
        $p = plugins::load_id( $row['plugin_id']);
        $p -> delete();
      }
    }
      //  обнови и добавим новые
    foreach( $m_info['plugin'] as $pl_name => $pl_desc ){
      
      $p = new pluginsQuery('p');
      $p -> where_name($pl_name);
      $p -> where_module( $m -> path() );
      $p -> get('plugin_id');
      if ( $p -> get_count_rows()>0 ){
        
        //  обновляем старый плагин
        list($plugin_id) = $p -> row();
        $pl = plugins::load_id($plugin_id);
        $pl -> set('desc',$pl_desc);
        $pl -> update();
      }else{
        //  добавляем новый плагин
         $pl = plugins::create();
         $pl -> set('desc',$pl_desc);
         $pl -> set('name',$pl_name);
         $pl -> set('path',$m -> path() );
         $pl -> insert();
      }
    }
    exit();
  }
	
	/**
  * удаляем модуль id
  */
	private function ajax_delete(){
		sys_block_disable();
		$m = modules::load_id($_REQUEST['id']);
		if ( false===$m ){
			sys_error(ERROR_501, A_EMPTY_ID );
		}
		$m -> delete();
		exit();
	}
	
	/**
  * удаляем страницу id
  */
	private function ajax_delete_page(){
		sys_block_disable();
		$m = pages::load_id($_REQUEST['id']);
		if ( false===$m ){
			sys_error(ERROR_501, A_EMPTY_ID );
		}
		$m -> delete();
		exit();
	}	
	
	
		//	форма редактирвоания странички
	private function ajax_edit(){
		sys_block_disable();
		
		$p = new pagesQuery('f');
		$p -> where_id($_GET['id']);
		if ( !$p -> get('*,f_id AS group_list,t_id as tmpl_list') ){
			die( $p -> get_error() );
		}

			//	формируем страницу
		$t = new PHPTAL( M_PATH.'/tmpl/control_pages/form.html' );
		$t -> page = $p ->  row();
		$t -> lang_edit = false;  // редактируем ключевую запись
		$t -> link_id =$_GET['id'];
		$t -> lang = !empty($_GET['lang']) ? $_GET['lang'] : MAIN_LANG;
		echo '<?xml version="1.0" encoding="UTF-8"?><body><title>Редактировать</title><content><![CDATA['.$t -> execute().']]></content></body>';
		
		//$GLOBALS['_RESULT']['content'] =  $t -> execute();
		//$GLOBALS['_RESULT']['title'] = 'Редактировать страницу';
		exit();
	}
	
	private function ajax_lang_edit(){
		sys_block_disable();
		$t = new PHPTAL( M_PATH.'/tmpl/control_pages/form.html' );
		$t -> lang_edit = true;  // редактируем ключевую запись
		$p = new pagesQuery('p');
		//$p -> set_debug(1);
		$p -> where_link($_GET['id']);
		$p -> where_lang($_GET['lang']);
		$p -> get('*, f_id AS group_list,t_id as tmpl_list');
	  $row = $p ->  row();
		
		$t -> page = $row;
		$t -> lang = !empty($_GET['lang']) ? $_GET['lang'] : MAIN_LANG;
		$t -> link_id = $_GET['id'];
		
		
		echo '<?xml version="1.0" encoding="UTF-8"?><body><title>'.M_ADMIN_SP_ADD_EDIT_PAGE.'</title><content><![CDATA['.$t -> execute().']]></content></body>';
		exit();
	}
	
	
		//	сохранение формы редактирования странички $_REQUEST['id']
	private function ajax_save(){
		sys_block_disable();
			//	загружаем из базы страничку $_REQUEST['f_id']
		$p = pages::load_id($_POST['f_id']);
		//$p -> set_debug(1);
		if ( false===$p ){
			die( A_EMPTY_ID );
		}
		
			//	обновляем её
		foreach( $_POST['form'] as $k=>$v ){
		  $p -> set($k,$v);
		}
    $id = $p -> update();
	
			//	обновляем права доступа к страничке
		$p -> set_group($_POST['groups']);
		
			//	обновляем морду
		$GLOBALS['_RESULT']['msg'] = 'Изменения сохранены';
	
		exit();
	}
	
	/**
	* выдаёт информацию о странице
	*
	*/
  private function ajax_info(){
	  $p = new pagesQuery('q');
	 //$p -> set_debug(1);
		if (false===$p -> where_pname($_GET['page']) ){
      sys_error(ERROR_500,'Ошибка: нет страницы "'.$_GET['page'].'"');
    }
	  $p -> include_tmpl('t','t.t_name');
		$p -> get('q.*,q.t_id as count_blocks');
		$row = $p -> row();
		
		$t = new PHPTAL(  );
		$t -> setSnippet('admin','ajax_info');
		$t -> row =$row;
	  $GLOBALS['_RESULT']['content'] =  $t -> execute();
		$GLOBALS['_RESULT']['title'] = 'Информация о странице';
		exit();
	}
	
	/**
	* редактирует шаблон
	*
	*/
  private function ajax_tmpl(){
	  $p = new pagesQuery('q');
		$p -> where_pname($_GET['page']);
	  $p -> include_tmpl('t','t.t_id,t.t_content');
		$p -> get(false);
		$row = $p -> row();
		$t = new PHPTAL(  );
		$t -> setSnippet('admin','ajax_tmpl');
		$t -> row =$row;
	  $GLOBALS['_RESULT']['content'] =  $t -> execute();
		$GLOBALS['_RESULT']['title'] = 'Шаблон';
		exit();
	}
	
		/**
	* редактирует шаблон
	*
	*/
  private function ajax_tmpl_save(){
    include_once(M_PATH.'/inc/class.tmpl.php');
	  $p = tmpl::load_id($_POST['t_id']);
	  $p -> set('t_content',$_POST['tmpl']);
	  $p -> update();
	  /*$p = new pagesQuery('q');
		$p -> where_pname($_GET['page']);
	  $p -> include_tmpl('t','t.t_path');
		$p -> get(false);
		$row = $p -> row();
		
	  file_put_contents(MAIN_SOURCE_PATH.'/tmpl/'.$row['t_path'],$_POST['tmpl'] );
	 */
		exit();
	}
	/************************/
	
	
	
	
	
		//	проверяем, нет ли новых модулей. Если есть, то заносим их в базу	
	private function inc_check_new_modules(){
	global $MAIN_DB;
		if ( !$handle = opendir(MAIN_SOURCE_PATH.'/modules') ) {
			return false;
		}
			// перебираем всё в папке modules	
		while (false !== ($path = readdir($handle) ) ) {
      //	ищем модуль path в базе данных
      $m = new m_query('m');
      if ( !$m -> where_path($path) ){
				continue;
			}
			//$m -> set_debug(1);
      $m -> get('COUNT(*)');
      list($exists) = $m -> row();
      if ( !empty($exists) ){
				continue;
			}
			
			if ( !file_exists(MAIN_SOURCE_PATH.'/modules/'.$path.'/info.php') ){
				continue;
			}
			
			include_once(MAIN_SOURCE_PATH.'/modules/'.$path.'/lang/'.MAIN_LANG.'/lang.php');
			include_once(MAIN_SOURCE_PATH.'/modules/'.$path.'/info.php');
			
			if ( !is_array($m_info) || sizeof($m_info)==0 ){
				continue;
			}
				//	пишем  в базу новый модуль
			$m = modules::create( );
			$m -> set('m_status',1);
			$m -> set('m_name',$m_info['name']);
			$m -> set('m_path',$path);
			  //  ставим модуль в конец списка
			$mq = new m_query('m');
		  $mq -> get(' MAX(m_pos) ');
		  list($max_pos) = $mq -> row();
		  $max_pos++;
		  $m -> set('m_pos',$max_pos);
			//$m -> set_debug(1);
			$m_id = $m -> insert();
			if ( false===$m_id ){
				return false;
			}
			
				//	пишем в базу страницы модуля
			foreach( $m_info['page'] as $page => $name ){
				$p = pages::create();
				$p -> set('f_name',$name);
				$p -> set('p_name',$page);
				$p -> set('m_dirname',$path);
				$p -> set('m_id',$m_id);
				$p -> set('f_func',$page);
        $id = $p -> insert();
				//$p -> set_debug(1);
			  $p -> set('link_id',$id);
				$p -> update();
				
			}
					//	пишем в базу блоки модуля
			foreach( $m_info['block'] as $block ){
				$p =  blocks::create();
				$p -> set('b_name',$block['name']);
				$p -> set('m_path',$path);
				$p -> set('b_func',$block['file']);
				$p -> set('b_parser_name',$block['parser_name']);
				//$p -> set_debug(1);
				if ( !$p -> insert() ){
					sys_error( '500', $p -> error() );
				}
			}
			
   		}
   		return true;
	}
	

}

?>
