    /**
     * @class Ext.Element
     */
    Ext.Element.addMethods({
        /**
         * Measures the element's content height and updates height to match. Note: this function uses setTimeout so
         * the new height may not be available immediately.
         * @param {Boolean} animate (optional) Animate the transition (defaults to false)
         * @param {Float} duration (optional) Length of the animation in seconds (defaults to .35)
         * @param {Function} onComplete (optional) Function to call when animation completes
         * @param {String} easing (optional) Easing method to use (defaults to easeOut)
         * @return {Ext.Element} this
         */
        autoHeight : function(animate, duration, onComplete, easing){
            var oldHeight = this.getHeight();
            this.clip();
            this.setHeight(1); // force clipping
            setTimeout(function(){
                var height = parseInt(this.dom.scrollHeight, 10); // parseInt for Safari
                if(!animate){
                    this.setHeight(height);
                    this.unclip();
                    if(typeof onComplete == "function"){
                        onComplete();
                    }
                }else{
                    this.setHeight(oldHeight); // restore original height
                    this.setHeight(height, animate, duration, function(){
                        this.unclip();
                        if(typeof onComplete == "function") onComplete();
                    }.createDelegate(this), easing);
                }
            }.createDelegate(this), 0);
            return this;
        }
    });