(function($) {
 
    /*
* Auto-growing textareas; technique ripped from Facebook
*/
    $.fn.autogrow = function(options) {
        
        this.filter('textarea').each(function() {
            
            var $this = $(this),
                minHeight = $this.height(),
                lineHeight = $this.css('lineHeight');          
            
            var shadow = $('<div class="autogrow-zone"></div>').css({
                position: 'absolute',
                top: -10000,
                left: -10000,
                width: $(this).width() - parseInt($this.css('paddingLeft')) - parseInt($this.css('paddingRight'))  + "px",
                fontSize: ($.browser.msie?"1.2em":"1.18em"),
                fontFamily: $this.css('fontFamily'),
                lineHeight: "1.4em",
                resize: 'none'
            }).appendTo(document.body);
            
            $(this).data("shadow",shadow);
            
            var update = function() {
            	
            	shadow = $(this).data("shadow");
            	shadow.css("width", $(this).width() - parseInt($(this).css('paddingLeft')) - parseInt($(this).css('paddingRight')) + "px");
            	            	
                var times = function(string, number) {
                    for (var i = 0, r = ''; i < number; i ++) r += string;
                    return r;
                };
                
                var val = this.value.replace(/</g, '&lt;')
                                    .replace(/>/g, '&gt;')
                                    .replace(/&/g, '&amp;')
                                    .replace(/\n$/, '<br/>&nbsp;')
                                    .replace(/\n/g, '<br/>')
                                    .replace(/ {2,}/g, function(space) { return times('&nbsp;', space.length -1) + ' ' });
                
                shadow.html(val);
                $(this).css('height', Math.max(shadow.height() + 2, minHeight)  + "px");
            
            }
            
            $(this).change(update).keyup(update).keydown(update);
            
            $(this).data("update", update);
            
            update.apply(this);
            
        });
        
        return this;
        
    }
    
})(jQuery);