/**
 * 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);

      /* Readmore element */
      if(defaults.readMoreElement) {
        var readMoreElement = $this.find(defaults.readMoreElement).remove();

        if(readMoreElement.length == 0) {
          throw 'fhEllipses: Read more element with class \'' + defaults.readMoreElement + '\' does not exist\n Please check your function call.';
        }
      }

      /* If height is less then line-height x lines, return this */
      if($this.height() <= defaults.lineHeight * defaults.lines) {
        return $this;
      }

      var text = $this.html().replace('  ', ' ').split(' ');

      var counter = 0;
      $this.html(text[counter++] + ' ');

      var oldText = '';
      var addWords = true;

      while(addWords) {

        if(text[counter] != null){
          var newText = $this.html() + text[counter++] + ' ';

          if(defaults.readMoreElement) {
            $this.html(newText).append(readMoreElement.clone());
          }else{
            $this.html(newText + defaults.readMore);
          }

          if($this.height() > defaults.lineHeight * defaults.lines) {
            $this.html(oldText);
            addWords = false;
          }else {
            $this.html(newText);
          }
          oldText = newText;
        }else{
          addWords = false;
        };

      };

      if(defaults.readMoreElement) {
        $this.append(readMoreElement);
      }else{
        $this.html($this.html() + defaults.readMore);
      };

    });

  }

})(jQuery);
