<?
if ( defined('class_upload_inc') )
	return false;
define('class_upload_inc',1);

	//	загрузка файлов, а также библиотека специфичных функций
class upload
{
	private $lst_error = false;
	private $result_types = array();
	private $result_path = false;
	private $result_name = false;
	private $result_rewrite = false;	//	перезаписываем результат

	private $result_key;

	
	
	public function __construct($key){
		
		if ( empty($key) ){
			$this -> make_error('не задан ключ');
		}
		$this -> result_key = $key;
	}
	

	
	public function access_type($type){
		if ( $type=='image'){
			$this -> set_type('image/jpeg');
			$this -> set_type('image/jpg');
			$this -> set_type('image/gif');
			$this -> set_type('image/png');
			$this -> set_type('image/pjpeg');
			$this -> set_type('image/x-png');
		}else{
			$this -> set_type($type);
		}
	}
	private function set_type($type){
		$this -> result_types[]=$type;
	}
	
	public function access_size($size){
		$this -> result_size=$size;
	}
	
	public function set_name($name){
		if ( empty($name) ){
			sys_error(ERROR_500,'Не задано имя');
		}
		$this -> result_name = $name;
		return true;

	}
	
	public function set_dir($dir){
		if ( empty($dir) ){
			sys_error(ERROR_500,'Пустой каталог');
		}
		$this -> result_path = $dir;
		return true;
	}
	
		//	жёский контроль каталога в который загружается файл
	public function set_safe_dir($dir){
		if ( empty($dir) ){
			sys_error(ERROR_500,'Ошибка: не указан каталог для загрузки файлов!');
		}
		
		if ( !sys_check_safe_dir($dir) ){
			$this -> make_error('Ошибка: нет прав для записи в этот раздел!');
			return false;
		}
		$this -> result_path = MAIN_PATH.'/media/'.$dir;
		return true;
	}
	
	static function get_safe_dir(){
	  return MAIN_PATH.'/media/';
	 }
	
		//	перезаписывать файл
	public function set_rewrite($flag){
		$this -> result_rewrite = $flag;
	}
	
	
	
	
	public function load(){
			//	ошибки были в прошлом
		if ( !empty($this -> lst_error) ){
			return false;
		}
		
		if ( !is_array($_FILES[$this -> result_key]) ){
			$this -> make_error('"'.$this -> result_key.'"  не загружен');
			return false;
		}
		
		if ( !empty($_FILES[$this -> result_key]['error']) ){
			$this -> make_error(' во время загрузки произошла неизвестная ошибка');
			return false;
		}
		
			//	каталог, в который нужно писать результат
		if ( empty($this -> result_path) ){
			$this -> make_error('Ошибка: не указан каталог для загрузки файлов!');
			return false;
		}	
			//	да это и не каталог вовсе
		if ( !is_dir($this -> result_path) ){
			$this -> make_error('Ошибка: адрес "'.sys_in_html($this -> result_path).'" не является каталогом ');
			return false;
		}
	
		if ( !is_writable($this -> result_path) ){
			$this -> make_error('Ошибка: в каталог "'.sys_in_html($this -> result_path).'" нельзя вести запись, нет прав!');
			return false;
		}
		
			//	размер
		if ( !empty($this -> result_size) && ($this -> result_size < $_FILES[$this -> result_key]['size']) ){
			$this -> make_error('Ошибка: максимальный размер загружаемого файла не может превышать '.$this -> result_size." !");
			return false;
		}
			//	контроль типа
		
		if (  !in_array($_FILES[$this -> result_key]['type'],$this -> result_types) ){
			$this -> make_error('Ошибка: тип "'.sys_in_html($_FILES[$this -> result_key]['type']).'" файлов запрещён к закгрузке!');
			return false;
		}
		
	
		$load_file_info = pathinfo($_FILES[$this -> result_key]['name']) ;
		$ext = $load_file_info['extension'];
			//	генерируем новое имя
		if ( empty($this -> result_name) ){
			$base = MAIN_TIME;
			while(2<3){
				if ( !file_exists($this -> result_path.'/'.$base.'.'.$ext) ){
					break;
				}
				$base++;
			}
			 $this -> result_name = $base.'.'.$ext;
		}
		
		if ( empty($this -> result_rewrite) && file_exists($this -> result_path.'/'.$this -> result_name) ){
			$this -> make_error('файл с таким именем уже существует');
			return false;
		
		}
		
			//	перемещаем файл 
		if ( !@move_uploaded_file($_FILES[$this -> result_key]['tmp_name'], $this -> result_path.'/'.$this -> result_name) ){
			$this -> make_error(' загрузить файл не получилось');
			return false;
		} 
		return true;
	}
	
	public function get_result_name(){
		return $this -> result_name;
	}
	public function get_result_path(){
		return $this -> result_path;
	}
	public function error(){
		return $this -> lst_error;
	}
	
	
	private function make_error($msg){
		$this -> lst_error = $msg;
	}
	
	
	
	
}
?>
