function json_encode(arg)
{
  var i, o, u, v;
  switch (typeof arg)
    {
    case 'object':
      if (!arg) { return null; }
      if (arg.constructor == Array)
        {
          o = [];
          for (i = 0; i < arg.length; ++i)
            {
              v = json_encode(arg[i]);
              o.push((v !== u) ? v : 'null');
            }
          return '[' + o.join(',') + ']';
        }
      if (typeof arg.toString != 'undefined')
        {
          o = [];
          for (i in arg)
            {
              v = json_encode(arg[i]);
              if (v !== u) { o.push(json_encode(i) + ':' + v); }
            }
          return '{' + o.join(',') + '}';
        }
      return;
    case 'string':
      return '"' + arg.replace(/(["\\])/g, '\\$1') + '"'; //' ]));
    case 'unknown':
    case 'undefined':
    case 'function':
      return u;
    default:
      return String(arg);
    }
}

function json_decode(str)
{
  var n;
  try
    {
      eval("n=" + str);
    }
  catch (e)
    {
      if (typeof debuglog != 'undefined') debuglog(str);
    }
  return n;
}
