diff options
Diffstat (limited to 'applications/luci-livestats/htdocs/luci-static/resources/livestats/JsonRpc.js')
-rw-r--r-- | applications/luci-livestats/htdocs/luci-static/resources/livestats/JsonRpc.js | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/applications/luci-livestats/htdocs/luci-static/resources/livestats/JsonRpc.js b/applications/luci-livestats/htdocs/luci-static/resources/livestats/JsonRpc.js new file mode 100644 index 0000000000..f1723ec1c0 --- /dev/null +++ b/applications/luci-livestats/htdocs/luci-static/resources/livestats/JsonRpc.js @@ -0,0 +1,220 @@ +/* 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<extraobj.length;i++) { + var value = MochiKit.JsonRpc.DomObjectFromJson(extraobj[i]); + if (value) { + elem.appendChild(value); + } + } + } + retval = elem; + } + } + return retval; +}; + +MochiKit.JsonRpc.EXPORT = [ + "JsonRpcError", + "JsonRpcProxy", +]; + +MochiKit.JsonRpc.EXPORT_OK = [ + "jsonObject", + "jsonArray", + "jsonRegistry", + "json", + "JsonRpcCall", + "DomObjectFromJson", +]; + +MochiKit.JsonRpc.__new__ = function () { + + this.EXPORT_TAGS = { + ":common": this.EXPORT, + ":all": MochiKit.Base.concat(this.EXPORT, this.EXPORT_OK) + }; + + MochiKit.Base.nameFunctions(this); + +}; + +MochiKit.JsonRpc.__new__(); + +if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined') + || (typeof(MochiKit.__compat__) == 'boolean' && MochiKit.__compat__)) { + (function (self) { + var all = self.EXPORT_TAGS[":all"]; + for (var i = 0; i < all.length; i++) { + this[all[i]] = self[all[i]]; + } + })(MochiKit.JsonRpc); +} |