//ƽĹЧ,ʾ:http://demos.mootools.net/Fx.Scroll
Fx.Scroll = new Class({

 //̳Fx
 Extends: Fx,

 options: {
  //ʱƫ
  offset: {'x': 0, 'y': 0},
  //ʱǷԶֹͣЧ
  wheelStops: true
 },

 initialize: function(element, options){
  //õĶ
  this.element = this.subject = $(element);
  //øͬ
  arguments.callee.parent(options);
  //Ϊ¼ṩȡĶ,дwheelStopsжӦû
  var cancel = this.cancel.bind(this, false);

  //ṩö,ɵǰĵbodyڵ
  if ($type(this.element) != 'element') this.element = $(this.element.getDocument().body);

  var stopper = this.element;
  
  //ùֹͣ
  if (this.options.wheelStops){
   //ڹʼǰӹ¼
   this.addEvent('onStart', function(){
    stopper.addEvent('mousewheel', cancel);
   }, true);
   //ڹƳ¼
   this.addEvent('onComplete', function(){
    stopper.removeEvent('mousewheel', cancel);
   }, true);
  }
 },

 //Ŀֵ
 set: function(){
  //ά
  var now = Array.flatten(arguments);
  //ָ
  this.element.scrollTo(now[0], now[1]);
 },

 //ݳʼֵֵͱĿֵ
 compute: function(from, to, delta){
  var now = [];
  //Rubyѭ,תΪfromtoǳΪ2
  (2).times(function(i){
   now.push(Fx.compute(from[i], to[i], delta));
  });
  return now;
 },

 //ʼ
 start: function(x, y){
  //Լ
  if (!this.check(x, y)) return this;
  //ȡߴ͹ߴ
  var ffsetSize = this.element.getSize(), scrollSize = this.element.getScrollSize();
  //ȡǰλ
  var scroll = this.element.getScroll(), values = {x: x, y: y};
  for (var z in values){
   //㵱ǰ귽ϵĿɹֵ
   var max = scrollSize[z] - offsetSize[z];
   //ṩĿֵ,֤ĿֵЧΧ
   if ($chk(values[z])) values[z] = ($type(valus[z]) == 'number') ? values[z].limit(0, max) : max;
   //ֱʹõǰλֵ
   else values[z] = scroll[z];
   //õƫ
   values[z] += this.options.offset[z];
  }
  //øFxͬ
  return arguments.callee.parent([scroll.x, scroll.y], [values.x, values.y]);
 },

 //,xλò
 toTop: function(){
  return this.start(false, 0);
 },

 //,yλò
 toLeft: function(){
  return this.start(0, false);
 },

 //ұ,yλò
 toRight: function(){
  return this.start('right', false);
 },

 //ײ,xλò
 toBottom: function(){
  return this.start(false, 'bottom');
 },

 //ָElementľλ
 toElement: function(el){
  //ȡelľֵ
  var position = $(el).getPosition(this.element);
  //ʼ
  return this.start(position.x, position.y);
 }

});

