function Movement(elem, intervalValue){ this.elem = elem; this.stepX = 0; this.stepY = 0; this.intervalValue = intervalValue ? intervalValue : Movement.defaultInterval; this.hasOwnTimer = intervalValue ? true : false; this.distance = false; this.moveSpace = false; this.STOP_ON_FIRST = true; this.onstart = new DOMEvent(); this.onstop = new DOMEvent(); this.refreshCount = 0; this.isMoving = false; this.onreach = new DOMEvent(); this.onreach.register( Movement.defaultOnReach.name, Movement.defaultOnReach.func.bind(this) ); this.init(); } Movement.prototype.init = function(){ this.Moveable = new moveable(this.elem, false); this.onmove = {}; this.onmove.register = function(name, func){ this.Moveable.onmove.register(name, func); }.bind(this); this.onmove.remove = function(name){ this.Moveable.onmove.remove(name); }.bind(this); if(this.hasOwnTimer){ this.Timer = new Timer(this.intervalValue); this.Timer.registerEvent( { name: "Movement", func: function(objMoveable){ objMoveable.moveBy(this.stepX, this.stepY); }, oThis: this, args: [this.Moveable] } ); }else{ if(Movement.mutualTimer){ Movement.mutualTimer.registerMovement(this); }else{ Movement.createMutualTimer(); Movement.mutualTimer.registerMovement(this); Movement.mutualTimer.start(); } } } Movement.prototype.start = function(){ this.onstart.fire(); this.isMoving = true; if(this.Timer){ this.Timer.start(); } } Movement.prototype.stop = function(){ this.onstop.fire(); this.isMoving = false; if(this.Timer){ this.Timer.clear(); } } Movement.prototype.toggle = function(){ if(this.isMoving){ this.stop(); }else{ this.start(); } } Movement.prototype.setSteps = function(x, y){ this.stepX = x ? x : 0; this.stepY = y ? y : 0; } Movement.prototype.setLimits2 = function(name, value, startValue){ this.Moveable.setLimits2(name, value, startValue); var PRESETS = moveable.LIMITS[name.toUpperCase()]; this[PRESETS.onless] = {}; this[PRESETS.onless].register = function(n, f, times){ this.Moveable[PRESETS.onless].register(n, f, times); }.bind(this); this[PRESETS.onmore] = {}; this[PRESETS.onmore].register = function(n, f, times){ this.Moveable[PRESETS.onmore].register(n, f, times); }.bind(this); } Movement.prototype.refreshLimits = function(){ this.Moveable.refreshLimits(); } Movement.prototype.moveTo = function(x, y, speed){ speed = speed ? speed : 3; var curLeft = this.Moveable.left; var curTop = this.Moveable.top; var nextLeft = x; var nextTop = y; var distX = nextLeft - curLeft; var distY = nextTop - curTop; var biggerDist = Math.abs(distX) > Math.abs(distY) ? distX : distY; var numOfSteps = Math.abs(Math.round(biggerDist / speed)); if(numOfSteps == 0){ return; } var stepX = distX / numOfSteps; var stepY = distY / numOfSteps; this.mt_stepCount = 0; this.mt_numOfSteps = numOfSteps; this.distY = distY; this.distX = distX; this.moveToX = nextLeft; this.moveToY = nextTop; this.setSteps(stepX, stepY); this.Moveable.movedToX = 0; this.Moveable.movedToY = 0; this.Moveable.onmove.remove('move-to'); this.Moveable.onmove.register( 'move-to', function(objMovement){ var STOP_X = false, STOP_Y = false; if(Math.abs(this.movedToX + this.moveX ) >= Math.abs(objMovement.distX)){ this.moveX = (Math.abs(objMovement.distX) - Math.abs(this.movedToX)) * this.moveX.signOf(); STOP_X = true; } if(Math.abs(this.movedToY + this.moveY ) >= Math.abs(objMovement.distY)){ this.moveY = (Math.abs(objMovement.distY) - Math.abs(this.movedToY)) * this.moveY.signOf(); STOP_Y = true; } this.movedToX += this.moveX; this.movedToY += this.moveY; objMovement.mt_stepCount++; if(STOP_X && STOP_Y){ //objMovement.stopMoveTo(); this.onaftermove.register( 'move-to-stop', function(){ this.onreach.fire(); }.bind(objMovement), 1 ); } }.bind(this.Moveable, this) ); if(!this.isMoving){ this.start(); } } Movement.prototype.stopMoveTo = function(){ this.Moveable.onmove.remove('move-to'); this.stop(); } Movement.defaultOnReach = { name: 'onreach', func: function(){ this.stopMoveTo(); } } Movement.mutualTimer = null; Movement.createMutualTimer = function(){ this.mutualTimer = new Timer(this.defaultIntervalValue); this.mutualTimer.movements = []; this.mutualTimer.registerMovement = function(objMovement){ this.movements.push(objMovement) } this.mutualTimer.unregisterMovement = function(counter){ this.movements.remove(counter); } this.mutualTimer.registerEvent( { name: "Movement", func: function(){ this.movements.each(function(mov){ if(mov.isMoving){ mov.Moveable.moveBy(mov.stepX, mov.stepY); } }); }, oThis: Movement.mutualTimer, args: [] } ); } Movement.defaultIntervalValue = 100;