    /*!
     * Ext JS Library 3.3.0
     * Copyright(c) 2006-2010 Ext JS, Inc.
     * licensing@extjs.com
     * http://www.extjs.com/license
     */
    /*
     * @class Ext.calendar.StatusProxy
     * A specialized drag proxy that supports a drop status icon, {@link Ext.Layer} styles and auto-repair. It also
     * contains a calendar-specific drag status message containing details about the dragged event's target drop date range.
     * This is the default drag proxy used by all calendar views.
     * @constructor
     * @param {Object} config
     */
    Ext.calendar.StatusProxy = function(config) {
        Ext.apply(this, config);
        this.id = this.id || Ext.id();
        this.el = new Ext.Layer({
            dh: {
                id: this.id,
                cls: 'ext-dd-drag-proxy x-dd-drag-proxy ' + this.dropNotAllowed,
                cn: [
                {
                    cls: 'x-dd-drop-icon'
                },
                {
                    cls: 'ext-dd-ghost-ct',
                    cn: [
                    {
                        cls: 'x-dd-drag-ghost'
                    },
                    {
                        cls: 'ext-dd-msg'
                    }
                    ]
                }
                ]
            },
            shadow: !config || config.shadow !== false
        });
        this.ghost = Ext.get(this.el.dom.childNodes[1].childNodes[0]);
        this.message = Ext.get(this.el.dom.childNodes[1].childNodes[1]);
        this.dropStatus = this.dropNotAllowed;
    };

    Ext.extend(Ext.calendar.StatusProxy, Ext.dd.StatusProxy, {
        /**
         * @cfg {String} moveEventCls
         * The CSS class to apply to the status element when an event is being dragged (defaults to 'ext-cal-dd-move').
         */
        moveEventCls: 'ext-cal-dd-move',
        /**
         * @cfg {String} addEventCls
         * The CSS class to apply to the status element when drop is not allowed (defaults to 'ext-cal-dd-add').
         */
        addEventCls: 'ext-cal-dd-add',

        // inherit docs
        update: function(html) {
            if (typeof html == 'string') {
                this.ghost.update(html);
            } else {
                this.ghost.update('');
                html.style.margin = '0';
                this.ghost.dom.appendChild(html);
            }
            var el = this.ghost.dom.firstChild;
            if (el) {
                Ext.fly(el).setStyle('float', 'none').setHeight('auto');
                Ext.getDom(el).id += '-ddproxy';
            }
        },

        /**
         * Update the calendar-specific drag status message without altering the ghost element.
         * @param {String} msg The new status message
         */
        updateMsg: function(msg) {
            this.message.update(msg);
        }
    });