if (typeof XMLHttpRequest  === "undefined") {
  XMLHttpRequest = function() {
    try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
      catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
      catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP"); }
      catch(e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP"); }
      catch(e) {}
    throw new Error("This browser does not support XMLHttpRequest.");
  };
}


var timo;
function AJAX(request) {
	runIt = function() {
		var parameters = request.method == 'GET' ? '?':'';
		var myHTTP;
		try {
		  myHTTP = new XMLHttpRequest();
		} catch (e) {
			throw new Error("This browser does not support XMLHttpRequest.");
		}
	
		myHTTP.onreadystatechange = function() {
			if(myHTTP.readyState == 4) {
				if (myHTTP.getResponseHeader('Status') == 'success' && typeof(request.onSuccess) == 'function') {
					request.onSuccess(myHTTP.responseText);
				}
				else if (myHTTP.getResponseHeader('Status') == 'eval' && myHTTP.responseText.length > 0) {
					eval(myHTTP.responseText);
				}
				else if (myHTTP.getResponseHeader('Status') == 'failure' && typeof(request.onFailure) == 'function') {
					request.onFailure(myHTTP.responseText);
				}
				
				if (typeof(request.onComplete) == 'function') {
					request.onComplete(myHTTP.responseText);
				}
				
				if (myHTTP.getResponseHeader('Status') == 'success' && request.resultIn && myHTTP.responseText.length > 0) {
					eval(request.resultIn + ' = myHTTP.responseText;');
				}
				else if (myHTTP.getResponseHeader('Status') == 'success' && request.resultConcatIn && myHTTP.responseText.length > 0) {
					eval(request.resultConcatIn + ' =  myHTTP.responseText + ' + request.resultConcatIn + ';');
				}
				else if (myHTTP.getResponseHeader('Status') == 'success' && request.resultInConcat && myHTTP.responseText.length > 0) {
					eval(request.resultInConcat + ' = ' + request.resultInConcat + ' + myHTTP.responseText;');
				}
			}
		}
		
		request.url += request.url.indexOf('?') > -1  ? '&'+Math.random() : '?'+Math.random();
		
		if (request.data) {
			for (param in request.data) {
				if(typeof(request.data[param]) == 'array') {
					for(var i=0; i<request.data[param].length; i++) {
						parameters += param+'['+i+']=' + request.data[param][i] + '&';
					}
				} else if(typeof(request.data[param]) == 'object') {
					
					for(var i in request.data[param]) {
						parameters += param+'['+i+']=' + request.data[param][i] + '&';
					}
				}else {
					parameters += param+'=' + request.data[param] + '&';
				}
				
			}
			parameters = parameters.substr(0, parameters.length - 1);
		}
		
		if (request.method == 'GET') {
			myHTTP.open('GET', request.url + parameters, true);
			parameters = null;
		}
		else if (request.method == 'POST' || typeof(request.method) == 'undefined') {
			myHTTP.open('POST', request.url, true);
			myHTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			myHTTP.setRequestHeader("Content-length", parameters.length);
			myHTTP.setRequestHeader("Connection", "close");
		}
		
		myHTTP.send(parameters);
	}
	
	if (request.delay) {
		if (timo) {
			clearTimeout(timo);
		}
		timo = setTimeout('eval("runIt();")', request.delay);
	}
	else if (request.cancel && timo) {
		clearTimeout(timo);
	}
	else {
		runIt();
	}
}