(function($) {
  $.fn.textSlide = function(options) {
      var elements = this.find("span");
      animate(elements, this);
  };

  function animate(elements, container) {
      var width = container.width();
      var height = container.height() - 60; // subtract font size
      var elm = getRandomElement(elements);
      var startPosition = getStartPosition(width, height, elm);
      var endPosition = getEndPosition(width, height, elm);
      slideIn(elm, startPosition, endPosition, elements, container);
  }

  function slideIn(obj, startPosition, endPosition, elements, container) {
      obj.css({ opacity: 0, top: startPosition.top, left: startPosition.left, fontSize: 30 });
      var intermediateStop = getIntermediateStopPosition(startPosition, endPosition);
      obj.animate({
          opacity: 0.7,
          fontSize: 60,
          left: intermediateStop.left,
          top: intermediateStop.top
      }, {
          step: function(now, fx) { },
          duration: 5000,
          easing: 'linear',
          complete: function() {
              slideOut(obj, endPosition, elements, container);
          }
      });
  }

  function slideOut(obj, endPosition, elements, container) {
      obj.animate({
          opacity: 0,
          fontSize: 40,
          left: endPosition.left,
          top: endPosition.top
      }, {
          step: function(now, fx) { },
          duration: 5000,
          easing: 'linear',
          complete: function() {
              window.setTimeout(function() { animate(elements, container); }, Math.floor(Math.random() * 5000));
          }
      });
  }

  function getRandomElement(elements) {
      var randomNumber = Math.floor(Math.random() * elements.length);
      return elements.eq(randomNumber);
  }

  function getStartPosition(containerWidth, containerHeight, elm) {
      return { left: -elm.width(), top: Math.floor(Math.random() * containerHeight) };
  }

  function getEndPosition(containerWidth, containerHeight, elm) {
      return { left: containerWidth + elm.width(), top: Math.floor(Math.random() * containerHeight) };
  }

  function getIntermediateStopPosition(startPosition, endPosition) {
      return {
          left: (startPosition.left + endPosition.left) / 2.7,
          top: (startPosition.top + endPosition.top) / 2
      }
  }
 
})(jQuery);

