//================== MODELS ===================== var OAAS_MODEL = (function (my, Backbone) { Backbone.Relational.store.addModelScope(my); my.ControllerModel = Backbone.Model.extend({ defaults: { selectedNode: null } }); my.Experiment = Backbone.RelationalModel.extend({ url: function () { return '/Experiment/Experiment?nodeId=' + this.get('nodeId'); }, isNew: function () { return false; }, defaults: { title: 'My Experiment', isExperiment: true, run: false, nodeId: null, repititions: 1, group: 'TESTAZURE' }, relations: [{ key: 'experiment', relatedModel: 'ExperimentNode' }] }); my.ExperimentNode = Backbone.RelationalModel.extend({ defaults: { title: 'Experiment', key: -1, data: {}, parent: null, isExperiment: false, nodeId: null }, relations: [{ type: Backbone.HasMany, key: 'children', relatedModel: 'ExperimentNode', collectionType: 'AlgorithmList', reverseRelation: { key: 'parent' } }], url: function () { return this.get('isExperiment') ? '/Experiment/Experiment?nodeId=' + this.get('nodeId') : '/Experiment/Scenario?nodeId=' + this.get('nodeId'); }, initialize: function (spec) { if (typeof spec.key === 'undefined' || spec.key == -1) { spec.key = my.ExperimentNode.globalKeyCount; this.set({ key: spec.key }); my.ExperimentNode.globalKeyCount++; } else if (spec.key >= my.ExperimentNode.globalKeyCount) my.ExperimentNode.globalKeyCount = spec.key + 1; my.ExperimentNode.globalNodeMap[spec.key] = this; }, // adds a new experimentNode to this node addNode: function (experimentNode) { if (!(experimentNode instanceof my.ExperimentNode)) { experimentNode = new my.ExperimentNode(experimentNode); } this.get('children').add(experimentNode); experimentNode.set({ parent: this }); this.trigger('node-added', experimentNode); return experimentNode; }, // moves an experimentNode into this node moveNode: function (experimentNode) { var parent = experimentNode.get('parent'); if (parent != null) { // remove from parent parent.get('children').remove(experimentNode); } this.addNode(experimentNode); }, // delete this node remove: function () { var parent = this.get('parent'); if (parent != null) { parent.get('children').remove(this); this.set({ parent: null }); // simply replace it with 'undefined' delete my.ExperimentNode.globalNodeMap[this.get('key')]; } }, lookup: function (key) { return my.ExperimentNode.globalNodeMap[key]; } }, { globalKeyCount: 0, globalNodeMap: {}, lookup: function (key) { return my.ExperimentNode.globalNodeMap[key]; }, nextGlobalKey: function () { var key = my.ExperimentNode.globalKeyCount; my.ExperimentNode.globalKeyCount++; return key; } } ); my.ExperimentList = Backbone.Collection.extend({ url: function () { return "/Experiment/ExperimentList"; }, model: my.Experiment }); my.AlgorithmList = Backbone.Collection.extend({ url: function () { return "/Experiment/AlgorithmList"; }, model: my.ExperimentNode }); my.ScenarioList = Backbone.Collection.extend({ url: function () { return "/Experiment/ScenarioList"; }, model: my.ExperimentNode }); return my; } (OAAS_MODEL || {}, Backbone));