text: 
  
  /**
  
   * @file Data zoom model
  
   */
  
  define(function(require) {
  
  
  
      var VisualMapModel = require('./VisualMapModel');
  
      var zrUtil = require('zrender/core/util');
  
      var numberUtil = require('../../util/number');
  
  
  
      // Constant
  
      var DEFAULT_BAR_BOUND = [20, 140];
  
  
  
      var ContinuousModel = VisualMapModel.extend({
  
  
  
          type: 'visualMap.continuous',
  
  
  
          /**
  
           * @protected
  
           */
  
          defaultOption: {
  
              align: 'auto',     // 'auto', 'left', 'right', 'top', 'bottom'
  
              calculable: false,         // 是否值域漫游，启用后无视splitNumber和pieces，线性渐变
  
              range: [-Infinity, Infinity], // 当前选中范围
  
              hoverLink: true,
  
              realtime: true,
  
              itemWidth: null,            // 值域图形宽度
  
              itemHeight: null            // 值域图形高度
  
          },
  
  
  
          /**
  
           * @override
  
           */
  
          doMergeOption: function (newOption, isInit) {
  
              ContinuousModel.superApply(this, 'doMergeOption', arguments);
  
  
  
              this.resetTargetSeries(newOption, isInit);
  
              this.resetExtent();
  
  
  
              this.resetVisual(function (mappingOption) {
  
                  mappingOption.mappingMethod = 'linear';
  
              });
  
  
  
              this._resetRange();
  
          },
  
  
  
          /**
  
           * @protected
  
           * @override
  
           */
  
          resetItemSize: function () {
  
              VisualMapModel.prototype.resetItemSize.apply(this, arguments);
  
  
  
              var itemSize = this.itemSize;
  
  
  
              this._orient === 'horizontal' && itemSize.reverse();
  
  
  
              (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]);
  
              (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]);
  
          },
  
  
  
          /**
  
           * @private
  
           */
  
          _resetRange: function () {
  
              var dataExtent = this.getExtent();
  
              var range = this.option.range;
  
              if (range[0] > range[1]) {
  
                  range.reverse();
  
              }
  
              range[0] = Math.max(range[0], dataExtent[0]);
  
              range[1] = Math.min(range[1], dataExtent[1]);
  
          },
  
  
  
          /**
  
           * @protected
  
           * @override
  
           */
  
          completeVisualOption: function () {
  
              VisualMapModel.prototype.completeVisualOption.apply(this, arguments);
  
  
  
              zrUtil.each(this.stateList, function (state) {
  
                  var symbolSize = this.option.controller[state].symbolSize;
  
                  if (symbolSize && symbolSize[0] !== symbolSize[1]) {
  
                      symbolSize[0] = 0; // For good looking.
  
                  }
  
              }, this);
  
          },
  
  
  
          /**
  
           * @public
  
           * @override
  
           */
  
          setSelected: function (selected) {
  
              this.option.range = selected.slice();
  
              this._resetRange();
  
          },
  
  
  
          /**
  
           * @public
  
           */
  
          getSelected: function () {
  
              var dataExtent = this.getExtent();
  
  
  
              var dataInterval = numberUtil.asc(
  
                  (this.get('range') || []).slice()
  
              );
  
  
  
              // Clamp
  
              dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]);
  
              dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]);
  
              dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]);
  
              dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]);
  
  
  
              return dataInterval;
  
          },
  
  
  
          /**
  
           * @public
  
           * @override
  
           */
  
          getValueState: function (value) {
  
              var range = this.option.range;
  
              var dataExtent = this.getExtent();
  
  
  
              // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'.
  
              // range[1] is processed likewise.
  
              return (
  
                  (range[0] <= dataExtent[0] || range[0] <= value)
  
                  && (range[1] >= dataExtent[1] || value <= range[1])
  
              ) ? 'inRange' : 'outOfRange';
  
          }
  
  
  
      });
  
  
  
      return ContinuousModel;
  
  
  
  });