diff --git a/public/javascripts/vendor/jquery.expander.js b/public/javascripts/vendor/jquery.expander.js
index 13a8a2cb4..d1d2ed66b 100644
--- a/public/javascripts/vendor/jquery.expander.js
+++ b/public/javascripts/vendor/jquery.expander.js
@@ -1,48 +1,64 @@
-/*
- * jQuery Expander plugin
- * Version 0.4 (12/09/2008)
- * @requires jQuery v1.1.1+
+/*!
+ * jQuery Expander Plugin v0.7
*
- * Dual licensed under the MIT and GPL licenses:
+ * Date: Wed Aug 31 20:53:59 2011 EDT
+ * Requires: jQuery v1.3+
+ *
+ * Copyright 2011, Karl Swedberg
+ * Dual licensed under the MIT and GPL licenses (just like jQuery):
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
- *
- */
-
+ * source: https://github.com/kswedberg/jquery-expander/
+*/
(function($) {
$.fn.expander = function(options) {
- var opts = $.extend({}, $.fn.expander.defaults, options);
- var delayedCollapse;
- return this.each(function() {
- var $this = $(this);
- var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
- var cleanedTag, startTags, endTags;
- var allText = $this.html();
- var startText = allText.slice(0, o.slicePoint).replace(/\w+$/,'');
- startTags = startText.match(/<\w[^>]*>/g);
- if (startTags) {startText = allText.slice(0,o.slicePoint + startTags.join('').length).replace(/\w+$/,'');}
+ var opts = $.extend({}, $.fn.expander.defaults, options),
+ rSlash = /\//,
+ delayedCollapse;
- if (startText.lastIndexOf('<') > startText.lastIndexOf('>') ) {
- startText = startText.slice(0,startText.lastIndexOf('<'));
- }
- var endText = allText.slice(startText.length);
- // create necessary expand/collapse elements if they don't already exist
- if (!$('span.details', this).length) {
+ this.each(function() {
+ var cleanedTag, startTags, endTags,
+ thisEl = this,
+ $this = $(this),
+ o = $.meta ? $.extend({}, opts, $this.data()) : opts,
+ expandSpeed = o.expandSpeed || 0,
+ allText = $this.html(),
+ startText = allText.slice(0, o.slicePoint).replace(/(&([^;]+;)?|\w+)$/,'');
+
+ startTags = startText.match(/<\w[^>]*>/g);
+
+ if (startTags) {
+ startText = allText.slice(0,o.slicePoint + startTags.join('').length).replace(/(&([^;]+;)?|\w+)$/,'');
+ }
+
+ if (startText.lastIndexOf('<') > startText.lastIndexOf('>') ) {
+ startText = startText.slice(0,startText.lastIndexOf('<'));
+ }
+
+ var defined = {};
+ $.each(['onSlice','beforeExpand', 'afterExpand', 'onCollapse'], function(index, val) {
+ defined[val] = $.isFunction(o[val]);
+ });
+
+ var endText = allText.slice(startText.length);
+ // create necessary expand/collapse elements if they don't already exist
+ if (!$(this).find('span.details').length) {
// end script if text length isn't long enough.
- if ( endText.replace(/\s+$/,'').split(' ').length < o.widow ) { return; }
- // otherwise, continue...
- if (endText.indexOf('') > -1) {
- endTags = endText.match(/<(\/)?[^>]*>/g);
+ if ( endText.replace(/\s+$/,'').split(' ').length < o.widow || allText.length < o.slicePoint ) { return; }
+ // otherwise, continue...
+ if (defined.onSlice) { o.onSlice.call(thisEl); }
+ if (endText.indexOf('') > -1) {
+ endTags = endText.match(/<(\/)?[^>]*>/g);
for (var i=0; i < endTags.length; i++) {
if (endTags[i].indexOf('') > -1) {
var startTag, startTagExists = false;
for (var j=0; j < i; j++) {
- startTag = endTags[j].slice(0, endTags[j].indexOf(' ')).replace(/(\w)$/,'$1>');
- if (startTag == rSlash(endTags[i])) {
+ startTag = endTags[j].slice(0, endTags[j].indexOf(' ')).replace(/\w$/,'$1>');
+ if (startTag == endTags[i].replace(rSlash,'')) {
startTagExists = true;
}
}
@@ -50,103 +66,120 @@
startText = startText + endTags[i];
var matched = false;
for (var s=startTags.length - 1; s >= 0; s--) {
- if (startTags[s].slice(0, startTags[s].indexOf(' ')).replace(/(\w)$/,'$1>') == rSlash(endTags[i])
- && matched == false) {
+ if (startTags[s].slice(0, startTags[s].indexOf(' ')).replace(/(\w)$/,'$1>') == endTags[i].replace(rSlash,'') &&
+ !matched ) {
cleanedTag = cleanedTag ? startTags[s] + cleanedTag : startTags[s];
matched = true;
}
- };
+ }
}
}
}
endText = cleanedTag && cleanedTag + endText || endText;
}
- $this.html([
- startText,
- '',
- o.expandPrefix,
- '',
- o.expandText,
- '',
- '',
- '',
- endText,
- ''
- ].join('')
- );
+ $this.html([
+ startText,
+ '',
+ o.expandPrefix,
+ '',
+ o.expandText,
+ '',
+ '',
+ '',
+ endText,
+ ''
+ ].join('')
+ );
}
- var $thisDetails = $('span.details', this),
- $readMore = $('span.read-more', this);
- $thisDetails.hide();
- $readMore.find('a').click(function() {
- $readMore.hide();
- if (o.expandEffect === 'show' && !o.expandSpeed) {
- o.beforeExpand($this);
- $thisDetails.show();
- o.afterExpand($this);
- delayCollapse(o, $thisDetails);
- } else {
- o.beforeExpand($this);
- $thisDetails[o.expandEffect](o.expandSpeed, function() {
- $thisDetails.css({zoom: ''});
- o.afterExpand($this);
- delayCollapse(o, $thisDetails);
- });
- }
- return false;
- });
- if (o.userCollapse) {
+ var $thisDetails = $(this).find('span.details'),
+ $readMore = $(this).find('span.read-more');
+
+ $thisDetails.hide();
+ $readMore.find('a').bind('click.expander', function(event) {
+ event.preventDefault();
+ $readMore.hide();
+ if (defined.beforeExpand) {
+ o.beforeExpand.call(thisEl);
+ }
+
+ $thisDetails[o.expandEffect](expandSpeed, function() {
+ $thisDetails.css({zoom: ''});
+ if (defined.afterExpand) {o.afterExpand.call(thisEl);}
+ delayCollapse(o, $thisDetails, thisEl);
+ });
+ });
+
+ if ( o.userCollapse && !$this.find('span.re-collapse').length ) {
$this
- .find('span.details').append('' + o.userCollapsePrefix + '' + o.userCollapseText + '');
- $this.find('span.re-collapse a').click(function() {
-
+ .find('span.details')
+ .append('' + o.userCollapsePrefix + '' + o.userCollapseText + '');
+ $this.find('span.re-collapse a').bind('click.expander', function(event) {
+ event.preventDefault();
clearTimeout(delayedCollapse);
var $detailsCollapsed = $(this).parents('span.details');
reCollapse($detailsCollapsed);
- o.onCollapse($this, true);
- return false;
+ if (defined.onCollapse) {
+ o.onCollapse.call(thisEl, true);
+ }
});
}
});
+
function reCollapse(el) {
el.hide()
.prev('span.read-more').show();
}
- function delayCollapse(option, $collapseEl) {
+ function delayCollapse(option, $collapseEl, thisEl) {
if (option.collapseTimer) {
delayedCollapse = setTimeout(function() {
reCollapse($collapseEl);
- option.onCollapse($collapseEl.parent(), false);
- },
- option.collapseTimer
- );
+ if ( $.isFunction(option.onCollapse) ) {
+ option.onCollapse.call(thisEl, false);
+ }
+ }, option.collapseTimer);
}
}
- function rSlash(rString) {
- return rString.replace(/\//,'');
- }
+
+ return this;
};
- // plugin defaults
+
+ // plugin defaults
$.fn.expander.defaults = {
- slicePoint: 100, // the number of characters at which the contents will be sliced into two parts.
- // Note: any tag names in the HTML that appear inside the sliced element before
- // the slicePoint will be counted along with the text characters.
- widow: 4, // a threshold of sorts for whether to initially hide/collapse part of the element's contents.
- // If after slicing the contents in two there are fewer words in the second part than
- // the value set by widow, we won't bother hiding/collapsing anything.
- expandText: 'read more', // text displayed in a link instead of the hidden part of the element.
- // clicking this will expand/show the hidden/collapsed text
- expandPrefix: '… ',
- collapseTimer: 0, // number of milliseconds after text has been expanded at which to collapse the text again
- expandEffect: 'fadeIn',
- expandSpeed: '', // speed in milliseconds of the animation effect for expanding the text
- userCollapse: true, // allow the user to re-collapse the expanded text.
- userCollapseText: '[collapse expanded text]', // text to use for the link to re-collapse the text
+ // slicePoint: the number of characters at which the contents will be sliced into two parts.
+ // Note: any tag names in the HTML that appear inside the sliced element before
+ // the slicePoint will be counted along with the text characters.
+ slicePoint: 100,
+
+ // widow: a threshold of sorts for whether to initially hide/collapse part of the element's contents.
+ // If after slicing the contents in two there are fewer words in the second part than
+ // the value set by widow, we won't bother hiding/collapsing anything.
+ widow: 4,
+
+ // text displayed in a link instead of the hidden part of the element.
+ // clicking this will expand/show the hidden/collapsed text
+ expandText: 'read more',
+ expandPrefix: '… ',
+
+ // number of milliseconds after text has been expanded at which to collapse the text again
+ collapseTimer: 0,
+ expandEffect: 'fadeIn',
+ expandSpeed: 250,
+
+ // allow the user to re-collapse the expanded text.
+ userCollapse: true,
+
+ // text to use for the link to re-collapse the text
+ userCollapseText: '[collapse expanded text]',
userCollapsePrefix: ' ',
- beforeExpand: function($thisEl) {},
- afterExpand: function($thisEl) {},
- onCollapse: function($thisEl, byUser) {}
+
+
+ // all callback functions have the this keyword mapped to the element in the jQuery set when .expander() is called
+
+ onSlice: null, // function() {}
+ beforeExpand: null, // function() {},
+ afterExpand: null, // function() {},
+ onCollapse: null // function(byUser) {}
};
})(jQuery);
diff --git a/public/javascripts/widgets/comment.js b/public/javascripts/widgets/comment.js
index 2e75eb649..554f46b68 100644
--- a/public/javascripts/widgets/comment.js
+++ b/public/javascripts/widgets/comment.js
@@ -14,12 +14,12 @@
self.deleteCommentLink.click(self.removeComment);
self.deleteCommentLink.tipsy({ trigger: "hover" });
- self.content.expander({
- slicePoint: 200,
- widow: 18,
- expandText: Diaspora.I18n.t("show_more"),
- userCollapse: false
- });
+ // self.content.expander({
+ // slicePoint: 200,
+ // widow: 18,
+ // expandText: Diaspora.I18n.t("show_more"),
+ // userCollapse: false
+ // });
self.globalSubscribe("likes/" + self.comment.attr('id') + "/updated", function(){
self.likes = self.instantiate("Likes", self.comment.find(".likes_container"));
diff --git a/public/javascripts/widgets/stream-element.js b/public/javascripts/widgets/stream-element.js
index 8d26f5ef7..ea81183cc 100644
--- a/public/javascripts/widgets/stream-element.js
+++ b/public/javascripts/widgets/stream-element.js
@@ -27,12 +27,12 @@
self.postScope.tipsy({ trigger: "hover" });
// collapse long posts
- self.content.expander({
- slicePoint: 400,
- widow: 12,
- expandText: Diaspora.I18n.t("show_more"),
- userCollapse: false
- });
+ // self.content.expander({
+ // slicePoint: 400,
+ // widow: 12,
+ // expandText: Diaspora.I18n.t("show_more"),
+ // userCollapse: false
+ // });
self.globalSubscribe("likes/" + self.postGuid + "/updated", function() {
self.likes = self.instantiate("Likes", self.post.find(".likes_container:first"));