var vent = require('vent'); var CommandModel = require('./CommandModel'); var CommandCollection = require('./CommandCollection'); var CommandMessengerCollectionView = require('./CommandMessengerCollectionView'); var _ = require('underscore'); var moment = require('moment'); var Messenger = require('../Shared/Messenger'); require('../jQuery/jquery.spin'); module.exports = (function(){ CommandMessengerCollectionView.render(); var singleton = function(){ return { _lastCommand : {}, Execute : function(name, properties){ var attr = _.extend({name : name.toLocaleLowerCase()}, properties); var commandModel = new CommandModel(attr); if(this._lastCommand.command && this._lastCommand.command.isSameCommand(attr) && moment().add('seconds', -5).isBefore(this._lastCommand.time)) { Messenger.show({ message : 'Please wait at least 5 seconds before running this command again', hideAfter : 5, type : 'error' }); return this._lastCommand.promise; } var promise = commandModel.save().success(function(){ CommandCollection.add(commandModel); }); this._lastCommand = { command : commandModel, promise : promise, time : moment() }; return promise; }, bindToCommand : function(options){ var self = this; var existingCommand = CommandCollection.findCommand(options.command); if(existingCommand) { this._bindToCommandModel.call(this, existingCommand, options); } CommandCollection.bind('add', function(model){ if(model.isSameCommand(options.command)) { self._bindToCommandModel.call(self, model, options); } }); CommandCollection.bind('sync', function(){ var command = CommandCollection.findCommand(options.command); if(command) { self._bindToCommandModel.call(self, command, options); } }); }, _bindToCommandModel : function bindToCommand (model, options){ if(!model.isActive()) { options.element.stopSpin(); return; } model.bind('change:state', function(model){ if(!model.isActive()) { options.element.stopSpin(); if(model.isComplete()) { vent.trigger(vent.Events.CommandComplete, { command : model, model : options.model }); } } }); options.element.startSpin(); } }; }; return singleton(); }).call(this);