function getSearchFormHTML() {
	var html = '';

	html += '\
		<form id="suchformular" method="post">\
		<table class="suche">\
		    <tr>\
			    <th colspan="2">Volltext</th>\
		    </tr>\
		    <tr>\
			    <td colspan="2"><input class="text" id="volltext" name="volltext" type="text"></td>\
		    </tr>\
		    <tr>\
			    <th colspan="2">Titel</th>\
		    </tr>\
		    <tr>\
			    <td colspan="2"><input class="text" id="thema" name="thema" type="text"></td>\
		    </tr>\
		    <tr>\
			    <th colspan="2">Zeitraum</th>\
		    </tr>\
		    <tr>\
		    	<td>Beginn ab</td>\
			    <td><input class="text initial" id="beginn_ab" name="beginn_ab" value="TT.MM.JJJJ" type="text" onFocus="if (this.value == \'TT.MM.JJJJ\' ) { this.value = \'\'; $(\'beginn_ab\').removeClassName(\'initial\'); }" onBlur="if (this.value == \'\' || this.value == \'TT.MM.JJJJ\' ) { this.value = \'TT.MM.JJJJ\'; $(\'beginn_ab\').addClassName(\'initial\'); }"></td>\
		    </tr>\
		    <tr>\
		    	<td>Beginn bis</td>\
			    <td><input class="text initial" id="beginn_bis" name="beginn_bis" value="TT.MM.JJJJ" type="text" onFocus="if (this.value == \'TT.MM.JJJJ\' ) { this.value = \'\'; $(\'beginn_bis\').removeClassName(\'initial\'); }" onBlur="if (this.value == \'\' || this.value == \'TT.MM.JJJJ\' ) { this.value = \'TT.MM.JJJJ\'; $(\'beginn_bis\').addClassName(\'initial\'); }"></td>\
		    </tr>\
		    <tr>\
			    <th colspan="2">Veranstaltungsort / -PLZ</th>\
		    </tr>\
		    <tr>\
			    <td colspan="2"><input class="text" id="ort" name="raum_adresse_ort" type="text"></td>\
		    </tr>\
		    <tr>\
		    	<th colspan="2">Abschluss</th>\
		    </tr>\
		    <tr>\
			    <td colspan="2">\
					<select class="text" size="1" id="veroeffentlichen_abschluss" name="veroeffentlichen_abschluss">\
						<option value="">[beliebig]</option>\
						<option value="IHK-Abschlussprüfung">IHK Abschlussprüfung</option>\
						<option value="IHK-Fortbildungsprüfung">IHK Fortbildungsprüfung</option>\
						<option value="Teilnahmebescheinigung">Teilnahmebescheinigung</option>\
						<option value="Zertifikat">Zertifikat</option>\
					</select>\
			    </td>\
		    </tr>\
		    <tr>\
		    	<th colspan="2">Veranstaltungsnummer</th>\
	    	</tr>\
		    <tr>\
			    <td colspan="2"><input class="text" id="vnr" name="vnr" type="text"></td>\
		    </tr>\
   		</table>\
		<div class="buttons">\
			<a href="#" onclick="doExtendedSearch($(\'suchformular\').serialize(true));">Suchen</a>\
		</div>\
		</form>\
	';

	return html;
}

function doExtendedSearch(h, placeholder) {
	/* Bei Fehlern in einem der eingabefelder bis zum Ende der validierung laufen und erst dann abbrechen */
	var inputErrors = false;
	/* Input nicht leer, nicht Initialtext und keine gültige Formatierung --> Fehler */
	for (var i = 0; i < 2; i++) {
		var el = $(i ? 'beginn_bis' : 'beginn_ab');
		if (!el) continue;
		var badValue = el.value != 'TT.MM.JJJJ' && el.value != '' && el.value.match(/^[\d]{1,2}\.[\d]{1,2}\.[\d]{4}$/i) == null;
		/* Falls ein Fehler vorliegt, aber nicht sichtbar ist bzw. umgekehrt  */
		if (badValue != (el.up('td').innerHTML.match(/ein\.$/i) != null)) {
			var oldValue = (el.value == '') ? 'TT.MM.JJJJ' : el.value;
			/* Wenn wert dann normalformatiert, wenn Initialwert dann Initialwertklasse zuweisen */
			var className = (el.value == 'TT.MM.JJJJ') ? 'text initial' : 'text';
			if (!el.nextSibling) el.parentNode.appendChild(document.createTextNode(" "));
			el.value = oldValue;
			el.onfocus = new Function("if (this.value == 'TT.MM.JJJJ' ) { this.value = ''; $(this).removeClassName('initial'); }");
			el.onblur  = new Function("if (this.value == '' || this.value == 'TT.MM.JJJJ' ) { this.value = 'TT.MM.JJJJ'; $(this).addClassName('initial'); }");
			el.nextSibling.nodeValue = badValue ? ' Bitte geben Sie ein Datum im Format TT.MM.JJJJ ein.' : ' ';
			el.setStyle({ borderColor: badValue ? '#FF0000' : '#BBBBBB #CECECE #CECECE' });
		}
		inputErrors = inputErrors || badValue;
	}
	
	/* Sollten Fehler aufgetreten sein --> abbrechen */
	if (inputErrors) return;
	
	for (var i = 0; i < 2; i++) {
		var el = $(i ? 'beginn_bis' : 'beginn_ab');
		if (el && el.value == 'TT.MM.JJJJ') el.value = '';
	}
	
	var searchParams = sa.getDefaultSearchParams();

	h = new Hash(h);
	searchParams.searchQuery.terms = h.get("volltext") ? [h.get("volltext")] : [];
	h.unset("volltext");

	var orderby = "beginn";
	var orderAsc = true;
	h.each(
		function(pair) {
			if(pair.value) {
				if (pair.key == 'orderby') {
					orderby = pair.value.substring(1);
					orderAsc = pair.value.substring(0,1) == "+";
				} else {
					searchParams.searchQuery.parameterAssignments.push(new Hash({parameterId: pair.key, values:[pair.value]}));
				}
			}
		}
	);
	searchParams.categoryStates = [{expanded:true, id:"", offset:0, sorting:{ascending:orderAsc, columnId:orderby}}];
	
	prepareResultView(placeholder);

	var backup = sa.parameters;
	sa.doExtendedSearch(searchParams, sourceSystemKey);
	sa.prevParameters = sa.parameters;
	sa.parameters = backup;
}

function getQSBuilderHTML() {
	var data = getQueryData();

	var handlers = ' onblur="setTimeout(updateQueryString,0)" onkeyup="setTimeout(updateQueryString,0)" onmouseup="setTimeout(updateQueryString,0)"';
	
	var value = function(key) {
		return data[key] ? data[key].replace(/&/g,"&amp;").replace("<","&lt;").replace(">","&gt;").replace('"',"&quot;") : "";
	}
	var opt = function(key, value, content) {
		return '<option value="' + value + '"'
			+ (data[key] == value ? ' selected="selected"' : '')
			+ '>' + content + '</option>';
	}
	var input = function(name) {
		return '<input class="text" id="' + name + '" name="' + name + '" type="text" value="' + value(name) + '"' + handlers + '/>';
	}
	var rowh = function(a,b) {
		return "<tr><th>" + a + "</th><td class='comment'>" + (b || "") + "</td></tr>";
	}
	var row = function(a,b) {
		return "<tr><td>" + a + "</td><td class='comment'>" + (b || "") + "</td></tr>";
	}
	
	var html = '';

	html += '<table class="suche suche2">' +
		rowh('Volltext', 'Suchen in...') +
		row(input("volltext"), 'VNR, Veranstaltungstitel, KNR, Kurztitel, ausführl.<br/>Kurztitel, Kursbeschreibung, Kurs-Schlagworte') +
		
		rowh('Thema') +
		row(input("thema"), 'Veranstaltungsnummer, Veranstaltungstitel') +
		
		rowh('Veranstaltungsort / -PLZ') +
		row(input("raum_adresse_ort"), 'Raum-PLZ, Raum-Ort') +
		
		rowh('Abschluss') +
		row('<select class="text" size="1" id="veroeffentlichen_abschluss" name="veroeffentlichen_abschluss"' + handlers + '>' +
				opt("veroeffentlichen_abschluss", "", "[beliebig]") +
				opt("veroeffentlichen_abschluss", "IHK-Abschlussprüfung", "IHK Abschlussprüfung") +
				opt("veroeffentlichen_abschluss", "IHK-Fortbildungsprüfung", "IHK Fortbildungsprüfung") +
				opt("veroeffentlichen_abschluss", "Teilnahmebescheinigung", "Teilnahmebescheinigung") +
				opt("veroeffentlichen_abschluss", "Zertifikat", "Zertifikat") +
			'</select>',
			'Veröffentlichungsattribut in ofcourse bei Veranstaltung'
		) +
		
		rowh('Veranstaltungsnummer') +
		row(input("vnr"), 'VNR') +
		
		rowh('Kursnummer') +
		row(input("knr"), 'KNR') +
		
		rowh('System') +
		row('<select class="text" size="1" id="provider" name="provider"' + handlers + '>' +
				opt("provider", "", "[beliebig]") +
				opt("provider", "ihk_ios", "Bildungsstätte Idar-Oberstein") +
				opt("provider", "ihk_bizko", "Bildungsstätte Koblenz") +
				opt("provider", "ihk_altenkirchen", "Bildungsstätte Altenkirchen") +
				opt("provider", "ihk_sti", "Steintechnisches Institut Mayen-Koblenz") +
				opt("provider", "ihk_mtb", "Bildungsstätte Montabaur") +
				opt("provider", "ihk_bkn", "Bildungsstätte Bad Kreuznach") +
				opt("provider", "ihk_sim", "IHK-Bildungsstätte Simmern") +
				opt("provider", "ihk_biz", "Bildungszentrum Neuwied") +
				opt("provider", "ihk_utk", "Umwelt-Technikum Koblenz") +
			'</select>',
			'ofcourse-System'
		) +

		rowh('<label style="white-space:nowrap;" for="ohne_datum"' + handlers + '>' +
				'<input type="checkbox" id="ohne_datum" name="ohne_datum"' + (data.beginn_ab=='01.01.2000' ? '' : ' checked="checked"') + handlers + '/>' +
				'Einträge ohne Datum anzeigen' +
			'</label>',
			'<br/>Sollen Seminare ohne Datum angezeigt werden?<br/>Wenn ja, stehen sie ganz oben auf der Liste.'
		) +
		
		'</table>';

	return html;
}

function updateQueryString() {
	var textElementId = document.getElementById('jsquerydiv').firstChild.id;
	var keys = ["volltext", "thema", "raum_adresse_ort", "veroeffentlichen_abschluss", "vnr", "knr", "provider"];
	var list = [];
	for (var i = 0; i < keys.length; i++) {
		var v = document.getElementById(keys[i]).value;
		if (v) list.push(encodeURIComponent(keys[i]) + "=" + encodeURIComponent(v));
	}
	if (!document.getElementById("ohne_datum").checked) {
		list.push("beginn_ab=01.01.2000");
	}
	
	IONASAPI.getElement(textElementId).setValue("?" + list.join("&")); 
}

function getQueryData() {
	document.getElementById('searchQuery').style.display = "none";
	var textElementId = document.getElementById('jsquerydiv').firstChild.id;
	var v = IONASAPI.getElement(textElementId).getValue();
	var data = {};
	if (v.substring(0,1) != "?") return data;
	v = v.substring(1);
	var l = v.split("&");
	for (var i = 0; i < l.length; i++) {
		var l2 = l[i].split("=",2);
		if (l2.length == 2) data[decodeURIComponent(l2[0])] = decodeURIComponent(l2[1]);
	}
	return data;
}