/*
    json.js
    2006-04-28

    This file adds these methods to JavaScript:

	object.toJSONString()

	    This method produces a JSON text from an object. The
	    object must not contain any cyclical references.

	array.toJSONString()

	    This method produces a JSON text from an array. The
	    array must not contain any cyclical references.

	string.parseJSON()

	    This method parses a JSON text to produce an object or
	    array. It will return false if there is an error.
*/
(function () {
    var m = {
	    '\b': '\\b',
	    '\t': '\\t',
	    '\n': '\\n',
	    '\f': '\\f',
	    '\r': '\\r',
	    '"' : '\\"',
	    '\\': '\\\\'
	},
	s = {
	    array: function (x) {
		var b = false, f, v, n = 0, hash = false;
		/*
		 * Verification : si les index sont numeriques et
		 * se suivent, il s'agit d'un tableau, sinon c'est
		 * un hash.
		 */
		for (var i in x) {
		    v = x[i];
		    f = s[typeof v];
		    if (f && i != n) {
			hash = true;
			break;
		    }
		    n++;
		}
		var a = hash ? ["{"] : ["["];
		for (var i in x) {
		    v = x[i];
		    f = s[typeof v];
		    if (f) {
			v = f(v);
			if (typeof v == 'string') {
			    if (b)
				a.push(",");
			    if (hash)
				a.push(s.string(i), ":", v);
			    else
				a.push(v);
			    b = true;
			}
		    }
		}
		a.push(hash ? "}" : "]");
		return (a.join(""));
	    },
	    'boolean': function (x) {
		return String(x);
	    },
	    'null': function (x) {
		return "null";
	    },
	    number: function (x) {
		return isFinite(x) ? String(x) : "null";
	    },
	    object: function (x) {
		if (x) {
		    if (x instanceof Array) {
			return s.array(x);
		    }
		    var a = ["{"], b, f, i, v;
		    for (i in x) {
			v = x[i];
			f = s[typeof v];
			if (f) {
			    v = f(v);
			    if (typeof v == "string") {
				if (b) {
				    a.push(",");
				}
				a.push(s.string(i), ":", v);
				b = true;
			    }
			}
		    }
		    a.push("}");
		    return (a.join(""));
		}
		return 'null';
	    },
	    string: function (x) {
		if (/["\\\x00-\x1f]/.test(x)) {
		    x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
			var c = m[b];
			if (c)
			    return c;
			c = b.charCodeAt();
			return '\\u00' +
			    Math.floor(c / 16).toString(16) +
			    (c % 16).toString(16);
		    });
		}
		return ('"' + x + '"');
	    }
	};

    Object.prototype.toJSONString = function () {
	return s.object(this);
    };

    Array.prototype.toJSONString = function () {
	return s.array(this);
    };
})();

String.prototype.parseJSON = function () {
    try {
	return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
		this.replace(/"(\\.|[^"\\])*"/g, ''))) &&
	    eval("(" + this + ")");
    } catch (e) {
	return (false);
    }
};

