Rpc = Class.create();
Object.extend(Rpc, {
	_CallIndexArgs: 'CallArguments',
	_CallIndexArgsAsArray: 'CallArgumentsAsArray',
	_Call2Uri: function (call) { return call+'.call.php'; },
	_method: 'post',
	ArgumentsAsArray: true,
	_ParseParams: function (params) {
		if (typeof(params) == 'undefined')
			return null;
		else {
			objParams = {};
			objParams[this._CallIndexArgs] = (typeof(params)=='object' ? Object.toJSON(params) : params.toJSON());
			if (this.ArgumentsAsArray)
				objParams[this._CallIndexArgsAsArray] = 1;
			return objParams;
		}
	},
	Call: function (call, params, onSuccessFn, objParams) {
		if (!objParams) objParams = new Object();
		objParams = Object.extend({
			onSuccess: onSuccessFn,
			parameters: this._ParseParams(params),
			method: this._method,
			asynchronous: true
		}, objParams);
		new Ajax.Request(this._Call2Uri(call), objParams);
	},
	Updater: function (layer, call, params, onSuccessFn, objParams) {
		if (typeof(layer) == 'number') {
			this._UpdaterFrequency = layer;
			return this._UpdaterPeriodical;
		} else {
			if (!objParams) objParams = new Object();
			objParams = Object.extend({
				onSuccess: onSuccessFn,
				parameters: this._ParseParams(params),
				method: this._method,
				asynchronous: true
			}, objParams);
			new Ajax.Updater(layer, this._Call2Uri(call), objParams);
		}
	},
	_UpdaterFrequency: null,
	_UpdaterPeriodical: function (layer, call, params, onSuccessFn, objParams) {
		objParams = Object.extend({
			frequency: Rpc._UpdaterFrequency,
			onSuccess: onSuccessFn,
			parameters: Rpc._ParseParams(params),
			method: Rpc._method,
			asynchronous: true
		}, objParams);
		new Ajax.PeriodicalUpdater(layer, Rpc._Call2Uri(call), objParams);
	}
});