﻿package Captions{
	
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.display.Sprite;
	import fl.data.DataProvider;
	import flash.geom.ColorTransform;
	import flash.net.FileReference;
	import flash.net.FileFilter;
	import flash.events.MouseEvent
	import flash.events.KeyboardEvent;
	import fl.events.ColorPickerEvent;
	import flash.display.SimpleButton;
	import flash.text.TextField;
	import fl.controls.TextInput;
	import flash.text.TextFormat;
	import flash.utils.getDefinitionByName;
	import comp.textformatter.TextPropertiesComponent
	import comp.textformatter.SizeSelector;
	import comp.transformTool.TransformTool;
	import flash.geom.Matrix;
	import flash.geom.Transform;
	//import Captions.Debug;
	
	
	public class TextCaption extends MovieClip{
		
		private var formatterMc:MovieClip;
		private var xmlParams:XMLList;
		private var mainXMLConfig:XMLList;
		private var xmlConfig:XMLList;
		private var mcRef:MovieClip;
		private var fileRef:FileReference;
		private var mcCaption:MovieClip;
		private var txt:TextField;
		private var mcIcon:MovieClip;
		private var actionDP:DataProvider
		private var objHolder
		private var objTextMc;
		private var txtMatrix:Matrix;
		private var textHolder:MovieClip;
		private var imageMCMatrix:Matrix;
		private var mcIconMatrix:Matrix;
		private var defaultTool:TransformTool;
		private var currTool:TransformTool;
		
		private var sourceMc:MovieClip;
		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;
			
			
			/*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) } );
				
				//var ind = String(xml[i].@label).substr(String(xml[i].@label).length - 1, String(xml[i].@label).length)
				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();
			
			var objArr = new Array({label:"Continue", data:"1"},{label:"Go to the previous slide", data:"2"},{label:"Go to the next slide", data:"3"},{label:"Go to the slide last visited", data:"4"},{label:"Jump to slide", data:"5"},{label:"Open URL or file", data:"6"},{label:"Send e-mail to", data:"7"});
			actionDP = new DataProvider();
			actionDP.addItems (objArr);
			actionCombo.dataProvider = actionDP;
			
			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;
		}
		
		function fnHandleAction(evt:Event)
		{
			if (evt.target.selectedItem.data < 5)
			{
				if (this.getChildByName("objTextMc") != null)
				{
					removeChild(this.getChildByName("objTextMc"));
				}
			}
			else
			{
				if (this.getChildByName("objTextMc") == null)
				{
					objTextMc = new TextMc();
					objTextMc.name = "objTextMc";
					objTextMc.browseBtn.addEventListener(MouseEvent.CLICK, urlBrowseHandler);
				}

				if (evt.target.selectedItem.data == 5)
				{
					objTextMc.labelTxt.text = "Slide";
					objTextMc.txtInput.text = "";
					objTextMc.txtInput.width = 30;
					objTextMc.txtInput.maxChars = 3;
					objTextMc.txtInput.restrict = "0-9";
					objTextMc.browseBtn.visible = false;
				}
				else if (evt.target.selectedItem.data == 6)
				{
					objTextMc.labelTxt.text = "URL";
					objTextMc.txtInput.text = "http://";		
					objTextMc.txtInput.width = 200;
					objTextMc.txtInput.maxChars = 300;
					objTextMc.txtInput.restrict = null;
					objTextMc.browseBtn.x = objTextMc.txtInput.x + objTextMc.txtInput.width + 20;
					objTextMc.browseBtn.visible = true;
					
				}
				else if (evt.target.selectedItem.data == 7)
				{
					objTextMc.labelTxt.text = "E-Mail";
					objTextMc.txtInput.text = "";
					objTextMc.txtInput.width = 200;
					objTextMc.txtInput.maxChars = 100;
					objTextMc.txtInput.restrict = null;
					objTextMc.browseBtn.visible = false;
				}
				
				if (String(xmlParams.@eventParam).length > 0)
				{
					if (xmlParams.@eventAssign == evt.target.selectedItem.data)
					{
						objTextMc.txtInput.text = String(xmlParams.@eventParam)
					}
				}
				this.stage.focus = objTextMc.txtInput;
				objTextMc.backMc.x = objTextMc.txtInput.x - 1;
				objTextMc.backMc.y = objTextMc.txtInput.y - 1;
				objTextMc.backMc.width = objTextMc.txtInput.width + 3
				objTextMc.backMc.height = objTextMc.txtInput.height + 3
				
				objTextMc.txtInput.addEventListener(Event.CHANGE, fnAssignEventParam);
				objTextMc.y = evt.target.y  + evt.target.height + 15;
				objTextMc.x = evt.target.x

				
				this.addChild(objTextMc);
				this.addEventListener(KeyboardEvent.KEY_DOWN, fnAssignEventParam);
			}
			
			var selectedInd = evt.target.selectedItem.data;
			xmlParams.@eventAssign = String(selectedInd);
		}
		
		private function fnAssignEventParam(evt):void
		{
			xmlParams.@eventParam = objTextMc.txtInput.text;
		}
		
		private function urlBrowseHandler(e:MouseEvent){
			fileRef = new FileReference();
			fileRef.addEventListener(Event.SELECT, urlSelectHandler);
			fileRef.browse(getURLTypes());
		}
		
		private function getURLTypes():Array {
			var allTypes:Array = new Array();
			allTypes.push(new FileFilter("All Files (*.*)", "*.*"));
			return allTypes;
		}

		private function urlSelectHandler(evt:Event){
			var file:FileReference = FileReference(evt.target);
			objTextMc.txtInput.text = file.name;
			xmlParams.@eventParam = file.name;
		}
		
		private function changeBackGroundColorHandler(event):void 
		{
			var captionMc = MovieClip(mcCaption.getChildAt(0));			
			if (toBoolean(xmlParams.@bgSelected))
			{
				var mc = SimpleButton(captionMc.getChildByName("btn"));					
				var colorTransform:ColorTransform = new ColorTransform();
				colorTransform.color = bgColorMc.selectedColor;					
				mc.transform.colorTransform = colorTransform;
				xmlParams.@backColor = bgColorMc.selectedColor;
				xmlConfig.(@movieclip == xmlParams.@style).@backColor = xmlParams.@backColor;				
			}				
		}
		
		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 = SimpleButton(captionMc.getChildByName("btn"));
				var colorTransform:ColorTransform = new ColorTransform();
				if (toBoolean(xmlParams.@bgSelected))
				{
					colorTransform.color = bgColorMc.selectedColor;
					mc.transform.colorTransform = colorTransform;
					xmlParams.@backColor = bgColorMc.selectedColor;
					xmlConfig.(@movieclip == xmlParams.@style).@backColor = xmlParams.@backColor;	
				}
				else
				{
					mc.transform.colorTransform = colorTransform;
				}
			//}
		}
		
		/* ======= Change Border color ====================*/
		private function changeBorderColorHandler(event):void 
		{
			//var captionMc = MovieClip(mcCaption.getChildAt(0));			
			if (toBoolean(xmlParams.@borderSelected))
			{
				var mc = MovieClip(objHolder.getChildByName("mcBorder"));					
				var colorTransform:ColorTransform = new ColorTransform();
				colorTransform.color = borderColorMc.selectedColor;					
				mc.transform.colorTransform = colorTransform;
				xmlParams.@borderColor = borderColorMc.selectedColor;
				//xmlConfig.(@movieclip == xmlParams.@style).@backColor = xmlParams.@backColor;				
			}				
		}
		
		private function applyBorderColor(e:Event):void 
		{
			xmlParams.@borderSelected = borderRequiredCB.selected;
			//if (captionMc.numChildren != 0 && captionMc.getChildAt(0) is MovieClip) {
				var mc = MovieClip(objHolder.getChildByName("mcBorder"));
				var colorTransform:ColorTransform = new ColorTransform();
				if (toBoolean(xmlParams.@borderSelected))
				{
					colorTransform.color = borderColorMc.selectedColor;
					mc.transform.colorTransform = colorTransform;
					xmlParams.@borderColor = borderColorMc.selectedColor;
					//xmlConfig.(@movieclip == xmlParams.@style).@backColor = xmlParams.@backColor;	
				}
				else
				{
					mc.transform.colorTransform = colorTransform;
				}
			//}
		}
		/*==================================================*/
		
		private function customBackGroundColorHandler(hexValue:String):void 
		{
			var objColorTransform = new ColorTransform();
			objColorTransform.color = uint("0x" + hexValue);
			var bgMovie = MovieClip(MovieClip(mcRef.getChildAt(0)).getChildAt(0)).getChildByName("bg")
			bgMovie.transform.colorTransform = objColorTransform;
			xmlConfig.(@movieclip == xmlParams.@style).@backColor = "0x" + hexValue;
			xmlParams.@backColor = "0x" + hexValue;
		}
		

		private function addEvents(){
			formatterMc.addEventListener(TextPropertiesComponent.VALUECHANGED, fontValuesChanged);
			styleCombo.addEventListener(Event.CHANGE, captionStyleChanged)
			captionText.addEventListener(Event.CHANGE, captionTextChanged);			
			
			browseBtn.addEventListener(MouseEvent.CLICK, browseHandler);

			//themeCombo.addEventListener(Event.CHANGE, themeChanged);
			bgColorMc.addEventListener(ColorPickerEvent.CHANGE, changeBackGroundColorHandler);
			borderColorMc.addEventListener(ColorPickerEvent.CHANGE, changeBorderColorHandler);
			bgRequiredCB.addEventListener(MouseEvent.CLICK, applyBGColor);
			borderRequiredCB.addEventListener(MouseEvent.CLICK, applyBorderColor);
			
			actionCombo.addEventListener(Event.CHANGE, fnHandleAction);			
			
			imageOnOff.addEventListener(MouseEvent.CLICK, switchImageVisibility);
			
			formatterMc.sizeSelectorMc.addEventListener(SizeSelector.REMOVE_TRANSFORM, removeTransform);
			
			defaultTool.addEventListener(TransformTool.CONTROL_UP, transformUpdateHandler);
			//beforeRb.addEventListener(MouseEvent.CLICK, beforeRbHandler)
			//afterRb.addEventListener(MouseEvent.CLICK, afterRbHandler)
		}
		
		private function transformUpdateHandler(e:Event):void 
		{			
			var targetObject = e.target.target;
			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("mcIcon") == 0)
			{
				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;
			}
			else if(targetObject.name.indexOf("objHolder") == 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;	
			}
			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() {
			//trace("setformat ???")
			//currTool.target = null;
			var txtProp:XML = new XML(formatterMc.getData());
			var tf:TextFormat = new TextFormat(txtProp.font.@face, txtProp.font.@size, txtProp.color.@textColor, getBool(txtProp.textDecoration.@bold), getBool(txtProp.textDecoration.@italic), getBool(txtProp.textDecoration.@underline)) 
			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 = txt.height;
		}
		
		private function captionStyleChanged(e:Event)
		{
			currTool.target = null;
			xmlParams.@style = styleCombo.selectedItem.data;
			mcRef.removeChild(mcCaption);
			mcCaption = new MovieClip();
			var ClassName:Class = getDefinitionByName(xmlParams.@style) as Class
			objHolder = new ClassName();
			mcCaption.addChild(objHolder);
			mcCaptionMatrix = new Matrix(1, 0, 0, 1, 0, 0);
			objHolder.transform.matrix = mcCaptionMatrix;
			objHolder.buttonMode = true;
			
			xmlParams.@a = 1;
			xmlParams.@b = 0;
			xmlParams.@c = 0;
			xmlParams.@d = 1;
			xmlParams.@tx = 0;
			xmlParams.@ty = 0;
			
			
			txtMatrix = new Matrix(1, 0, 0, 1, 0, 0);
			textHolder.transform.matrix = txtMatrix;
			var numX = ( mcCaption.width - textHolder.width ) / 2
			var numY = ( mcCaption.height - textHolder.height ) / 2
			txtMatrix.tx = numX;
			txtMatrix.ty = numY;
			textHolder.transform.matrix = txtMatrix;
			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;
				
			mcIconMatrix = new Matrix(1, 0, 0, 1, (mcCaption.x + mcCaption.width), (mcCaption.y + (mcCaption.height / 2) - (mcIcon.height / 2)));
			mcIcon.transform.matrix = mcIconMatrix;
			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.imageMC.scaleX = 1 / xmlParams.image.@a;
			mcIcon.imageMC.scaleY = 1 / xmlParams.image.@d;
			
			bgRequiredCB.selected = toBoolean(xmlParams.@bgSelected);
			if (MovieClip(mcCaption.getChildAt(0)).getChildByName("btn") != null)
			{
				bgColorMc.enabled = true;
				BGColorTextMC.visible = true;
				bgRequiredCB.visible = true;
				
				bgColorMc.selectedColor = uint(xmlParams.@backColor);
				if (toBoolean(xmlParams.@bgSelected))
				{
					var mcBG = SimpleButton(objHolder.getChildByName("btn"));
					var colorTransform:ColorTransform = new ColorTransform();
					colorTransform.color = xmlParams.@backColor;
					mcBG.transform.colorTransform = colorTransform;				
				}
			}
			else
			{
				bgColorMc.enabled = false;
				BGColorTextMC.visible = false;
				bgRequiredCB.visible = false;
			}
			
			borderRequiredCB.selected = toBoolean(xmlParams.@borderSelected);
			if (MovieClip(objHolder.getChildByName("mcBorder")) != null)
			{
				borderColorMc.enabled = true;
				borderColorTextMC.visible = true;
				borderRequiredCB.visible = true;
				
				borderColorMc.selectedColor = uint(xmlParams.@borderColor);
				if (toBoolean(xmlParams.@borderSelected))
				{
					var mcBorder = MovieClip(objHolder.getChildByName("mcBorder"));
					var colorTransformBorder:ColorTransform = new ColorTransform();
					colorTransformBorder.color = xmlParams.@borderColor;
					mcBorder.transform.colorTransform = colorTransformBorder;				
				}
			}
			else
			{
				borderColorMc.enabled = false;
				borderColorTextMC.visible = false;
				borderRequiredCB.visible = false;
			}
			
			mcRef.addChildAt(mcCaption, 0);			
			if (xmlParams.@containerXPos == "" && xmlParams.@containerYPos == "")
			{
				if(mcRef.width < sp.width ){
					mcRef.x = (sp.width - mcRef.width)/2
				}else{
					mcRef.x = 0
				}
				if(mcRef.height < sp.height ){
					mcRef.y = (sp.height - mcRef.height)/2
				}else{
					mcRef.y = 0
				}
				xmlParams.@containerXPos = mcRef.x;
				xmlParams.@containerYPos = mcRef.y;
			}
			else
			{
				mcRef.x = xmlParams.@containerXPos;
				mcRef.y = xmlParams.@containerYPos;
			}
			
			mcCaption.addEventListener(MouseEvent.MOUSE_DOWN, select);
			
			sp.refreshPane();
		}
		
		private function captionTextChanged(e:Event){
			//txt.text = captionText.text;
			txt.htmlText = captionText.text.split("\\n").join("\n");
			xmlParams.text = captionText.text;
			setTextFormat();
			sp.refreshPane();
		}
		
		private function beforeRbHandler(e:MouseEvent){
			xmlParams.@position = "before";
			mcIcon.x = xmlParams.@xPos;
			txt.x = mcIcon.x + mcIcon.outlineMc.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;
		}
		
		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 ClassName:Class = getDefinitionByName(xmlParams.@style) as Class
			objHolder = new ClassName();
			objHolder.name  = "objHolder";
			objHolder.transform.matrix = mcCaptionMatrix;
			mcCaption.addChild(objHolder);
			objHolder.buttonMode = true;
			
			bgRequiredCB.selected = toBoolean(xmlParams.@bgSelected);
			if (MovieClip(mcCaption.getChildAt(0)).getChildByName("btn") != null)
			{
				bgColorMc.enabled = true;
				BGColorTextMC.visible = true;
				bgRequiredCB.visible = true;
				
				bgColorMc.selectedColor = uint(xmlParams.@backColor);
				if (toBoolean(xmlParams.@bgSelected))
				{
					var mcBG = SimpleButton(objHolder.getChildByName("btn"));
					var colorTransform:ColorTransform = new ColorTransform();
					colorTransform.color = xmlParams.@backColor;
					mcBG.transform.colorTransform = colorTransform;				
				}
			}
			else
			{
				bgColorMc.enabled = false;
				BGColorTextMC.visible = false;
				bgRequiredCB.visible = false;
			}
			
			borderRequiredCB.selected = toBoolean(xmlParams.@borderSelected);
			if (MovieClip(objHolder.getChildByName("mcBorder")) != null)
			{
				borderColorMc.enabled = true;
				borderColorTextMC.visible = true;
				borderRequiredCB.visible = true;
				
				borderColorMc.selectedColor = uint(xmlParams.@borderColor);
				if (toBoolean(xmlParams.@borderSelected))
				{
					var mcBorder = MovieClip(objHolder.getChildByName("mcBorder"));
					var colorTransformBorder:ColorTransform = new ColorTransform();
					colorTransformBorder.color = xmlParams.@borderColor;
					mcBorder.transform.colorTransform = colorTransformBorder;				
				}
			}
			else
			{
				borderColorMc.enabled = false;
				borderColorTextMC.visible = false;
				borderRequiredCB.visible = false;
			}
			
			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;
			
			mcIcon = new IconMovie();
			mcIcon.name = "mcIcon"
			mcIcon.outlineMc = MovieClip(mcIcon.getChildByName("outlineMc"));
			mcIcon.outlineMc.width = xmlParams.image.@width;
			mcIcon.outlineMc.height = xmlParams.image.@height;
			
			trace(xmlParams.image.@tx +":" + xmlParams.image.@ty);
			if (xmlParams.image.@tx == "NaN") {
				xmlParams.image.@tx = mcCaption.x + mcCaption.width
			}
			if (xmlParams.image.@ty == "NaN") {
				xmlParams.image.@ty = mcCaption.y + (mcCaption.height / 2) - (mcIcon.height / 2);
			}
			mcIconMatrix = new Matrix(xmlParams.image.@a, xmlParams.image.@b, xmlParams.image.@c, xmlParams.image.@d, xmlParams.image.@tx, xmlParams.image.@ty)
			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);
			/*=================================================*/
			
			if (xmlParams.@containerXPos == "" && xmlParams.@containerYPos == "")
			{
				if(mcRef.width < sp.width ){
					mcRef.x = (sp.width - mcRef.width)/2
				}else{
					mcRef.x = 0
				}
				if(mcRef.height < sp.height ){
					mcRef.y = (sp.height - mcRef.height)/2
				}else{
					mcRef.y = 0
				}
				xmlParams.@containerXPos = mcRef.x;
				xmlParams.@containerYPos = mcRef.y;
			}
			else
			{
				mcRef.x = xmlParams.@containerXPos;
				mcRef.y = xmlParams.@containerYPos;
			}
			
			sourceMc = new MovieClip();
			sourceMc.addChild(mcRef);
			sp.source = sourceMc;
			
			/*if (String(xmlParams.@backColor).length > 0)
			{
				bgColorMc.selectedColor = uint(xmlParams.@backColor);
				var mainStr:String = String(xmlParams.@backColor)
				var str:String = mainStr.substr(2, mainStr.length);
				customBackGroundColorHandler(str);
			}*/

			if (String(xmlParams.@eventAssign).length > 0)
			{
				var tempHolder:Number = Number((xmlParams.@eventAssign).toString())
				actionCombo.selectedIndex =  tempHolder - 1;
				actionCombo.dispatchEvent(new Event(Event.CHANGE));	
			}
			else
			{
				xmlParams.@eventAssign = 1;
			}
			sp.refreshPane();
		}
		
		
		private function selectNull(e:MouseEvent):void 
		{
			if (e.target.name.indexOf("instance") == 0)
			{
				currTool.target = null;
			}
		}
		
		private function select(event) {
			if (event.target.name.indexOf("instance") == 0)
			{
				currTool.target = null;
			}
			else if (event.target.name.indexOf("btn") == 0 && event.target is SimpleButton) 
			{
				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)
			{
				currTool.scaleEnabled = true;
				currTool.skewEnabled = false;
				currTool.rotationEnabled = false;
				currTool.target = event.target.parent.parent;				
				toolInit();
			}
		}
		
		private function toolInit():void {
			currTool.registration = currTool.boundsCenter;
		}
		
		private function getBool(str:String):Boolean{
			var ret:Boolean;
			if(str == "true"){
				ret = true
			}else{
				ret = false;
			}
			return ret;
		}
	}
}