// Save created XMLHttpRequest object for future use.
var cspXMLHttp = null;

// Set this variable to control is GET or POST method used to send request.
var cspUseGetMethod = false;

// Track which XMLHttpRequest object we are using
var cspMozilla = false;

// Execute the JavaScript from all simultaneously executed #call requests.
var cspMultipleCall = true;

// Save in process XMLHttpRequest objects
var cspActiveXMLHttp = null;

function cspFindXMLHttp(async)
{
	if (cspXMLHttp != null && !cspMozilla && !async) return cspXMLHttp;

	if (window.XMLHttpRequest) {
 	 	cspMozilla = true;
		cspXMLHttp = new XMLHttpRequest();

	} else if (window.ActiveXObject) {
 	 	cspMozilla = false;
		try {
			cspXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
 		} catch (e) {
			try {
 		 		cspXMLHttp=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (E) {
				cspXMLHttp=null;
			}
		}
	}

	return cspXMLHttp;
}

function cspIntHttpServerMethod(method, args, async)
{
	var arg;
	var i;
	var err;
	var url = "%25CSP.Broker.cls";
	var n;

	var data = "WARGC=" + (args.length - 1) + "&WEVENT=" + method.replace(/&amp;/,'&');
	for (i = 1; i < args.length; i++) {
		arg = args[i];
		if (typeof arg != "object") {
			// Convert boolean to Cache value before sending
			if (typeof arg == "boolean") arg = cspMakeBoolean(arg);
			data = data + "&WARG_" + i + "=" + cspEncodeUTF8(arg);
		} else if (arg != null) {
			n = 0;
			for (var el in arg) {
				if (typeof arg[el] != "function") {
					data = data + "&W" + i + "=" + cspEncodeUTF8(arg[el]);
					n = n + 1;
				}
			}
			data = data + "&WLIST" + i + "=" + n;
		}
	}

	try {
		if (async) {
			if (cspMultipleCall) {
				if (cspActiveXMLHttp == null) cspActiveXMLHttp = new Array();
				cspActiveXMLHttp[cspActiveXMLHttp.length] = cspXMLHttp;
				cspXMLHttp.onreadystatechange = cspProcessMultipleReq;
			} else {
				cspXMLHttp.onreadystatechange = cspProcessReq;
			}
		}
		if (cspUseGetMethod) {
			cspXMLHttp.open("GET", url+"?"+data, async);
			if (cspMozilla) {
				cspXMLHttp.send(null);
			} else {
				cspXMLHttp.send();
			}
		} else {
			cspXMLHttp.open("POST", url, async);
			cspXMLHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			cspXMLHttp.send(data);
		}
	} catch (e) {
		err='Http object request failed, unable to process HyperEvent.';
		if (typeof cspRunServerMethodError == 'function')
			return cspRunServerMethodError(err);
		alert(err);
		cspXMLHttp = null;
		return null;
	}

	if (async) {
		cspXMLHttp = null;
		return null;
	}

	return cspProcessResponse(cspXMLHttp);
}

function cspProcessMultipleReq() {
	var i = 0;
	var current;
	while (i < cspActiveXMLHttp.length) {
		if (cspActiveXMLHttp[i].readyState == 4) {
			current=cspActiveXMLHttp[i];
			cspActiveXMLHttp.splice(i,1);
			cspProcessResponse(current);
		} else {
			i++;
		}
	}
}

function cspProcessReq() {
	if (cspXMLHttp.readyState == 4) {
		cspProcessResponse(cspXMLHttp)
	}
}

function cspProcessResponse(req) {
	if(req.status != 200) {
		err='Unexpected status code, unable to process HyperEvent: ' + req.statusText + ' (' + req.status + ')';
		if (typeof cspRunServerMethodError == 'function')
			return cspRunServerMethodError(err);
		alert(err);
		return null;
	}

	var i;
	var result=req.responseText;
	var lines = result.split("\r\n")
	var ok = 0;
	var len=lines.length;
	if (lines[len-1]=="") len=len-1;
	for (i=2; i<len; i++) {
		if (lines[i]=="#OK") {
			ok = i;
			break;
		}
	}

	if ((ok==0) || ((lines[1]!="#R") && (lines[1]!="#V"))) {
		err='Http object response incomplete or invalid.'+ok+","+lines[1];
		if (typeof cspRunServerMethodError == 'function')
			return cspRunServerMethodError(err);
		alert(err);
		return null;
	}

	if (ok > 2) {
		var js = lines[2];
		for (i = 3; i < ok; i++) js = js + "\r\n" + lines[i];
		var bidding = new Function('CSPPage', js);
		bidding(self);
	}

	var result = null;
	if (lines[1] == "#R") {
		var result = "";
		if (ok+1 < len) {
			result = lines[ok+1];
			for (i = ok + 2; i < len; i++) {
				result = result + "\r\n" + lines[i];
			}
		}
	}

	// Allow caller to display a debug window.
	if ((typeof cspRunServerDebugWindow != "undefined") && cspRunServerDebugWindow) {
		var debugwin=window.open("","DebugWindow","scrollbars,resizable,height=400,width=700");
		if (debugwin.document.f == null) {
			debugwin.document.write("<html><head></head><body>");
			debugwin.document.title="HyperEvent Debug Window";
			debugwin.document.write('<form name="f">')
			debugwin.document.write('<br>Javascript<br><textarea name="js" cols="80" rows="12">')
			debugwin.document.write(js);
			debugwin.document.write('</textarea>');
			debugwin.document.write('<br>Return Value<br><textarea name="r" cols="80" rows="2">')
			debugwin.document.write(result);
			debugwin.document.write('</textarea>');
			debugwin.document.write('</form>')
			debugwin.document.write("</body></html>");
		} else {
			debugwin.document.f.js.value = js;
			debugwin.document.f.r.value = result;
		}
	}

	return result;
}

function cspHttpServerMethod(method)
{
	if (cspFindXMLHttp(false) == null) {
		err='Unable to locate XMLHttpObject.';
		if (typeof cspRunServerMethodError == 'function')
			return cspRunServerMethodError(err);
		alert(err);
		return null;
	}

	return cspIntHttpServerMethod(method,cspHttpServerMethod.arguments,false);
}

function cspSelectServerMethod(method)
{
	if (cspFindXMLHttp(false) != null) {
		return cspIntHttpServerMethod(method,cspSelectServerMethod.arguments,false);
	} else {
		return cspIntRunServerMethod(method,cspSelectServerMethod.arguments);
	}
}

function cspCallHttpServerMethod(method)
{
	if (cspFindXMLHttp(true) == null) {
		err='Unable to locate XMLHttpObject.';
		if (typeof cspRunServerMethodError == 'function')
			return cspRunServerMethodError(err);
		alert(err);
		return null;
	}

	return cspIntHttpServerMethod(method,cspCallHttpServerMethod.arguments,true);
}

function cspCallSelectServerMethod(method)
{
	if (cspFindXMLHttp(true) != null) {
		return cspIntHttpServerMethod(method,cspCallSelectServerMethod.arguments,true);
	} else {
		return cspIntCallServerMethod(method,cspCallSelectServerMethod.arguments);
	}
}

