* luci/applications: add experimental realtime statistics
[project/luci.git] / applications / luci-livestats / htdocs / luci-static / resources / livestats / JsonRpc.js
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 (file)
index 0000000..f1723ec
--- /dev/null
@@ -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);
+}