Drag.Map=Drag.Base.extend({options:{droppables:[],container:false,overflown:[],mapsize:1,duration:1500},initialize:function(el,options){this.setOptions(options);this.element=$(el);this.droppables=$$(this.options.droppables);this.container=$(this.options.container);this.position={'element':this.element.getStyle('position'),'container':false};if(this.container)this.position.container=this.container.getStyle('position');if(!['relative','absolute','fixed'].contains(this.position.element))this.position.element='absolute';var top=this.element.getStyle('top').toInt();var left=this.element.getStyle('left').toInt();if(this.position.element=='absolute'&&!['relative','absolute','fixed'].contains(this.position.container)){top=$chk(top)?top:this.element.getTop(this.options.overflown);left=$chk(left)?left:this.element.getLeft(this.options.overflown)}else{top=$chk(top)?top:0;left=$chk(left)?left:0}this.element.setStyles({'top':top,'left':left,'position':this.position.element});this.fx=this.element.effects({duration:this.options.duration,transition:Fx.Transitions.Quart.easeOut});this.parent(this.element)},start:function(event){this.overed=null;this.parent(event)},locate:function(dx,y){var x=(-this.element.getStyle('left').toInt()/this.options.mapsize).round();switch(x){case 0:x=0;break;case 1:x=-(this.options.mapsize);break;case 2:x=-(this.options.mapsize*2);break}this.fx.start({'left':x-dx,'top':y})},drag:function(event){this.parent(event);var overed=this.out?false:this.droppables.filter(this.checkAgainst,this).getLast();if(this.overed!=overed){if(this.overed)this.overed.fireEvent('leave',[this.element,this]);this.overed=overed?overed.fireEvent('over',[this.element,this]):null}this.element.setStyles({'left':(this.element.getStyle('left').toInt()%this.options.mapsize)-this.options.mapsize});return this},checkAgainst:function(el){el=el.getCoordinates(this.options.overflown);var now=this.mouse.now;return(now.x>el.left&&now.x<el.right&&now.y<el.bottom&&now.y>el.top)},stop:function(){if(this.overed&&!this.out)this.overed.fireEvent('drop',[this.element,this]);else this.element.fireEvent('emptydrop',this);this.parent();return this}});
