$.fn.ajaxSearch=function(options) {
	var settings = {
		url : './assets/sx.php',
		preview : '#searchajax',
		criteria : '#searchcriteria',
		searchform : '#searchform',
		minlength : 1,
		maxhits: 6
	};
	
	var lastquery='';
	var searchid=10000;
	var previewvisible=false;
	var activeLink=0;
	
	return this.each(function() {
		if (options) {
			$.extend(settings,options);
		}
		
		$(this).attr('autocomplete','off').parent().attr('autocomplete','off');
		
		function hideAjaxPreview() {
			if (previewvisible) {
				$(settings.preview).slideUp(100);
				previewvisible = false;
			}
		}
		
		function showAjaxPreview() {
			if (!previewvisible) {
				$(settings.preview).slideDown(100);
				previewvisible = true;
			}
		}
		
		function setActiveLink(index) {
			activeLink=index;
			$(settings.preview).find('a').each(function(i){
				if (index==i) {
					$(this).addClass('activelink');
					$(settings.criteria).val($(this).eq(0).html());
				} else {
					$(this).removeClass('activelink');
				}
			});
		}
		
		$(this).keypress(function(e) {
			if (e.keyCode==27) {
				hideAjaxPreview();
				return false;
			}
		});
		
		$(this).blur(function() {
			window.setTimeout(hideAjaxPreview, 150);
		});
		
		$(this).keydown(function(e) {
			if (e.keyCode==40) {
				if (previewvisible) {
					if (activeLink<$(settings.preview).find('a').length-1) {
						setActiveLink(activeLink+1);	
					}
					return false;
				}
			}

			if (e.keyCode==38) {
				if (previewvisible) {
					if (activeLink>0) {
						setActiveLink(activeLink-1);	
					}
					return false;
				}
			}
		});
				
		$(this).keyup(function(e) {
			
			if (e.keyCode==40) return false;
			if (e.keyCode==38) return false;
			if (e.keyCode==13) return true;
			if (e.keyCode==27) return true;
			
					
			var query=this.value;
			if (query!=lastquery) {
				searchid++;
				lastquery=query;
				if (query.length >= settings.minlength) {
					$.ajax({
						url: settings.url,
						data: {
							'q': query,
							'id': searchid,
							'max': settings.maxhits
						},
						dataType: 'html',
						success: function(data, t, x){
							if (data.substr(0, 5) == searchid) {
								if (data.length > 5) {
									$(settings.preview).html(data.substr(5));
									showAjaxPreview();
									setActiveLink(-1);
									$(settings.preview).find('a').click(function(){
										$(settings.criteria).val(this.innerHTML);
										$(settings.searchform).get(0).submit();
										return false;
									})
								} else {
									hideAjaxPreview();
								}
							}
						}
					})
				} else {
					if (previewvisible) {
						hideAjaxPreview();
					}
				}
			}
		});		
	});
};

