var Model=function(){this.initialize=function(){this.initializeModel()};this.proxyMap={};this.registerProxy=function(proxy){this.proxyMap[proxy.getProxyName()]=proxy;proxy.onRegister()};this.retrieveProxy=function(proxyName){return this.proxyMap[proxyName]};this.hasProxy=function(proxyName){return this.proxyMap[proxyName]!=null};this.removeProxy=function(proxyName){var proxy=this.proxyMap[proxyName];if(proxy){delete this.proxyMap[proxyName];proxy.onRemove()}return proxy};this.initializeModel=function(){}};Model.getInstance=function(){if(Model.instance==undefined){var classFactory=new Class(new Model());Model.instance=new classFactory()}return Model.instance};var View=function(){this.mediatorMap={};this.observerMap={};this.registerObserver=function(notificationName,observer){var observers=this.observerMap[notificationName];if(observers){observers.push(observer)}else{this.observerMap[notificationName]=[observer]}};this.notifyObservers=function(notification){var name=notification.getName();if(this.observerMap[name]==null){return}var observers=this.observerMap[name].concat();var len=observers.length;for(var i=0;i<len;i++){var observer=observers[i];observer.notifyObserver(notification)}};this.removeObserver=function(notificationName,notifyContext){var observers=this.observerMap[notificationName];var i=observers.length;while(i--){var observer=observers[i];if(observer.compareNotifyContext(notifyContext)){observers.splice(i,1);break}}if(!observers.length){delete this.observerMap[notificationName]}};this.registerMediator=function(mediator){var name=mediator.getMediatorName();if(this.mediatorMap[name]){return}this.mediatorMap[name]=mediator;var interests=mediator.listNotificationInterests();var len=interests.length;if(len){var observer=new Observer(mediator.handleNotification,mediator);for(var i=0;i<len;i++){this.registerObserver(interests[i],observer)}}mediator.onRegister()};this.retrieveMediator=function(mediatorName){return this.mediatorMap[mediatorName]};this.removeMediator=function(mediatorName){var mediator=this.mediatorMap[mediatorName];if(mediator){var interests=mediator.listNotificationInterests();var i=interests.length;while(i--){this.removeObserver(interests[i],mediator)}delete this.mediatorMap[mediatorName];mediator.onRemove()}return mediator};this.hasMediator=function(mediatorName){return this.mediatorMap[mediatorName]!=null}};View.getInstance=function(){if(View.instance==undefined){var classFactory=new Class(new View());View.instance=new classFactory()}return View.instance};var Controller=function(){this.view=null;this.commandMap={};this.initialize=function(){this.initializeController()};this.initializeController=function(){this.view=View.getInstance()};this.executeCommand=function(note){var commandClassRef=this.commandMap[note.getName()];if(!commandClassRef){return}var command=new commandClassRef();command.execute(note)};this.registerCommand=function(notificationName,commandClassRef){if(!this.commandMap[notificationName]){this.view.registerObserver(notificationName,new Observer(this.executeCommand,this))}this.commandMap[notificationName]=commandClassRef};this.hasCommand=function(notificationName){return this.commandMap[notificationName]!=null};this.removeCommand=function(notificationName){if(!this.hasCommand(notificationName)){return}this.view.removeObserver(notificationName,this);delete this.commandMap[notificationName]}};Controller.getInstance=function(){if(Controller.instance==undefined){var classFactory=new Class(new Controller());Controller.instance=new classFactory()}return Controller.instance};var Notifier=function(){this.facade=null;this.initialize=function(){this.facade=Facade.getInstance()};this.sendNotification=function(notificationName,body,type){this.facade.sendNotification(notificationName,body,type)}};Notifier=new Class(new Notifier());var Mediator=function(mediatorName,viewComponent){this.Extends=Notifier;this.mediatorName=null;this.viewComponent=null;this.initialize=function(mediatorName,viewComponent){this.parent();this.mediatorName=mediatorName||Mediator.NAME;this.viewComponent=viewComponent};this.listNotificationInterests=function(){return[]};this.getMediatorName=function(){return this.mediatorName};this.getViewComponent=function(){return this.viewComponent};this.setViewComponent=function(viewComponent){this.viewComponent=viewComponent};this.handleNotification=function(notification){};this.onRegister=function(){};this.onRemove=function(){}};Mediator=new Class(new Mediator());Mediator.NAME="Mediator";var Proxy=function(proxyName,data){this.Extends=Notifier;this.proxyName=null;this.data=null;this.initialize=function(proxyName,data){this.parent();this.proxyName=proxyName||Proxy.NAME;this.data=data};this.getProxyName=function(){return this.proxyName};this.setData=function(data){this.data=data};this.getData=function(){return this.data};this.onRegister=function(){};this.onRemove=function(){}};Proxy=new Class(new Proxy());Proxy.NAME="Proxy";var Facade=function(){this.view=null;this.model=null;this.controller=null;this.initialize=function(){this.initializeFacade()};this.initializeFacade=function(){this.initializeModel();this.initializeController();this.initializeView()};this.initializeModel=function(){this.model=Model.getInstance()};this.initializeController=function(){this.controller=Controller.getInstance()};this.initializeView=function(){this.view=View.getInstance()};this.registerCommand=function(notificationName,commandClassRef){this.controller.registerCommand(notificationName,commandClassRef)};this.removeCommand=function(notificationName){this.controller.removeCommand(notificationName)};this.hasCommand=function(notificationName){return this.controller.hasCommand(notificationName)};this.registerProxy=function(proxy){this.model.registerProxy(proxy)};this.retrieveProxy=function(proxyName){return this.model.retrieveProxy(proxyName)};this.removeProxy=function(proxyName){this.model.removeProxy(proxyName)};this.hasProxy=function(proxyName){return this.model.hasProxy(proxyName)};this.registerMediator=function(mediator){this.view.registerMediator(mediator)};this.retrieveMediator=function(mediatorName){return this.view.retrieveMediator(mediatorName)};this.removeMediator=function(mediatorName){return this.view.removeMediator(mediatorName)};this.hasMediator=function(mediatorName){return this.view.hasMediator(mediatorName)};this.sendNotification=function(notificationName,body,type){this.notifyObservers(new Notification(notificationName,body,type))};this.notifyObservers=function(notification){this.view.notifyObservers(notification)}};Facade.getInstance=function(){if(Facade.instance==undefined){var classFactory=new Class(new Facade());Facade.instance=new classFactory()}return Facade.instance};var Notification=function(name,body,type){this.name=null;this.body=null;this.type=null;this.initialize=function(name,body,type){this.name=name;this.body=body;this.type=type};this.getName=function(){return this.name};this.setBody=function(body){this.body=body};this.getBody=function(){return this.body};this.setType=function(type){this.type=type};this.getType=function(){return this.type};this.toString=function(){var msg="Notification Name: "+this.getName();msg+="\nBody:"+((this.body==null)?"null":this.body.toString());msg+="\nType:"+((this.type==null)?"null":this.type);return msg}};Notification=new Class(new Notification());var Observer=function(notifyMethod,notifyContext){this.notify=null;this.context=null;this.initialize=function(notifyMethod,notifyContext){this.notify=notifyMethod;this.context=notifyContext};this.setNotifyMethod=function(notifyMethod){this.notify=notifyMethod};this.setNotifyContext=function(notifyContext){this.context=notifyContext};this.getNotifyMethod=function(){return this.notify};this.getNotifyContext=function(){return this.context};this.notifyObserver=function(notification){this.notify.apply(this.context,[notification])};this.compareNotifyContext=function(object){return object===this.context}};Observer=new Class(new Observer());var MacroCommand=function(){this.Extends=Notifier;this.subCommands=[];this.initialize=function(){this.initializeMacroCommand()};this.initializeMacroCommand=function(){};this.addSubCommand=function(commandClassRef){this.subCommands.push(commandClassRef)};this.execute=function(notification){var len=this.subCommands.length;for(var i=0;i<len;i++){var commandClassRef=this.subCommands[i];var commandInstance=new commandClassRef();commandInstance.execute(notification)}}};MacroCommand=new Class(new MacroCommand());var SimpleCommand=function(){this.Extends=Notifier;this.initialize=function(){this.parent()};this.execute=function(notification){}};SimpleCommand=new Class(new SimpleCommand());
