jQuery.fn.reload_suggestion = function(self) {
	do {
		self.data('timeout_queue', false);
		$.post('srv/autosuggest.php', {query: self.val()}, function(data) {
			data = JSON.parse(data);
			var el;
			self.siblings('.suggest_box').children('ul').children('li').each(function(index) { $(this).remove(); });
			for (n = 0; n < data.length; n++) {
				el = $('<li><div class="suggestion">' + data[n].suggestion + '</div><div class="seperate_desc" style="display:none">' + data[n].description + '</div></li>').appendTo(self.siblings('.suggest_box').children('ul'));
				el.data('dbid', data[n].dbid);
				el.data('desc', data[n].description);
				el.mouseover(function() {
					if (self.data('selected').length) self.data('selected').mouseout();
					$(this).addClass("selected");
					self.data('selected', $(this));
					if (self.data('desc')) {
						if (self.data('desc_type') == 'single') {
							self.data('desc_target').html($(this).data('desc'));
							if (self.data('desc_hide')) {
								self.data('desc_target').show('fast');
							}
						} else {
							$(this).children('.seperate_desc').show('fast');
						}
					}
				});
				el.mouseout(function() {
					var moobj = $(this);
					moobj.removeClass("selected");
					if (self.data('desc')) {
						if (self.data('desc_hide')) {
							if (self.data('desc_type') == 'single') {
								if (!self.data('desc_timeout'))
									self.data('desc_timeout', setTimeout(function() {
										if (self.data('selected') && self.data('selected').data('dbid') == moobj.data('dbid')) self.data('selected', false);
										if (!self.data('selected')) self.data('desc_target').hide('fast');
										self.data('desc_timeout', false);
									},150));
							} else {
								moobj.children('.seperate_desc').hide('fast');
							}
						}
					}
				});
				el.click(function() {
					self.val($(this).children("div").first().html());
					self.siblings('.suggest_box').css('display', 'none');
					if (self.data('desc') && self.data('desc_hide') && self.data('desc_target') > 0)
						self.data('desc_target').hide();
						var temp = $(this).children("div").first().siblings().html();
						$(".faq").html("");
						$("<div>" + temp + "</div>").css("border","solid 1px black").css("padding","5px").appendTo(".faq");
				});

			}
			self.data('timeout', false);
			if (self.siblings('.suggest_box').css('display') == 'none') {
				self.siblings('.suggest_box').show('slow');
			}
		});
	} while (self.data('timeout_queue') != false);
	self.data('timeout', clearTimeout(self.data('timeout')));
	self.data('timeout', false);
}

jQuery.fn.autosuggest = function(delay, desc, target, type) {
	var self = $(this);
	var tmp;
	self.data('timeout', false);
	self.data('timeout_queue', false);
	self.data('desc_timeout', false);
	self.data('selected', false);
	self.data('selected_p', false);
	self.data('desc_target', false);
	self.data('cancel', false);
	self.attr('autocomplete', 'off');
	tmp = $('<div style="position:relative" />').appendTo($(this).parent());
	$(this).appendTo(tmp);
	$('<div class="suggest_box" style="display:none"><ul></ul></div>').appendTo($(this).parent());
	if (desc) {
		self.data('desc', true);
		if (target) {
			self.data('desc_type', 'single');
			self.data('desc_hide', false);
			self.data('desc_target', $(target));
		} else {
			self.data('desc_hide', true);
			if (type == 'single') {
				self.data('desc_type', 'single');
				self.data('desc_target', $('<div class="single_desc" style="display:none"></div>').appendTo(self.parent()));
			} else {
				self.data('desc_type', 'seperate');
			}
		}
	}
	self.blur(function(event) {
		setTimeout(function() {
			if (self.data('desc') && self.data('desc_hide') && self.data('desc_type') == 'single') {
				self.data('desc_target').hide();
			}
		}, 150);
	});
	self.keydown(function(event) {
		if(event.keyCode == 13 && self.data('selected').length) {
			self.data('selected').click();
			return false;
		}
	});
	self.keyup(function(event) {
		if (event.keyCode == 40) {
			if (self.data('selected') == false) {
				tmp = self.siblings('.suggest_box').children('ul').children('li:first');
				if (!tmp.length) return false;
				tmp.mouseover();
			} else {
				if (self.data('selected').length) self.data('selected').mouseout();
				tmp = self.data('selected').next();
				if (!tmp.length)
					tmp = self.siblings('.suggest_box').children('ul').children('li:first');
				if (!tmp.length) return false;
				tmp.mouseover();
			}
		} else if (event.keyCode == 38) {
			if (self.data('selected') == false) {
				tmp = self.siblings('.suggest_box').children('ul').children('li:last');
				if (!tmp.length) return false;
				tmp.mouseover();
			} else {
				if (self.data('selected').length) self.data('selected').mouseout();
				tmp = self.data('selected').prev();
				if (!tmp.length)
					tmp = self.siblings('.suggest_box').children('ul').children('li:last');
				if (!tmp.length) return false;
				tmp.mouseover();
			}
		} else if (event.keyCode == 27) {
			self.siblings('.suggest_box').css('display', 'none');
			if (self.data('desc') && self.data('desc_hide') && self.data('desc_target') > 0)
				self.data('desc_target').hide();
		} else {
			if (self.data('timeout') === false)
				self.data('timeout', setTimeout(function() { self.reload_suggestion(self); }, delay));
			else
				self.data('timeout_queue', true);
		}
	});
}

