﻿package TableWidget.comp.textformatter{
	import flash.display.MovieClip;
	import fl.data.DataProvider;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.Font;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import flash.text.TextFormat
	import TableWidget.comp.textformatter.SizeSelector;
	
	public class TextPropertiesComponent extends MovieClip {
		private var xmlParams:XMLList;

		private var allFonts:Array;
		private var downPos:int = 0;
		private var currentSize:int = 0;
		
		public static const VALUECHANGED:String = "valuechanged";
		public var initialize:Boolean;
		private var fontSize:Number;
		private var fontFace:String;
		private var fontColor:String;
		private var fontBold:Boolean;
		private var fontItalic:Boolean;
		private var fontUnderline:Boolean;
		private var fontStyle:String;
		public var propChanged:String
		
		private var bordercolor:String
		public function TextPropertiesComponent() {
			initialize = false;
			fontBold = false;
			fontItalic = false;
			fontUnderline = false;
		}
		
		public function setData(xml:XMLList) {
			xmlParams = xml;
			
			
		}
		
		public function getData():XMLList {
			return xmlParams;
		}
		
		public function init() {
			populateFont()
			populateFontStyle();
			addEvents();
			setDefaultData();
			initialize=true
			
		}
		
		
		private function populateFont() {
			allFonts = Font.enumerateFonts(true)
			allFonts.sortOn("fontName");
			var dp:DataProvider = new DataProvider()
			
						for(var i=0; i<allFonts.length; i++){
			if(allFonts[i].fontName!='Wingdings' && allFonts[i].fontName!='Wingdings 2' && allFonts[i].fontName!='Wingdings 3' && allFonts[i].fontName!='Webdings')
			{
				dp.addItem({label:allFonts[i].fontName});
			}
			}
			fontFamilyCB.dataProvider = dp;
		}
		
		private function populateFontStyle() {
			var dp:DataProvider = new DataProvider();
			dp.addItem({label:"Regular", data:"regular"});
			dp.addItem({label:"Bold", data:"bold"});
			dp.addItem({label:"Italic", data:"italic"});
			dp.addItem({label:"Bold Italic", data:"bolditalic"});
			fontStyleCB.dataProvider = dp;
		}
		
		private function addEvents():void{
			fontFamilyCB.addEventListener(Event.CHANGE, fontFamilyChangeHandler);
			fontStyleCB.addEventListener(Event.CHANGE, fontStyleChangeHandler);
			textColorMc.addEventListener(Event.CHANGE, textColorChanged);
			highlightColorMc.addEventListener(Event.CHANGE, highlightColorChanged);
			boldMc.addEventListener(MouseEvent.CLICK, boldToggleHandler);
			italicMc.addEventListener(MouseEvent.CLICK, italicToggleHandler);
			underlineMc.addEventListener(MouseEvent.CLICK, underlineToggleHandler);
			sizeSelectorMc.addEventListener(SizeSelector.CHANGE, sizeChangedHandler);
			borderColorMc.addEventListener(Event.CHANGE, borderColorChangeHandler);
			
			leftAlignMc.addEventListener(MouseEvent.CLICK, alignmentHandler);
			centerAlignMc.addEventListener(MouseEvent.CLICK, alignmentHandler);
			rightAlignMc.addEventListener(MouseEvent.CLICK, alignmentHandler);
		}
		private function removeEvents():void{
			fontFamilyCB.removeEventListener(Event.CHANGE, fontFamilyChangeHandler);
			fontStyleCB.removeEventListener(Event.CHANGE, fontStyleChangeHandler);
			textColorMc.removeEventListener(Event.CHANGE, textColorChanged);
			highlightColorMc.removeEventListener(Event.CHANGE, highlightColorChanged);
			boldMc.removeEventListener(MouseEvent.CLICK, boldToggleHandler);
			italicMc.removeEventListener(MouseEvent.CLICK, italicToggleHandler);
			underlineMc.removeEventListener(MouseEvent.CLICK, underlineToggleHandler);
			sizeSelectorMc.removeEventListener(SizeSelector.CHANGE, sizeChangedHandler);
			borderColorMc.removeEventListener(Event.CHANGE, borderColorChangeHandler);
		}
		private function borderColorChangeHandler(evt:Event):void
		{
			xmlParams.color.@borderColor = "0x"+borderColorMc.selectedColor.toString(16);
			propChanged="borderColor"
				dispatchEvent(new Event(VALUECHANGED));
		}
		private function sizeChangedHandler(e:Event){
			xmlParams.font.@size = sizeSelectorMc.getData();
			//trace("size changed handler in Textproperties::: "+xmlParams.font.@size)
			propChanged="size"
				dispatchEvent(new Event(VALUECHANGED));
			
			
		}
		
		private function italicToggleHandler(e:Event):void 
		{
			var mc = MovieClip(e.target);
			var currFrame = mc.currentFrame;
			if (currFrame == 1) {
				mc.gotoAndStop(2);
				xmlParams.textDecoration.@italic = "true"
				if(xmlParams.textDecoration.@bold == "true"){
					fontStyleCB.selectedIndex = 3
				}else{
					fontStyleCB.selectedIndex = 2
				}
			}else {
				mc.gotoAndStop(1);
				xmlParams.textDecoration.@italic = "false"
				if(xmlParams.textDecoration.@bold == "true"){
					fontStyleCB.selectedIndex = 1
				}else{
					fontStyleCB.selectedIndex = 0
				}
			}
			
				propChanged="italic"
				dispatchEvent(new Event(VALUECHANGED));
			
		}
		
		private function boldToggleHandler(e:Event):void 
		{
			var mc:MovieClip = MovieClip(e.target);
			var currFrame = mc.currentFrame;
			
			if (currFrame == 1) {
				mc.gotoAndStop(2);
				xmlParams.textDecoration.@bold = "true"
				if(xmlParams.textDecoration.@italic == "true"){
					fontStyleCB.selectedIndex = 3
				}else{
					fontStyleCB.selectedIndex = 1
				}
			}else {
				mc.gotoAndStop(1);
				xmlParams.textDecoration.@bold = "false"
				if(xmlParams.textDecoration.@italic == "true"){
					fontStyleCB.selectedIndex = 2
				}else{
					fontStyleCB.selectedIndex = 0
				}
			}
			propChanged="bold"
				dispatchEvent(new Event(VALUECHANGED));
			
		}
		
		private function underlineToggleHandler(e:Event):void 
		{
			var mc = MovieClip(e.target);
			var currFrame = mc.currentFrame;
			if (currFrame == 1) {
				mc.gotoAndStop(2);
				xmlParams.textDecoration.@underline = "true"
			}else {
				mc.gotoAndStop(1);
				xmlParams.textDecoration.@underline = "false"
			}
			propChanged="underline"
				dispatchEvent(new Event(VALUECHANGED));
			
		}
		
		private function alignmentHandler(e:MouseEvent):void{
			var mc = MovieClip(e.target);
			leftAlignMc.gotoAndStop(1)
			centerAlignMc.gotoAndStop(1)
			rightAlignMc.gotoAndStop(1)
			mc.gotoAndStop(2);
			var align = mc.name.split("Align")[0];
			xmlParams.textDecoration.@align = align;
			propChanged = "align"
			dispatchEvent(new Event(VALUECHANGED));
		}
		
		private function fontFamilyChangeHandler(e:Event):void {
			xmlParams.font.@face = fontFamilyCB.selectedLabel
			
			propChanged="font"
				dispatchEvent(new Event(VALUECHANGED));
			
			//trace("Font fontFamilyChangeHandler");
		}
		
		private function fontStyleChangeHandler(e:Event):void {
			var selectedStyle = fontStyleCB.selectedItem.data;
			if(selectedStyle == "regular")
			{
				xmlParams.textDecoration.@bold = "false"
				xmlParams.textDecoration.@italic = "false"
				boldMc.gotoAndStop(1);
				italicMc.gotoAndStop(1);
			}
			else if(selectedStyle == "bold")
			{
				xmlParams.textDecoration.@bold = "true"
				xmlParams.textDecoration.@italic = "false"
				boldMc.gotoAndStop(2);
				italicMc.gotoAndStop(1);
			}
			else if(selectedStyle == "italic")
			{
				xmlParams.textDecoration.@bold = "false"
				xmlParams.textDecoration.@italic = "true"
				boldMc.gotoAndStop(1);
				italicMc.gotoAndStop(2);
			}
			else if(selectedStyle == "bolditalic")
			{
				xmlParams.textDecoration.@bold = "true"
				xmlParams.textDecoration.@italic = "true"
				boldMc.gotoAndStop(2);
				italicMc.gotoAndStop(2);
			}
			
			propChanged="style"
				dispatchEvent(new Event(VALUECHANGED));
			
		}
		private function textColorChanged(e:Event):void {
			xmlParams.color.@textColor = "0x"+textColorMc.selectedColor.toString(16);
			propChanged="textcolor"
				dispatchEvent(new Event(VALUECHANGED));
			
		}
		private function highlightColorChanged(e:Event):void {
			xmlParams.color.@highlightColor = "0x"+highlightColorMc.selectedColor.toString(16);
			propChanged="bgcolor"
				dispatchEvent(new Event(VALUECHANGED));
			
		}
		public function setDefaultData() {
			//removeEvents()
			
			for(var i=0; i<allFonts.length; i++){
				if (allFonts[i].fontName == xmlParams.font.@face) {
					fontFamilyCB.selectedIndex = i;
					break;
				}
			}
			if (xmlParams.textDecoration.@bold == "true") {
				boldMc.gotoAndStop(2);
				fontStyleCB.selectedIndex = 1;
			}else{
				boldMc.gotoAndStop(1);
			}
			if (xmlParams.textDecoration.@italic == "true") {
				italicMc.gotoAndStop(2);
				fontStyleCB.selectedIndex = 2
			}else{
				italicMc.gotoAndStop(1);
			}
			if (xmlParams.textDecoration.@bold == "true" && xmlParams.textDecoration.@italic == "true") {
				fontStyleCB.selectedIndex = 3
			}
			if (xmlParams.textDecoration.@bold == "false"  && xmlParams.textDecoration.@italic == "false") {
				fontStyleCB.selectedIndex = 0;
			}
			if (xmlParams.textDecoration.@underline == "true") {
				underlineMc.gotoAndStop(2);
			}else{
				underlineMc.gotoAndStop(1);
			}
			
			leftAlignMc.gotoAndStop(1)
			centerAlignMc.gotoAndStop(1)
			rightAlignMc.gotoAndStop(1)
			var buttonName = xmlParams.textDecoration.@align + "AlignMc";
			var alignMc = getChildByName(buttonName);
			alignMc.gotoAndStop(2);
			
			borderColorMc.selectedColor=xmlParams.color.@borderColor
			sizeSelectorMc.setData(xmlParams.font.@size, 8, 100)
			sizeSelectorMc.init();
			textColorMc.selectedColor = xmlParams.color.@textColor
			highlightColorMc.selectedColor = xmlParams.color.@highlightColor
			//highlightColorMc.visible = false;
			//addEvents()
		}
		
		public function setDefaultFormat(dtf:TextFormat, color:String){
			if(dtf.font !=null){
				for(var i=0; i<allFonts.length; i++){
					if (allFonts[i].fontName == dtf.font) {
						fontFamilyCB.selectedIndex = i;
						break;
					}
				}
			}
			if (dtf.bold ) {
				boldMc.gotoAndStop(2);
				fontStyleCB.selectedIndex = 1;
			}else{
				boldMc.gotoAndStop(1);
			}
			if (dtf.italic) {
				italicMc.gotoAndStop(2);
				fontStyleCB.selectedIndex = 2
			}else{
				italicMc.gotoAndStop(1);
			}
			if (dtf.bold && dtf.italic) {
				fontStyleCB.selectedIndex = 3
			}
			if (!dtf.bold && !dtf.italic) {
				fontStyleCB.selectedIndex = 0;
			}
			if (dtf.underline) {
				underlineMc.gotoAndStop(2);
			}else{
				underlineMc.gotoAndStop(1);
			}
			
			if(color != null){
				borderColorMc.selectedColor = uint(color)
			}
			if(dtf.size != null){
				sizeSelectorMc.setData(String(dtf.size), 8, 100)
			}
			if(dtf.color!=null){
				textColorMc.selectedColor = uint(dtf.color)
			}
		}
		
		public function SetState(val):void
		{
			if(val=="disable")
			{
				underlineMc.mouseEnabled=false
				fontStyleCB.mouseEnabled=false
				italicMc.mouseEnabled=false
				boldMc.mouseEnabled=false
				fontFamilyCB.mouseEnabled=false
				highlightColorMc.mouseEnabled=false
				highlightColorMc.mouseEnabled=false
				sizeSelectorMc.mouseEnabled=false
				this.gotoAndStop(2);
			}
			else
			{
				trace("SetState"+val);
				underlineMc.mouseEnabled=true
				fontStyleCB.mouseEnabled=true
				italicMc.mouseEnabled=true
				boldMc.mouseEnabled=true
				fontFamilyCB.mouseEnabled=true
				highlightColorMc.mouseEnabled=true
				highlightColorMc.mouseEnabled=true
				sizeSelectorMc.mouseEnabled=true
				this.gotoAndStop(1);
			}
		}
	}
}