Adept.Core.namespace('Adept.Ajax');Adept.Ajax.Transport=Class.create(Ajax.Request,{initialize:function($super,url,options,onCompleteCallback,onExceptionCallback,onFailure){Object.extend(options,{asynchronous:true,evalScripts:true,frequency:5});this.onCompleteCallback=onCompleteCallback;options.onSuccess=(function(){this.onCompleteCallback(this.transport.responseText)}).bind(this);options.onException=onExceptionCallback;options.onFailure=onFailure;$super(url,options)}});Adept.Core.namespace('Adept.Ajax');Adept.Ajax.Backend={requests:[],createRequest:function(params,url){var request=new Adept.Ajax.Request(params,url);this.register(request);return request},register:function(request){this.requests.push(request)},unregister:function(request){this.requests=this.requests.without(request)},flush:function(){this.requests=[]}};Adept.Core.namespace("Adept.Ajax");Adept.Ajax.Request=Class.create({REQUEST_EVENT:'request',COMPLITE_EVENT:'complite',ERROR_EVENT:'error',IDLE:0,BUSY:1,PROCESSING:2,events:null,action:null,url:'',params:null,busyState:null,method:'POST',transport:null,initialize:function(params,url){this.events=new Object();this.params=new Object();this.url=url;this.busyState=this.BUSY;if(Adept.Core.isset(params)){this.setParams(params)}},send:function(){this.beforeRequest();this.transport=new Adept.Ajax.Transport(this.getUrl(),{method:this.getMethod(),parameters:this.getRequestString()},this.completeCallback.bind(this),this.exceptionCallback.bind(this),this.failureCallback.bind(this))},addRequestListener:function(listener){Adept.Observer.addListener(this,this.REQUEST_EVENT,listener)},addCompliteListener:function(listener){Adept.Observer.addListener(this,this.COMPLITE_EVENT,listener)},addEvent:function(id,event){this.events[id]=event},setAction:function(action){this.action=action},getUrl:function(){return this.url||window.location.href},setUrl:function(url){this.url=url},getParams:function(){return this.params},setParams:function(params){if(Object.isString(params)){this.params=params.toQueryParams()}else{if(params instanceof Object){this.params=params}else{throw new Adept.Exception.IlegalArgument('Invalid params')}}},getMethod:function(){return this.method},setMethod:function(method){this.method=method},getBusyState:function(){return this.busyState},setBusyState:function(busyState){this.busyState=busyState},getRequestString:function(){this.params.ajax=1;if(Adept.Core.isset(this.action)){this.params.action=this.action}return Object.toQueryString(this.params)+"&"+this.makeEventString()},completeCallback:function(response){Adept.Ajax.Processor.processResponse(response);this.afterComplite();Adept.Ajax.Backend.unregister(this)},exceptionCallback:function(transport,exception){Adept.Logger.error("Ajax trouble: Can not parse response "+exception.message);Adept.Observer.notify(this,this.ERROR_EVENT);Adept.Ajax.Backend.unregister(this)},failureCallback:function(){Adept.Logger.error("Ajax trouble: request fallure");Adept.Observer.notify(this,this.ERROR_EVENT);Adept.Ajax.Backend.unregister(this)},beforeRequest:function(){if(this.busyState==this.BUSY){Adept.Observer.notify(Adept.Application,Adept.Application.BUSY_EVENT)}Adept.Observer.notify(this,this.REQUEST_EVENT)},afterComplite:function(){Adept.Observer.notify(this,this.COMPLITE_EVENT);if(this.busyState==this.BUSY){Adept.Observer.notify(Adept.Application,Adept.Application.IDLE_EVENT)}},makeEventString:function(){var eventsString='';var first=true;for(key in this.events){if(!first){eventsString+='&'}first=false;eventsString+='event['+key+']='+encodeURIComponent(this.events[key])}return eventsString}});Adept.Core.namespace('Adept.Ajax');Adept.Ajax.Processor={processResponse:function(response){var commands=this.extractCommands(response);for(var i=0;i<commands.length;i++){var commandClass=commands[i]['commandType'];eval('command = new '+commandClass+'()');command.execute(commands[i]['params'])}},extractCommands:function(response){var start='\<\<COMMANDS\>\>';var end='\<\<END_OF_COMMANDS\>\>';var result=[];response.scan(new RegExp(start+'(.*?)'+end,'im'),function(item){var commands=item[1].evalJSON();commands.each(function(command){result.push(command)})});return result}};Adept.Core.namespace('Adept.Ajax');Adept.Ajax.Command=Class.create({initialize:function(){},execute:function(){},undo:function(){}});Adept.Core.namespace('Adept.Ajax.Command');Adept.Ajax.Command.Alert=Class.create(Adept.Ajax.Command,{execute:function(params){Adept.Assert.isset(params['message']);alert(params['message'])},undo:function(){}});Adept.Core.namespace('Adept.Ajax.Command');Adept.Ajax.Command.Replace=Class.create(Adept.Ajax.Command,{execute:function(params){Adept.Assert.isset(params['id']);Adept.Assert.isset(params['content']);Adept.Assert.elementExists(params['id']);Element.replace($(params['id']),params['content']);Adept.Observer.notify(params['id'],'replace')},undo:function(){}});Adept.Core.namespace('Adept.Ajax.Command');Adept.Ajax.Command.Update=Class.create(Adept.Ajax.Command,{execute:function(params){Element.update($(params['id']),params['content']);Adept.Observer.notify(params['id'],'update')},undo:function(){}});Adept.Core.namespace("Adept.Ajax.Command");Adept.Ajax.Command.Event=Class.create(Adept.Ajax.Command,{execute:function(params){Adept.Observer.notify(params['element'],params['event'])},undo:function(){}});Adept.Core.namespace('Adept.Ajax.Command');Adept.Ajax.Command.Eval=Class.create(Adept.Ajax.Command,{execute:function(params){Adept.Assert.isset(params['expression']);eval(params['expression'])},undo:function(){}});Adept.Core.namespace('Adept.Ajax.Command');Adept.Ajax.Command.Invoke=Class.create(Adept.Ajax.Command,{execute:function(options){var controller=Adept.Application.getController(options['controllerId']);var methodName=options['methodName'];var params=$A(options['params']);var paramString='(';var first=true;params.each(function(item){if(!first){paramString+=','}paramString+=item;first=false});paramString+=");";methodName+=paramString;eval('Adept.Application.getController(options["controllerId"]).'+methodName)},undo:function(){}});Adept.Core.namespace('Adept.Ajax.Command');Adept.Ajax.Command.Redirect=Class.create(Adept.Ajax.Command,{execute:function(params){Adept.Assert.isset(params['url']);window.location.href=params['url']},undo:function(){}});Adept.Core.namespace('Adept.Ajax.Command');Adept.Ajax.Command.Append=Class.create(Adept.Ajax.Command,{execute:function(params){var id=Adept.Core.generateId();var container=new Element('div',{'id':id}).update(params['content']);$(params['parentId']).appendChild(container);Adept.Observer.notify(params['parentId'],'append')},undo:function(){}});Adept.Core.namespace('Adept.Ajax.Command');Adept.Ajax.Command.Redirect=Class.create(Adept.Ajax.Command,{execute:function(params){Adept.Assert.isset(params['url']);window.location.href=params['url']},undo:function(){}});