(function ($)
{
    $.fn.ellipsis = function (lines, enableUpdating, moreText, lessText, txtOnClick)
    {
        return $(this).each(function ()
        {
            var el = $(this);
			if (el.css("overflow") == "hidden")
            {
                var originalText = el.html();
                var availWidth = el.width();
                var availHeight = el.height();
                var MoreLessTag;
                if (moreText)
                {
                	if (txtOnClick == '')
					{
						enableUpdating = true;
						MoreLessTag = " <a class='MoreLessTag' href='#' >" + moreText + "</a>";
					}
					else
					{
						MoreLessTag = "<div style=\"clear: both;\"><br /><a href=\"#\" onClick=\"" + txtOnClick + "\">" + moreText + "</a></div>";
					}
                }
                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 + "&hellip;" + 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 + "&hellip;" + 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)
                {
					if (txtOnClick == '')
					{
						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, txtOnClick);
                        }
                    });
                }
            }
        });
    };
})(jQuery);
