1 define([
  2     'jquery',
  3     'underscore',
  4     'viewcontroller'
  5 ], function($, _, ViewControllers) {
  6   var ScalarViewControllerABC = ViewControllers.ScalarViewControllerABC;
  7 
  8   /**
  9    * @class ScaleViewController
 10    *
 11    * Alters the scale of points displayed on the screen.
 12    *
 13    * @param {UIState} uiState The shared state
 14    * @param {Node} container Container node to create the controller in.
 15    * @param {Object} decompViewDict This object is keyed by unique
 16    * identifiers and the values are DecompositionView objects referring to a
 17    * set of objects presented on screen. This dictionary will usually be shared
 18    * by all the tabs in the application. This argument is passed by reference.
 19    * Note that only the decompositions of type 'scatter' will be controlled,
 20    * other types will be ignored.
 21    *
 22    * @return {ScaleViewController}
 23    * @constructs ScaleViewController
 24    * @extends ScalarViewControllerABC
 25    *
 26    **/
 27   function ScaleViewController(uiState, container, decompViewDict) {
 28     var helpmenu = 'Change the size of the attributes on the plot, allowing ' +
 29                    'highlighting of points using size.';
 30     var title = 'Scale';
 31 
 32     // shapes are only supported for scatter types
 33     var scalable = {};
 34     for (var key in decompViewDict) {
 35       if (decompViewDict[key].decomp.isScatterType()) {
 36         scalable[key] = decompViewDict[key];
 37       }
 38     }
 39 
 40     ScalarViewControllerABC.call(this, uiState, container, title, helpmenu,
 41                                  0, 5, 0.1, scalable);
 42     return this;
 43   }
 44   ScaleViewController.prototype = Object.create(
 45     ScalarViewControllerABC.prototype);
 46   ScaleViewController.prototype.constructor = ScalarViewControllerABC;
 47 
 48   /**
 49    * Helper function to set the scale of plottable
 50    *
 51    * @param {Object} scope The scope where the plottables exist
 52    * @param {Boolean} scale New scaling factor of the plottables
 53    * (1.0 being standard scale)
 54    * @param {Object[]} group list of mesh objects that should be changed
 55    * in scope
 56    *
 57    */
 58   ScaleViewController.prototype.setPlottableAttributes = function(scope, scale,
 59                                                                   group) {
 60     scope.setScale(scale, group);
 61   };
 62 
 63   /**
 64    *
 65    * Modify the scale of all the markers in the current view
 66    *
 67    * @param {float} value The new opacity of the lements in the current view.
 68    * Should be a value between 0.1 and 5 (inclusive).
 69    *
 70    * @extends ScalarViewControllerABC
 71    *
 72    */
 73   ScaleViewController.prototype.setAllPlottableAttributes = function(value) {
 74     this.getView().setScale(value);
 75   };
 76 
 77   /**
 78    *
 79    * Scaling function to use when sample scaling is based on a metadata
 80    * category.
 81    *
 82    * @param {float} val The metadata value for the current sample.
 83    * @param {float} min The minimum metadata value in the dataset.
 84    * @param {float} range The span of the metadata values.
 85    *
 86    * @return {float} Scale value for a given sample.
 87    *
 88    */
 89   ScaleViewController.prototype.scaleValue = function(val, min, range) {
 90     return Math.round((1 + (val - min) * 4 / range) * 10000) / 10000;
 91   };
 92 
 93   return ScaleViewController;
 94 });
 95