Engine.DialogTransitionerExpand = class
{
	constructor(dialog /*Dialog*/)
	{
        this.active = false;
        this.dialog = dialog;

		this.dontSettle
		this.waiter = new CountWaiter(CountWaiterStatics.CountWaiterMode.WaitForGo);
		this.sx = new Engine.SimpleTween();
		this.sy = new Engine.SimpleTween();
		this.dx = new Engine.SimpleTween();
		this.dy = new Engine.SimpleTween();
		this.popInTime = 0.3;
		this.startX = -1;
		this.startY = -1;
		this.endX = -1;
		this.endY = -1;
		this.enter
	}

	setValues(startX /*float*/, startY /*float*/, endX /*float*/, endY /*float*/, dontSettle /*bool*/)
	{
		if (dontSettle === undefined) dontSettle = false;
		this.dontSettle = dontSettle;
		this.popInTime = dontSettle ? 0.3 : 0.2;
		if (endX != -1)
		{
			this.endX = endX;
			this.endY = endY;
		}
		
		this.startX = startX;
		this.startY = startY;
	}

	transitionOut(finishHide /*Action*/)
	{
		this.enter = false;
		this.transition(() => finishHide());
	}

	transitionIn(finishSlide /*Action*/)
	{
		if (this.startX == -1)
		{
			this.setValues(EngineSettings.screenWidth / 2, EngineSettings.screenHeight / 2, EngineSettings.screenWidth / 2, EngineSettings.screenHeight / 2);
		}
		this.enter = true;
		this.transition(() => finishSlide());
	}

	transition(callback /*Action*/)
	{
		this.active = true;
		
		this.sx.stop();
		this.sy.stop();
		this.dx.stop();
		this.dy.stop();
		
		if (this.enter)
		{
			this.dialog.scale.x = 0;
			this.dialog.scale.y = 0;
		}
		
		if (this.enter)
		{
			this.sx.init((v) => { this.dialog.scale.x = v; }, Engine.SimpleTween.sineWaveIn, 0.0, 1.0, this.popInTime, false);
			this.sy.init((v) => { this.dialog.scale.y = v; }, Engine.SimpleTween.sineWaveIn, 0.0, 1.0, this.popInTime, false);
			this.dx.init((v) => { this.dialog.x = v; }, Engine.SimpleTween.sineWaveIn, this.startX, this.endX, this.popInTime, false);
			this.dy.init((v) => { this.dialog.y = v; }, Engine.SimpleTween.sineWaveIn, this.startY, this.endY, this.popInTime, false);
		}
		else
		{
			this.sx.init((v) => { this.dialog.scale.x = v; }, Engine.SimpleTween.easeLinear, 1.0, 0.0, this.popInTime, false);
			this.sy.init((v) => { this.dialog.scale.y = v; }, Engine.SimpleTween.easeLinear, 1.0, 0.0, this.popInTime, false);
			this.dx.init((v) => { this.dialog.x = v; }, Engine.SimpleTween.easeLinear, this.endX, this.startX, this.popInTime, false);
			this.dy.init((v) => { this.dialog.y = v; }, Engine.SimpleTween.easeLinear, this.endY, this.startY, this.popInTime, false);
		}
		
		this.waiter.init(() => { this.active = false; if (callback != null) callback(); });
		
		this.waiter.waitMany(4);
		this.sx.onFinish = () => { this.waiter.waitDone(); };
		this.sy.onFinish = () => { this.waiter.waitDone(); };
		this.dx.onFinish = () => { this.waiter.waitDone(); };
		this.dy.onFinish = () => { this.waiter.waitDone(); };
		this.waiter.go();
	}

	getTargetPosition()
	{
		return [endX, endY];
	}
}