(function() {

/** @type Array.<function():*> */
var onloads = [];
function windowOnload() {
	for (var i = 0; i < onloads.length; i++)
		onloads[i]();
}

/** @type function(function():*) */
function addOnload(func) {
	var wrapper = function() {
		if (wrapper.hasRun) return;
		func();
		wrapper.hasRun = true;
	};
	if (document.addEventListener)
		document.addEventListener("DOMContentLoaded", wrapper, false);
	if (window.addEventListener)
		window.addEventListener("load", wrapper, false);
	else {
		window.onload = windowOnload;
		onloads.push(wrapper);
	}
}

addOnload(function() {
	var /** @type HTMLElement|null */ searchBox  = document.getElementById("query"),
		/** @type HTMLElement|null */ letterList = document.getElementById("letterlist"),
		/** @type HTMLElement|null */ searchForm = document.getElementById("searchform");

	var searchFocus = false;
	searchBox.onfocus = function() { searchFocus = true;  searchForm.className = "hasfocus"; };
	searchBox.onblur  = function() { searchFocus = false; searchForm.className = ""; };

	/** @type function(string)|undefined */
	var addLinkValue;
	if ("selectionStart" in searchBox)
		addLinkValue = function(value) {
			var sel = searchBox.selectionStart;
			searchBox.value = searchBox.value.substr(0, sel) +
				value + searchBox.value.substr(searchBox.selectionEnd);
			searchBox.selectionStart = sel + value.length;
		};
	else
		addLinkValue = function(value) { searchBox.value += value; };

	/** @type function(HTMLElement):Object */
	function initLink(anchor) {
		var value = anchor.textContent || anchor.innerText;
		anchor.onmousedown = function() { return !searchFocus; };
		anchor.onclick = function() {
			if (searchFocus)
				addLinkValue(value);
			return !searchFocus;
		};
	}

	var anchors = letterList.getElementsByTagName("a");
	for (var i = 0; i < anchors.length; i++)
		initLink(anchors[i]);
});

})();
