( function($) {
	function toIntegersAtLease(n) {
		return n < 10 ? '0' + n : n;
	}
	Date.prototype.toJSON = function(date) {
		return this.getUTCFullYear() + '-'
				+ toIntegersAtLease(this.getUTCMonth()) + '-'
				+ toIntegersAtLease(this.getUTCDate());
	};
	var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g;
	var meta = {
		'\b' :'\\b',
		'\t' :'\\t',
		'\n' :'\\n',
		'\f' :'\\f',
		'\r' :'\\r',
		'"' :'\\"',
		'\\' :'\\\\'
	};
	$.quoteString = function(string) {
		if (escapeable.test(string)) {
			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 + '"';
	};
	$.toJSON = function(o, compact) {
		var type = typeof (o);
		if (type == "undefined")
			return "undefined";
		else if (type == "number" || type == "boolean")
			return o + "";
		else if (o === null)
			return "null";
		if (type == "string") {
			return $.quoteString(o);
		}
		if (type == "object" && typeof o.toJSON == "function")
			return o.toJSON(compact);
		if (type != "function" && typeof (o.length) == "number") {
			var ret = [];
			for ( var i = 0; i < o.length; i++) {
				ret.push($.toJSON(o[i], compact));
			}
			if (compact)
				return "[" + ret.join(",") + "]";
			else
				return "[" + ret.join(", ") + "]";
		}
		if (type == "function") {
			throw new TypeError(
					"Unable to convert object of type 'function' to json.");
		}
		var ret = [];
		for ( var k in o) {
			var name;
			type = typeof (k);
			if (type == "number")
				name = '"' + k + '"';
			else if (type == "string")
				name = $.quoteString(k);
			else
				continue;
			var val = $.toJSON(o[k], compact);
			if (typeof (val) != "string") {
				continue;
			}
			if (compact)
				ret.push(name + ":" + val);
			else
				ret.push(name + ": " + val);
		}
		return "{" + ret.join(", ") + "}";
	};
	$.compactJSON = function(o) {
		return $.toJSON(o, true);
	};
	$.evalJSON = function(src) {
		return eval("(" + src + ")");
	};
	$.secureEvalJSON = function(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.");
	};
})(jQuery);
