var unitopform = {
	getParamById : function (myId, paramList) {
	/************************************************************************************/
	/* @TITLE
	/*	Ermittle einen Parameter aus einer Parameterliste
	/*
	/* @SYNOPSIS
	/*  getParamById('TOPIC', paramList);
	/*
	/* @DESCRIPTION
	/*	Ermittelt einen Parameter aus einer Parameterliste der JSON-Objektstruktur
	/*  gem. Spezifikation
	/*
	/* @PARAM myId
	/*	Id des Parameters als String
	/*
	/* @PARAM paramList
	/*	Parameterliste als JSON-Objektstruktur
	/*
	/*************************************************************************************/
		for (var i = 0; i < paramList.length; i++) {
			if (paramList[i].id == myId) {
				return paramList[i];
			}
		}	
	},

	getQueryValuesById : function (myId, queryValueList) {
	/************************************************************************************/
	/* @TITLE
	/*	Ermittle die Werte eines Parameters aus der JSON-Struktur
	/*
	/* @SYNOPSIS
	/*  getQueryValuesById('TOPIC', queryValueList);
	/*
	/* @DESCRIPTION
	/*	Ermittle die Werte eines Parameters aus der JSON-Struktur
	/*
	/* @PARAM myId
	/*	Id des Parameters als String
	/*
	/* @PARAM paramList
	/*	JSON-Struktur
	/*
	/*************************************************************************************/	
		/* Spezialbehandlung für SEARCHWORD */
		if (myId != 'SEARCHWORD') {
			if (queryValueList.parameterAssignments) {
				for (var i = 0; i < queryValueList.parameterAssignments.length; i++) {
					if (queryValueList.parameterAssignments[i].parameterId == myId) {
						return queryValueList.parameterAssignments[i].values;
					}
				}
			} else {
				/* Leeres Array zurückgeben , falls keine parameterAssignments gefunden werden */
				return new Array();
			}
		} else {
			if (queryValueList.terms) {
				return queryValueList.terms;
			} else {
				/* Leeres Array zurückgeben , falls keine terms gefunden werden */
				return new Array();
			}
		}
				
	},

	refillTextBox : function (textBoxName, paramName, queryValueList) {
	/************************************************************************************/
	/* @TITLE
	/*	Befülle eine Textbox mit den Werten aus der JSON-Struktur
	/*
	/* @SYNOPSIS
	/*  refillTextBox('DOCENT', 'DOCENT', queryValueList);
	/*
	/* @DESCRIPTION
	/*	Befülle eine Textbox mit den Werten eines Parameters aus der JSON-Struktur
	/*
	/* @PARAM textBoxName
	/*	Id der Textbox
	/*
	/* @PARAM paramName
	/*	Id des Parameters in der JSON-Struktur
	/*
	/* @PARAM queryValueList
	/*	JSON-Struktur
	/*
	/*************************************************************************************/	
		var textBoxElement = getElement(textBoxName);
		var textBoxValues = this.getQueryValuesById(paramName, queryValueList);
		var textBoxValue = '';
		if (textBoxValues.length > 0) {
			textBoxValue = textBoxValues.join(' ');
		}
		textBoxElement.value = textBoxValue;
	},

	refillRadioButtons : function (radioName, paramName, queryValueList, formName) {
	/************************************************************************************/
	/* @TITLE
	/*	Befülle Radiobuttons/Checkboxen mit den Werten aus der JSON-Struktur
	/*
	/* @SYNOPSIS
	/*  refillRadioButtons('SEGMENT', 'SEGMENT', queryValueList, formName);
	/*
	/* @DESCRIPTION
	/*	Befülle Radiobuttons/Checkboxen mit den Werten eines Parameters aus der JSON-Struktur
	/*
	/* @PARAM radioName
	/*	Id der Radiobuttons/Checkboxen
	/*
	/* @PARAM paramName
	/*	Id des Parameters in der JSON-Struktur
	/*
	/* @PARAM queryValueList
	/*	JSON-Struktur
	/*
	/* @PARAM formName
	/*	Name des Formulars
	/*
	/*************************************************************************************/	
		var radioElements = getElements(radioName, formName);
		var radioValues = this.getQueryValuesById(paramName, queryValueList);
		
		/* Um einfacher feststellen zu können, welche Radio-Buttons angehakt sein müssen,  */
		/* werden zunächst die Werte aus dem JSON-Objekt mit Trennzeichen gejoined ...     */
		var radioValuesString = "|" + radioValues.join("|") + "|";
		for (var i = 0; i < radioElements.length; i++) {
			
			/* ... und dann in einer Schleife über indexOf geprüft, ob der gerade verarbeitete */
			/* Radio-Button in dem String enthalten ist                                        */
			if (radioValuesString.indexOf("|" + radioElements[i].value + "|") >= 0) {				
				radioElements[i].checked=true;
			} else {
				radioElements[i].checked=false;
			}
		}
	},

	refillSelectBox : function (selectName, paramName, paramList, queryValueList) {
	/************************************************************************************/
	/* @TITLE
	/*	Befülle Selectboxen mit den Werten aus der JSON-Struktur
	/*
	/* @SYNOPSIS
	/*  refillSelectBox('TOPIC._', 'TOPIC', paramList, queryValueList);
	/*
	/* @DESCRIPTION
	/*	Befüllt Selectboxen mit den Werten eines Parameters aus der JSON-Struktur
	/*
	/* @PARAM selectName
	/*	Id der Selectbox
	/*
	/* @PARAM paramName
	/*	Id des Parameters in der JSON-Struktur
	/*
	/* @PARAM paramList
	/*	Liste der in der Selectbox bereits ausgewählten Values
	/*
	/* @PARAM queryValueList
	/*	JSON-Struktur
	/*
	/*************************************************************************************/	

		var selectElement = getElement(selectName);

		
		/* Generiere ein sortiertes Array mit allen enthaltenen Optionen */
		var oldSelectValues = Array();
		for (var j = 0; j < selectElement.length; j++) {
			oldSelectValues.push(selectElement[j].value);
		}
		oldSelectValues.sort();

		/* Generiere ein sortiertes Array mit allen ausgewählten Werten */
		var selectedValues = this.getQueryValuesById(paramName, queryValueList);
		if (!(selectedValues instanceof Array)) {
			selectedValues = new Array();
		}
		if (selectElement.hiddenOptions) {
			for (var i = 0; i < selectElement.hiddenOptions.length; i++) {
				selectedValues.push(selectElement.hiddenOptions[i]);
			}
		}
		var selectedValueMap = {};
		for (var i = 0; i < selectedValues.length; i++) {
			selectedValueMap[selectedValues[i]] = true;
		}
		
		/* Generiere ein sortiertes Array mit allen neuen Optionen */
		var param = this.getParamById(paramName, paramList);
		var selectValues = Array();
		var newSelectValues = Array();
		if (param) {
			for (var i = 0; i < param.values.length; i++) {
				selectValues.push(Array(param.values[i].value, param.values[i].label));
				newSelectValues.push(param.values[i].value);
			}
		}
		newSelectValues.sort();
		

		/* Wenn die alten Optionen mit den neuen Optionen nicht übereinstimmen und neue Optionen uebertragen wurden ... */
		if (oldSelectValues.join("|") != newSelectValues.join("|") && newSelectValues.length > 0) {			

			/* Ersetze die alten Optionen durch die neuen und selektiere die bisherigen Werte */
			refillSelection(selectName, selectValues);
			for (var k = 0; k < selectElement.length; k++) {
				if (selectedValueMap[selectElement[k].value]) {
					selectElement[k].selected=true;
					delete selectedValueMap[selectElement[k].value];
				}
			}			
			var hiddenOptions = [];
			for (var i in selectedValueMap) {
				hiddenOptions.push(i); 
			}
			selectElement.hiddenOptions = hiddenOptions;
		}
	},
	
	getParams : function (uid, sid, searchQuery, ajax, changedParameterId, formName) {
	/************************************************************************************/
	/* @TITLE
	/*	Hole die Such-Parameter über JSON-Ajax
	/*
	/* @SYNOPSIS
	/*  CHAMAELEON.resourceCall('unitopform:unitopform','getParams',login,sessionid,searchQueryObj,ajax,changedParameterId,formName);
	/*
	/* @DESCRIPTION
	/*	Holt die Such-Parameter über JSON-Ajax von der angegebenen URL
	/*
	/* @PARAM uid
	/*	Login des Benutzers
	/*
	/* @PARAM sid
	/*	SessionId des Benutzers
	/*
	/* @PARAM searchQuery
	/*	JSON-Objekt-Struktur mit den Suchparametern
	/*
	/* @PARAM ajax
	/*	AJAX-URL
	/*
	/* @PARAM changedParameterId
	/*	Id des geänderten Formularelementes
	/*
	/* @PARAM formName
	/*	Name des Formulars
	/*
	/*************************************************************************************/	
		
		if (changedParameterId != '') {
			/* Standard-Aufruf: */

			/* SuchParameter in verstecktes Textfeld schreiben */
			window.savedSearchParamsL = JSONHelper.serialize(searchQuery);
		} else {
			/* Initialer Aufruf: */

			/* für EShop: searchQuery wird mit den Daten aus dem versteckten Textfeld belegt */ 
			if (window.savedSearchParamsL) {
				searchQuery = JSONHelper.deserialize(window.savedSearchParamsL);
			}

		}

		/* Aufbau der JSON-Struktur */
		var searchQueryObj = {
			formState : searchQuery,
			vrbSessionId : {
				uid : uid,
				sid : sid
			},
			changedParameterId : changedParameterId
		};
		
		/* Übergabe per HTTP */
		var req = new XMLHttpRequest();
		var params = { 
			aktion : 'getParameterConfig',
			searchSystemType : 'seminardb',
			searchSystemUrl : '',
			stateParams : JSONHelper.serialize(searchQueryObj)
		};
		
		
        var newparams = "";
        for (var k in params) {
            var v = params[k];
            if (v instanceof Array) {
                for (var i = 0; i < v.length; i++) {
                    if (v[i] != undefined) {
                        newparams += encodeURIComponent(k) + "=" + encodeURIComponent(v[i]) + "&";
                    }
                }
            } else if (v != undefined) {
                newparams += encodeURIComponent(k) + "=" + encodeURIComponent(v) + "&";
            }
        }
        params = newparams;

        var request = new XMLHttpRequest;
        request.open("POST", ajax, true);
        request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
        request.onreadystatechange = function() {
        	if (request.readyState == 4) unitopform.parseRequest(changedParameterId, formName, request);
        };
        request.send(params);
	},
		
	parseRequest : function (changedParameterId, formName, req) {
	/************************************************************************************/
	/* @TITLE
	/*	Wird mit dem Ergebnis der Anfrage "gefüttert"
	/*
	/* @SYNOPSIS
	/*  CHAMAELEON.resourceCall('unitopform:unitopform', 'parseRequest', changedParameterId, formName, req);
	/*
	/* @DESCRIPTION
	/*	Wird mit dem Ergebnis der Anfrage "gefüttert"
	/*
	/* @PARAM changedParameterId
	/*	Id des geänderten Formularelementes
	/*
	/* @PARAM formName
	/*	Name des Formulars
	/*
	/* @PARAM req
	/*	Das Ergebnis der HTTP-Anfrage
	/*
	/*************************************************************************************/	
		if (req.status == 200) {
			
			/* SuchParameter aus dem Request auslesen */
			var tmp = JSONHelper.deserialize(req.responseText);

			if (tmp.result) {
				var paramList = tmp.result.paramList;
				
				/* SuchParameter-Werte aus dem verstecktes Textfeld auslesen */
				var queryValueList = window.savedSearchParamsL ? JSONHelper.deserialize(window.savedSearchParamsL) : {};
							
				if (document.getElementById('TOPIC._') && document.getElementById('AUDIENCE._') && document.getElementById('EVENTTYPE._') && document.getElementById('SEARCHWORD') && document.getElementById('DATEBEGIN') && document.getElementById('DATEEND') && document.getElementById('DOCENT') && document.getElementById('SEMNO') && document.getElementById('SEGMENT_1') && document.getElementById('SEGMENT_2') && document.getElementById('NEW')) {
					/* Selectboxen befüllen */
					this.refillSelectBox('TOPIC._', 'TOPIC', paramList, queryValueList);
					this.refillSelectBox('AUDIENCE._', 'AUDIENCE', paramList, queryValueList);
					this.refillSelectBox('EVENTTYPE._', 'EVENTTYPE', paramList, queryValueList);
											
					/* für EShop: Formularelemente mit den in dem versteckten Textbox abgelegten Werten belegen */ 
					if (changedParameterId == '' && window.savedSearchParamsL) {
	
						this.refillTextBox('SEARCHWORD', 'SEARCHWORD', queryValueList);
						this.refillTextBox('DATEBEGIN', 'DATEBEGIN', queryValueList);
						this.refillTextBox('DATEEND', 'DATEEND', queryValueList);
						this.refillTextBox('DOCENT', 'DOCENT', queryValueList);
						this.refillTextBox('SEMNO', 'SEMNO', queryValueList);
		
						this.refillRadioButtons('SEGMENT', 'SEGMENT', queryValueList, formName);
						this.refillRadioButtons('NEW', 'NEW', queryValueList, formName);
					}				
				}						
							
				if (getElement('COLUMN._') && changedParameterId == '') {
					/* Spaltenauswahl-Element befüllen */
					var columnSelect = getElement('COLUMN._');
					var columnSelected = {};
					for (var i = 0; i < columnSelect.length; i++) {
						if (columnSelect[i].selected) {
							columnSelected[columnSelect[i].value] = true; 
						}
					}
					var columnList = tmp.result.columns;
					var columnKeyList = Array();
					for (var c in columnList) {
						columnKeyList.push(Array(columnList[c].key, columnList[c].value));				
					}
					refillSelection('COLUMN._', columnKeyList);
					for (var k = 0; k < columnSelect.length; k++) {
						columnSelect[k].selected = !!columnSelected[columnSelect[k].value];
					}
				}
			}			

		} else {
			// Fehlertext anzeigen
			alert("Die Suche kann zur Zeit nicht verwendet werden.");
		}
	}
};
