function GetBrowser(){
	var Brs;
	var Done;
	Brs=navigator.appName+navigator.appVersion+navigator.userAgent;

		switch (navigator.appName){
		case "Netscape":
			if (Brs.indexOf("Opera 5",0) !=-1){return "OP5"}
			if (Brs.indexOf("Netscape4",0) !=-1){return "NN4"}
			if (Brs.indexOf("Netscape6",0) !=-1){return "NN6"}
			if (Brs.indexOf("Galeon",0) !=-1){return "GAL"}
			if (Brs.indexOf("Nautilus",0) !=-1){return "NAU"}
		break;
		case "Microsoft Internet Explorer":
			if (Brs.indexOf("Opera 5",0) !=-1){return "OP5"}
			if (Brs.indexOf("MSIE 9",0) !=-1){return "IE9"}
			if (Brs.indexOf("MSIE 8",0) !=-1){return "IE8"}
			if (Brs.indexOf("MSIE 7",0) !=-1){return "IE7"}
			if (Brs.indexOf("MSIE 6",0) !=-1){return "IE6"}
			if (Brs.indexOf("MSIE 5",0) !=-1){return "IE5"}
			if (Brs.indexOf("MSIE 4",0) !=-1){return "IE4"}
		break;
		case "Opera":
			if (Brs.indexOf("Opera/5",0) !=-1){return "OP5"}
		break;
		case "Konqueror":
		return "KO2";
		break;
		//case "Mozilla":
		//break;
		default: return "Other";
	}
}

function FillFirstCombo(FormObj, Index, Fixed, FieldName, HiddenCtrl, ClearFirst, CurrentValueArray, CtrlObj, Arr, ValueList){
	var RecordFound, BlankValue, DoClear
	var IsMultiple
	var ValueArr
	var CantEncontrados

	try{
		IsMultiple = CtrlObj.multiple
	}catch(exception){
		IsMultiple = false
	}

	BlankValue = (Index == '')
	DoClear = false
	ubound = Arr.length
	
	if(IsMultiple){
		ValueArr = ValueList.split(', ')

		try{
			ValueArr.length
			IsMultiple = (ValueArr.length > 1)
		}catch(exception){
			IsMultiple = false
		}
	}

	if (!Fixed){
		while (CtrlObj.options.length > 0){
			CtrlObj.options[0] = null
		}

		if (ubound > 1){
			for (i = 1; i < ubound; i++){
				NewOption = new Option(Arr[i][1], Arr[i][0])
				CtrlObj.options[i-1] = NewOption
				if(GetBrowser().indexOf("NN", 0) == -1){
					CtrlObj.options[i-1].style.backgroundColor = Arr[i][2]
					CtrlObj.options[i-1].style.color = Arr[i][3]
				}
			}

			if(!IsMultiple){
				CtrlObj.selectedIndex = 0
			}
			CantEncontrados = 0
			RecordFound = false
			for (i = 0; i < CtrlObj.options.length; i++){
				if(IsMultiple){
					for(j=0;j < ValueArr.length;j++){
						if (CtrlObj.options[i].value.toString() == ValueArr[j]){
							CtrlObj.options[i].selected = true
							CantEncontrados++
							RecordFound = true
							break;
						}
					}
					if(CantEncontrados == ValueArr.length)
							break;
				}else{
					if (CtrlObj.options[i].value.toString() == Index){
						CtrlObj.selectedIndex = i
						RecordFound = true
						break
					}
				}
			}
			if (!RecordFound){
				DoClear = true
			}
			if (BlankValue){
				if (ClearFirst)
					DoClear = true
				else
					DoClear = false
			}
			if (DoClear){
				CtrlObj.selectedIndex = -1
			}
		}
		else{
			NewOption = new Option('Datos no disp.', '#xsnodata#')
			CtrlObj.options[0] = NewOption
			CtrlObj.disabled = true
		}
	}
}

function FillSecondCombo(Index, Fixed, FirstComboCtrl, SecondComboCtrl, ClearFirst, FirstHidden, SecondHidden, DisplayTxtCtrl, IsFirstCtrlHidden, Arr){
	var FirstComboValue
	var Vacio, RecordFound, BlankValue, FirstHiddenExist, Disable, DoClear, ok, NoRecords, DisplayTextCtrlExist
	var FirstCombo, SecondCombo
	var SecondComboHidden
	var AuxTxt = ''
	var Texto
	//var counter = 0
	Texto = ''
	DisplayTextCtrlExist = false
	NoRecords = false
	BlankValue = (Index == '')
	FirstComboValue = ''
	FirstHiddenExist = false
	Disable = false
	
	// Si existe un hidden del primer combo
	if (FirstHidden && FirstHidden.type == 'hidden'){
		// Se toma el valor del primer combo
		FirstComboValue = FirstHidden.value
		FirstHiddenExist = true
	}
	// Si el primer control es un hidden y no un combo
	if(IsFirstCtrlHidden){
		// Verifico que exista el control como hidden
		if(FirstComboCtrl && FirstComboCtrl.type == 'hidden'){
			// Recupero su valor y lo trato como si fuese un hidden del primer combo
			FirstComboValue = FirstComboCtrl.value
			FirstHiddenExist = true
		}
	}
	// Si existe un hidden del segundo combo entonces debe estar deshabilitado
	//' Leo - Jue 6 Feb 2003  - 10:56:25 A
	//***************************************
	//if (SecondHidden && FirstHidden.type == 'hidden'){
	//***************************************
	if (SecondHidden && FirstHidden && FirstHidden.type == 'hidden'){
		Disable = true
		SecondComboHidden = SecondHidden
	}
	// Si existe el hidden que guarda el texto del combo
	if (DisplayTxtCtrl){// && FirstHidden.type == 'hidden'
		DisplayTextCtrl = DisplayTxtCtrl
		DisplayTextCtrlExist = true
	}

	// Si el elemento actual es un combo
	if (FirstComboCtrl && (FirstComboCtrl.type == 'select-one' || FirstComboCtrl.type == 'select-multiple')){
		// Si el nombre es el del primer combo
		// Guardo la referencia al elemento
		FirstCombo = FirstComboCtrl
	}
	if (SecondComboCtrl && (SecondComboCtrl.type == 'select-one' || SecondComboCtrl.type == 'select-multiple')){
		// Si el nombre es el del segundo combo
		// Guardo la referencia al elemento
		SecondCombo = SecondComboCtrl
	}
	// Si no existe un hidden del primer combo y este tiene un valor seleccionado
	if ((!FirstHiddenExist) && (FirstCombo.selectedIndex > -1)){
		// Tomo el valor del primer combo
		FirstComboValue = FirstCombo.options[FirstCombo.selectedIndex].value
	}
	// Si el segundo combo no esta fijo
	if (!Fixed){
		// Borro todos los elementos del segundo combo
		while (SecondCombo.options.length > 0){
			SecondCombo.options[0] = null
		}
	}
	ok = false
	for (i = 1; i < Arr.length; i++){
		if (Arr[i][1] == FirstComboValue){
			ok = true
			// Si el segundo combo no esta fijo
			if (!Fixed){
				// Lo llendo con el array
				for(j = 1; j < Arr[i][2].length; j++){
					if (AuxTxt == ''){
						AuxTxt = Arr[i][2][j][1]
					}
					NewOption = new Option(Arr[i][2][j][1], Arr[i][2][j][0])
					SecondCombo.options[j-1] = NewOption
					if(GetBrowser().indexOf("NN", 0) == -1){
						SecondCombo.options[j-1].style.backgroundColor = Arr[i][2][j][2]
						SecondCombo.options[j-1].style.color = Arr[i][2][j][3]
					}
					SecondCombo.disabled = Disable

					if (Index.toLowerCase() == Arr[i][2][j][0].toLowerCase()){
						Texto = Arr[i][2][j][1]
					}
				}
			}
		}
		else{
			/*
				Si no se encuentra el valor del segundo combo en el array quiere decir que para este valor
				no existen registros hijos
			*/
			NoRecords = true
		}
	}
	Vacio = false
	/*
		Si el primero combo no tiene datos, o el array del segundo no tiene datos, o el primero tiene un
		valor seleccionado pero este no tiene ningun hijo en el segundo
	*/
	if (!FirstHiddenExist){
		if (FirstComboValue == '#xsnodata#' || Arr.length == 0 || (FirstCombo.selectedIndex != -1 && !ok)){
			// Debe estar vacio
			Vacio = true
		}
	}
	// Si esta vacio o no hay ningun hijo para el padre
	if (Vacio || !ok){
		// Si el segundo combo no esta fijo
		if (!Fixed){
			// Le agrego la opcion de error
			NewOption = new Option('Datos no disp.', '#xsnodata#')
			SecondCombo.options[0] = NewOption
			SecondCombo.disabled = true
		}
	}
	// Si el primer combo no tiene valor
	if (FirstComboValue == ''){
		// Se omite el valor default de el segundo
		Index = ''
	}
	// Si el segundo combo no esta fijo
	if (!Fixed){
		SecondCombo.selectedIndex = 0
		DoClear = false
		RecordFound = false
		// Recorro el array
		for (i = 0; i < SecondCombo.options.length; i++){
			// Si encuentro el valor default en el array
			if (SecondCombo.options[i].value.toString() == Index){
				// Defino el valor en el que se para
				SecondCombo.selectedIndex = i
				if (Texto != '' && DisplayTextCtrlExist){
					DisplayTextCtrl.value = Texto
				}
				RecordFound = true
				break
			}
		}
		if (!RecordFound && DisplayTextCtrlExist){
			DisplayTextCtrl.value = AuxTxt
		}
		/*
			Si el registro fue encontrado y, o no esta vacio y se debe limpiar la primera ocpcion, o no vino
			vacio, lo que significa que es un valor no valido
		*/
		if (!RecordFound && ((!Vacio && ClearFirst) || (!BlankValue && !NoRecords))){
			// Se limpia la primera opcion del segundo
			DoClear = true
		}
		if (DoClear){
			SecondCombo.selectedIndex = -1
		}
	}
	return Index
}

function FillThirdCombo(Index, Fixed, FirstComboCtrl, SecondComboCtrl, ThirdComboCtrl, ClearFirst, FirstHidden, SecondHidden, ThirdHidden, DisplayTxtCtrl, FirstCtrlIsHidden, SecondCtrlIsHidden, Arr){
	var MasterObjectValue, SlaveMasterObjectValue
	var RecordFound, Vacio, DoClear, BlankValue, Disable, SecondHiddenExist, FirstHiddenExist, ok, NoRecords, DisplayTextCtrlExist
	var FirstCombo, SecondCombo, ThirdCombo
	var ThirdComboHidden
	var AuxTxt = ''
	var Texto

	Texto = ''
	NoRecords = false
	BlankValue = (Index == '')
	Vacio = false
	RecordFound = false
	MasterObjectValue = ''
	SlaveMasterObjectValue = ''
	FirstHiddenExist = false
	SecondHiddenExist = false
	Disable = false
	//Busco el hidden del primer combo
	if (FirstHidden && FirstHidden.type == 'hidden'){
		MasterObjectValue = FirstHidden.value
		FirstHiddenExist = true
	}

	// Si el primer control es un hidden y no un combo
	if(FirstCtrlIsHidden){
		// Verifico que exista el control como hidden
		if(FirstComboCtrl && FirstComboCtrl.type == 'hidden'){
			// Recupero su valor y lo trato como si fuese un hidden del primer combo
			MasterObjectValue = FirstComboCtrl.value
			FirstHiddenExist = true
		}
	}
	//Busco el hidden del segundo combo
	if (SecondHidden && SecondHidden.type == 'hidden') {
		SlaveMasterObjectValue = SecondHidden.value
		SecondHiddenExist = true
	}
	// Si el segundo control es un hidden y no un combo
	if(SecondCtrlIsHidden){
		// Verifico que exista el control como hidden
		if(SecondComboCtrl && SecondComboCtrl.type == 'hidden'){
			// Recupero su valor y lo trato como si fuese un hidden del segundo combo
			SlaveMasterObjectValue = SecondComboCtrl.value
			SecondHiddenExist = true
		}
	}
	// Busco el hidden del tercer combo
	if (ThirdHidden && ThirdHidden.type == 'hidden') {
		Disable = true
		ThirdComboHidden = ThirdHidden
	}
	// Recupero el primer combo
	if (FirstComboCtrl && (FirstComboCtrl.type == 'select-one' || FirstComboCtrl.type == 'select-multiple')){
		// Si el nombre es el del primer combo
		// Guardo la referencia al elemento
		FirstCombo = FirstComboCtrl
	}
	//Recupero el segundo combo
	if (SecondComboCtrl && (SecondComboCtrl.type == 'select-one' || SecondComboCtrl.type == 'select-multiple')){
		// Si el nombre es el del segundo combo
		// Guardo la referencia al elemento
		SecondCombo = SecondComboCtrl
	}
	//Recupero el tercer combo
	if (ThirdComboCtrl && (ThirdComboCtrl.type == 'select-one' || ThirdComboCtrl.type == 'select-multiple')){
		// Si el nombre es el del segundo combo
		// Guardo la referencia al elemento
		ThirdCombo = ThirdComboCtrl
	}
	// Si existe el hidden que guarda el texto del combo
	if (DisplayTxtCtrl){// && FirstHidden.type == 'hidden'
		DisplayTextCtrl = DisplayTxtCtrl
		DisplayTextCtrlExist = true
	}
	// Si no hay un hidden del primero
	if (!FirstHiddenExist){
		// Si el primer combo tiene un valor seleccionado
		if (FirstCombo.selectedIndex > -1){
			// Tomo el valor del primer combo
			MasterObjectValue	= FirstCombo.options[FirstCombo.selectedIndex].value
		}
	}
	// Si no hay un hidden del segundo
	if (!SecondHiddenExist){
		// Si el segundo combo tiene un valor seleccionado
		if (SecondCombo.selectedIndex > -1){
			// Tomo el valor del segundo combo
			SlaveMasterObjectValue = SecondCombo.options[SecondCombo.selectedIndex].value
		}
	}
	// Si el tercer combo no esta fijo
	if (!Fixed){
		// Borro las opciones del tercer combo
		while (ThirdCombo.options.length > 0){
			ThirdCombo.options[0] = null
		}
	}
	// Si alguno de los padres no tiene valor entonces borro el valor default de el tercer combo
	if (SlaveMasterObjectValue == '' || MasterObjectValue == ''){
		Index = ''
	}
	ok = false
	for (i = 1; i < Arr.length; i++){
		if (Arr[i][1] == MasterObjectValue){
			for(j = 1; j < Arr[i].length; j++){
				if (Arr[i][j][1] == SlaveMasterObjectValue){
					ok = true
					for(k = 1; k < Arr[i][j][2].length; k++){
						// Si el tercer cobmo no esta fijo le voy agregando opciones
						if (!Fixed){
							if (AuxTxt == ''){
								AuxTxt = Arr[i][j][2][k][1]
							}
							NewOption = new Option(Arr[i][j][2][k][1], Arr[i][j][2][k][0])
							ThirdCombo.options[k-1] = NewOption
							ThirdCombo.disabled = Disable
							if(GetBrowser().indexOf("NN", 0) == -1){
								ThirdCombo.options[k-1].style.backgroundColor = Arr[i][j][2][k][2]
								ThirdCombo.options[k-1].style.color = Arr[i][j][2][k][3]
							}
							if (Index.toLowerCase() == Arr[i][j][2][k][0].toLowerCase()){
								Texto = Arr[i][j][2][k][1]
							}
						}		
					}
				}
				else{
					/*
						Si no se encuentra el valor del segundo combo en el array quiere decir que para este valor
						no existen registros hijos
					*/
					NoRecords = true
				}
			}
		}
	}
	/*
		Si alguno de los padres esta vacio, o el array no tiene valores, o el segundo combo tiene un valor
		seleccionado pero no tiene ningun valor disponible en el tercer combo,  este ultimo debe aparecer
		como vacio
	*/
	if (!SecondHiddenExist){
		if (MasterObjectValue == '#xsnodata#' || SlaveMasterObjectValue == '#xsnodata#' || Arr.length==0 || (SecondCombo.selectedIndex != -1 && !ok)){
			Vacio = true
			NoRecords = true
		}
	}
	// Si debe estar vacio o no tiene valor
	if (Vacio || !ok){
		// Si no existe un hidden del tercer combo
		if (!Fixed){
			// Se agrega la opcion de error
			NewOption = new Option('Datos no disp.', '#xsnodata#')
			ThirdCombo.options[0] = NewOption
			ThirdCombo.disabled = true
		}
	}
	// Si no existe un hidden del tercer combo
	if (!Fixed){
		DoClear = false
		// Defino el valor a mostrarse por default
		for (i = 0; i < ThirdCombo.options.length; i++){
			if (ThirdCombo.options[i].value.toString() == Index){
				ThirdCombo.selectedIndex = i
				if (Texto != '' && DisplayTextCtrlExist){
					DisplayTextCtrl.value = Texto
				}
				RecordFound = true
				break
			}
		}
		if (!RecordFound && DisplayTextCtrlExist){
			DisplayTextCtrl.value = AuxTxt
		}
		/*
			Si no debe estar vacio, y no se encontro el valor default y, o no debe haber ninguno seleccionado
			por default, o el valor que llega no es valido, entonces se vacia el default
		*/
		if (!RecordFound && ((!Vacio && ClearFirst) || (!BlankValue && !NoRecords))){
			DoClear = true
		}
		if (DoClear){
			ThirdCombo.selectedIndex = -1
		}
	}
	return Index
}
