﻿(function($) {
    $.fn.truncateHtml = $.fn.truncatehtml = function(options) {
        var defaults = {
            length: 100,
            ellipsisText: "...",
            moreText: "read more",
            lessText: "hide"
        };

        options = $.extend(defaults, options);

        truncate = function(node, length) {
            return (node.nodeType == 3) ? truncateText(node, length) : truncateNode(node, length);
        };

        truncateNode = function(node, length) {
            var newNode = $(node).clone().empty();
            var childNode;

            $(node).contents().each(function() {
                var remainingLength = length - newNode.text().length;

                if (remainingLength > 0) {
                    childNode = truncate(this, remainingLength);

                    if (childNode) newNode.append(childNode);
                }
            });

            return newNode;
        };

        truncateText = function(node, length) {
            var text = $.trim(squeeze(node.data));

            var splitLocation = text.indexOf(' ', length);

            return (splitLocation != -1) ? text.substring(0, splitLocation) : text.slice(0, length);
        };

        squeeze = function(string) {
            return string.replace(/\s+/g, ' ');
        }

        return this.each(function() {
            var $this = $(this);
            var body = $this.html();

            var bodyLength = $.trim(squeeze($this.text())).length;

            if (bodyLength > options.length) {
                var fullNode = this;
                var truncatedNode = truncate(this, options.length);

                truncatedNode.insertAfter(fullNode);

                truncatedNode.children(':last').append(
                    '<span class="ellipsis-text">' + options.ellipsisText + '</span>'
                );

                truncatedNode.append(
                    '<div class="more-text"><a href="#">' + options.moreText + '</a></div>'
                );

                $(fullNode).append(
                    '<div class="less-text"><a href="#">' + options.lessText + '</a></div>'
                );

                $(fullNode).hide();
                truncatedNode.show();

                $('.more-text a', truncatedNode).click(function() {
                    $(truncatedNode).hide();
                    $(fullNode).fadeIn();
                    return false;
                });

                $('.less-text a', $(fullNode)).click(function() {
                    $(fullNode).hide();
                    $(truncatedNode).fadeIn();
                    return false;
                });
            }
        });
    }
})(jQuery);
