src/cm/media/js/lib/yui/yui_3.10.3/build/json-stringify-shim/json-stringify-shim.js
author gibus
Tue, 16 Jul 2013 14:29:46 +0200
changeset 525 89ef5ed3c48b
permissions -rw-r--r--
Upgrades to yui 3.10.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
525
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     1
/*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     2
YUI 3.10.3 (build 2fb5187)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     3
Copyright 2013 Yahoo! Inc. All rights reserved.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     4
Licensed under the BSD License.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     5
http://yuilibrary.com/license/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     6
*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     7
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     8
YUI.add('json-stringify-shim', function (Y, NAME) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     9
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    10
// All internals kept private for security reasons
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    11
var Lang      = Y.Lang,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    12
    isFunction= Lang.isFunction,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    13
    isObject  = Lang.isObject,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    14
    isArray   = Lang.isArray,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    15
    _toStr    = Object.prototype.toString,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    16
    UNDEFINED = 'undefined',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    17
    OBJECT    = 'object',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    18
    NULL      = 'null',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    19
    STRING    = 'string',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    20
    NUMBER    = 'number',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    21
    BOOLEAN   = 'boolean',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    22
    DATE      = 'date',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    23
    _allowable= {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    24
        'undefined'        : UNDEFINED,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    25
        'string'           : STRING,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    26
        '[object String]'  : STRING,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    27
        'number'           : NUMBER,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    28
        '[object Number]'  : NUMBER,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    29
        'boolean'          : BOOLEAN,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    30
        '[object Boolean]' : BOOLEAN,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    31
        '[object Date]'    : DATE,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    32
        '[object RegExp]'  : OBJECT
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    33
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    34
    EMPTY     = '',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    35
    OPEN_O    = '{',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    36
    CLOSE_O   = '}',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    37
    OPEN_A    = '[',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    38
    CLOSE_A   = ']',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    39
    COMMA     = ',',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    40
    COMMA_CR  = ",\n",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    41
    CR        = "\n",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    42
    COLON     = ':',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    43
    COLON_SP  = ': ',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    44
    QUOTE     = '"',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    45
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    46
    // Regex used to capture characters that need escaping before enclosing
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    47
    // their containing string in quotes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    48
    _SPECIAL = /[\x00-\x07\x0b\x0e-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    49
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    50
    // Character substitution map for common escapes and special characters.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    51
    _COMMON = [
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    52
        [/\\/g, '\\\\'],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    53
        [/\"/g, '\\"'],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    54
        [/\x08/g, '\\b'],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    55
        [/\x09/g, '\\t'],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    56
        [/\x0a/g, '\\n'],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    57
        [/\x0c/g, '\\f'],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    58
        [/\x0d/g, '\\r']
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    59
    ],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    60
    _COMMON_LENGTH = _COMMON.length,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    61
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    62
    // In-process optimization for special character escapes that haven't yet
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    63
    // been promoted to _COMMON
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    64
    _CHAR = {},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    65
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    66
    // Per-char counter to determine if it's worth fast tracking a special
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    67
    // character escape sequence.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    68
    _CHAR_COUNT, _CACHE_THRESHOLD;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    69
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    70
// Utility function used to determine how to serialize a variable.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    71
function _type(o) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    72
    var t = typeof o;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    73
    return  _allowable[t] ||              // number, string, boolean, undefined
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    74
            _allowable[_toStr.call(o)] || // Number, String, Boolean, Date
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    75
            (t === OBJECT ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    76
                (o ? OBJECT : NULL) :     // object, array, null, misc natives
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    77
                UNDEFINED);               // function, unknown
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    78
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    79
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    80
// Escapes a special character to a safe Unicode representation
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    81
function _char(c) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    82
    if (!_CHAR[c]) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    83
        _CHAR[c] = '\\u'+('0000'+(+(c.charCodeAt(0))).toString(16)).slice(-4);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
        _CHAR_COUNT[c] = 0;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    85
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    86
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    87
    // === to avoid this conditional for the remainder of the current operation
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
    if (++_CHAR_COUNT[c] === _CACHE_THRESHOLD) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
        _COMMON.push([new RegExp(c, 'g'), _CHAR[c]]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
        _COMMON_LENGTH = _COMMON.length;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
    return _CHAR[c];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
// Enclose escaped strings in quotes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
function _string(s) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
    var i, chr;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
    // Preprocess the string against common characters to avoid function
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
    // overhead associated with replacement via function.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
    for (i = 0; i < _COMMON_LENGTH; i++) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
        chr = _COMMON[i];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
        s = s.replace(chr[0], chr[1]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
    // original function replace for the not-as-common set of chars
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   108
    return QUOTE + s.replace(_SPECIAL, _char) + QUOTE;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   109
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   110
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   111
// Adds the provided space to the beginning of every line in the input string
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
function _indent(s,space) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
    return s.replace(/^/gm, space);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
Y.JSON.stringify = function _stringify(o,w,space) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   117
    if (o === undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
        return undefined;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
    var replacer = isFunction(w) ? w : null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   122
        format   = _toStr.call(space).match(/String|Number/) || [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
        _date    = Y.JSON.dateToString,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
        stack    = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
        tmp,i,len;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
    _CHAR_COUNT      = {};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
    _CACHE_THRESHOLD = Y.JSON.charCacheThreshold;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
    if (replacer || !isArray(w)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
        w = undefined;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
    // Ensure whitelist keys are unique (bug 2110391)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
    if (w) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
        tmp = {};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
        for (i = 0, len = w.length; i < len; ++i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
            tmp[w[i]] = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
        w = tmp;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
    // Per the spec, strings are truncated to 10 characters and numbers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
    // are converted to that number of spaces (max 10)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
    space = format[0] === 'Number' ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
                new Array(Math.min(Math.max(0,space),10)+1).join(" ") :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
                (space || EMPTY).slice(0,10);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
    function _serialize(h,key) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   150
        var value = h[key],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
            t     = _type(value),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   152
            a     = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   153
            colon = space ? COLON_SP : COLON,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
            arr, i, keys, k, v;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   155
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   156
        // Per the ECMA 5 spec, toJSON is applied before the replacer is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   157
        // called.  Also per the spec, Date.prototype.toJSON has been added, so
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   158
        // Date instances should be serialized prior to exposure to the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
        // replacer.  I disagree with this decision, but the spec is the spec.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
        if (isObject(value) && isFunction(value.toJSON)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
            value = value.toJSON(key);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
        } else if (t === DATE) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
            value = _date(value);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
        if (isFunction(replacer)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
            value = replacer.call(h,key,value);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   169
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   170
        if (value !== h[key]) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   171
            t = _type(value);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   172
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
        switch (t) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
            case DATE    : // intentional fallthrough.  Pre-replacer Dates are
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
                           // serialized in the toJSON stage.  Dates here would
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
                           // have been produced by the replacer.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
            case OBJECT  : break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
            case STRING  : return _string(value);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
            case NUMBER  : return isFinite(value) ? value+EMPTY : NULL;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
            case BOOLEAN : return value+EMPTY;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
            case NULL    : return NULL;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
            default      : return undefined;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
        // Check for cyclical references in nested objects
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
        for (i = stack.length - 1; i >= 0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
            if (stack[i] === value) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
                throw new Error("JSON.stringify. Cyclical reference");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   193
        arr = isArray(value);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   194
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   195
        // Add the object to the processing stack
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
        stack.push(value);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
        if (arr) { // Array
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
            for (i = value.length - 1; i >= 0; --i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
                a[i] = _serialize(value, i) || NULL;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
        } else {   // Object
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
            // If whitelist provided, take only those keys
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
            keys = w || value;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
            i = 0;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   207
            for (k in keys) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   208
                if (keys.hasOwnProperty(k)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   209
                    v = _serialize(value, k);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
                    if (v) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
                        a[i++] = _string(k) + colon + v;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
        // remove the array from the stack
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
        stack.pop();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
        if (space && a.length) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
            return arr ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
                OPEN_A + CR + _indent(a.join(COMMA_CR), space) + CR + CLOSE_A :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
                OPEN_O + CR + _indent(a.join(COMMA_CR), space) + CR + CLOSE_O;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
        } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
            return arr ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
                OPEN_A + a.join(COMMA) + CLOSE_A :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
                OPEN_O + a.join(COMMA) + CLOSE_O;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
    // process the input
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
    return _serialize({'':o},'');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
// Property available for testing if the implementation being used
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
// is native or a shim
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
Y.JSON.stringify.isShim = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
}, '3.10.3', {"requires": ["json-stringify"]});