(function($){
    $.fn.shortenText = function(o) {
    
        var defaults = {
            length: 100, //number of charaters to show
            minTrail: 75, //minimum number of characters to be hidden
            moreText: 'more',
            lessText: 'less',
            ellipsisText: '...',
            button: false,
            showSpeed: 400,
            hideSpeed: 400
        };
        o = $.extend(defaults, o);
        
        
        return this.each(function() {
            var e = $(this);
            var text = e.text();
            
            if(text.length != e.html().length) return 1;
            if(text.length < o.length + o.minTrail) return 1;
            
            var split = text.indexOf(" ", o.length);
            if(split == -1) split = o.length;
            
            var str1 = text.substring(0, split);
            var str2 = text.substring(str1.length);           
            
            e.html(
                str1 +
                '<span>' + str2 + '</span>' +
                '<span></span>' +
                '<div>' + ((o.button) ?
                    '<button type="button" class="read-link">'+o.moreText+'</button>' :
                    '<a href="#" class="read-link">'+o.moreText+'</a>') +
                '</div>'
            );
            
            $.data(e, "height-expanded", e.height());            
            $('span:eq(0)', e).hide();            
            $('span:eq(1)', e).text(o.ellipsisText);            
            $.data(e, "height-collapsed", e.height());            
            e.css({overflow: "hidden"});
            
            $('.read-link', e)                  
                .toggle(
                    function(){                    
                        e.height(e.height());                        
                        $('span:eq(1)', e).hide();
                        $('span:eq(0)', e).show();
                        
                        e.animate({height: $.data(e, "height-expanded")}, o.showSpeed, function(){
                             e.height("auto");
                             $('.read-link', e).text(o.lessText);
                        });
                        return false;
                    },
                    
                    function(){
                        e.height(e.height());
                        $('span:eq(1)', e).show();                        

                        e.animate({height: $.data(e, "height-collapsed")}, o.hideSpeed, function(){
                            $('span:eq(0)', e).hide();
                            e.height("auto");
                            $('.read-link', e).text(o.moreText);
                        });
                        return false;
                        
                    }
                );
        });
    };
})(jQuery);
