/**
 * The boolean grid filter allows you to create a filter selection that limits results
 * to values matching true or false.  The filter can be set programmatically or via 
 * user input with a configurable {@link Ext.form.field.Radio radio field} in the filter section 
 * of the column header.
 * 
 * Boolean filters use unique radio group IDs, so you may utilize more than one.
 *
 * Example Boolean Filter Usage:
 * 
 *     @example
 *     var shows = Ext.create('Ext.data.Store', {
 *         fields: ['id','show', 'visible'],
 *         data: [
 *             {id: 0, show: 'Battlestar Galactica', visible: true},
 *             {id: 1, show: 'Doctor Who', visible: true},
 *             {id: 2, show: 'Farscape', visible: false},
 *             {id: 3, show: 'Firefly', visible: true},
 *             {id: 4, show: 'Star Trek', visible: true},
 *             {id: 5, show: 'Star Wars: Christmas Special', visible: false}
 *         ]
 *     });
 *   
 *     Ext.create('Ext.grid.Panel', {
 *         renderTo: Ext.getBody(),
 *         title: 'Sci-Fi Television',
 *         height: 250,
 *         width: 375,
 *         store: shows,
 *         plugins: 'gridfilters',
 *         columns: [{
 *             dataIndex: 'id',
 *             text: 'ID',
 *             width: 50
 *         },{
 *             dataIndex: 'show',
 *             text: 'Show',
 *             flex: 1                  
 *         },{
 *             dataIndex: 'visible',
 *             text: 'Visibility',
 *             width: 125,
 *             filter: {
 *                 type: 'boolean',
 *                 value: true,
 *                 yesText: 'True',
 *                 noText: 'False'
 *             }
 *         }]
 *     });  
 */
Ext.define('Ext.grid.filters.filter.Boolean', {
    extend: 'Ext.grid.filters.filter.SingleFilter',
    alias: 'grid.filter.boolean',
 
    type: 'boolean',
 
    operator: '==',
 
    /**
     * @cfg {Boolean} defaultValue 
     * Set this to null if you do not want either option to be checked by default. Defaults to false.
     */
    defaultValue: false,
 
    /**
     * @cfg {String} [yesText]
     * The text to display for `true`.
     * @locale
     */
    yesText: 'Yes',
 
    /**
     * @cfg {String} [noText]
     * The text to display for `false`.
     * @locale
     */
    noText: 'No',
 
    updateBuffer: 0,
 
    constructor: function(config) {
        var me = this,
            filterValue;
 
        me.callParent([config]);
 
        if (me.filter) {
            filterValue = me.filter.getValue();
 
            if (Ext.isEmpty(filterValue, true) && me.defaultValue !== null) {
                me.filter.setValue(!!me.defaultValue);
            }
        }
    },
 
    /**
     * @private
     * Template method that is to initialize the filter and install required menu items.
     */
    createMenu: function (config) {
        var me = this,
            gId = Ext.id(),
            listeners = {
                scope: me,
                click: me.onClick
            },
            itemDefaults = me.getItemDefaults();
 
        me.callParent(arguments);
 
        me.menu.add([Ext.apply({
            text: me.yesText,
            filterKey: 1,
            group: gId,
            checked: !!me.defaultValue,
            hideOnClick: false,
            listeners: listeners
        }, itemDefaults), Ext.apply({
            text: me.noText,
            filterKey: 0,
            group: gId,
            checked: !me.defaultValue && me.defaultValue !== null,
            hideOnClick: false,
            listeners: listeners
        }, itemDefaults)]);
    },
 
    /**
     * @private
     */
    onClick: function (field) {
        this.setValue(!!field.filterKey);
    },
 
    /**
     * @private
     * Template method that is to set the value of the filter.
     * @param {Object} value The value to set the filter.
     */
    setValue: function (value) {
        var me = this;
 
        me.filter.setValue(value);
 
        if (value !== undefined && me.active) {
            me.value = value;
            me.updateStoreFilter();
        } else {
            me.setActive(true);
        }
    },
 
    // This is supposed to be just a stub. 
    activateMenu: Ext.emptyFn
});