﻿var scheduledAutocompleteRequest = 0;
var lastQuerySearch;
var currentAutoCompleteItem;

$(function() {
	// damn IE
	$("#autocomplete").hide();

	$("#search-bar input").keyup(
	function(e) {

		var query = $.trim($("#search-bar input").val());

		// too short? hide
		if (query.length <= 1) {
			$("#autocomplete").stop().animateHeight(0, 100, function() { $(this).hide(); });
			lastQuerySearch = "";
			return;
		}

		// key up? select prev
		if (e.keyCode == 38) {
			if (currentAutoCompleteItem == null)
				selectAutoCompleteItem($("#autocomplete .item:last"));
			else {
				selectAutoCompleteItem(currentAutoCompleteItem.prev(".item"));
			}
		}

		// key down? select next
		else if (e.keyCode == 40) {
			if (currentAutoCompleteItem == null)
				selectAutoCompleteItem($("#autocomplete .item:first"));
			else {
				selectAutoCompleteItem(currentAutoCompleteItem.next(".item"));
			}
		}

		// dont continue when using arrows
		if (e.keyCode >= 37 && e.keyCode <= 40)
			return;

		// blur on escape
		if (e.keyCode == 27) {
			$("#search-bar input").val("");
			$("#search-bar input").blur();
			return;
		}

		// no change in text? do nothing
		if (query == lastQuerySearch)
			return;

		// show loading
		$("#search-bar input").addClass("loading");

		// kill scheduled request if available
		if (scheduledAutocompleteRequest != 0)
			clearTimeout(scheduledAutocompleteRequest);

		// record and schedule request
		lastQuerySearch = query;
		scheduledAutocompleteRequest = setTimeout("doAutocompleteSearch();", 1000);
	}).blur(
	function() {
		$("#autocomplete").stop().animateHeight(0, 250, function() { $(this).hide(); });
	}); ;
});


function doAutocompleteSearch() {
	scheduledAutocompleteRequest = 0;

	// cannot use JSON since FF returns "Invalid Label" error
	$.get("/api/search/?q=" + lastQuerySearch + "&resultPerPage=5&properties=AlgorithmId,Version,Name,PragmaticName&cachebreaker=" + Math.random(), function(data) {
		var output = eval("(" + data + ")");
		var html = "";

		// prepare list
		$("#search-bar input").removeClass("loading");
		$("#autocomplete").html();

		// populate items
		$.each(output.Result, function(i, item) {
			html += "<div class='item' itemName='" + item.Name + "' url='/algorithm/" + item.AlgorithmId + "/" + "version-" + item.Version + "/" + item.PragmaticName.toLowerCase() + "'>" + item.Name + "</div>";
		});

		// if no match, tell user
		if (output.Result.length == 0) {
			$("#autocomplete").html("<div class='no-results'>no submissions with that name found<br />use less keywords or browse</div>");
			$("#autocomplete").show().animateHeight(40, 200, null);
		}

		// othwerwise, show results
		else {
			$("#autocomplete").html(html);
			$("#autocomplete").show().animateHeight(output.Result.length * 20, 200, null);
			newAutoCompleteItems();
		}
	});
}

function selectAutoCompleteItem(item) {
	if (!item.hasClass("item"))
		return;
	
	if (currentAutoCompleteItem != null)
		currentAutoCompleteItem.removeClass("selected");

	currentAutoCompleteItem = item;
	currentAutoCompleteItem.addClass("selected");
	$("#search-bar input").val(currentAutoCompleteItem.attr("itemName"));
}

function newAutoCompleteItems() {
	// bind click event
	$("#autocomplete .item").click(function() { window.location = $(this).attr("url"); });

	// bind hover event
	$("#autocomplete .item").mouseover(function() { selectAutoCompleteItem($(this)); });
}
