--- /dev/null
+#ifndef _JDISP_GLOBAL_JSH\r
+#define _JDISP_GLOBAL_JSH\r
+\r
+OOP_CLASS(Global) = function() {};\r
+\r
+OOP_METHOD(Global, eval) = function (txt)\r
+{\r
+ EVAL_RAW(txt);\r
+};\r
+\r
+OOP_METHOD(Global, random) = function (bound)\r
+{\r
+ if (+bound === bound) {\r
+ return Math.floor(Math.random() * bound);\r
+ } else {\r
+ return Math.random();\r
+ }\r
+};\r
+\r
+OOP_METHOD(Global, gettimeofday) = function ()\r
+{\r
+ return (new Date()).getTime();\r
+};\r
+\r
+OOP_METHOD(Global, time) = function ()\r
+{\r
+ var t1000 = this.gettimeofday();\r
+ return Math.floor(t1000 / 1000);\r
+};\r
+\r
+OOP_METHOD(Global, escapeHtml) = function (str)\r
+{\r
+ var d = document.createElement('div');\r
+ var text = document.createTextNode(str);\r
+ d.appendChild(text);\r
+ var ret = d.innerHTML;\r
+ d = null;\r
+ text = null;\r
+ return ret;\r
+};\r
+\r
+OOP_METHOD(Global, zeroPrefix) = function (value, digits)\r
+{\r
+ if (+value === value) {\r
+ var s = '';\r
+ for (var i=0; i<digits; i++) s += '0';\r
+ s += String(Number(value));\r
+ return s.slice(s.length - digits);\r
+ } else {\r
+ return Number(value);\r
+ }\r
+};\r
+\r
+OOP_METHOD(Global, encodeURIComponent) = function(str)\r
+{\r
+ return window.encodeURIComponent.apply(this, arguments);\r
+};\r
+\r
+OOP_METHOD(Global, decodeURIComponent) = function(str)\r
+{\r
+ var s = window.decodeURIComponent.apply(this, arguments);\r
+ s = s.replace(/\+/g, ' ');\r
+ return s;\r
+};\r
+\r
+OOP_METHOD(Global, arrayLength) = function (a)\r
+{\r
+ var count = 0;\r
+ for (var i in a) {\r
+ count++;\r
+ }\r
+ return count;\r
+};\r
+\r
+OOP_METHOD(Global, assignValues) = function (dst, src, fields)\r
+{\r
+ if (IS_OBJECT(fields)) {\r
+ for (var i in fields) {\r
+ var k = fields[i];\r
+ if (IS_DEFINED(typeof src[k])) {\r
+ dst[k] = src[k];\r
+ }\r
+ }\r
+ } else {\r
+ for (var j in src) {\r
+ dst[j] = src[j];\r
+ }\r
+ }\r
+};\r
+\r
+OOP_METHOD(Global, quoteString) = function (str, q)\r
+{\r
+ if (str === null) return null;\r
+ var s = String(str);\r
+ s = s.replace(/\\/g,"\\\\");\r
+ switch (q) {\r
+ case "'":\r
+ s = s.replace(/'/g,"\\'");\r
+ break;\r
+ case '"':\r
+ s = s.replace(/"/g,'\\"');\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ s = s.replace(/\n/g,"\\n");\r
+ s = s.replace(/\t/g,"\\t");\r
+ s = s.replace(/\f/g,"\\f");\r
+// FIXME: make the following line work\r
+// s = s.replace(/\b/g,"\\b");\r
+ return q + s + q;\r
+};\r
+\r
+OOP_METHOD(Global, dumpVar) = function (obj, wantFunction, maxRecursion)\r
+{\r
+ var me = this;\r
+ var maxLv = 64;\r
+ var qq = '"';\r
+ if (IS_DEFINED(maxRecursion)) maxLv = Number(maxRecursion);\r
+\r
+ var f = function (o, lv) {\r
+ if (lv > maxLv) {\r
+ return {value:'(error)', error: 'Too many levels of recursion.'};\r
+ }\r
+ var t = typeof o;\r
+ var v = new Object();\r
+ var k;\r
+ switch (t) {\r
+ case 'number' :\r
+ case 'boolean':\r
+ v.value = String(o);\r
+ break;\r
+ case 'string' :\r
+ v.value = me.quoteString(o, qq);\r
+ break;\r
+ case 'function':\r
+ v.value = "/* function " + o + " */";\r
+ v.isFunction = true;\r
+ break;\r
+ case 'undefined':\r
+ v.value = "undefined";\r
+ break;\r
+ case 'object':\r
+ // FIXME: Make it possible to dump arrays.\r
+ if (o === null) {\r
+ v.value = 'null';\r
+ } else if (IS_ARRAY(o)) {\r
+ // FIXME: handle the case where o is a pseudo hash.\r
+ var lp1 = new jdisp.text.ListPrinter('[', ',', ']');\r
+ for (k in o) {\r
+ var ret1 = f(o[k], lv + 1);\r
+ if (!ret1.isFunction || wantFunction) {\r
+ lp1.append(ret1.value);\r
+ }\r
+ }\r
+ v.value = lp1.toString();\r
+ } else {\r
+ var lp2 = new jdisp.text.ListPrinter('{', ',', '}');\r
+ for (k in o) {\r
+ var ret2 = f(o[k], lv + 1);\r
+ if (!ret2.isFunction || wantFunction) {\r
+ lp2.append(me.quoteString(k, qq) + ":" + ret2.value);\r
+ }\r
+ }\r
+ v.value = lp2.toString();\r
+ }\r
+ break;\r
+ default:\r
+ FATAL('invalid data type: ' + t);\r
+ v.value = null;\r
+ break;\r
+ }\r
+ return v;\r
+ };\r
+ var r = f(obj, 0);\r
+ return r.value;\r
+};\r
+\r
+OOP_METHOD(Global, invokeLater) = function (func, timeout)\r
+{\r
+ var t = (IS_DEFINED(timeout)) ? timeout : 0;\r
+ if (IS_FUNCTION(func)) {\r
+ setTimeout(func, t);\r
+ }\r
+};\r
+\r
+#endif /* _JDISP_GLOBAL_JSH */\r