var HistoryController = function(requestUrl, requestTimeout) {

	var E_LOADING = "history_loading";
	var E_TIMEOUT = "history_timeout";
	var E_ERROR = "history_error";
	var E_RESULT = "history_result";
	var E_LIST = "history_list";

	this.init = function() {
		showElement(E_LOADING);
		this.load();
	}

	this.refreshList = function() {
		hideElement(E_TIMEOUT);
		hideElement(E_RESULT);
		this.init();
	}

	this.load = function() {
		var request = ((typeof XMLHttpRequest != 'undefined') ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"));
		var url = requestUrl + "?list&requestId=" + (new Date().getTime());
		request.open("GET", url, true);
		var thisClosure = this;
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200)
					thisClosure.processResponse(request.responseText);
			}
		}
		request.send(null);
		setTimeout((function() {thisClosure.processTimeout(request)}), requestTimeout);
	}

	this.processResponse = function(responseText) {
		hideElement(E_LOADING);
		if (responseText == "null") {
			showElement(E_ERROR);
			return;
		}
		try {
			var response = eval("[" + responseText + "]")[0];
			var listElement = getElement(E_LIST);
			listElement.options.length = 1;
			var j = 1;
			for (var i in response)
				listElement.options[j++] = new Option(response[i], i);
			showElement(E_RESULT);
		} catch(e) {
			showElement(E_ERROR);
		}
	}

	this.processTimeout = function(request) {
		if (request.readyState == 4 && request.status == 200)
			return;
		request.abort()
		hideElement(E_LOADING);
		showElement(E_TIMEOUT);
	}
}