(function ($) {
$.toJSON = function (o, replacer, space, recurse) {
if (typeof(JSON) == 'object' && JSON.stringify) return JSON.stringify(o, replacer, space);
if (!recurse && $.isFunction(replacer)) o = replacer("", o);
if (typeof space == "number") space = " ".substring(0, space);
space = (typeof space == "string") ? space.substring(0, 10) : "";
var type = typeof(o);
if (o === null) return "null";
if (type == "undefined" || type == "function") return undefined;
if (type == "number" || type == "boolean") return o + "";
if (type == "string") return $.quoteString(o);
if (type == 'object') {
if (typeof o.toJSON == "function") return $.toJSON(o.toJSON(), replacer, space, true);
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"';
}
var process = ($.isFunction(replacer)) ?
function (k, v) {
return replacer(k, v);
} : function (k, v) {
return v;
},
nl = (space) ? "\n" : "",
sp = (space) ? " " : "";
if (o.constructor === Array) {
var ret = [];
for (var i = 0; i < o.length; i++)
ret.push(($.toJSON(process(i, o[i]), replacer, space, true) || "null").replace(/^/gm, space));
return "[" + nl + ret.join("," + nl) + nl + "]";
}
var pairs = [],
proplist;
if ($.isArray(replacer)) {
proplist = $.map(replacer, function (v) {
return (typeof v == "string" || typeof v == "number") ? v + "" : null;
});
}
for (var k in o) {
var name, val, type = typeof k;
if (proplist && $.inArray(k + "", proplist) == -1) continue;
if (type == "number") name = '"' + k + '"';
else if (type == "string") name = $.quoteString(k);
else continue; //skip non-string or number keys
val = $.toJSON(process(k, o[k]), replacer, space, true);
if (typeof val == "undefined") continue; //skip pairs where the value is a function.
pairs.push((name + ":" + sp + val).replace(/^/gm, space));
}
return "{" + nl + pairs.join("," + nl) + nl + "}";
}
};
$.evalJSON = function (src) {
if (typeof(JSON) == 'object' && JSON.parse) return JSON.parse(src);
return eval("(" + src + ")");
};
$.secureEvalJSON = function (src) {
if (typeof(JSON) == 'object' && JSON.parse) return JSON.parse(src);
var filtered = src;
filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@');
filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
if (/^[\],:{}\s]*$/.test(filtered)) return eval("(" + src + ")");
else throw new SyntaxError("Error parsing JSON, source is not valid.");
};
$.quoteString = function (string) {
if (string.match(_escapeable)) {
return '"' + string.replace(_escapeable, function (a) {
var c = _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 + '"';
};
var _escapeable = /["\\\x00-\x1f\x7f-\x9f]/g;
var _meta = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"': '\\"',
'\\': '\\\\'
};
return $;
})(jQuery);