	function suggest(id, script, params) {
	
		/**  properties  **/
		var thisObj = this;
		
		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
		
		this.leaveSet = false;				// if true, value is not deleted on ENTER
		
		this.defaultText = '';
		
		this.returnFunction = function () {
			
		}
		
		/**  constructor  **/
		/* load Params */
		var params = new Tparams(params);
		
		
		if (params.params['default_text']) {  
			this.defaultText = params.params['default_text'];
		}
		
		
		/* generate DOM structure */
		// generate input
		var div = document.createElement('div');
		
		if (params.params['parent_node']) {
			document.getElementById(params.params['parent_node']).appendChild(div);
		} else {
			appendNode(div);
		}
		
	
		div.style.position = 'relative';
	
		this.input = document.createElement('input');
		this.input.type = 'text';
		this.input.id = this.id + '.input';
		this.input.name = this.id + '.input';
		this.input.setAttribute('autocomplete', 'off');
		
		if (params.params['value']) {
			this.input.value = params.params['value'];
		} else {
			this.input.value = this.defaultText; 
		}
		
		
		
		div.appendChild(this.input);
	
		addEvent('keydown', function (event) {thisObj.keyDown(event); }, this.input);
		addEvent('keyup', function (event) {thisObj.keyUp(event); }, this.input);
		addEvent('blur', function () {thisObj.hide(); thisObj.showDefaultText('show'); }, this.input);
		addEvent('focus', function () {thisObj.showDefaultText('hide'); }, this.input);
		
		/*
		var onkeydown = id + '.keyDown(event);';
		var onkeyup = id + '.keyUp(event);';
		var onblur = id + '.hide();';
	
		this.input.setAttribute('onkeydown', onkeydown);
		this.input.setAttribute('onkeyup', onkeyup);
		this.input.setAttribute('onblur', onblur);
		*/
	
		// 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'];
			}
			
			addEvent('click', function () { thisObj.callReturnFunction(); }, button);
	
		}
	
	
		// generate suggestions structure
		var suggestion_div = document.createElement('div');
		div.appendChild(suggestion_div);
	
		suggestion_div.className = 'whisperDiv';
		suggestion_div.id = this.id + '_whisperDiv';
		
		suggestion_div.style.opacity = 0.8;
		suggestion_div.style.filter = 'alpha(opacity=' + 80 + ')';
		
		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 = 6;
		}
	
	
		for (var i=1; i <= this.count; i++) {
	
			var suggestion_li = document.createElement('li');
			suggestion_li.id = i;
				
			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);
			
			addEvent('mousedown', function () { thisObj.select(this.id); thisObj.input.value = this.innerHTML; }, suggestion_li);
			addEvent('click', function () { thisObj.input.focus(); }, suggestion_li);
			
			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) {
			var x;
			
			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);
							
						}
						*/
						this.callReturnFunction();
						
					}
					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();
		
				}
	
	
			}
	
	
		}
		
		
		this.callReturnFunction = function() {
			
			var suggestedItem = thisObj.returnItem();
			//eval(params.params['button_function'] + '(' + suggestedItem + ');');
			
			this.returnFunction(suggestedItem);
			
			if (this.leaveSet == false) {
				this.input.value = '';
			}
			
			this.input.select();
			this.hide();
		}
		
		
		this.showDefaultText = function (action) {
			
			if (action == 'show') {
				
				if (this.input.value == '') {
					this.input.value = this.defaultText;
				}
				
			} else {
				
				if (this.input.value == this.defaultText) {
					this.input.value = '';
				}
			}
			
		}
		
	}

