<?



class Ui_field {
	public $name;
	public $type;
	public $ui;

	protected $fmName = 'Fm';

	// не используем потому что нет возможности правильно определить событие "человек закончил ввод"
	//protected $is_user_input = false; //если вводит в поле человек. Нужно для правильно проверки введенных данных. 
	
	protected $value=''; // из-за бага с перекрестными onChange. не удается поддерживать это поле в актуальному состоянии.
	
	// автоматическая проверка не работает, поэтому эти поля пока не работают.
	protected $min_value = 0;
	protected $max_value = false;
	protected $min_op_field = ''; // автоматическая проверка берет данные из OP
	protected $max_op_field = '';
	protected $type_value = 'numeric';

	public $list  = array(); // список пунтов для меню
	public $def;
	public $enable_change;
	public $enable_process;

	// может вызываться только изнутри
	// клиент должен вызывать create_instance()
	private function __construct($name, $opt) {
		GLOBAL $Lang, $log;

		$this->name = $name;
		$this->type = $opt['type'];
		$this->def = $opt['def'];
		$this->enable_change = $opt['enable_change'];
		$this->enable_process = $opt['enable_process'];

		if(isset($opt['list']))
			$this->list = $opt['list'];

		//$log->line('создание поля ' . $name);

		$class_field_type = 'Ui_field_type_' . $opt['type'];
		if(!class_exists($class_field_type))
			throw new Error_def("Неизвестный тип поля: $opt[type]");

		$this->operations = new $class_field_type($this);

		//$log->line("тип " . get_class($this->operations));

		// название поля
		// сразу засовываем его в двойные кавычки ведь в основном поля мы показываем именно в ковычках
		// а ебаться с двойными кавычками не хочется
		$this->title = '"'.$Lang->get($name, false).'"';
	}

	static function create_instance($name, $type) {
		// общий класс или персональный, если существует
		$class = class_exists('Ui_field_' . $name)
                ? 'Ui_field_' . $name
                : 'Ui_field';
    
    		return new $class($name, $type);
	}

	/*
	Нельзя применять потому что нет возможности определить когда человек закончил ввод
	Выход за пределы поля часто происходит еще до окончания ввода (на себе проверял)
	Потеря фокуса иногда срабатывает при вводе.
	// надо запускать по событию мышка на поле или по клику
	function start_user_input() {
		$this->is_user_input = true;
	}

	// запускать по событию мышка вышла за пределы поля. Ну можно еще потеря фокуса если по феншую
	function finish_user_input() {
		$this->is_user_input = false;
		$this->onChange();
	}
	*/

	function set_limit($min, $max=NULL, $call_check_value=true) {
		if($min !== NULL) {
			$this->min_value = $min;
		}
		if($max !== NULL) {
			$this->max_value = $max;
		}

		if($call_check_value)
			$this->check_value();	
	}

	function set_limit_OP($min_name, $max_name=false) {
		GLOBAL $OP;

		if($min_name)
			$this->min_op_field = $min_name;
		
		if($max_name)
			$this->max_op_field = $max_name;

		$this->check_value();
	}

	// недоделан !!!!
	function check_value() {
		GLOBAL $OP;

		// проверка на нулевое значение
		if($this->type_value == 'numeric') {
			if($this->get() == 0) {

				return false;
			}

		}

		return true;

		/*
		// пока только проверка для числовых полей
		if($this->type_value == 'numeric') {

			// обновляем лимиты если указаны поля в $OP
			if($this->min_op_field)
				$this->min_value = $OP[$this->min_op_field];
			
			if($this->max_op_field)
				$this->max_value = $OP[$this->min_op_field];

			// проверяем значение
			$value = $this->get();
			if($value < $this->min_value) {
				$this->wrong_input_msg('Значение меньше чем надо');
				$this->set($this->min_value, false);
			}
		}*/
	}

	// вызывается когда поле физически изменяется.
	function onChange() {
		GLOBAL $OP;

		$mb = $this->get();
		$this->value = $mb;
		$OP[$this->name] = $mb;
	}
	
	function get() {
		GLOBAL $log;
		
		$v = $this->operations->get($this->ui);
		//$log->line(__method__ . " $v");
		$v = $this->_float_comma_correct($v);

		return trim($v);
	}

	function set($v, $call_onChange=true) {
		GLOBAL $log, $OP;

		$v = $this->_float_comma_correct($v);
		$v = trim($v);

		// чтобы если поля зависимы друг от друга, они не вызывали onChange друг друга бесконечно
		if($v == $this->get()) {
			//$log->line($this->name.' ' . __method__ .  "($v) блокировка");
			return true;
		}
		
		//$log->line(__method__ . "($v)");

		$this->operations->set($this->ui, $v);

		// не нужно, это будет сделано в onChange 
		// $OP[$this->name] = $v;

		if($call_onChange) 
			$this->onChange();
	}
	
	// сообщение о неправильно введенном значении
	// уже используется в ручном режиме проверки значений!
	// protected потому что вызываем из children класса
	protected function wrong_input_msg($text) {
		messageDlg($text, mtWarning, MB_OK);
		// messageBox($text, ERROR_FIELD_DIALOG_TITLE);
	}

	// корректировка запятой в плавающих числа. Замена , на .
	private function _float_comma_correct($str) {
		return str_replace(',', '.', $str);
	}
}



?>