/**
 * 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.';
        };
      };
      
      var text = $this.html().split(' ');
      
      var counter = 0;
      $this.html(text[counter++]);
      
      var addWords = true;
      while(addWords)
      {  
        if(text[counter] != null)
        {
          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);
