﻿/*
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.7.0
*/
YAHOO.lang.JSON = (function() { var l = YAHOO.lang, _UNICODE_EXCEPTIONS = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, _ESCAPES = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, _VALUES = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, _BRACKETS = /(?:^|:|,)(?:\s*\[)+/g, _INVALID = /^[\],:{}\s]*$/, _SPECIAL_CHARS = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, _CHARS = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" }; function _revive(data, reviver) { var walk = function(o, key) { var k, v, value = o[key]; if (value && typeof value === "object") { for (k in value) { if (l.hasOwnProperty(value, k)) { v = walk(value, k); if (v === undefined) { delete value[k]; } else { value[k] = v; } } } } return reviver.call(o, key, value); }; return typeof reviver === "function" ? walk({ "": data }, "") : data; } function _char(c) { if (!_CHARS[c]) { _CHARS[c] = "\\u" + ("0000" + (+(c.charCodeAt(0))).toString(16)).slice(-4); } return _CHARS[c]; } function _prepare(s) { return s.replace(_UNICODE_EXCEPTIONS, _char); } function _isValid(str) { return l.isString(str) && _INVALID.test(str.replace(_ESCAPES, "@").replace(_VALUES, "]").replace(_BRACKETS, "")); } function _string(s) { return '"' + s.replace(_SPECIAL_CHARS, _char) + '"'; } function _stringify(h, key, d, w, pstack) { var o = typeof w === "function" ? w.call(h, key, h[key]) : h[key], i, len, j, k, v, isArray, a; if (o instanceof Date) { o = l.JSON.dateToString(o); } else { if (o instanceof String || o instanceof Boolean || o instanceof Number) { o = o.valueOf(); } } switch (typeof o) { case "string": return _string(o); case "number": return isFinite(o) ? String(o) : "null"; case "boolean": return String(o); case "object": if (o === null) { return "null"; } for (i = pstack.length - 1; i >= 0; --i) { if (pstack[i] === o) { return "null"; } } pstack[pstack.length] = o; a = []; isArray = l.isArray(o); if (d > 0) { if (isArray) { for (i = o.length - 1; i >= 0; --i) { a[i] = _stringify(o, i, d - 1, w, pstack) || "null"; } } else { j = 0; if (l.isArray(w)) { for (i = 0, len = w.length; i < len; ++i) { k = w[i]; v = _stringify(o, k, d - 1, w, pstack); if (v) { a[j++] = _string(k) + ":" + v; } } } else { for (k in o) { if (typeof k === "string" && l.hasOwnProperty(o, k)) { v = _stringify(o, k, d - 1, w, pstack); if (v) { a[j++] = _string(k) + ":" + v; } } } } a.sort(); } } pstack.pop(); return isArray ? "[" + a.join(",") + "]" : "{" + a.join(",") + "}"; } return undefined; } return { isValid: function(s) { return _isValid(_prepare(s)); }, parse: function(s, reviver) { s = _prepare(s); if (_isValid(s)) { return _revive(eval("(" + s + ")"), reviver); } throw new SyntaxError("parseJSON"); }, stringify: function(o, w, d) { if (o !== undefined) { if (l.isArray(w)) { w = (function(a) { var uniq = [], map = {}, v, i, j, len; for (i = 0, j = 0, len = a.length; i < len; ++i) { v = a[i]; if (typeof v === "string" && map[v] === undefined) { uniq[(map[v] = j++)] = v; } } return uniq; })(w); } d = d >= 0 ? d : 1 / 0; return _stringify({ "": o }, "", d, w, []); } return undefined; }, dateToString: function(d) { function _zeroPad(v) { return v < 10 ? "0" + v : v; } return d.getUTCFullYear() + "-" + _zeroPad(d.getUTCMonth() + 1) + "-" + _zeroPad(d.getUTCDate()) + "T" + _zeroPad(d.getUTCHours()) + ":" + _zeroPad(d.getUTCMinutes()) + ":" + _zeroPad(d.getUTCSeconds()) + "Z"; }, stringToDate: function(str) { if (/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/.test(str)) { var d = new Date(); d.setUTCFullYear(RegExp.$1, (RegExp.$2 | 0) - 1, RegExp.$3); d.setUTCHours(RegExp.$4, RegExp.$5, RegExp.$6); return d; } return str; } }; })(); YAHOO.register("json", YAHOO.lang.JSON, { version: "2.7.0", build: "1796" });
