/**
 * Copyright (c) 2009 Bleau A/S (http://www.bleau.dk)
 **/

(function($){
/**
 * Scrolles a number of elements within the selected element at a given speed.
 * 
 * @param Object s (optional) Customize your elementScroller.
 * @option speed [7000] The speed in milliseconds it should take to scrollout an element
 * @option pause [0] The pause in milleseconds between one scrollout to another
 * @option pauseOnMouseOver [true] Should the animation pause when the mouse moves over it?
 * @option onmouseover [] Delegate which is called onmouseover
 * @option onmouseout [] Delegate which is called onmouseout
 * @option selectorForItem [.item] The selector used to specify the items within the elementScroller
 * @type jQuery
 * @name elementScroller
 * @author Sten Hougaard/www.bleau.dk
 * @version 1.0
 * @date 2009.04.22
 *
 * @example $('#presseoverblik').elementScroller({selectorForItem:'.rssItem'});
 * @desc Activates an elementScroller for the elements of the class "rssItem", within the element with the ID "presseoverblik".
 **/
 $.fn.elementScroller = function(options) { 
    var bFirst = true;
    var iNoOfItems;
    var aFeeds;
    
    // When mouse is moved over, current values for animation are saved here
    var iEndAtMilliseconds;
    var iScrolled; 
    var bOnHold = false;

    var defaults = {
     speed: 7000,   
     pause: 0,   
     fadeOutSpeed: 1200,   
     selectorForItem: '.item',
     pauseOnMouseOver: true,
     onmouseover: null,
     onmoueout: null
    };   
    var options = $.extend(defaults, options); 
 
    return this.each(function() {   
      var obj = $(this);
      if (typeof options.onmouseover=='function') {
        obj.bind('mouseover', function() {options.onmouseover.call(this, obj)});
      };
      if (typeof options.onmouseout=='function') {
        obj.bind('mouseout', function() {options.onmouseout.call(this, obj)});
      };
      if (options.pauseOnMouseOver) {
        obj.bind('mouseover', function() {
          obj.bOnHold = true;
          $(obj.aFeeds[0]).stop();
          obj.iScrolled = $(obj.aFeeds[0]).css('marginTop');
          obj.iScrolled = parseInt(obj.iScrolled.substr(obj.iScrolled.length-2));
        });
        obj.bind('mouseout', function() {
          obj.bOnHold = false;
          doAnimate(obj, obj.iEndAtMilliseconds-(new Date().getMilliseconds()));
        });
      };
      doAnimate(obj);
    });
      
  
    function doAnimate(obj, iNewSpeed) {
      obj.aFeeds = $(options.selectorForItem, obj);
      if (typeof iNewSpeed=='undefined') {
        if (bFirst) {
          iNoOfItems  = obj.aFeeds.length
          bFirst = false;
        } else {
          obj.append($(obj.aFeeds[0]).css('marginTop', '0px'));
          obj.aFeeds = $(options.selectorForItem, obj);
        }
      }
      var iHeight = $(obj.aFeeds[0]).outerHeight();
      obj.iEndAtMilliseconds = new Date().getMilliseconds()+options.speed;
      $(obj.aFeeds[0]).animate({marginTop: -iHeight+'px'}, (typeof iNewSpeed=='undefined') ? options.speed : iNewSpeed, function() {
        window.setTimeout(function() {doAnimate(obj)}, options.pause);
      });
    }
 };   
})(jQuery);