/**
 * @class Ext.pivot.matrix.Base
 * @extend Ext.util.Observable
 * @alias pivotmatrix.base
 *
 * Base implementation of a pivot matrix.
 *
 * This class contains basic methods that are used to generate the pivot data. It
 * needs to be extended by other classes to properly generate the results.
 */
 
/**
 * @event cleardata
 * Fires before the generated data is destroyed.
 * The components that uses the matrix should unbind this pivot store before is destroyed.
 * The grid panel will trow errors if the store is destroyed and the grid is refreshed.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 */
 
/**
 * @event beforereconfigure
 * Fires before the matrix is reconfigured.
 *
 * Return false to stop reconfiguring the matrix.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 * @param {Object} config Object used to reconfigure the matrix
 */
 
/**
 * @event reconfigure
 * Fires when the matrix is reconfigured.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 * @param {Object} config Object used to reconfigure the matrix
 */
 
/**
 * @event start
 * Fires when the matrix starts processing the records.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 */
 
/**
 * @event progress
 * Fires during records processing.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 * @param {Integer} index Current index of record that is processed
 * @param {Integer} total Total number of records to process
 */
 
/**
 * @event done
 * Fires when the matrix finished processing the records
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 */
 
/**
 * @event modelbuilt
 * Fires after the matrix built the store model.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 * @param {Ext.data.Model} model The built model
 */
 
/**
 * @event columnsbuilt
 * Fires after the matrix built the columns.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 * @param {Array} columns The built columns
 */
 
/**
 * @event recordbuilt
 * Fires after the matrix built a pivot store record.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 * @param {Ext.data.Model} record The built record
 * @param {Ext.pivot.axis.Item} item The left axis item the record was built for
 */
 
/**
 * @event buildtotals
 * Fires before grand total records are created in the pivot store.
 * Push additional objects to the array if you need to create additional grand totals.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 * @param {Array} totals Array of objects that will be used to create grand total records in the pivot store. Each object should have:
 * @param {String} totals.title Name your grand total
 * @param {Object} totals.values Values used to generate the pivot store record
 */
 
/**
 * @event storebuilt
 * Fires after the matrix built the pivot store.
 *
 * @param {Ext.pivot.matrix.Base} matrix Reference to the Matrix object
 * @param {Ext.data.Store} store The built store
 */
 
/**
 * @cfg {String} [type=abstract]
 *
 * Used when you define a filter on a dimension to set what kind of filter is to be
 * instantiated.
 */
 
/**
 * @cfg {String} [resultType='base']
 *
 * Define the type of Result this class uses. Specify here the pivotresult alias.
 */
 
/**
 * @cfg {String} [leftAxisType='base']
 *
 * Define the type of left Axis this class uses. Specify here the pivotaxis alias.
 */
 
/**
 * @cfg {String} [topAxisType='base']
 *
 * Define the type of top Axis this class uses. Specify here the pivotaxis alias.
 */
 
/**
 * @cfg {String} [textRowLabels='Row Labels']
 *
 * In compact layout only one column is generated for the left axis dimensions.
 * This is value of that column header.
 */
 
/**
 * @cfg {String} [textTotalTpl='Total {{name}}']
 * Configure the template for the group total. (i.e. '{name} ({rows.length} items)')
 * @cfg {String}           textTotalTpl.groupField         The field name being grouped by.
 * @cfg {String}           textTotalTpl.name               Group name
 * @cfg {Ext.data.Model[]} textTotalTpl.rows               An array containing the child records for the group being rendered.
 */
 
/**
 * @cfg {String} [textGrandTotalTpl='Grand total']
 * Configure the template for the grand total.
 */
 
/**
 * @cfg {String} [keysSeparator='#_#']
 *
 * An axis item has a key that is a combination of all its parents keys. This is the keys separator.
 *
 * Do not use regexp special chars for this.
 */
 
/**
 * @cfg {String} [grandTotalKey='grandtotal']
 *
 * Generic key used by the grand total records.
 */
 
/**
 * @cfg {String} [compactViewKey='_compactview_']
 *
 * In compact view layout mode the matrix generates only one column for all left axis dimensions.
 * This is the 'dataIndex' field name on the pivot store model.
 */
 
/**
 * @cfg {Number} [compactViewColumnWidth=200]
 *
 * In compact view layout mode the matrix generates only one column for all left axis dimensions.
 * This is the width of that column.
 */
 
/**
 * @cfg {String} [viewLayoutType='outline']
 * Type of layout used to display the pivot data.
 * Possible values: outline, compact, tabular
 */
 
/**
 * @cfg {String} [rowSubTotalsPosition='first']
 * Possible values: `first`, `none`, `last`
 */
 
/**
 * @cfg {String} [rowGrandTotalsPosition='last']
 * Possible values: `first`, `none`, `last`
 */
 
/**
 * @cfg {String} [colSubTotalsPosition='last']
 * Possible values: `first`, `none`, `last`
 */
 
/**
 * @cfg {String} [colGrandTotalsPosition='last']
 * Possible values: `first`, `none`, `last`
 */
 
/**
 * @cfg {Boolean} [showZeroAsBlank=false]
 * Should 0 values be displayed as blank?
 */
 
/**
 * @cfg {Ext.pivot.axis.Base} [leftAxis=null]
 *
 * Left axis object stores all generated groups for the left axis dimensions
 */
 
/**
 * @cfg {Ext.pivot.axis.Base} [topAxis=null]
 *
 * Top axis object stores all generated groups for the top axis dimensions
 */
 
/**
 * @cfg {Ext.pivot.MixedCollection} [aggregate=null]
 *
 * Collection of configured aggregate dimensions
 */
 
/**
 * @property {Ext.pivot.result.Collection} [results=null]
 * @readonly
 *
 * Stores the calculated results
 */
 
/**
 * @property {Ext.data.ArrayStore} [pivotStore=null]
 * @readonly
 *
 * The generated pivot store
 *
 * @private
 */
 
/**
 * @property {Boolean} [isDestroyed=false]
 * @readonly
 *
 * This property is set to true when the matrix object is destroyed.
 * This is useful to check when functions are deferred.
 */
 
/**
 * @cfg {Ext.Component} [cmp=null] (required)
 *
 * Reference to the pivot component that monitors this matrix.
 */
 
/**
 * @cfg {Boolean} [useNaturalSorting=false]
 *
 * Set to true if you want to use natural sorting algorithm when sorting dimensions.
 *
 * For performance reasons this is turned off by default.
 */
 
/**
 * @cfg {Boolean} [collapsibleRows=true]
 *
 * Set to false if you want row groups to always be expanded and the buttons that
 * expand/collapse groups to be hidden in the UI.
 */
 
/**
 * @cfg {Boolean} [collapsibleColumns=true]
 *
 * Set to false if you want column groups to always be expanded and the buttons that
 * expand/collapse groups to be hidden in the UI.
 */
 
/**
 * @method getColumns
 * Returns the generated model fields
 *
 * @returns {Object[]} Array of config objects used to build the pivot store model fields
 */
 
/**
 * @method getColumnHeaders
 * Returns all generated column headers
 *
 * @returns {Object[]} Array of config objects used to build the pivot grid columns
 */