//
// 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)
// [string]
BSelect.prototype.iFrameLoad;

// nazev iframe(u) pro ukladani dat (oblast externiho uloziste dat)
// [string]
BSelect.prototype.iFrameData;

// object (oblast dynamickeho zdroje dat)
// [object]
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, ifName, ifData, frame){
	if (ifData == undefined) ifData = this.document;
	if (frame == undefined) frame = this;

	this.boxesID = boxes;
	this.iFrameLoad = ifName;
	this.iFrameData = ifData;
	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.iFrameLoad && this.iFrameLoad != ''){
//alert('iFrame. '+this.iFrameLoad);
		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;
		}
		if(typeof(parentID) != 'string') 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 '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 src="" name="'+this.iFrameLoad+'" width="100" height="50"' +
		' frameborder="0" style="border:1px solid #000000"></iframe>');

//alert(this.frame.document.getElementById(this.iFrameLoad));
/*
	if (!this.frame.document.getElementById(this.iFrameLoad)){
		iframe = document.createElement('iframe');
		iframe.name = this.iFrameLoad;
		iframe.id = this.iFrameLoad;
		iframe.width = 100;
		iframe.height = 50;
		iframe.frameborder = 0;
		iframe.allowTransparency = 'true';
		iframe.scrolling = 'no';
		iframe.style.borderWidth = '0px';

		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.iFrameLoad != '' && this.loaded && parentLB && parentLB.value != ''){
		eval('listboxLoaded = (typeof(this.iFrameData.'+listboxID+'Loaded) == "boolean" && this.iFrameData.'+listboxID+'Loaded);');
		if (!listboxLoaded && eval('typeof(' + this.iFrameLoad + ') != "undefined"')){
			// TODO - nacitat data pouze pro hodnotu rodice
//alert('parentLB. '+parentLB.value);
			eval('bselectURL = this.pathURL+"?listbox='+listboxID+'&value='+parentLB.value+'";');
			eval(this.iFrameLoad + '.location = bselectURL;');
			return;
		}

	}else if (!listboxArr){
		alert('Nebyl nalezen zdroj pro načtení dat.');
	}

	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'){
			tmpLB.options[n] = new Option(listboxArr[s], (s == 0 ? '' : s), false, false);
			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;
	var 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];
		if(typeof(parentID) != 'string') continue;
		parentLB = frame.document.getElementById(parentID);

		// naplneni parent listbox
		parentArr = eval('this.iFrameData.' + parentID.replace(/^([^\[]+)(.*)/, '$1') + 'Arr'); // vytvoření promenne 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];
		if(typeof(childID) != 'string') continue;

		parentLB = frame.document.getElementById(parentID);
		childLB = frame.document.getElementById(childID);

		if (!parentLB) return;//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(this.iFrameData.' + childID.replace(/^([^\[]+)(.*)/, '$1') + 'Arr[""]);');
		}else{
			var childArr = eval('this.iFrameData.' + childID.replace(/^([^\[]+)(.*)/, '$1') + 'Arr["' + index + '"];');
		}

		this.load(childID, childArr, frame);
		parentID = this.boxesID[i];

		if (!this.loaded || (this.iFrameLoad != '' && 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){
	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() --------------------------------------------------------------------------------

