    /**
     * Boolean filters use unique radio group IDs (so you can have more than one!)
     * <p><b><u>Example Usage:</u></b></p>
     * <pre><code>
    var filters = Ext.create('Ext.ux.grid.GridFilters', {
        ...
        filters: [{
            // required configs
            type: 'boolean',
            dataIndex: 'visible'

            // optional configs
            defaultValue: null, // leave unselected (false selected by default)
            yesText: 'Yes',     // default
            noText: 'No'        // default
        }]
    });
     * </code></pre>
     */
    Ext.define('Ext.ux.grid.filter.BooleanFilter', {
        extend: 'Ext.ux.grid.filter.Filter',
        alias: 'gridfilter.boolean',

    	/**
    	 * @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
    	 * Defaults to 'Yes'.
    	 */
    	yesText : 'Yes',
    	/**
    	 * @cfg {String} noText
    	 * Defaults to 'No'.
    	 */
    	noText : 'No',

        /**
         * @private
         * Template method that is to initialize the filter and install required menu items.
         */
        init : function (config) {
            var gId = Ext.id();
    		this.options = [
    			Ext.create('Ext.menu.CheckItem', {text: this.yesText, group: gId, checked: this.defaultValue === true}),
    			Ext.create('Ext.menu.CheckItem', {text: this.noText, group: gId, checked: this.defaultValue === false})];

    		this.menu.add(this.options[0], this.options[1]);

    		for(var i=0; i<this.options.length; i++){
    			this.options[i].on('click', this.fireUpdate, this);
    			this.options[i].on('checkchange', this.fireUpdate, this);
    		}
    	},

        /**
         * @private
         * Template method that is to get and return the value of the filter.
         * @return {String} The value of this filter
         */
        getValue : function () {
    		return this.options[0].checked;
    	},

        /**
         * @private
         * Template method that is to set the value of the filter.
         * @param {Object} value The value to set the filter
         */
    	setValue : function (value) {
    		this.options[value ? 0 : 1].setChecked(true);
    	},

        /**
         * @private
         * Template method that is to get and return serialized filter data for
         * transmission to the server.
         * @return {Object/Array} An object or collection of objects containing
         * key value pairs representing the current configuration of the filter.
         */
        getSerialArgs : function () {
    		var args = {type: 'boolean', value: this.getValue()};
    		return args;
    	},

        /**
         * Template method that is to validate the provided Ext.data.Record
         * against the filters configuration.
         * @param {Ext.data.Record} record The record to validate
         * @return {Boolean} true if the record is valid within the bounds
         * of the filter, false otherwise.
         */
        validateRecord : function (record) {
    		return record.get(this.dataIndex) == this.getValue();
    	}
    });