(function($) {
    $.fn.jTruncate = function(options) {

        var defaults = {
            stringlength: 300,
            trailText: '... ',
            moreText: "more",
            lessText: "less",
            animateIn: 'slow',
            animateOut: 'slow',
            displayType: 'link'
        };

        options = $.extend(defaults, options);

        return this.each(function() {
            var obj = $(this);
            var body = obj.html();
            var bodyHeight = obj.height();
            bodyHeight = bodyHeight + 30

            var splitLocation = body.indexOf(' ', options.stringlength);

            if (splitLocation > 1) {
                var str1 = body.substring(0, splitLocation);
                obj.html(str1 + options.trailText + '<span name="more-text" class="truncate-link primary-link">' + options.moreText + '</span>');
                var reducedBodyHeight = obj.height();
            } else {
                str1 = body
            };

            var truncateLink = $('.truncate-link', obj);

            if (options.displayType == 'link') {

                obj.delegate('span.truncate-link', 'click', function() {

                    if (truncateLink.text() == options.moreText) {

                        obj.animate({ height: 0, duration: options.animateOut }, function() {
                            obj.animate({ height: bodyHeight, duration: options.animateIn }).html(body + '<span name="less-text" class="truncate-link primary-link">' + options.lessText + '</span>');
                            truncateLink.text(options.lessText);
                        });
                    } else {

                        obj.animate({ height: 0, duration: options.animateOut }, function() {
                            obj.animate({ height: reducedBodyHeight, duration: options.animateIn }).html(str1 + options.trailText + '<span name="more-text" class="truncate-link primary-link">' + options.moreText + '</span>');
                            truncateLink.text(options.moreText);
                        });
                    }
                    return true;
                });

                obj.delegate('span.truncate-link', 'mouseenter', function() {
                    obj.children('span.truncate-link').css('cursor', 'pointer');
                    obj.children('span.truncate-link').css('text-decoration', 'none');
                });
                
                obj.delegate('span.truncate-link', 'mouseleave', function() {
                    obj.children('span.truncate-link').css('cursor', 'default');
                    obj.children('span.truncate-link').css('text-decoration', 'underline');
                });

            } else {
                if (splitLocation > 1) {
                    obj.html(str1 + options.trailText).show();
                } else {
                    obj.html(str1).show();
                };
            }
            return true;
        });
    };
})(jQuery);
