Object.extend(Element, {
	getSize: function(element) {
		element = $(element);
		var width = element.style.width ? element.style.width   : (element.offsetWidth + 'px');
		var height = element.style.height ? element.style.height : (element.offsetHeight + 'px');
		return {
			width: width,
			height: height,
			w: parseInt(width.substring(0, width.length - 2), 10),
			h: parseInt(height.substring(0, height.length - 2), 10)
		};
	}
});

function suggest(id) {
	var self = this;
	var inputElement = $(id);
	var suggestDiv = document.createElement("div");
	var action = "";
	var delay = 2000;
	var previous = "";
	var selectedIndex = -1;
	var list;
	var intevalId = 0;
	
	var initSuggest = function() {
		inputElement.autocomplete = "off";
		inputElement.onblur = function() {
			hideSuggest;
			stopSuggestEngine();
		};
		inputElement.onfocus = startSuggestEngine;
		inputElement.onkeypress = function(event) { if(getKey(event) == Event.KEY_RETURN) return false; };
		inputElement.onkeydown = function(event) { processKeys(event); };

		suggestDiv.id = id + "_suggest";
		suggestDiv.style.position = "absolute";
		suggestDiv.style.zIndex = "1";
		suggestDiv.style.cursor = "default";
		suggestDiv.className = "suggest_list";
		suggestDiv.style.width = Element.getDimensions(inputElement).width + "px";
		inputElement.parentNode.insertBefore(suggestDiv, inputElement);
		suggestDiv.style.top = parseInt(inputElement.offsetTop) + Element.getSize(inputElement).h;
		suggestDiv.style.left = inputElement.offsetLeft;
		
		hideSuggest();
	};
	
	var startSuggestEngine = function() {
		previous = $F(id);
		intevalId = setInterval(querySuggest, delay);
	};
	
	var stopSuggestEngine = function() {
		clearInterval(intevalId);
		intevalId = 0;
	};
	
	var querySuggest = function() {
		var content = $F(id);
		if (content == "") {
			hideSuggest();
		}
		if (content == previous) return;
		previous = content;
		var params = "type=" + id + "&q=" + content;
		var myAjax = new Ajax.Request(
			action, 
			{
				method: 'get', 
				parameters: params, 
				onComplete: getSuggest
			});
	};
	
	var getSuggest = function(originalRequest) {
		selectedIndex = -1;
		if (originalRequest.responseText == "") {
			suggestDiv.innerHTML = "";
		} else {
			list = eval(originalRequest.responseText);
			suggestDiv.innerHTML = "";
			var table = '<table style="width: 100%; margin: 0; padding: 0" cellspacing="0" cellpadding="0">';
			var tbody = '<tbody>';
			for(var i = 0; i < list.length; i++) {
				var suggestionContainer = '<tr id="' + id + '_suggest_' + i + '">';
				suggestionContainer += '<td class="suggest_normal">' + list[i] + '</td>';
				suggestionContainer += '</tr>';
				tbody += suggestionContainer;
			}
			tbody += '</tbody>';
			table += tbody;
			table += '</table>';
			suggestDiv.innerHTML = table;
			for(var i = 0; i < list.length; i++) {
				var row = $(id + '_suggest_' + i);
				row.onmouseover = function() {
					var pos = this.id.lastIndexOf("_suggest_");
					if (pos > 0) {
						selectedIndex = parseInt(this.id.substr(pos + 9));
						highlight();					
					}
				};
				row.onmousedown = function() {
					var pos = this.id.lastIndexOf("_suggest_");
					if (pos > 0) {
						selectedIndex = parseInt(this.id.substr(pos + 9));
						selectThis();					
					}
				};
			}
			showSuggest();
		}
	};
	
	var hideSuggest = function() {
		suggestDiv.style.display = "none";
	};
	
	function isHidden() {
		return suggestDiv.style.display == "none";
	};
	
	var showSuggest = function() {
		suggestDiv.style.display = "block";
	};
	
	var getKey = function(e) {
		return ((window.event) ? window.event.keyCode : e.which);
	};
	
	var processKeys = function(e) {
		if(!isHidden()) {
			switch(getKey(e)) {
				case Event.KEY_DOWN:
					Event.stop(e);
					selectNext(); 
					return;
				case Event.KEY_UP: 
					Event.stop(e);
					selectPrevious(); 
					return;
				case Event.KEY_RETURN:
					if (selectedIndex == -1) {
						return;
					}
					selectThis();
					return;
				case Event.KEY_TAB:
					if (selectedIndex == -1) {
						hideSuggest();
						return;
					}
					selectThis();
					return;
				default: return;
			}
		}
	};
	
	var selectNext = function() {
		if(typeof list[selectedIndex + 1] != "undefined") {
			if(typeof list[selectedIndex] != "undefined") {
				$(id + '_suggest_' + selectedIndex).className = "";
			}
			selectedIndex++;
			highlight();
		}
	};
	
	var selectPrevious = function() {
		if(typeof list[selectedIndex - 1] != "undefined") {
			if(typeof list[selectedIndex] != "undefined") {
				$(id + '_suggest_' + selectedIndex).className = "";
			}
			selectedIndex--;
			highlight();
		}
	};
	
	var selectThis = function() {
		var selection = list[selectedIndex];
		inputElement.value = selection;
		previous = selection;
		hideSuggest();
	};
	
	var highlight = function() {
		for(var i = 0; i < list.length; i++) {
			var suggestTDs = $(id + '_suggest_' + i).getElementsByTagName("td");
			if (i == selectedIndex) {
				for(var j = 0; j < suggestTDs.length; j++) {
					suggestTDs[j].className = 'suggest_selected';
				}
			} else {
				for(var j = 0; j < suggestTDs.length; j++) {
					suggestTDs[j].className = 'suggest_normal';
				}
			}
		}
	};
	
	try {
		if (inputElement.getAttribute("action") 
			&& inputElement.getAttribute("type") == "text") {

			action = inputElement.getAttribute("action");
			initSuggest();
		}
	} catch(e) {}
	
};


