	function suggest(id, script, params, absolute_adress) {
		
		/**  properties  **/
		this.input;					// dom input reference
		var suggestions = new Array();			// array of LI dom references
		this.count = 0; 				// count of suggestions
		
		this.id = id;					// suggest id
		this.script = script;				// search script for ajax
		
		this.selItem = 0;				// selected item between suggested options
		this.selectedColor = '#CAD8E2';			// background color for selected LI
		
		/**  constructor  **/
		/* load Params */
		var params = new Tparams(params);
		
		
		/* generate DOM structure */
		// generate input
		var div = document.createElement('div');
		appendNode(div);
		
		div.setAttribute('class', 'search');
		
		var formular = document.createElement('form');
		appendNode(formular);	
		
		div.appendChild(formular);
		
		this.input = document.createElement('input');
		this.input.type = 'text';
		formular.appendChild(this.input);
		
		//formular.action = absolute_adress + '/hledat-'+ this.input.value + '.html';
		
		var onkeydown = id + '.keyDown(event);';
		var onkeyup = id + '.keyUp(event);';
		var onblur = id + '.hide();';
		var onSubmit = 'javascript: catalogueSearch(search.returnItem(), \''+ absolute_adress +'\');';
		//var onSubmit = 'handleKeyPress(event,this.form, search.returnItem(), \'/projects/hracky/cs/katalog-produktu\');';
		//handleKeyPress(event,this.form)
		
		this.input.setAttribute('onkeydown', onkeydown);
		this.input.setAttribute('onkeyup', onkeyup);
		this.input.setAttribute('onblur', onblur);
		//this.input.setAttribute('onkeypress', onSubmit);
		formular.setAttribute('action', onSubmit);
		
		// input class name
		if (params.params['input_classname']) {
			this.input.className = params.params['input_classname'];
		}
		
		
		// generate button?
		if (params.params['button'] == 'true') {
			
			var button = document.createElement('input');
			button.type = 'button';
			div.appendChild(button);
			
			if (params.params['button_title'] || params.params['button_title'] == '') {
				var button_title = params.params['button_title'];
			} else {
				var button_title = 'Vložit';
			}
			
			button.value = button_title;
			
			// input class name
			if (params.params['button_classname']) {
				button.className = params.params['button_classname'];
			}
			
			var suggestedItem = id + '.returnItem()';
			var onclick =  params.params['button_function'] + '(' + suggestedItem + ', \'' + absolute_adress + '\');';
			
			button.setAttribute('onclick', onclick);
			
		}
		
		
		// generate suggestions structure
		var suggestion_div = document.createElement('div');
		div.appendChild(suggestion_div);
		
		suggestion_div.className = 'whisperDiv';
		
		var suggestion_ul = document.createElement('ul');
		suggestion_div.appendChild(suggestion_ul);
		
		suggestion_ul.className = 'whispered';
		
		if (params.params['count']) {
			this.count = params.params['count'];
		} else {
			this.count = 20;
		}
		
		
		for (var i=1; i <= this.count; i++) {
			
			var suggestion_li = document.createElement('li');
			
			var onmousedown = id + '.select(' + i + '); '+ id +'.input.value = this.innerHTML;';
			var onclick = id + '.input.focus();';
			
			suggestion_li.setAttribute('onmousedown', onmousedown);
			suggestion_li.setAttribute('onclick', onclick);
			
			suggestion_ul.appendChild(suggestion_li);
			suggestions.push(suggestion_li);
		}
		
		
		
		/**  methods  **/
		
		this.getSuggestions = function() {
			
			var suggestObj = this;
			
			var action = new Object();
			action.complete = function(response) {
				
				response = response.split(',');
				if (response.length > 0) {
					
					for (var i=0; i <= suggestObj.count-1; i++) {
						if (response[i]) {
							suggestions[i].innerHTML = response[i];
						} else {
							suggestions[i].innerHTML = '';
						}
						  
					}
					
					suggestion_div.style.display = 'block';
					suggestObj.selItem = 0;
					suggestObj.select();
					
					
				} else {
					suggestion_div.style.display = 'none';
				}
				
			}
			
			action.XML = false;
			//alert();
			get(this.script + encodeURI(this.input.value), action);
			
		}
		
		
		// skryje nasepravac
		this.hide = function() {
			
			suggestion_div.style.display = 'none';
			
		}
		
		
		// oznaci vybranou polozku naseptavace
		this.select = function(key) {
			
			for (x in suggestions) {
				suggestions[x].style.backgroundColor = 'transparent';
				suggestions[x].className = '';
			}
			
			
			if (params.params['selected_classname']) {
				suggestions[key-1].style.backgroundColor = '';
				suggestions[key-1].className = params.params['selected_classname'];
			} else {
				suggestions[key-1].style.backgroundColor = this.selectedColor;
			}
			
			
			this.input.focus();
			
		}
		
		this.returnItem = function () {
			return this.input.value;
		}
		
		// obsluzna metoda pro KeyDown nad whisperInput
		this.keyDown = function(e) {
			
			if (!e) {
				e = window.event;
			}
			
			switch (e.keyCode) {
				// arrow down
				case 40: {
					
					if (this.selItem >= this.count) {
						// nebo nacist dalsi Set
						this.selItem = 1;
					} else {
						this.selItem++;
					}
					
					suggestion_div.style.display = 'block';
					this.select(this.selItem);
					this.input.value = suggestions[this.selItem-1].innerHTML;
					this.input.select();
					break;
					
				}
				
				// arrow up
				case 38: {
					
					if (this.selItem <= 1) {
						// nebo nacist dalsi Set
						this.selItem = this.count;
					} else {
						this.selItem--;
					}
					
					
					
					suggestion_div.style.display = 'block';
					this.select(this.selItem);
					this.input.value = suggestions[this.selItem-1].innerHTML;
					this.input.select();
					break;
					
				}
				
				// enter
				case 13: {
					
					if (this.input.value != '') {
						
						if (params.params['button_function']) {
							
							var suggestedItem = this.returnItem();
							var call =  params.params['button_function'] + '(\'' + suggestedItem + '\');';
							
							eval(call);
						}
						
						
					}
					break;
				}
				
				
			}
			
		}
		
		
		// obsluzna metoda pro KeyUp nad whisperInput
		this.keyUp = function (e) {
			
			if (!e) {
				e = window.event;
			}
			
			if (this.input.value.length == 0) {
				this.hide();
			} else {
				
				// escape
				if (e.keyCode == 27) {
					
					this.input.value = '';
					this.input.select();
					this.hide();
					
				} else  if (e.keyCode != 38 && e.keyCode != 40) {
					
					this.getSuggestions();
					
				}
				
				
			}
			
			
		}
	}

