//============================DATA DEFINITIONS=============================================
var arData = new Array();
var allTr = new Array();
var ddNames = new Array();
var ddDependentLinks = new Array();
var ddUndependentLinks = new Array();
var selDependentArray = new Array();
var selUndependentArray = new Array();
//============================GENERAL FUNCTIONS ===========================================
function sortSelect(obj) {
	var o = new Array();
	for (var i=0; i<obj.options.length; i++) {
		o[o.length] = new Option( obj.options[i].text, obj.options[i].value, obj.options[i].defaultSelected, obj.options[i].selected) ;
	}
	if (o.length==0) { return; }
	o = o.sort( 
		function(a,b) { 
			if ((a.text.toLowerCase()+"") < (b.text.toLowerCase()+"")) { return -1; }
			if ((a.text.toLowerCase()+"") > (b.text.toLowerCase()+"")) { return 1; }
			return 0;
			} 
		);

	for (var i=0; i<o.length; i++) {
		obj.options[i] = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
	}
}

function FindOption(o, val) {
	if (o != null && o.options != null && o.options.length > 0) {
		optionIndex = 0;
		while (optionIndex < o.options.length && !isEqual(val, o.options[optionIndex].value)) {
			optionIndex++; 
		}
		return optionIndex != o.options.length;
	} else {
		return false;
	}
}

function isParentEqual(j, pIndex) {
	
	if (j>-1 && pIndex>=0) {
		pobj = document.getElementById(ddNames[pIndex]);
		arVal = pobj.options[pobj.selectedIndex].value
		return isEqual(arVal, arData[j][pIndex]);
	}
	else
		return true;
}


function isEqual(arVal, selVal) {
	if (arVal != null && arVal !='')
	val = (arVal.indexOf('<@>') != -1) ? arVal.substr(arVal.indexOf('<@>')+3) : arVal;
	return val == selVal;
}

function GetNewOption(val) {
	if (val.indexOf('<@>')!= -1) { //--- translation available -----------------
		items = val.split('<@>');
		return new Option(items[0], items[1], false, false);
	}
	else
		return new Option(val, val, false, false);
}

function isValidUndependantLine(arLine) {
	rval = true;
	uIndex = 0;
	while (uIndex < ddUndependentLinks.length && rval){
		rval = rval && (selUndependentArray[uIndex] == null || selUndependentArray[uIndex] == '' || selUndependentArray[uIndex] == arLine[ddUndependentLinks[uIndex]])
		uIndex++; 
	}
	return rval;
}
function isValidDependantLine(arLine) {
	rval = true;
	uIndex = 0;
	while (uIndex < ddDependentLinks.length && rval){
		rval = rval && (selDependentArray[uIndex] == null || selDependentArray[uIndex] == '' || selDependentArray[uIndex] == arLine[uIndex])
		uIndex++; 
	}
	return rval;
}

function FindDependantSelectedIndexByValue(o, selColIndex) {
	if (o != null && o.options != null && o.options.length > 0) {
	 selDependentArray[selColIndex]
		if (o.options.length == 1) {
			return 1;
		}
		ii = 0;
		while (ii<arData.length && !isValidDependantLine(arData[ii])) {ii++}

		var rIndex = 0;
		while (rIndex < o.options.length && o.options[rIndex].value != arData[ii][selColIndex]) {rIndex++;}
		return (rIndex != o.options.length) ? rIndex : 0;
	} else
		return -1;
}
function FindUndependantSelectedIndexByValue(o, selColIndex) {
	if (o != null && o.options != null && o.options.length > 0) {
		if (o.options.length == 1) {
			return 1;
		}
		ii = 0;
		while (ii<arData.length && !isValidUndependantLine(arData[ii])) {ii++}

		rIndex = 0;
		while (rIndex < o.options.length && o.options[rIndex].value != arData[ii][selColIndex]) {rIndex++;}
		return (rIndex != o.options.length) ? rIndex : 0;
	} else
		return -1;
}

//===========================================================================================
function Initialize() {
 if (
	arData != null && arData.length > 0 &&
	allTr != null && allTr.length > 0 &&
	ddNames != null && ddNames.length > 0
 ) {
	for(colIndex=0;colIndex<ddNames.length;colIndex++) {
		obj = document.getElementById(ddNames[colIndex]);
		obj.options.length = 0;
		
		for (j=0;j<arData.length;j++) {
			if (!FindOption(obj, arData[j][colIndex])) {
				obj.options[obj.options.length] = GetNewOption(arData[j][colIndex]);
			}
		}
		sortSelect(obj);
		obj.options.add(new Option(allTr[colIndex], '', false, true), 0);
	}
 }
}


function UpdateDependantChanges(selColIndex) {
	if (
		arData != null && arData.length > 0 &&
		allTr != null && allTr.length > 0 &&
		ddNames != null && ddNames.length > 0
	) {
		selDependentArray = new Array();
		obj = document.getElementById(ddNames[selColIndex]);
		selValue = obj.options[obj.selectedIndex].value
		if (obj.options[obj.selectedIndex].value == '' && selColIndex > 0 && ddDependentLinks[selColIndex][0] != null) { // select parent.. 
			pobj = document.getElementById(ddNames[ddDependentLinks[selColIndex][0]]);
			selValue = pobj.options[pobj.selectedIndex].value;
			selColIndex = selColIndex - 1;
		}
		selDependentArray[selColIndex] = selValue;
		UpdateDependantParents(selColIndex);
		UpdateDependantChilds(selColIndex);
		UpdateUndependantDropDowns();
		
	}
}

function UpdateDependantChilds(selColIndex) {
	for(colIndex=selColIndex+1;colIndex<ddDependentLinks.length;colIndex++) {
		obj = document.getElementById(ddNames[colIndex]);
		obj.options.length = 0;
		for (j=0;j<arData.length;j++) {
			if (isValidDependantLine(arData[j]) && isValidUndependantLine(arData[j])) {
				if (!FindOption(obj, arData[j][colIndex])) {
					obj.options[obj.options.length] = GetNewOption(arData[j][colIndex]);
				}
			}
		}
		sortSelect(obj);
		obj.options.add(new Option(allTr[colIndex], '', false, true), 0);
		obj.selectedIndex = (obj.options.length == 2)? 1 :0;
	}
}

function UpdateDependantParents(selColIndex) {
	if (ddDependentLinks[selColIndex][0] != null) {
		UpdateDependantParents(ddDependentLinks[selColIndex][0]);
	}
	obj = document.getElementById(ddNames[selColIndex]); 
	if (selColIndex == 0) { // base dd - only selection
		obj.options.selectedIndex = FindDependantSelectedIndexByValue(obj,selColIndex);
	} else { // child dd
		obj.options.length = 0;
		for (j=0;j<arData.length;j++) {
			if (isValidUndependantLine(arData[j])) {
				if (isParentEqual(j, ddDependentLinks[selColIndex][0]) && !FindOption(obj, arData[j][selColIndex])) {
					obj.options[obj.options.length] = GetNewOption(arData[j][selColIndex]);
				}
			}
		}
		sortSelect(obj);
		obj.options.add(new Option(allTr[selColIndex], '', false, true), 0);
		obj.options.selectedIndex = FindDependantSelectedIndexByValue(obj, selColIndex);
		
	}
}

function UpdateUndependantDropDowns() {
	for(colIndex=0;colIndex<ddUndependentLinks.length;colIndex++) {
		obj = document.getElementById(ddNames[ddUndependentLinks[colIndex]]);
		obj.options.length = 0;
		for (j=0;j<arData.length;j++) {
			if (isValidDependantLine(arData[j]) && isValidUndependantLine(arData[j])) {
				if (!FindOption(obj, arData[j][ddUndependentLinks[colIndex]])) {
					obj.options[obj.options.length] = GetNewOption(arData[j][ddUndependentLinks[colIndex]]);
				}
			}
		}
		sortSelect(obj);
		obj.options.add(new Option(allTr[ddUndependentLinks[colIndex]], '', false, true), 0);
		obj.selectedIndex = FindUndependantSelectedIndexByValue(obj, colIndex);
	}
}
//===========================================================================================

function UpdateUndependantChanges(selColIndex) {
	if (
		arData != null && arData.length > 0 &&
		allTr != null && allTr.length > 0 &&
		ddNames != null && ddNames.length > 0
	) {
		for(colIndex=0;colIndex<ddUndependentLinks.length;colIndex++) {
			obj = document.getElementById(ddNames[ddUndependentLinks[colIndex]]);
			selUndependentArray[colIndex] = obj.options[obj.selectedIndex].value;
		}
		
		for(colIndex=0;colIndex<ddNames.length;colIndex++) {
			if (colIndex != selColIndex) {
				obj = document.getElementById(ddNames[colIndex]);
				obj.options.length = 0;
				for (j=0;j<arData.length;j++) {
					if (isValidUndependantLine(arData[j])) {
						if (!FindOption(obj, arData[j][colIndex])) {
							obj.options[obj.options.length] = GetNewOption(arData[j][colIndex]);
						}
					}
				}
				sortSelect(obj);
				obj.options.add(new Option(allTr[colIndex], '', false, true), 0);
	//			if (obj.options.length == 2) {
	//				obj.options.selectedIndex = 1;
	//			}
			}
		}
		
		if (selDependentArray != null && selDependentArray.length > 0) {
			i=0;
			while (selDependentArray[i] == null || selDependentArray[i] == '') {i++;}
			if (i<selDependentArray.length) {
				UpdateDependantParents(i);
				UpdateDependantChilds(i);
				UpdateUndependantDropDowns();
			}	
		}
		
		for(colIndex=0;colIndex<ddNames.length;colIndex++) {
			obj = document.getElementById(ddNames[colIndex]);
			if (obj.options.selectedIndex == 0 && obj.options.length == 2) {
				obj.options.selectedIndex = 1;
			}
		}
	}
}
