if(!Object.prototype.toJSONString){
Array.prototype.toJSONString=function(w){
var a=[],
i,
l=this.length,
v;
for(i=0;i<l;i+=1){
v=this[i];
switch(typeof v){
case'object':
if(v){
if(typeof v.toJSONString==='function'){
a.push(v.toJSONString(w));
}
}else{
a.push('null');
}
break;
case'string':
case'number':
case'boolean':
a.push(v.toJSONString());
}
}
return'['+a.join(',')+']';
};
Boolean.prototype.toJSONString=function(){
return String(this);
};
Date.prototype.toJSONString=function(){
function f(n){
return n<10?'0'+n:n;
}
return'"'+this.getUTCFullYear()+'-'+
f(this.getUTCMonth()+1)+'-'+
f(this.getUTCDate())+'T'+
f(this.getUTCHours())+':'+
f(this.getUTCMinutes())+':'+
f(this.getUTCSeconds())+'Z"';
};
Number.prototype.toJSONString=function(){
return isFinite(this)?String(this):'null';
};
Object.prototype.toJSONString=function(w){
var a=[],
k,
i,
v;
if(w){
for(i=0;i<w.length;i+=1){
k=w[i];
if(typeof k==='string'){
v=this[k];
switch(typeof v){
case'object':
if(v){
if(typeof v.toJSONString==='function'){
a.push(k.toJSONString()+':'+
v.toJSONString(w));
}
}else{
a.push(k.toJSONString()+':null');
}
break;
case'string':
case'number':
case'boolean':
a.push(k.toJSONString()+':'+v.toJSONString());
}
}
}
}else{
for(k in this){
if(typeof k==='string'&&
Object.prototype.hasOwnProperty.apply(this,[k])){
v=this[k];
switch(typeof v){
case'object':
if(v){
if(typeof v.toJSONString==='function'){
a.push(k.toJSONString()+':'+
v.toJSONString());
}
}else{
a.push(k.toJSONString()+':null');
}
break;
case'string':
case'number':
case'boolean':
a.push(k.toJSONString()+':'+v.toJSONString());
}
}
}
}
return'{'+a.join(',')+'}';
};
(function(s){
var m={
'\b':'\\b',
'\t':'\\t',
'\n':'\\n',
'\f':'\\f',
'\r':'\\r',
'"':'\\"',
'\\':'\\\\'
};
s.parseJSON=function(filter){
var j;
function walk(k,v){
var i;
if(v&&typeof v==='object'){
for(i in v){
if(Object.prototype.hasOwnProperty.apply(v,[i])){
v[i]=walk(i,v[i]);
}
}
}
return filter(k,v);
}
if(/^[,:{}\[\]0-9.\-+Eaeflnr-u\n\r\t]*$/.test(this.
replace(/\\./g,'@').
replace(/"[^"\\\n\r]*"/g, ''))) {
// In the second stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
                j = eval('(' + this + ')');
// In the optional third stage, we recursively walk the new structure, passing
// each name/value pair to a filter function for possible transformation.
                return typeof filter === 'function' ? walk('', j) : j;
            }
// If the text is not JSON parseable, then a SyntaxError is thrown.
            throw new SyntaxError('parseJSON');
        };
        s.toJSONString = function () {
// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can simply slap some quotes around it.
// Otherwise we must also replace the offending characters with safe
// sequences.
            if (/["\\\x00-\x1f]/.test(this)){
return'"'+this.replace(/[\x00-\x1f\\"]/g,function(a){
var c=m[a];
if(c){
return c;
}
c=a.charCodeAt();
return'\\u00'+
Math.floor(c/16).toString(16)+
(c%16).toString(16);
})+'"';
}
return'"'+this+'"';
};
})(String.prototype);
}

