* Move all Diaspora-specific javascripts to app/assets/javascripts * Move all vendored javascripts to vendor/assets/javascripts * Add the appropriate Sprockets require directives to make sure everything gets included in the right order * Remove Jammit dependencies * Fix all templates that were using Jammit's include_javascripts helper * Add handlebars_assets gem for compiling Handlebars templates * Move all Handlebars templates to app/assets/templates and rename from .handlebars to .jst.hbs (this is to keep them in the same global JST namespace that they were in under Jammit) * Add public/assets to .gitignore since these files can and should be re-generated by Heroku or Capistrano during each deploy * Fix a few Handlebars templates that were looking for images in the wrong location (I'm sure there are others, but it's late) * Configure application.rb to precompile all javascript and css assets that were compiled by Jammit in the Rails 3.0 code
162 lines
No EOL
4.8 KiB
JavaScript
162 lines
No EOL
4.8 KiB
JavaScript
/**
|
|
* @name Elastic
|
|
* @descripton Elastic is jQuery plugin that grow and shrink your textareas automatically
|
|
* @version 1.6.11
|
|
* @requires jQuery 1.2.6+
|
|
*
|
|
* @author Jan Jarfalk
|
|
* @author-email jan.jarfalk@unwrongest.com
|
|
* @author-website http://www.unwrongest.com
|
|
*
|
|
* @licence MIT License - http://www.opensource.org/licenses/mit-license.php
|
|
*/
|
|
|
|
(function($){
|
|
jQuery.fn.extend({
|
|
elastic: function() {
|
|
|
|
// We will create a div clone of the textarea
|
|
// by copying these attributes from the textarea to the div.
|
|
var mimics = [
|
|
'paddingTop',
|
|
'paddingRight',
|
|
'paddingBottom',
|
|
'paddingLeft',
|
|
'fontSize',
|
|
'lineHeight',
|
|
'fontFamily',
|
|
'width',
|
|
'fontWeight',
|
|
'border-top-width',
|
|
'border-right-width',
|
|
'border-bottom-width',
|
|
'border-left-width',
|
|
'borderTopStyle',
|
|
'borderTopColor',
|
|
'borderRightStyle',
|
|
'borderRightColor',
|
|
'borderBottomStyle',
|
|
'borderBottomColor',
|
|
'borderLeftStyle',
|
|
'borderLeftColor'
|
|
];
|
|
|
|
return this.each( function() {
|
|
|
|
// Elastic only works on textareas
|
|
if ( this.type !== 'textarea' ) {
|
|
return false;
|
|
}
|
|
|
|
var $textarea = jQuery(this),
|
|
$twin = jQuery('<div />').css({
|
|
'position' : 'absolute',
|
|
'display' : 'none',
|
|
'word-wrap' : 'break-word',
|
|
'white-space' :'pre-wrap'
|
|
}),
|
|
lineHeight = parseInt($textarea.css('line-height'),10) || parseInt($textarea.css('font-size'),'10'),
|
|
minheight = parseInt($textarea.css('height'),10) || lineHeight*3,
|
|
maxheight = parseInt($textarea.css('max-height'),10) || Number.MAX_VALUE,
|
|
goalheight = 0;
|
|
|
|
// Opera returns max-height of -1 if not set
|
|
if (maxheight < 0) { maxheight = Number.MAX_VALUE; }
|
|
|
|
// Append the twin to the DOM
|
|
// We are going to meassure the height of this, not the textarea.
|
|
$twin.appendTo($textarea.parent());
|
|
|
|
// Copy the essential styles (mimics) from the textarea to the twin
|
|
var i = mimics.length;
|
|
while(i--){
|
|
$twin.css(mimics[i].toString(),$textarea.css(mimics[i].toString()));
|
|
}
|
|
|
|
// Updates the width of the twin. (solution for textareas with widths in percent)
|
|
function setTwinWidth(){
|
|
var curatedWidth = Math.floor(parseInt($textarea.width(),10));
|
|
if($twin.width() !== curatedWidth){
|
|
$twin.css({'width': curatedWidth + 'px'});
|
|
|
|
// Update height of textarea
|
|
update(true);
|
|
}
|
|
}
|
|
|
|
// Sets a given height and overflow state on the textarea
|
|
function setHeightAndOverflow(height, overflow){
|
|
|
|
var curratedHeight = Math.floor(parseInt(height,10));
|
|
if($textarea.height() !== curratedHeight){
|
|
$textarea.css({'height': curratedHeight + 'px','overflow':overflow});
|
|
}
|
|
}
|
|
|
|
// This function will update the height of the textarea if necessary
|
|
function update(forced) {
|
|
|
|
// Get curated content from the textarea.
|
|
var textareaContent = $textarea.val().replace(/&/g,'&').replace(/ {2}/g, ' ').replace(/<|>/g, '>').replace(/\n/g, '<br />');
|
|
|
|
// Compare curated content with curated twin.
|
|
var twinContent = $twin.html().replace(/<br>/ig,'<br />');
|
|
|
|
if(forced || textareaContent+' ' !== twinContent){
|
|
|
|
// Add an extra white space so new rows are added when you are at the end of a row.
|
|
$twin.html(textareaContent+' ');
|
|
|
|
// Change textarea height if twin plus the height of one line differs more than 3 pixel from textarea height
|
|
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');
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Hide scrollbars
|
|
$textarea.css({'overflow':'hidden'});
|
|
|
|
// Update textarea size on keyup, change, cut and paste
|
|
$textarea.bind('keyup change cut paste', function(){
|
|
update();
|
|
});
|
|
|
|
// Update width of twin if browser or textarea is resized (solution for textareas with widths in percent)
|
|
$(window).bind('resize', setTwinWidth);
|
|
$textarea.bind('resize', setTwinWidth);
|
|
$textarea.bind('update', update);
|
|
|
|
// Compact textarea on blur
|
|
$textarea.bind('blur',function(){
|
|
if($twin.height() < maxheight){
|
|
if($twin.height() > minheight) {
|
|
$textarea.height($twin.height());
|
|
} else {
|
|
$textarea.height(minheight);
|
|
}
|
|
}
|
|
});
|
|
|
|
// And this line is to catch the browser paste event
|
|
$textarea.bind('input paste',function(e){ setTimeout( update, 250); });
|
|
|
|
// Run update once when elastic is initialized
|
|
update();
|
|
|
|
});
|
|
|
|
}
|
|
});
|
|
})(jQuery); |