// http://www.crockford.com/JSON/js.html
// 
function json_encode(arg) {
    var i, o, u, v;

    switch (typeof arg) {
    case 'object':
        if (arg) {
            if (arg.constructor == Array) {
                o = '';
                for (i = 0; i < arg.length; ++i) {
                    v = json_encode(arg[i]);
                    if (o) {
                        o += ',';
                    }
                    if (v !== u) {
                        o += v;
                    } else {
                        o += 'null,';
                    }
                }
                return '[' + o + ']';
            } else if (typeof arg.toString != 'undefined') {
                o = '';
                for (i in arg) {
                    v = json_encode(arg[i]);
                    if (v !== u) {
                        if (o) {
                            o += ',';
                        }
                        o += json_encode(i) + ':' + v;
                    }
                }
                return '{' + o + '}';
            } else {
                return;
            }
        }
        return 'null';
    case 'unknown':
    case 'undefined':
    case 'function':
        return u;
    case 'string':
        return '"' + arg.replace(/(["\\])/g, '\\$1') + '"';
    default:
        return String(arg);
    }
}