(function($) { 
  $.fn.scrollHover = function(params) {
    var args = params || {};
    var t = args.target || {};
    
    //// traverse all nodes 
    this.each(function() {
      var timer;
      var num;
      var obj;
      
      obj = $(t);
      obj.css('left', 0);
      obj.css('position', 'absolute');
      $(this).css('overflow', 'hidden');
      
      var w = this.clientWidth;
      var start = -Math.round(w / 2);
      var end = Math.round(w / 2);
      
      // express a single node as a jQuery object 
      $(this).mousemove(function(e) {
        
        var x = -map((e.pageX - this.offsetLeft), 0, w, -7, 7);
        
        if(num != x)
          scrollRelative(x);
      });
      
      scrollRelative = function(amount) {
        num = amount;
        
        clearInterval(timer);
        timer = setInterval(move, 25);
        move();
      }
      
      move = function() {
        var left = parseInt(obj.css('left'));
        
        if(num < 0 && left < -obj.width())
          left = w;
        else if(num > 0 && left > w)
          left = -obj.width();
        
        var pxStr = (left + num) + 'px';
        
        obj.css('left', pxStr);
      }
      
      map = function(x, in_min, in_max, out_min, out_max) {
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
      }
      
      scrollRelative(-1);
      
    });
    
    // allow jQuery chaining 
    return this; 
  }; 
})(jQuery);
