
function Img2Brick_startBuild()
{
	
	if(isEventPending($Img2BrickSched))
		return;

	$Img2BrickX = 0;
	$Img2BrickY = getWord(Img2BrickGui_Image.getExtent(), 1) - 1;

	$Img2BrickMaxTrans = findMaxTransColor();
	$Img2BrickTrueBackgroundColor = Img2BrickGui_TrueBackgroundColor.getRealPixelColor(0, 0);

	Img2BrickGui_Scroll.hScrollBar = "alwaysOff";
	Img2BrickGui_Scroll.vScrollBar = "alwaysOff";

	canvas.popDialog(Img2BrickGui);
	canvas.pushDialog(Img2BrickGui);

	if($Img2Brick::ResY > 257 && $Img2BrickY >= 257)
	{
		%posY = 257 - $Img2BrickY;
		%posY -= 1;

		Img2BrickGui_BackGroundColor.position = "0" SPC %posY;
	}

	Img2BrickGui_Blocker.setVisible(1);
	
	%pixel = Img2BrickGui_Image.getRealPixelColor($Img2BrickX, $Img2BrickY);

	if(%pixel $= $Img2BrickTrueBackgroundColor)
	{
		if($Img2Brick::ExcludeBackground)
			%skipBrick = true;

		%pixel = Img2BrickGui_TrueBackgroundColorOverlay.color;
	}

	%pixel = setWord(%pixel, 0, firstWord(%pixel) / 255);
	%pixel = setWord(%pixel, 1, getWord(%pixel, 1) / 255);
	%pixel = setWord(%pixel, 2, getWord(%pixel, 2) / 255);
	%pixel = setWord(%pixel, 3, getWord(%pixel, 3) / 255);

	Img2BrickGui_ScanIndicatorX.setVisible(1);
	Img2BrickGui_ScanIndicatorX.position = "0" SPC $Img2BrickX;
	Img2BrickGui_ScanIndicatorX.setExtent("1" SPC $Img2Brick::ResY - 1);

	Img2BrickGui_ScanIndicatorY.setVisible(1);
	Img2BrickGui_ScanIndicatorY.position = "0" SPC $Img2BrickY + 1;
	Img2BrickGui_ScanIndicatorY.setExtent($Img2Brick::ResX SPC "1");

	if(%skipBrick)
	{
		if(!$Img2Brick::Style) //Tall
			commandToServer('useSprayCan', $Img2BrickMaxTrans);
	}

	else
	{
		commandToServer('useSprayCan', findClosestColor(%pixel));
	}

	if(!%skipBrick || (%skipBrick && !$Img2Brick::Style))
		commandToServer('plantBrick');

	$Img2BrickPlantedCount = 1;

	Img2BrickGui_Progress.setText("<just:center><font:impact:24>Bricks planted:" SPC $Img2BrickPlantedCount @ "/" @ firstWord(Img2BrickGui_Image.getExtent()) * getWord(Img2BrickGui_Image.getExtent(), 1) @ ".\nEstimated time remaining:" SPC Img2BrickGui_getTimeEstimate() @ ".");

	$Img2Brick::StartTime = $Sim::Time;
	$Img2Brick::PauseTime = 0;

	Img2Brick_buildLoop();
}

function Img2Brick_abortBuild(%confirm)
{
	if(%confirm) //End
	{
		if(!HUD_PaintActive.isVisible())
			useSprayCan(1);

		useBricks(1);

		Img2BrickGui_Scroll.hScrollBar = "alwaysOn";
		Img2BrickGui_Scroll.vScrollBar = "alwaysOn";

		canvas.popDialog(Img2BrickGui);
		canvas.pushDialog(Img2BrickGui);

		Img2BrickGui_BackGroundColor.position = "0 1";

		Img2BrickGui_ScanIndicatorX.setVisible(0);
		Img2BrickGui_ScanIndicatorY.setVisible(0);

		Img2BrickGui_Blocker.setVisible(0);
		Img2BrickGui_OkBtn.setVisible(0);
		Img2BrickGui_AbortBtn.setVisible(1);
		Img2BrickGui_ConfirmAbortBtn.setVisible(0);
		Img2BrickGui_ResumeBtn.setVisible(0);
	}

	else //Pause
	{
		$Img2Brick::PauseStart = $Sim::Time;

		cancel($Img2BrickSched);

		Img2BrickGui_AbortBtn.setVisible(0);
		Img2BrickGui_OkBtn.setVisible(0);
		Img2BrickGui_ConfirmAbortBtn.setVisible(1);
		Img2BrickGui_ResumeBtn.setVisible(1);
	}
}

function Img2Brick_resumeBuild()
{
	$Img2Brick::PauseTime += $Sim::Time - $Img2Brick::PauseStart;

	Img2Brick_buildLoop();

	Img2BrickGui_AbortBtn.setVisible(1);
	Img2BrickGui_OkBtn.setVisible(0);
	Img2BrickGui_ConfirmAbortBtn.setVisible(0);
	Img2BrickGui_ResumeBtn.setVisible(0);
}

function Img2Brick_buildLoop()
{
	cancel($Img2BrickSched);

	if(!isObject(serverConnection))
	{
		Img2Brick_abortBuild();

		return;
	}

	if($Img2BrickX >= firstWord(Img2BrickGui_Image.getExtent()) - 1)
	{
		$Img2BrickX = 0;
		commandToServer('superShiftBrick', 0, (firstWord(Img2BrickGui_Image.getExtent()) - 1), 0);

		Img2BrickGui_ScanIndicatorY.position = "0" SPC $Img2BrickY;

		$Img2BrickY--;

		if($Img2Brick::Style) //Flat
		{
			commandToServer('superShiftBrick', 1, 0, 0);
		}

		else //Tall
		{
			commandToServer('superShiftBrick', 0, 0, 1);
		}
	}

	else
	{
		$Img2BrickX++;
		commandToServer('superShiftBrick', 0, -1, 0);
		%shiftIndicatorX = true;
	}

	if($Img2BrickY < 0)
	{
		Img2Brick_finishedBuild();

		return;
	}

	%posX = 0;
	%posY = 1;

	if($Img2Brick::ResX > 474 && $Img2BrickX >= 474)
	{
		%posX = 474 - $Img2BrickX;
		%posX -= 1;
	}

	if($Img2Brick::ResY > 257 && $Img2BrickY >= 257)
	{
		%posY = 257 - $Img2BrickY;
		%posY -= 1;
	}

	else if($Img2BrickY < 257 && restWords(Img2BrickGui_BackGroundColor.position) < 1)
	{
		%posY = restWords(Img2BrickGui_BackGroundColor.position) + 1;
	}

	Img2BrickGui_BackGroundColor.position = %posX SPC %posY;

	%pixel = Img2BrickGui_Image.getRealPixelColor($Img2BrickX, $Img2BrickY);

	if(%pixel $= $Img2BrickTrueBackgroundColor)
	{
		if($Img2Brick::ExcludeBackground)
			%skipBrick = true;

		%pixel = Img2BrickGui_TrueBackgroundColorOverlay.color;
	}

	%pixel = setWord(%pixel, 0, firstWord(%pixel) / 255);
	%pixel = setWord(%pixel, 1, getWord(%pixel, 1) / 255);
	%pixel = setWord(%pixel, 2, getWord(%pixel, 2) / 255);
	%pixel = setWord(%pixel, 3, getWord(%pixel, 3) / 255);

	if(%shiftIndicatorX)	
	{
		Img2BrickGui_ScanIndicatorX.position = $Img2BrickX SPC "0";
		Img2BrickGui_ScanIndicatorX.setExtent("1" SPC $Img2BrickY + 1);
	}

	if(%skipBrick)
	{
		if(!$Img2Brick::Style) //Tall
			commandToServer('useSprayCan', $Img2BrickMaxTrans);
	}

	else
	{
		commandToServer('useSprayCan', findClosestColor(%pixel));
	}

	if(!%skipBrick || (%skipBrick && !$Img2Brick::Style))
		commandToServer('plantBrick');

	$Img2BrickPlantedCount++;

	$Img2BrickSched = schedule(1, 0, Img2Brick_buildLoop);

	Img2BrickGui_Progress.setText("<just:center><font:impact:24>Bricks planted:" SPC addCommaR($Img2BrickPlantedCount) @ "/" @ addCommaR(firstWord(Img2BrickGui_Image.getExtent()) * getWord(Img2BrickGui_Image.getExtent(), 1)) @ ".\nEstimated time remaining:" SPC Img2BrickGui_getTimeEstimate() @ ".");
}

function Img2Brick_finishedBuild()
{
	if(!HUD_PaintActive.isVisible())
		useSprayCan(1);

	useBricks(1);

	Img2BrickGui_Scroll.hScrollBar = "alwaysOn";
	Img2BrickGui_Scroll.vScrollBar = "alwaysOn";

	Img2BrickGui.refresh = true;
	canvas.popDialog(Img2BrickGui);
	canvas.pushDialog(Img2BrickGui);

	Img2BrickGui_BackGroundColor.position = "0 1";

	Img2BrickGui_ScanIndicatorX.setVisible(0);
	Img2BrickGui_ScanIndicatorY.setVisible(0);

	Img2BrickGui_OkBtn.setVisible(1);
	Img2BrickGui_AbortBtn.setVisible(0);
	Img2BrickGui_ConfirmAbortBtn.setVisible(0);
	Img2BrickGui_ResumeBtn.setVisible(0);

	%time = ($Sim::Time - $Img2Brick::StartTime - $Img2Brick::PauseTime) * 1000;
	%seconds = %time / 1000 % 60;
	%minutes = %time / 1000 / 60 % 60;
	%hours = %time / 1000 / 60 / 60 % 24;

	if(%hours >= 1)
	{
		%doneTime = %hours @ ":";
	}

	if(%minutes < 10)
	{
		%minutes = "0" @ %minutes;
	}

	if(%seconds < 10)
	{
		%seconds = "0" @ %seconds;
	}

	%doneTime = %doneTime @ %minutes @ ":" @ %seconds;

	Img2BrickGui_Progress.setText("<just:center><font:impact:24>Bricks planted:" SPC $Img2BrickPlantedCount @ "/" @ firstWord(Img2BrickGui_Image.getExtent()) * getWord(Img2BrickGui_Image.getExtent(), 1) @ ".\nTime taken:" SPC %doneTime @ ".");
}

