(function ($) {
    var m = {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        s = {
            'array': function (x) {
                var a = ['['], b, f, i, l = x.length, v;
                for (i = 0; i < l; i += 1) {
                    v = x[i];
                    f = s[typeof v];
                    if (f) {
                        v = f(v);
                        if (typeof v == 'string') {
                            if (b) {
                                a[a.length] = ',';
                            }
                            a[a.length] = v;
                            b = true;
                        }
                    }
                }
                a[a.length] = ']';
                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[a.length] = ',';
                                }
                                a.push(s.string(i), ':', v);
                                b = true;
                            }
                        }
                    }
                    a[a.length] = '}';
                    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 + '"';
            }
        };

	$.toJSON = function(v) {
		var f = isNaN(v) ? s[typeof v] : s['number'];
		if (f) return f(v);
	};
	
	$.parseJSON = function(v, safe) {
		if (safe === undefined) safe = $.parseJSON.safe;
		if (safe && !/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(v))
			return undefined;
		return eval('('+v+')');
	};
	
	$.parseJSON.safe = false;

})(jQuery);



 // implement JSON.stringify serialization  
 /*JSON.stringify = JSON.stringify || function (obj) {  
     var t = typeof (obj);  
     if (t != "object" || obj === null) {  
         // simple data type  
         if (t == "string") obj = '"'+obj+'"';  
         return String(obj);  
     }  
     else {  
         // recurse array or object  
         var n, v, json = [], arr = (obj && obj.constructor == Array);  
         for (n in obj) {  
             v = obj[n]; t = typeof(v);  
             if (t == "string") v = '"'+v+'"';  
             else if (t == "object" && v !== null) v = JSON.stringify(v);  
             json.push((arr ? "" : '"' + n + '":') + String(v));  
         }  
         return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");  
     }  
 };  

// implement JSON.parse de-serialization
 JSON.parse = function(str) {
     var str2 = ''
     for (i = 0; i < str.length; i++) {
         if (str[i] != "\\")
            if((i == 0 && str[i] != '"') || i!=0)
                if((i == str.length - 1 && str[str.length - 1] != '"') || i!= str.length - 1)
                    str2 = str2 + str[i];
     }
     str = str2;
     if (str === "") str = '""';
     eval("var p=" + str + ";");
     return p;
 };
 
 */
 
 
 
 // implement JSON.stringify serialization  
 //JSON.stringify = JSON.stringify || function (obj) {
var JSON = {
     stringify : function (obj) {
	     var t = typeof (obj);  
	     if (t != "object" || obj === null) {  
		 // simple data type  
		 if (t == "string") obj = '"'+obj+'"';  
		 return String(obj);  
	     }  
	     else {  
		 // recurse array or object  
		 var n, v, json = [], arr = (obj && obj.constructor == Array);  
		 for (n in obj) {  
		     v = obj[n]; t = typeof(v);  
		     if (t == "string") v = '"'+v+'"';  
		     else if (t == "object" && v !== null) v = JSON.stringify(v);  
		     json.push((arr ? "" : '"' + n + '":') + String(v));  
		 }  
		 return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");  
	     }  
	 }  

// implement JSON.parse de-serialization
//JSON.parse = function (str) {
	,parse : function (str) {
		if (str === "") str = '""';
		var reg=new RegExp('(\")', 'g');
		
		if(str.substring(0,1) == "'" || str.substring(0,1) == '"' )
			eval('var p=' + str.replace(reg,'\'').substring(1,str.replace(reg,'\'' ).length-1) + ';');
		else
			eval('var p=' + str + ';');
		return p;
		
	}
};
