
var streamList=new Array();
var ajaxBusy;
var abortCall = false;
var ajaxAction = false;
var ajaxSpinner = false;

function ajaxRequest(actie, functieNaam, parameters, abortLast, synchroon){
	// default op abortLast
	if (abortLast == undefined) 
		abortLast = false;
		
	// voeg actie toe aan lijst
	var paramList = new Array();
	paramList['action'] = actie;
	paramList['function'] = functieNaam;
	paramList['parameters'] = parameters;
	if (synchroon){
		paramList['synchroon'] = true;
	
	}
	streamList[streamList.length] = paramList; 
	
	// vorige actie afbreken?
	if (abortLast && (ajaxAction == actie) && ajaxBusy) 
		abortCall=true;
	
	// als nog niet bezig, dan stromen maar
	if(!ajaxBusy) 
		streamAjax(); 
}

function streamAjax(){
	// als eerste instellen, mocht browser ergens op hangen, dan vang je dat eerder af
	ajaxBusy=true; 
	
	// object aanmaken
	var req = createXMLHTTPObject(); 
	
	// als browser het niet aankan, stoppen
	if (!req) 
		return; 
	
	// spinner tonen
	if (ajaxSpinner) 
		ajaxSpinner.style.display='block';
		
	// pak eerste opdracht uit lijst
	var params = streamList.shift(); 
	//asynchroon?
	if (params['synchroon']){
		var asynchroon = false;
	}else{
		var asynchroon = true;
	}
	//voor eventueel aborten van call
	ajaxAction = params['action']; 
	
	// params uitlezen
	var url = "ajax.php?action="+params['action'];
	var method = (params['parameters']!='') ? "POST" : "GET";// moet je POST of GET gebruiken
	var postData=params['parameters'];
	
	// eerst openen, dan readystatechanger, voor betere reusability
	req.open(method,url,asynchroon); 
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	
	//enctype=multipart/form-data voor file-uploads?
	if (params['parameters']!='') 
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');	
		
	// returnfunctie
	req.onreadystatechange = function () {
		if (abortCall) {
			abortCall=false;
			req.abort();
		} else {
			if (req.readyState != 4) return; // nog niet klaar
			if ((req.status >= 400) || (req.status < 200)) 
				alert('Er is een fout opgetreden: '.req.status);
			// moet hier nog een switch met evt error afhandeling?
			eval(params['function']+'(req)');
		}
		// memory opschonen
		req=false; 
		if (ajaxSpinner) 
			ajaxSpinner.style.display='none';
			
		// volgende actie starten als die er is.
		ajaxBusy=false;
		if(streamList.length>0) 
			streamAjax();
	}
	req.send(postData);	
}

var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}


function xmlValue(xml, tagName){
	var els = xml.getElementsByTagName(tagName);
	if(!els) 
		return false;
	if(!(els[0])) 
		return false;
	return els[0].firstChild.nodeValue;
}


function parseJSON(s,filter) {
	var j;
	function walk(k, v) {
		var i;
		if (v && typeof v === 'object') {
			for (i in v) {
				if (v.hasOwnProperty(i)) {
					v[i] = walk(i, v[i]);
				}
			}
		}
		return filter(k, v);
	}
	if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.
		test(s)) {
			try {
				j = eval('(' + s + ')');
			} catch (e) {
				throw new SyntaxError("parseJSON");
			}
	} else {
		throw new SyntaxError("parseJSON");
	}
	if (typeof filter === 'function') {
		j = walk('', j);
	}
	return j;
}
