﻿package Captions{
	
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.display.Sprite;
	import fl.data.DataProvider;
	import flash.net.FileReference;
	import flash.net.FileFilter;
	import flash.events.MouseEvent
	import flash.display.SimpleButton;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.utils.getDefinitionByName;
	import flash.geom.ColorTransform;
	import comp.textformatter.TextPropertiesComponent;
	import comp.textformatter.SizeSelector;
	import comp.transformTool.TransformTool;
	import flash.geom.Matrix;
	import flash.geom.Transform;
	import flash.display.BitmapData;
	import flash.display.Bitmap
	//import Captions.Debug;
	
	
	public class TextCaption extends MovieClip{
		
		private var formatterMc:MovieClip;
		private var xmlParams:XMLList;
		private var xmlConfig:XMLList;
		private var mainXMLConfig:XMLList;
		private var mcRef:MovieClip;
		private var fileRef:FileReference;
		private var mcCaption:MovieClip;
		private var txt:TextField;
		private var mcIcon:MovieClip;
		private var defaultTool:TransformTool;
		private var currTool:TransformTool;
		private var bmd:BitmapData;
		private var bmp:Bitmap;
		private var txtMatrix:Matrix;
		private var textHolder:MovieClip;
		private var imageMCMatrix:Matrix;
		private var mcIconMatrix:Matrix;
		private var mcCaptionMatrix:Matrix;
		
		public function TextCaption(){
			
		}
		
		public function setData(xml:XMLList, textMc:MovieClip){
			xmlParams = xml;
			formatterMc = textMc;
		}
		public function setConfig(xml:XMLList) {
			xmlConfig = xml[0].styles;
			mainXMLConfig = xml;
			
			/*var arrStyles:DataProvider = new DataProvider()
			var toSelectIndex:int = 0;
			mainXMLConfig = xml;
			
			for (var i = 0; i < xml.length(); i++)
			{
				arrStyles.addItem( { label:xml[i].@label, data:String(i+1) } );
				if (String(i) == xmlParams.@themeLabel) 
				{
					toSelectIndex = i;
					xmlConfig = xml[i].styles;
				}
				
			}
			
			themeCombo.dataProvider = arrStyles;
			themeCombo.selectedIndex = toSelectIndex;	*/
			
		}
		
		private function themeChanged(evt):void
		{
			xmlConfig = mainXMLConfig[evt.target.selectedIndex].styles;
			xmlParams.@themeLabel = evt.target.selectedIndex;
			var arrStyles:DataProvider = new DataProvider()
			var toSelectIndex:int = 0;

			for(var i=0; i<xmlConfig.length(); i++){
				arrStyles.addItem({label:xmlConfig[i].@label, data:xmlConfig[i].@movieclip});
				if (xmlConfig[i].@movieclip == xmlParams.@style) {
					toSelectIndex = i;
				}
			}
			styleCombo.dataProvider = arrStyles;
			styleCombo.selectedIndex = 0;
			styleCombo.dispatchEvent(new Event(Event.CHANGE))			
		}
		
		public function init(){
			mcRef = new MovieClip();
			
			imageOnOff.selected = toBoolean(xmlParams.image.@visible);
			
			setDefaultData();
			addEvents();
		}
		
		function toBoolean(str:String):Boolean{
			var res:Boolean = false;
			if(str.toLowerCase() == "true"){
				res = true;
			}
			return res;
		}
		
		private function addEvents(){
			formatterMc.addEventListener(TextPropertiesComponent.VALUECHANGED, fontValuesChanged);
			styleCombo.addEventListener(Event.CHANGE, captionStyleChanged)
			bgColorMc.addEventListener(Event.CHANGE, backgroundColorChanged);
			borderColorMc.addEventListener(Event.CHANGE, borderColorChanged);
			captionText.addEventListener(Event.CHANGE, captionTextChanged);			
			bgRequiredCB.addEventListener(MouseEvent.CLICK, applyBGColor);
			borderRequiredCB.addEventListener(MouseEvent.CLICK, applyBorderColor);

			browseBtn.addEventListener(MouseEvent.CLICK, browseHandler);
			//themeCombo.addEventListener(Event.CHANGE, themeChanged);

			imageOnOff.addEventListener(MouseEvent.CLICK, switchImageVisibility);
			
			formatterMc.sizeSelectorMc.addEventListener(SizeSelector.REMOVE_TRANSFORM, removeTransform);
			
			defaultTool.addEventListener(TransformTool.CONTROL_UP, transformUpdateHandler);
		}
		
		private function transformUpdateHandler(e:Event):void 
		{					
			var targetObject = e.target.target;
			trace(targetObject.name+"::::"+targetObject.height +"::::::" + e.target.height+":::"+e.target.name);
			if (targetObject.name.indexOf("textHolder") == 0)
			{
				txtMatrix = e.target.toolMatrix;
				xmlParams.text.@a = txtMatrix.a;
				xmlParams.text.@b = txtMatrix.b;
				xmlParams.text.@c = txtMatrix.c;
				xmlParams.text.@d = txtMatrix.d;
				xmlParams.text.@tx = txtMatrix.tx;
				xmlParams.text.@ty = txtMatrix.ty;				
			}
			else if(targetObject.name.indexOf("captionBG") == 0)
			{
				
				mcCaptionMatrix = e.target.toolMatrix;
				
				xmlParams.@a = mcCaptionMatrix.a;
				xmlParams.@b = mcCaptionMatrix.b;
				xmlParams.@c = mcCaptionMatrix.c;
				xmlParams.@d = mcCaptionMatrix.d;
				xmlParams.@tx = mcCaptionMatrix.tx;
				xmlParams.@ty = mcCaptionMatrix.ty;
				targetObject.transform.matrix = mcCaptionMatrix;
			}
			else
			{
				mcIconMatrix = e.target.toolMatrix;
				
				xmlParams.image.@a = mcIconMatrix.a;
				xmlParams.image.@b = mcIconMatrix.b;
				xmlParams.image.@c = mcIconMatrix.c;
				xmlParams.image.@d = mcIconMatrix.d;
				xmlParams.image.@tx = mcIconMatrix.tx;
				xmlParams.image.@ty = mcIconMatrix.ty;
				
				mcIcon.transform.matrix = mcIconMatrix;
				mcIcon.imageMC.scaleX = 1 / xmlParams.image.@a;
				mcIcon.imageMC.scaleY = 1 / xmlParams.image.@d;	
			}
			sp.refreshPane();
		}
		
		private function removeTransform(e:Event):void 
		{
			currTool.target = null;
		}
		
		private function switchImageVisibility(e:MouseEvent):void{
			mcIcon.visible = imageOnOff.selected;			
			xmlParams.image.@visible = imageOnOff.selected
		}
		
		private function fontValuesChanged(e:Event) {
			setTextFormat();
		}
		
		private function setTextFormat() {
			txt.autoSize = "left"
			currTool.target = null;
			var txtProp:XML = new XML(formatterMc.getData());
			var tf:TextFormat = new TextFormat(txtProp.font.@face, txtProp.font.@size, txtProp.color.@textColor, toBoolean(txtProp.textDecoration.@bold), toBoolean(txtProp.textDecoration.@italic), toBoolean(txtProp.textDecoration.@underline),null,null,txtProp.textDecoration.@align) 
			txt.setTextFormat(tf);
			txt.embedFonts = false;
			if(txtProp.color.@highlightRequired == "true"){
				txt.background = true
				txt.backgroundColor = uint(txtProp.color.@highlightColor)
			}else{
				txt.background = false
			}
			xmlParams.text.@height = mcHiddenText.height;
			//drawBitmapData();
		}
		
		private function captionStyleChanged(e:Event) {
			currTool.target = null;
			xmlParams.@style = styleCombo.selectedItem.data;
			mcRef.removeChild(mcCaption);
			mcCaption = new MovieClip();	
			mcCaption.name = "mcCaption"
			var obj:Class = getDefinitionByName(xmlParams.@style) as Class
			var mc = new obj();
			mc.name = "captionBG"
			
			bgRequiredCB.selected = toBoolean(xmlParams.@bgSelected);
			if(mc.getChildByName("bg") == null){
				bgColorMc.enabled = false
				BGColorTextMC.visible = false;
				bgRequiredCB.visible = false;
			}else{
				bgColorMc.enabled = true;
				BGColorTextMC.visible = true;
				bgRequiredCB.visible = true;
				bgColorMc.selectedColor = uint(xmlParams.@bgColor);
				if (toBoolean(xmlParams.@bgSelected))
				{
					var mcBG = MovieClip(mc.getChildByName("bg"));
					var colorTransform:ColorTransform = new ColorTransform();
					colorTransform.color = xmlParams.@bgColor;
					mcBG.transform.colorTransform = colorTransform;	
				}
			}
			
			borderRequiredCB.selected = toBoolean(xmlParams.@borderSelected);
			if(mc.getChildByName("mcBorder") == null){
				borderColorMc.enabled = false
				borderColorTextMC.visible = false;
				borderRequiredCB.visible = false;
			}else{
				borderColorMc.enabled = true;
				borderColorTextMC.visible = true;
				borderRequiredCB.visible = true;
				borderColorMc.selectedColor = uint(xmlParams.@borderColor);
				if (toBoolean(xmlParams.@borderSelected))
				{
					var mcBorder = MovieClip(mc.getChildByName("mcBorder"));
					var colorTransformBorder:ColorTransform = new ColorTransform();
					colorTransformBorder.color = xmlParams.@borderColor;
					mcBorder.transform.colorTransform = colorTransformBorder;	
				}
			}
			mcCaption.addChild(mc);
			
			//---	
			
			txt.width = Number(xmlConfig[styleCombo.selectedIndex].@txtWidth);
			txt.htmlText = xmlParams.text.split("\\n").join("\n");
			
			xmlParams.text.@width = txt.width;
			xmlParams.text.@height = txt.height;
			
			
			//txt.height = xmlParams.text.@height;
			
			xmlParams.text.@tx=Number(xmlConfig[styleCombo.selectedIndex].@txtTx);
			xmlParams.text.@ty = Number(xmlConfig[styleCombo.selectedIndex].@txtTy);
			
			xmlParams.image.@tx=Number(xmlConfig[styleCombo.selectedIndex].@imgTx);
			xmlParams.image.@ty = Number(xmlConfig[styleCombo.selectedIndex].@imgTy);	
			mcIconMatrix = new Matrix(1, 0, 0, 1, xmlParams.image.@tx, xmlParams.image.@ty);
			mcIcon.transform.matrix = mcIconMatrix;
			xmlParams.image.@a = mcIconMatrix.a;
			xmlParams.image.@b = mcIconMatrix.b;
			xmlParams.image.@c = mcIconMatrix.c;
			xmlParams.image.@d = mcIconMatrix.d;
			
			mcIcon.imageMC.scaleX = 1 / xmlParams.image.@a;
			mcIcon.imageMC.scaleY = 1 / xmlParams.image.@d;
			
			//xmlParams.@bgColor=xmlConfig[styleCombo.selectedIndex].@captionBgColor;
			
			imageFile.text = xmlParams.image;
			
			txtMatrix = new Matrix(1, 0, 0, 1, xmlParams.text.@tx, xmlParams.text.@ty);
			setTextFormat();
			textHolder.transform.matrix = txtMatrix;
			xmlParams.text.@a = 1
			xmlParams.text.@b = 0;
			xmlParams.text.@c = 0;
			xmlParams.text.@d = 1;
			
			mcRef.addChildAt(mcCaption, 0)
			
			mcCaption.addEventListener(MouseEvent.MOUSE_DOWN, select);
			
			sp.refreshPane();
		}
		
		private function backgroundColorChanged(e:Event) {
			var captionMc = MovieClip(mcCaption.getChildAt(0));			
			//if (captionMc.numChildren != 0 && captionMc.getChildAt(0) is MovieClip) {				
				if (toBoolean(xmlParams.@bgSelected))
				{
					var mc = MovieClip(captionMc.getChildByName("bg"));					
					var colorTransform:ColorTransform = new ColorTransform();
					colorTransform.color = bgColorMc.selectedColor;					
					mc.transform.colorTransform = colorTransform;
					xmlParams.@bgColor = bgColorMc.selectedColor;
					//xmlConfig[styleCombo.selectedIndex].@captionBgColor = xmlParams.@bgColor;
				}				
			//}
		}
		
		private function applyBGColor(e:Event):void 
		{
			xmlParams.@bgSelected = bgRequiredCB.selected;
			var captionMc = MovieClip(mcCaption.getChildAt(0))
			//if (captionMc.numChildren != 0 && captionMc.getChildAt(0) is MovieClip) {
				var mc = MovieClip(captionMc.getChildByName("bg"));
				var colorTransform:ColorTransform = new ColorTransform();
				if (toBoolean(xmlParams.@bgSelected))
				{
					colorTransform.color = bgColorMc.selectedColor;
					mc.transform.colorTransform = colorTransform;
					xmlParams.@bgColor = bgColorMc.selectedColor;
					//xmlConfig[styleCombo.selectedIndex].@captionBgColor = xmlParams.@bgColor;
				}
				else
				{
					mc.transform.colorTransform = colorTransform;
				}
			//}
		}
		
		/*========= Border Color change =============================*/
		private function borderColorChanged(e:Event) {
			var captionMc = MovieClip(mcCaption.getChildAt(0))
			//if (captionMc.numChildren != 0 && captionMc.getChildAt(0) is MovieClip) {
				if (toBoolean(xmlParams.@borderSelected))
				{
					var mc = MovieClip(captionMc.getChildByName("mcBorder"));
					var colorTransform:ColorTransform = new ColorTransform();
					colorTransform.color = borderColorMc.selectedColor;
					mc.transform.colorTransform = colorTransform;
					xmlParams.@borderColor = borderColorMc.selectedColor;
				}				
			//}
		}
		
		private function applyBorderColor(e:Event):void 
		{
			xmlParams.@borderSelected = borderRequiredCB.selected;
			var captionMc = MovieClip(mcCaption.getChildAt(0))
			//if (captionMc.numChildren != 0 && captionMc.getChildAt(0) is MovieClip) {
				var mc = MovieClip(captionMc.getChildByName("mcBorder"));
				var colorTransform:ColorTransform = new ColorTransform();
				if (toBoolean(xmlParams.@borderSelected))
				{
					colorTransform.color = borderColorMc.selectedColor;
					mc.transform.colorTransform = colorTransform;
					xmlParams.@borderColor = borderColorMc.selectedColor;
					//xmlConfig[styleCombo.selectedIndex].@captionBgColor = xmlParams.@bgColor;
				}
				else
				{
					mc.transform.colorTransform = colorTransform;
				}
			//}
		}		
		/*===========================================================*/
		
		private function captionTextChanged(e:Event) {
			currTool.target = null;
			txt.autoSize = "left"
			txt.htmlText = captionText.text.split("\\n").join("\n");
			xmlParams.text = captionText.text;
			xmlParams.text.@height = mcHiddenText.height;
			setTextFormat();
			sp.refreshPane();
		}
		
		private function beforeRbHandler(e:MouseEvent){
			xmlParams.@position = "before";
			mcIcon.x = xmlParams.@xPos;
			txt.x = mcIcon.x + mcIcon.width;
		}
		
		private function afterRbHandler(e:MouseEvent){
			xmlParams.@position = "after"
			txt.x = xmlParams.@xPos;
			mcIcon.x = txt.x + txt.width;
		}
		
		private function browseHandler(e:MouseEvent){
			fileRef = new FileReference();
			fileRef.addEventListener(Event.SELECT, selectHandler);
			fileRef.browse(getTypes());
		}
		
		private function getTypes():Array {
			var allTypes:Array = new Array();
			allTypes.push(new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png"));
			return allTypes;
		}

		private function selectHandler(evt:Event){
			var file:FileReference = FileReference(evt.target);
			xmlParams.image = file.name;
			imageFile.text = file.name;
			xmlConfig[styleCombo.selectedIndex].@imagePath=xmlParams.image;
		}
		
		private function setDefaultData(){
			var arrStyles:DataProvider = new DataProvider()
			var toSelectIndex:int = 0;
			for(var i=0; i<xmlConfig.length(); i++){
				arrStyles.addItem({label:xmlConfig[i].@label, data:xmlConfig[i].@movieclip});
				if (xmlConfig[i].@movieclip == xmlParams.@style) {
					toSelectIndex = i;
				}
			}
			styleCombo.dataProvider = arrStyles;
			styleCombo.selectedIndex = toSelectIndex;
			
			captionText.text = xmlParams.text;			
			
			imageFile.text = xmlParams.image;
			
			mcCaptionMatrix = new Matrix(xmlParams.@a, xmlParams.@b, xmlParams.@c, xmlParams.@d, xmlParams.@tx, xmlParams.@ty)
			mcCaption = new MovieClip();	
			mcCaption.name = "mcCaption";
			var obj:Class = getDefinitionByName(xmlParams.@style) as Class
			var mc = new obj()
			mc.name = "captionBG";
			mc.transform.matrix = mcCaptionMatrix;
			mcCaption.addChild(mc);	
			
			bgRequiredCB.selected = toBoolean(xmlParams.@bgSelected);
			if(mc.getChildByName("bg") == null){
				bgColorMc.enabled = false
				BGColorTextMC.visible = false;
				bgRequiredCB.visible = false;
			}else{
				bgColorMc.enabled = true;
				BGColorTextMC.visible = true;
				bgRequiredCB.visible = true;
				bgColorMc.selectedColor = uint(xmlParams.@bgColor);
				if (toBoolean(xmlParams.@bgSelected))
				{
					var mcBG = MovieClip(mc.getChildByName("bg"));
					var colorTransform:ColorTransform = new ColorTransform();
					colorTransform.color = xmlParams.@bgColor;
					mcBG.transform.colorTransform = colorTransform;				
				}
			}
			
			borderRequiredCB.selected = toBoolean(xmlParams.@borderSelected);
			if(mc.getChildByName("mcBorder") == null){
				borderColorMc.enabled = false
				borderColorTextMC.visible = false;
				borderRequiredCB.visible = false;
			}else{
				borderColorMc.enabled = true;
				borderColorTextMC.visible = true;
				borderRequiredCB.visible = true;
				borderColorMc.selectedColor = uint(xmlParams.@borderColor);
				if (toBoolean(xmlParams.@borderSelected))
				{
					var mcBorder = MovieClip(mc.getChildByName("mcBorder"));
					var colorTransformBorder:ColorTransform = new ColorTransform();
					colorTransformBorder.color = xmlParams.@borderColor;
					mcBorder.transform.colorTransform = colorTransformBorder;	
				}
			}
			
			txtMatrix = new Matrix(xmlParams.text.@a, xmlParams.text.@b, xmlParams.text.@c, xmlParams.text.@d, xmlParams.text.@tx, xmlParams.text.@ty)
			textHolder = new txtHolder();
			textHolder.name = "textHolder";
			txt = textHolder.mcText.captionText;
			txt.width = xmlParams.text.@width;
			txt.height = xmlParams.text.@height;
			txt.htmlText = xmlParams.text.split("\\n").join("\n");
			txt.autoSize = "left";
			txt.multiline = true;
			txt.wordWrap = true;
			txt.selectable = false;
			textHolder.transform.matrix = txtMatrix;
			//textHolder.x = xmlParams.text.@tx;
			//textHolder.y = xmlParams.text.@ty;
			
			mcIconMatrix = new Matrix(xmlParams.image.@a, xmlParams.image.@b, xmlParams.image.@c, xmlParams.image.@d, xmlParams.image.@tx, xmlParams.image.@ty)
			mcIcon = new IconMovie();
			mcIcon.name = "mcIcon"
			mcIcon.outlineMc = MovieClip(mcIcon.getChildByName("outlineMc"));			
			
			mcIcon.transform.matrix = mcIconMatrix;
			mcIcon.imageMC.scaleX = 1 / xmlParams.image.@a;
			mcIcon.imageMC.scaleY = 1 / xmlParams.image.@d;
			mcIcon.visible = toBoolean(xmlParams.image.@visible);
			
			mcRef.addChild(mcCaption)
			mcRef.addChild(mcIcon);
			mcRef.addChild(textHolder);
			
			
			/*======== Transform tool implementation =========*/
			// default tool
			defaultTool = new TransformTool();
			defaultTool.rotationEnabled = true;
			defaultTool.registrationEnabled = false;
			currTool = defaultTool;
			
			mcRef.addChild(defaultTool);	
			
			setTextFormat();
			// event handlers for selecting objects and changing tools
			textHolder.addEventListener(MouseEvent.MOUSE_DOWN, select);
			mcIcon.addEventListener(MouseEvent.MOUSE_DOWN, select);
			mcCaption.addEventListener(MouseEvent.MOUSE_DOWN, select);
			sp.addEventListener(MouseEvent.MOUSE_DOWN, selectNull);
			/*=================================================*/
			
			sp.source = mcRef;
			sp.refreshPane();
		}
		
		private function selectNull(e:MouseEvent):void 
		{
			if (e.target.name.indexOf("instance") == 0)
			{
				currTool.target = null;
			}
		}
		
		private function select(event) {
			trace("here:  "+event.target.name)
			if (event.target.name.indexOf("instance") == 0)
			{
				currTool.target = null;
			}
			else if ((event.target.name.indexOf("bg") == 0 || event.target.name.indexOf("mcBorder") == 0)  && event.target is MovieClip) 
			{
				currTool.scaleEnabled = true;
				currTool.skewEnabled = false;
				currTool.rotationEnabled = false;
				currTool.target = event.target.parent as Sprite;
				toolInit();
			}	
			else if (event.target.name.indexOf("instance") == -1 && event.target is MovieClip) 
			{
				currTool.scaleEnabled = true;
				currTool.skewEnabled = false;
				currTool.target = event.target.parent as Sprite;
				toolInit();
			}	
			else if (event.target.name.indexOf("instance") == -1 && event.target is TextField)
			{
				event.target.autoSize = "none";
				currTool.scaleEnabled = true;
				currTool.skewEnabled = false;
				currTool.rotationEnabled = false;
				currTool.target = event.target.parent.parent;
				toolInit();
				trace(event.target.height +"<><><><><>" + currTool.target.height);
			}
		}
		
		private function toolInit():void {
			currTool.registration = currTool.boundsCenter;
		}
	}
}