/* Copyright (c) 2006 N2N Consulting Pte Ltd. All rights reserved. */

/**
* @author Antonius Ng
* 
* $Id: JsonRpcJava.js,v 1.1 2007/05/30 09:10:42 antonius Exp $
*/

dojo.provide("n2n.JsonRpcJava");
dojo.provide("n2n.JsonProcedure");
dojo.require("dojo.lang.*");
dojo.require("dojo.collections.*");
dojo.require("dojo.io.*");

/**
* @class JsonRpcJava object. This Object is used to make a 
* json rpc call to JsonRpcJava Servlet
*
* Usage:
* var jsonrpcjava = new n2n.JsonRpcJava("/JSON");
*
* var procedure = new n2n.JsonProcedure("validateUsername");
*
* procedure.addParam("anton");
* 
* procedure.successMethod = function(data) {
* 	alert("success with data["+data+"]");
* }
* procedure.errorMethod = function(data) {
*   alert("error with data["+data+"]");
* }
*
* jsonrpcjava.run(procedure);
* 
*/


n2n.JsonRpcJava = Class.create();

n2n.JsonRpcJava.prototype= {

	initialize: function(url) {
		this.url = url;
		loadJSON();
	},
	
	run: function(procedure) {
		procedure.loadingMethod();
		
		var request = {
				url: this.url,
				postContent: jsonrpc._makeRequest(procedure.methodName,procedure.getParams(),null).data,
				method: "POST",
				mimetype: "text/json",
				load: function(type, data, evt) {
					if(data.error) {
						procedure.errorMethod(data.error);
						return;
					}
					procedure.successMethod(data.result);
				},
    			error: function(type, data) {
	    			procedure.errorMethod(data.error);
    			}
		}
		if (procedure.enableHistory) {
    		request.back= procedure.backMethod;
		}
		if (procedure.synchronous) {
			request.sync=true;
		}
		dojo.io.bind(request);
	}
}


/**
* @class JsonProcedure object. This Object is used to make a 
* json rpc call to JsonRpcJava Servlet
*
* Usage:
* var jsonrpcjava = new n2n.JsonRpcJava("/JSON");
*
* var procedure = new n2n.JsonProcedure("validateUsername");
*
* procedure.addParam("anton");
* 
* procedure.successMethod = function(data) {
* 	alert("success with data["+data+"]");
* }
* procedure.errorMethod = function(data) {
*   alert("error with data["+data+"]");
* }
*
* jsonrpcjava.run(procedure);
* 
*/

n2n.JsonProcedure = Class.create();

n2n.JsonProcedure.prototype= {
	
	initialize: function(methodName) {
		this.methodName = methodName;
		this.params = new dojo.collections.ArrayList();
		this.enableHistory = false;
		this.synchronous = false;
	},
	clearParam: function() {
		this.params.clear();
	},
	addParam: function(param) {
		this.params.add(param);
	},
	successMethod: function(data) {
		//To be overridden
		alert("success with data["+data+"]");
	},
	errorMethod: function(data) {
		//To be overridden
		alert("error with data["+data+"]");
		throw new JSONRpcClient.Exception(data.code, data.msg, data.trace);
	},
	loadingMethod: function() {
		//To be overridden
	},
	backMethod: function() {
		//To be overridden
	},
	getParams: function() {
		return this.params.toArray();
	}
	
}