/**
 * This filter type will provide a combobox with a store. The options available in the store
 * can be configured.
 *
 * If no options are provided then they are extracted from the grid store
 */
Ext.define('Ext.grid.plugin.filterbar.filters.List', {
    extend: 'Ext.grid.plugin.filterbar.filters.SingleFilter',
    alias: 'grid.filterbar.list',
 
    requires: [
        'Ext.field.ComboBox'
    ],
 
    config: {
        /**
         * @cfg {String[]/Ext.data.Store} options
         *
         * An array of values or a store configuration
         */
        options: null
    },
 
    type: 'list',
 
    operator: '==',
    operators: ['==', '!='],
 
    fieldDefaults: {
        xtype: 'combobox',
        queryMode: 'local',
        forceSelection: true,
        clearable: true,
        editable: true,
        matchFieldWidth: false,
        valueField: 'value',
        displayField: 'text'
    },
 
    constructor: function(config) {
        var me = this,
            options;
 
        me.callParent([config]);
 
        options = me.getOptions();
 
        if (!options) {
            me.monitorStore(me.getGridStore());
        }
    },
 
    destroy: function() {
        Ext.destroy(this.storeListeners);
 
        this.callParent();
    },
 
    monitorStore: function(store) {
        var me = this;
 
        Ext.destroy(me.storeListeners);
        me.storeListeners = store.on({
            add: 'resetFieldStore',
            remove: 'resetFieldStore',
            load: 'resetFieldStore',
            scope: me,
            destroyable: true
        });
    },
 
    getFieldConfig: function() {
        var config = this.callParent();
 
        config.store = this.createOptionsStore();
 
        return config;
    },
 
    createOptionsStore: function() {
        var me = this,
            options = me.getOptions(),
            store = me.getGridStore(),
            list, len, i;
 
        if (!options) {
            // no options provided so we need to extract them from the grid store
            list = Ext.Array.sort(store.collect(me.getDataIndex(), false, true));
            len = list.length;
            options = [];
 
            for (= 0; i < len; i++) {
                options.push({
                    value: list[i],
                    text: list[i]
                });
            }
 
            options = {
                type: 'store',
                fields: [
                    { name: 'value', type: 'auto' },
                    { name: 'text', type: 'auto' }
                ],
                data: options
            };
        }
 
        return options;
    },
 
    resetFieldStore: function() {
        var me = this,
            field = me.getField();
 
        if (field) {
            field.setStore(me.createOptionsStore());
 
            if (me.active) {
                field.suspendEvents();
                field.setValue(me.filter.getValue());
                field.resumeEvents(true);
            }
        }
    }
 
});