
// Mover classes
function MoveObj (obj, xStart, xEnd) {
	this.obj = obj;	
	this.xStart = xStart;
	this.xEnd = xEnd;
	this.x = obj.offsetLeft;
	this.offsetWidth = obj.offsetWidth;
}

function Mover (frame, objList, speed, finishFunc)
{
	this.timer = null;
	this.maxDelayMs = 50;
	this.changeDelayMs = 250;
	this.speedPixels = 4;
	this.objList = objList;
	this.time = Math.round ((1-Math.abs(speed))*this.maxDelayMs)+10; // 1 = 10 ms, 90 = 20 ms, 0 = 110 ms
	this.pixelOffs = Math.round(speed*this.speedPixels);
	this.finishFunc = finishFunc;
	this.speed = speed;
	this.oldSpeed = 0;
	this.targetSpeed = 0;
	this.speedOffs = 0;
	this.frame = frame;
	
	this.onMovingProgress = function () {
		var self = this;		
		for (var i=0;i<objList.length;i++) {
			var tmpObj = objList[i];
			tmpObj.x+=this.pixelOffs;
			tmpObj.obj.style.left=tmpObj.x+'px'; 
			if (this.pixelOffs<0) {
				if ((tmpObj.x+tmpObj.offsetWidth) < tmpObj.xStart) {
					tmpObj.x = tmpObj.xEnd;
					tmpObj.obj.style.left = tmpObj.x+'px'; 
				}
			}
			else		
			if (tmpObj.x >= tmpObj.xEnd) {
				tmpObj.x = tmpObj.xStart-tmpObj.offsetWidth;
				tmpObj.obj.style.left = tmpObj.x+'px'; 			
			}
		}
		if (this.speedOffs!=0) {
			this.speed+=this.speedOffs;
			if ((this.targetSpeed<this.oldSpeed) && (this.speed<=this.targetSpeed))
				this.speedOffs = 0;			
			if ((this.targetSpeed>this.oldSpeed) && (this.speed>=this.targetSpeed))
				this.speedOffs = 0;
			if (this.speed>1)
				this.speed=1;
			else
			if (this.speed<-1)
				this.speed=-1;
			this.oldSpeed = this.speed;
			// this.setSpeed (this.speed);
			this.pixelOffs = Math.round (this.speed*this.speedPixels);
		}
	}

	this.startMoving = function () {
		var self = this;	
		this.timer = setInterval (function () { self.onMovingProgress () }, this.time);
	}
	
	this.stopMoving = function () {
		if (this.timer) {
			clearInterval (this.timer);
			this.timer = null;
		}		
	}

	// -1, 1
	this.setDirection = function (direction) {
		this.speed = direction * Math.abs (this.speed);		
		this.pixelOffs = Math.round (this.speed*this.speedPixels);
	}
	
	// -1.0 ... 1.0
	this.setSpeed = function (speed) {
		var self = this;
		this.stopMoving ();
		this.speed = speed;
		this.pixelOffs = Math.round (this.speed*this.speedPixels);		
		this.time = Math.round ((1-Math.abs(speed))*this.maxDelayMs)+10;
		this.timer = setInterval (function () { self.onMovingProgress () }, this.time);
		// document.getElementById ("log").innerHTML="Speed = "+this.speed+" / Daly = "+this.time+"ms";
	}
	
	this.setTargetSpeed = function (speed) {
		this.oldSpeed = this.speed;
		var diff = speed - this.speed;		
		var f = this.changeDelayMs /  this.time;
		this.speedOffs = diff / f;		
		this.targetSpeed = speed;
		// document.getElementById ("log2").innerHTML="currentSpeed="+this.speed+",speedOffs="+this.speedOffs+",targetSpeed="+this.targetSpeed;
	}
	
	this.incSpeed = function () {
		var s = this.speed+0.05;
		if (s>1)
			s=1;
		this.setSpeed (s);
	}
	
	this.decSpeed = function () {
		var s = this.speed-0.05;
		if (s<-1)
			s=-1;
		this.setSpeed (s);
	}
}
