function Movement(oMov, timer){
	this.Moveable = moveable.detectMoveable(oMov);
	this.stepX = 0;
	this.stepY = 0;
	this.timer = Timer.detectTimer(timer);
	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.onmove = DOMEvent.cloneEvent(this.Moveable.onmove, this);
	if(this.timer._MUTUAL){
		if(this.timer.registerMovement){
			this.timer.registerMovement(this);
		}else{	
			Movement.handleMutualTimer(this.timer);
			this.timer.registerMovement(this);
		}
	}else{
		this.timer.registerEvent(
		{
			name: "Movement",
			func: function(objMoveable){
				objMoveable.moveBy(this.stepX, this.stepY);
			},
			oThis: this,
			args: [this.Moveable]
		}
		);
	}
}
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.setLimits = function(type, value, startValue){
	this.Moveable.setLimits(type, value, startValue);
	var PRESETS = moveable.LIMITS[type];
	this[PRESETS.onless] = DOMEvent.cloneEvent(this.Moveable[PRESETS.onless], this);
	this[PRESETS.onmore] = DOMEvent.cloneEvent(this.Moveable[PRESETS.onmore], this);
}
Movement.prototype.unsetLimits = function(type){
	this.Moveable.unsetLimits(type);
}
Movement.prototype.resetLimits = function(type, value, startValue){
	this.Moveable.resetLimits(type, value, startValue);
}
Movement.prototype.setMoveSpace = function(X, Y, sX, sY){
	this.moveSpace = this.Moveable.setMoveSpace(X, Y, sX, sY);
	if(!this.onmovespacereach){
		this.onmovespacereach = DOMEvent.cloneEvent(this.Moveable.onmovespacereach, this);
	}
}
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.prototype.moveDistance = function(distance, direction, numOfSteps){
	this.distanceMoved = 0;
	this.Distance = distance;
	this.DistanceStep = this.Distance / numOfSteps;
	this.stepType = (direction == "left" || direction == "right" ) ? "X" : "Y";
	if(direction == 'left'){
		this.setSteps(-this.DistanceStep, 0);
	}else if(direction == 'right'){
		this.setSteps(this.DistanceStep, 0);
	}else if(direction == 'top'){
		this.setSteps(0, -this.DistanceStep);
	}else if(direction == 'bottom'){
		this.setSteps(0, this.DistanceStep);
	}
	this.onmove.register("distance-check", function(oM){
		var step_sign = oM["move" + this.stepType].signOf();
		var step = Math.abs(oM["move" + this.stepType]);
		if(this.distanceMoved + step >= this.Distance){
			var new_step = this.Distance - this.distanceMoved;
//			toConsole(new_step);
			oM["move" + this.stepType] = new_step * step_sign;
			oM.onaftermove.register("stop", function(){
				this.stop();
				this.onmove.remove("distance-check");
			}.bind(this), 1);
			step = new_step;
		}
		this.distanceMoved += step;

	}.bind(this, this.Moveable));
	this.start();
}
Movement.prototype.__name = "Movement";
Movement.prototype.toString = __toString;
Movement.defaultOnReach = {
	name: 'onreach',
	func: function(){
		this.stopMoveTo();
	}
}
Movement.mutualTimer = null;
Movement.handleMutualTimer = function(oTimer){
	oTimer.movements = [];
	oTimer.registerMovement = function(objMovement){
		this.movements.push(objMovement)
	}
	oTimer.registerEvent(
		{
			name: "Movement",
			func: function(){
				this.movements.each(function(mov){
					if(mov.isMoving){
						mov.Moveable.moveBy(mov.stepX, mov.stepY);
					}
				});
			},
			oThis: oTimer,
			args: []
		}
	);	
}