/**
 * fhEllipses - Freshheads Ellipses
 *   http://www.freshheads.com
 *
 * Copyright (c) 2009 Freshheads
 * 
 * Built on top of the jQuery library
 *   http://jquery.com
 *
 * Usage:
 * $.fhEllipses({
 *   lines: 4,
 *   lineHeight: 16,
 *   readMore: '&#8230;',
 *   readMoreElement: {
 *     className: '',
 *     extraHeight: 0
 *   }
 * });

 * Authors: Gijs van Zon MA
 * Return: Object (this)
 * Params:
 *   lines: Int (4),
 *   lineHeight: Int (16),
 *   readMore: String ('&#8230;'),
 *   readMoreElement: Object ({
 *     className: String (''),
 *     extraHeight: Int (0)
 *   })
 */

(function($) {

  $.fn.fhEllipses = function(options) {
    
    var _this = this;
    
    var defaults = {
      lines: 4,
      lineHeight: 16,
      readMore: '&#8230;',
      readMoreElement: null
    }
    
    defaults = $.extend({}, defaults, options || {});
    
    return this.each(function () {
      var $this = $(this);
    
      if(defaults.readMoreElement) {
        var readMoreElement = $this.find(defaults.readMoreElement.className).remove();
        
        if(readMoreElement.length == 0) {
          throw 'fhEllipses: Read more element with class \'' + defaults.readMoreElement.className + '\' does not exist\n Please check your function call.';
        }
      }
      
      if($this.height() > defaults.lineHeight * defaults.lines + (defaults.readMoreElement?defaults.readMoreElement.extraHeight:0)) {
        
        var text = $this.html().split(' ');
        
        var counter = 0;
        $this.html(text[counter++]);
        
        var addWords = true;
        while(addWords) {
          
          if(text[counter]){
            var newText = $this.html() + ' ' + text[counter++];
            
            $this.html(newText + defaults.readMore);
            
            if(defaults.readMoreElement) {
              $this.append(readMoreElement);
            }
            
            if($this.height() > defaults.lineHeight * defaults.lines + (defaults.readMoreElement?defaults.readMoreElement.extraHeight:0)) {
              $this.html(oldText);
              addWords = false;
            }else {
              $this.html(newText);
            }
            var oldText = newText;
          }else{
            addWords = false;
          }
          
        };
        
        $this.html($this.html() + defaults.readMore);
        
        if(defaults.readMoreElement) {
          $this.append(readMoreElement);
        }
        
      }
      
    });
    
  }
  
})(jQuery);
