<?xml version="1.0" encoding="utf-8"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" initialize="initLC()" width="800" >

	<mx:Script>
	<![CDATA[
		import mx.controls.Label;
		import mx.core.UIComponent;

		private var results:UIComponent;
		private var contButton:Button;


		private var isConnected:Boolean = false;

		private var connection:LocalConnection;
		private var commandconnection:LocalConnection;

		private var digits:Array = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];

		private function initLC():void
		{
			for (var i:int = 0; i < 16; i++)
			{
				for (var j:int = 0; j < 16; j++)
				{
					byteTable[digits[i] + digits[j]] = i * 16 + j;
				}
			}
			percentWidth = 100;
			percentHeight = 100;

			connection = new LocalConnection();
			connection.allowDomain("*");
			connection.client = this;

			commandconnection = new LocalConnection();
			commandconnection.allowDomain("*");
			commandconnection.addEventListener(StatusEvent.STATUS, statusHandler);

			connect();
		}

		private function connect():void
		{
			try
			{
				connection.connect("_ImageDiffer");
			}
			catch (e:Error)
			{
				trace("connection failed");
			}
		}

		private function statusHandler(event:Event):void
		{
			isConnected=true;
		}

		private var sbd:BitmapData;
		private var sba:ByteArray;
		[Bindable] private var scriptName:String = "";
		[Bindable] private var testName:String = "";
		// public function startScreenData(w:int, h:int, length:int):void
		public function startScreenData(w:int, h:int, length:int, name:String, script:String):void
		{
			testName=name;
			scriptName=script;
			pbhb.visible = true;
			pb.maximum = length;
			pb.setProgress(0, length);
			sba = new ByteArray();
			sbd = new BitmapData(w, h);
		}
		public function addScreenData(s:String):void
		{
			toByteArray(sba, s);
			pb.setProgress(sba.position, pb.maximum);
		}

		private var bbd:BitmapData;
		private var bba:ByteArray;
		public function startBaseData(w:int, h:int, length:int):void
		{
			pb.visible = true;
			pb.maximum = length;
			pb.setProgress(0, length);
			bba = new ByteArray();
			bbd = new BitmapData(w, h);
		}
		public function addBaseData(s:String):void
		{
			toByteArray(bba, s);
			pb.setProgress(bba.position, pb.maximum);
		}

		public function compareBitmaps():void
		{

			init();
			pbhb.visible = false;
			var bm1:Bitmap = new Bitmap();
			var bm2:Bitmap = new Bitmap();
			sba.position = 0;
			bba.position = 0;
			sbd.setPixels(sbd.rect, sba);
			bbd.setPixels(bbd.rect, bba);
			bm1.bitmapData = sbd;
			bm2.bitmapData = bbd;
			image1.load(bm1);
			image2.load(bm2);
			image1.scaleX = 1;
			image1.scaleY = 1;
			image2.scaleX = 1;
			image2.scaleY = 1;
			canvas1.width = sbd.width;
			canvas1.height = sbd.height;
			canvas2.width = bbd.width;
			canvas2.height = bbd.height;

			doCompare(true);
		}

		private var byteTable:Object = new Object();

		private function toByteArray(ba:ByteArray, s:String):void
		{
			var arr:Array = s.split(",");

			var n:int = arr.length;
			for (var i:int = 0; i < n; i++)
			{
				var b:String = arr[i];
				var byte:int = byteTable[b];
				ba.writeByte(byte);
			}
		}

		public function doCompare(cont:Boolean = false):void
		{
			
			var bm1:BitmapData = new BitmapData(image1.content.width, image1.content.height);
			bm1.draw(image1.content, new Matrix());

			var bm2:BitmapData = new BitmapData(image2.content.width, image2.content.height);
			bm2.draw(image2.content, new Matrix());

			if (results) {
				canvas3.removeChild(results);
			}

			if (contButton) 
			{ 
				removeChild(contButton);

			}

			var cmp:Object = bm1.compare(bm2);
			var label:Label;

			if (cmp == 0)
			{
				results = label = new Label();
				label.text = "Same";
				label.validateNow();
				canvas3.addChild(results);
				canvas3.width = results.width;
				canvas3.height = results.height;
				if (cont)
				{
					contButton = new Button();
					contButton.label = "Continue";
					addChild(contButton);
					contButton.addEventListener("click", continueHandler);
				}
			}
			else if (cmp == -3)
			{
				results = label = new Label();
				label.text = "Widths are Different: " + image1.content.width + " vs " + image2.content.width;
				label.validateNow();
				canvas3.addChild(results);
				canvas3.width = results.width;
				canvas3.height = results.height;
				if (cont)
				{
					contButton = new Button();
					contButton.label = "Continue";
					addChild(contButton);
					contButton.addEventListener("click", continueHandler);
				}
			}
			else if (cmp == -4)
			{
				results = label = new Label();
				label.text = "Heights are Different: " + image1.content.height + " vs " + image2.content.height;
				label.validateNow();
				canvas3.addChild(results);
				canvas3.width = results.width;
				canvas3.height = results.height;
				if (cont)
				{
					contButton = new Button();
					contButton.label = "Continue";
					addChild(contButton);
					contButton.addEventListener("click", continueHandler);
				}
			}
			else
			{
				results = new UIComponent();
				var bm:Bitmap = new Bitmap();
				results.addChild(bm);
				bm.bitmapData = BitmapData(cmp);
				results.width = image1.content.width;
				results.height = image1.content.height;
				canvas3.addChild(results);
				canvas3.width = results.width;
				canvas3.height = results.height;
				results.graphics.clear();
				results.graphics.beginFill(bg.selectedColor);
				results.graphics.drawRect(0, 0, results.width, results.height);
				results.graphics.endFill();
				if (cont)
				{
					contButton = new Button();
					contButton.label = "Continue";
					addChild(contButton);
					contButton.addEventListener("click", continueHandler);
				}
			}

		}

		private function continueHandler(event:Event):void
		{
			if (results)
			{
				results.graphics.clear();
				canvas1.width = 0;
				canvas1.height = 0;
				canvas2.width = 0;
				canvas2.height = 0;
				canvas3.width = 0;
				canvas3.height = 0;
			}

			commandconnection.send("_ImageDifferCommands", "keepGoing");
		}
		
		private function bgChanged():void
		{
			if (results)
			{
				results.graphics.clear();
				results.graphics.beginFill(bg.selectedColor);
				results.graphics.drawRect(0, 0, results.width, results.height);
				results.graphics.endFill();
			}
		}

		private function getPixel(target:UIComponent, x:int, y:int, lbl:Label, bg:UIComponent):void
		{
			var pt:Point = new Point(x, y);
			var screenBits:BitmapData = new BitmapData(target.width, target.height);
			screenBits.draw(target, new Matrix(1, 0, 0, 1, 0, 0));

			var clr:uint = screenBits.getPixel(pt.x, pt.y);
			var s:String = clr.toString(16);
			while (s.length < 6)
			{
				s = "0" + s;
			}
			lbl.text = s.toUpperCase();
			bg.graphics.beginFill(clr);
			bg.graphics.drawRect(0, 0, bg.width, bg.height);
			bg.graphics.endFill();
		}

		private function pixelTracking():void
		{
			if (cb.selected)
				systemManager.addEventListener("mouseMove", pixelTracker);
			else
				systemManager.removeEventListener("mouseMove", pixelTracker);
		}

		private function pixelTracker(event:MouseEvent):void
		{
			if (image1.contains(event.target as DisplayObject))
			{
				updatePixels(image1, event.localX, event.localY, "1");
			}
			else if (image2.contains(event.target as DisplayObject))
			{
				updatePixels(image2, event.localX, event.localY, "2");
			}
			else if (results && results.contains(event.target as DisplayObject))
			{
				updatePixels(results, event.localX, event.localY, "3");
			}
		}

		private function updatePixels(target:UIComponent, x:Number, y:Number, ui:String):void
		{
			var nsx:NumericStepper = this["img" + ui + "x"];
			var nsy:NumericStepper = this["img" + ui + "y"];
			nsx.value = x;
			nsy.value = y;
			var lbl:Label = this["pixel" + ui];
			var bg:UIComponent = this["bg" + ui];
			getPixel(target, x, y, lbl, bg);
		}

		private function sizeCanvas1():void
		{
			image1.scaleX = 1;
			image1.scaleY = 1;
			canvas1.width = image1.content.width;
			canvas1.height = image1.content.height;
		}

		private function sizeCanvas2():void
		{
			image2.scaleX = 1;
			image2.scaleY = 1;
			canvas2.width = image2.content.width;
			canvas2.height = image2.content.height;
		}

		private function zoomit():void
		{
			image1.scaleY = image1.scaleX = zoom.value;
			image1.validateNow();
			image2.scaleY = image2.scaleX = zoom.value;
			image2.validateNow();
			results.scaleY = results.scaleX = zoom.value;
			results.validateNow();
			if (canvas1.width < 100)
			{
				canvas1.width = Math.min(image1.width, 100);
				canvas1.height= Math.min(image1.height, 100);
				canvas2.width = Math.min(image2.width, 100);
				canvas2.height= Math.min(image2.height, 100);
				canvas3.width = Math.min(results.width, 100);
				canvas3.height= Math.min(results.height, 100);
			}
		}
	]]>
	</mx:Script>

	<mx:HBox id="pbhb" visible="false">
		<mx:Label text="receiving data..." />
		<mx:ProgressBar id="pb" mode="manual" width="400" />		
	</mx:HBox>
	<mx:HBox id="testCaseLabel" visible="true">
		<mx:Label text="{scriptName} {testName}" />
	</mx:HBox>
	<mx:HBox>
		<mx:VBox>
			<mx:HBox>
				<mx:Label text="image 1" />
				<mx:TextInput id="image1Name" />
				<mx:Button label="load" click="image1.source=image1Name.text" />
			</mx:HBox>
		</mx:VBox>
		<mx:Spacer width="100" />
		<mx:VBox>
			<mx:HBox>
				<mx:Label text="image 2" />
				<mx:TextInput id="image2Name" />
				<mx:Button label="load" click="image2.source=image2Name.text" />
			</mx:HBox>
		</mx:VBox>
	</mx:HBox>
	<mx:Button label="compare" click="compareBitmaps()" />
	<mx:HBox>
		<mx:VBox>
			<mx:Canvas id="canvas1" minHeight="0" minWidth="0" >
				<mx:Image id="image1" complete="sizeCanvas1()" />
			</mx:Canvas>
			<mx:HBox>
				<mx:Label text="x" />
				<mx:NumericStepper id="img1x" width="60" maximum="4000" />
				<mx:Label text="y" />
				<mx:NumericStepper id="img1y" width="60" maximum="4000" />
				<mx:Button label="get pixel" click="getPixel(image1, img1x.value, img1y.value, pixel1, bg1)" />
				<mx:Label id="pixel1" />
				<mx:UIComponent id="bg1" width="16" height="16" />
			</mx:HBox>
		</mx:VBox>
		<mx:Spacer width="50" />
		<mx:VBox>
			<mx:Canvas id="canvas2" minHeight="0" minWidth="0" > 
				<mx:Image id="image2" complete="sizeCanvas2()" />
			</mx:Canvas>
			<mx:HBox>
				<mx:Label text="x" />
				<mx:NumericStepper id="img2x" width="60" maximum="4000" />
				<mx:Label text="y" />
				<mx:NumericStepper id="img2y" width="60" maximum="4000" />
				<mx:Button label="get pixel" click="getPixel(image2, img2x.value, img2y.value, pixel2, bg2)" />
				<mx:Label id="pixel2" />
				<mx:UIComponent id="bg2" width="16" height="16" />
			</mx:HBox>
		</mx:VBox>
	</mx:HBox>
	<mx:HBox>
		<mx:CheckBox id="cb" label="Pixel Reading" click="pixelTracking()" />
		<mx:Label text="Zoom" />
		<mx:NumericStepper id="zoom" minimum="1" change="zoomit()" />
		<mx:Label text="background" />
		<mx:ColorPicker id="bg" change="bgChanged();" />
	</mx:HBox>
	<mx:Canvas id="canvas3" minHeight="0" minWidth="0" />
	<mx:HBox>
		<mx:Label text="x" />
		<mx:NumericStepper id="img3x" width="60" maximum="4000" />
		<mx:Label text="y" />
		<mx:NumericStepper id="img3y" width="60" maximum="4000" />
		<mx:Button label="get pixel" click="getPixel(results, img3x.value, img3y.value, pixel3, bg3)" />
		<mx:Label id="pixel3" />
		<mx:UIComponent id="bg3" width="16" height="16" />
	</mx:HBox>

</mx:Application>
