window.autoComplete = function(userSearchInput,searchSuggestionBox,searchButton) {
	this.userSearchInput=userSearchInput;
	this.searchSuggestionBox=searchSuggestionBox;
	this.searchButton=searchButton;
	this.cur=-1;
	
	// configure!
	this.ajaxUrl='http://int-appwbp.weka.intern/qc/search?q=';
	this.ajaxUrlParam='&c=media';
	this.ajaxRequestMinInputLength=2;
	
	// needed to suppress browser own completion with used search words
	this.userSearchInput.setAttribute('autocomplete', 'off');
	
	userSearchInput.onkeyup=this.keyUp;
	userSearchInput.onkeydown=this.keyDown;
	userSearchInput.autoComplete=this;
	userSearchInput.onblur = function() {
		this.autoComplete.searchSuggestionBox.style.visibility="hidden";
	};
	userSearchInput.onfocus = function() {
		if (userSearchInput.value.length > 0 && this.autoComplete.searchSuggestionBox.innerHTML.length > 0) {
			this.autoComplete.searchSuggestionBox.style.visibility="visible";
		}
	};
};

autoComplete.prototype.keyDown=function(oEvent) {
	oEvent=window.event || oEvent;
	iKeyCode=oEvent.keyCode;

	switch(iKeyCode) {
		case 38: //up arrow
			this.autoComplete.moveUp();
			break;
		case 40: //down arrow
			this.autoComplete.moveDown();
			break;
		case 13: //return key
			autoComplete.searchButton.click();
			break;
	}
};

autoComplete.prototype.moveDown=function() {
	if (this.searchSuggestionBox.childNodes.length>0 && this.cur<(this.searchSuggestionBox.childNodes.length-1)) {
		++this.cur;
		for(var i=0; i<this.searchSuggestionBox.childNodes.length; i++) {
			if (i==this.cur) {
				this.searchSuggestionBox.childNodes[i].className="over";
				this.userSearchInput.value=this.searchSuggestionBox.childNodes[i].innerHTML;
			} else {
				this.searchSuggestionBox.childNodes[i].className="";
			}
		}
	}
};

autoComplete.prototype.moveUp=function() {
	if (this.searchSuggestionBox.childNodes.length>0 && this.cur>0) {
		--this.cur;
		for(var i=0; i<this.searchSuggestionBox.childNodes.length; i++) {
			if (i==this.cur) {
				this.searchSuggestionBox.childNodes[i].className="over";
				this.userSearchInput.value=this.searchSuggestionBox.childNodes[i].innerHTML;
			} else {
				this.searchSuggestionBox.childNodes[i].className="";
			}
		}
	}
};

autoComplete.prototype.keyUp=function(oEvent) {
	oEvent=oEvent || window.event;
	var iKeyCode=oEvent.keyCode;
	if (iKeyCode==8 || iKeyCode==46) { // backspace or delete
		this.autoComplete.onTextChange();
	} else if (iKeyCode < 46 || (iKeyCode >= 112 && iKeyCode <= 123)) {
        //ignore
    }  else  {
		this.autoComplete.onTextChange();
	}
};

autoComplete.prototype.onTextChange=function() {
	var txt=this.userSearchInput.value;
	this.cur=-1;
	
	if (txt.length >= autoComplete.ajaxRequestMinInputLength) {
		
//		// mock it!
//		var responseArray = ["ha","media","haftung","779","hat","453","handlungsanleitung","297","hand","150","haftet","110","halon","92","haben","90","handel","77","haupt","75","haften","63","hamburg","60","handhabung","59","halogenierte","55","hamburgisches","48","handwerker","45","halogeniert","41","handwerk","41","hauptunternehmers","37","halten","32","handfeuerwaffen","32"];
//		autoComplete.assembleSuggestionList(responseArray);

		var xmlHttp = null;
		try {
			// Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
			xmlHttp = new XMLHttpRequest();
		} catch(e) {
			try {
				// MS Internet Explorer (ab v6)
				xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				try {
					// MS Internet Explorer (ab v5)
					xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
				} catch(e) {
					xmlHttp  = null;
				}
			}
		}
		var responseArray = new Array();
		if (xmlHttp) {
			// assemble the url to the web service 
			xmlHttp.open('GET', autoComplete.ajaxUrl + encodeURI(txt.toLowerCase()) + autoComplete.ajaxUrlParam, true);
			xmlHttp.onreadystatechange = function () {
				if (xmlHttp.readyState == 4) {
					if (xmlHttp.responseText.length < 1) {
						// maybe same origin policy was violated
						return;
					}
					autoComplete.assembleSuggestionList(window.eval(xmlHttp.responseText));
				}
			};
			xmlHttp.send(null);
		}
	} else {
		// delete old suggestions
		this.searchSuggestionBox.innerHTML="";
		this.searchSuggestionBox.style.visibility="hidden";
	}
};

autoComplete.prototype.assembleSuggestionList=function(responseArray) {		
	var oThis=this;
	
	var searchSuggestionList = new Array();
	for (var counter = 1; counter < responseArray.length/2; counter++) {
		var actualData = responseArray[counter*2];
		searchSuggestionList.push(actualData);
	}

	// delete old suggestions
	autoComplete.searchSuggestionBox.innerHTML="";
	
	if (searchSuggestionList.length <= 0) {
		autoComplete.searchSuggestionBox.style.visibility="hidden"; 
		return;
	}
	
	for (var i = 0; i < searchSuggestionList.length; i++) {
		var listEntryDiv=document.createElement('div');
		autoComplete.searchSuggestionBox.appendChild(listEntryDiv);
		listEntryDiv.onmouseover=
		listEntryDiv.onmouseout=
		listEntryDiv.onmousedown=function(oEvent) {
			oEvent=window.event || oEvent;

			if (oEvent.type=="mousedown") {
				oThis.userSearchInput.value=this.innerHTML;
				autoComplete.searchButton.click();
			} else if (oEvent.type=="mouseover") {
				if (this.parentNode.hasChildNodes) {
					var childNodes = this.parentNode.childNodes;
					for (var i = 0; i < childNodes.length; i++) {
						childNodes[i].className="";
					}
				}
				this.className="over";
				autoComplete.cur = this.getAttribute('id');
			} else if (oEvent.type=="mouseout") {
				this.className="";
			} else {
				this.userSearchInput.focus();
			}
		};
		listEntryDiv.innerHTML=searchSuggestionList[i];
		listEntryDiv.setAttribute('id',i);
	}
	
	autoComplete.searchSuggestionBox.style.visibility="visible";
};

function createAutoComplete() {
	var queryText = document.getElementById('searchArea:searchFormajax:searchquery');
	var suggestions = document.getElementById('searchArea:searchFormajax:searchSuggestionList');
	var searchButton = document.getElementById('searchArea:searchFormajax:hiddenSearchBtn')
    window.autoComplete = new autoComplete(queryText, suggestions, searchButton);
}

function createAutoCompleteRDBV() {
	var queryText = document.getElementById('panelForm:inputFullText');
	var suggestions = document.getElementById('panelForm:searchSuggestionList');
	var searchButton = document.getElementById('panelForm:searchGeneralButton')
    window.autoComplete = new autoComplete(queryText, suggestions, searchButton);
}
