var Ionas3SearchalyzrBuilder = Class.create(SearchalyzrBuilder, {
	
	addTabContainer: function(container, title, content) {
		container.update(title);
		container.insert(Builder.node('div', { id: 'ie_clearing' }, [ '\xA0' ]));
		container.insert(content);
	},

	doSearch: function(queryhash, placeholder) {
		if (queryhash.vid) {
			prepareResultView(placeholder);
			Object.keys(sa.systems).without([systemKey]).each(
				function(system) {
					sa.builder.hideTab(sa.systems[system].getTitle(), sa.systems[system].getContainer());
				}
			);
			veranstaltungDetails(null, queryhash.vid);
		} else {
			queryhash = new Hash(queryhash);
			queryhash.unset('query');
			//if (queryhash.values().without(null, undefined, '').size() > 0) {
				doExtendedSearch(queryhash, placeholder);
			//}
		}
	},

	handleData: function(data) {
		var tabLabel = 'ausgewählte Veranstaltung';
		veranstaltung = resultdata2hash(data);

		sa.manager.provideTab(systemKey, tabLabel, null);

		var s = new SearchalyzrSystem(
			systemKey,
			systemKey,
			tabLabel,
			'',
			null,
			[],
			[],
			sa.manager.getTabTitleContainer(systemKey),
			sa.manager.getTabContentContainer(systemKey),
			sa.builder.createEmptyIndicator(systemKey, tabLabel, ''),
			sa.builder.createErrorMessage(systemKey)
		);

		// Empty Indicator hinzufügen
		sa.builder.addEmptyIndicator(s.getContainer(), s.emptyIndicator);

		var systemManager = new SearchalyzrSystemManager(sa, s);

		if (categoryContainer == null) {
			categoryContainer = sa.builder.createCategory('');
			sa.builder.addCategory(s.container, categoryContainer);
		}

		if (veranstaltung.vid) {
			showVeranstaltung();
			addAnmeldungEvents();
		} else {
			veranstaltung = null;
			sa.builder.showEmptyIndicator(s.emptyIndicator);
		}
		sa.manager.activateTab(systemKey);
	},

	searchForm: function(stateParams) {
		return getSearchFormHTML();
	},

	handleConfig: function(config) {
		alert(Object.toJSON(config));
	}
});

var sourceSystemKey = 'ofcourse5';
var systemKey = 'ofcourse5-veranstaltung';
var categoryContainer = null;
var veranstaltung = null;

function showVeranstaltung() {
	var html = '';
	html += '<div id="veranstaltung">' + getVeranstaltungHTML(veranstaltung) + '</div>';
	html += '<div id="anmeldung" style="display:none;">'+ getAnmeldungHTML(veranstaltung) +'</div>';
	categoryContainer.container.innerHTML = html;
}

function veranstaltungDetails(systemId, veranstaltungsId) {
	var searchParams = sa.getDefaultSearchParams();
	searchParams.searchQuery.terms = [];
	searchParams.searchQuery.parameterAssignments = [];
	if (systemId) searchParams.searchQuery.parameterAssignments.push({
		parameterId: "provider",
		values: [''+systemId]
	});
	if (veranstaltungsId) searchParams.searchQuery.parameterAssignments.push({
		parameterId: "vid",
		values: [''+veranstaltungsId]
	});
	searchParams.columns = [	                        
		"vid","kurztitel","vnr","veranstaltungstyp","veranstalter","stoffplan","termin_aufanfrage","beginn","ende","defaultuhrzeitvon","defaultuhrzeitbis",
		"termin_info","raum_name","raum_adresse_ort","preisangabe","gebuehr","qualifikation","minteilnehmer","maxteilnehmer","abschluss","foerderung",
		"ansprechpartner_person_anredename","ansprechpartner_person_telekommunikationdienstlich_fon",
		"ansprechpartner_person_telekommunikationdienstlich_email","ansprechpartner_person_telekommunikationdienstlich_fax",
		"veranstalter_shortname", "VeranstalterEmail"
	];
	for (var i in sa.systems) {
		if (sa.systems[i].id == sourceSystemKey) {
			sa.systems[i].manager.getSearchResultData(searchParams);
		}
	}
}

function resultdata2hash(data) {
	var dataHash = new Object();
	data.each(
		function(category) {
			var i = 0;
			category.columnDefinition.each(
				function (column) {
					dataHash[i] = column.id;
					i++;
				}
			);
			category.rows.each(
				function(row) {
					var i = 0;
					row.cells.each(
						function(cell, i) {
							dataHash[dataHash[i]] = cell.text;
							delete dataHash[i];
							i++;
						}
					);
				}
			);
		}
	);
	return dataHash;
}

function toggleView() {
	if ($('veranstaltung').visible()) {
		$('veranstaltung').hide();
		$('anmeldung').show();
	} else {
		$('anmeldung').hide();
		$('veranstaltung').show();
	}
}

function IHK_row(t,v) {
	return v
		? '<tr><th>' + t + '</th><td>'
			+ v.replace(/~verweis\{([^\}]+)\}\{([^\}]+)\}/g, '<a href="$1">$2</a>')
			   .replace(/~verweis\{([^\}]+)\}/g, '<a href="$1">$1</a>')
			+ '</td></tr>'
		: '';
}

function getVeranstaltungHTML(veranstaltung) {
	var html = '';
	var ap = 'ansprechpartner_person_';
	var apt = 'ansprechpartner_person_telekommunikationdienstlich_';
	if (location.search=="?debug") {
		var l = [];
		for (var i in veranstaltung)if(veranstaltung[i])l.push(i+" => "+veranstaltung[i]);
		l.sort();
		alert(l.join("\n"));
	}
	html += '\
		<h2>'+ veranstaltung['kurztitel'] +'</h2>\
		<div class="buttons"><a href="#" onclick="toggleView();return false">Zum Anmeldeformular</a></div>\
		<fieldset>\
			<legend>Veranstaltung</legend>\
			<table class="veranstaltung">'
				+ IHK_row('Nummer', veranstaltung['vnr'])
				+ IHK_row('Information', veranstaltung['veranstaltungstyp'])
				+ IHK_row('Veranstalter', veranstaltung['veranstalter'])
				+ IHK_row('Stoffplan', veranstaltung['stoffplan'])
				+ (veranstaltung['termin_aufanfrage'] != 'ja'
					? IHK_row('Dauer', veranstaltung['beginn'] || veranstaltung['ende'] ? veranstaltung['beginn'] +' - '+ veranstaltung['ende'] : '')
					+ IHK_row('Uhrzeit', veranstaltung['defaultuhrzeitvon'] != veranstaltung['defaultuhrzeitbis'] ? veranstaltung['defaultuhrzeitvon'] +' - '+ veranstaltung['defaultuhrzeitbis'] + 'Uhr' : '')
					: "")
				+ IHK_row('Termininformation', veranstaltung['termin_info'])
				+ IHK_row('Veranstaltungsort',
						(veranstaltung['raum_name'] && veranstaltung['raum_adresse_ort'])
							? (veranstaltung['raum_name'] + "<br/>" + veranstaltung['raum_adresse_ort'])
							: (veranstaltung['raum_name'] || veranstaltung['raum_adresse_ort'])) + '\
			</table>\
		</fieldset>\
		<fieldset>\
			<legend>Teilnahme</legend>\
			<table class="veranstaltung">'
				+ IHK_row('Veranstaltungsgebühr', (veranstaltung['preisangabe'] == "AUFANFRAGE" ? "auf Anfrage" : veranstaltung['gebuehr']))
				+ IHK_row('Voraussetzungen', veranstaltung['qualifikation'])
				+ IHK_row('min. Teilnehmerzahl', veranstaltung['minteilnehmer'])
				+ IHK_row('max. Teilnehmerzahl', veranstaltung['maxteilnehmer'])
				+ IHK_row('Abschluss', veranstaltung['abschluss'])
				+ IHK_row('Förderung', veranstaltung['foerderung']) + '\
			</table>\
		</fieldset>\
		<fieldset>\
			<legend>Kontakt</legend>\
			<table class="veranstaltung">'
				+ IHK_row('Ansprechpartner', veranstaltung[ap+'anredename'])
				+ IHK_row('Telefon', veranstaltung[apt+'fon'])
				+ IHK_row('E-Mail', veranstaltung[apt+'email'] && '<a href="mailto:' + veranstaltung[apt+'email'] + '">' + veranstaltung[apt+'email'] + '</a>')
				+ IHK_row('Fax', veranstaltung[apt+'fax']) + '\
			</table>\
		</fieldset>\
		<div class="buttons"><a href="#" onclick="toggleView();return false">Zum Anmeldeformular</a></div>\
	';
	//html += Object.toJSON(veranstaltung);

	return html;
}

function getCoreHTML(getField) {
	// URL rauskriegen
	var l = document.getElementsByTagName("script");
	var test = "/Ionas3SearchalyzrBuilder.js";
	var url = null;
	for (var i = 0; i < l.length; i++) if (l[i].src.substring(l[i].src.length-test.length) == test) url = l[i].src;
	if (!url) { alert("Interner Fehler: URL nicht gefunden"); return; }
	var agburl = url.replace(/[^/]+$/, "") + "../../Teilnahme-%20und%20Zahlungsbedingungen/";

	return ('<table class="anmeldung">'
			+ IHK_row('Nummer', aktuelleVeranstaltung['vnr'])
			+ (aktuelleVeranstaltung['termin_aufanfrage'] != 'ja'
				? IHK_row('Dauer', aktuelleVeranstaltung['beginn'] || aktuelleVeranstaltung['ende'] ? aktuelleVeranstaltung['beginn'] +' - '+ aktuelleVeranstaltung['ende'] : '')
				+ IHK_row('Uhrzeit', aktuelleVeranstaltung['defaultuhrzeitvon'] != aktuelleVeranstaltung['defaultuhrzeitbis'] ? aktuelleVeranstaltung['defaultuhrzeitvon'] +' - '+ aktuelleVeranstaltung['defaultuhrzeitbis'] + 'Uhr' : '')
				: "") + '\
			<tr>\
				<th>Anrede*</th>\
				<td>\
					' + getField("radio", "gender", "MALE", "gender1") + '<label for="anrede1">Herr</label>\
					' + getField("radio", "gender", "FEMALE", "gender2") + '<label for="anrede2">Frau</label>\
				</td>\
			</tr>\
			<tr>\
				<th>Vorname*</th>\
				<td>' + getField("text", "firstname", null, null, 50) + '</td>\
			</tr>\
			<tr>\
				<th>Nachname*</th>\
				<td>' + getField("text", "lastname", null, null, 50) + '</td>\
			</tr>\
			<tr>\
				<th>Stra&szlig;e*</th>\
				<td>' + getField("text", "street", null, null, 50) + '</td>\
			</tr>\
			<tr>\
				<th>PLZ*</th>\
				<td>' + getField("text", "zipcode", null, null, 5) + '</td>\
			</tr>\
			<tr>\
				<th>Ort*</th>\
				<td>' + getField("text", "city", null, null, 50) + '</td>\
			</tr>\
			<tr>\
				<th>Telefon*</th>\
				<td>' + getField("text", "phone-home", null, null, 25) + '</td>\
			</tr>\
			<tr>\
				<th>Telefax</th>\
				<td>' + getField("text", "fax", null, null, 25) + '</td>\
			</tr>\
			<tr>\
				<th>E-Mail*</th>\
				<td>' + getField("text", "email", null, null, 50) + '</td>\
			</tr>\
			<tr>\
				<th>Arbeitgeber</th>\
				<td>' + getField("text", "c_name", null, null, 80) + '</td>\
			</tr>\
			<tr>\
				<th>Stra&szlig;e</th>\
				<td>' + getField("text", "c_street", null, null, 50) + '</td>\
			</tr>\
			<tr>\
				<th>PLZ</th>\
				<td>' + getField("text", "c_zipcode", null, null, 5) + '</td>\
			</tr>\
			<tr>\
				<th>Ort</th>\
				<td>' + getField("text", "c_city", null, null, 50) + '</td>\
			</tr>\
			<tr>\
				<th>Telefon</th>\
				<td>' + getField("text", "c_phone", null, null, 25) + '</td>\
			</tr>\
			<tr>\
				<th>Bemerkung</th>\
				<td>' + getField("textarea", "comment") + '</td>\
			</tr>\
			<tr>\
				<th>Rechnung an</th>\
				<td><table style="border:none;border-collapse:collapse;width:auto;"><tr>\
					<td valign="top">' + getField("radio", "bill", "participant", "bill1") + '&nbsp;</td>\
					<td valign="top"><label for="bill1">Teilnehmer/in</label></td>\
					<td valign="top">' + getField("radio", "bill", "employer", "bill2") + '&nbsp;</td>\
					<td valign="top"><label for="bill2">Arbeitgeber</label></td>\
				</tr></table></td>\
			</tr>\
			<tr>\
				<th>&#160;</th>\
				<td><table style="border:none;border-collapse:collapse;width:auto;"><tr>\
					<td valign="top">' + getField("checkbox", "conditions", "1") + '&nbsp;</td>\
					<td valign="top">Ich habe die <a href="' + agburl + '" target="_blank">Teilnahme- und Zahlungsbedingungen</a><br>gelesen und akzeptiert.</td>\
				</tr></table></td>\
			</tr>\
		</table>');
}

var aktuelleVeranstaltung;

function getAnmeldungHTML(veranstaltung) {
	aktuelleVeranstaltung = veranstaltung;
	var html = '';

	// URL rauskriegen
	var l = document.getElementsByTagName("script");
	var test = "/Ionas3SearchalyzrBuilder.js";
	var url = null;
	for (var i = 0; i < l.length; i++) if (l[i].src.substring(l[i].src.length-test.length) == test) url = l[i].src;
	if (!url) { alert("Interner Fehler: URL nicht gefunden"); return; }
	var formurl = url.replace(/[^/]+$/, "") + "../includes/customers/ihk/courseRegistration.jspx";
	
	var inputFieldGenerator = function(type, name, value, id, maxlength){
		if (id == null) id = name;
		var code =
			(name != null ? ' name="' + name + '"' : '') + 
			(value != null ? ' value="' + value + '"' : '') +
			(id != null ? ' id="' + id + '"' : '') +
			(maxlength != null ? ' maxlength="' + maxlength + '"' : '');
		if (id == "gender1" || id == "bill1") code += ' checked="checked"';
		switch (type) {
		case "radio": return '<input class="radio" type="radio"' + code + '/>';
		case "checkbox": return '<input type="checkbox"' + code + '/>';
		case "text": return '<input class="text" type="text"' + code + '/>';
		case "textarea": return '<textarea class="text" rows="5"' + code + '></textarea>';
		}
	};

	var hiddenFieldsCopy = ["vid","vnr","beginn","ende","defaultuhrzeitvon","defaultuhrzeitbis","termin_aufanfrage","kurztitel"];
	
	var hiddenFields = {
		"systemid": "veranstalter_shortname",
		"recipient": "VeranstalterEmail"
	};
	for (var i = 0; i < hiddenFieldsCopy.length; i++) {
		hiddenFields[hiddenFieldsCopy[i]] = hiddenFieldsCopy[i];
	}
	
	var hiddenFieldsText = "";
	for (var i in hiddenFields) {
		if (veranstaltung[hiddenFields[i]] != null) {
			hiddenFieldsText += '<input type="hidden" name="' + i + '" value="' + veranstaltung[hiddenFields[i]].replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;") + '">';
		}
	}
	
	html += '\
		<h2>Anmeldeformular - ' + veranstaltung.kurztitel + '</h2>\
		<div id="inputform">\
		<div class="buttons">\
			<a href="#" onclick="toggleView();return false">Zurück zur Veranstaltung</a>\
			<a href="#" onclick="checkform();return false">Anmeldung abschicken</a>\
		</div>\
		<form action="' + formurl + '" id="anmeldeformular" method="post">\
		' + hiddenFieldsText + '\
		' + getCoreHTML(inputFieldGenerator) + '\
		<div>* Pflichtfeld</div>\
		<div class="buttons">\
			<a href="#" onclick="toggleView();return false">Zurück zur Veranstaltung</a>\
			<a href="#" onclick="checkform();return false">Anmeldung abschicken</a>\
		</div>\
		</form>\
		</div>\
		<div id="inputformconfirm" style="display:none;">\
		</div>\
	';

	return html;
}

function addAnmeldungEvents() {
	var fieldIds = ['firstname', 'lastname', 'street', 'zipcode', 'city', 'phone-home', 'fax', 'email', 'c_name', 'c_street', 'c_zipcode', 'c_city', 'c_phone', 'comment'];
	fieldIds.each(
		function(id) {
			Event.observe($(id), 'focus', function() {$(id).addClassName('highlight')});
			Event.observe($(id), 'blur', function() {$(id).removeClassName('highlight')});
		}
	);
}

function checkform(){
	var f = $('anmeldeformular');
	var mandatoryFields = ['firstname', 'lastname', 'street', 'zipcode', 'city', 'phone-home', 'email'];
	if ($('bill2').checked) {
		mandatoryFields.push('c_name', 'c_street', 'c_zipcode', 'c_city');
	}

	var emptyMandatory = null;
	for (var i = mandatoryFields.length-1; i >= 0; i--) {
		var fieldname = mandatoryFields[i];
		f[fieldname].value = f[fieldname].value.replace(/^\s+/,"").replace(/\s+$/,"");
		if (f[fieldname].value == "") {
			$(f[fieldname]).addClassName("highlight");
			emptyMandatory = f[fieldname];
		}
	}
	if (emptyMandatory) {
		alert("Bitte füllen Sie alle Pflichtfelder aus.");
		emptyMandatory.focus();
		return false;
	}
	
	f.email.value = f.email.value.replace(/^\s+/,"").replace(/\s+$/,"");
	var email = f.email.value;

	var p = email.lastIndexOf("@");
	if (p <= 0 || !email.substring(p+1).match(/^((?!-)[A-Za-z0-9-]*[A-Za-z0-9]\.)+[A-Za-z]{2,}$/) || !email.match(/^[\x20-\x7F]+$/)) {
		alert("Bitte überprüfen Sie die eingegebene Mailadresse.");
		f.email.focus();
		return;
	}
	if (!f.conditions.checked) {
		alert("Sie müssen die Teilnahme- und Zahlungsbedingungen akzeptieren!");
		return;
	}
	
	$('inputform').style.display = "none";
	$('inputformconfirm').style.display = "";
	
	var inputFieldGenerator = function(type, name, value, id){
		switch (type) {
		case "radio": return '<input class="radio" type="radio"' + ($(id).checked ? ' checked="checked"' : "") + ' disabled="disabled"/>';
		case "checkbox": return '<input type="checkbox"' + (f[name].checked ? ' checked="checked"' : "") + ' disabled="disabled"/>';
		case "text": return f[name].value.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
		case "textarea": return f[name].value.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br/>");
		}
	};
	
	window.userData = getCoreHTML(inputFieldGenerator);
	
	$('inputformconfirm').innerHTML = '\
		Verbindliche Anmeldung.<br/>\
		Bitte prüfen Sie die eingegebenen Daten. Wenn Sie Daten ändern möchten, klicken Sie bitte auf „Zurück“. Zur Bestätigung Ihrer Anmeldung klicken Sie bitte auf „Anmeldung bestätigen“.<br/>\
		' + userData + '\
		<div class="buttons">\
		<a href="#" onclick="editform();return false">&lt;&lt; Zurück</a>\
		<a href="javascript:opener.sendformdoc=document;opener.sendform();document.open();document.write(\'bitte warten...\');document.close();opener.showVeranstaltung();undefined" target="_blank" onclick="return window.open(this.href,this.target,\'location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no,width=500,height=500\')==null">Anmeldung bestätigen</a>\
		</div>';
	window.sendformresult = null;
	window.sendformresultwindow = null;
}

function editform() {
	$('inputform').style.display = "";
	$('inputformconfirm').style.display = "none";
}

function sendform() {
	$('anmeldeformular').request({
		onComplete: function(xhr){
			var text = xhr.responseText;
			if (text.substring(0,3) == "OK ") {
				text = 
					'<style>' +
					'body,table { font-family: sans-serif; font-size:11px; } ' +
					'table { border:1px solid #BBBBBB; border-collapse:collapse; } ' +
					'th { text-align: right; width:122px; padding:3px 4px 0 0; font-size:1.09em; color:#003366; vertical-align:top; } ' + 
					'td { padding:1px 5px; vertical-align:top; font-size:0.9em; } ' + 
					'</style>' +
					'<b>Vielen Dank für Ihre verbindliche Anmeldung.<br/><br/>In Kürze erhalten Sie eine automatische Bestätigung an die<br/>angegebene Mailadresse. Wir haben folgende Daten für Sie<br/>vorgemerkt:</b><br/><br/>' +
					userData + 
					'<div class="buttons">' +
					'<a href="#" onclick="print();return false">Drucken</a>&#160;&#160;' +
					'<a href="#" onclick="window.close()">Schließen</a>' +
					'</div>';
			}
			sendformdoc.open();
			sendformdoc.write(text);
			sendformdoc.close();
		}
	});
}
