var immosuggest = {

	outp: null,
	textfield: null,
	words: new Array(),
	//input: null,
	value: null,
	key: null,
	//elem: null,
	request: null,
	adr: null,
	bSelect: -1,
	listsize: 10,
	pref: null,
	cityNameElem: null,
//	districtListElem:null,
	eventElement: null,
	focusedField: null,

	/** Funktion, welche aufgerufen wird, bevor etwas aus der Liste ausgewählt wurde */
    callbackBeforeChange: null,

	/** Funktion, welche aufgerufen wird, nachdem etwas aus der Liste ausgewählt wurde */
    callbackAfterChange: null,
	

	perform: function(formElem, elemId, url, lsize, cityNameElem, callbackBeforeChange, callbackAfterChange, executionCondition) {
		immosuggest.textfield = formElem;
		immosuggest.cityNameElem = cityNameElem;
		immosuggest.callbackAfterChange = callbackAfterChange;
		immosuggest.callbackBeforeChange = callbackBeforeChange;
		var execute = true;
		if (!immo.isEmpty(executionCondition)) {
			execute = executionCondition();
		}
		if (execute && immosuggest.textfield != null && immosuggest.value != immosuggest.textfield.value.toLowerCase()) {
			immosuggest.value= immosuggest.textfield.value.toLowerCase();
			immosuggest.init(formElem, elemId, url, lsize);
			if (immosuggest.value != null && immosuggest.value.length >= 2) {
				if (immosuggest.words.length == 0 || (immosuggest.pref == null || immosuggest.value.indexOf(immosuggest.pref) != 0)) {
					immosuggest.pref = immosuggest.value.substring(0, 2);
					immosuggest.lookAt();
				}
				window.setTimeout("immosuggest.handleWords()", 100);
			}
			else {
				immosuggest.words = new Array();
				immosuggest.clearOutput();
				immosuggest.outp.style.visibility = "hidden";
			}
		}
	},
	
	performDistricts: function(zip) {
		immosuggest.value=zip;
		immosuggest.pref = zip;
		immosuggest.adr = "/ajax/autocomplete/district.do?zip=";
		immosuggest.lookAt();
		window.setTimeout("immosuggest.addDistricts()", 100);
		
	},


	init: function(formElem, elemId, url, lsize) {
		
		
			immosuggest.listsize = lsize;
			immosuggest.bSelect = -1;		
			immosuggest.outp = document.getElementById(elemId);
			
			immo.addEvent(document, "keydown", immosuggest.keygetter);
			immo.addEvent(document, "keyup", immosuggest.keyHandler);
			immo.addEvent(document, "click", immosuggest.blurHandler);
			immo.addEvent(document, "blur", immosuggest.blurHandler);//nur für FF
			
			immosuggest.adr=url;
	},


	handleWords: function() {
		immosuggest.clearOutput();
		var selectWords = new Array();
		if (immosuggest.words.length > 0 && immosuggest.words[0].length > 0) {
			var j = 0; 
			for (i = 0; i < immosuggest.words.length; i++) {
				if (immosuggest.words[i].toLowerCase().indexOf(immosuggest.value) == 0 ) {
					selectWords[j] = immosuggest.words[i];
					j++;
				}
			}
		}
		immosuggest.outp.style.visibility = "hidden";	
		if (selectWords.length > 0){
			immosuggest.outp.style.visibility = "visible";			
			immosuggest.addWords(selectWords);				
		}
	},


	lookAt: function() {
		if (immosuggest.value.length > 1) {
			if (window.XMLHttpRequest) {
			  immosuggest.request = new XMLHttpRequest();
			}
			else if (window.ActiveXObject) {
				try {
					immosuggest.request = new ActiveXObject("Msxml2.XMLHTTP");
				}
				catch(e) {
					immosuggest.request = new ActiveXObject("Microsoft.XMLHTTP");
				}
			}
			immosuggest.request.onreadystatechange = immosuggest.processStateChange;
			immosuggest.request.open("GET", immosuggest.adr + escape(immosuggest.pref), true);
			immosuggest.request.send(null);
		}
		else {
			immosuggest.clearOutput();
			immosuggest.outp.style.visibility = "hidden";	
		}
	},


	processStateChange: function() {
		if (immosuggest.request.readyState == 4) {
			immosuggest.responseComplete();
		}
	},


	responseComplete: function() {
		if (immosuggest.request.status == 200) {
			var response = eval("(" + immosuggest.request.responseText + ")");
			immosuggest.words = new Array();
			for (var iElement = 0; iElement < response.length; iElement++) {
				immosuggest.words.push(response[iElement]);
			}
		}
	},


	addWords: function(selectWords) {
		immosuggest.outp.onclick = immosuggest.mouseClick;
		var size = 0;
		
		for (var i=0;i<selectWords.length; ++i) {			
			if (selectWords[i] != null && selectWords[i].length > 0) {
				size++;
				var li = document.createElement("option");
				li.appendChild(document.createTextNode(selectWords[i]));
				immosuggest.outp.appendChild(li);
			}
		}
		if (selectWords.length == 1 && immosuggest.textfield.value.toLowerCase() == selectWords[0].toLowerCase()) {
			immosuggest.outp.style.visibility = "hidden";
		}
		else {
			immosuggest.outp.style.visibility = "visible";
			if (size >= 10) {
				immosuggest.outp.size = 10;
			}
			else if (size == 1) {
				immosuggest.outp.size = 2;
			}
			else {
				immosuggest.outp.size = size;
			}		
		}
	},


	clearOutput: function(){
		while (immosuggest.outp.hasChildNodes()) {
			noten = immosuggest.outp.firstChild;
			immosuggest.outp.removeChild(noten);
		}
	},


	keygetter: function(event) {
		if (!event && window.event) {
			event = window.event;
		}
		if (event) {
			immosuggest.key = event.keyCode;
		}
		else {
			immosuggest.key = event.which;
		}
	},


	keyHandler: function(event) {
		
		if (!event && window.event) {
			event = window.event;
		}
		var eventElem = (event.target) ? event.target : event.srcElement;
		immosuggest.eventElement = eventElem;
		
		var name=navigator.appName;
		var version = navigator.appVersion;
		
		
		if(eventElem.id == immosuggest.textfield.id || eventElem.id == immosuggest.outp.id) {
			//Key down
			if (immosuggest.key == 40) {
				if (immosuggest.words.length > 0) {
					immosuggest.outp.focus();
					immosuggest.outp.selectedIndex;
					if (immosuggest.outp.selectedIndex < 0) {
						immosuggest.outp.selectedIndex=0;
					}
					immosuggest.bSelect=immosuggest.outp.selectedIndex;
				}
			}
			//Key up
			else if (immosuggest.key == 38) {
				if (immosuggest.words.length > 0) {
					if (immosuggest.bSelect == 0) {
						immosuggest.outp.selectedIndex = -1;
						immosuggest.textfield.focus();
						immosuggest.bSelect = -1;
					}
					else {
						immosuggest.bSelect = immosuggest.outp.selectedIndex;
					}
				}
			}
			// Esc
			else if (immosuggest.key == 27) {
				immosuggest.clearOutput();
				immosuggest.outp.style.visibility = "hidden";
				immosuggest.textfield.value = "";
				immosuggest.textfield.focus();
			}
			//CR
			else if (immosuggest.key == 13) {
				immosuggest.handleSelect();
				immosuggest.textfield.focus();
			}
			
			
		}
		
		if (name=="Microsoft Internet Explorer" && version >= "4.0"){
			//TAB
			if (immosuggest.key == 9) {
				immosuggest.handleSelect();
			}
		}
	},


	mouseClick: function() {		
		immosuggest.handleSelect();
	},	


	handleSelect: function() {
		
		if (!immo.isEmpty(immosuggest.callbackBeforeChange)) {
			immosuggest.callbackBeforeChange();
		}

		var selectedItem = immosuggest.outp.selectedIndex;
		
		
		try {
			var txt = immosuggest.outp.options[selectedItem].text;
			if (!immo.isEmpty(immosuggest.cityNameElem) && txt.charAt(0) >=0 && txt.charAt(4) >= 0){
				immosuggest.textfield.value = txt.substring(0,5);
				var inpTxtField = document.getElementById(immosuggest.cityNameElem);
				inpTxtField.value = txt.substring(6, txt.length);
				immosuggest.words = new Array();
				
			}
			else {
				immosuggest.textfield.value = txt;
				
			}
		}
		catch(e) {
		}

		immosuggest.outp.style.visibility = "hidden";	
		//immosuggest.clearOutput();
			

		if (!immo.isEmpty(immosuggest.callbackAfterChange)) {
			immosuggest.callbackAfterChange();
		}
	},
	
	
	
	blurHandler: function() {
		
		//FF
		if (immosuggest.eventElement.id == immosuggest.focusedField.id){
			immosuggest.handleSelect();
		} 
		
	},
	
	updateTextField: function(source, target) {
		immosuggest.textfield = document.getElementsByName(target)[0];
		
		var selectedItem = immosuggest.outp.selectedIndex;
		var txt = immosuggest.outp.options[selectedItem].text;
		
		if (!immo.isEmpty(immosuggest.cityNameElem)){
			immosuggest.textfield.value = txt.substring(0,5);
		}
		else{
			immosuggest.textfield.value = txt;
		}
	},
	
	setFocus: function(element){
		immosuggest.focusedField = element;
	}

}
