function getElement(name, formName) {
	// Ist Element? wenn aj, zurückgeben
	if (name.ownerDocument) return name;
	if (formName) {
		var r = document.forms[formName].elements[name];
		return r.ownerDocument ? r : r[0];
	} else {
		return document.getElementById(name);
	}
}

function getElements(name, formName) {
	if (formName) {
		var r = document.forms[formName].elements[name];
		return r.ownerDocument ? [r] : r;
	} else {
		return [document.getElementById(name)];
	}
}


/************************************************************************************/
/* @DESCRIPTION
/*	Wie lautet der Name des aktuell verwendeten Formulars?
/************************************************************************************/
formName="unitopForm";

/* Spezialfunktionen fuer das Formular */

function setDate(elemName, dateString){
/************************************************************************************/
/* @TITLE
/*	Belege den Value eines Textfeldes mit dem aus einem Kalender-Element ermittelten
/*	Datum
/*
/* @SYNOPSIS
/*	setDate('datum', '2008-01-31');
/*
/* @DESCRIPTION
/*	Erh�lt einen Kalender-Element-konformen Datums-String, wandelt diesen in ein
/*	deutsches Datum im Format 'dd.mm.yyyy' um und �bergibt diesen Wert an ein
/*	Textfeld
/*
/* @PARAM elemName
/*	name/id des Textfeldes
/*
/* @PARAM dateString
/*	Kalender-Element-konformer Datums-String
/*
/*************************************************************************************/
   var date = new Date(dateString);
   var day = date.getDate();
   if(day < 10){ day = "0"+ day; }
   var month = date.getMonth() + 1;
   if(month < 10){ month = "0"+ month; }
   var year = date.getFullYear();
      var hour = date.getHours();
   var outputDateString = day +"."+ month +"."+ year;

   setValue(elemName, outputDateString);
   getElement(elemName).focus();
}

function getDate(elemName){
/************************************************************************************/
/* @TITLE
/*	Generiere aus einem deutschen Datum im Format 'dd.mm.yyyy' aus einem Textfeld
/*	ein Datumsobjekt
/*
/* @SYNOPSIS
/*	getDate('datum');
/*
/* @DESCRIPTION
/*	Generiert aus einem deutschen Datum im Format 'dd.mm.yyyy', das aus einem
/*	Textfeld ausgelesen wurde, ein Datumsobjekt, das z.B. an ein Kalender-Element
/*	weitergegeben werden kann.
/*
/* @PARAM elemName
/*	name/id des Textfeldes
/*
/*************************************************************************************/
   var dateString = getValue(elemName);
   if(!dateString){
       return new Date();
   } else if(dateString.match(/^\s*(\d{1,2})\.(\d{1,2})\.(\d{2,4})/)) {
       var day = RegExp.$1;
       var month = RegExp.$2 - 1;
       var year = RegExp.$3;
       if(year < 1900){
           year = parseInt(year) + 1900;
       }

       return new Date(year, month, day, 0, 0, 0);
   } else {
       return new Date();
   }
}

function openCalendar(elemName, minYear, maxYear){
/************************************************************************************/
/* @TITLE
/*	�ffne ein Kalender-Element
/*
/* @SYNOPSIS
/*	openCalendar('datum', 2008, 2069);
/*
/* @DESCRIPTION
/*	�ffnet ein Kalender-Element, �ber dem angegebenen Textfeld.
/*
/* @PARAM elemName
/*	name/id des Textfeldes
/*
/* @PARAM minYear
/*	erstes anzuzeigendes Jahr
/*
/* @PARAM maxYear
/*	letztes anzuzeigendes Jahr
/*
/*************************************************************************************/
   var datum = getDate(elemName);
   var today = new Date();
   if (CHAMAELEON_CALENDAR.isVisible()) {
	   CHAMAELEON_CALENDAR.hide();
   } else {
	   CHAMAELEON_CALENDAR.render(
               getElement(elemName).parentNode,
               datum,
               function (result) { setDate(elemName, result) },
               false, /* displayTime */
               minYear,
               maxYear
       );
   }
}
			
function getValues(items) {
/************************************************************************************/
/* @TITLE
/*	Extrahiere die Values eines Elementes
/*
/* @SYNOPSIS
/*	getValues(segments);
/*
/* @DESCRIPTION
/*	Extrahiere die Values eines Elementes
/*
/* @PARAM items
/*	Element-Arrays
/*
/*************************************************************************************/
	var values = new Array();
	for (var i=0; i<items.length; i++) {
		if (items[i].checked || items[i].selected) {
			values.push(items[i].value);
		}
	}
	return values;
}

function getOptionLabels(items) {
/************************************************************************************/
/* @TITLE
/*	Extrahiere die Option-Labels einer Selectbox
/*
/* @SYNOPSIS
/*	getValues(segments);
/*
/* @DESCRIPTION
/*	Extrahiere die Values eines Elementes
/*
/* @PARAM items
/*	Element-Arrays
/*
/*************************************************************************************/
	var labels = new Array();
	for (var i=0; i<items.length; i++) {
		if (items[i].selected) {
			labels.push(items[i].text);
		}
	}
	return labels;
}

/* Funktionen zur Ermittlung der aktuellen Formular-Optionen per Ajax */

function generateQueryObject() {
/************************************************************************************/
/* @TITLE
/*	Generiere eine Objektstruktur aus den Formular-Werten gem. Spezifikation.
/*
/* @SYNOPSIS
/*	var queryObj = generateQueryObject();
/*
/* @DESCRIPTION
/*	Generiert eine Objektstruktur aus den Formular-Werten gem. Spezifikation.
/*
/*************************************************************************************/

	// SEGMENTS
	var segments = getElements('SEGMENT',formName);
	var segmentValues = getValues(segments);
	var segmentLabelsTmp = new Array(); 
	for (var s=0; s < segmentValues.length; s++) {
		if (segmentValues[s] == 'WARE') {
			segmentLabelsTmp.push('Ware und Handel');
		}		
		if (segmentValues[s] == 'BANK') {
			segmentLabelsTmp.push('FinanzVerbund');
		}
	}
	var segmentLabels = segmentLabelsTmp.join(", ");

	// TOPICS
	var topics = getElement('TOPIC._',formName).options;
	var topicValues = getValues(topics);
	var topicLabels = getOptionLabels(topics).join(", ");

	// AUDIENCE
	var audience = getElement('AUDIENCE._',formName).options;
	var audienceValues = getValues(audience);
	var audienceLabels = getOptionLabels(audience).join(", ");

	// EVENTTYPE
	var semType = getElement('EVENTTYPE._',formName).options;
	var typeValues = getValues(semType);
	var typeLabels = getOptionLabels(semType).join(", ");

	// DOCENT
	var docentValue = getElement('DOCENT').value;

	// DATEBEGIN
	var datebeginValue = getElement('DATEBEGIN').value;

	// DATEEND
	var dateendValue = getElement('DATEEND').value;

	// SEARCHWORD
	var searchword = getElement('SEARCHWORD').value;					
	var searchwordValues = new Array();
	if (searchword.length > 0) {
	 searchwordValues = searchword.split(" ");					
	}

	// SEMNO
	var semnoValue = getElement('SEMNO').value;
	
	// NEW
	var newValue = 'false';
	var newLabel = '';
	if (getElement('NEW').checked) {
		newValue = 'true';
		newLabel = 'ja';
	}
	
	var searchQueryObj = {
		terms : searchwordValues,
		parameterAssignments : [
			{parameterId : 'SEGMENT', values : segmentValues, parameterLabel : 'Gesch\u00e4ftsfeld', valueLabels : segmentLabels},
			{parameterId : 'TOPIC', values : topicValues, parameterLabel : 'Themengebiet', valueLabels : topicLabels},
			{parameterId : 'AUDIENCE', values : audienceValues, parameterLabel : 'Zielgruppe', valueLabels : audienceLabels},
			{parameterId : 'EVENTTYPE', values : typeValues, parameterLabel : 'Art der Veranstaltung', valueLabels : typeLabels},
			{parameterId : 'DOCENT', values : [docentValue], parameterLabel : 'Dozent'},
			{parameterId : 'DATEBEGIN', values : [datebeginValue], parameterLabel : 'Vom/Am'},
			{parameterId : 'DATEEND', values : [dateendValue], parameterLabel : 'Bis'},
			{parameterId : 'SEMNO', values : [semnoValue], parameterLabel : 'Seminarnummer'},
			{parameterId : 'NEW', values : [newValue], parameterLabel : 'nur neue Angebote', valueLabels : newLabel}
		]
	};
	
	return searchQueryObj;
}

function generateColumnsObject() {
	return getValues(getElement('COLUMN._',formName).options);
}

function degenerateQueryObject(queryObj) {
	var map = {};
	for (var i = 0; i < queryObj.parameterAssignments.length; i++) {
		map[queryObj.parameterAssignments[i].parameterId] = queryObj.parameterAssignments[i].values;
	}

	var segments = getElements('SEGMENT',formName);
	for (var i = 0; i < segments.length; i++) {
		if (segments[i].value == map.SEGMENT[0]) {
			segments[i].checked = true;
		}
	}

	// TOPICS
	setValuesF(map.TOPIC, getElement('TOPIC._',formName));

	// AUDIENCE
	setValuesF(map.AUDIENCE, getElement('AUDIENCE._',formName));

	// EVENTTYPE
	setValuesF(map.EVENTTYPE, getElement('EVENTTYPE._',formName));

	// DOCENT
	getElement('DOCENT').value = map.DOCENT[0];

	// DATEBEGIN
	getElement('DATEBEGIN').value = map.DATEBEGIN[0];

	// DATEEND
	getElement('DATEEND').value = map.DATEEND[0];

	// SEARCHWORD
	getElement('SEARCHWORD').value = queryObj.terms.join(" ");

	// SEMNO
	getElement('SEMNO').value = map.SEMNO[0];
	
	// NEW
	getElement('NEW').checked = map.NEW[0] == "true";
	
	getFormParams('SEGMENT');
}

function degenerateColumnsObject(columnsObj) {
	setValuesF(columnsObj, getElement('COLUMN._',formName));
}

function getFormParams(changedParameterId) {
/************************************************************************************/
/* @TITLE
/*	Fordere die aktuellen Formular-Parameter an.
/*
/* @SYNOPSIS
/*	<input name="feld1" id="feld1" onBlur="getFormParams('feld1');">
/*
/* @DESCRIPTION
/*	Fordert die aktuellen Formular-Parameter �ber die Funktion getParams() der
/*	'unitopform.js' an.
/*
/* @PARAM changedParameterId
/*	id des gerade ge�nderten Elementes
/*
/*************************************************************************************/
	unitopform.getParams('','',generateQueryObject(),ajaxURL,changedParameterId,formName);
	if (document.getElementById("saveSearch")) {
		parent.IONAS.setNodeValue(document.getElementById("saveSearch").firstChild, JSONHelper.serialize(generateQueryObject()));
	}
	if (document.getElementById("saveColumns")) {
		parent.IONAS.setNodeValue(document.getElementById("saveColumns").firstChild, JSONHelper.serialize(generateColumnsObject()));
	}
}

/* Funktion zum Aufrufen des Suchergebnisses */

function displaySearchResult() {
/************************************************************************************/
/* @TITLE
/*	Rufe das Suchergebnis auf.
/*
/* @DESCRIPTION
/*	Ruft das Suchergebnis mit Hilfe einer Objektstruktur aus den Formular-Werten und
/*	den angefragten Suchsystemen auf.
/*
/*************************************************************************************/
	prepareResultView();
	
	var queryObject = generateQueryObject();
	
	sa.doExtendedSearch({
		searchQuery: queryObject,
		columns: [],
		categoryStates: [],
		vrbSessionId: {sid:"", uid:""}
	}, ["seminardb"]);
	
	for (var i in sa.systems) {
	    if (sa.systems[i].id == "seminardb" && sa.systems[i].parameters[0].values[0] == queryObject.parameterAssignments[0].values[0]) {
	    	sa.systems[i].container.style.display = "";
	    } else {
	    	sa.systems[i].container.up().hide();
	    }
	}
}


function refillSelection(name, values, remaining) {
    var sBox = getElement(name);
    deleteOptions(sBox, remaining);
    for (var i = 0; i < values.length; i++) {
        createOption(sBox, values[i][0], values[i][1]);
    }
}

function deleteOptions(name, remainder) {
    var sBox = getElement(name);
    while (sBox.length > (remainder || 0)) {
        sBox.remove(sBox.length - 1);
    }
}
function createOption(name, value, txt, before) {
    var sBox = getElement(name);
    var opt = document.createElement("option");
    opt.text = txt;
    opt.value = value;
    if (typeof before == "string") {
        before = findNamedElementInCollection(sBox.options, before, "value");
    }
    sBox.add(opt, before || undefined);
}
function getValue(node) {
    node = getElement(node);
    if (node.value == undefined) {
        throw new Error("Node " + (node ? node.nodeName : node) + " does not have a value");
    } else {
        return node.value;
    }
}
function setValue(node, value) {
    node = getElement(node);
    if (node.value == undefined) {
        throw new Error("Node " + (node ? node.nodeName : node) + " does not have a value");
    } else if (node.nodeName == "SELECT") {
        node.value = value;
        if (node.value != value) {
            throw new Error("Could not set select box to " + value + " (missing option?)");
        }
    } else {
        node.value = value;
    }
}

function setValuesF(values, select) {
	var map = {};
	for (var i = 0; i < values.length; i++) map[values[i]] = true;
	for (var i = 0; i < select.options.length; i++) {
		if (map[select.options[i].value]) {
			select.options[i].selected = true;
			delete map[select.options[i].value];
		} else {
			select.options[i].selected = false;
		}
	}
	var hiddenOptions = [];
	for (var i in map) {
		hiddenOptions.push(i);
	}
	select.hiddenOptions = hiddenOptions;
}

