/*
Ϸ
ʾ:http://demos.mootools.net/Drag.Absolutely
  http://demos.mootools.net/Drag.Cart
  http://demos.mootools.net/DragDrop
*/
Drag.Move = new Class({

 //̳Drag
 Extends: Drag,

 options: {
  //ڷĶ
  droppables: [],
  //϶Χ
  container: false
 },

 //캯
 initialize: function(element, options){
  //øͬ
  arguments.callee.parent(element, options);
  //ȡڷĶ󼯺
  this.droppables = $$(this.options.droppables);
  this.container = $(this.options.container);
  if (this.container && $type(this.container) != 'element') this.container = $(this.container.getDocument().body);
  element = this.element;
  
  //ȡǰλʽ
  var current = element.getStyle('position');
  //ΪĬϵľ̬λ,ΪԶλ
  var position = (current != 'static') ? current : 'absolute';
  //ȡ
  if (element.getStyle('left') == 'auto' || element.getStyle('top') == 'auto') element.position(element.getPosition(element.offsetParent));
  
  //öλʽ,ȷelement϶
  element.setStyle('position', position);
  
  //onStart¼,addEventĵָΪڲ¼,ڱƳ
  this.addEvent('onStart', function(){
   this.checkDroppables();
  }, true);
 },

 //ʼ϶,ǸDragͬ
 start: function(event){
  //ָ
  if (this.container){
   var el = this.element, cont = this.container, ccoo = cont.getCoordinates(el.offsetParent), cps = {}, ems = {};

   //ȡpaddingmarginĸϵֵ
   ['top', 'right', 'bottom', 'left'].each(function(pad){
    cps[pad] = cont.getStyle('padding-' + pad).toInt();
    ems[pad] = el.getStyle('margin-' + pad).toInt();
   }, this);

   //õʵߴ
   var width = el.offsetWidth + ems.left + ems.right, height = el.offsetHeight + ems.top + ems.bottom;
   //϶Ƶֵ
   var x = [ccoo.left + cps.left, ccoo.right - cps.right - width];
   var y = [ccoo.top + cps.top, ccoo.bottom - cps.bottom - height];

   this.options.limit = {x: x, y: y};
  }
  arguments.callee.parent(event);
 },

 //ײ,ԭǼλǷڶڲ
 checkAgainst: function(el){
  //ȡָ꼰ߴֵ
  el = el.getCoordinates();
  //ȡǰλ
  var now = this.mouse.now;
  //жǷڶΧ
  return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top);
 },

 //ɷ
 checkDroppables: function(){
  //ȸײ˿ɷ,ȡһ
  var vered = this.droppables.filter(this.checkAgainst, this).getLast();
  //ǰɷĶͬϴε
  if (this.overed != overed){
   //ϴοɷ,onLeave뿪¼
   if (this.overed) this.fireEvent('onLeave', [this.element, this.overed]);
   //ڵǰɷ
   if (overed){
    //
    this.overed = overed;
    //onEnter¼
    this.fireEvent('onEnter', [this.element, overed]);
   } else {
    //ÿ
    this.overed = null;
   }
  }
 },

 //϶,Ǹͬ
 drag: function(event){
  //øͬ
  arguments.callee.parent(event);
  //ɷ鲻Ϊ,ÿƶʱײ
  if (this.droppables.length) this.checkDroppables();
 },

 //ֹͣ϶,Ǹͬ
 stop: function(event){
  //ɿʱٴμײ
  this.checkDroppables();
  //onDrop¼
  this.fireEvent('onDrop', [this.element, this.overed]);
  //ÿ
  this.overed = null;
  //øͬ
  return arguments.callee.parent(event);
 }

});

//Drag.MoveElementչʵ
Element.implement({

 //ʹϷŻ
 makeDraggable: function(options){
  return new Drag.Move(this, options);
 }

});


