﻿package comp.textformatter{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.events.KeyboardEvent;
	import flash.events.FocusEvent;
	
	public class SizeSelector extends MovieClip {
		
		private var tf:TextFormat;
		
		public static const CHANGE:String = "change";
		public static const REMOVE_TRANSFORM:String = "removeTransform";
		
		private var downXPos:Number = 0;
		private var downYPos:Number = 0;
		private var currentSize:int = 0;
		private var number:String = "";
		
		private var lowerLim:int = 0;
		private var upperLim:int = 0;
		
		public function SizeSelector() {
			
			
		}
		
		public function setData(num:String, fromNum:int, toNum:int) {
			sizeTxt.text = num+".0"
			tf = sizeTxt.getTextFormat();
			tf.underline = true;
			sizeTxt.setTextFormat(tf);
			number = num;
			lowerLim = fromNum;
			upperLim = toNum;
		}
		
		public function getData():String {
			return number;
		}
		
		public function init() {
			addEvents();
		}
		
		public function set disable(bool:Boolean):void
		{
			if(bool){
				removeEvents();
				sizeTxt.border = false;				
				sizeTxt.selectable = false;
				sizeTxt.type="dynamic"
				var diff = int(sizeTxt.text)
				sizeTxt.text = (( diff > lowerLim) ? (diff < upperLim ? diff : upperLim )  : lowerLim) + ".0";
				number = String(int(sizeTxt.text));
				sizeTxt.setTextFormat(tf);
				sizeTxt.setSelection(0, 0);
			}else{
				addEvents()
			}
		}
		
		private function addEvents():void{
			this.addEventListener(MouseEvent.CLICK, mouseClickHandler);
			this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			this.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHander);
			this.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler)
			this.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
		}
		
		private function removeEvents():void{
			this.removeEventListener(MouseEvent.CLICK, mouseClickHandler);
			this.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			this.removeEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHander);
			this.removeEventListener(FocusEvent.FOCUS_OUT, focusOutHandler)
			this.stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
		}
		
		private function mouseDownHandler(e:MouseEvent):void 
		{
			downXPos = this.mouseX;
			downYPos = this.mouseY;
			currentSize = int(sizeTxt.text)
			this.addEventListener(Event.ENTER_FRAME, mouseMoveHandler);
			dispatchEvent(new Event(REMOVE_TRANSFORM));
		}
		private function mouseUpHandler(e:MouseEvent):void 
		{
			this.removeEventListener(Event.ENTER_FRAME, mouseMoveHandler);
			//dispatchEvent(new Event(CHANGE));
		}
		
		private function mouseWheelHander(e:MouseEvent):void{
			currentSize = int(sizeTxt.text);
			var diff = currentSize + (e.delta/3)
			sizeTxt.text = (( diff > lowerLim) ? (diff < upperLim ? diff : upperLim )  : lowerLim) + ".0";
			number = String(int(sizeTxt.text));
			sizeTxt.setTextFormat(tf);
			dispatchEvent(new Event(CHANGE));
		}
		
		private function mouseMoveHandler(e:Event):void 
		{
			var diff;
			if(this.mouseX != downXPos){
				diff = currentSize + int((this.mouseX - downXPos)/10);
			}else if(this.mouseY != downYPos){
				diff = currentSize + int((downYPos- this.mouseY)/10);
			}
			if(diff != null){
				sizeTxt.text = (( diff > lowerLim) ? (diff < upperLim ? diff : upperLim )  : lowerLim) + ".0";
				number = String(int(sizeTxt.text));
			}
			sizeTxt.setTextFormat(tf);
			dispatchEvent(new Event(CHANGE));
		}
		private function mouseClickHandler(evt:MouseEvent):void{
			this.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			this.removeEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHander);
			this.stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			this.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHander);
			this.addEventListener(FocusEvent.FOCUS_OUT, focusOutHander);
			parent.parent.parent.addEventListener(MouseEvent.MOUSE_UP, focusOutHander)
			//sizeTxt.addEventListener(Event.CHANGE, sizeChanged);
			sizeTxt.border = true;
			sizeTxt.borderColor = 0x0000ff;
			//sizeTxt.editable = true;
			sizeTxt.selectable = true;
			sizeTxt.restrict = "0-9";
			sizeTxt.type = "input"
			var mytf = sizeTxt.getTextFormat();
			mytf.underline = false;
			sizeTxt.text = String(int(sizeTxt.text));
			number = String(int(sizeTxt.text));
			sizeTxt.setTextFormat(mytf);
			sizeTxt.setSelection(0, sizeTxt.text.length);
		}
		private function focusOutHander(evt:Event):void{
			setField()
		}
		private function keyDownHander(evt:KeyboardEvent):void{
			if(evt.keyCode == 13){
				setField()
			}
		}
		
		private function setField(){
			sizeTxt.border = false;				
			sizeTxt.selectable = false;
			sizeTxt.type="dynamic"
			var diff = int(sizeTxt.text)
			sizeTxt.text = (( diff > lowerLim) ? (diff < upperLim ? diff : upperLim )  : lowerLim) + ".0";
			number = String(int(sizeTxt.text));
			sizeTxt.setTextFormat(tf);
			sizeTxt.setSelection(0, 0);
			this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			this.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHander);
			this.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			dispatchEvent(new Event(CHANGE));
		}
		private function sizeChanged(evt:Event){
			var diff = int(sizeTxt.text)
			sizeTxt.text = (( diff > lowerLim) ? (diff < upperLim ? diff : upperLim )  : lowerLim) + ".0";
			number = String(int(sizeTxt.text));
			dispatchEvent(new Event(CHANGE));
		}
		private function focusOutHandler(evt:FocusEvent){
			sizeTxt.border = false;				
			sizeTxt.selectable = false;
			sizeTxt.type="dynamic"
			var diff = int(sizeTxt.text)
			sizeTxt.text = (( diff > lowerLim) ? (diff < upperLim ? diff : upperLim )  : lowerLim) + ".0";
			number = String(int(sizeTxt.text));
			sizeTxt.setTextFormat(tf);
			sizeTxt.setSelection(0, 0);
			this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			this.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHander);
			this.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			dispatchEvent(new Event(CHANGE));
		}
	}
}