/*

Diese Ressource erzeugt zu typischen JavaScript-Objekten JavaScript-Code, der
bei Ausführung genau das JavaScript-Objekt ergibt.


*/
var JSONHelper = {
	USE: {},
	
	m : {
		'\b': '\\b',
		'\t': '\\t',
		'\n': '\\n',
		'\f': '\\f',
		'\r': '\\r',
		'"' : '\\"',
		'\\': '\\\\'
	},
	
	array: function (x) {
		var a = [];
		for (var i = 0; i < x.length; i++) {
			a[i] = this.serialize(x[i]);
		}
		var buf = a.join(',\n');
		buf = buf.replace(/\n/g, "\n    ");
		return "[\n    " + buf + "\n]";
	},
	'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 this.array(x);
			}
			var a = [];
			for (var i in x) {
				if (!(i in Object.prototype) || x[i] != Object.prototype[i]) {
					a.push(this.string(i) + ' : ' + this.serialize(x[i]));
				}
			}
			var buf = a.sort().join(',\n');
			buf = buf.replace(/\n/g, "\n    ");
			return "{\n    " + buf + "\n}";
			
		} else {
			return 'null';
		}
	},
	string: function (x) {
		var json = this;
		if (/["\\\x00-\x1f]/.test(x)) {
			x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
				var c = json.m[b];
				if (c) {
					return c;
				}
				c = b.charCodeAt();
				return '\\u00' +
					Math.floor(c / 16).toString(16) +
					(c % 16).toString(16);
			});
		}
		return '"' + x + '"';
	},
	
	serialize : function(v) {
		return this[typeof v] ? this[typeof v](v) : "null";
	},
	
	deserialize : function (s) {
		try {
			return (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(s)) && eval('(' + s + ')');
		} catch (e) {
			return false;
		}
	}
};
