function SelectOneAutoComplete(_id, _idTextField, _idWindow, _idNext, _listaSize) {
	this.lista = document.getElementById(_id);
	this.textField = document.getElementById(_idTextField);
	this.prozor = document.getElementById(_idWindow);
	this.fokusElement = document.getElementById(_idNext);
	
	this.listaSize = _listaSize;
	
	this.prozorVisible = false;
	
	this.prozor.style.visibility = 'hidden';
	
	this.selectString = '';
	this.selectArray = new Array();
	
	this.initialize = initialize;	
	function initialize() {		
		if (this.selectString == '') {
			var len = this.lista.options.length;
			
			for (var i = 0; i < len; ++i) {
				this.selectArray[i] = this.lista.options[i];
				this.selectString += this.lista.options[i].value + ':' + this.lista.options[i].text;
				
				if (i < len - 1) {
					this.selectString += ',';
				}
			}
		}
		else {
			var itemsArray = this.selectString.split(',');
			var len = itemsArray.length;
			
			for (var i = 0; i < len; ++i) {
				var item = itemsArray[i].split(':');
				this.selectArray[i] = new Option(item[1], item[0]);
			}
		}
		
		return;
	}
	
	
	this.initializeList = initializeList;	
	function initializeList() {
		this.initialize();
		
		var len = this.selectArray.length;
		for (var i = 0; i < len; ++i) {
			this.lista[i] = this.selectArray[i];
		}
		
		this.lista.options.length = this.selectArray.length;
		return;
	}
	
	this.updateList = updateList;
	function updateList(evt) {
		if (this.textField.value.length > 0) {
			this.prozor.style.visibility = 'visible';
		}
		else {
			this.prozor.style.visibility = 'hidden';
		}
		
		var keyCode = document.layers ? evt.which : document.all ? event.keyCode : document.getElementById ? evt.keyCode : 0;
		
		if (keyCode == 40) {
			this.prozor.style.visibility = 'visible';
			
			if (this.lista.selectedIndex < this.lista.options.length - 1) {
				this.lista.selectedIndex++;
			}
			
			this.prozorVisible = true;
			
			this.lista.focus();
			this.prozor.style.visibility = 'visible';
			
			this.setSize();
			
			this.textField.value = this.lista.options[this.lista.selectedIndex]['text'];
			
			this.lista.focus();
			return;
		}
		
		if (keyCode == 38 && this.lista.selectedIndex >= 0) {
			if (this.lista.selectedIndex > 0) {
				this.lista.selectedIndex--;
			}
			
			this.prozorVisible = true;
			
			this.lista.focus();
			this.prozor.style.visibility = 'visible';
			
			this.setSize();
			
			this.textField.value = this.lista.options[this.lista.selectedIndex]['text'];
			
			this.lista.focus();
			return;
		}
		
		this.prozorVisible = false;
		
		var textValue = this.textField.value.replace('^\\s*','');
		
		if (textValue == '') {
			this.initializeList();
			return;
		}
		
		this.initialize();
		
		var j = 0;
		
		for (var i = 0; i < this.selectArray.length; ++i) {
			if((this.selectArray[i].text.toUpperCase().indexOf(this.textField.value.toUpperCase()) == 0) || (this.selectArray[i].text.toUpperCase().indexOf(this.textField.value.toUpperCase()) == 6)) {
				this.lista.options[j++] = this.selectArray[i];
			}
		}
		
		this.lista.options.length = j;
		
		if (j > 0) {
			this.lista.options[0].selected = true;
			this.setSize();
		}
		else {
			this.prozor.style.visibility = 'hidden';
		}
	}
	
	this.setSize = setSize;
	function setSize() {
		if (this.lista.options.length < this.listaSize) {
			if (this.lista.options.length == 1) {
				this.lista.size = 2;
			}
			else {
				this.lista.size = this.lista.options.length;
			}
		}
		else {
			this.lista.size = this.listaSize;
		}
	}
	
	this.setJSEvents = setJSEvents;
	function setJSEvents(obj) {
		this.textField.onkeyup = function(e) {return obj.updateList(e);}
		this.textField.onkeydown = function(e) {return obj.closeOnEnterOrTab(e);}
		this.textField.onfocus = function(e) {return obj.updateList(e);}
		this.textField.onblur = function() {return obj.hide();}
		
		this.lista.onchange = function() {return obj.setValue();}
		this.lista.onkeydown = function(e) {return obj.closeOnEnterOrTab(e);}
		this.lista.onblur = function() {return obj.hide();}
		this.lista.onclick = function() {return obj.selectOnClick();}
	}
	
	this.setValue = setValue;
	function setValue() {
		this.textField.setAttribute("autocomplete", "off");
		if (this.lista.selectedIndex >= 0) {
			this.textField.value = this.lista.options[this.lista.selectedIndex]['text'];
		}
		return true;
	}
	
	this.closeOnEnterOrTab = closeOnEnterOrTab;
	function closeOnEnterOrTab(evt) {
		var keyCode = document.layers ? evt.which : document.all ? event.keyCode : document.getElementById ? evt.keyCode : 0;
		
		if (keyCode == 13 || keyCode == 9) {
			this.fokusElement.focus();
			try {
				this.fokusElement.select();
			}
			catch (error) {
				
			}
			this.prozor.style.visibility = 'hidden';
			if (document.all) {
				event.returnValue = false;
			}
			else {
				return false;
			}
		}
	}
	
	this.show = show;
	function show() {
		if (this.textField.value.length > 0) {
			this.prozor.style.visibility = 'visible';
		}
	}
	
	this.hide = hide;
	function hide() {
		if (!this.prozorVisible) {
			if (this.lista.selectedIndex >= 0) {
				this.textField.value = this.lista.options[this.lista.selectedIndex]['text'];
				this.prozor.style.visibility = 'hidden';
			}
		}
		
		this.prozorVisible = false;
	}
	
	this.selectOnClick = selectOnClick;
	function selectOnClick() {
		this.prozorVisible = false;
		this.hide();
		this.fokusElement.focus();
		try {
			this.fokusElement.select();
		}
		catch (error) {
			
		}
	}
}

function setUp(_id, _idTextField, _idWindow, _idNext, _listaSize) {
	component = new SelectOneAutoComplete(_id, _idTextField, _idWindow, _idNext, _listaSize);
	
	component.setValue();
	component.setJSEvents(component);
	component.initializeList();
}
