(function( ) { Object.prototype.extend = function( ) { for ( i = 0; i < arguments.length; i++ ) { if ( typeof arguments[ i ] != 'object' || arguments[ i ] === null ) continue; var obj = /(\w+)\(/.exec( arguments[ i ].constructor.toString( ) )[ 1 ]; for ( var property in arguments[ i ] ) { if ( ! ( this[ property ] ) ) this[ property ] = arguments[ i ][ property ]; this[ '$' + obj + '$' + property ] = arguments[ i ][ property ]; } } }; String.prototype.trim = function( ) { return this.replace( /^\s+|\s+$/g, '' ); }; function f( n ) { return n < 10 ? '0' + n : n; } Date.prototype.toJSON = function( key ) { return isFinite( this.valueOf( ) ) ? this.getUTCFullYear( ) + '-' + f( this.getUTCMonth( ) + 1) + '-' + f( this.getUTCDate( ) ) + 'T' + f( this.getUTCHours( ) ) + ':' + f( this.getUTCMinutes( ) ) + ':' + f( this.getUTCSeconds( ) ) + 'Z' : null; }; String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function( key ) { return this.valueOf( ); }; var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, rep; function quote( string ) { escapable.lastIndex = 0; return escapable.test( string ) ? '"' + string.replace(escapable, function (a) { var c = meta[ a ]; return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); } ) + '"' : '"' + string + '"'; } function str( key, holder ) { var i, k, v, length, mind = gap, partial, value = holder[ key ]; if ( value && typeof value === 'object' && typeof value.toJSON === 'function' ) value = value.toJSON( key ); if ( typeof rep === 'function' ) value = rep.call( holder, key, value ); switch ( typeof value ) { case 'string': return quote(value); case 'number': return isFinite(value) ? String(value) : 'null'; case 'boolean': case 'null': return String(value); case 'object': if ( ! value ) return 'null'; gap += indent; partial = [ ]; if ( Object.prototype.toString.apply( value ) === '[object Array]' ) { length = value.length; for ( i = 0; i < length; i += 1 ) partial[i] = str( i, value ) || 'null'; v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join( ',\n' + gap ) + '\n' + mind + ']' : '[' + partial.join( ',' ) + ']'; gap = mind; return v; } if ( rep && typeof rep === 'object' ) { length = rep.length; for ( i = 0; i < length; i += 1 ) { k = rep[ i ]; if ( typeof k === 'string' ) { v = str( k, value ); if ( v ) partial.push( quote( k ) + ( gap ? ': ' : ':' ) + v ); } } } else { for ( k in value ) if ( Object.hasOwnProperty.call( value, k ) ) { v = str( k, value ); if ( v ) partial.push( quote( k ) + ( gap ? ': ' : ':' ) + v ); } } v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join( ',\n' + gap ) + '\n' + mind + '}' : '{' + partial.join( ',' ) + '}'; gap = mind; return v; } } function stringify( replacer, space ) { var i; gap = ''; indent = ''; if ( typeof space === 'number' ) for ( i = 0; i < space; i += 1 ) indent += ' '; else if ( typeof space === 'string' ) indent = space; rep = replacer; if ( replacer && typeof replacer !== 'function' && ( typeof replacer !== 'object' || typeof replacer.length !== 'number' ) ) { throw new Error( 'JSON.stringify' ); } return str( '', { '': this } ); } function parse( reviver ) { var j; function walk( holder, key ) { var k, v, value = holder[ key ]; if ( value && typeof value === 'object' ) { for ( k in value ) if ( Object.hasOwnProperty.call( value, k ) ) { v = walk( value, k ); if ( v !== undefined ) value[ k ] = v; else delete value[ k ]; } } return reviver.call( holder, key, value ); } cx.lastIndex = 0; if ( cx.test( this ) ) { this.replace( cx, function( a ) { return '\\u' + ( '0000' + a.charCodeAt( 0 ).toString( 16 ) ).slice( -4 ); }); } if ( /^[\],:{}\s]*$/. test( this.replace( /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@' ). replace( /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']' ). replace( /(?:^|:|,)(?:\s*\[)+/g, '' ) ) ) { j = eval( '(' + this + ')' ); return typeof reviver === 'function' ? walk( { '': j }, '' ) : j; } throw new SyntaxError( 'JSON.parse' ); } function JSON( ) { if ( this.constructor === String ) return parse.call( this ); else return stringify.call( this ); } Object.prototype.JSON = JSON; String.prototype.JSON = JSON; }( ) );