
var http;

function makeAjax(select, txt, bt, ajaxsrc){
	var myArray = ajaxsrc.split(';');
	var href = myArray[0];
	var chars = myArray[1];

	select.refresh = function(e) {
		if (e === false || ajaxSetPrevEvent(select, e)) {
			ajaxRefresh(select, txt.value, chars, href);
			return true;
		}
		return false;
	}

	txt.onkeyup = function(e) {
		if( !e ) {
	        if( window.event ) {
	            e = window.event;
	        } else {
	            return;
	        }
	    }
	    
	    if( typeof( e.which ) == 'number' ) {
	        c = e.which;
	    } else if( typeof( e.keyCode ) == 'number'  ) {
	        c = e.keyCode;
	    } else if( typeof( e.charCode ) == 'number'  ) {
	        c = e.charCode;
	    } else {
	        return;
	    }
    
		if(c != 40 && c != 38 && c != 13) {  // De lijst niet refreshen wanneer de down of up key wordt ingedrukt
			if (select.refresh(e)) {
				e.cancelBubble = true;
				if (e.stopPrpagation) e.stopPrpagation();
				return false;
			}
		}
	}

	if (bt) {
		var old_onmousedown = bt.onmousedown;
		bt.onmousedown = function (e) {
			if (ajaxSetPrevEvent(select, e)) {
				ajaxUpdate(select, txt.value, href);
			} else {
				old_onmousedown();
			}
		};
	}
}

function getHTTPObject() {
	var xmlhttp;
	/*@cc_on
	@if (@_jscript_version >= 5)
	try {
	xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
	try {
	xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (E) {
	xmlhttp = false;
	}
	}
	@else
	xmlhttp = false;
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
			xmlhttp.overrideMimeType("text/xml");
		} catch (e) {
			xmlhttp = false;
		}
	}
	return xmlhttp;
}

function ajaxHandleHttpResponse(select) {
	if (http.readyState == 4) {
		if (http.responseText.indexOf('invalid') == -1) {

			var xmlDocument = http.responseXML;

			var sel = xmlDocument.documentElement;
			var node = sel.firstChild;
			
			while (select.firstChild) {
				if (select.firstChild.selected) var selval = select.value ;
				select.removeChild(select.firstChild);
			}

			while (node) {
				if (node.nodeType != 1) {
					node = node.nextSibling;
					continue;
				}
				
				var desc = node.firstChild ? node.firstChild.nodeValue : '';
				var value = node.getAttribute("value");
				if (selval && node.value==selval) var seli = select.options.length;
			
				var opt = new Option(desc, value, false, false, selval && node.value==selval);
				select.options[select.options.length] = opt;
				for (var i=0;i < node.attributes.length; i++) {
					if (node.attributes.item(i).name == 'value') continue;
					opt.setAttribute(node.attributes.item(i).name, node.attributes.item(i).value);
				}
				
				node = node.nextSibling;
			}

			// Fix for IE: won't use the defaultSelected and selected argument for new Option
			if (seli) select.options[seli].selected = true;

			if (typeof select.onrecalc == 'function') select.onrecalc();
			if (select.ajaxPrevEvent) triggerEvent(select.ajaxPrevEvent, 'ajax');
		}
		isWorking = false;
	}
}

var isWorking = false;
function ajaxUpdate(select, value, href) {
	if (!http) http = getHTTPObject()
	if (!http) return;
	
	// If is working, try again 200ms later
	if (isWorking && (typeof(ajaxtoid) == 'undefined')) {
		var fn = function() {
			ajaxtoid = undefined;
			ajaxUpdate(select, value, href);
		}
		ajaxtoid = window.setTimeout(fn, 200);
		return;
	}
	
	switch (true) {
		case !select.ajaxFilter: break;
		case select.ajaxFilter.value == "": return;
		default: href += "&filter=" + (typeof(select.ajaxFilter.value) != 'undefined' ? select.ajaxFilter.value : select.ajaxFilter);
	}

	http.open("GET", href + (value !== "" ? "&param=" + escape(value) : ""), true);
	http.onreadystatechange=function() {ajaxHandleHttpResponse(select)};
	isWorking = true;
	http.send(null);
}

function ajaxRefresh(select, value, chars, href) {
	if (typeof(ajaxtoid) != 'undefined') {
		window.clearTimeout(ajaxtoid);
		ajaxtoid = undefined;
	}
	
	if (select.ajaxFilter) ajaxUpdate(select, value, href);
	var timeout = value.length >= chars ? 200 : 1000;

	if (value.length < chars) {
		while (select.firstChild) select.removeChild(select.firstChild);
		if (typeof select.onrecalc == 'function') select.onrecalc();
	}
	
	var fn = function() {
		ajaxtoid = undefined;
		ajaxUpdate(select, value, href);
	}
	ajaxtoid = window.setTimeout(fn, timeout);
}

function ajaxSetPrevEvent(select, e) {
	if (!e) e = window.event; // capture IE/Mozilla event
	
	// Bug in FF: once event.cancelBubble has been read, it cannot be written.
	var ec = new Object();
	for (i in e) {
        if (i == 'cancelBubble') continue;
		ec[i] = e[i];
    }
    
	if (typeof(ec.retrigger) != 'undefined' && ec.retrigger == 'ajax') {
		select.ajaxPrevEvent = "";
		return false;
	}
	
	select.ajaxPrevEvent = ec;
	return true;
}