// Bound Function Class
function Event(action, object, parameters) {
	return function(event) {
		return action.apply(object, parameters ? parameters.concat([event]) : [event]);
	}
}

// AJAX Request Class
function Request(url, action) {
	this.transport = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
	this.url = url;
	this.action = action;
}

Request.prototype = {
	send: function(parameters) {
		this.transport.open("get", parameters ? this.url + parameters + "/" : this.url, true);
		this.transport.send(null);
		this.transport.onreadystatechange = new Event(this.respond, this);
	},

	respond: function() {
		if (this.transport.readyState == 4) {
			if (this.transport.status == 200)
				this.action(this.transport.responseXML || this.transport.responseText);
			else alert(this.transport.statusText);
		}
	}
}

// LiveSearch Class
function LiveSearch(name, url) {
	this.input = document.getElementsByName(name)[0];
	if (!this.input)
		return;

	this.request = new Request(url, this.showResult);
	this.input.onkeypress = new Event(this.submitQuery, this);
}

LiveSearch.prototype = {
	submitQuery: function(keyPress) {
		if (!keyPress)
			var keyPress = window.event;

		var keyCode = keyPress.keyCode || keyPress.which;

		if (this.input.value.length > 0 && (keyCode == 3 || keyCode == 13)) {
			var query = encodeURIComponent("+" + this.input.value.replace(/\s/, "+"));

			this.input.parentNode.setAttribute("id", "loading");
			this.request.send(query);

			return false;
		}
	},

	showResult: function(xml) {
		var loading = document.getElementById("loading");
		loading.removeAttribute("id");

		var entries = xml.getElementsByTagName("entry");
		if (entries.length > 0) {
			var result = document.createElement("dl");
			result.setAttribute("id", "search-result");

			for (var i = 0; i < entries.length; i++) {
				var handle = entries[i].getElementsByTagName("handle")[0].firstChild.data;
				var title = entries[i].getElementsByTagName("title")[0].firstChild.data;
				var synopsis = entries[i].getElementsByTagName("synopsis")[0].firstChild.data;

				// Modify the following var to fit your URL scheme
				var link = "/permalink/" + handle + "/";

				var dt = result.appendChild(document.createElement("dt"));
				var a = dt.appendChild(document.createElement("a"));

				a.appendChild(document.createTextNode(title));
				a.setAttribute("href", link);

				var dd = result.appendChild(document.createElement("dd"));
				dd.appendChild(document.createTextNode(synopsis));
			}

		} else {
			var result = document.createElement("p");
			result.setAttribute("id", "search-result");
			result.appendChild(document.createTextNode("No matches found."));
		}

		var prevResult = document.getElementById("search-result");

		return prevResult ?
			prevResult.parentNode.replaceChild(result, prevResult) :
			loading.parentNode.appendChild(result);
	}
}

// Initialise Script
window.onload = function() {
	new LiveSearch("search", "http://blog.orangetape.com/archive/search/");
}
