﻿Element.addMethods({  
  getInnerText: function(element) {
    element = $(element);
    return element.innerText && !window.opera ? element.innerText
      : element.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g, ' ');
  }
});

var Truncate = function(els, o) {
	setTimeout(function() {
		var c = {
			lines: o.lines != undefined ? o.lines : 0,
			trail: o.trail != undefined ? o.trail : '...',
			separator: o.separator != undefined ? o.separator : ' ',
			offset: o.offset != undefined ? o.offset : 0,
			lineHeight: o.lineHeight != undefined ? o.lineHeight : 0,
			display: o.display != undefined ? o.display : undefined
		};
		
		els.each(function(e, eIndex) {
			var isInline = (o.display != undefined) ? o.display == 'inline' : e.getStyle('display') == 'inline';
			var lineHeight = Math.round(e.getStyle('line-height').replace('px', ''));	
			lineHeight = (isNaN(lineHeight)) ? o.lineHeight : lineHeight;

			var parent = (isInline) ? e.up() : e;
			
			var text = e.getInnerText();
			var title = text.split(c.separator);
			for(var i=0; i < title.length; i++) {
				title[i] = '<em>' + title[i] + '</em>'
			}
			e.update(title.join(' '))
			
			while(parent.getHeight() + c.offset > (lineHeight * c.lines)) {
				e.childElements().last().remove();
				e.childElements().last().insert(c.trail);
			}
			
			e.update(e.getInnerText());
		});
	}, 100);
}