function DBItem(title, url, description) {
	this.title = title;
	this.url = url;
	this.description = description;
	this.element = null;

	this.toElement = function() {
		if (this.element != null) return this.element;

		this.element = document.createElement('div');
		var a = document.createElement('a');
		a.appendChild(document.createTextNode(this.title));
		a.setAttribute('href', this.url);
		this.element.appendChild(a);
		this.element.appendChild(document.createElement('br'));
		this.element.appendChild(document.createTextNode(this.description));

		return this.element;
	}
}

var db = [];

function loadXML(x) {
	var items = x.getElementsByTagName('item');
	for (var i = 0; i < items.length; i++) {
		db.push(new DBItem(
			items[i].getElementsByTagName('name')[0].firstChild.data,
			items[i].getElementsByTagName('url')[0].firstChild.data,
			items[i].getElementsByTagName('description')[0].firstChild.data
		));
	}
}

function loadSearchDB(uri, loadfunc) {
	var req = new XMLHttpRequest();
	req.open('GET', uri, true);
	req.onreadystatechange = function() {
		if (req.readyState == 4 && req.status == 200) {
			loadXML(req.responseXML);
			loadfunc();
		}
	}
	req.send(null);
}

function querydb(search) {
	var words = search.split(/\s+/);
	// Copy the array. IE takes a shortcut here somehow and winds up
	// clobbering db
	var s = [].concat(db);
	for (var i in words) {
		var re = new RegExp(words[i], "i");
		s = query(s, re);
		if (s.length == 0) break;
	}
	return s;
}

function query(db, re) {
	var result = [];
	var l = (db.length > 100 ? 100 : db.length);

	for (var i = 0; i < l; i++) {
		if (db[i].title.match(re) ||
		    db[i].url.match(re) ||
		    db[i].description.match(re)) {
			result.push(db[i]);
		}
	}

	return result;
}

function getall() {
	var result = [];

	for (var i = 0; i < db.length; i++) {
		result.push(db[i].toElement());
	}

	return result;
}
