var quickmenu = null;
var quickmenuMain = null;
var quickmenuElem = null;
var quickmenuResults = null;
var quickmenuSearchBox = null;
var quickmenuLoading = false;
var quickmenuShown = false;
var quickURI = null;

function showQuickmenu() {
	show('quickmenu');
	quickmenuShown = true;
	quickmenuSearchBox.value = '';
	searchQuickmenu();
	quickmenuSearchBox.focus();
}

function hideQuickmenu() {
	hide('quickmenu');
	quickmenuShown = false;
}

function quickmenuError(text) {
	quickmenuElem.appendChild(document.createElement('hr'));
	quickmenuElem.appendChild(document.createTextNode(text));
}

function showQuickmenuSearchResults(res) {
	for (name in res) {
		div = Bytex64.DOM.qe('div', {className: 'quickresult'});

		a = Bytex64.DOM.qe('a', {href: quickmenu[name].uri});
		a.appendChild(document.createTextNode(name));
		div.appendChild(a);

		desc = Bytex64.DOM.qe('div', {className: 'description'});
		desc.appendChild(document.createTextNode(quickmenu[name].description));
		div.appendChild(desc);

		quickmenuResults.appendChild(document.createElement('hr'));
		quickmenuResults.appendChild(div);
	}
}

function searchQuickmenu() {
	while (quickmenuResults.firstChild)
		quickmenuResults.removeChild(quickmenuResults.firstChild);

	if (quickmenuSearchBox.value == '') {
		showQuickmenuSearchResults(quickmenuMain);
		quickURI = null;
		return;
	}

	re = new RegExp(quickmenuSearchBox.value, 'i');
	results = {};
	nresults = 0;
	quickURI = null;
	for (name in quickmenu) {
		i = quickmenu[name];
		if (re.test(name) ||
		    re.test(i.description) ||
		    re.test(i.uri)) {
		    	results[name] = quickmenu[name];
			nresults++;
			if (quickURI == null)
				quickURI = i.uri;
		}
	}

	if (nresults > 0) {
		showQuickmenuSearchResults(results);
	} else {
		div = Bytex64.DOM.qe('div', {className: 'quickresult'});
		div.appendChild(document.createTextNode('No Results'));
		quickmenuResults.appendChild(document.createElement('hr'));
		quickmenuResults.appendChild(div);
	}
}

function processQuickmenu(text) {
	try {
		quickmenu = eval('(' + text + ')');
	} catch(e) {
		quickmenuError(e.toString());
	}

	// Add search box
	var searching;
	quickmenuSearchBox = Bytex64.DOM.qe('input', {type: 'text'});
	quickmenuSearchBox.style.width = '100%';
	Bytex64.DOM.addEventListener(quickmenuSearchBox, 'keyup', function(e) {
		if (e.keyCode == 13 && quickURI) {
			location.href = quickURI;
			return;
		}
		if (searching) return;
		searching = setTimeout(function() {
			searchQuickmenu();
			searching = null;
		}, 50);
	});
	quickmenuElem.appendChild(quickmenuSearchBox);

	// Add results
	quickmenuResults = document.createElement('div');
	quickmenuElem.appendChild(quickmenuResults);

	quickmenuMain = {};
	for (name in quickmenu) {
		if (!quickmenu[name].main) continue;
		quickmenuMain[name] = quickmenu[name];
	}
	showQuickmenuSearchResults(quickmenuMain);
	quickmenuLoading = false;
}

function loadQuickmenu() {
	if (quickmenuLoading) return;
	quickmenuLoading = true;

	var req = new XMLHttpRequest();
	req.open('GET', '/stf/quickmenu.json', true);
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			if (req.status == 200) {
				processQuickmenu(req.responseText);
			} else {
				quickmenuError('Error loading menu JSON: ' + req.statusText);
			}
			showQuickmenu();
		}
	};
	req.send(null);
}

function toggleQuickmenu() {
	if (!quickmenuElem) {
		quickmenuElem = document.getElementById('quickmenu');
		loadQuickmenu();
		return false;
	}

	if (quickmenuShown) {
		hideQuickmenu();
	} else {
		showQuickmenu();
	}
	return false;
}

Bytex64.DOM.addEventListener(document, 'keyup', function(e) {
	if (e.keyCode == 192) {
		toggleQuickmenu();
		Bytex64.DOM.preventDefault(e);
		return false;
	}
});

document.getElementById('sitename').onclick = function() { return toggleQuickmenu() };
