var previousQuery;
var restoreQuery;
var suggestionCount;
var suggestionMenuVisible = false;
var suggestionIndex;
var suggestionBox;

function showSuggestionMenu() { if (suggestionMenuVisible != true && suggestionCount > 0) toggleSuggestionMenu(); }

function hideSuggestionMenu() {
	if (suggestionMenuVisible != false) {
		suggestionIndex = -1;
		highlightSuggestion();
		toggleSuggestionMenu();
	}
}

function toggleSuggestionMenu() {
	suggestionMenuVisible = !getVisibility('SuggestionMenu');
	setVisibility('SuggestionMenu', suggestionMenuVisible);
}

function highlightSuggestion() {
	var oElements = getObjectById('SuggestionResults').getElementsByTagName('tr');
	for (var i = 0; i < oElements.length; i++) {
		removeCssClass(oElements[i], 'Selected');
		if (i == suggestionIndex) {
			insertCssClass(oElements[i], 'Selected');
			oAnchors = oElements[i].getElementsByTagName('a');
			suggestionBox.value = oAnchors[0].innerHTML;
		}
	}
}

function clearSuggestions() {
	suggestionCount = 0;
	suggestionIndex = -1;
	hideSuggestionMenu();
	removeChildNodes('SuggestionResults');
}

function addSuggestion(query) {
	var nodeTR = document.createElement('tr');
	var nodeTD = document.createElement('td');
	var nodeA = document.createElement('a');
	var nodeText = document.createTextNode(query);

	getObjectById('SuggestionResults').appendChild(nodeTR).appendChild(nodeTD).appendChild(nodeA).appendChild(nodeText);

	//nodeA.tabIndex = -1;
	//nodeA.setAttribute('href', '/search/?q=' + escape(query));
	//nodeA.onclick = function() { suggestionBox.value = query; window.location.href = '/search/?q=' + escape(query); return false; };
	nodeA.onclick = function() { suggestionBox.value = query; submitForm('frmSearchHeader'); return false; }

	suggestionCount = suggestionCount + 1;
	showSuggestionMenu();
}

function processSuggestions(json) {
		suggestions = eval('(' + json + ')');
		clearSuggestions();
		for (var i = 0; i < suggestions[1].length; i++) addSuggestion(suggestions[1][i]);
}

function fetchSearchSuggestions(query) {
	if (query == previousQuery) return;
	if (query.length == 0) { clearSuggestions(); previousQuery = ''; return; }
	var ajax = new ajaxComponent();
	ajax.method = 'GET';
	ajax.requestFile = '/search/suggestion/';
	ajax.setVar('q', document.forms.frmSearchHeader.q.value);
	ajax.onCompletion = function() { processSuggestions(this.response); };
	ajax.runAJAX();
	previousQuery = query;
}

function checkKeyUp(e) {
	if (!e) var e = window.event;
	var movementVector = 0;
	var suppressFetch = false;

	switch (e.keyCode) {
		case 40: // Down Arrow Key
			movementVector = 1;
			suppressFetch = true;
			break;
		case 38: // Up Arrow Key
			movementVector = -1;
			suppressFetch = true;
			break;
		case 27:
			hideSuggestionMenu();
			return false;
			break;
	}
	
	if (movementVector != 0) {
		if (suggestionIndex == -1) restoreQuery = suggestionBox.value;
		suggestionIndex += movementVector;
		if (suggestionIndex < -1) suggestionIndex = suggestionCount - 1;
		if (suggestionIndex > suggestionCount - 1) suggestionIndex = -1;
		if (suggestionIndex == -1) suggestionBox.value = restoreQuery;
		highlightSuggestion();
		showSuggestionMenu();
	}
	
	if (suppressFetch == false) fetchSearchSuggestions(suggestionBox.value);
	
	if (typeof(categoryManuallySelected) != 'undefined' && categoryManuallySelected == false) setCategory(e, getObjectById('AllCategories'), '');
	
	return true;
}

function clickSuggestionBox(e) {
	if (!e) var e = window.event;

	if (!getVisibility('SuggestionMenu')) {
		if (suggestionBox.value != previousQuery) {
			clearSuggestions();
			fetchSearchSuggestions(suggestionBox.value);
		}
		showSuggestionMenu();
	} else {
		hideSuggestionMenu();
	}

	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

function initializeSuggestionMenu() {
	suggestionBox = document.forms.frmSearchHeader.q;
	suggestionBox.setAttribute("autocomplete","off");
	addHandler(document, 'click', hideSuggestionMenu);
	addHandler(suggestionBox, 'keyup', checkKeyUp);
	addHandler(suggestionBox, 'click', clickSuggestionBox);
	addHandler(suggestionBox, 'blur', function() { setTimeout(hideSuggestionMenu, 250); });
}