/*
 * HTTP-RPC functions
 *
 */


var g_rpc_handler_uri='';
var g_rpc_call_counter=Math.floor(Math.random()*10000);
var g_rpc_call_register=new Array();



function rpc_async(handler,funcname,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)
{
	return rpc_perform(funcname,handler,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
}
function rpc(funcname,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)
{
	return rpc_perform(funcname,false,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
}





function rpc_get_id()
{
	g_rpc_call_counter++;
	return g_rpc_call_counter;
}
function rpc_is_array(a)
{
	if (typeof(a)=='object') return true;
	if (a==null) return false;
	if (a==false) return false;
	if (a.length && !a.substring) return true;
	return false;
}
function rpc_addslashes(a)
{
	if (a==null) return '';
	var str = (''+a);
	str = str.replace(/\\/gm,'\\\\');
	str = str.replace(/\"/gm,'\\\"');
	return str;
}
function rpc_strlen(a)
{
	if (a==null) return 0;
	return (''+a).length;
}
function rpc_array_serialize(arg)
{
	if (!rpc_is_array(arg)) return 's:'+(rpc_strlen(arg))+':\"'+rpc_addslashes(arg)+'\";';
	var arrlen=0;
	var result='';
	for (var i in arg) 
	{
		var key=''+i;
		
		// Prototype sotkee tämän ellei puukota näin
		if (key=='prototype' && typeof(arg[i])=='object') continue;
		if (key=='argumentNames' && typeof(arg[i])=='object') continue;
		if (typeof(arg[i])=='function') continue;
		
		result+='s:'+rpc_strlen(key)+':\"'+rpc_addslashes(key)+'\";';
		result+=rpc_array_serialize(arg[i]);
		arrlen++;
	}
	var result='a:'+arrlen+':{'+result+'}';
	return result;
}
function rpc_arg_getvalue(arg)
{
	if (!arg) return '';
	return arg;
	/*
	if (arg.type)
	{
		return getElementValue(arg);
	}
	else
	{
		return arg;
	}
	*/
}
function rpc_arg_add(argset,arg)
{
	if (arg==null) return argset;
	argset[argset.length]=rpc_arg_getvalue(arg);
	return argset;
}
function rpc_make_query(rpccall)
{
	var abool = false;
	if(g_rpc_handler_uri.indexOf('://')>=0)
	{
		abool = true;
	}
	var sep = '?';
	if(g_rpc_handler_uri.indexOf('?')>=0)
	{
		sep = '&';
	}
	if(abool)
		return g_rpc_handler_uri+sep+'_rpc='+encodeURIComponent(rpc_array_serialize(rpccall));
	else 
		return appurl+'/'+g_rpc_handler_uri+sep+'_rpc='+encodeURIComponent(rpc_array_serialize(rpccall));
}
function rpc_perform(funcname,async_handler,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)
{
	var rpccall=new Array();
	rpccall=rpc_arg_add(rpccall,arg1);
	rpccall=rpc_arg_add(rpccall,arg2);
	rpccall=rpc_arg_add(rpccall,arg3);
	rpccall=rpc_arg_add(rpccall,arg4);
	rpccall=rpc_arg_add(rpccall,arg5);
	rpccall=rpc_arg_add(rpccall,arg6);
	rpccall=rpc_arg_add(rpccall,arg7);
	rpccall=rpc_arg_add(rpccall,arg8);
	rpccall=rpc_arg_add(rpccall,arg9);
	rpccall['id']=rpc_get_id(),
	rpccall['funcname']=funcname;
	if (async_handler) 
	{
		rpccall['js_handler']=async_handler;
		rpcquery=rpc_make_query(rpccall);
		HTTPQuery(rpcquery,rpc_handle_query,rpccall['id']);
		g_rpc_call_register[rpccall['id']]=rpccall;
	}
	else
	{
		rpcquery=rpc_make_query(rpccall);
		var rpcresult=rpc_parse_result(HTTPQuery(rpcquery,false,rpccall['id']));
		return rpcresult['result'];
	}
}
function rpc_errorwindow(message)
{
	var w=window.open('','_blank','top=10,left=10,width=600,height=600,scrollbars,resizable=yes');
	w.document.write('<pre>'+message+'</pre>');
}
function rpc_handle_query(statuscode,resulttext)
{
	if (statuscode==200)
	{
		var result=rpc_parse_result(resulttext);
		if (!result['id']) return;
		if (result['js_handler'])
		{
			g_rpc_call_register[result['id']]['result']=result['result'];
			try
			{
				eval('var realresult='+result['js_handler']+'(g_rpc_call_register[\''+result['id']+'\'][\'result\'])');
			}
			catch (e)
			{
				alert('rpc_handle_query: '+e.message);
				rpc_errorwindow('rpc_handle_query: '+e.message+' parsing '+result['js_handler']+'(g_rpc_call_register[\''+result['id']+'\'][\'result\'])');
			}
		}
	}
}
function rpc_parse_result(responsetext)
{
	try
	{
		eval(responsetext);
		return result;
	}
	catch (e)
	{
		alert('rpc_parse_result: ['+e.message+'] parsing '+responsetext+' ('+responsetext.length+')');
		rpc_errorwindow('rpc_parse_result: ['+e.message+'] parsing '+responsetext+' ('+responsetext.length+')');
		return false;
	}
}
function rpc_init(rpc_handler_uri)
{
	g_rpc_handler_uri=rpc_handler_uri;
}

