
// Queue
var queue = new Array();
function sendAndLoad(_server, _callBack, _element, _method, _params) {
	addToQueue(_server, _callBack, _element, _method, _params);
}
function addToQueue(_server, _callBack, _element, _method, _params) {
	var n = queue.length;
	queue[n] = new Object();
	queue[n].server = _server;
	queue[n].callBack = _callBack;
	queue[n].element = _element;
	queue[n].method = _method;
	queue[n].params = _params;
	
	// Jos lisätty objekti on listan ainoa,
	// pitää listan pyörittäminen käynnistää.
	queue.length == 1 ? processQueue() : null;
}
function remFromQueue() {
	queue.shift();
	queue.length > 0 ? processQueue() : null;
}
function processQueue() {
	// Aja jonon ensimmäinen objekti ja poista se sitten listalta. Jatka
	// listan pyörittämistä kunnes siellä ei ole enään objekteja.
	
	process(queue[0].server, queue[0].method, queue[0].params);
}


// XMLHttp:t
function process(_server, _method, _params) {
	if (XMLHttp) {
		if (_method == "GET") {
			_server += "?" + _params;
			_params = null;
		} 
		if (_method == "POST" && !_params) {
			_params = "fill=bill";
		} 
		
		if (_method != "POST" && _method != "GET") {
			alert("Lähettämisessä käytettävän parametrin 'method' arvo ei ole sopiva. Mahdolliset arvot ovat 'POST' ja 'GET'. Huom! Nämä arvot ovat 'case-sensitive'.");
		}
		// try to connect to the server
		try {
			if (XMLHttp.readyState == 4 || XMLHttp.readyState == 0) {
				XMLHttp.open(_method, _server, true);
				// Jos "POST"
				if(_method == "POST")
					XMLHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
				XMLHttp.onreadystatechange = handleRequestStateChange;
				XMLHttp.send(_params);
			} else {}
		} catch (e) {
			displayError(e.toString());
		}
	}
}

function handleRequestStateChange() {
	if (XMLHttp.readyState == 4) {
		if (XMLHttp.status == 200) {
			try {
				executeQueueElement();
			} catch(e) {
				displayError(e.toString());
			}
		} 
		else {}
	}
}

function executeQueueElement() {
	try {
		var inputValues = new Array();
		inputValues.push(queue[0].server);
		inputValues.push(queue[0].callBack);
		inputValues.push(queue[0].element);
		inputValues.push(queue[0].method);
		inputValues.push(queue[0].params);		
		
		queue[0].callBack(XMLHttp.responseXML, queue[0].element);
		
		remFromQueue()
	} catch(e) {
		displayError(e.toString);
	}
} 

function displayError(e) {
	// alert("Error accessing the server! " + e);
}


/** */
var XMLHttp = create_XHRObject();
function create_XHRObject() {
	var _XMLHttp;
	// this should work for all browsers except IE6 and older
	try {
		_XMLHttp = new XMLHttpRequest();
	} catch(e) {
		// assume IE6 or older
		var XMLHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
										"MSXML2.XMLHTTP.5.0",
										"MSXML2.XMLHTTP.4.0",
										"MSXML2.XMLHTTP.3.0",
										"MSXML2.XMLHTTP",
										"Microsoft.XMLHTTP");
	
		for (var i=0; i<XMLHttpVersions.length && !_XMLHttp; i++) {
			try { 
				_XMLHttp = new ActiveXObject(XMLHttpVersions[i]);
			} catch (e) {}
		}
	}
	
	if (!_XMLHttp)
		alert("Error creating the XMLHttpRequest object.");
	else 
		return _XMLHttp;
}
