var immoautocomplete = {

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


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


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


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


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


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


	addWords: function(selectWords) {
		immoautocomplete.outp.onclick = immoautocomplete.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]));
				immoautocomplete.outp.appendChild(li);
			}
		}
		if (selectWords.length == 1 && immoautocomplete.textfield.value.toLowerCase() == selectWords[0].toLowerCase()) {
			immoautocomplete.outp.style.visibility = "hidden";
		}
		else {
			immoautocomplete.outp.style.visibility = "visible";
			if (size >= 10) {
				immoautocomplete.outp.size = 10;
			}
			else if (size == 1) {
				immoautocomplete.outp.size = 2;
			}
			else {
				immoautocomplete.outp.size = size;
			}		
		}
	},


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


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


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


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


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

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

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

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

}

