//
// Sada funkcí pro obsluhu vázných lisboxů (Bind SELECT)(obraz databázové vazby 1:n)
//
// Funkce pracuji se dvěma listbox, jejichž ID jsou předávána u všech funkcí v parametrech
// parentID a childID (vždy string).
//
// Obsah listboxů je plněn z pole jehož syntaxe a struktura je následující:
//
//  př:	var hlavniArr = new Array();
//      hlavniArr[a] = new Option("nulty",'a');
//      hlavniArr[b] = new Option("prvni",'b');
//      hlavniArr[c] = new Option("treti",'c',true,true);
//      var zavislyArr = new Array();

//      zavislyArr['a'] = new Array();
//      zavislyArr['a'][1] = new Option("nulty - 1",1);
//      zavislyArr['a'][2] = new Option("nulty - 2",2);

//      zavislyArr['b'] = new Array();
//      zavislyArr['b']['x'] = new Option("prvni - 1",'x');
//      zavislyArr['b']['y'] = new Option("prvni - 2",'y');
//
// nazevy pole = <parentID | childID>Arr
// index parent pole = value OPTIONS  (není zavazujcí,může být i čisla, ale doporučuji kvuli
//     pohodlenému přistupu)
// index child pole = [<parent value>][<child value>] - povinná syntaxe
//
// Runtime změny ve strukture se projevi po zavolani BSelectRefresh() | BSelectReset().
// Smazaní některé položky z listboxu se provede přiřazením null v poli na určitém indexu.
//
// #TODO - prepsat do objektoveho modelu !!! -> vic BS na strance
//

// ověří načtení externích funkcí
if (typeof(setInputByID) != 'function') alert('bselect.js: není includována funkce setInputByID() (setinput.js)');


// indikuje nacteni objektu
BSelect.prototype.loaded = false;

// globalni promenna (nazev) objektu BSelect v JS
//  viz BSelect.init()
BSelect.prototype.point;

// seznam id(cek) vazanych listboxu
// musi jit postupne od rodice na dite
BSelect.prototype.boxesID;

// nazev vytvorenyho iframe(u) pro nacitani dat (oblast externiho zdroje dat)
BSelect.prototype.iframeName;

// nazev (oblast dynamickeho zdroje dat)
BSelect.prototype.frame;

// cesta ke zdroji dat (souboru)
BSelect.prototype.pathURL;

//-------------------------------------------------------------------------------------------------
// Inicializace vázaných listboxů, načtení datových polí a registrace udalosti
//
// [void]
function BSelect(boxes, iName, frame){
	if (frame == undefined) frame = this;

	this.boxesID = boxes;
	this.iFrameName = iName;
	this.frame = frame;
}
// BSelect() --------------------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// funkce init() je dulezita pro predani (nastaveni) globalni promenne tohoto objektu
//  pro onChange udalost elementu select
//
// [void]
BSelect.prototype.init = function(objName, frame){
	if (frame == undefined) frame = this.frame;

	this.point = objName;

	var parentID = null;
	var parentLB;

	// chyba v IE nebo Moz
	if (this.iframeName && this.iframeName != ''){
alert('iFrame. '+this.iFrmaeName);
		if (navigator.userAgent.slice(0, 9) != 'Mozilla/5'){ // 0 - Moz, 1 - IE
			var oldBody = (document.body.onload) ? document.body.onload : function() {};
			eval('document.body.onload = function() { '+objName+'.iFrameInit(); oldBody() }');
		}else{
			this.iFrameInit();
		}
	}

	for (var i in this.boxesID){
		if (parentID == null){
			parentID = this.boxesID[i];
			this.reset(parentID, frame);
			continue;
		}

		parentLB = frame.document.getElementById(parentID);
		// prida udalost onchange u parent listboxu (pokud existuje nějaká stávající, zachová ji)
		var old = (parentLB.onchange) ? parentLB.onchange : function() {};
		eval('parentLB.onchange = function() {'+objName+'.resetChild("'+parentID+'"); old() }');
		parentID = this.boxesID[i];
	}

	this.loaded = true;
}
// BSelect.init() ---------------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// vrati textovou identifikaci objektu
//
// [string]
BSelect.prototype.toString = function(){
	return 'object[bselect]';
}
// BSelect.toString() -----------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// funkce vytvori IFrame, ze ktrereho se budou natahovat externi data do listboxu
//
// [void]
BSelect.prototype.iFrameInit = function(){
//alert('call iFrameInit().');
//	document.write('<iframe name="'+this.iframeName+'" width="100" height="50"' +
//		' frameborder="0" style="border:1px solid #000000"></iframe>');

	iframe = document.createElement('iframe');
	iframe.name = this.iframeName;
	iframe.id = this.iframeName;
	iframe.width = 100;
	iframe.height = 50;
	iframe.frameborder = 0;
	iframe.scrolling = "no";
	iframe.style.border = '1px solid #000000';

	document.body.appendChild(iframe);
}
// BSelect.iFrameInit() ----------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// Neveřejná funkce, která načte do listboxu data z pole
//
// [void]
BSelect.prototype.load = function(listboxID, listboxArr, frame){
	if(frame == undefined) frame = this.frame;

	var parentID, parentLB;
	for (var i in this.boxesID){
		if (listboxID == this.boxesID[i]){
			break;
		}else{
			parentID = this.boxesID[i];
		}
	}

	parentLB = document.getElementById(parentID);
	if (this.iframeName != '' && this.loaded && parentLB && parentLB.value != ''){
		eval('listboxLoaded = (typeof('+listboxID+'Loaded) == "boolean" && frame.'+listboxID+'Loaded)');
		if (!listboxLoaded && eval('typeof('+this.iframeName+') != "undefined"')){
			if (this.pathURL.slice(-1) != '/'){
				this.pathURL += '/';
			}
			eval('bselectURL = this.pathURL+"bselect.'+this.point+'.php?listbox='+listboxID+'";');
			eval(this.iframeName+'.location = bselectURL;');
			return;
		}
	}

	clearSelectByID(listboxID, frame);

	var n = 0;
	var tmpLB = frame.document.getElementById(listboxID);
	if (!tmpLB) alert('Nelze najít listbox id="'+listboxID+'".');
	for (var s in listboxArr){
		if (listboxArr[s] != null && typeof(listboxArr[s]) == 'string'){
//			alert(typeof(listboxArr[s]) == 'object');
			tmpLB.options[n] = new Option(listboxArr[s], (s == 0 ? '' : s), false, false);
//			if (listboxArr[s].selected) tmpLB.options[j].selected = true;
			n++;
		}
	}
}
// BSelect.load() ----------------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
BSelect.prototype.loadChild = function(childID, frame){
	if(frame == undefined) frame = this.frame;

	var parentID
	this.loaded = prev = false;

	for (var i in this.boxesID){
		if (!prev && this.boxesID[i] == childID){
			prev = true;
		}else if (!prev){
			parentID = this.boxesID[i];
			continue;
		}

//		parentArr = eval('frame.' + parentID + 'Arr');
		this.resetChild(parentID, frame);
		break;
	}

	this.loaded = true;
}
// BSelect.loadChild() ----------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// Načte znovu datová pole s výchozími hodnotami
//
// [void]
BSelect.prototype.reset = function(parentID, frame){
	if(frame == undefined) frame = this.frame;

	var parentLB, parentArr;
	prev = false;
//alert('calling BSelect.reset(). (listbox. '+parentID+')');
	for (var i in this.boxesID){
		if (!prev && this.boxesID[i] == parentID){
			prev = true;
		}else if (!prev){
			continue;
		}

		parentID = this.boxesID[i];

		parentLB = frame.document.getElementById(parentID);

		// naplneni parent listbox
		parentArr = eval('frame.' + parentID + 'Arr'); //vytvoření nazvu pole, ve kterém jsou data
		this.load(parentID, parentArr);
//		this.resetChild(parentID);
	}
}
// BSelect.reset() ---------------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// Funkce načte příslušné vázané pole a nastaví child listbox podle hodnoty zadané v parent
//
// [void]
BSelect.prototype.resetChild = function(parentID, frame){
	if(frame == undefined) frame = this.frame;

	var childID;
	var parentLB, childLB, index;
	var prev = false;

//alert('calling BSelect.resetChild(). (listbox. '+parentID+'), Loaded. '+this.loaded);
	for (var i in this.boxesID){
		if (!prev && this.boxesID[i] == parentID){
			prev = true;
			parentID = this.boxesID[i];
			continue;
		}else if (!prev){
			continue;
		}

		childID = this.boxesID[i];

		parentLB = frame.document.getElementById(parentID);
		childLB = frame.document.getElementById(childID);
	
		if(!parentLB) alert('Nelze najít ID='+parentID);
		if (!parentLB.selectedIndex || parentLB.selectedIndex == -1){
			index = '';
		}else{
			index = parentLB.options[parentLB.selectedIndex].value;
		}
		if (index == ''){
			var childArr = eval('new Array(frame.' + childID + 'Arr[""]);');
		}else{
			var childArr = eval('frame.' + childID + 'Arr["' + index + '"];');
		}

		next = this.load(childID, childArr, frame);
		parentID = this.boxesID[i];

		if (!this.loaded || (this.iframeName != '' && index != '')){
			break;
		}
	}
}
// BSelect.resetChild() ----------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// Uloží stavající nastavení listboxů a provede BSelectReset(), po kterém nastaví hodnoty před
// resetem.
//
// [void]
BSelect.prototype.refresh = function(parentID, frame){
	if(frame == undefined) frame = this.frame;

	var parentVal = new Array();
	var parentLB;
	var prev = false;

	for (var i in this.boxesID){
		if (!prev && this.boxesID[i] == parentID){
			prev = true;
		}else if (!prev){
			continue;
		}

		parentLB = frame.document.getElementById(this.boxesID[i]);
		parentVal = parentLB.options[parentLB.selectedIndex].value;
	}

	this.reset(parentID, frame);
	this.set(parentVal, frame);
}
// BSelect.refresh() -------------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// Nastaví listboxy podle hodnot předaných parametrem. Pokud je hodnota childVal null nebo
// undefined, child listbox neni nastaven.
//
// [void]
BSelect.prototype.set = function(valuesArr, frame){
	if(frame == undefined) frame = this.frame;

	for (var i in this.boxesID){
		if(valuesArr[i] != null && valuesArr[i] != undefined){
			setInputByID(this.boxesID[i], valuesArr[i], frame);
			this.resetChild(this.boxesID[i]);
		}
	}
}
// BSelect.set() -----------------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// Funkce upravi polozku v SELECTu dle zadane value
//
// [void]
function clearSelectByID(name, frame){
	if(frame == undefined) frame = this;
	selectObj = frame.document.getElementById(name);
	if (!selectObj) alert('HTML element id="'+name+'" nebyl v dokumentu nalezen.');
	selectObjLen = selectObj.length;
	for(i = selectObjLen - 1; i >= 0 ;i--){
	  selectObj.options[i] = null;
	}
}
// delSelectByID() --------------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------
// pokusi se odeslat formular podle formID, pokud neni hodnota objektu listbox prazdna
//
// [bool]
function listboxSubmit(listbox, formID){
	listbox.form.submit();
/*
	f = document.getElementById(formID);

	if (listbox.value != '' && f){
		f.VAD_action.value = 'e';
		f.id.value = listbox.value;
		return f.submit();
	}
*/
}
// listboxSubmit() --------------------------------------------------------------------------------