var minwidth = 350;
var pxperletter = 8;

var timerRunning=false;
var lastKeyEvent=0;
var lastQuery = '';
var inputelem;
var divelem;
var sugitems;
var sugitemscnt=0;
var selectedItem = -2; // -2 = not open, -1 = open but not marked

function ac_okeypress_t() {
	if(lastKeyEvent < (new Date()).getTime() - 350) {
		var query = $(inputelem).attr("value");
		if(query.length == 0) {
			$(divelem).hide();
			selectedItem = -2;
		} else if(query != lastQuery) {
			lastQuery = query;
			$.ajax({
					type        : "GET",
					url         : "search_completion.php?s=" + escape(query),
					contentType : "application/json; charset=iso-8859-15",
					dataType    : "json",
					success     : function( Result ) {
							sugitems = Array();
							var d = $(divelem);
							var inp = $(inputelem);
							
							var width = inp.css("width").substr(0, -2);
							if(width < minwidth) width = minwidth;
							var widthpx = width + "px";
							d.css("width", width);
							d.css("left", inp.css("left"));
							d.html("");
							sugitemscnt=0;
							var empty = true;
							$.each( Result, function( key, value ) {
									empty = false;
									var disvalue = value;
									if(value.length*pxperletter > width) {
										disvalue = value.substr(0, width/pxperletter - 3) + "...";
									}
									
									var item = $("<div>");
									item.text(disvalue)
									.css("width", widthpx)
									.css("cursor", "default")
									.mouseover(function() {
										ac_mouseover(item);
									})
									.mouseout(function() {
										ac_mouseout(item);
									})
									.click(function() {
											lastQuery = value;
											$(inputelem).attr("value", value);
											d.hide();
											d.html("");
									});
									d.append(item);
									sugitems[sugitemscnt++] = item;
							});
							if(!empty) d.fadeIn(500);
							else d.hide();
							selectedItem = -1;
					}
			});
		}
		timerRunning = false;
	} else {
		window.setTimeout('ac_okeypress_t()',200);
	}
}

function ac_mouseover(item) {
	item.css("background", "#0000ff");
	item.css("color", "#ffffff");
}

function ac_mouseout(item) {
	item.css("background", "#ffffff");
	item.css("color", "#000000");
}

function ac_okeypress(inp, div) {
	inputelem = inp;
	divelem = div;
	if(!timerRunning) {
		timerRunning=true;
		window.setTimeout('ac_okeypress_t()',200);
	}
	lastKeyEvent = (new Date()).getTime();
}

$(document).click(function() {
	if(divelem) $(divelem).hide();
});

$(document).keydown(function (k) {
	if(k.which != 40 && k.which != 38 && k.which != 13 && k.which != 9) return;
	if(selectedItem == -2) return;
	if(selectedItem != -1) {
		if(k.which == 13 || k.which == 9) {
			sugitems[selectedItem].click();
			return;
		}
		ac_mouseout(sugitems[selectedItem]);
	}
	if(k.which == 40) { // key "down"
		selectedItem++;
	}
	else if(k.which == 38) { // key "up"
		selectedItem--;
	}
	if(selectedItem == sugitemscnt) selectedItem = 0;
	if(selectedItem < 0) selectedItem = sugitemscnt - 1;
	ac_mouseover(sugitems[selectedItem]);
});