text: /**
   * echarts组件基类
   *
   * @desc echarts基于Canvas，纯Javascript图表库，提供直观，生动，可交互，可个性化定制的数据统计图表。
   * @author Kener (@Kener-林峰, linzhifeng@baidu.com)
   *
   */
  define(function(require) {
      function Base(zr, option){
          var ecData = require('../util/ecData');
          var accMath = require('../util/accMath');
  
          var zrUtil = require('zrender/tool/util');
          var self = this;
  
          self.selectedMap = {};
  
          self.shapeHandler = {
              onclick : function() {
                  self.isClick = true;
              },
              ondragover : function (param) {
                  // 返回触发可计算特性的图形提示
                  var calculableShape = zrUtil.clone(param.target);
                  calculableShape.highlightStyle = {
                      text : '',
                      r : calculableShape.style.r + 5,
                      brushType : 'stroke',
                      strokeColor : self.zr.getCalculableColor(),
                      lineWidth : (calculableShape.style.lineWidth || 1) + 12
                  };
                  self.zr.addHoverShape(calculableShape);
              },
  
              ondrop : function (param) {
                  // 排除一些非数据的拖拽进入
                  if (typeof ecData.get(param.dragged, 'data') != 'undefined') {
                      self.isDrop = true;
                  }
              },
  
              ondragend : function () {
                  self.isDragend = true;
              }
          };
  
          function setCalculable(shape) {
              shape.ondragover = self.shapeHandler.ondragover;
              shape.ondragend = self.shapeHandler.ondragend;
              shape.ondrop = self.shapeHandler.ondrop;
              return shape;
          }
  
          /**
           * 数据项被拖拽进来
           */
          function ondrop(param, status) {
              if (!self.isDrop || !param.target) {
                  // 没有在当前实例上发生拖拽行为则直接返回
                  return;
              }
  
              var target = param.target;      // 拖拽安放目标
              var dragged = param.dragged;    // 当前被拖拽的图形对象
  
              var seriesIndex = ecData.get(target, 'seriesIndex');
              var dataIndex = ecData.get(target, 'dataIndex');
  
              // 落到数据item上，数据被拖拽到某个数据项上，数据修改
              var data = option.series[seriesIndex].data[dataIndex] || '-';
              if (data.value) {
                  if (data.value != '-') {
                      option.series[seriesIndex].data[dataIndex].value = 
                          accMath.accAdd(
                              option.series[seriesIndex].data[dataIndex].value,
                              ecData.get(dragged, 'value')
                          );
                  }
                  else {
                      option.series[seriesIndex].data[dataIndex].value =
                          ecData.get(dragged, 'value');
                  }
              }
              else {
                  if (data != '-') {
                      option.series[seriesIndex].data[dataIndex] = 
                          accMath.accAdd(
                              option.series[seriesIndex].data[dataIndex],
                              ecData.get(dragged, 'value')
                          );
                  }
                  else {
                      option.series[seriesIndex].data[dataIndex] =
                          ecData.get(dragged, 'value');
                  }
              }
  
              // 别status = {}赋值啊！！
              status.dragIn = status.dragIn || true;
  
              // 处理完拖拽事件后复位
              self.isDrop = false;
  
              return;
          }
  
          /**
           * 数据项被拖拽出去
           */
          function ondragend(param, status) {
              if (!self.isDragend || !param.target) {
                  // 没有在当前实例上发生拖拽行为则直接返回
                  return;
              }
              var target = param.target;      // 被拖拽图形元素
  
              var seriesIndex = ecData.get(target, 'seriesIndex');
              var dataIndex = ecData.get(target, 'dataIndex');
  
              // 被拖拽的图形是折线图bar，删除被拖拽走的数据
              option.series[seriesIndex].data[dataIndex] = '-';
  
              // 别status = {}赋值啊！！
              status.dragOut = true;
              status.needRefresh = true;
  
              // 处理完拖拽事件后复位
              self.isDragend = false;
  
              return;
          }
  
          /**
           * 图例选择
           */
          function onlegendSelected(param, status) {
              var legendSelected = param.selected;
              for (var itemName in self.selectedMap) {
                  if (self.selectedMap[itemName] != legendSelected[itemName]) {
                      // 有一项不一致都需要重绘
                      status.needRefresh = true;
                      return;
                  }
              }
          }
  
          /**
           * 基类方法
           */
          self.setCalculable = setCalculable;
          self.ondrop = ondrop;
          self.ondragend = ondragend;
          self.onlegendSelected = onlegendSelected;
      }
  
      return Base;
  });
  