var ajaxData = ajaxEvent_success = ajaxEvent_failure = null;
var ajaxMessageTextElem = false, ajaxMessagePopupElem = false;
var ajaxMessageTimer = false;
var ajaxDebug = false;


function setChildText(id, value){
	var elem = findElem(id);
	if(elem && elem.childNodes.item(0))	// TODO: Get this to work better, not a quick hack
		elem.childNodes.item(0).nodeValue = value;
}

function getChildText(id, value){
	var elem = findElem(id);
	if(elem && elem.childNodes.item(0))	// TODO: Get this to work better, not a quick hack
		return elem.childNodes.item(0).nodeValue;
}

function findElem(tag){
	if(typeof(tag) == "string"){
		var elem = document.getElementById(tag);
		if(elem)
			return elem;
		else{
			alert(returnStack() + "\nElement " + tag + " Not found");
			return false;
		}
	}
	else if(typeof(tag) == "object" && tag.childNodes){
		return tag;
	}
	else{
		alert(returnStack() + "\nUnknown parameter type " + typeof(tag));
	}
}

function returnStack(){
	var ret = "";
	var caller = returnStack.caller;
	var ret = caller.name;
	for(var a = 0;a < 10;a++){
		if(!caller.caller)
			break;
		caller = caller.caller;
		ret = caller.name + "." + ret;
	}

	return ret;
}

function ajaxMessage(textElem, popupElem){
	ajaxMessageTextElem = findElem(textElem);
	ajaxMessagePopupElem = findElem(popupElem);
}

function hideAjaxMessage(){
	setChildText(ajaxMessageTextElem, '');
	ajaxMessagePopupElem.style.display = 'none';
	ajaxMessageTimer = false
}

function ajaxStateHandler() {
	if(ajaxData == null)
		return false;
	if (ajaxData.readyState == 4) {
		if(ajaxMessageTextElem){
			ajaxMessageTimer = window.setTimeout("hideAjaxMessage();", 1000);
		}
		if(ajaxDebug)
			alert("ajax(" + ajaxData.status + ", " + ajaxData.responseText +")");
		if (ajaxData.status == 200)
			ajaxEvent_success();
		else
			ajaxEvent_failure();
	}
	return true;
}

function ajax(message, method, url, content, success, failure){
	/* Check for running connections */
	if (ajaxData != null && ajaxData.readyState != 0 && ajaxData.readyState != 4){
		ajaxData.abort();
	}

	try {
		ajaxData = new XMLHttpRequest();
	}
	catch (error) {
		try {
			ajaxData = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (error) {
			failure();
			return false;
		}
	}

	if(ajaxDebug)
		alert("ajax(" + method + ", " + url + ")");
	if(ajaxMessageTextElem){
		if(ajaxMessageTimer != false)
			window.clearTimeout(ajaxMessageTimer);
		setChildText(ajaxMessageTextElem, message);
		ajaxMessagePopupElem.style.display = "block";
	}
	ajaxData.open(method, url, true);
	ajaxData.onreadystatechange = ajaxStateHandler;
	ajaxEvent_success = success;
	ajaxEvent_failure = failure;

	ajaxData.send(content);
}
