﻿// edit values below
var esp_auto_maxNumberOfCategories = 5; // max number of categories shown in drop down
var esp_auto_maxNumberOfProducts = 5; // max number of products shown in drop down
var esp_auto_dropdown_gap = 10; // gap between bottom of search box and top of drop down in pixels
// end edit

var esp_auto_currentSelectedItem = null;
var esp_auto_items = null;
var esp_auto_item_idx = 0;
var esp_auto_has_items = false;
var esp_auto_last_search_term = null;

$(document).ready(function() {
	$("body").append("<div id=\"autocomplete\"></div>").click(function() {
		esp_autocomplete_hideDropDown();
	});
	$("#autocomplete, #menubar input").click(function() {
		return false;
	});
	$("#menubar input").keydown(function(e) {
		var code = (e.keyCode ? e.keyCode : e.which);

		if (code == 38) {
			// cursor up
			esp_autocomplete_mouseUp();
		}
		else if (code == 40) {
			// cursor down
			esp_autocomplete_mouseDown();
		}
	});
	$("#menubar input").keyup(function(e) {
		var code = (e.keyCode ? e.keyCode : e.which);

		if (code == 38) {
			// cursor up
		}
		else if (code == 40) {
			// cursor down
		}
		else if (code == 13) {
			// enter key
			if (esp_auto_currentSelectedItem != null) {
				esp_autocomplete_click(esp_auto_currentSelectedItem);
			}
		}
		else {
			// auto complete
			var searchTerm = $(this).val().toLowerCase();
			if (searchTerm == "") {
				esp_autocomplete_hideDropDown();
			}
			else {
				esp_autocomplete_buildDropDown(searchTerm);
			}
		}
	});

});

function esp_autocomplete_mouseUp() {
	if (esp_auto_currentSelectedItem == null) {
		esp_auto_items = $("#autocomplete div.autocomplete-item");
		esp_auto_has_items = esp_auto_items.length > 0;
		if (esp_auto_has_items) esp_auto_currentSelectedItem = esp_auto_items[esp_auto_items.length - 1];
	}
	else if (esp_auto_has_items) {
		esp_auto_item_idx--;
		if (esp_auto_item_idx < 0) esp_auto_item_idx = esp_auto_items.length-1;
		$(esp_auto_currentSelectedItem).removeClass("autocomplete-item-selected");
		esp_auto_currentSelectedItem = esp_auto_items[esp_auto_item_idx];
		if (esp_auto_currentSelectedItem.length == 0) esp_auto_currentSelectedItem = null;
		if (esp_auto_currentSelectedItem == null || esp_auto_currentSelectedItem == "undefined") {
			esp_auto_currentSelectedItem = esp_auto_items[esp_auto_items.length - 1];
		}
	}
	$(esp_auto_currentSelectedItem).addClass("autocomplete-item-selected");
}

function esp_autocomplete_mouseDown() {
	if (esp_auto_currentSelectedItem == null) {
		esp_auto_items = $("#autocomplete div.autocomplete-item");
		esp_auto_has_items = esp_auto_items.length > 0;
		if (esp_auto_has_items) esp_auto_currentSelectedItem = esp_auto_items[0];
	}
	else if (esp_auto_has_items) {
		esp_auto_item_idx++;
		if (esp_auto_item_idx >= esp_auto_items.length) esp_auto_item_idx = 0;
		$(esp_auto_currentSelectedItem).removeClass("autocomplete-item-selected");
		esp_auto_currentSelectedItem = esp_auto_items[esp_auto_item_idx];
		if (esp_auto_currentSelectedItem.length == 0) esp_auto_currentSelectedItem = null;
		if (esp_auto_currentSelectedItem == null || esp_auto_currentSelectedItem == "undefined") {
			esp_auto_currentSelectedItem = esp_auto_items[0];
		}
	}
	$(esp_auto_currentSelectedItem).addClass("autocomplete-item-selected");
}

function esp_autocomplete_hideDropDown() {
	esp_auto_currentSelectedItem = null;
	esp_auto_item_idx = 0;
	$("#autocomplete").hide();
}

function esp_autocomplete_buildDropDown(searchTerm) {
    searchTerm = searchTerm.replace("'", "");
    searchTerm = searchTerm.replace("\"", "");
	if (esp_auto_last_search_term == searchTerm) return;
	// position drop down
	var $input = $("#menubar input");
	$("#autocomplete").css("top", $input.offset().top + $input.outerHeight() + esp_auto_dropdown_gap);
	$("#autocomplete").css("left", $input.offset().left);
	esp_auto_last_search_term = searchTerm;
	esp_auto_currentSelectedItem = null;
	esp_auto_item_idx = 0;
	var categories = [];
	var products = [];
	var html = [];
	var idx = 0;
	while (categories.length < esp_auto_maxNumberOfCategories && idx < esp_autocomplete_categories.length) {
		var category = esp_autocomplete_categories[idx];
		if (category[0].toLowerCase().indexOf(searchTerm) != -1) {
			categories.push(category);
		}
		idx++;
	}
	idx = 0;
	while (products.length < esp_auto_maxNumberOfProducts && idx < esp_autocomplete_products.length) {
		var product = esp_autocomplete_products[idx];
		if (product[0].toLowerCase().indexOf(searchTerm) != -1) {
			products.push(product);
		}
		idx++;
	}
	if (categories.length == 0 && products.length == 0) {
		$("#autocomplete").hide();
		return;
	}


	$("#autocomplete").show();
	if (categories.length > 0) {
		html.push("<div id=\"autocomplete-categories-title\">Categories</div>");
		html.push("<div id=\"autocomplete-categories\">");
		for (var ii = 0; ii < categories.length; ii++) {
			var category = categories[ii];
			html.push("<div onclick=\"esp_autocomplete_click(this)\" data-url=\"" + category[1] + "\" class=\"autocomplete-item autocomplete-category\">" + category[0] + "</div>");
		}
		html.push("</div>");
	}
	if (product.length > 0) {
		html.push("<div id=\"autocomplete-products-title\">Products</div>");
		html.push("<div id=\"autocomplete-products\">");
		for (var ii = 0; ii < products.length; ii++) {
			var product = products[ii];
			html.push("<div onclick=\"esp_autocomplete_click(this)\" data-url=\"" + product[2] + "\" class=\"autocomplete-item autocomplete-product\">" + product[0] + " <b>£" + product[1] + "</b></div>");
		}
		html.push("</div>");
	}
	$("#autocomplete").html(html.join(""));
}

function esp_autocomplete_click(src) {
	var url = $(src).attr("data-url");
	window.location = url;
}

