﻿/* 
 * CE auto growing text area javascript.
 * NOTE: Always name the extension 'autogrow' so as to not break program code.
 *
 */
 


	/* start of the latest auto grow js that CE is using. */
    /* 26/07/09: http://www.unwrongest.com/projects/elastic/ */

(function($) {
$.fn.extend({ autogrow: 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'), 10) || parseInt($textarea.css('fontSize'), '10'), minheight = parseInt($textarea.css('height'), 10) || 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);
