/* MochiKit.JsonRpc */ if (typeof(dojo) != 'undefined') { dojo.provide("MochiKit.JsonRpc"); dojo.require("MochiKit.Base"); dojo.require("MochiKit.DOM"); dojo.require("MochiKit.Async"); } if (typeof(JSAN) != 'undefined') { JSAN.use("MochiKit.Base", []); JSAN.use("MochiKit.DOM", []); JSAN.use("MochiKit.Async", []); } try { if (typeof(MochiKit.Base) == 'undefined' || typeof(MochiKit.DOM) == 'undefined' || typeof(MochiKit.Async) == 'undefined') { throw ""; } } catch (e) { throw "MochiKit.JsonRpc depends on MochiKit.Base, MochiKit.DOM and MochiKit.Async"; } if (typeof(MochiKit.JsonRpc) == 'undefined') { MochiKit.JsonRpc = {}; } MochiKit.JsonRpc.NAME = "MochiKit.JsonRpc"; MochiKit.JsonRpc.VERSION = "0.90"; MochiKit.JsonRpc.__repr__ = function () { return "[" + this.NAME + " " + this.VERSION + "]"; } MochiKit.JsonRpc.toString = function () { return this.__repr__(); } MochiKit.JsonRpc.JsonRpcError = function (message) { this.message = message; this.name = 'JsonRpcError'; } MochiKit.JsonRpc.JsonRpcError.prototype = new Error(); MochiKit.JsonRpc.JsonRpcError.prototype.repr = function () { return 'JsonRpcError(' + this.message + ')'; } MochiKit.JsonRpc.JsonRpcError.prototype.toString = function () { return this.repr(); } MochiKit.JsonRpc.jsonObject = function (o) { var attrs=[]; for(attr in o){ if(typeof o[attr] != "function"){ attrs.push('"' + attr + '": ' + json(o[attr])); } } return "{" + attrs.join(", ") + "}"; } MochiKit.JsonRpc.isObject = function (o) { return true; } MochiKit.JsonRpc.jsonArray = function (o) { return "[" + MochiKit.Base.map(json, o).join(", ") + "]"; } var MB = MochiKit.Base MochiKit.JsonRpc.jsonRegistry = new MochiKit.Base.AdapterRegistry(); MochiKit.JsonRpc.jsonRegistry.register('arrayLike',MB.isArrayLike,MochiKit.JsonRpc.jsonArray); MochiKit.JsonRpc.jsonRegistry.register("string", MB.typeMatcher("string"), MB.reprString); MochiKit.JsonRpc.jsonRegistry.register("numbers", MB.typeMatcher("number", "boolean"), MB.reprNumber); MochiKit.JsonRpc.jsonRegistry.register("undefined", MB.isUndefined, MB.reprUndefined); MochiKit.JsonRpc.jsonRegistry.register("null", MB.isNull, MB.reprNull); MochiKit.JsonRpc.jsonRegistry.register("objectLike", MochiKit.JsonRpc.isObject, MochiKit.JsonRpc.jsonObject); MochiKit.JsonRpc.json = function (o) { try { if (typeof(o.__json__) == 'function') { return o.__json__(); } else if (typeof(o.json) == 'function' && o.json != arguments.callee) { return o.json(); } return jsonRegistry.match(o); } catch (e) { if (typeof(o.NAME) == 'string' && ( o.toString == Function.prototype.toString || o.toString == Object.prototype.toString )) { return o.NAME; } return o; } } MochiKit.JsonRpc.JsonRpcCall = function (method,params) { this.method = method; this.params = params; this.id = '0'; } MochiKit.JsonRpc.JsonRpcProxy = function (url,methNames) { MochiKit.Base.bindMethods(this); this.url = url; if (methNames) { MochiKit.Base.map(this._proxyMethod,methNames); } } update(MochiKit.JsonRpc.JsonRpcProxy.prototype, { 'call': function () { var arglist = MochiKit.Base.map(null,arguments) var methname = arglist.shift() log(arglist); var callobj = new MochiKit.JsonRpc.JsonRpcCall(methname,arglist); var callstr = json(callobj); var req = MochiKit.Async.getXMLHttpRequest(); req.open("POST",this.url,true); req.setRequestHeader("Content-Type","text/plain"); req.setRequestHeader("Content-Length",callstr.length); var d = MochiKit.Async.sendXMLHttpRequest(req,callstr); d.addCallback(MochiKit.Async.evalJSONRequest); d.addCallback(this._extractResult); return d }, 'addSingleMethod': function (methName) { if (methName) { this._proxyMethod(methName); } }, 'addMethods': function (methNames) { if (methNames) { MochiKit.Base.map(this._proxyMethod,methNames); } }, '_extractResult': function (resp) { if (!resp.error){ return resp.result; } else { throw new MochiKit.JsonRpc.JsonRpcError(resp.error); } }, '_proxyMethod': function (methname) { this[methname] = MochiKit.Base.partial(this.call,methname); } }); MochiKit.JsonRpc.DomObjectFromJson = function (){ var retval = false; if (arguments.length == 1) { var arg = arguments[0]; if (typeof(arg) == 'string'){ retval = MochiKit.DOM.SPAN(null,arg); } else { var objrepr = arguments[0]; var elem = document.createElement(objrepr[0]); var attrs = objrepr[1]; if (attrs) { MochiKit.DOM.updateNodeAttributes(elem, attrs); } if (objrepr.length >= 3){ var extraobj = objrepr[2] for (var i=0;i