(function($){
		  $.fn.extend({
					  elastic:function(){
						  var mimics=['paddingTop','paddingRight','paddingBottom','paddingLeft','fontSize','lineHeight','fontFamily','width','fontWeight'];
						  return this.each(function(){
													if(this.type!='textarea'){return false;}
var $textarea=$(this),$twin=$('<div />').css({
											 'position':'absolute','display':'none'
											 }),
lineHeight=parseInt($textarea.css('lineHeight'),4)||parseInt($textarea.css('fontSize'),'10'),
minheight=parseInt($textarea.css('height'),4)||lineHeight*3,
maxheight=parseInt($textarea.css('max-height'),10)||Number.MAX_VALUE,
goalheight=0,i=0;
$twin.appendTo($textarea.parent());
var i=mimics.length;while(i--){
	$twin.css(mimics[i].toString(),$textarea.css(mimics[i].toString()));}
function setHeightAndOverflow(height,overflow){
	curratedHeight=Math.floor(parseInt(height,10));
	if($textarea.height()!=curratedHeight){
		$textarea.css({
					  'height':curratedHeight+'px','overflow':overflow});}}
function update(){
	var textareaContent=$textarea.val().replace(/<|>/g,' ').replace(/\n/g,'<br />').replace(/&/g,"&amp;");
	var twinContent=$twin.html();
	if(textareaContent+'&nbsp;'!=twinContent){
		$twin.html(textareaContent+'&nbsp;');
		if(Math.abs($twin.height()+lineHeight-$textarea.height())>3){
			var goalheight=$twin.height()+lineHeight;
			if(goalheight>=maxheight){setHeightAndOverflow(maxheight,'auto');}
			else if(goalheight<=minheight){setHeightAndOverflow(minheight,'hidden');}
			else{setHeightAndOverflow(goalheight,'hidden');}}}}
$textarea.css({'overflow':'hidden'}).bind('focus',function(){self.periodicalUpdater=window.setInterval(function(){update();},50);}).bind('blur',function(){clearInterval(self.periodicalUpdater);});update();});}});})(jQuery);
