| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-JSON'>/**</span> * Modified version of [Douglas Crockford's JSON.js][dc] that doesn't * mess with the Object prototype. * * [dc]: http://www.json.org/js.html * * @singleton */Ext.JSON = (new(function() {    var me = this,    encodingFunction,    decodingFunction,    useNative = null,    useHasOwn = !! {}.hasOwnProperty,    isNative = function() {        if (useNative === null) {            useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';        }        return useNative;    },    pad = function(n) {        return n < 10 ? "0" + n : n;    },    doDecode = function(json) {        return eval("(" + json + ')');    },    doEncode = function(o, newline) {        // http://jsperf.com/is-undefined        if (o === null || o === undefined) {            return "null";        } else if (Ext.isDate(o)) {            return Ext.JSON.encodeDate(o);        } else if (Ext.isString(o)) {            return Ext.JSON.encodeString(o);        } else if (typeof o == "number") {            //don't use isNumber here, since finite checks happen inside isNumber            return isFinite(o) ? String(o) : "null";        } else if (Ext.isBoolean(o)) {            return String(o);        }        // Allow custom zerialization by adding a toJSON method to any object type.        // Date/String have a toJSON in some environments, so check these first.        else if (o.toJSON) {            return o.toJSON();        } else if (Ext.isArray(o)) {            return encodeArray(o, newline);        } else if (Ext.isObject(o)) {            return encodeObject(o, newline);        } else if (typeof o === "function") {            return "null";        }        return 'undefined';    },    m = {        "\b": '\\b',        "\t": '\\t',        "\n": '\\n',        "\f": '\\f',        "\r": '\\r',        '"': '\\"',        "\\": '\\\\',        '\x0b': '\\u000b' //ie doesn't handle \v    },    charToReplace = /[\\\"\x00-\x1f\x7f-\uffff]/g,    encodeString = function(s) {        return '"' + s.replace(charToReplace, function(a) {            var c = m[a];            return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);        }) + '"';    },    //<debug>    encodeArrayPretty = function(o, newline) {        var len = o.length,            cnewline = newline + '   ',            sep = ',' + cnewline,            a = ["[", cnewline], // Note newline in case there are no members            i;        for (i = 0; i < len; i += 1) {            a.push(Ext.JSON.encodeValue(o[i], cnewline), sep);        }        // Overwrite trailing comma (or empty string)        a[a.length - 1] = newline + ']';        return a.join('');    },    encodeObjectPretty = function(o, newline) {        var cnewline = newline + '   ',            sep = ',' + cnewline,            a = ["{", cnewline], // Note newline in case there are no members            i;        for (i in o) {            if (!useHasOwn || o.hasOwnProperty(i)) {                a.push(Ext.JSON.encodeValue(i) + ': ' + Ext.JSON.encodeValue(o[i], cnewline), sep);            }        }        // Overwrite trailing comma (or empty string)        a[a.length - 1] = newline + '}';        return a.join('');    },    //</debug>    encodeArray = function(o, newline) {        //<debug>        if (newline) {            return encodeArrayPretty(o, newline);        }        //</debug>        var a = ["[", ""], // Note empty string in case there are no serializable members.            len = o.length,            i;        for (i = 0; i < len; i += 1) {            a.push(Ext.JSON.encodeValue(o[i]), ',');        }        // Overwrite trailing comma (or empty string)        a[a.length - 1] = ']';        return a.join("");    },    encodeObject = function(o, newline) {        //<debug>        if (newline) {            return encodeObjectPretty(o, newline);        }        //</debug>        var a = ["{", ""], // Note empty string in case there are no serializable members.            i;        for (i in o) {            if (!useHasOwn || o.hasOwnProperty(i)) {                a.push(Ext.JSON.encodeValue(i), ":", Ext.JSON.encodeValue(o[i]), ',');            }        }        // Overwrite trailing comma (or empty string)        a[a.length - 1] = '}';        return a.join("");    };    <span id='Ext-JSON-method-encodeString'>    /**</span>     * Encodes a String. This returns the actual string which is inserted into the JSON string as the literal     * expression. **The returned value includes enclosing double quotation marks.**     *     * To override this:     *     *     Ext.JSON.encodeString = function(s) {     *         return 'Foo' + s;     *     };     *     * @param {String} s The String to encode     * @return {String} The string literal to use in a JSON string.     * @method     */    me.encodeString = encodeString;<span id='Ext-JSON-method-encodeValue'>    /**</span>     * The function which {@link #encode} uses to encode all javascript values to their JSON representations     * when {@link Ext#USE_NATIVE_JSON} is `false`.     *      * This is made public so that it can be replaced with a custom implementation.     *     * @param {Object} o Any javascript value to be converted to its JSON representation     * @return {String} The JSON representation of the passed value.     * @method     */    me.encodeValue = doEncode;<span id='Ext-JSON-method-encodeDate'>    /**</span>     * Encodes a Date. This returns the actual string which is inserted into the JSON string as the literal     * expression. **The returned value includes enclosing double quotation marks.**     *     * The default return format is `"yyyy-mm-ddThh:mm:ss"`.     *     * To override this:     *     *     Ext.JSON.encodeDate = function(d) {     *         return Ext.Date.format(d, '"Y-m-d"');     *     };     *     * @param {Date} d The Date to encode     * @return {String} The string literal to use in a JSON string.     */    me.encodeDate = function(o) {        return '"' + o.getFullYear() + "-"        + pad(o.getMonth() + 1) + "-"        + pad(o.getDate()) + "T"        + pad(o.getHours()) + ":"        + pad(o.getMinutes()) + ":"        + pad(o.getSeconds()) + '"';    };<span id='Ext-JSON-method-encode'>    /**</span>     * Encodes an Object, Array or other value.     *      * If the environment's native JSON encoding is not being used ({@link Ext#USE_NATIVE_JSON} is not set,     * or the environment does not support it), then ExtJS's encoding will be used. This allows the developer     * to add a `toJSON` method to their classes which need serializing to return a valid JSON representation     * of the object.     *      * @param {Object} o The variable to encode     * @return {String} The JSON string     */    me.encode = function(o) {        if (!encodingFunction) {            // setup encoding function on first access            encodingFunction = isNative() ? JSON.stringify : me.encodeValue;        }        return encodingFunction(o);    };<span id='Ext-JSON-method-decode'>    /**</span>     * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws     * a SyntaxError unless the safe option is set.     *     * @param {String} json The JSON string     * @param {Boolean} [safe=false] True to return null, false to throw an exception if the JSON is invalid.     * @return {Object} The resulting object     */    me.decode = function(json, safe) {        if (!decodingFunction) {            // setup decoding function on first access            decodingFunction = isNative() ? JSON.parse : doDecode;        }        try {            return decodingFunction(json);        } catch (e) {            if (safe === true) {                return null;            }            Ext.Error.raise({                sourceClass: "Ext.JSON",                sourceMethod: "decode",                msg: "You're trying to decode an invalid JSON String: " + json            });        }    };})());<span id='Ext-method-encode'>/**</span> * Shorthand for {@link Ext.JSON#encode} * @member Ext * @method encode * @inheritdoc Ext.JSON#encode */Ext.encode = Ext.JSON.encode;<span id='Ext-method-decode'>/**</span> * Shorthand for {@link Ext.JSON#decode} * @member Ext * @method decode * @inheritdoc Ext.JSON#decode */Ext.decode = Ext.JSON.decode;</pre></body></html>
 |