/*
trida multiselect

umoznuje praci se nekolika zavislymi selecty - po vyberu hodnoty 
v nadrazenem selectu se aktualizuji prvky v selectu podrizenem (zavislem)

pracuje s data - multidimenz. array s rekursivni 
datovou strukturou: array(key, value [, subarray])
neboli klasicky strom

*/

function multiselect(data) {
	// public variables
	this.sel_objects;		// odkazy na SELECT objekty; jejich poradi urcuje i 
							// jejich hierarchii (napr. 2. select je zavisly na 1.)
	this.def_values;		// defaultni hodnoty SELECTu
	this.no_sel_texts;		// komentare pro nevybranou polozku u jednotlivych SELECTu
	this.no_sel_value = 0;

	// private variables
	this.src = data;
	this.no_sel_text = '--'; 	// pokud neni nastavene no_sel_texts, pracuje se s 
								// touto polozkou


	// public methods
	this.reset = multiselect_reset;				// prvotni naplneni SELECTu
	this.on_change = multiselect_on_change;		// navazany na event onChange SELECTu

	// private methods
	this.set = multiselect_set;				// naplneni jednoho SELECTu
	this.del = multiselect_del;				// smaze vsechna options ze SELECTu
	this.find_id = multiselect_find_id;		// najde v ramci jednoho levelu k danemu 
											//klici ID pole
}
	

/*
nastavi selecty do vychoziho stavu
*/
function multiselect_reset() {
	var i;
	
	// pokud nejsou nastavene no_sel_texts, prednastavi se na hodnotu no_sel_text
	if (!this.no_sel_texts) {
		this.no_sel_texts = new Array(this.sel_objects.length);
		for (i = 0; i < this.no_sel_texts.length; i++) {
			this.no_sel_texts[i] = this.no_sel_text;
		}
	}
	
	// prvni SELECT se naplni vzdy, ostatni pouze tehdy, 
	// ma-li nadrazeny select nastavenou defaultni hodnotu 
	this.set(this.src, 0, this.def_values ? this.def_values[0] : 0);

	
	// retezec subdata_id_str bude obsahovat cestu k substromu
	// ve tvaru napr. [1][2][12][2][3][2] - ktera se pak evaluuje
	var subdata_id_str = "this.src";
	
	for (i = 1; i < this.sel_objects.length; i++) {
		if (this.sel_objects[i-1].selectedIndex > 0) {
			subdata_id_str += '[' + (this.sel_objects[i-1].selectedIndex - 1) + '][2]';
			this.set(eval(subdata_id_str), i, this.def_values[i]);
		} else {
			this.sel_objects[i].options[0] = new Option(this.no_sel_texts[i], this.no_sel_value);
		}
	}


}




/*
naplni SELECT tag parem <key, value> z daneho substromu
*/
function multiselect_set(sub_data, sel_object_id, def_value) {
	var i;
	var select_id = -1;

	this.del(sel_object_id);

	// naplneni daty
	for (i = 0; i < sub_data.length; i++) {
		this.sel_objects[sel_object_id].options[i+1] = new Option(sub_data[i][1], sub_data[i][0]);
		if (sub_data[i][0] == def_value) {
			if (def_value > 0)
				select_id = i + 1;
		}
	}
	
	if (select_id > -1) {
		this.sel_objects[sel_object_id].options[select_id].selected = true;
		this.sel_objects[sel_object_id].options[select_id].defaultSelected = true;
	}
}




/*
smaze vsechny options v SELECT, vlozi prvni OPTION s no_sel_texts hodnotou
*/
function multiselect_del(sel_object_id) {
	var i;
	for (i = this.sel_objects[sel_object_id].options.length; i >= 0; i--) {
		this.sel_objects[sel_object_id].options[i] = null; 
	}
	this.sel_objects[sel_object_id].options[0] = new Option(this.no_sel_texts[sel_object_id], this.no_sel_value);
}




/*
v ramci datoveho podstromu najde k danemu klici ID v ramci pole
*/
function multiselect_find_id(sub_data, key) {
	for (var i = 0; i < sub_data.length; i++) {
		if (sub_data[i][0] == key) {
			return i;
		}
	}
	return -1;
}


/*
vola se pri zmene vyberu v SELECTu - vyber se projevi zmenou obsahu 
zavisleho selectu
*/
function multiselect_on_change(sel_object) {
	var i;
	var subdata_id_str = "this.src";		// popis viz multiselect_reset()

	// urci se zavisly SELECT
	for (i = 0; i < this.sel_objects.length; i++) {
		if (this.sel_objects[i] == sel_object) {
			if (sel_object.selectedIndex > 0) {
				// existuje zavisly SELECT?
				if (i < this.sel_objects.length - 1) {
					// zavisly SELECT se predvyplni prislusnymi hodnotami
					subdata_id_str += '[' + (sel_object.selectedIndex - 1) + '][2]';
					i++;
					this.set(eval(subdata_id_str), i, 0);
				}
			}				
			break;
		} else {
			subdata_id_str += '[' + (this.sel_objects[i].selectedIndex - 1) + '][2]';
		}
		
	}

	// vsechny dalsi zavisle selecty se vyresetuji
	for (i += 1; i < this.sel_objects.length; i++) {
		this.del(i);
	}
	
}


