var searchPreviewInput = null;
var searchPreviewDiv = null;
var searchPreviewHolder = null;

function setupSearchPreview() {
	searchPreviewInput = document.getElementById('search-input')
	if (searchPreviewInput) {
		searchPreviewInput.setAttribute('autocomplete', 'off');
		searchPreviewHolder = document.createElement('div');
		searchPreviewHolder.className = 'search-preview-holder';
		searchPreviewInput.parentNode.insertBefore(searchPreviewHolder, searchPreviewInput.nextSibling);
	}
}

window.onload = setupSearchPreview;

function searchPreviewCancel() {
	setTimeout(searchPreviewClose, 500);
}

function searchPreviewClose() {
	while (searchPreviewHolder.childNodes.length > 0) {
		searchPreviewHolder.removeChild(searchPreviewHolder.childNodes[0]);
	}

	searchPreviewDiv = null;

	searchPreviewIEFix(true);
}

function searchPreview(path) {
	var text = searchPreviewInput.value;

	if (text.length > 2) {
		loadXMLDoc(path + "searchPreview.jsp?query=" + escape(text));
	} else {
		searchPreviewClose();
	}
}

function searchPreviewMore(path) {
	searchPreviewInput.form.submit();
}

function searchPreviewIEFix(showInputs) {
	if (!needIEFix()) return;
	searchPreviewIEFixRecurse(document.body, showInputs, false);
}

function searchPreviewIEFixRecurse(element, showInputs, inSection) {
	if (!element.getAttribute) return; // Not an element

	if (element.className.indexOf('search-preview-hide') != -1) {
		inSection = true;
	}

	if (element.tagName.toLowerCase() == 'select' && inSection) {
		element.style.visibility = showInputs ? 'visible' : 'hidden';
	}

	for (var i = 0; i < element.childNodes.length; i++) {
		searchPreviewIEFixRecurse(element.childNodes[i], showInputs, inSection);
	}
}

function needIEFix() {
	var name = navigator.appName;
	var ie = (name == 'Microsoft Internet Explorer');
	var ie7 = (this.ie && (navigator.userAgent.indexOf("MSIE 7") != -1));

	return ie && !ie7;
}

var req;

function loadXMLDoc(url) {
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = receiveData;
        req.open("GET", url, true);
        req.send(null);
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = receiveData;
            req.open("GET", url, true);
            req.send();
        }
    }
}

var COUNT = 3;

function receiveData() {
	var text = document.getElementById('search-input').value;

    if (req.readyState == 4) {
        if (req.status == 200) {
			if (!searchPreviewDiv) {
				searchPreviewDiv = document.createElement('div');
				searchPreviewDiv.className = "search-preview";

				searchPreviewHolder.appendChild(searchPreviewDiv);
			}

			var response = req.responseXML.documentElement;
			var pages = response.getAttribute('results');
			var query = response.getAttribute('query');
			var fuzzy = response.getAttribute('fuzzy');
			var results = response.getElementsByTagName('result');

			var html = "<h3>Search preview for: <span class=\"query-term\">" + query + "</span></h3>";

			if (pages > 0) {
				if (pages > COUNT) {
					html += "<p class=\"more\">Top " + COUNT + " results shown [<a href=\"javascript:searchPreviewMore();\">More...</a>]</p>";
				}
			}

			html += "<p class=\"matches\">";


			if (fuzzy == 'true') {
				if (pages > 0) {
					html += "<span class=\"count\">" + pages + "</span> pages matched approximately.";
				} else {
					html += "No results were found.";
				}
			} else {
				html += "<span class=\"count\">" + pages + "</span> pages were found.";
			}

			if (pages > 0) {
				html += "</p><ul>";
				for (i = 0; i < results.length; i++) {
					var title = results[i].getElementsByTagName('title')[0].firstChild.data;
					var excerpt = results[i].getElementsByTagName('excerpt')[0].firstChild.data;
					var url = results[i].getElementsByTagName('url')[0].firstChild.data;
					html += "<li><a href=\"" + url + "\"><strong>" + title + "</strong>" + excerpt + "</a></li>";
				}
				html += "</ul>";
			}

			searchPreviewDiv.innerHTML = html;

			searchPreviewIEFix(false);
        }
    }
}
