RowColMap = function() {
    this.rcMap = [];
    this.merges = [];

    this.isIgnore = function(ir, ic) {
      var _ignore = RowColMap.prototype.TYPE.IGNORE;
      return this.getRowColMapProp(ir, ic, _ignore);
    };
    this.isEmpty = function(ir, ic) {
      var _empty = RowColMap.prototype.TYPE.EMPTY;
      return this.getRowColMapProp(ir, ic, _empty);
    };
    this.isRowSpan = function(ir) {
      var _rowspan = RowColMap.prototype.TYPE.ROWSPAN;
      return this.getRowColMapProp(ir, undefined, _rowspan);
    };
    this.isColSpan = function(ir) {
      var _colspan = RowColMap.prototype.TYPE.COLSPAN;
      return this.getRowColMapProp(ir, undefined, _colspan);
    };
    this.isSpan = function(ir) {
      return this.isRowSpan(ir) || this.isColSpan(ir);
    };
    this.isMerge = function(ir) {
      return this.merges.length > 0;
    };
    this.addMerge = function(ir, mergeObj) {
      var _merge = RowColMap.prototype.TYPE.MERGE;
      this.merges.push(mergeObj);
      this.setRowColMapProp(ir, undefined, _merge, this.merges);
    };
    this.getRowColMapProp = function(ir, ic, key) {
      if (this.rcMap[ir]) {
        if (typeof key === "undefined") {
          return this.rcMap[ir][ic];
        } else if (typeof ic === "undefined") {
          return this.rcMap[ir][key];
        } else if (this.rcMap[ir][ic]) {
          return this.rcMap[ir][ic][key];
        }
      }
      return undefined;
    };
    this.setRowColMapProp = function(ir, ic, key, value) {
      this.rcMap[ir] = this.rcMap[ir] || [];
      if (typeof key === "undefined") {
        return (this.rcMap[ir][ic] = value);
      } else if (typeof ic === "undefined") {
        return (this.rcMap[ir][key] = value);
      } else {
        this.rcMap[ir][ic] = this.rcMap[ir][ic] || [];
        return (this.rcMap[ir][ic][key] = value);
      }
    };
    this.generateTotal = function(ir, ic) {
      var VALUE = RowColMap.prototype.TYPE.VALUE;
      var _total = 0;

      if (this.isRowSpan(ir) && this.isColSpan(ir)) {
        _total = this.getRowColMapProp(ir, ic, VALUE) || 0;
      } else if (this.getRowColMapProp(ir, ic, VALUE)) {
        _total = this.getRowColMapProp(ir, ic, VALUE);
      }
      return _total;
    };
    this.convertSpanToArray = function(ir, ic, key, _return, colDel) {
      if (this.rcMap[ir] && this.isSpan(ir)) {
        var total = this.generateTotal(ir, ic);

        if (_isEnhanced(key)) {
          return new Array(total).concat(_return);
        } else {
          return new Array(total).concat(_return).join(colDel);
        }
      }
      return _return;
    };
    this.handleRowColMapProp = function(type, ir, ic, key, _return, colDel) {
      switch (type) {
        case RowColMap.prototype.TYPE.IGNORE:
          return;
        case RowColMap.prototype.TYPE.EMPTY:
          return " ";
        case RowColMap.prototype.TYPE.DEFAULT:
        default:
          return this.convertSpanToArray(ir, ic, key, _return, colDel);
      }
    };
  }
RowColMap main interface constructor
@memberof TableExport.prototype
@constructor