/*
json2.js
2007-11-06
See http://www.JSON.org/js.html
*/
if (!this.JSON) {

JSON = function () {

function f(n) {
return n < 10 ? '0' + n : n;
}

Date.prototype.toJSON = function () {

return this.getUTCFullYear()   + '-' +
f(this.getUTCMonth() + 1) + '-' +
f(this.getUTCDate())      + 'T' +
f(this.getUTCHours())     + ':' +
f(this.getUTCMinutes())   + ':' +
f(this.getUTCSeconds())   + 'Z';
};

var m = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"' : '\\"',
'\\': '\\\\'
};

function stringify(value, whitelist) {
var a,
i,
k,
l,
r = /["\\\x00-\x1f\x7f-\x9f]/g,
v;

switch (typeof value) {
case 'string':

return r.test(value) ?
'"' + value.replace(r, function (a) {
var c = m[a];
if (c) {
return c;
}
c = a.charCodeAt();
return '\\u00' + Math.floor(c / 16).toString(16) +
(c % 16).toString(16);
}) + '"' :
'"' + value + '"';

case 'number':

return isFinite(value) ? String(value) : 'null';

case 'boolean':
case 'null':
return String(value);

case 'object':

if (!value) {
return 'null';
}

if (typeof value.toJSON === 'function') {
return stringify(value.toJSON());
}
a = [];
if (typeof value.length === 'number' &&
!(value.propertyIsEnumerable('length'))) {

l = value.length;
for (i = 0; i < l; i += 1) {
a.push(stringify(value[i], whitelist) || 'null');
}

return '[' + a.join(',') + ']';
}
if (whitelist) {

l = whitelist.length;
for (i = 0; i < l; i += 1) {
k = whitelist[i];
if (typeof k === 'string') {
v = stringify(value[k], whitelist);
if (v) {
a.push(stringify(k) + ':' + v);
}
}
}
} else {

for (k in value) {
if (typeof k === 'string') {
v = stringify(value[k], whitelist);
if (v) {
a.push(stringify(k) + ':' + v);
}
}
}
}

return '{' + a.join(',') + '}';
}
}

return {
stringify: stringify,
parse: function (text, filter) {
var j;

function walk(k, v) {
var i, n;
if (v && typeof v === 'object') {
for (i in v) {
if (Object.prototype.hasOwnProperty.apply(v, [i])) {
n = walk(i, v[i]);
if (n !== undefined) {
v[i] = n;
}
}
}
}
return filter(k, v);
}

if (/^[\],:{}\s]*$/.test(text.replace(/\\./g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

j = eval('(' + text + ')');

return typeof filter === 'function' ? walk('', j) : j;
}

throw new SyntaxError('parseJSON');
}
};
}();
}
