﻿package com.textformatter{
	import flash.display.MovieClip;
	import fl.data.DataProvider;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.Font;
	import com.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 function TextPropertiesComponent() {
			
		}
		
		public function setData(xml:XMLList) {
			xmlParams = xml;
		}
		
		public function getData():XMLList {
			return xmlParams;
		}
		
		public function init() {
			populateFont()
			populateFontStyle();
			addEvents();
			setDefaultData();			
		}
		
		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);
			
			leftAlignMc.addEventListener(MouseEvent.CLICK, alignmentHandler);
			centerAlignMc.addEventListener(MouseEvent.CLICK, alignmentHandler);
			rightAlignMc.addEventListener(MouseEvent.CLICK, alignmentHandler);
			justifyAlignMc.addEventListener(MouseEvent.CLICK, alignmentHandler);
		}
		
		private function sizeChangedHandler(e:Event){
			xmlParams.font.@size = sizeSelectorMc.getData();
			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
				}
			}
			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
				}
			}
			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"
			}
			dispatchEvent(new Event(VALUECHANGED));
		}
		
		private function alignmentHandler(e:MouseEvent):void{
			var mc = MovieClip(e.target);
			leftAlignMc.gotoAndStop(1)
			centerAlignMc.gotoAndStop(1)
			rightAlignMc.gotoAndStop(1)
			justifyAlignMc.gotoAndStop(1)
			mc.gotoAndStop(2);
			var align = mc.name.split("Align")[0];
			xmlParams.textDecoration.@align = align;
			dispatchEvent(new Event(VALUECHANGED));
		}
		
		private function fontFamilyChangeHandler(e:Event):void {
			xmlParams.font.@face = fontFamilyCB.selectedLabel
			dispatchEvent(new Event(VALUECHANGED));
		}
		
		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);
			}
			dispatchEvent(new Event(VALUECHANGED));
		}
		private function textColorChanged(e:Event):void {
			xmlParams.color.@textColor = "0x"+textColorMc.selectedColor.toString(16);
			dispatchEvent(new Event(VALUECHANGED));
		}
		private function highlightColorChanged(e:Event):void {
			xmlParams.color.@highlightColor = "0x"+highlightColorMc.selectedColor.toString(16);
			dispatchEvent(new Event(VALUECHANGED));
		}
		private function setDefaultData() {
			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;
			}
			if (xmlParams.textDecoration.@italic == "true") {
				italicMc.gotoAndStop(2);
				fontStyleCB.selectedIndex = 2
			}
			if (xmlParams.textDecoration.@bold == "true" && xmlParams.textDecoration.@italic == "true") {
				fontStyleCB.selectedIndex = 3
			}
			if (xmlParams.textDecoration.@underline == "true") {
				underlineMc.gotoAndStop(2);
			}
			leftAlignMc.gotoAndStop(1)
			centerAlignMc.gotoAndStop(1)
			rightAlignMc.gotoAndStop(1)
			justifyAlignMc.gotoAndStop(1)
			var buttonName = xmlParams.textDecoration.@align + "AlignMc";
			var alignMc = getChildByName(buttonName);
			alignMc.gotoAndStop(2);
			
			sizeSelectorMc.setData(xmlParams.font.@size, 8, 18)
			sizeSelectorMc.init();
			textColorMc.selectedColor = xmlParams.color.@textColor
			highlightColorMc.selectedColor = xmlParams.color.@highlightColor
		}
	}
}