var AjaxContentArea = {
	known_area_ids: Object(),
	known_area_urls: Object(),
	known_area_timeouts: Object(),

	registerAjaxContentArea: function(name, id, url, timeout) {
		if(!name) {
			alert("Name not set, can't register Ajax Content Area with id '"+id+"'");
			return;
		}
		if(!url) {
			alert("URL not set, can't register Ajax Content Area with name '"+name+"'");
			return;
		}

		if (!AjaxContentArea.known_area_ids[name]) {
			AjaxContentArea.known_area_ids[name] = new Array();
		}

		AjaxContentArea.known_area_ids[name].push(id);

		AjaxContentArea.known_area_urls[id] = url;
		AjaxContentArea.known_area_timeouts[id] = timeout;
	},

	startUpdating: function(id) {
		AjaxContentArea.updateById(id, false);
		if(!AjaxContentArea.known_area_timeouts[id] || AjaxContentArea.known_area_timeouts[id] < 0) return;

		setTimeout(function() {
			AjaxContentArea.updateById(id, true);
		}, AjaxContentArea.known_area_timeouts[id]);
	},

	updateById: function(id, schedule_next_update) {
		var url = AjaxContentArea.known_area_urls[id];

		if (url) {
			AjaxContentArea.makeCall(url, function(result) {
				AjaxContentArea.callBack(id, url, result, schedule_next_update);
			})
		}
	},

	update: function(name) {
		var ids = AjaxContentArea.known_area_ids[name];
		if(!ids) return;
		if(!ids.length) return;
		for(var i=0; i<ids.length; i++) {
			var id = ids[i];
			// separate function to create new scope so variables
			// don't get overwritten in next iteration
			var url = AjaxContentArea.known_area_urls[id];

			if (id && url)
				AjaxContentArea.initiateUpdateAjaxCall(id, url);
		}
	},

	initiateUpdateAjaxCall: function(id, url) {
		AjaxContentArea.makeCall(url, function(result) {
			AjaxContentArea.callBack(id, url, result, false);
		});
	},

	callBack: function(id, url, result, schedule_next_update) {
		var target_div = document.getElementById(id);
		if(!target_div) {
			alert("Can't find div with id '"+id+"'");
			return;
		}
		target_div.innerHTML = result;
		if(schedule_next_update) {
			setTimeout(function() {
				AjaxContentArea.updateById(id, true);
			}, AjaxContentArea.known_area_timeouts[id]);
		}
	},

	makeCall: function (url, callbackFunction) {
		if(!url) {
			alert("URL for Ajax Content Area not set, can't make call");
			return;
		}
		var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0");

		request.open("POST", url, true);
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

		request.onreadystatechange = function() {
			if (request.readyState == 4 && request.status == 200) {
				if (request.responseText) {
					callbackFunction(request.responseText);
				}
			}
		}
		request.send('');
	}
}
