// Create a self-invoking anonymous function. That way, 
// we're free to use the jQuery dollar symbol anywhere within.
(function($) {

// We name our plugin "newscroll". When creating our function, 
// we'll allow the user to pass in a couple of parameters.
$.fn.newsScroll = function(options) {
  
  // For each item in the wrapped set, perform the following. 
  return this.each(function() {  
    
    var
      // Caches this - or the ul widget(s) that was passed in.
      //  Saves time and improves performance.
      $this = $(this), 
      
      // If the user doesn't pass in parameters, we'll use this object. 
      defaults = {
        speed: 400, // How quickly should the items scroll?
        delay: 3000, // How long a rest between transitions?
        list_item_height: $this.children('li').outerHeight() // How tall is each list item? If this parameter isn't passed in, jQuery will grab it.
       },
        // Create a new object that merges the defaults and the 
        // user's "options".  The latter takes precedence.
      settings = $.extend({}, defaults, options);
     
    // This sets an interval that will be called continuously.
    setInterval(function() {
          // Get the very first list item in the wrapped set.
          $this.children('li:first')
              // Animate it
              .animate({ 
                marginTop : '-' + settings.list_item_height, // Shift this first item upwards.
                 opacity: 'hide' }, // Fade the li out.
                 
                 // Over the course of however long is 
                 // passed in. (settings.speed)
                 settings.speed, 
                 
                 // When complete, run a callback function.
                 function() {
                   
                   // Get that first list item again. 
                 $this.children('li:first')
                      .appendTo($this) // Move it the very bottom of the ul.
                      
                      // Reset its margin top back to 0. Otherwise, 
                      // it will still contain the negative value that we set earlier.
                      .css('marginTop', 0) 
                      .fadeIn(300); // Fade in back in.
               }
            ); // end animate
     }, settings.delay); // end setInterval
    });
}

})(jQuery);
