 /* 
 * Mit dem suggest Skript ist die Suggest und Consider Also Funktionalität für die Suchfelder
 * auf der Text- und Kartensuche realisiert. Die Suggest Funktionalität beruht auf einer bzw. zwei  AJAX
 * Anfragen die ein XML Dokument mit den entprechenden Vorschlagslisten liefern.
 * Suggest What :http://www.goyellow.de/IDA2?ACTION=suggestWhat&MIME=xml&MDN=Restau&LOC=M%C3%BCnchen&STR=&DIS=5000
 * Suggest Where :http://www.goyellow.de/IDA2?ACTION=suggestWhere&MIME=xml&MDN=Rest&LOC=M%C3%BCnchen&STR=&DIS=5000
 * Neben den Suggest Vorschlägen ( Was und Wo ) werden auch noch ähnliche Suchbegriffe und evtl. ein ConsiderAlso 
 * Werbeeintrag ermittelt die dann in der SuggestBox dargestellt werden. 
 *
 * Bearbeiter: svc, ych
 *
 * Bibliothek(en): jquery
 *
 * Bemerkungen:
 *
 * - Hier ist nur die Implementierng von Suggest. 
 *   Konfiguriert ist die Funktion für die jeweiligen Eingabefelder in init.js
 *
 * - sBox (ID) bildet HTML-Node als Rahmen des Suggestbox. Diese gibt es nur einmal, wird jedesmal mit den Content
 *     befüllt, zu dem gewünschten Platz bewegt, bevor es sichtbar wird. (Siehe Suggest.SBoxObj)
 *	   Suggest.Box() stellt Content (Suggestions + considerAlso) dar, der abhängig von dem Inputfeld
 *     per ajax-Anfrage ermittelt wird. Für solche Inputfelder werden ein eignes Suggest.Box() mit 
 *     new-Methode erzeugt. (Siehe Suggest.Box)
 *
 * - Behandlung eines IE 6.0 Defects bei der Routenplanung:
 *     Das Drop Down Element mit der ID "routeOptionDropDown" liegt bei IE 6.0 fehlerhaft oberhalb von dem Suggest Fenster.
 *     Dies wird dadurch korrigiert, dass dieses Element mittels hide/show verborgen wird, solange das Suggest Fenster auf ist.
 *     Dies erfolgt bei allen Browsern und auf allen Seiten, egal ob das Element "routeOptionDropDown" überhaupt vorkommt.
 */

var Suggest = {
	init: function() {
		// local variables
		Suggest.to = null;
		Suggest.completed = false;
		Suggest.terms = new Array();
		Suggest.selectedTerm = 0;
		Suggest.savedInput = "";
		Suggest.mouseMoved = false;
		Suggest.sourceObj = null; // merkt welches Box aktuell in Benutzung ist

		// config (hard)
		Suggest.suggestLabels = {CompletionTerms: "Vorschläge", LastSearchTerms: "Letzte Suchen", SimilarSearchTerms: "Ähnliche Suchbegriffe", ConsiderAlso: "Wir empfehlen"};
		Suggest.SBoxObj = $("#sBox");  
		Suggest.submitBtnClass = 'search_btn';
		Suggest.minLetters = 1;
		Suggest.delayTime = 300;
		Suggest.safariFactor = (isKHTML && isSafari) ? 0.5 : 1; // Safari arrow key problem
		
		// config (cookies)
		var cookie = Pref.getSuggestCookie();
		Suggest.showFlag = new Boolean(cookie&1);
		Suggest.autocompleteFlag = new Boolean(cookie&2);
		
		// Events
		var ke = (!isOpera) ? "keyup" : "keydown";
		$(document.body).bind(ke, Suggest.handleKeyEvent);
		$(document.body).bind("keypress", Suggest.preventEnterFormSubmit);
		$(document.body).bind("mouseup", Suggest.handleMouseClickEvent);
		$(document.body).bind("mousemove", Suggest.handleMouseMoveEvent);
		
	},

	// get corresponding box from the internal array with sourceobj (DOM-Object)
	getBox: function(sourceObj){
		for (var i=0; i<Suggest.boxes.length; i++) {
			if (sourceObj && sourceObj.id==Suggest.boxes[i].srcId) return Suggest.boxes[i];
		}
		return null;
	},
	
	isSBoxVisible: function() {
		return (Suggest.SBoxObj.css("display") == "block");
	},
	
	isSBoxInvisible: function() {
		return ! this.isSBoxVisible();
	},
	
	showSBox: function() {
		// Wir schliessen das eventuell geoeffnete Fenster mit der Fehlermeldung / Auswahlliste
		$('#geoPortalNav').hide();
		// Check if HistoryLayer exists
		if (User && User.searchHistory && typeof(User.searchHistory.oHolder) == "object") 
		{
			User.searchHistory.hide();
		} 
		$("#routeOptionDropDown").addClass("hideDropDown");
		
		var thebox = Suggest.getBox(Suggest.sourceObj);
		goUtils.setLyr(thebox.srcId, Suggest.SBoxObj, thebox.dx, thebox.dy, thebox.xOffset );
		Suggest.SBoxObj.css("visibility", "visible");
		Suggest.SBoxObj.show();
	},
	
	hideSBox: function() {
		Suggest.SBoxObj.hide();
		$("#routeOptionDropDown").removeClass("hideDropDown");
		Suggest.mouseMoved = false;
		
	},

	closeSuggest: function() {
		// Wir schliessen das eventuell geoeffnete Fenster mit der Fehlermeldung / Auswahlliste
		$('#geoPortalNav').hide();
	
		if (Suggest.isSBoxVisible()){
			Suggest.sourceObj.focus();
			Suggest.autocomplete(Suggest.sourceObj, Suggest.savedInput, false);
			Suggest.hideSBox();
		}	
		return false;
	},

	/*autocomplete wird bei der Mausbewegung über den Auswahllisten aufgerufen*/
	autocomplete: function(f, term, force) {
		if (f.tagName!="INPUT") return;
		var start = term.length;
		Suggest.completed = false;
		if (f.createTextRange) {
			if (!force) {
				start = (document.selection.createRange().text.length) ? term.indexOf(document.selection.createRange().text) : f.value.length;
				if (term.toLowerCase().indexOf(f.value.toLowerCase())<0) return;
			}
			f.value = term;
			var u = f.createTextRange();
			u.moveStart("character", start);
			u.select()
		} else if(f.setSelectionRange){
			if (!force) {
				start = f.selectionStart;
				if (term.toLowerCase().indexOf(f.value.toLowerCase())<0) return;
			}
			f.value = term;
			f.setSelectionRange(start,f.value.length);
		} else if (window.getSelection) {
			f.value = (force) ? term : Suggest.savedInput;
		}
		Suggest.completed = (start<term.length) ? true : false;
	},
	
/** Tooltip don't work
	isTooltip: function(){
		return $("#suggestTooltip").length > 0 ? true : false;
	},
	
	showTooltip: function(evt, sTerm){
		$("body").append("<div id='suggestTooltip'>" + sTerm + "</div>");
		$("#suggestTooltip").css("top", goUtils.findPosY(evt.target) + $(evt.target).height() + 15);
		$("#suggestTooltip").css("left", evt.pageX - $("body").offset().left );
		$("#suggestTooltip").css(goUtils.css.visible);
	},
	
	removeTooltip: function() {
		$("#suggestTooltip").remove();		
	},
**/
	
	selectTerm: function(key, f, show, withMouse) {
		if (withMouse && !Suggest.mouseMoved) return;
		var nItems = $("#suggestContentTD").find("li");
		// ArrowKey Up
		if (key==38) {
			Suggest.selectedTerm = (Suggest.selectedTerm == 0) ?  nItems.length : Suggest.selectedTerm - Suggest.safariFactor;
		}
		// ArrowKey Down
		if (key==40) Suggest.selectedTerm += Suggest.safariFactor;
		// Page Up/Down
		if (key==33) Suggest.selectedTerm -= 4 * Suggest.safariFactor;
		if (key==34) Suggest.selectedTerm += 4 * Suggest.safariFactor;
		// End
		if (key==35) Suggest.selectedTerm = nItems.length;
		// Pos1
		if (key==36) Suggest.selectedTerm = 1;
		
		// select inputfield if pageUp or keyUp at first element
		if (Suggest.selectedTerm < Suggest.safariFactor) {
			Suggest.selectedTerm = 0;
			if (Suggest.sourceObj.select) Suggest.sourceObj.select();
		}
		if (Suggest.selectedTerm > nItems.length){
			Suggest.selectedTerm = 0;
		}
		if (f) Suggest.selectedTerm = 0;
		
		var roundedIndex = Math.round(Suggest.selectedTerm);
		for (var i = 1; i <= nItems.length; i++) {
			if ((roundedIndex == i || f == nItems[i-1]) && show) {
				nItems[i-1].className = "highlight";
				if (f == nItems[i-1] && show) {
					Suggest.selectedTerm = i;
					roundedIndex = i;
				}
			} else {
				nItems[i-1].className = "";
			}
		}
		if (Suggest.selectedTerm) {
			Suggest.autocomplete(Suggest.sourceObj, Suggest.terms[roundedIndex-1], true);
		} else {
			Suggest.sourceObj.value = Suggest.savedInput;
		}
	},

	handleKeyEvent: function(evt){
		var oldSourceObj = Suggest.sourceObj;
		Suggest.sourceObj = evt ? evt.target : event.srcElement;
		
		// Return if selected element is no input field
		if(Suggest.sourceObj.tagName.toLowerCase() != "input") return;
		var key = evt.keyCode;
		switch (key) {
			case 8: // backspace
			case 46: // delete
				if (Suggest.completed) {
					Suggest.completed = false;
					return;
				}
				break;
			case 13: //enter
				//console.log('enter');
				window.clearTimeout(Suggest.to);
				var thebox = Suggest.getBox(Suggest.sourceObj);
				if ((thebox != null) && (thebox.enterSubmitsForm == null))
				{
					
					Suggest.hideSBox();
					Suggest.selectedTerm = 0;			
					GeoPortalMap.doWasSearch();
				}
				else
				{
					var form = Suggest.sourceObj.form.name;
					if (Suggest.selectedTerm==0 && form!=null && (!Suggest.autocompleteFlag || Suggest.isSBoxInvisible())) 
					{
						Suggest.submitSearch(form);
					} 
					else if (thebox != null) 
					{
						
						Suggest.selectedTerm = 0;
						Suggest.hideSBox();
						if (Suggest.selectedTerm) Suggest.sourceObj.value = Suggest.terms[Suggest.selectedTerm-1];
						if (thebox.isNextFieldTobeFilled()) {
							var nextFieldObj = thebox.getNextFieldAsDomObj();
							if (nextFieldObj && nextFieldObj != null) nextFieldObj.focus();
						} else if (form!=null) {
							Suggest.submitSearch(form); return;
						}
						//goUtils.emitMessage("suggest_select"); //darf nicht getrackt werden
						return;
					}
				}
				break;
			case 35: // End
			case 36: // Pos1
			case 38: // Arrow Up
			case 40: // Arrow Down
			case 33: // PageUp
			case 34: // PageDown 
				if (Suggest.isSBoxVisible()) {
					Suggest.selectTerm(key, 0, true, false);
					return;
				}
				break;
			case 37:
			case 39: //Arrow Key Events Left/Right
				Suggest.savedInput = Suggest.sourceObj.value;
				Suggest.hideSBox();
				break;
			case 27: // ESC
				Suggest.sourceObj.value = Suggest.savedInput;
				Suggest.selectedTerm = 0;
				Suggest.hideSBox();
				window.clearTimeout(Suggest.to);
				return;
				break;
			case 9: // TAB
				//console.log('TAB');
				//if (!Suggest.selectedTerm) oldSourceObj.value = Suggest.savedInput;
				Suggest.savedInput = Suggest.sourceObj.value;
				Suggest.selectedTerm = 0;
				Suggest.hideSBox();
				window.clearTimeout(Suggest.to);
				return;
				break;
		}
		if ((key<32 && key!=8) || (key>=37 && key<=40)) return;
		Suggest.savedInput = Suggest.sourceObj.value;
		
		if (Suggest.showFlag==true && Suggest.getBox(Suggest.sourceObj) != null){
			window.clearTimeout(Suggest.to);
			Suggest.to = window.setTimeout("Suggest.getBox(Suggest.sourceObj).loadText()", Suggest.delayTime);
		}
	},
	
	handleMouseClickEvent: function(evt) {
		var newSourceObj = evt ? evt.target : event.srcElement;
		var nextFieldObj = null;
		
		if (!Suggest.selectedTerm && newSourceObj.className!="highlight" &&
		     newSourceObj.tagName!="INPUT" && newSourceObj.tagName!="A" && 
		     Suggest.isSBoxVisible() && Suggest.sourceObj) {
			Suggest.sourceObj.value = Suggest.savedInput;
		} else if (Suggest.selectedTerm) { // es ist eine input-Feld od. Button
			var thebox = Suggest.getBox(Suggest.sourceObj);
			if ((thebox != null) && (thebox.enterSubmitsForm == null))
			{
				GeoPortalMap.doWasSearch();
			}			
			else
			{
				Suggest.sourceObj.value = Suggest.terms[Suggest.selectedTerm-1];
				var form = (Suggest.sourceObj.form) ? Suggest.sourceObj.form.name : 0;
				if (thebox.isNextFieldTobeFilled()) { 
					nextFieldObj = thebox.getNextFieldAsDomObj();
					if (nextFieldObj && nextFieldObj != null) nextFieldObj.focus();
				} else if (form!=null) {
					Suggest.submitSearch(form);
				}
			}
			Suggest.savedInput = Suggest.sourceObj.value;
		}
		// falls für die next field auch ein Suggestbox registriert ist
		// setting new sourceObj and clear up
		if (isDefined(thebox) && nextFieldObj && Suggest.getBox(nextFieldObj)!=null) {
			Suggest.sourceObj = nextFieldObj;
			Suggest.savedInput = Suggest.sourceObj.value;
		}
		Suggest.hideSBox();
		window.clearTimeout(Suggest.to);
		Suggest.selectedTerm = 0;
	},

	handleMouseMoveEvent: function() {
		if (Suggest.SBoxObj && Suggest.isSBoxVisible()){
			Suggest.mouseMoved = true;
		} else {
			Suggest.mouseMoved = false;
		}
	},
	
	preventEnterFormSubmit: function(evt){
		var sObj = evt ? evt.target : event.srcElement;
		var key = evt.keyCode;
		if (key==13 && sObj.className!=Suggest.submitBtnClass && Suggest.getBox(sObj)!=null) {
			evt.returnValue = false;
			evt.cancel = true;
			evt.preventDefault();
			return false;
		}
	},
	
	submitSearch: function(form) {
		Suggest.hideSBox();
		var oForm = document.forms[form];
		if (goNav.examples.checkFormSubmit(oForm)) {
			if (form == "mapAddress")   { GeoPortalMap.getCoords4Address(); /* keine IDA-Anfrage */ }
			else if (form == "preferences") { Pref.getCoords4InputAddress (); /* keine IDA-Anfrage */ }
			else if (form == "localityPreferences") { Pref.getCoords4InputAddress(); /* keine IDA-Anfrage */ }
			else if (form == "localityPreferencesModal") { Pref.getCoords4InputAddress(); /* keine IDA-Anfrage */ }
			else if (form == "routeAddress") { GeoPortalMap.calculateRoute(); /* keine IDA-Anfrage */ }
			else if (form == "getRoute") { if (showRouteOnDetailPage) showRouteOnDetailPage(); /* keine IDA-Anfrage */ }
			else { oForm.submit(); /* IDA-Anfrage */ }
		}
		return false;
	},
	
	
	// Diese Methode wird benutzt, um aus der Orts- oder Strassenantwort Liste ("ajaxPos" Suche) ein Element auszuwählen und ist aus geoPortalMap kopiert.
	// Fuer Hallo Heimat und Angebote wird diese Methode in der 'Standort festlegen' Modal Box benötigt.
	element2LocOrStr: function(fieldId, text){
		$("#"+fieldId).attr('value', text);
		goUtils.hideElement('geoPortalNav');
		if (fieldId == "street_map") GeoPortalMap.getCoords4Address ();
	},	
	

	

	/***************************************** Box Defintion *****************************************/
    /* Beschreibung der Parameters: 
     * srcId:	
     *		Name des Eingabefeldes (ID) welches die Suggest Funktion bekommen soll
     * dx
     * dy
     *		mit (dx,dy) mit Plus kann man den Suggestbox nach rechts/unten justieren.
     * enterSubmitsForm: 
     * 		Name des umgebenden Formulars oder NULL falls kein Formular Kontext, 
     * 		siehe getRequestPath()
     * nextField: 
     * 		NULL oder Name des nächsten Eingabefeldes (Tab Ordnung) im Formular
     * action: 
     * 		Dieser Parameter wird als Wert von ACTION= bei der Suggest Anfrage an IDA übergeben
     * 		siehe getRequestPath()
     */
     
	Box : function (srcId, dx, dy, enterSubmitsForm, nextField, action){
		this.srcId = srcId;							
		this.dx = dx;
		this.dy = dy;
		this.enterSubmitsForm = enterSubmitsForm;	
		this.nextField = nextField;					
		this.action = action;						

		// local variables
		this.xOffset = 0;		// offset=-180 if ad is on the left, 0 is on the right (default)

		// methods
		this.isNextFieldTobeFilled = function() {
			var nextField = (this.nextField && this.nextField.isNotEmpty())? this.nextField : null;
			this.nextSourceObj = (nextField)? $("#"+nextField).get(0) : null; //DOM-Object
			if (this.nextSourceObj) {
				var sSearchType = this.nextSourceObj.getAttribute("inputType");
				if (this.nextSourceObj!=null && !this.nextSourceObj.disabled && 
				    this.nextSourceObj.type != "hidden" && 
				    (this.nextSourceObj.value==goVars.txtFld[sSearchType] || this.nextSourceObj.value=="")) {
					// if nextField is configured and has no input yet 
					return true;
				} 
			}
			return false;
		};
	
		this.getNextFieldAsDomObj = function() {
			return ((this.nextSourceObj) ? this.nextSourceObj : null);
		};
	
		this.checkAdAtLeft = function() {
			// suggestWhere & suggestWhatDetails	
			if(this.srcId  == 'where'|| this.srcId  == 'what_complex')	{ return true; }
	 		return false;
		};
		
		this.noAd = function() {
			// keine Werbung auf Detailseite
			if (this.enterSubmitsForm == 'getRoute') { return true; }
			if (this.enterSubmitsForm == 'preferences') { return true; }
			return false;
		};
	
		this.getUnselectedText = function() {
			f = $("#"+this.srcId).get(0); // DOM-Object
			var text = null;
			if (document.selection) {
				text = document.selection.createRange().text;
			}
			else if (f.selectionStart) start = f.selectionStart;
			else if (window.getSelection) text = window.getSelection;
			else if (document.getSelection) text = document.getSelection;
			if (text!=null) {
				var lg = text.length;
				start = (lg) ? f.value.indexOf(text) : f.value.length;
			}
			return f.value.substring(0, start);
		};

		this.loadText = function() {
			var firstLetters = this.getUnselectedText();
	
			if (firstLetters.length < Suggest.minLetters) {
				Suggest.hideSBox();
				return;
			}
	
			$.getJSON(this.getRequestPath(firstLetters), null , function (data) {
	           Suggest.getBox(Suggest.sourceObj).processResponse(data, firstLetters);
	        })
	
		};
	
		// Callback function for AJAX suggest request
		this.processResponse = function(data, firstLetters){
			var targetRef = $("#suggestContentTD"); // SuggestContent
			var realContentRoot = $("#sBox .realdata"); 
					
			var dataRoot = data.Suggestions;
	
			var groups = dataRoot.Groups;	// Property 'Groups' ist Datencontainer
			var considerAlso = (dataRoot["ConsiderAlso"] && dataRoot["ConsiderAlso"][0])? dataRoot["ConsiderAlso"][0] : null;
	
			// bestimmte Seiten soll keine Werbung haben
			if (this.noAd()) { considerAlso = null; }
	
			var nHits = (groups && groups[0].nofTerms)? parseInt(groups[0].nofTerms) : 0;
			var shits = (groups && groups.length > 1) ? parseInt(groups[1].nofTerms) : 0;
			var hitsAvailable = (nHits+shits>0)? true : false;
			
			if (hitsAvailable) {
				realContentRoot.empty();
				Suggest.SBoxObj.removeClass("right").removeClass("left");
				this.xOffset = 0; // reset offset for every response
		
				// default ist Werbung right, also suggest left (class)
				// falls keine Werbung vorhanden, benutze 'left' wegen Reiter auf linker Seite
				if(this.checkAdAtLeft() && considerAlso != null){
					Suggest.SBoxObj.addClass("right");
				} else {
					Suggest.SBoxObj.addClass("left");
				}

	
				this.createSuggestEntries(groups, realContentRoot);
			}
				
			// Behandling considerAlso
			if (considerAlso != null) {
				this.createConsiderAlso(considerAlso, realContentRoot);
			} 
	
			if (hitsAvailable) {
				Suggest.showSBox();
			} else {
				Suggest.hideSBox();
			}
			
			Suggest.selectedTerm = 0;
			Suggest.savedInput = firstLetters;
	
			// Einstellung "Autovervollständigung"
			var complete = (dataRoot.AutoComplete)? dataRoot.AutoComplete : ''; // Property 'AutoComplete'
			if (Suggest.autocompleteFlag==true && complete) {
				Suggest.autocomplete(Suggest.sourceObj, complete, false);
			}
		};
	
		this.createSuggestEntries = function(groupsOfsuggestions, sBoxContentTDRoot) {
			var musterSuggest = $("#sBox .muster #suggestContentTDMuster"); 
			var targetRef = oList = null;
			var itemCount = 0; // counter über alle groups weg
			if (groupsOfsuggestions) for (var j=0; j < groupsOfsuggestions.length; j++) {
				//Handling für Vorschläge und ähnliche Suchbegriffe
						
				var items = groupsOfsuggestions[j].items; // Property 'items'
	
				var tLabel = Suggest.suggestLabels[groupsOfsuggestions[j].id];
						
				// add section header if there is a section
				if (tLabel != "" && items.length > 0) {
					if(tLabel === Suggest.suggestLabels.CompletionTerms){
						targetRef = musterSuggest.clone().appendTo(sBoxContentTDRoot); // copy Muster;
						targetRef.attr("id", targetRef.attr("id").replace("Muster", "")); // change id to without 'Muster'
					};
					if(tLabel === Suggest.suggestLabels.SimilarSearchTerms){
						// copy alle Kinder der '#suggestContent'
						// insert after letzte Content-Kind nämlich 'ul'
						musterSuggest.children().children().clone().insertAfter(oList);
					}
					var groupRoot = targetRef.find(".label").eq(j);
					groupRoot.find("span").html(tLabel); 
					
					// hits for suggestions of completion terms, group index = 0
					if(tLabel === Suggest.suggestLabels.CompletionTerms){
						var nHits = parseInt(groupsOfsuggestions[j].nofTerms);
						var nViewedHits = (nHits > 10) ? "10" : nHits;
						var sTerm = "(" + nViewedHits + "&nbsp;von&nbsp;" + nHits + ")";
						groupRoot.find(".hits").html(sTerm);
					}							
					if(tLabel === Suggest.suggestLabels.SimilarSearchTerms){
						groupRoot.find(".hits").remove();
					}							
				}
						
				// Add list wrapper
				oList = groupRoot.next("ul"); // "ul"
				var oListMuster = oList.find("li"); //the first and only one
					
				// Add list elements
				for (var i=0; i < items.length; i++) {
					// break if firstChild is null - if there are groups with no content
					//if(!items[i].firstChild) continue;
	
					var term = items[i];
							
					Suggest.terms[itemCount++] = term;
							
					var displayTerm = term;
					if (term.length > 26) {
						displayTerm = displayTerm.substring(0, 24) + "...";
					}
	
					// die 1. ist in Muster vorhanden, alle anderen clonen
					var oLi = oListMuster;
					if (i>0) { oLi = oListMuster.clone();  }
					oLi.find("a").html(displayTerm);
												
					$(oLi).hover(function(evt){
						Suggest.selectTerm(0, this, true, true);
	/** Tooltip don't work
						var sSelTerm = Suggest.terms[Suggest.selectedTerm-1];
						if (sSelTerm && sSelTerm.length > 26) {
							Suggest.showTooltip(evt, sSelTerm);
						}							
	**/
						return false;
					},function(evt){
						Suggest.selectTerm(0, this, false, true); 
	/** Tooltip don't work
						if(Suggest.isTooltip()) {
							Suggest.removeTooltip();						
						}
	**/
						return false;
					});
							
					// die 1. ist in Muster vorhanden, alle anderen hinzufügen
					if (i>0) oLi.appendTo(oList);
				}
			}
				
		};
	
		//Consider Also handling
		this.createConsiderAlso = function(considerAlso, sBoxContentTDRoot) {
			var musterConsiderAlso = $("#sBox .muster #considerContentTDMuster");
	
			var targetRef = sBoxContentTDRoot.find("#considerContentTD");
			if (!targetRef || targetRef.length == 0) { // create new if not already available
				if(this.checkAdAtLeft()){ // first child is left
					targetRef = musterConsiderAlso.clone().prependTo(sBoxContentTDRoot); 
					this.xOffset = -180;
				}else{		// last child is right
					targetRef = musterConsiderAlso.clone().appendTo(sBoxContentTDRoot); // copy
				}
	
				targetRef.attr("id", targetRef.attr("id").replace("Muster", "")); // change id to without 'Muster'
			} 
					
			// change content data with response data
			var tmpDSATag = considerAlso.dsaSubAddress; // property
			var tmpURL = '/home/' + tmpDSATag.trim() + '.html';
			
			// change 'onclick-attr' afterwards doesnt trigger the event
			// the event must bind to .click(fn)
			// set href-attr to div to debug url, no function here
			targetRef.find(".clickable").attr("href", tmpURL)
				.click(function(){ return goUrl.loadURL(tmpURL); });
	
			// add section header if there is a section
			if ( considerAlso.subscriberInfo8.length > 0) {
				targetRef.find(".head").html("Wir empfehlen Ihnen:");
				if ( considerAlso.businessCategoryOrProfession.length > 0 ){
					targetRef.find(".category").html(considerAlso.businessCategoryOrProfession);
				}
	
				if ( considerAlso.name.length > 0 ){
					targetRef.find(".title a").html(considerAlso.name).attr("href",tmpURL);
				}
	
				var cStreetName = ( considerAlso.streetName.length > 0 )? considerAlso.streetName : '';
				var cHouseNumber= ( considerAlso.houseNumber.length > 0 )? considerAlso.houseNumber : '';
				var cZipCode = ( considerAlso.zipCode.length > 0 )? considerAlso.zipCode :'';
				var cLocalityName = ( considerAlso.localityName.length > 0 ) ? considerAlso.localityName : '';
	
				if ( cStreetName.length > 0 || cHouseNumber.length > 0 || 
				     cZipCode.length > 0 || cLocalityName.length > 0 ){
					targetRef.find(".address").html(cStreetName +  ' ' + cHouseNumber + '<br />' + cZipCode + ' ' + cLocalityName);
				}
	
	        }
		};
			
		this.getRequestPath = function(term) {
			var params = "";
			
			if (this.enterSubmitsForm == null)
			{
				value = encodeURIComponent(term); // escape utf-8 url
				params = "&MDN="+value;
			}
			else
			{
				var obj = $("#"+this.srcId)[0].form.elements;
				var formId = $("#"+this.srcId)[0].form.id;		
		
						
				if (formId != "routeAddress" && formId != "getRoute" )
				{
					for (var i=0; i<obj.length; i++) {
						var value = (obj[i].id==this.srcId) ? term : obj[i].value;
						value = encodeURIComponent(value); // escape utf-8 url
						params = params+"&"+obj[i].name+"="+value;
					}
				}
				else
				{
					var regEx = new RegExp(/(\S+)\_/);
					this.srcId.match(regEx);
					var srcElemPrefix = RegExp.$1;
						
					for (var i=0; i<obj.length; i = i + 1) {
						
						if (obj[i].id && obj[i].id.match(regEx) && RegExp.$1 == srcElemPrefix)
						{
							var value = (obj[i].id==this.srcId) ? term : obj[i].value;
							value = encodeURIComponent(value); // escape utf-8 url
							params = params+"&"+obj[i].name+"="+value;
					  	}
					}
				}
			}
			return "/IDA2?ACTION="+this.action+"&MIME=json&"+params;
		};

	} // ende Suggest.Box
	
/************************************* End Box Defintion *****************************************/
	
	
} // Ende Suggest

$(document).ready(Suggest.init);

