# Source: encode/json.js

    //
    // Copyright (c) 2006-2022 Wade Alcorn - wade@bindshell.net
    // Browser Exploitation Framework (BeEF) - http://beefproject.com
    // See the file 'doc/COPYING' for copying permission
    //

    /**
     * Json code from Brantlye Harris-- http://code.google.com/p/jquery-json/
     * @namespace beef.encode.json
     */

    beef.encode.json = {
    	/**
         * @memberof beef.encode.json
         * @param o
         */
    	stringify: function(o) {
            if (typeof(JSON) == 'object' && JSON.stringify) {
                // Error on stringifying cylcic structures caused polling to die
                try {
                    s = JSON.stringify(o);
                } catch(error) {
                    // TODO log error / handle cyclic structures?
                }
                return s;
            }
            var type = typeof(o);

            if (o === null)
                return "null";

            if (type == "undefined")
                return '\"\"';

            if (type == "number" || type == "boolean")
                return o + "";

            if (type == "string")
                return $j.quoteString(o);

            if (type == 'object')
            {
                if (typeof o.toJSON == "function")
                    return $j.toJSON( o.toJSON() );

                if (o.constructor === Date)
                {
                    var month = o.getUTCMonth() + 1;
                    if (month < 10) month = '0' + month;

                    var day = o.getUTCDate();
                    if (day < 10) day = '0' + day;

                    var year = o.getUTCFullYear();

                    var hours = o.getUTCHours();
                    if (hours < 10) hours = '0' + hours;

                    var minutes = o.getUTCMinutes();
                    if (minutes < 10) minutes = '0' + minutes;

                    var seconds = o.getUTCSeconds();
                    if (seconds < 10) seconds = '0' + seconds;

                    var milli = o.getUTCMilliseconds();
                    if (milli < 100) milli = '0' + milli;
                    if (milli < 10) milli = '0' + milli;

                    return '"' + year + '-' + month + '-' + day + 'T' +
                                 hours + ':' + minutes + ':' + seconds +
                                 '.' + milli + 'Z"';
                }

                if (o.constructor === Array)
                {
                    var ret = [];
                    for (var i = 0; i < o.length; i++)
                        ret.push( $j.toJSON(o[i]) || "null" );

                    return "[" + ret.join(",") + "]";
                }

                var pairs = [];
                for (var k in o) {
                    var name;
                    var type = typeof k;

                    if (type == "number")
                        name = '"' + k + '"';
                    else if (type == "string")
                        name = $j.quoteString(k);
                    else
                        continue;  //skip non-string or number keys

                    if (typeof o[k] == "function")
                        continue;  //skip pairs where the value is a function.

                    var val = $j.toJSON(o[k]);

                    pairs.push(name + ":" + val);
                }

                return "{" + pairs.join(", ") + "}";
            }
        },
        /**
         * @memberof beef.encode.json
         * @param string
         */
        quoteString: function(string) {
            if (string.match(this._escapeable))
            {
                return '"' + string.replace(this._escapeable, function (a)
                {
                    var c = this._meta[a];
                    if (typeof c === 'string') return c;
                    c = a.charCodeAt();
                    return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
                }) + '"';
            }
            return '"' + string + '"';
        },

        _escapeable: /["\\\x00-\x1f\x7f-\x9f]/g,

        _meta : {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        }
    };

    $j.toJSON = function(o) {return beef.encode.json.stringify(o);};
    $j.quoteString = function(o) {return beef.encode.json.quoteString(o);};

    beef.regCmp('beef.encode.json');