text: /**
   * echarts组件： 网格
   *
   * @desc echarts基于Canvas，纯Javascript图表库，提供直观，生动，可交互，可个性化定制的数据统计图表。
   * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
   *
   */
  define(function (require) {
      var Base = require('./base');
      
      // 图形依赖
      var RectangleShape = require('../zrender/shape/Rectangle');
      
      var ecConfig = require('../config');
      // 网格
      ecConfig.grid = {
          zlevel: 0,                  // 一级层叠
          z: 0,                       // 二级层叠
          x: 80,
          y: 60,
          x2: 80,
          y2: 60,
          // width: {totalWidth} - x - x2,
          // height: {totalHeight} - y - y2,
          backgroundColor: 'rgba(0,0,0,0)',
          borderWidth: 1,
          borderColor: '#ccc'
      };
  
      var zrUtil = require('../zrender/tool/util');
  
      /**
       * 构造函数
       * @param {Object} messageCenter echart消息中心
       * @param {ZRender} zr zrender实例
       * @param {Object} option 图表选项
       *      @param {number=} option.grid.x 直角坐标系内绘图网格起始横坐标，数值单位px
       *      @param {number=} option.grid.y 直角坐标系内绘图网格起始纵坐标，数值单位px
       *      @param {number=} option.grid.width 直角坐标系内绘图网格宽度，数值单位px
       *      @param {number=} option.grid.height 直角坐标系内绘图网格高度，数值单位px
       */
      function Grid(ecTheme, messageCenter, zr, option, myChart) {
          Base.call(this, ecTheme, messageCenter, zr, option, myChart);
  
          this.refresh(option);
      }
      
      Grid.prototype = {
          type: ecConfig.COMPONENT_TYPE_GRID,
  
          getX: function () {
              return this._x;
          },
  
          getY: function () {
              return this._y;
          },
  
          getWidth: function () {
              return this._width;
          },
  
          getHeight: function () {
              return this._height;
          },
  
          getXend: function () {
              return this._x + this._width;
          },
  
          getYend: function () {
              return this._y + this._height;
          },
  
          getArea: function () {
              return {
                  x: this._x,
                  y: this._y,
                  width: this._width,
                  height: this._height
              };
          },
          
          getBbox: function() {
              return [
                  [ this._x, this._y ],
                  [ this.getXend(), this.getYend() ]
              ];
          },
          
          /**
           * 实在找不到合适的地方做了，各种粗暴的写法~ -_-
           */
          refixAxisShape: function(component) {
              var zeroX;
              var zeroY;
              var axisList = component.xAxis._axisList.concat(
                  component.yAxis ? component.yAxis._axisList : []
              );
              var len = axisList.length;
              var axis;
              while (len--) {
                  axis = axisList[len];
                  if (axis.type == ecConfig.COMPONENT_TYPE_AXIS_VALUE 
                      && axis._min < 0  
                      && axis._max >= 0
                  ) {
                      axis.isHorizontal()
                      ? (zeroX = axis.getCoord(0))
                      : (zeroY = axis.getCoord(0));
                  }
              }
              if (typeof zeroX != 'undefined' || typeof zeroY != 'undefined') {
                  len = axisList.length;
                  while (len--) {
                      axisList[len].refixAxisShape(zeroX, zeroY);
                  }
              }
          },
          
          refresh: function (newOption) {
              if (newOption
                  || this._zrWidth != this.zr.getWidth() 
                  || this._zrHeight != this.zr.getHeight()
              ) {
                  this.clear();
                  this.option = newOption || this.option;
                  this.option.grid = this.reformOption(this.option.grid);
      
                  var gridOption = this.option.grid;
                  this._zrWidth = this.zr.getWidth();
                  this._zrHeight = this.zr.getHeight();
                  this._x = this.parsePercent(gridOption.x, this._zrWidth);
                  this._y = this.parsePercent(gridOption.y, this._zrHeight);
                  var x2 = this.parsePercent(gridOption.x2, this._zrWidth);
                  var y2 = this.parsePercent(gridOption.y2, this._zrHeight);
                  
      
                  if (typeof gridOption.width == 'undefined') {
                      this._width = this._zrWidth - this._x - x2;
                  }
                  else {
                      this._width = this.parsePercent(gridOption.width, this._zrWidth);
                  }
                  this._width = this._width <= 0 ? 10 : this._width;
      
                  if (typeof gridOption.height == 'undefined') {
                      this._height = this._zrHeight - this._y - y2;
                  }
                  else {
                      this._height = this.parsePercent(gridOption.height, this._zrHeight);
                  }
                  this._height = this._height <= 0 ? 10 : this._height;
                  
                  this._x = this.subPixelOptimize(this._x, gridOption.borderWidth);
                  this._y = this.subPixelOptimize(this._y, gridOption.borderWidth);
      
                  this.shapeList.push(new RectangleShape({
                      zlevel: this.getZlevelBase(),
                      z: this.getZBase(),
                      hoverable: false,
                      style: {
                          x: this._x,
                          y: this._y,
                          width: this._width,
                          height: this._height,
                          brushType: gridOption.borderWidth > 0 ? 'both' : 'fill',
                          color: gridOption.backgroundColor,
                          strokeColor: gridOption.borderColor,
                          lineWidth: gridOption.borderWidth
                          // type: this.option.splitArea.areaStyle.type,
                      }
                  }));
                  this.zr.addShape(this.shapeList[0]);
              }
          }
      };
      
      zrUtil.inherits(Grid, Base);
      
      require('../component').define('grid', Grid);
      
      return Grid;
  });