Ext.onReady(function(){
   
Ext.QuickTips.init();

   
function formatDate(value){
       
return value ? value.dateFormat('M d, Y') : '';
   
}
   
// shorthand alias
   
var fm = Ext.form;

   
// custom column plugin example
   
var checkColumn = new Ext.grid.CheckColumn({
       header
: 'Indoor?',
       dataIndex
: 'indoor',
       width
: 55
   
});

   
// the column model has information about grid columns
   
// dataIndex maps the column to the specific data field in
   
// the data store (created below)
   
var cm = new Ext.grid.ColumnModel([{
           id
: 'common',
           header
: 'Common Name',
           dataIndex
: 'common',
           width
: 220,
           
// use shorthand alias defined above
           editor
: new fm.TextField({
               allowBlank
: false
           
})
       
},{
           header
: 'Light',
           dataIndex
: 'light',
           width
: 130,
           editor
: new fm.ComboBox({
               typeAhead
: true,
               triggerAction
: 'all',
               transform
:'light',
               lazyRender
: true,
               listClass
: 'x-combo-list-small'
           
})
       
},{
           header
: 'Price',
           dataIndex
: 'price',
           width
: 70,
           align
: 'right',
           renderer
: 'usMoney',
           editor
: new fm.NumberField({
               allowBlank
: false,
               allowNegative
: false,
               maxValue
: 100000
           
})
       
},{
           header
: 'Available',
           dataIndex
: 'availDate',
           width
: 95,
           renderer
: formatDate,
           editor
: new fm.DateField({
                format
: 'm/d/y',
                minValue
: '01/01/06',
                disabledDays
: [0, 6],
                disabledDaysText
: 'Plants are not available on the weekends'
           
})
       
},
        checkColumn
   
]);

   
// by default columns are sortable
    cm
.defaultSortable = true;

   
// create the Data Store
   
var store = new Ext.data.Store({
       
// load remote data using HTTP
        url
: 'plants.xml',

       
// specify a XmlReader (coincides with the XML format of the returned data)
        reader
: new Ext.data.XmlReader(
           
{
               
// records will have a 'plant' tag
                record
: 'plant'
           
},
           
// use an Array of field definition objects to implicitly create a Record constructor
           
[
               
// the 'name' below matches the tag name to read, except 'availDate'
               
// which is mapped to the tag 'availability'
               
{name: 'common', type: 'string'},
               
{name: 'botanical', type: 'string'},
               
{name: 'light'},
               
{name: 'price', type: 'float'},            
               
// dates can be automatically converted by specifying dateFormat
               
{name: 'availDate', mapping: 'availability', type: 'date', dateFormat: 'm/d/Y'},
               
{name: 'indoor', type: 'bool'}
           
]
       
),

        sortInfo
: {field:'common', direction:'ASC'}
   
});

   
// create the editor grid
   
var grid = new Ext.grid.EditorGridPanel({
        store
: store,
        cm
: cm,
        renderTo
: 'editor-grid',
        width
: 600,
        height
: 300,
        autoExpandColumn
: 'common',
        title
: 'Edit Plants?',
        frame
: true,
        plugins
: checkColumn,
        clicksToEdit
: 1,
        tbar
: [{
            text
: 'Add Plant',
            handler
: function(){
               
// access the Record constructor through the grid's store
               
var Plant = grid.getStore().recordType;
               
var p = new Plant({
                    common
: 'New Plant 1',
                    light
: 'Mostly Shade',
                    price
: 0,
                    availDate
: (new Date()).clearTime(),
                    indoor
: false
               
});
                grid
.stopEditing();
                store
.insert(0, p);
                grid
.startEditing(0, 0);
           
}
       
}]
   
});

   
// trigger the data store load
    store
.load();
});