//ellipsis plugin http://devongovett.wordpress.com/2009/04/06/text-overflow-ellipsis-for-firefox-via-jquery/ + comments + custom mods
(function($) {
	$.fn.ellipsis = function(lines, enableUpdating, moreText, lessText) {
		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) {
					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 + "&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) {
					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);
