class MultiTween
{
	get tweenValue() { return this.currentTween.tweenValue; }
	get MaxTime() { return this.currentTween.MaxTime; }
	set MaxTime(value) { this.currentTween.MaxTime = value; }
	pause()
	{
		this.currentTween.pause();
	}
	resume()
	{
		this.currentTween.resume();
	}
	get isPaused() { return this.currentTween.isPaused; }
	constructor(finish, update)
	{
		if (finish === undefined) finish = null;
		if (update === undefined) update = null;
		
		this.active = false;
		this.onFinish = finish;
		this.onUpdate = update;
		
		this.currentTween = new SimpleTween();
		this.currentTween.onFinish = this.internalOnFinish;
		
		this.tweens = [];
		this.currentTweenIndex = 0;
		this.loop = false;
	}
	
	addSimpleTween(tweenFunc, start, end, time, toInt /* = false*/)
	{
		if (toInt === undefined) toInt = false;
		this.addSimpleTweenAt(this.tweens.length, tweenFunc, start, end, time, toInt);
	}

	addSimpleTweenAt(index, tweenFunc, start, end, time, toInt /* = false*/)
	{
		if (toInt === undefined) toInt = false;
		
		this.tweens.splice(index, 0, { tweenFunc: tweenFunc, start: start, end: end, time: time, toInt: toInt });
		if (this.active && index <= this.currentTweenIndex)
		{
			this.currentTweenIndex++;
		}
	}

	clear()
	{
		this.stop();
		this.tweens.length = 0;
	}

	start(tweenIndex /* = 0*/)
	{
		if (tweenIndex === undefined) tweenIndex = 0;
		this.active = true;
		if (this.tweens.length == 0)
		{
			this.active = false;
			if (this.onFinish != null) this.onFinish();
		}
		else
		{
			this.setupTween(tweenIndex);
		}
	}

	setupTween(tweenIndex)
	{
		this.currentTweenIndex = tweenIndex % this.tweens.length;
		var info = this.tweens[currentTweenIndex];
		this.currentTween.init(this.internalOnUpdate, info.tweenFunc, info.start, info.end, info.time, info.toInt);
	}

	internalOnUpdate(val)
	{
		if (this.onUpdate != null) this.onUpdate(val);
	}

	internalOnFinish()
	{
		if (this.currentTweenIndex + 1 >= this.tweens.length)
		{
			if (!this.loop)
			{
				this.active = false;
				if (this.onFinish != null) this.onFinish();
				return;
			}
		}

		this.setupTween(this.currentTweenIndex + 1);
	}

	stop()
	{
		if (this.active)
		{
			this.currentTween.stop();
			this.currentTween.onFinish = this.internalOnFinish;

			this.active = false;
			this.onFinish = null;
			this.onUpdate = null;
		}
	}

	forceUpdateCall()
	{
		if (this.active && this.currentTween != null)
		{
			this.currentTween.forceUpdateCall();
		}
	}
}