<?


abstract class Ui_field_type {

	protected $fmName = 'Fm';

	function __construct($field) {
		$this->field = $field;
		$this->check_oncreate();

		$ui = get_ui($this->fmName.'->'.$field->name);

		// если указан список, прописываем. Это нужно для меню и комбобоксов
		if($field->list) {
			$ui->text = implode("\n", $field->list);
		}
	}

	function check_oncreate() {
		if(!get_ui($this->fmName.'->'.$this->field->name))
			throw new Error_def("Поле {$this->field->name} не найдено на форме");
	}

	abstract function get($ui);
	abstract function set($ui, $v);
}


class Ui_field_type_text extends Ui_field_type {
	function get($ui) {
		GLOBAL $log;
		//$log->line(__method__ . "({$this->field->name}) " . get_ui($this->field->name)->text);
		// иногда ui начинает ссылаться на прежнюю версию поля
		// поэтому мы вынуждены каждый раз запрашивать get_ui
		// в частности этот баг происходит когда поле привязанно к графику и стоит ограничение на само поле.
		//Если по графику выбрать значение меньше ограничения то, ui теряется
		
		return get_ui($this->fmName.'->'.$this->field->name)->text;
		// return $this->field->ui->text;
	}
	function set($ui, $v) {
		GLOBAL $log;

		//$log->line('Ui_field_type_text::set ' . $v);
		//$this->field->ui->text = $v;
		get_ui($this->fmName.'->'.$this->field->name)->text = $v;
		//$log->line("Ui_field_type_text::set check " . $this->field->ui->text);

	}
}

class Ui_field_type_menu extends Ui_field_type  {
	function get($ui) {
		return get_ui($this->fmName.'->'.$this->field->name)->items->selected;
	}
	function set($ui, $v) {
		get_ui($this->fmName.'->'.$this->field->name)->items->selected = $v;
	}
}

class Ui_field_type_combobox extends Ui_field_type  {
	// function __construct($field) {
	// 	parent::__construct($field);

	// 	// добавляем последний пункт чтобы человек понимал что он может сам что-то написать
	// 	$ui = get_ui($field->name);
	// 	$ui->text = $ui->text  . "\nИли введите...";
	// }

	function get($ui) {
		$v = get_ui($this->fmName.'->'.$this->field->name)->inText;
		return trim($v); // потому что там пробелы нещядно добавляются
	}
	function set($ui, $v) {
		get_ui($this->fmName.'->'.$this->field->name)->inText = $v;
	}
}

class Ui_field_type_checkbox extends Ui_field_type  {
	function get($ui) {

		$value = get_ui($this->fmName.'->'.$this->field->name)->state;		
		if($value == 'cbChecked') $value = 1;
		else $value = 0;

		return $value;
	}
	function set($ui, $v) {
		if($v == 1) $value = 'cbChecked';
		else $value = 'cbUnchecked';
						
		get_ui($this->fmName.'->'.$this->field->name)->state = $value;
	}
}

class Ui_field_type_speedbutton extends Ui_field_type  {

	// при создании speedbutton надо посчитать сколько кнопок под данным полем используется
	// имена связанный кнопок должны заканчивать на _bt1, _bt2 итд
	function check_oncreate() {
		GLOBAL $log;

		$name = $this->field->name;

		$num_bt = 0;
		for($i=1; $i<=100; $i++) {
			if(!get_ui($this->fmName.'->'."{$name}_bt{$i}")) break;
			$num_bt ++;
		}

		if($num_bt < 2)
			throw new Error_def("Кнопка {$name}_bt1 и/или {$name}_bt2 не найдены на форме");

		$this->field->num_bt = $num_bt;

		// $log->line('кол-во кнопок:' . $num_bt);
	}


	function get($ui) {
		//$log->line('get  ' . $bt_name);

		for($i=1; $i<=$this->field->num_bt; $i++)  {
			if(get_ui($this->fmName.'->'.$this->field->name .  "_bt$i")->down)
				return $i;
		}

		return 0;
	}

	function set($ui, $v) {
		GLOBAL $log;

		if(!is_numeric($v))
			throw new Error_def("Параметр v не является числом '$v'");

		$bt_name = $this->field->name .  "_bt$v";
		if(!$bt = get_ui($this->fmName.'->'.$bt_name))
			throw new Error_def("Не найдена speedbutton с именем $bt_name");

		//$log->line('нажимаем на ' . $bt_name);

		$bt ->down = 1;
	}
}

?>