	function Set_Event_Hook(obj, func, event)
	{
		if(obj.addEventListener)
		{
			obj.addEventListener(event, func, true);
		}else
		{
			obj.attachEvent('on'+event, func);		
		}
	}

	function TDynamicField_addBlock(obj) {
		var size = this.block.length;
		this.block[size] = obj;
		// прописываем зависимость добавляемому объекту
		size = obj.block.length;
		obj.block[size] = this;
	}
	
	function TDynamicField_addDependency(obj) {
		var size = this.depend.length;
		this.depend[size] = obj;
		// прописываем зависимость добавляемому объекту
		size = obj.depend.length;
		obj.depend[size] = this;	
	}
	
	function TDynamicField_doBlock() {
		if(this.block.length == 0) {return}
		if(this.object.disabled == true) {return}
		var id		= 0;
		var state	= true;
		if(this.object.value == 0) {state = false}
		for(id=0; id<this.block.length; id++) {
			this.block[id].object.disabled = state;
		}
	}

	function TDynamicField_selectUpdate(self) {
		return function(html) {
			if(html != "no") {
				if (self.object.outerHTML)
				    self.object.outerHTML = replace(self.object.outerHTML, "</select>", html+"</select>");
				else
				    self.object.innerHTML = html;
			} else {
				self.object.innerHTML = "ошибка загрузки данных";
			}
			self.chk_block()
		}
	}
	
	function TDynamicField_doDependency() {
		var id = 0;
		var child = new Object();
		var get = "&where=";
		var val = this.object.options[this.object.selectedIndex].value;
		// если у поля не выбрано значение то выходим
		if(val == 0) {
			this.loaded = false;
			get = get + "all";
		} else {
			this.loaded = true;
			get = get + this.sql_table + "&id="+val;
		}
		for(id=0; id<this.depend.length; id++) {
			child = this.depend[id];
			if(child.loaded == true) continue; // если дочернее поле уже перезагружено
			if(child.object.disabled == true) continue;
			if(child.ajax_func == 0) continue;
			child.ajax_func(child.ajax_url+"?select="+child.sql_table+get, 
				TDynamicField_selectUpdate(child));
		}
	}
	
	function TDynamicField_hook(obj, dep) {
		return function() {
			obj.chk_block();
			if(dep) obj.chk_depend();
		}
	}
	
	function TDynamicField(id, ajax_url, table, ajax_func) {
		this.object = document.getElementById(id);	// ссылка на объект
		this.block	= new Array();					// список блокируемых полей
		this.depend	= new Array();					// список зависимых полей
		this.ajax_url = ajax_url||"";
		this.sql_table = table||"";
		this.loaded	= false; // отмечаем было ли поле перезагружено
		
		this.add_block  = TDynamicField_addBlock;
		this.add_depend = TDynamicField_addDependency;
		this.chk_block	= TDynamicField_doBlock;
		this.chk_depend = TDynamicField_doDependency;
		this.ajax_func	= ajax_func||0;
		Set_Event_Hook(this.object, TDynamicField_hook(this, true), "change");
	}
	
	function Unblock_Elements(form) {
		return function() {
			var id = 0;
			for(id=0; id<form.elements.length; id++) {
				form.elements[id].disabled = false;
			}
		}
	}
