diff options
Diffstat (limited to 'framework/Web/Javascripts/js/ajax.js')
-rw-r--r-- | framework/Web/Javascripts/js/ajax.js | 706 |
1 files changed, 82 insertions, 624 deletions
diff --git a/framework/Web/Javascripts/js/ajax.js b/framework/Web/Javascripts/js/ajax.js index 91542d45..2b509d61 100644 --- a/framework/Web/Javascripts/js/ajax.js +++ b/framework/Web/Javascripts/js/ajax.js @@ -1,625 +1,83 @@ -var Ajax = { -getTransport: function() { -return Try.these( -function() {return new XMLHttpRequest()}, -function() {return new ActiveXObject('Msxml2.XMLHTTP')}, -function() {return new ActiveXObject('Microsoft.XMLHTTP')} -) || false; -}, -activeRequestCount: 0 -} -Ajax.Responders = { -responders: [], -_each: function(iterator) { -this.responders._each(iterator); -}, -register: function(responderToAdd) { -if (!this.include(responderToAdd)) -this.responders.push(responderToAdd); -}, -unregister: function(responderToRemove) { -this.responders = this.responders.without(responderToRemove); -}, -dispatch: function(callback, request, transport, json) { -this.each(function(responder) { -if (responder[callback] && typeof responder[callback] == 'function') { -try { -responder[callback].apply(responder, [request, transport, json]); -} catch (e) {} -} -}); -} -}; -Object.extend(Ajax.Responders, Enumerable); -Ajax.Responders.register({ -onCreate: function() { -Ajax.activeRequestCount++; -}, -onComplete: function() { -Ajax.activeRequestCount--; -} -}); -Ajax.Base = function() {}; -Ajax.Base.prototype = { -setOptions: function(options) { -this.options = { -method: 'post', -asynchronous: true, -contentType:'application/x-www-form-urlencoded', -parameters: '' -} -Object.extend(this.options, options || {}); -}, -responseIsSuccess: function() { -return this.transport.status == undefined -|| this.transport.status == 0 -|| (this.transport.status >= 200 && this.transport.status < 300); -}, -responseIsFailure: function() { -return !this.responseIsSuccess(); -} -} -Ajax.Request = Class.create(); -Ajax.Request.Events = -['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; -Ajax.Request.prototype = Object.extend(new Ajax.Base(), { -initialize: function(url, options) { -this.transport = Ajax.getTransport(); -this.setOptions(options); -this.request(url); -}, -request: function(url) { -var parameters = this.options.parameters || ''; -if (parameters.length > 0) parameters += '&_='; -try { -this.url = url; -if (this.options.method == 'get' && parameters.length > 0) -this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; -Ajax.Responders.dispatch('onCreate', this, this.transport); -this.transport.open(this.options.method, this.url, -this.options.asynchronous); -if (this.options.asynchronous) { -this.transport.onreadystatechange = this.onStateChange.bind(this); -setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); -} -this.setRequestHeaders(); -var body = this.options.postBody ? this.options.postBody : parameters; -this.transport.send(this.options.method == 'post' ? body : null); -} catch (e) { -this.dispatchException(e); -} -}, -setRequestHeaders: function() { -var requestHeaders = -['X-Requested-With', 'XMLHttpRequest', - 'X-Prototype-Version', Prototype.Version, - 'Accept', 'text/javascript, text/html, application/xml, text/xml']; -if (this.options.method == 'post') { -requestHeaders.push('Content-type', this.options.contentType); -if (this.transport.overrideMimeType) -requestHeaders.push('Connection', 'close'); -} -if (this.options.requestHeaders) -requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); -for (var i = 0; i < requestHeaders.length; i += 2) -this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); -}, -onStateChange: function() { -var readyState = this.transport.readyState; -if (readyState != 1) -this.respondToReadyState(this.transport.readyState); -}, -header: function(name) { -try { -return this.transport.getResponseHeader(name); -} catch (e) {} -}, -evalJSON: function() { -try { -return eval('(' + this.header('X-JSON') + ')'); -} catch (e) {} -}, -evalResponse: function() { -try { -return eval(this.transport.responseText); -} catch (e) { -this.dispatchException(e); -} -}, -respondToReadyState: function(readyState) { -var event = Ajax.Request.Events[readyState]; -var transport = this.transport, json = this.evalJSON(); -if (event == 'Complete') { -try { -(this.options['on' + this.transport.status] - || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(transport, json); -} catch (e) { -this.dispatchException(e); -} -if ((this.header('Content-type') || '').match(/^text\/javascript/i)) -this.evalResponse(); -} -try { -(this.options['on' + event] || Prototype.emptyFunction)(transport, json); -Ajax.Responders.dispatch('on' + event, this, transport, json); -} catch (e) { -this.dispatchException(e); -} -if (event == 'Complete') -this.transport.onreadystatechange = Prototype.emptyFunction; -}, -dispatchException: function(exception) { -(this.options.onException || Prototype.emptyFunction)(this, exception); -Ajax.Responders.dispatch('onException', this, exception); -} -}); -Ajax.Updater = Class.create(); -Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { -initialize: function(container, url, options) { -this.containers = { -success: container.success ? $(container.success) : $(container), -failure: container.failure ? $(container.failure) : -(container.success ? null : $(container)) -} -this.transport = Ajax.getTransport(); -this.setOptions(options); -var onComplete = this.options.onComplete || Prototype.emptyFunction; -this.options.onComplete = (function(transport, object) { -this.updateContent(); -onComplete(transport, object); -}).bind(this); -this.request(url); -}, -updateContent: function() { -var receiver = this.responseIsSuccess() ? -this.containers.success : this.containers.failure; -var response = this.transport.responseText; -if (!this.options.evalScripts) -response = response.stripScripts(); -if (receiver) { -if (this.options.insertion) { -new this.options.insertion(receiver, response); -} else { -Element.update(receiver, response); -} -} -if (this.responseIsSuccess()) { -if (this.onComplete) -setTimeout(this.onComplete.bind(this), 10); -} -} -}); -Ajax.PeriodicalUpdater = Class.create(); -Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { -initialize: function(container, url, options) { -this.setOptions(options); -this.onComplete = this.options.onComplete; -this.frequency = (this.options.frequency || 2); -this.decay = (this.options.decay || 1); -this.updater = {}; -this.container = container; -this.url = url; -this.start(); -}, -start: function() { -this.options.onComplete = this.updateComplete.bind(this); -this.onTimerEvent(); -}, -stop: function() { -this.updater.onComplete = undefined; -clearTimeout(this.timer); -(this.onComplete || Prototype.emptyFunction).apply(this, arguments); -}, -updateComplete: function(request) { -if (this.options.decay) { -this.decay = (request.responseText == this.lastText ? -this.decay * this.options.decay : 1); -this.lastText = request.responseText; -} -this.timer = setTimeout(this.onTimerEvent.bind(this), -this.decay * this.frequency * 1000); -}, -onTimerEvent: function() { -this.updater = new Ajax.Updater(this.container, this.url, this.options); -} -}); -Prado.Callback = Class.create(); -Object.extend(Prado.Callback, -{ -FIELD_CALLBACK_TARGET : 'PRADO_CALLBACK_TARGET', -FIELD_CALLBACK_PARAMETER : 'PRADO_CALLBACK_PARAMETER', -PostDataLoaders : ['PRADO_PAGESTATE'], -Exception : -{ -"on505" : function(request, transport, data) -{ -var msg = 'HTTP '+transport.status+" with response"; -Logger.error(msg, transport.responseText); -this.logException(data); -}, -onComplete : function(request, transport, data) -{ -if(transport.status != 505) -{ -var msg = 'HTTP '+transport.status+" with response : \n"; -msg += transport.responseText + "\n"; -msg += "Data : \n"+inspect(data); -Logger.warn(msg); -} -}, -formatException : function(e) -{ -var msg = e.type + " with message \""+e.message+"\""; -msg += " in "+e.file+"("+e.line+")\n"; -msg += "Stack trace:\n"; -var trace = e.trace; -for(var i = 0; i<trace.length; i++) -{ -msg += "#"+i+" "+trace[i].file; -msg += "("+trace[i].line+"): "; -msg += trace[i]["class"]+"->"+trace[i]["function"]+"()"+"\n"; -} -return msg; -}, -logException : function(e) -{ -Logger.error("Callback Request Error "+e.code, this.formatException(e)); -} -}, -encode : function(data) -{ -Prado.JSON.stringify(data); -}, -decode : function(data) -{ -return Prado.JSON.parse(data); -} -}) + +var Ajax={getTransport:function(){return Try.these(function(){return new XMLHttpRequest()},function(){return new ActiveXObject('Msxml2.XMLHTTP')},function(){return new ActiveXObject('Microsoft.XMLHTTP')})||false;},activeRequestCount:0} +Ajax.Responders={responders:[],_each:function(iterator){this.responders._each(iterator);},register:function(responderToAdd){if(!this.include(responderToAdd)) +this.responders.push(responderToAdd);},unregister:function(responderToRemove){this.responders=this.responders.without(responderToRemove);},dispatch:function(callback,request,transport,json){this.each(function(responder){if(responder[callback]&&typeof responder[callback]=='function'){try{responder[callback].apply(responder,[request,transport,json]);}catch(e){}}});}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++;},onComplete:function(){Ajax.activeRequestCount--;}});Ajax.Base=function(){};Ajax.Base.prototype={setOptions:function(options){this.options={method:'post',asynchronous:true,contentType:'application/x-www-form-urlencoded',parameters:''} +Object.extend(this.options,options||{});},responseIsSuccess:function(){return this.transport.status==undefined||this.transport.status==0||(this.transport.status>=200&&this.transport.status<300);},responseIsFailure:function(){return!this.responseIsSuccess();}} +Ajax.Request=Class.create();Ajax.Request.Events=['Uninitialized','Loading','Loaded','Interactive','Complete'];Ajax.Request.prototype=Object.extend(new Ajax.Base(),{initialize:function(url,options){this.transport=Ajax.getTransport();this.setOptions(options);this.request(url);},request:function(url){var parameters=this.options.parameters||'';if(parameters.length>0)parameters+='&_=';try{this.url=url;if(this.options.method=='get'&¶meters.length>0) +this.url+=(this.url.match(/\?/)?'&':'?')+parameters;Ajax.Responders.dispatch('onCreate',this,this.transport);this.transport.open(this.options.method,this.url,this.options.asynchronous);if(this.options.asynchronous){this.transport.onreadystatechange=this.onStateChange.bind(this);setTimeout((function(){this.respondToReadyState(1)}).bind(this),10);} +this.setRequestHeaders();var body=this.options.postBody?this.options.postBody:parameters;this.transport.send(this.options.method=='post'?body:null);}catch(e){this.dispatchException(e);}},setRequestHeaders:function(){var requestHeaders=['X-Requested-With','XMLHttpRequest','X-Prototype-Version',Prototype.Version,'Accept','text/javascript, text/html, application/xml, text/xml'];if(this.options.method=='post'){requestHeaders.push('Content-type',this.options.contentType);if(this.transport.overrideMimeType) +requestHeaders.push('Connection','close');} +if(this.options.requestHeaders) +requestHeaders.push.apply(requestHeaders,this.options.requestHeaders);for(var i=0;i<requestHeaders.length;i+=2) +this.transport.setRequestHeader(requestHeaders[i],requestHeaders[i+1]);},onStateChange:function(){var readyState=this.transport.readyState;if(readyState!=1) +this.respondToReadyState(this.transport.readyState);},header:function(name){try{return this.transport.getResponseHeader(name);}catch(e){}},evalJSON:function(){try{return eval('('+this.header('X-JSON')+')');}catch(e){}},evalResponse:function(){try{return eval(this.transport.responseText);}catch(e){this.dispatchException(e);}},respondToReadyState:function(readyState){var event=Ajax.Request.Events[readyState];var transport=this.transport,json=this.evalJSON();if(event=='Complete'){try{(this.options['on'+this.transport.status]||this.options['on'+(this.responseIsSuccess()?'Success':'Failure')]||Prototype.emptyFunction)(transport,json);}catch(e){this.dispatchException(e);} +if((this.header('Content-type')||'').match(/^text\/javascript/i)) +this.evalResponse();} +try{(this.options['on'+event]||Prototype.emptyFunction)(transport,json);Ajax.Responders.dispatch('on'+event,this,transport,json);}catch(e){this.dispatchException(e);} +if(event=='Complete') +this.transport.onreadystatechange=Prototype.emptyFunction;},dispatchException:function(exception){(this.options.onException||Prototype.emptyFunction)(this,exception);Ajax.Responders.dispatch('onException',this,exception);}});Ajax.Updater=Class.create();Object.extend(Object.extend(Ajax.Updater.prototype,Ajax.Request.prototype),{initialize:function(container,url,options){this.containers={success:container.success?$(container.success):$(container),failure:container.failure?$(container.failure):(container.success?null:$(container))} +this.transport=Ajax.getTransport();this.setOptions(options);var onComplete=this.options.onComplete||Prototype.emptyFunction;this.options.onComplete=(function(transport,object){this.updateContent();onComplete(transport,object);}).bind(this);this.request(url);},updateContent:function(){var receiver=this.responseIsSuccess()?this.containers.success:this.containers.failure;var response=this.transport.responseText;if(!this.options.evalScripts) +response=response.stripScripts();if(receiver){if(this.options.insertion){new this.options.insertion(receiver,response);}else{Element.update(receiver,response);}} +if(this.responseIsSuccess()){if(this.onComplete) +setTimeout(this.onComplete.bind(this),10);}}});Ajax.PeriodicalUpdater=Class.create();Ajax.PeriodicalUpdater.prototype=Object.extend(new Ajax.Base(),{initialize:function(container,url,options){this.setOptions(options);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=container;this.url=url;this.start();},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent();},stop:function(){this.updater.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments);},updateComplete:function(request){if(this.options.decay){this.decay=(request.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=request.responseText;} +this.timer=setTimeout(this.onTimerEvent.bind(this),this.decay*this.frequency*1000);},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options);}});Prado.Callback=Class.create();Object.extend(Prado.Callback,{FIELD_CALLBACK_TARGET:'PRADO_CALLBACK_TARGET',FIELD_CALLBACK_PARAMETER:'PRADO_CALLBACK_PARAMETER',PostDataLoaders:['PRADO_PAGESTATE'],Exception:{"on505":function(request,transport,data) +{var msg='HTTP '+transport.status+" with response";Logger.error(msg,transport.responseText);this.logException(data);},onComplete:function(request,transport,data) +{if(transport.status!=505) +{var msg='HTTP '+transport.status+" with response : \n";msg+=transport.responseText+"\n";msg+="Data : \n"+inspect(data);Logger.warn(msg);}},formatException:function(e) +{var msg=e.type+" with message \""+e.message+"\"";msg+=" in "+e.file+"("+e.line+")\n";msg+="Stack trace:\n";var trace=e.trace;for(var i=0;i<trace.length;i++) +{msg+=" #"+i+" "+trace[i].file;msg+="("+trace[i].line+"): ";msg+=trace[i]["class"]+"->"+trace[i]["function"]+"()"+"\n";} +return msg;},logException:function(e) +{Logger.error("Callback Request Error "+e.code,this.formatException(e));}},encode:function(data) +{Prado.JSON.stringify(data);},decode:function(data) +{return Prado.JSON.parse(data);}}) Event.OnLoad(function() -{ -if(typeof Logger != "undefined") -Ajax.Responders.register(Prado.Callback.Exception); -}); -Prado.Callback.prototype = -{ -url : window.location.href, -options : {}, -id : null, -parameters : null, -initialize : function(id, parameters, onSuccess, options) -{ -this.options = options || {}; -this.id = id; -this.parameters = parameters; -var request = -{ -postBody : this._getPostData(), -onSuccess : this._onSuccess.bind(this) -} -Object.extend(this.options || {},request); -new Ajax.Request(this.url, this.options); -}, -_getPostData : function() -{ -var data = {}; -Prado.Callback.PostDataLoaders.each(function(name) -{ -$A(document.getElementsByName(name)).each(function(element) -{ -var value = $F(element); -if(typeof(value) != "undefined") -data[name] = value; -}) -}) -if(typeof(this.parameters) != "undefined") -data[Prado.Callback.FIELD_CALLBACK_PARAMETER] = Prado.Callback.encode(this.parameters); -data[Prado.Callback.FIELD_CALLBACK_TARGET] = this.id; -return $H(data).toQueryString(); -}, -_onSuccess : function(response, transport, json) -{ -} -} -Array.prototype.______array = '______array'; -Prado.JSON = { -org: 'http: -copyright: '(c)2005 JSON.org', -license: 'http: -stringify: function (arg) { -var c, i, l, s = '', v; -switch (typeof arg) { -case 'object': -if (arg) { -if (arg.______array == '______array') { -for (i = 0; i < arg.length; ++i) { -v = this.stringify(arg[i]); -if (s) { -s += ','; -} -s += v; -} -return '[' + s + ']'; -} else if (typeof arg.toString != 'undefined') { -for (i in arg) { -v = arg[i]; -if (typeof v != 'undefined' && typeof v != 'function') { -v = this.stringify(v); -if (s) { -s += ','; -} -s += this.stringify(i) + ':' + v; -} -} -return '{' + s + '}'; -} -} -return 'null'; -case 'number': -return isFinite(arg) ? String(arg) : 'null'; -case 'string': -l = arg.length; -s = '"'; -for (i = 0; i < l; i += 1) { -c = arg.charAt(i); -if (c >= ' ') { -if (c == '\\' || c == '"') { -s += '\\'; -} -s += c; -} else { -switch (c) { -case '\b': -s += '\\b'; -break; -case '\f': -s += '\\f'; -break; -case '\n': -s += '\\n'; -break; -case '\r': -s += '\\r'; -break; -case '\t': -s += '\\t'; -break; -default: -c = c.charCodeAt(); -s += '\\u00' + Math.floor(c / 16).toString(16) + -(c % 16).toString(16); -} -} -} -return s + '"'; -case 'boolean': -return String(arg); -default: -return 'null'; -} -}, -parse: function (text) { -var at = 0; -var ch = ' '; -function error(m) { -throw { -name: 'JSONError', -message: m, -at: at - 1, -text: text -}; -} -function next() { -ch = text.charAt(at); -at += 1; -return ch; -} -function white() { -while (ch) { -if (ch <= ' ') { -next(); -} else if (ch == '/') { -switch (next()) { -case '/': -while (next() && ch != '\n' && ch != '\r') {} -break; -case '*': -next(); -for (;;) { -if (ch) { -if (ch == '*') { -if (next() == '/') { -next(); -break; -} -} else { -next(); -} -} else { -error("Unterminated comment"); -} -} -break; -default: -error("Syntax error"); -} -} else { -break; -} -} -} -function string() { -var i, s = '', t, u; -if (ch == '"') { -outer:while (next()) { -if (ch == '"') { -next(); -return s; -} else if (ch == '\\') { -switch (next()) { -case 'b': -s += '\b'; -break; -case 'f': -s += '\f'; -break; -case 'n': -s += '\n'; -break; -case 'r': -s += '\r'; -break; -case 't': -s += '\t'; -break; -case 'u': -u = 0; -for (i = 0; i < 4; i += 1) { -t = parseInt(next(), 16); -if (!isFinite(t)) { -break outer; -} -u = u * 16 + t; -} -s += String.fromCharCode(u); -break; -default: -s += ch; -} -} else { -s += ch; -} -} -} -error("Bad string"); -} -function array() { -var a = []; -if (ch == '[') { -next(); -white(); -if (ch == ']') { -next(); -return a; -} -while (ch) { -a.push(value()); -white(); -if (ch == ']') { -next(); -return a; -} else if (ch != ',') { -break; -} -next(); -white(); -} -} -error("Bad array"); -} -function object() { -var k, o = {}; -if (ch == '{') { -next(); -white(); -if (ch == '}') { -next(); -return o; -} -while (ch) { -k = string(); -white(); -if (ch != ':') { -break; -} -next(); -o[k] = value(); -white(); -if (ch == '}') { -next(); -return o; -} else if (ch != ',') { -break; -} -next(); -white(); -} -} -error("Bad object"); -} -function number() { -var n = '', v; -if (ch == '-') { -n = '-'; -next(); -} -while (ch >= '0' && ch <= '9') { -n += ch; -next(); -} -if (ch == '.') { -n += '.'; -while (next() && ch >= '0' && ch <= '9') { -n += ch; -} -} -if (ch == 'e' || ch == 'E') { -n += 'e'; -next(); -if (ch == '-' || ch == '+') { -n += ch; -next(); -} -while (ch >= '0' && ch <= '9') { -n += ch; -next(); -} -} -v = +n; -if (!isFinite(v)) { -} else { -return v; -} -} -function word() { -switch (ch) { -case 't': -if (next() == 'r' && next() == 'u' && next() == 'e') { -next(); -return true; -} -break; -case 'f': -if (next() == 'a' && next() == 'l' && next() == 's' && -next() == 'e') { -next(); -return false; -} -break; -case 'n': -if (next() == 'u' && next() == 'l' && next() == 'l') { -next(); -return null; -} -break; -} -error("Syntax error"); -} -function value() { -white(); -switch (ch) { -case '{': -return object(); -case '[': -return array(); -case '"': -return string(); -case '-': -return number(); -default: -return ch >= '0' && ch <= '9' ? number() : word(); -} -} -return value(); -} -}; +{if(typeof Logger!="undefined") +Ajax.Responders.register(Prado.Callback.Exception);});Prado.Callback.prototype={url:window.location.href,options:{},id:null,parameters:null,initialize:function(id,parameters,onSuccess,options) +{this.options=options||{};this.id=id;this.parameters=parameters;var request={postBody:this._getPostData(),onSuccess:this._onSuccess.bind(this)} +Object.extend(this.options||{},request);new Ajax.Request(this.url,this.options);},_getPostData:function() +{var data={};Prado.Callback.PostDataLoaders.each(function(name) +{$A(document.getElementsByName(name)).each(function(element) +{var value=$F(element);if(typeof(value)!="undefined") +data[name]=value;})}) +if(typeof(this.parameters)!="undefined") +data[Prado.Callback.FIELD_CALLBACK_PARAMETER]=Prado.Callback.encode(this.parameters);data[Prado.Callback.FIELD_CALLBACK_TARGET]=this.id;return $H(data).toQueryString();},_onSuccess:function(response,transport,json) +{}} +Array.prototype.______array='______array';Prado.JSON={org:'http://www.JSON.org',copyright:'(c)2005 JSON.org',license:'http://www.crockford.com/JSON/license.html',stringify:function(arg){var c,i,l,s='',v;switch(typeof arg){case'object':if(arg){if(arg.______array=='______array'){for(i=0;i<arg.length;++i){v=this.stringify(arg[i]);if(s){s+=',';} +s+=v;} +return'['+s+']';}else if(typeof arg.toString!='undefined'){for(i in arg){v=arg[i];if(typeof v!='undefined'&&typeof v!='function'){v=this.stringify(v);if(s){s+=',';} +s+=this.stringify(i)+':'+v;}} +return'{'+s+'}';}} +return'null';case'number':return isFinite(arg)?String(arg):'null';case'string':l=arg.length;s='"';for(i=0;i<l;i+=1){c=arg.charAt(i);if(c>=' '){if(c=='\\'||c=='"'){s+='\\';} +s+=c;}else{switch(c){case'\b':s+='\\b';break;case'\f':s+='\\f';break;case'\n':s+='\\n';break;case'\r':s+='\\r';break;case'\t':s+='\\t';break;default:c=c.charCodeAt();s+='\\u00'+Math.floor(c/16).toString(16)+ +(c%16).toString(16);}}} +return s+'"';case'boolean':return String(arg);default:return'null';}},parse:function(text){var at=0;var ch=' ';function error(m){throw{name:'JSONError',message:m,at:at-1,text:text};} +function next(){ch=text.charAt(at);at+=1;return ch;} +function white(){while(ch){if(ch<=' '){next();}else if(ch=='/'){switch(next()){case'/':while(next()&&ch!='\n'&&ch!='\r'){} +break;case'*':next();for(;;){if(ch){if(ch=='*'){if(next()=='/'){next();break;}}else{next();}}else{error("Unterminated comment");}} +break;default:error("Syntax error");}}else{break;}}} +function string(){var i,s='',t,u;if(ch=='"'){outer:while(next()){if(ch=='"'){next();return s;}else if(ch=='\\'){switch(next()){case'b':s+='\b';break;case'f':s+='\f';break;case'n':s+='\n';break;case'r':s+='\r';break;case't':s+='\t';break;case'u':u=0;for(i=0;i<4;i+=1){t=parseInt(next(),16);if(!isFinite(t)){break outer;} +u=u*16+t;} +s+=String.fromCharCode(u);break;default:s+=ch;}}else{s+=ch;}}} +error("Bad string");} +function array(){var a=[];if(ch=='['){next();white();if(ch==']'){next();return a;} +while(ch){a.push(value());white();if(ch==']'){next();return a;}else if(ch!=','){break;} +next();white();}} +error("Bad array");} +function object(){var k,o={};if(ch=='{'){next();white();if(ch=='}'){next();return o;} +while(ch){k=string();white();if(ch!=':'){break;} +next();o[k]=value();white();if(ch=='}'){next();return o;}else if(ch!=','){break;} +next();white();}} +error("Bad object");} +function number(){var n='',v;if(ch=='-'){n='-';next();} +while(ch>='0'&&ch<='9'){n+=ch;next();} +if(ch=='.'){n+='.';while(next()&&ch>='0'&&ch<='9'){n+=ch;}} +if(ch=='e'||ch=='E'){n+='e';next();if(ch=='-'||ch=='+'){n+=ch;next();} +while(ch>='0'&&ch<='9'){n+=ch;next();}} +v=+n;if(!isFinite(v)){}else{return v;}} +function word(){switch(ch){case't':if(next()=='r'&&next()=='u'&&next()=='e'){next();return true;} +break;case'f':if(next()=='a'&&next()=='l'&&next()=='s'&&next()=='e'){next();return false;} +break;case'n':if(next()=='u'&&next()=='l'&&next()=='l'){next();return null;} +break;} +error("Syntax error");} +function value(){white();switch(ch){case'{':return object();case'[':return array();case'"':return string();case'-':return number();default:return ch>='0'&&ch<='9'?number():word();}} +return value();}};
\ No newline at end of file |