    
	// deserialize a json attribute with the format: "json:[...]"
	fromJsonString = function(arg) {
		if ( typeof arg == 'string' ) {
			if ( arg.indexOf('json:') == 0)
			{
				try { x = eval('(' + arg.substring(5) + ')'); } 
				catch (err) { x = null; }
				return x;
			}
			else
			{
				return arg;
			}
		}
		return arg;
	}
	
	// serialize a javascript object to a json string with the format: "json:[...]"
	toJsonString = function (arg) {
    	return 'json:' + toJsonStringArray(arg).join('');
    }

	toJsonStringArray = function(arg, out) {
    out = out || new Array();
    var u; // undefined

    switch (typeof arg) {
    case 'object':
        if (arg) {
            if (arg.constructor == Array) {
                out.push('[');
                for (var i = 0; i < arg.length; ++i) {
                    if (i > 0)
                        out.push(','); // ',\n'
                    toJsonStringArray(arg[i], out);
                }
                out.push(']');
                return out;
            } else if (typeof arg.toString != 'undefined') {
                out.push('{');
                var first = true;
                for (var i in arg) {
                    var curr = out.length; // Record position to allow undo when arg[i] is undefined.
                    if (!first)
                        out.push(','); // ',\n'
                    toJsonStringArray(i, out);
                    out.push(':');                    
                    toJsonStringArray(arg[i], out);
                    if (out[out.length - 1] == u)
                        out.splice(curr, out.length - curr);
                    else
                        first = false;
                }
                out.push('}');
                return out;
            }
            return out;
        }
        out.push('null');
        return out;
    case 'unknown':
    case 'undefined':
    case 'function':
        out.push(u);
        return out;
    case 'string':
        out.push('"')
        out.push(arg.replace(/(["\\])/g, '\\$1').replace(/\r/g, '').replace(/\n/g, '\\n'));
        out.push('"');
        return out;
    default:
        out.push(String(arg));
        return out;
    }
}