--- json-hourly.js	2007-01-27 21:47:50.000000000 -0600
+++ json.js	2007-01-30 09:06:18.000000000 -0600
@@ -14,58 +14,92 @@
 //------------------------------------------------------------------------------
 domapi.stringToJson = function(s){
   try{
-    s = "this.__r = " + s;
-    eval(s);
-    return this["__r"];
+    return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
+        s.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + s + ')');
   }catch(e){
     throw new Error(domapi.getString("ERR_EVAL_JSON") + e.message);
     return {};
   }  
 };
 //------------------------------------------------------------------------------
-domapi.jsonToString = function(arg){
-  function isUndefined(a){
-    return typeof a == 'undefined';
-  };
-  //------
-  function quote(s){
-    var r = s;
-    var R = new RegExp('"',"g");
-    return '"' + r.replace(R,'\\"') + '"';
-  };
-  //------
-  var i, o, v;
-  switch(typeof arg){
-    case 'object':
-      if(arg){
-        if(arg.constructor == Array){
-          o = '[';
-          for(i = 0; i < arg.length; ++i){
-            v = domapi.jsonToString(arg[i]);
-            if (v != 'function' && !isUndefined(v))
-              o += (o != '[' ? ',' : '') + v;
-            else
-              o += ',';
-          }
-          return o + ']';
-        }else if(typeof arg.toString != 'undefined'){
-          if(arg.toJsonString) return arg.toJsonString();
-          o = '{';
-          for (i in arg){
-            v = domapi.jsonToString(arg[i]);
-            if (v != 'function' && !isUndefined(v))
-              o += (o != '{' ? ',' : '') + quote(i) + ':' + v;
-          }
-          return o + '}';
-        } else return;
-      }
-      return 'null';
-    case 'unknown'   :
-    case 'undefined' : return;
-    case 'string'    : return quote(arg);
-    case 'function'  : return 'function';
-    default          : return String(arg);
-  }
+domapi.jsonToString = function(arg,pretty){
+    var iLevel=0, br=(pretty)?"\n":"", indent="  ", max=50;
+    var t="",ts=indent.length,i; for(i=0;i<max;i++) t+=indent;
+    function tab() { return (pretty)? br+t.slice(0,ts*iLevel) : "";};
+    var chars = { 
+        '\b': '\\b',
+        '\t': '\\t',
+        '\n': '\\n',
+        '\f': '\\f',
+        '\r': '\\r',
+        '"' : '\\"',
+        '\\': '\\\\'
+    },
+    s = {
+        array: function (x) {
+            iLevel++;
+            var a = ['['+tab()], b, f, i, l = x.length, v;
+            for (i = 0; i < l; i += 1) {
+                v = x[i];
+                f = s[typeof v];
+                if (f) {
+                    v = f(v);
+                    if (typeof v == 'string') {
+                        if (b) { a[a.length] = ','+tab(); }
+                        a[a.length] = v;
+                        b = true;
+                    }
+                }
+            }
+            iLevel--;
+            a[a.length] = ']';
+            return a.join('');
+        },
+        'boolean': function (x) { return String(x); },
+        'null': function (x) {  return "null";  },
+        number: function (x) {  return isFinite(x) ? String(x) : 'null';  },
+        object: function (x) {
+            if (x) {
+                if (x instanceof Array) {
+                    return s.array(x);
+                }
+                iLevel++;
+                var a = ['{'+tab()], b, f, i, v;
+                for (i in x) {
+                    v = x[i];
+                    f = s[typeof v];
+                    if (f) {
+                        v = f(v);
+                        if (typeof v == 'string') {
+                            if (b) { a[a.length] = ','+tab(); }
+                            a.push(s.string(i), ':', v);
+                            b = true;
+                        }
+                    }
+                }
+                iLevel--;
+                a[a.length] = '}';
+                return a.join('');
+            }
+            return 'null';
+        },
+        string: function (x) {
+            if (/["\\\x00-\x1f]/.test(x)) {
+                x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
+                    var c = chars[b];
+                    if (c) {
+                        return c;
+                    }
+                    c = b.charCodeAt();
+                    return '\\u00' +
+                        Math.floor(c / 16).toString(16) +
+                        (c % 16).toString(16);
+                });
+            }
+            return '"' + x + '"';
+        }
+    };
+    return s.object(arg);
 };
 //------------------------------------------------------------------------------
 domapi.jsonToXml = function(arg,nm,pretty){
