// $Id: AjaxRpc.js,v 1.6 2009-03-03 16:36:24 tdebosz Exp $
// Janmedia Interactive

importScript('/sys/plugin/ajax/js/UTF8.js');
importScript('/sys/plugin/ajax/js/AjaxRequest.js');

var AjaxRpc = {

  execute: function(method,params,callbackOK,callbackERROR,context)
  {
  	AjaxRpc.create(method,params,callbackOK,callbackERROR,context).execute();
  },

  create: function(method,params,callbackOK,callbackERROR,context)
  {
	// process function
	var req = AjaxRequest.create("/rf/ajax?method=" + method);
	if (!req) throw "No request!";

	var o = {
		execute: function() { this.req.send(this.body); },
		onreadystatechange : function() {
  		if (req.readyState != 4) return;
  		if (req.status != 200)
  		{
			var msg = "Ajax: Request Error:\nStatus = " + req.status + "\nStatus Text = " + req.statusText;
  			if (o.debug>0) alert(msg);
			if (o.ce) o.ce(msg,o.cc);
  			return;
  		}

		try {
  			var doc = req.responseXML;

  			// IE ;-)
			if (!doc.documentElement && req.responseStream) doc.load(req.responseStream);
  			var root = doc.documentElement;
			if (root.nodeName=="result")
			{
				var result = AjaxRpc.unmarchal(root.firstChild,req);
				if (o.co) o.co(result,o.cc);
			}
			else if (root.nodeName=="error")
			{
				var msg = "Ajax: Server Error:\n" + root.firstChild.nodeValue;
				alert(msg);
				if (o.ce) o.ce(msg,o.cc);
			}
			else
			{
				alert("Ajax: Unexpected response");
			}
		} catch(e) { alert("Javascript Error:\n" + e.message + "\n" + e);}
		}
	}; // end of o def
	o.req = req;
	o.co = callbackOK;
	o.ce = callbackERROR;
	o.cc = context;
	o.debug = 1; // error level

	// cala zabawa z o przez IE!
	req.onreadystatechange = function() { o.onreadystatechange(); } ;
	var s = "",i;
	if (params)
	{
		if (typeof(params)=="string")
			s+="&param="+escape(UTF8.unicodeToUTF8(""+params));
		else
		{
			for (i=0; i<params.length; i++)
				s+="&param=" + escape(UTF8.unicodeToUTF8(""+params[i]));
		}
	}
	o.body = s;
	return o;
  },

  unmarchal: function(e,req)
  {
  	try
  	{
		var s=e.nodeName;
		if (s=="null") return null;
		if (s=="string")
		{
			if (!e.firstChild) return "";
			
			result = "" ;
			for (i=0; i < e.childNodes.length; i++)
			{
				result += e.childNodes[i].nodeValue ;
			}
			
			return result ; //e.firstChild.nodeValue;
		}
		if (s=="int") return e.firstChild.nodeValue*1;
		if (s=="double") return e.firstChild.nodeValue*1.0;
		if (s=="boolean")
		{
			s = e.firstChild.nodeValue;
			if (s=="true") return true;
			if (s=="false") return false;
			else throw {message: "Boolean value '" + s + "' not supported on JS level!\nOrginal response:\n" + req.responseText};
		}
		if (s=="map")
		{
			var result = new Array();
			var nodes = e.childNodes;
			var i;
			for (i=0; i<nodes.length; i++)
				result[AjaxRpc.unmarchal(nodes[i].childNodes[0],req)]=AjaxRpc.unmarchal(nodes[i].childNodes[1],req);
			return result;
		}
		if (s=="array")
		{
			var result = new Array();
			var nodes = e.childNodes;
			var i;
			for (i=0; i<nodes.length; i++)
				result[result.length]=AjaxRpc.unmarchal(nodes[i],req);
			return result;
		}
	}
	catch(e) { throw {message: "UnmarchalException:\n nodeName=" + s + "\ncaused by:"+ e.message } }

	throw {message: "Type <" + s + "> not supported on JS level.\nOrginal response:\n" + req.responseText};
  }


}
