var ajaxHttpObj = false;					// XML Http request object used for Ajax calls.
var httpRequest = false;					// Used for timeout execution of Ajax requests.
var searchCurrent = '';						// Current search string.
var searchLast = '';							// Last search string.
var searchItemList = new Array();	// List of items from Ajax request.
var searchSelection = -1;					// Currently selected item from item list.
var formClears = new Array();			// Used to force single form clearing.

document.onclick = searchHide;

// Set up the XML Http request object.
try {
	ajaxHttpObj = new XMLHttpRequest();
} catch (checkie) {
	try {
		ajaxHttpObj = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (checkiemore) {
		try {
			ajaxHttpObj = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (allfail) {
			ajaxHttpObj = false;
		}
	}
}

// Clears a form field once and only once.
function clearFormField(field) {
	if (!formClears[field.id]) {
		field.value = '';
		formClears[field.id] = true;
	}
}

// Forced timers (so the request isn't sent every key press).
function getSearchInfo(e) {
	if (!e) e = window.event;
	var key = (e.keyCode ? e.keyCode : e.which);
	var searchBox = document.getElementById('search');

	// ESC key
	if (key == 27) {
		searchHide();
	}

	// Enter key
	else if (key == 13) {
		return searchUse();
	}

	// Up arrow key
	else if (key == 38) {
		searchMoveUp();
	}

	// Down arroy key
	else if (key == 40) {
		searchMoveDown();
	}

	// Set up the ajax http request to happen .5 seconds after last keypress.
	else {

		// Reset the ajax http request timer if set.
		if (httpRequest != false) {
			httpRequest = clearTimeout(httpRequest);
			httpRequest = false;
		}

		httpRequest = setTimeout('sendAjaxRequest();', 500);
		return true;
	}

	searchBox.focus();
	return false;
}

// Send the Ajax request.
function sendAjaxRequest() {
	var searchBox = document.getElementById('search');

	if (searchBox.value != '') {
		searchCurrent = searchBox.value;
		if (ajaxHttpObj.readyState == 4 || ajaxHttpObj.readyState == 0) {
			if (searchCurrent != searchLast) {
				ajaxHttpObj.open("GET", '/request.php?search=' + escape(searchCurrent), true);
				ajaxHttpObj.onreadystatechange = handleAjaxRequest;
				ajaxHttpObj.send(null);
			}
		}
	}
	else {
		searchHide();
		searchBox.focus();
	}
}

function handleAjaxRequest() {
	var searchBox = document.getElementById('search');
	var searchDiv = document.getElementById('search_suggest');
	httpRequest = false;

	if (ajaxHttpObj.readyState == 4) {
		if (ajaxHttpObj.status == 200) {
			var matches = ajaxHttpObj.responseXML.getElementsByTagName('matches')[0];
			searchHide();
			searchItemList = new Array();
			searchLast = searchCurrent;

			for (i = 0; i < matches.childNodes.length; i++) {
				if (matches.childNodes[i].nodeType != 3 && matches.childNodes[i].nodeType != 8) {
					var suggest = '<a name="suggest_item_' + searchItemList.length + '" id="suggest_item_' + searchItemList.length + '" onmouseover="searchOver(this);" onmouseout="searchOut(this);" onclick="searchUse();" onkeydown="return getSearchInfo(event);" class="search_suggest_link">' + matches.childNodes[i].childNodes[0].nodeValue + '</a>';

					searchItemList[searchItemList.length] = matches.childNodes[i].childNodes[0].nodeValue;
					searchDiv.innerHTML += suggest;
				}
			}
			if (searchDiv.innerHTML != '') searchDiv.style.display = 'block';
		}
		else {
			searchHide();
		}
		searchBox.focus();
	}
}

// Hide the search suggestion box.
function searchHide() {
	var searchBox = document.getElementById('search');
	var searchDiv = document.getElementById('search_suggest');
	if (searchDiv.innerHTML != '') {
		searchDiv.style.display = 'none';
		searchDiv.innerHTML = '';
		searchItemList = new Array();
		searchSelection = -1;
		searchLast = ''
		return false;
	}
	return true;
}


// Handles moving up in the search items list selection.
function searchMoveUp() {
	if (searchSelection > 0) {
		searchClearSelections();
		searchSelection--;

		var selection = document.getElementById('suggest_item_' + searchSelection);
		selection.className = 'search_suggest_over';
	}
}

// Handles moving down in the search items list selection.
function searchMoveDown() {
	if (searchSelection < searchItemList.length - 1) {
		searchClearSelections();
		searchSelection++;

		var selection = document.getElementById('suggest_item_' + searchSelection);
		selection.className = 'search_suggest_over';
	}
}

function searchUse() {
	var searchBox = document.getElementById('search');

	if (searchItemList.length != 0 && searchSelection >= 0 && searchSelection <= searchItemList.length) {
		searchBox.value = searchItemList[searchSelection];
		searchHide();
		searchBox.focus();
		return false;
	}
	return true;
}

function searchClearSelections() {
	if (searchItemList.length > 0) {
		for (i = 0; i < searchItemList.length; i++) {
			document.getElementById('suggest_item_' + i).className = 'search_suggest_link';
		}
	}
}

function searchOver(val) {
	searchClearSelections();
	searchSelection = val.id.substr(13);
	val.className = 'search_suggest_over';
}

function searchOut(val) {
	val.className = 'search_suggest_link';
	//val.blur();
	searchSelection = -1;
}

function searchSelect(val) {
	document.getElementById('search').value = val;
	document.getElementById('search_suggest').innerHTML = ''
}


