function rpc_serialize_array(n, arr) {
	var s="";
	var j=0;
	for (i in arr) {
		s+=encodeURIComponent(i)+"="+encodeURIComponent(arr[i])+"&";
	}
	if (s.length>0) s=s.substr(0, s.length-1);
	return s;
}

function rpc_unserialize_array(s) {
	s+="&";
	var params=s.split("&");
	var arr=new Array();
	for (i in params) {
		var val=params[i].split("=");
		val[0]=decodeURI(val[0]);
		val[0]=val[0].substr(2, val[0].length-3);
		val[1]=decodeURI(val[1]);
		if (val[1]!=undefined)
			arr[val[0]]=val[1];
	}
	return arr;
}

function rpc_send(data) {
	if (typeof XMLHttpRequest != "undefined") {
		var r = new XMLHttpRequest;
		// generate RPC request
		r.open('POST', '/rpc/', false);
		r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		// send data
		try {
			r.send(data);
		} catch (e) {
			alert("rpc_send(): Sending failed. Error: "+e.name+" ("+e.message+")");
			return false;
		}
		headers=r.getAllResponseHeaders();
		s=r.responseText;
	} else {
		var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
		xmlHttpReq.open("POST", '/rpc/', false);
		xmlHttpReq.send(data);
		s=xmlHttpReq.responseText;
	}
	// alert("DEBUG: RPC answer="+s);
	var retVal=new rpc_RETVAL();
	retVal.status=s.substr(0, s.indexOf("\n"));
	retVal.message=s.substr(s.indexOf("\n")+1);
	return retVal;	
}

/*
	Object "RPC_RETVAL":
		- returned from a RPC call
		- field "status" contains the return code of the request
		- field "message" contains other data the server sent
*/
function rpc_RETVAL() {
}