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

class htmlControl
{
	
	static function orderBy($key)
	{
		return '<img onclick="HL.controls.table.orderBy(this,\''.$key.'\')" class="asc" /> ';
	} 
}

class tableHtml
{
	private $header = array();
	private $content = array();
	private $footer = array();

	private $rows = array();

	private $cols = array();
	private $cols_keys = array();
	
	private $count_rows = 0;
	private $cols_link = false;
	private $result = '';
	function __constract($type)
	{
		global $MAIN_PAGE;	
	}

	public function loadCss($file)
	{
	global $MAIN_PAGE;
		$MAIN_PAGE -> set_css($file);
	}

	public function loadJs($file)
	{
	global $MAIN_PAGE;
		$MAIN_PAGE -> set_js($file);
	}	


	/**
	*	 Задаём один заголовок таблицы
	*
	*/
	public function cols($title,$key,$html=false)
	{
		if ( false===$this -> cols_link )
		{
			$this -> cols_link = sizeof($this -> header);	//	делаем ссылку на заголовок
			$this -> header[]=array('cols'=> true);
		}
		$this -> cols[]=array('title'=>$title,'html'=>$html,'cols'=>sizeof($key));
		$this -> cols_keys = array_merge($this -> cols_keys,$key);
		return true;
	}
	public function addPanel( $content )
	{
		$this -> rows[]=array('panel'=>true, 'html'=>$content);
		return true;
	}

	public function row( $row )
	{
		if ( false===$this -> data_link )
		{
			$this -> data_link = sizeof($this -> rows);	//	делаем ссылку на заголовок
		}
		$result = '<tr>';
		foreach( $this -> cols_keys as $k )
		{
			if ( false===isset($row[$k]) )
			{
				throw new Exception('Ошибка: не найден ключ '.$k);
			}
			$result .= '<td class="'.$k.'" >'.$row[$k].'</td>';
		}

		$this -> rows[]=array('row'=>true,'html'=>$result.'</tr>');
		return true;
	}

	
	public function rows( $rows,$filter = array() )
	{


	/*	foreach( $rows as $row )
		{
			$this -> rows[]=array('html'=>$row);
		}
		return true;*/
	}

	

	public function addBlock( $content )
	{
		return '<div style="float:left">'.$content.'</div>';
	}

	public function show( )
	{
		$result= '<table border="1" class="data" width="100%" align="left" id="table">';
		
			for($i=0;$i<sizeof($this -> rows);$i++)
			{
				if( $this -> rows[$i]['cols']===true )
				{
					$result.='<tr class="header">';
					for($j=0;$j<sizeof($this -> cols);$j++)
					{
						$cols = ($this -> cols[$j]['cols'] ==1) ? '' : 'colspan="'.$this -> cols[$j]['cols'].'"';
						$result.='<td '.$cols.'>'.$this -> cols[$j]['html'].' '.$this -> cols[$j]['title'].'</td>';

					}
					$result.='</tr>';
				}
				elseif( $this -> rows[$i]['row']===true)
				{
					if( $i==$this -> data_link )
					{
						$result.='<tbody id="table_content">';
					}
					$result.=$this -> rows[$i];
				}
				$result.='</tbody>';

			}
		
		$result.= '</table>';
		return $result;
	}


}



/**
*	Класс генерации контрола ввода текста
*
*/
class inputHtml
{
	private $attributes = array();
	private $check 		= array();
	public function __construct($v = '')
	{
		$this -> attributes['name'] = $v;
		return $this;
	}

	public function setName($v)
	{
		if ( empty($v) )
		{
			throw new Exception('Ошибка: нужно задать поле "name" для контрола input!');
		}
		$this -> attributes['name'] = $v;
		return $this;
	}

	public function setValue($v)
	{
		$this -> attributes['value'] = $v;
		return $this;
	}

	public function setCheck($user_func)
	{
		/*$this -> attributes['value'] = $v;
		return $this;*/
	}

	public function setCheckNum($min,$max)
	{
		$this -> check['num'] = '#[0-9]{'.$min.','.$max.'}#';
		return $this;
	}

	public function show()
	{
		return '<input type="text" check="true" check_num="[0-9]" check_user="" value="" />';
	}
}

/**
* Класс генерации сложных html объектов
*
*/
class html_control
{

  /**
  * JS календарь
  *
  *
  */
	static function calendar($edit_name,$format='%d.%m.%Y'){
	global $TMPL,$MAIN_PAGE;
		include_once(MAIN_SOURCE_PATH.'/ext/jscalendar/calendar.php');
		$calendar = new DHTML_Calendar(MAIN_SOURCE_URL.'/ext/jscalendar/', 'en', 'calendar-win2k-2', false);
		$MAIN_PAGE -> set_js( $calendar->calendar_lib_path . $calendar->calendar_file);
		$MAIN_PAGE -> set_js( $calendar->calendar_lib_path . $calendar->calendar_lang_file);
		$MAIN_PAGE -> set_js( $calendar->calendar_lib_path . $calendar->calendar_setup_file);
		$MAIN_PAGE -> set_css( $calendar->calendar_lib_path . $calendar->calendar_theme_file);		   
		return '<a class="js" id="calendar">указать</a>
			<script type="text/javascript">
			
		    Calendar.setup({
		        inputField     :    "'.$edit_name.'",     // id of the input field
		        ifFormat       :    "'.$format.'",      // format of the input field
		        button         :    "calendar",  // trigger for the calendar (button ID)
		        align          :    "Tl",           // alignment (defaults to "Bl")
		        singleClick    :    true
		    });
			</script>';
	}
		
	
	
	/**
	* функция загрузки html редактора 
	*
	*	@var: str $name  название редактора, по совместительству имя файла в директории /inc/editors
	*	@return:	object объект-прослойка предоставляющий стандартный интерфейс для работы с редактором
	*/
	static function editor($name,$path='')
	{
		if ( empty($path) ){
			$path = MAIN_SOURCE_PATH.'/inc/editors';
		}
			//	название редактора 
		if ( empty($name) ){
			 sys_error(ERROR_500,E_HTML_EDIT_EMPTY);
		}
			//	существование класса
		if ( !file_exists($path."/class.$name.php") ){
			 sys_error(ERROR_500, sprintf(E_HTML_EDIT_NOTFOUND,$name) );
		}
		include_once($path."/class.$name.php");
			//	название класса должно совпадать с его именем
		$e =  new $name;
		return $e;
	}
	


}


	//	---	класс для построения простых выпадающих списков
class select_box{
	
		private $selected_id = "0";	//	---	выбраный индекс
		private $block_id = array();//	---	ветки которые блокируются
		private $options = array();
		private $select_box = '';
		private $empty_record_flag = true;
		private $empty_record_num = 0;
		private $empty_record_value = '---';
		private $multi_select = false;
	
		
	
			//	---	данная ветка выводится в списке не будет
		public	function set_block_id( $id ){
			if ( empty($id) ){
				return false;
			}
			array_push($this -> block_id, $id );
			false;
		}
	
	 public function block_id( $id ){
	    return $this -> set_block_id($id);
	  }
	
		public	function selected_id( $id ){
			if ( empty($id) ){
				return false;
			}
			if ( is_array($id) ){
				$this -> multi_select = true;
				$this -> selected_id = $id;
			}else{
				$this -> selected_id = (string)$id;
			}
		return false;
		}
	
		public function opt_open($value){
			$this -> select_box .='<optgroup label="'.$value.'"> ';
		}
	
		public function opt_close(){
			$this -> select_box .='</optgroup> ';
		}
	
		public function set($key,$value){
			if ( $this -> multi_select ){
				$selected = ( in_array($key,$this -> selected_id) )	?	'selected'	:	'';
			}else{
				$selected = ($key==$this -> selected_id)	?	'selected'	:	'';
			}
			$disabled = ( in_array($key,$this -> block_id) )	?	'disabled'	:	'';
			$this -> select_box .='<option  '.$disabled.' '.$selected.' value="'.$key.'">'.sys_in_html($value);
	}
	
		public function empty_record($flag=true,$num=0,$value = '---'){
			$this -> empty_record_flag = $flag;
			$this -> empty_record_num = $num;
			$this -> empty_record_value = $value;
		}
	
			//	---	загрузка списка начиная  с  $c_id в выпадающий список
		public function get(){
			$begin = !empty($this -> empty_record_flag)	?	'<option value="'.$this -> empty_record_num.'">'.$this -> empty_record_value	:	'';
			$this -> select_box = $begin.$this -> select_box;
		return $this -> select_box;
		}
	
}
	
	
/**
* класс для построения checkbox списков
*

class checked_box{
	
		private $selected_id = "0";	
		private $options = array();
		private $select_box = '';
		private $empty_record_flag = true;
		private $empty_record_num = 0;
		private $empty_record_value = '---';
		private $multi_select = false;
	  private $items=array();
	  
		
	  
	  public function __set($k,$v){
	    $this -> items[$k] =$v;
	  }
	
		public	function selected_id( $id ){
			if ( empty($id) ){
				return false;
			}
			if ( is_array($id) ){
				$this -> multi_select = true;
				$this -> selected_id = $id;
			}else{
				$this -> selected_id = $id;
			}
		return false;
		}
	
		
	
		public function set($key,$value){
		  $items = '';
		  foreach(  $items as $k =>$v ){
		    $items .= "$k = \"$v\"";
		  }
			if ( $this -> multi_select ){
				$checked = ( in_array($key,$this -> selected_id) )	?	'checked="checked"'	:	'';
			}else{
				$checked = ($key==$this -> selected_id)	?	'checked="checked"'	:	'';
			}
			
			$this -> checked_box .='<li><input type="checkbox" '.$items.' '.$checked.' name="'.($key).'" />&nbsp;'.($value).'</li>';
	}
	
		

		public function get(){
		  return '<ul>'.$this -> checked_box.'</ul>';
		}
	
}
	*/	
	
class editor{
	
	//protected  $name = false;
	//protected $value = '';
	//private $editor = false;
	
	
	static function load($name){
		
		if ( empty($name) ){
			editor::make_error(ERROR_500,'1024:empty editor var');
		}
		if ( !file_exists(MAIN_SOURCE_PATH."/inc/editors/class.$name.php") ){
			editor::make_error(ERROR_500,"1024: no file '$name' editor var");
		}
		include_once(MAIN_SOURCE_PATH."/inc/editors/class.$name.php");
		if  ( !method_exists($name,'show')  ){
			editor::make_error(ERROR_500,"1024: bad class '$name' editor");
		}
		
		
		$e =  new $name;
		return $e;
	}
		//	вызываем дочерний метод 
	public function show(){
		
		return $this -> show('');
	}
}


	//	загрузка изображений
	
class upload_img{
		//	список уже загруженных имён файлов
	private $files = array();
		//	папка в которую грузим
	private $path = false;
		//	будущее название объекта js
	private $name = 'img';
	
	
	
		//	параметры кропа
	private $crop_width = 0;
	private $crop_height = 0;
	private $crop = false;
	
		//	задаём имя контрола загружающего файлы
	public function __construct($v){
		$this -> name = $v;
	}
		//	указываем размеры кропаи путь к нему
	function set_crop($x,$y){
		$this -> crop_width = $x;
		$this -> crop_height = $y;
		$this -> crop = true;
	}
	
		//	 указываем  имя загруженного файла
	function set_file($v){
		if ( empty($v) ){
			return false;
		}
		$vs = explode('|',$v);
		if ( sizeof($vs)>1 )
		{
		  foreach( $vs as $v )
		  {
		    $this ->  set_file($v);
      }
      return TRUE;
		}
	  $this -> files[]=$v;
	 	return TRUE;
	}
	
		//	путь до папки в которую будут загружаться изображения или путь туда, где они уже лежат
	function set_path($path){
		if ( empty($path) ){
			return false;
		}
	   $this -> path=$path;
	   return true;
	}
	
	function set_base($path){
		if ( empty($path) ){
			return false;
		}
	   $this -> base=$path;
	   return true;
	}
	
		//	подключаем файлы
	static  function include_files(){
	global $MAIN_PAGE;
		$MAIN_PAGE -> set_js(MAIN_SOURCE_URL.'/tmpl/default/js/upload.js');
		//$MAIN_PAGE -> set_js(MAIN_SOURCE_URL.'/ext/ajax/JsHttpRequest.js');
	}
	
		//	генеруем js код
	public function get($conteiner,$count_files,$output){
		if ( empty($this -> path) || empty($conteiner) || empty($count_files) || empty($output) ){
			sys_error(ERROR_500);
		}
			//	мда, обжогся я на этом
		if ( $output==$this -> name ){
			sys_error(ERROR_500);
		}
		
		upload_img::include_files();
		$name = sys_str_rand(2);
		$MAIN_SOURCE_URL  = MAIN_SOURCE_URL;
		$onclick = "
			{$this -> name} = new upload_img('$conteiner','".MAIN_URL."');
			//{$this -> name}.set_id(this.id);
			{$this -> name}.max_files = $count_files;
			{$this -> name}.path = '{$this -> path}';
			{$this -> name}.base = '{$this -> base}';
			{$this -> name}.output = '$output';
			
			";
		if ( $this -> crop ){
			$onclick .= $this -> name.".set_crop(".$this -> crop_width.",".$this -> crop_height.");";
		}	
		if ( $this -> max_size ){
			$onclick .= $this -> name.".max_size = ".$this -> max_size.";";
		}
		if ( $this -> max_width ){
			$onclick .= $this -> name.".set_max_width(".$this -> max_width.");";
		}
		if ( $this -> max_height ){
			$onclick .= $this -> name.".set_max_height(".$this -> max_height.");";
		}	
		$onclick.="this.onclick=function(e){ {$this -> name}.load_image(e) };";	
			if ( sizeof($this ->files)>0 ){
			foreach($this ->files AS $f){
				 $onclick.=$this -> name.".set_file('$f');";
			}
		}
			
		$onclick.="{$this -> name}.show();";
		
		 $js = "
			<img 
				src=\"{$MAIN_SOURCE_URL}/tmpl/default/img/1.gif\"
				id=\"img_{$name}\"
				onload=\"{$onclick}\"
				style=\"display:block\"
			/>";
			
		
				 
		return $js;
	}
	
	function set_max_width($width){
	  $this -> max_width = $width;
	}
	function set_max_height($height){
	  $this -> max_height = $height;
	}
	function set_max_size($size){
		$size = intval($size);
		if (!empty($size)){
			$this -> max_size = $size;
		}
	}
		
	function result($path,$url){
		include_once( MAIN_SOURCE_PATH."/ext/ajax/JsHttpRequest.php");
		$JsHttpRequest = new JsHttpRequest("windows-1251");
		
		$page = !empty($_REQUEST['page']) ? $_REQUEST['page'] : '';
		
		if ( $page=='load_img'){
			if ( empty($_FILES['upl']['name']) ){
			   $this -> error =  E_UPLOAD_IMAGE;
			   return false;
			}
			
			include_once(MAIN_SOURCE_PATH.'/inc/class.upload.php');
			$up = new upload();
			$up  -> max_size($this -> max_size);
			$up  -> max_height($this -> max_height);
			$up  -> max_width($this -> max_width);
			$f_name = $up  -> load( 'upl',$path );
			
			if ( false===$f_name ){
				
			  $this -> error =  $up -> error;
			  return false;
			}
			
			$GLOBALS['_RESULT']['path'] = $url;
			$GLOBALS['_RESULT']['name']= $f_name;
			return true;
		}else{
		
		
			if ( empty($_REQUEST['name']) ){
				 $this -> error =  E_UPLOAD_DEL_IMAGE_ERROR;
				return false;
			}
			if ( preg_match('#[^0-9.a-z_-]*#iUs') ){
				 $this -> error =  E_UPLOAD_NOT_FILE;
				 return false;
			}
			if ( !file_exists($path.'/'.$_REQUEST['name']) ){
				$this -> error = E_UPLOAD_NOT_FILE;
				return false;
			}
			unlink($path.'/'.$_REQUEST['name']);
			return true;
		}
	}
	
	
}

	//	генерируем выпадающий список групп
class group_select_box{
	private $groups = array();
	private $size = 0;
	
	
	private function load(){
	  if ( $this -> size==0 ){
	  	$this -> groups = users::groups();
	  	
	  }else{
	    reset($this -> groups);
	  }
	}
		
	function group_list($groups=array()){
	  $this -> load();
	
	  $u_group = new select_box();
	  $u_group -> selected_id($groups);
	  $u_group -> empty_record(false);
	  while(  list($g_id,$g_name) = each($this -> groups) ){
		  $u_group -> set($g_id,$g_name);
	  }
	  return $u_group -> get();
	}
	
	function get_count(){
	  return sizeof($this -> groups);
	}	
	
	function get($v){
		return $this -> group_list($v);
	}
}



/**
* генерируем выпадающий список категорий
*
*/
class cat_select_box{
	private $cats = array();
	private $size = 0;
	
	
	private function load(){
	  if ( $this -> size==0 ){
	  	include_once(MAIN_SOURCE_PATH.'/modules/admin/inc/class.category.php');
	 
	  	$c = new   category_q( MAIN_CATEGORY_TBL,'c');
		$c -> where_more('c_level',0);
		$c -> order_left('ASC');
		$c -> get('c_id,c_name,c_level',false);
		$blogs= array();
		while( $row = $c -> row() ){
			if ( $row['c_level']>1 ){
				$row['c_name']='---'.$row['c_name'];
			} 
			$this -> cats[ $row['c_id'] ]=$row['c_name'];
		}		
	  }else{
	    reset($this -> cats);
	  }
	}
		
	public function get($v){
	  $this -> load();
	
	  $s = new select_box();
	  $s -> selected_id($v);
	  $s -> empty_record(true,0,'---');
	
	  while(  list($id,$name) = each($this -> cats) ){
		$s -> set($id,$name);
	  }
	  
	  return $s -> get();
	}
	
	public function get_count(){
	  return sizeof($this -> cats);

	}	
}


/**
* генерируем выпадающий список модулей
*
*/
class module_select_box{
	private $items = array();
	private $size = 0;
	
	
	private function load(){
	  if ( $this -> size==0 ){
	  	include_once(MAIN_SOURCE_PATH.'/modules/admin/inc/class.module.php');
	    $m = new m_query('m');
	    $m -> where_active(1);
	    $m -> get('m_id,m_name');
		  while( $row = $m -> row() ){
			  $this -> items[ $row['m_id'] ]=$row['m_name'];
		  }		
	    }else{
	      reset($this -> items);
	    }
	}
		
		
	public function get($v){
	  $this -> load();
	  $s = new select_box();
	  $s -> selected_id($v);
	  $s -> empty_record(false,0);
	  while(  list($id,$name) = each($this -> items) ){
		  $s -> set($id,$name);
	  }
	  
	  return $s -> get();
	}
	
	public function get_count(){
	  return sizeof($this -> items);

	}	
}


//	вывод и получение даты
class data{
		//	генерирует списки год/месяц/день 
	function set($timestamp,$year_b=1960){
		$timestamp = !empty($timestamp) ? $timestamp : MAIN_TIME;
		$d = date('d.m.Y',$timestamp);
		$d = explode('.',$d);

		return array(
					data::get_day($d[0]),
					data::get_month($d[1]),
					data::get_year($d[2],$year_b),
					);
	}
	
	//	генерирует таймстам изходя из входящих параметров
	function get($d,$m,$y){
		$d = intval($d);$m = intval($m);$y = intval($y);
		$d = !empty($d) ? $d : 1;
		$m = !empty($m) ? $m : 1;
		$y = !empty($y) ? $y : date('Y',MAIN_TIME);
		return mktime(0,0,0,$m,$d,$y);
	}
	
	function get_day($d){
		$s = new select_box();
		$s -> selected_id($d);
		$s -> empty_record(false);
		for($i=1;$i<32;$i++){
			$s -> set($i,$i);
		}
		return $s -> get();
	}
	
	function get_month($m){
		$s = new select_box();
		$s -> selected_id($m);
		$s -> empty_record(false);
		for($i=1;$i<13;$i++){
			$s -> set($i,constant('F_MONTH_'.$i) );
		}
		return $s -> get();
	}
	
	function get_year($m,$begin){
		$s = new select_box();
		$s -> selected_id($m);
		$s -> empty_record(false);
		$end = date('Y',MAIN_TIME);
		for($i=$end;$i>=$begin;$i--){
			$s -> set($i,$i );
		}
		return $s -> get();
	}
}


	

/**
* Класс для поддержки captcha
*
*
*/
class captcha{

  /**
  * Выводим
  *
  */
	static function show(){
		session_start();
		return array(
		'img' => MAIN_SOURCE_URL.'/ext/captcha/index.php?'.session_name().'='.session_id(),
		'input' => 'keystring',
		);
		
	}
	
	/**
	* Проверяем
	*
	*/
	static function check(){
		session_start();
		if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $_REQUEST['keystring']){
			return true;
		}else{
			return false;
		}
	}
}
?>
