(function($) {

    $.fn.ellipsis = function(lines, enableUpdating, moreText, lessText) {

        return $(this).each(function() {

            var el = $(this);
            
            var ellipsis = '...';

            if (el.css("overflow") == "hidden") {

                var originalText = el.html();

                var availWidth = el.width();

                var availHeight = el.height();

                var MoreLessTag;

                if (moreText) {

                    enableUpdating = true;

                    MoreLessTag = " <a class='MoreLessTag' href='#' >" + moreText + "</a>";

                }

                else MoreLessTag = ""; 

                var t = $(this.cloneNode(true))

                    .hide()

                    .css({

                        'position': 'absolute',

                        'overflow': 'visible',

                        'max-width': 'none',

                        'max-height': 'none'

                    });

                if (lines) t.css("height", "auto").width(availWidth);

                else t.css("width", "auto");

                el.after(t);

                var fullHeight = t.height(); 

                var avail = (lines) ? availHeight : availWidth;

                var test = (lines) ? t.height() : t.width();

                var foundMin = false, foundMax = false;

                if (test > avail) {

                    //Binary search style trimming of the temp element to find its optimal size

                    var min = 0;

                    var max = originalText.length;

                    while (min <= max) {

                        var trimLocation = (min + max) / 2;

                        var text = originalText.substr(0, trimLocation);

                        t.html(text + ellipsis + MoreLessTag);

                        test = (lines) ? t.height() : t.width();

                        if (test > avail) {

                            if (foundMax)

                                foundMin = true;

                            max = trimLocation - 1;

                            if (min > max) {

                                //If we would be ending decrement the min and regenerate the text so we don't end with a

                                //slightly larger text than there is space for

                                trimLocation = (max + max - 2) / 2;

                                text = originalText.substr(0, trimLocation);

                                t.html(text + ellipsis + MoreLessTag);

                                break;

                            }

                        }

                        else if (test < avail) {

                            min = trimLocation + 1;

                        }

                        else {

                            if (foundMin && foundMax && ((max - min) / max < .2))

                                break;

                            foundMax = true;

                            min = trimLocation + 1;

                        }

                    }

                }

                el.html(t.html());

                t.remove(); 

                if (moreText) {

                    jQuery(".MoreLessTag", this).click(function(event) {

                        event.preventDefault();

                        el.html(originalText);

                        embeddedPlayerManager.getPlayer().hidePlayer();

                        el.animate({ "height": fullHeight }, "normal", null, function() {

                            embeddedPlayerManager.manager.updatePositions();

                            embeddedPlayerManager.getPlayer().unHidePlayer();

                        });

                        el.append(" <a class='MoreLessTag' href='#' >" + lessText + "</a>");

                        jQuery(".MoreLessTag", el).click(function(event) {

                            event.preventDefault();

                            resetDescription(availHeight, originalText);

                        });

                    });

                }

                else {

                    var replaceTags = new RegExp(/<\/?[^>]+>/gi);

                    el.attr("alt", originalText.replace(replaceTags, ''));

                    el.attr("title", originalText.replace(replaceTags, ''));

                }

                if (enableUpdating == true) {

                    var oldW = el.width();

                    var oldH = el.height();

                    el.one("resize", function() {

                        if (el.width() != oldW || (lines && el.height != oldH)) {

                            el.html(originalText);

                            el.ellipsis(lines, enableUpdating, moreText, lessText);

                        }

                    });

                }

            }

        });

    };

})(jQuery);
