	function handlerOnchangeMainfield() {
		if (this.selectedIndex == 0) {			
			// special case: mainfield 0 -> alle additivefields anzeigen
			showAdditivefields();
			
			// special case: mainfield 0 -> alle spezial anzeigen			
			showSpezial();
			return;
		}
		var abbruch=false;
		var iSelectedMainfieldId = this.options[this.selectedIndex].value;
		for (var i = 0, l = aRelMainfieldAdditivefields.length; i < l; i++) {
			if (aRelMainfieldAdditivefields[i].mainfield == iSelectedMainfieldId) {
				showAdditivefields( aRelMainfieldAdditivefields[i].additivefields);
				abbruch=true;
				//return;
			}
		}
		if(abbruch==false){
			// mainfield nicht gefunden -> keine additivefields anzeigen
			showAdditivefields( [] );
		}
		abbruch=false;
		var iSelectedMainfieldId = this.options[this.selectedIndex].value;
		for (var i = 0, l = aRelMainfieldSpezial.length; i < l; i++) {
			if (aRelMainfieldSpezial[i].mainfield == iSelectedMainfieldId) {
				showSpezial( aRelMainfieldSpezial[i].spezial);
				abbruch=true;
				//return;
			}
		}
		if(abbruch==false){
			// mainfield nicht gefunden -> keine spezial anzeigen
			showSpezial( [] );
		}
	}
	function showAdditivefields( aFieldsToShow ) {
	
		var dAdditivefield = document.getElementById('additivefield');
		if (!dAdditivefield) {
			return;
		}
		var dSpanNomatch = document.getElementById('additivefield-nomatch');
		if (!dSpanNomatch) {
			return;
		}
		var dSpanCanvas = document.getElementById('additivefield-canvas');
		if (!dSpanCanvas) {
			return;
		}
		var dOption;
		var i, l;
		if (typeof aFieldsToShow == 'undefined') {
			// special case: alle additivefields anzeigen
			dAdditivefield.options.length = 0;
			for (i = 0, l = aAdditivefields.length; i < l; i++) {
				dAdditivefield.options[dAdditivefield.options.length] = new Option(aAdditivefields[i].name, aAdditivefields[i].id);
			}
			dSpanNomatch.style.display = 'none';
			dSpanCanvas.style.display = 'inline';
			return;
		}
		// normale case; popuplate additivefields given in array to select
		dAdditivefield.options.length = 0;
		// normale special case: if fields to show == empty -> show sane message
		if (aFieldsToShow.length == 0) {
			// dAdditivefield.options[dAdditivefield.options.length] = new Option('Keine passenden Zusatzfächer', 0);
			dSpanCanvas.style.display = 'none';
			dSpanNomatch.style.display = 'inline';
			return;
		}
		var j;
		for (i = 0, l = aFieldsToShow.length; i < l; i++) {
			for (j = 0, k = aAdditivefields.length; j < k; j++) {
				if (aAdditivefields[j].id == aFieldsToShow[i]) {
					dAdditivefield.options[dAdditivefield.options.length] = new Option(aAdditivefields[j].name, aAdditivefields[j].id);
				}
			}
		}
		dSpanNomatch.style.display = 'none';
		dSpanCanvas.style.display = 'inline';
	}
	
	function showSpezial( aFieldsToShow ) {
		var dSpezial = document.getElementById('spezial');
		if (!dSpezial) {
			return;
		}
		var dSpanNomatch = document.getElementById('spezial-nomatch');
		if (!dSpanNomatch) {
			return;
		}
		var dSpanCanvas = document.getElementById('spezial-canvas');
		if (!dSpanCanvas) {
			return;
		}
		var dOption;
		var i, l;
		if (typeof aFieldsToShow == 'undefined') {
			// special case: alle spezial anzeigen
			dSpezial.options.length = 0;
			for (i = 0, l = aSpezial.length; i < l; i++) {
				dSpezial.options[dSpezial.options.length] = new Option(aSpezial[i].name, aSpezial[i].id);
			}
			dSpanNomatch.style.display = 'none';
			dSpanCanvas.style.display = 'inline';
			return;
		}
		// normale case; popuplate spezial given in array to select
		dSpezial.options.length = 0;
		// normale special case: if fields to show == empty -> show sane message
		if (aFieldsToShow.length == 0) {
			// dSpezial.options[dSpezial.options.length] = new Option('Keine passende Spezialisierung', 0);
			dSpanCanvas.style.display = 'none';
			dSpanNomatch.style.display = 'inline';
			return;
		}
		var j;
		for (i = 0, l = aFieldsToShow.length; i < l; i++) {
			for (j = 0, k = aSpezial.length; j < k; j++) {
				if (aSpezial[j].id == aFieldsToShow[i]) {
					dSpezial.options[dSpezial.options.length] = new Option(aSpezial[j].name, aSpezial[j].id);
				}
			}
		}
		dSpanNomatch.style.display = 'none';
		dSpanCanvas.style.display = 'inline';
	}
	
	/**
	 * Diese Funktion fuehrt die Suche im Hintergrund mittels Ajax aus.
	 *
	 * @param	domForm	Formular dass uebergeben werden soll
	 */
	function searchBehind(form) {
		if (!form) {
			return;
		}
		if (bCallInProgress) {
			return;
		}
		var i, l, j, k;
		// uebertragen der formulardaten in oArgs damit an den server geschickt werden kann
		var oArgs = {};

		// Welcher Befehl soll am Server ausgefuehrt werden
		oArgs.cmd = 'xmlreqprev';
		// Wichtig: sollte die Session ID im Formular stehen werden Cookies
		// vermutlich nicht angenommen -> also auch in den XML-Request stecken
		if (form['PHPSESSID'] && form['PHPSESSID']) {
			oArgs.PHPSESSID = form['PHPSESSID'].value;
		}
		var reMulti = /^(merkmale|krankenkasse|wochentag)/;
		var name;
		for (i = 0, l = form.elements.length; i < l; i++) {
			if (!form.elements[i].name) {
				continue;
			}
			name = form.elements[i].name;
			if (reMulti.test(name)) {
				if (form[name].checked) {
					oArgs[name] = form[name].value;
				}
				continue;
			}
			switch (name) {
				// strings
				case 'nachname':
				case 'plz':
				case 'ort':
				case 'stichwort':
					oArgs[name] = form[name].value;
					break;
				// special case: radio buttons
				case 'geschlecht':
					for (j = 0, k = form[name].length; j < k; j++) {
						if (form[name][j].checked) {
							// von form[name][j].value auf getAttribute geaendert
							// Opera hat hier immer (!) "on" bei .value zurueckgeliefert
							// auch wenn value leer war ("")
							oArgs[name] = form[name][j].getAttribute('value');
							break;
						}
					}
					break;
				// "eine von vielen" auswahl
				case 'county':
				case 'mainfield':
				case 'additivefield':
				case 'diplom':
				case 'diplomalias':
				case 'funktion':
				case 'spezialtherapie':
				case 'spezial':
					if (form[name].selectedIndex >= 0) {
						oArgs[name] = form[name].options[form[name].selectedIndex].value;
					}
					break;
				// einfache checkbox
				case 'vormittag':
				case 'nachmittag':
				case 'homepage':
					oArgs[name] = form[name].checked ? 1 : 0;
					break;
			}
		}

		bCallInProgress = true;
		oReq.send(oArgs, handleResult);
		//if (!(ret = oReq.send(oArgs, handleResult))) { alert(oReq.getLastError()); }
	}
	function handleResult(req) {
		var e;
		try {
			oLastResult = JSON.parse(req.responseText);
			if (oLastResult.bSuccess) {
				var dVorschauCan = document.getElementById('vorschau-canvas');
				if (!dVorschauCan) {
					bCallInProgress = false;
					return;
				}
				switch (oLastResult.sCmd) {
					case 'showPreviewHtml':
						document.getElementById('vorschau').innerHTML = oLastResult.sHtml;
						dVorschauCan.style.display = 'block';
						// Used to have statistics about the Ajax usage on etracker
						etrackerTrackAjax();
						break;
					case 'hidePreviewHtml':
						dVorschauCan.style.display = 'none';
						break;
				}
			}
			if (oLastResult.sDebug && oLastResult.sDebug.length > 0) {
				alert(oLastResult.sDebug);
			}
		} catch (e) { }
		bCallInProgress = false;
	}
	/**
	 * Erzeugt ein Bild in Javascript dass von etracker gefetcht wird und wir
	 * somit einen Click-Count haben. Anzusehen unter "Klick-Tracker"
	 *
	 * Der Code ist angepaszt und basiert auf dem Click-Tracker Delay Code
	 */
	function etrackerTrackAjax() {
		var secureID = "lgK6P3";
		var redirectUrl = "http://www.etracker.de/skin/de.def/img/1px.gif";
		var LinkName = 'avz/misc/suche_ajax';
		etrackerSink = new Image(1,1);
		etrackerSink.src = "http://www.etracker.de/lnkcnt.php?et=" +secureID + "&url="+ redirectUrl + "&lnkname=" + LinkName + "&_random=" + Math.random();
	}
	function handlerFormSubmit() {
		if (!oReq.bRequestInProgress && !bFormReset && oLastResult.bSuccess && oLastResult.iCount == 0) {
			alert('Es wurden keine Ärzte mit Ihren Suchkriterien gefunden!');
			return false;
		}
	}
	function handlerResetClick() {
		bFormReset = true;
	}
	function handlerOnkeyupSettimer() {
		// Es wird nicht Blind nach jedem Tastendruck ein Timer gestartet
		// sondern nur bei einer "echten" Veränderung des Inhaltes
		if (this._beforeKeypress && this.value == this._beforeKeypress) {
			return;
		}
		handlerSetTimer();
		this._beforeKeypress = this.value;
	}
	/**
	 * Setzt einen neuen Timer, der das searchBehind ausfuehren soll
	 *
	 * Wenn ein Ajax-Request gerade laeuft, wird kein neuer Timer gesetzt
	 * und ein aktuell laufender wird gecancelt.
	 *
	 * Wenn gerade ein Timer laeuft, wird dieser gecancelt und ein
	 * neuer gesetzt.
	 */
	function handlerSetTimer() {
		if (bCallInProgress) {
			if (iKeyupTimerId != 0) {
				window.clearTimeout(iKeyupTimerId);
			}
			return;
		}
		if (iKeyupTimerId != 0) {
			// wenn schon ein timer laeuft aber eine aenderung
			// war, bevor der time aus war, dann brechen wir
			// den timer ab und starten einen neuen
			window.clearTimeout(iKeyupTimerId);
		}
		iKeyupTimerId = window.setTimeout(handlerTimer, iKeyupTimerTime);
	}
	/**
	 * Ruft searchBehind auf. Wird von setTimeout aufgerufen.
	 */
	function handlerTimer() {
		iKeyupTimerId = 0;
		searchBehind(document.getElementById('searchform'));
	}
	function handlerWindowOnload() {
		var dSelect = document.getElementById('mainfield');
		if (dSelect) {
			dSelect.onchange = handlerOnchangeMainfield;
		}

		var dReset = document.getElementById('form-reset');
		if (dReset) {
			NcDom.addEventListener(dReset, 'click', handlerResetClick);
		}

		var dNachname = document.getElementById('nachname');
		if (dNachname) {
			if (dNachname.focus) {
				dNachname.focus();
			}
			if (dNachname.select) {
				dNachname.select();
			}
		}
		
		if (!bSupportsAjax) {
			return;
		}
		// Ajax is supported, so prepare everything necessary to view the livesearch
		var dVorschauCan = document.getElementById('vorschau-canvas');
		if (!dVorschauCan) {
			return;
		}
		// dVorschauCan.innerHTML = '<h1>Ergebnisvorschau</h1><div id="vorschau"></div>';
		dVorschauCan.innerHTML = '<div class="right_box common_space"><div class="headline">SUCHVORSCHAU</div><div id="vorschau" class="little_box_content"></div></div>';
		var dVorschau = document.getElementById('vorschau');
		var dForm = document.getElementById('searchform');
		if (!dForm) {
			return;
		}
		// NcDom.addEventListener(dForm, 'submit', handlerFormSubmit);
		dForm.onsubmit = handlerFormSubmit;
		var i, l, name;
		var reMulti = /^(merkmale|krankenkasse|wochentag)/;
		for (i = 0, l = dForm.elements.length; i < l; i++) {
			if (!dForm.elements[i].name) {
				continue;
			}
			name = dForm.elements[i].name;
			// Ist es eine der Checkboxen die mehrere Moeglichkeiten abdecken?
			if (reMulti.test(name)) {
				dForm[name].onclick = function() {
					handlerSetTimer();
				}
				continue;
			}
			switch (name) {
				// strings
				case 'nachname':
				case 'plz':
				case 'ort':
				case 'stichwort':
					dForm.elements[i].onkeyup = handlerOnkeyupSettimer;
					break;
				// special case: radio buttons
				case 'geschlecht':
					dForm.elements[i].onclick = function() {
						handlerSetTimer();
					}
					break;
				// "eine von vielen" auswahl
				case 'county':
				case 'mainfield':
				case 'additivefield':
				case 'diplom':
				case 'diplomalias':
				case 'funktion':
				case 'spezialtherapie':
				case 'spezial':
					NcDom.addEventListener(dForm.elements[i], 'change', handlerSelectOnchange);
					break;
				// einfache checkbox
				case 'vormittag':
				case 'nachmittag':
				case 'homepage':
					dForm.elements[i].onclick = function() {
						handlerSetTimer();
					}
					break;
			}
		}
		searchBehind(dForm);
	}
	function handlerSelectOnchange(ev) {
		ev || (ev = window.event);
		var dTarget = NcDom.eventTarget(ev);
		if (dTarget && dTarget.form) {
			handlerSetTimer();
		}
	}
