//	Компоненты:
//	destination element	- f02_de
//	selector		- f02_se
//	filter input	- f02_fi
//	comma delimited list - f02_cdl
//	parent selector - f02_parent
//	массив классификатора селектора - f02_src
//	имя ключевого поля f02_id_fld
//	поле отображения имени f02_name_fld
//	массив данных, коррелированный со списком - f02_data	- для табличных селекторов
//	счетчик выбранных элементов в списке - f02_count	- для табличных селекторов
//	ссылка на процедуру добавления элемента к списку - f02_add
//	ссылка на процедуру удаления элемента из списка - f02_remove
//	ссылка на процедуру очистки списка - f02_clear
//	ссылка на функцию определения присутствия элемента в списке - f02_is_id
//	Для адресации элементов используется св-во id
//	f02_event_after - Ссылка на обработчик события в f02. Определяется пользователем в прикладной части.


//	методы списков
function f02_listAdd (id,name) {
//	добавление элемента в список отображения
//	если name, то отображается name иначе из массива источника (this.f02_src[id])
	if (!id || this.f02_data[id]) { return false }
	var aR=this.f02_src
	if (aR && aR[id]==undefined) {
		alert('Попытка добавить в список '+this.name+'('+this.id+') несуществующий элемент '+id+'\nВозможно вы ошиблись в цифровом идентификаторе')
		return false
	}
	if (!name) {name=aR[id].name}
	newRow =this.insertRow(-1)
	newRow.id='r'+id
//	newRow.insertCell(0).innerHTML='<input type="button" class="button1x1" value="X" onclick="this.parentElement.parentElement.parentElement.parentElement.f02_remove('+id+')" alt="Удалить позицию">'
	newRow.insertCell(0).innerHTML='<img src="/img/sq_cross.gif" onclick="this.parentElement.parentElement.parentElement.parentElement.f02_remove('+id+')" alt="Удалить позицию">'
	newRow.insertCell(1).innerHTML='<span class="item_name">'+name+'</span><INPUT type="hidden" value="'+id+'" name="'+this.f02_id_fld+'">'
	this.f02_data[id]=1
	this.f02_count++
	if (this.f02_se){ if(this.f02_se.f02_cdl) {this.f02_se.f02_cdl.f02_add(id)}}
	if (this.f02_event_after){this.f02_event_after(this,'add',id,name)}
	return this
}

function f02_initCdl (cdl,se) {
	cdl.value=''
	cdl.f02_add=f02_addCdl
	cdl.f02_set=cdl.f02_add
	cdl.f02_clear=f02_clearCdl
	cdl.f02_remove=f02_removeCdl
	if(se) {
		cdl.f02_de=se.f02_de?se.f02_de:se
		cdl.f02_se=se
		se.f02_cdl=cdl
	}
	cdl.onchange=f02_cdlOnBlur
	return cdl
}


function f02_isInList (id) {
	return (this.f02_data[id] ? true : false)
}

function f02_listAddArray () {
//	Групповое добавление элементов к списку выбора
	var args=f02_listAddArray.arguments
	for (var i=0; i<args.length; i++) {
		this.f02_add(args[i])
	}
}
function f02_listRemove(id) {
//	Удаление строки из табличного списка
	if (this.f02_data[id]) {
		delete this.f02_data[id]
		if (this.f02_count) {this.f02_count--}
	}
	for (i=0; i<this.rows.length; i++) {
		if (this.rows[i].id == 'r'+id) {
			this.deleteRow(i)
			if (this.f02_se.f02_cdl) {
				this.f02_se.f02_cdl.f02_remove(id)
			}
			if (this.f02_event_after){this.f02_event_after(this,'remove',id,name)}
			return id
		}
	}
}
function f02_listClear() {
//	Удаление табличного списка
	for (b=0; b<this.tBodies.length; b++) {
		bd=this.tBodies[b]
		var l=bd.rows.length
		for (i=0; i<l; i++) {bd.deleteRow(0)}
	}
	if (this.f02_se.f02_cdl) {this.f02_se.f02_cdl.f02_clear()}
	this.f02_data=new Array()
}
//	методы текстового поля
function f02_setField (id) {
//	присвоение получателю выбранного значения
	if (!id) { return false }
	var aR=this.f02_src
	if (this.value != id) {
		if (aR[id]==undefined) {
			alert('Попытка присвоить поле '+this.name+'('+this.id+') значение несуществующего элемента '+id)
			return false
		}
		this.value=id
		if (this.onchange) {this.onchange()}
	}
	if (this.f02_name_fld) {
		//выполняется, даже если исходное поле не изменилось. Необходимо для прорисовки
		this.f02_name_fld.value=aR[id].name
		if (this.f02_name_fld.onchange) {this.f02_name_fld.onchange()}
	}
	return this
}
function f02_isFieldVal(id) {
	return (this.value == id)
}
//	инициализация
function f02_init (px,aR) {	//	aR - источник данных списка
	var p=new Array
	var eL
	if (typeof(px) == 'string') {
		var p1=px.replace(/\s/g,'').split(';')
		for(i in p1) {
			p2=p1[i].split(':')
			p[p2[0]]=p2[1]
		}
		eL=document.all[p['se']]
	} else {
		eL=px
		p['se']=document.all[eL.f02_se] || eL
		p['de']=document.all[eL.f02_de]
		p['fi']=document.all[eL.f02_fi]
		p['cdl']=document.all[eL.f02_cdl]
		p['parent']=document.all[eL.f02_parent]
		p['name_fld']=document.all[eL.f02_name_fld]
	}
	for (i in p) {
		if (p[i]) {
			if(typeof(p[i])=='string') {
				n=p[i]
				p[i]=document.all[p[i]] || alert("f02_init. Элемент "+n+" не найден")
			}
			eL['f02_'+i]=p[i]
		}
	}
	eL.f02_src=aR
	if (eL.f02_cdl) {
		f02_initCdl(eL.f02_cdl,eL)
	}
	if (eL.f02_de) {
		if (eL.f02_de.tagName == 'TABLE') {
			f02_initDestTable (eL.f02_de,aR)
		} else {
			if (eL.f02_de.tagName == 'INPUT') {
				f02_initDestField (eL.f02_de,aR)
			}
		}
		eL.f02_de.f02_se=eL
	}
	f02_initSelector(eL,eL.f02_fi)
}
function f02_initDestTable (tbL,aR) {
//	инициализация таблицы для отображения списка выбранных значений (получателя)
//	tbl - таблица, aR - исходный массив слассификатора
//	д.б. определены св-ва aR[i].id, aR[i].name,
//	tbL_f02_id_fld - имя поля для ключа
	if (aR) {tbL.f02_src=aR}
	tbL.f02_add=f02_listAdd
	tbL.f02_set=tbL.f02_add
	tbL.f02_add_array=f02_listAddArray
	tbL.f02_remove=f02_listRemove
	tbL.f02_clear=f02_listClear
	tbL.f02_data=new Array()
	tbL.f02_count=0
	tbL.f02_is_id=f02_isInList
	if (!tbL.f02_se) {
		tbL.f02_se=tbL
		tbL.f02_de=tbL
	}
	return tbL
}
function f02_initDestField (flD,aR) {
//	инициализация получателя - текстового поля
//	flD.f02_name_fld - имя поля для текстового значения
	flD.f02_src=aR
	flD.f02_set=f02_setField
	flD.f02_add=flD.f02_set
	flD.f02_is_id=f02_isFieldVal
	if (typeof(flD.f02_name_fld) == 'string') {
		var fn=flD.f02_name_fld
		if (!(flD.f02_name_fld=document.all[fn])) {
			alert("name_fld-поле "+fn+" не найдено")
		}
	}
}
function f02_initSelector(se) {
	se.onmouseover=f02_seMouseOver
	se.onmouseout=f02_seMouseOut
	se.onblur=f02_seHide
	se.onchange=f02_seChange
	se.onclick=f02_seChange
	se.selIn=0
	se.selectorFilter=''
	if (se.f02_fi) {
		se.f02_fi.f02_se=se
		se.f02_fi.onblur=f02_fiOnBlur
		se.f02_fi.onfocus=f02_fiOnFocus
		se.f02_fi.onkeyup=f02_fiOnKeyUp
	}
}
//	методы CDL
function f02_addCdl(id) {
	var p=this.value.replace(/\s/g,'').split(',')
	var r=new Array()
	for (i in p) {
		if (p[i]) {	r.push(p[i]) }
	}
	r.push(id)
	this.value=r.join(',')
	return this
}
function f02_removeCdl(id) {
	var p=this.value.replace(/\s/g,'').split(',')
	p.push(id)
	var r=new Array
	for (i in p) {if (p[i] != id) {r.push(p[i]) } }
	this.value=r.join(',')
	return this
}
function f02_clearCdl () {
	this.value=''
}
function f02_cdlOnBlur() {
	var cdl=event.srcElement
	var p=cdl.value.replace(/\s/g,'').split(',')
	cdl.f02_se.f02_de.f02_clear()
	for (var i in p) {
		if (p[i]) {
			cdl.f02_se.f02_de.f02_add(p[i])
		}
	}
}
//	обработчики событий поля ввода фильтра
function f02_fiOnBlur (){
	var se=event.srcElement.f02_se
	if(!se.selIn) se.style.display='none'
}
function f02_fiOnFocus (forced) {
	// активация селектора
	var fi=forced?forced:event.srcElement
	var se=fi.f02_se
	fi.bakUp=fi.value
	fi.value=se.selectorFilter
	f02_fillSelector(se,fi)
	se.style.display=''
	if (fi.type=="hidden" || fi.style.display=="none") {
		se.focus()
	}
}
function f02_fiOnKeyUp () {
	// перерисовка селектора при изменении фильтра
	var fi=event.srcElement
	var se=fi.f02_se
	se.selectorFilter=fi.value.toLowerCase();
	f02_fillSelector(se,fi);
}
//	обработчики событий селектора
function f02_seMouseOver () {
	event.srcElement.selIn=1;
}
function f02_seMouseOut () {
	event.srcElement.selIn=0;
}
function f02_seHide () {
	event.srcElement.style.display='none';
}
//	заполнение селектора с фильтрацией
function f02_fillSelector(se,fi) {
	se.length=0
	var pnt; var pnt_a; var pnt_h={};
	if (se.f02_parent && se.f02_parent.f02_cdl) {
		if (se.f02_parent.f02_cdl.value) {
			pnt=true
			pnt_a=se.f02_parent.f02_cdl.value.replace(/\s/g,'').split(',')
			for (key in pnt_a) {
				pnt_h[pnt_a[key]]=1
			}
		} else {
			return
		}
	}
	var count= se.f02_limit ? ((se.f02_limit=='auto') ? se.size : undefined) : 3000
	for (i in se.f02_src) {
		var item=se.f02_src[i]
		if (pnt && !pnt_h[item.p]) continue
		if (se.selectorFilter && (item.name.toLowerCase().indexOf(se.selectorFilter)<0)) continue
		if (item.parent == '0') {
			var opt=new Option('*** '+item.name,item.id)
		} else {
			var opt=new Option(item.name,item.id)
		}
		if (se.f02_de.f02_is_id(item.id)) {
			opt.selected=true
		}
		se.options.add(opt)
		if ( count-- < 2 ) {break}
	}
//	alert("End fill ")
}
function f02_seChange () {
	var se=event.srcElement
	if (se.selectedIndex >= 0) {
		se.f02_de.f02_set(se.options[se.selectedIndex].value)
	}
	se.style.display='none';
}

//===============	функции селекторного окна =================================
function f02_Mark(el,id) {
	event.cancelBubble = true;
	if (el.sel) {
		el.style.listStyleImage='url(/img/filler.gif)'
		el.sel=false
		if (f02_dest) {
			f02_dest.f02_remove(el.i)
		}
	} else {
		el.style.listStyleImage='url(/img/check.gif)'
		el.sel=true
		if (f02_dest) {
			f02_dest.f02_add(el.i,el.innerHTML)
		}
	}
}
function f02_Spread(cl) {
	event.cancelBubble = true;
	var iTem=cl.all.dsp;
	iTem= typeof(iTem[0])=='undefined' ? iTem.style : iTem[0].style;
	if (iTem.display=='none') {
		iTem.display='';
		cl.style.listStyleImage='url(/img/sq_minus.gif)';
		if (cl.mi) {
			for (ii in cl.all) {
				if (cl.all[ii].i && f02_lst[cl.all[ii].i]) {
					cl.all[ii].style.listStyleImage='url(/img/check.gif)'
					cl.all[ii].sel=true
				}
			}
			cl.mi=false
		}
	} else {
		iTem.display='none';
		cl.style.listStyleImage='url(/img/sq_plus.gif)';
		}
}

var f02_dest=window.dialogArguments
var f02_lst=''
if (f02_dest) {
	f02_lst=f02_dest.f02_data
}

