    /**
     * @class Ext.ensible.cal.EventContextMenu
     * @extends Ext.menu.Menu
     * The context menu displayed for calendar events in any {@link Ext.ensible.cal.CalendarView CalendarView} subclass.
     * @xtype extensible.eventcontextmenu
     */
    Ext.ensible.cal.EventContextMenu = Ext.extend(Ext.menu.Menu, {
        /**
         * @cfg {Boolean} hideOnClick
         * False to continue showing the menu after a color is selected, defaults to true.
         */
        hideOnClick : true,
        /**
         * @cfg {Boolean} ignoreParentClicks
         * True to ignore clicks on any item in this menu that is a parent item (displays a submenu)
         * so that the submenu is not dismissed when clicking the parent item (defaults to true).
         */
        ignoreParentClicks: true,
        /**
         * @cfg {String} editDetailsText
         * The text to display for the 'Edit Details' option in the menu.
         */
        editDetailsText: 'Edit Details',
        /**
         * @cfg {String} deleteText
         * The text to display for the 'Delete' option in the menu.
         */
        deleteText: 'Delete',
        /**
         * @cfg {String} moveToText
         * The text to display for the 'Move to...' option in the menu.
         */
        moveToText: 'Move to...',

        /**
         * @cfg {Boolean} enableScrolling
         * @hide
         */
        enableScrolling : false,
        /**
         * @cfg {Number} maxHeight
         * @hide
         */
        /**
         * @cfg {Number} scrollIncrement
         * @hide
         */
        /**
         * @event click
         * @hide
         */
        /**
         * @event itemclick
         * @hide
         */

        // private
        initComponent : function(){
            this.addEvents(
                /**
                 * @event editdetails
                 * Fires when the user selects the option to edit the event details
                 * (by default, in an instance of {@link Ext.ensible.cal.EventEditForm}. Handling code should
                 * transfer the current event record to the appropriate instance of the detailed form by showing
                 * the form and calling {@link Ext.ensible.cal.EventEditForm#loadRecord loadRecord}.
                 * @param {Ext.ensible.cal.EventContextMenu} this
                 * @param {Ext.ensible.cal.EventRecord} rec The {@link Ext.ensible.cal.EventRecord record} that is currently being edited
                 * @param {Ext.Element} el The element associated with this context menu
                 */
                'editdetails',
                /**
                 * @event eventdelete
                 * Fires after the user selectes the option to delete an event. Note that this menu does not actually
                 * delete the event from the data store. This is simply a notification that the menu option was selected --
                 * it is the responsibility of handling code to perform the deletion and any clean up required.
                 * @param {Ext.ensible.cal.EventContextMenu} this
                 * @param {Ext.ensible.cal.EventRecord} rec The {@link Ext.ensible.cal.EventRecord record} for the event to be deleted
                 * @param {Ext.Element} el The element associated with this context menu
                 */
                'eventdelete',
                /**
                 * @event eventmove
                 * Fires after the user selects a date in the calendar picker under the "move event" menu option. Note that this menu does not actually
                 * update the event in the data store. This is simply a notification that the menu option was selected --
                 * it is the responsibility of handling code to perform the move action and any clean up required.
                 * @param {Ext.ensible.cal.EventContextMenu} this
                 * @param {Ext.ensible.cal.EventRecord} rec The {@link Ext.ensible.cal.EventRecord record} for the event to be moved
                 * @param {Date} dt The new start date for the event (the existing event start time will be preserved)
                 */
                'eventmove'
            );
            this.buildMenu();
            Ext.ensible.cal.CalendarListMenu.superclass.initComponent.call(this);
        },

        /**
         * Overrideable method intended for customizing the menu items. This should only to be used for overriding
         * or called from a subclass and should not be called directly from application code.
         */
        buildMenu: function(){
            if(this.rendered){
                return;
            }
            this.dateMenu = new Ext.menu.DateMenu({
                scope: this,
                handler: function(dp, dt){
                    dt = Ext.ensible.Date.copyTime(this.rec.data[Ext.ensible.cal.EventMappings.StartDate.name], dt);
                    this.fireEvent('eventmove', this, this.rec, dt);
                }
            });

            Ext.apply(this, {
                items: [{
                    text: this.editDetailsText,
                    iconCls: 'extensible-cal-icon-evt-edit',
                    scope: this,
                    handler: function(){
                        this.fireEvent('editdetails', this, this.rec, this.ctxEl);
                    }
                },{
                    text: this.deleteText,
                    iconCls: 'extensible-cal-icon-evt-del',
                    scope: this,
                    handler: function(){
                        this.fireEvent('eventdelete', this, this.rec, this.ctxEl);
                    }
                },'-',{
                    text: this.moveToText,
                    iconCls: 'extensible-cal-icon-evt-move',
                    menu: this.dateMenu
                }]
            });
        },

        /**
         * Shows the specified event at the given XY position.
         * @param {Ext.ensible.cal.EventRecord} rec The {@link Ext.ensible.cal.EventRecord record} for the event
         * @param {Ext.Element} el The element associated with this context menu
         * @param {Array} xy The X & Y [x, y] values for the position at which to show the menu (coordinates are page-based)
         */
        showForEvent: function(rec, el, xy){
            this.rec = rec;
            this.ctxEl = el;
            this.dateMenu.picker.setValue(rec.data[Ext.ensible.cal.EventMappings.StartDate.name]);
            this.showAt(xy);
        },

        // private
        onHide : function(){
            Ext.ensible.cal.CalendarListMenu.superclass.onHide.call(this);
            delete this.ctxEl;
        }
    });

    Ext.reg('extensible.eventcontextmenu', Ext.ensible.cal.EventContextMenu);