/**
 * @file    主要功能
 * @author  clmtulip(车丽美, clmtulip@gmail.com) liyong(liyong1239@163.com)
 */
module.exports = function (require) {
  function ZeroArray(option) {
    this.defaultOption = {
      type: 'RECT'
    };

    this._init(option);
  }

  ZeroArray.prototype = {
    RECT: '_calculateRect',
    _init: function (option) {
      this._initOption(option);

      this._initCanvas();
    },
    _initOption: function (option) {
      for (k in option) {
        this.defaultOption[k] = option[k];
      }
    },
    _initCanvas: function () {
      var canvas = document.createElement("canvas");
      canvas.width = 1;
      canvas.height = 1;
      var ratio = Math.sqrt(canvas.getContext("2d").getImageData(0, 0, 1, 1).data.length >> 2);
      canvas.width = this.defaultOption.width;
      canvas.height = this.defaultOption.height;

      if (canvas.getContext) {
        var ctx = canvas.getContext('2d');
      }

      this.canvas = canvas;
      this.ctx = ctx;
      this.ratio = ratio;
    },

    /**执行计算， 并返回
     *
     * @param callback
     * 返回 {initarr, area, maxHit, maxWit} 给callback
     */
    calculate: function (callback, callbackObj) {
      var calType = this.defaultOption.type,
          calmethod = this[calType];
      this[calmethod].call(this, callback, callbackObj);
    },

    /**
     * callback 函数的 正确执行
     * @param result 计算后的结果，{initarr, area, maxHit, maxWit}
     * @param callback  计算成功之后的回调函数
     * @param callbackObj 回调函数的执行作用域
     * @private
     */
    _calculateReturn: function (result, callback, callbackObj) {
      callback.call(callbackObj, result);
    },
    _calculateRect: function (callback, callbackObj) {
      var result = {},
          width = this.defaultOption.width >> 5 << 5,
          height = this.defaultOption.height; // 初始化数组

      result.initarr = this._rectZeroArray(width * height); // 总面积

      result.area = width * height; // 最大高度

      result.maxHit = height; // 最大宽度

      result.maxWit = width; // 边界

      result.imgboard = this._rectBoard(width, height);

      this._calculateReturn(result, callback, callbackObj);
    },
    _rectBoard: function (width, height) {
      var row = [];

      for (var i = 0; i < height; i++) {
        row.push({
          y: i,
          start: 0,
          end: width
        });
      }

      var cloumn = [];

      for (var i = 0; i < width; i++) {
        cloumn.push({
          x: i,
          start: 0,
          end: height
        });
      }

      return {
        row: row,
        cloumn: cloumn
      };
    },
    _rectZeroArray: function (num) {
      var a = [],
          n = num,
          i = -1;

      while (++i < n) a[i] = 0;

      return a;
    }
  };
  return ZeroArray;
}(require);