-/*!
- * Autogrow Textarea Plugin Version v2.0
- * http://www.technoreply.com/autogrow-textarea-plugin-version-2-0
+/*
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <jevin9@gmail.com> wrote this file. As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return. Jevin O. Sewaruth
+ * ----------------------------------------------------------------------------
*
- * Copyright 2011, Jevin O. Sewaruth
+ * Autogrow Textarea Plugin Version v3.0
+ * http://www.technoreply.com/autogrow-textarea-plugin-3-0
+ *
+ * THIS PLUGIN IS DELIVERD ON A PAY WHAT YOU WHANT BASIS. IF THE PLUGIN WAS USEFUL TO YOU, PLEASE CONSIDER BUYING THE PLUGIN HERE :
+ * https://sites.fastspring.com/technoreply/instant/autogrowtextareaplugin
*
- * Date: March 13, 2011
+ * Date: October 15, 2012
*/
-jQuery.fn.autoGrow = function(){
- return this.each(function(){
- // Variables
- var colsDefault = this.cols;
- var rowsDefault = this.rows;
-
- //Functions
- var grow = function() {
- growByRef(this);
+
+jQuery.fn.autoGrow = function() {
+ return this.each(function() {
+
+ var createMirror = function(textarea) {
+ jQuery(textarea).after('<div class="autogrow-textarea-mirror"></div>');
+ return jQuery(textarea).next('.autogrow-textarea-mirror')[0];
}
-
- var growByRef = function(obj) {
- var linesCount = 0;
- var lines = obj.value.split('\n');
-
- for (var i=lines.length-1; i>=0; --i)
- {
- linesCount += Math.floor((lines[i].length / colsDefault) + 1);
- }
-
- if (linesCount >= rowsDefault)
- obj.rows = linesCount + 1;
- else
- obj.rows = rowsDefault;
+
+ var sendContentToMirror = function (textarea) {
+ mirror.innerHTML = String(textarea.value).replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, ''').replace(/</g, '<').replace(/>/g, '>').replace(/\n/g, '<br />') + '.<br/>.';
+
+ if (jQuery(textarea).height() != jQuery(mirror).height())
+ jQuery(textarea).height(jQuery(mirror).height());
}
-
- var characterWidth = function (obj){
- var characterWidth = 0;
- var temp1 = 0;
- var temp2 = 0;
- var tempCols = obj.cols;
-
- obj.cols = 1;
- temp1 = obj.offsetWidth;
- obj.cols = 2;
- temp2 = obj.offsetWidth;
- characterWidth = temp2 - temp1;
- obj.cols = tempCols;
-
- return characterWidth;
+
+ var growTextarea = function () {
+ sendContentToMirror(this);
}
+
+ // Create a mirror
+ var mirror = createMirror(this);
- // Manipulations
- this.style.width = "auto";
- this.style.height = "auto";
+ // Style the mirror
+ mirror.style.display = 'none';
+ mirror.style.wordWrap = 'break-word';
+ mirror.style.padding = jQuery(this).css('padding');
+ mirror.style.width = jQuery(this).css('width');
+ mirror.style.fontFamily = jQuery(this).css('font-family');
+ mirror.style.fontSize = jQuery(this).css('font-size');
+ mirror.style.lineHeight = jQuery(this).css('line-height');
+
+ // Style the textarea
this.style.overflow = "hidden";
- this.style.width = ((characterWidth(this) * this.cols) + 6) + "px";
- this.onkeyup = grow;
- this.onfocus = grow;
- this.onblur = grow;
- growByRef(this);
+ this.style.minHeight = this.rows+"em";
+
+ // Bind the textarea's event
+ this.onkeyup = growTextarea;
+
+ // Fire the event for text already present
+ sendContentToMirror(this);
+
});
};