/*

    json.js

    2006-04-28



    This file adds these methods to JavaScript:



        object.toJSONString()



            This method produces a JSON text from an object. The

            object must not contain any cyclical references.



        array.toJSONString()



            This method produces a JSON text from an array. The

            array must not contain any cyclical references.



        string.parseJSON()



            This method parses a JSON text to produce an object or

            array. It will return false if there is an error.

*/

(function () {

    var m = {

            '\b': '\\b',

            '\t': '\\t',

            '\n': '\\n',

            '\f': '\\f',

            '\r': '\\r',

            '"' : '\\"',

            '\\': '\\\\'

        },

        s = {

            array: function (x) {

                var a = ['['], 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] = ',';

                            }

                            a[a.length] = v;

                            b = true;

                        }

                    }

                }

                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);

                    }

                    var a = ['{'], 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] = ',';

                                }

                                a.push(s.string(i), ':', v);

                                b = true;

                            }

                        }

                    }

                    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 = m[b];

                        if (c) {

                            return c;

                        }

                        c = b.charCodeAt();

                        return '\\u00' +

                            Math.floor(c / 16).toString(16) +

                            (c % 16).toString(16);

                    });

                }

                return '"' + x + '"';

            }

        };



    Object.prototype.toJSONString = function () {

        return s.object(this);

    };



    Array.prototype.toJSONString = function () {

        return s.array(this);

    };

})();



String.prototype.parseJSON = function () {

    try {

        return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(

                this.replace(/"(\\.|[^"\\])*"/g, ''))) &&

            eval('(' + this + ')');

    } catch (e) {

        return false;

    }

};