From c6a138ff43e50280500accc1bffeee9bb1258cf8 Mon Sep 17 00:00:00 2001 From: Pablo Vazquez Date: Wed, 8 Nov 2017 16:59:21 +0100 Subject: [PATCH] Introducing 00_utils.js Utilities that can be used accross all Pillar apps This includes general purpose functions, small jQuery plugins, and so on. For example: the autoResize jQuery plugin that automatically resizes a textarea according to its content was used on all major Pillar apps so far (Attract, Flamenco, Blender Cloud and Dillo), proven to be really needed everywhere. --- src/scripts/tutti/00_utils.js | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/scripts/tutti/00_utils.js diff --git a/src/scripts/tutti/00_utils.js b/src/scripts/tutti/00_utils.js new file mode 100644 index 00000000..99f853c4 --- /dev/null +++ b/src/scripts/tutti/00_utils.js @@ -0,0 +1,67 @@ +(function ( $ ) { + /* + * jQuery autoResize (textarea auto-resizer) + * @copyright James Padolsey http://james.padolsey.com + * @version 1.04 + * cracked by icyleaf + * https://gist.github.com/icyleaf/269160 + */ + $.fn.autoResize = function(options) { + var settings = $.extend({ + onResize : function(){}, + animate : true, + animateDuration : 0, + animateCallback : function(){}, + extraSpace : 20, + limit: 500 + }, options); + + this.filter('textarea').each(function(){ + var textarea = $(this).css({resize:'none','overflow-y':'hidden'}), + origHeight = textarea.height(), + clone = (function(){ + var props = ['height','width','lineHeight','textDecoration','letterSpacing'], + propOb = {}; + + $.each(props, function(i, prop){ + propOb[prop] = textarea.css(prop); + }); + + return textarea.clone().removeAttr('id').removeAttr('name').css({ + position: 'absolute', + top: 0, + left: -9999 + }).css(propOb).attr('tabIndex','-1').insertBefore(textarea); + })(), + lastScrollTop = null, + updateSize = function() { + + clone.height(0).val($(this).val()).scrollTop(10000); + var scrollTop = Math.max(clone.scrollTop(), origHeight) + settings.extraSpace, + toChange = $(this).add(clone); + + if (lastScrollTop === scrollTop) { return; } + lastScrollTop = scrollTop; + + if ( scrollTop >= settings.limit ) { + if ( settings.limit != 0) { + $(this).css('overflow-y','').css('height', settings.limit+'px'); + return; + } + } + settings.onResize.call(this); + settings.animate && textarea.css('display') === 'block' ? + toChange.stop().animate({height:scrollTop}, settings.animateDuration, settings.animateCallback) + : toChange.height(scrollTop); + }; + textarea + .unbind('.dynSiz') + .bind('keyup.dynSiz', updateSize) + .bind('keydown.dynSiz', updateSize) + .bind('change.dynSiz', updateSize) + .bind('blur.dynSiz', updateSize); + }); + return this; + }; + +}(jQuery));