package com.guru.form 
{
	import com.guru.call.ICall;
	import com.guru.display.Text;
	import com.guru.form.base.FormElementBase;
	import com.guru.utils.TraceUtil;
	import flash.display.MovieClip;
	import flash.events.FocusEvent;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFieldType;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class FormTextElement extends FormElementBase
	{
		protected var mInput_mc:MovieClip;
		protected var mDefault_mc:MovieClip;
		protected var mDefaultText:Text;
		protected var mMinChar_num:Number;
		protected var mMaxChar_num:Number;
		protected var mEnterCall:ICall;
		
		public function FormTextElement(pTimeline_mc:MovieClip, pMinChar_num:Number = 0, pMaxChar_num:Number = 999, pRestrict_str:String = null, pTabIndex_num:Number = 0)
		{
			super(pTimeline_mc);
			
			mInput_mc = mTimeline_mc.input_mc;
			mDefault_mc = mTimeline_mc.default_mc;
			mDefaultText = new Text(mDefault_mc.text_mc);
			
			mMinChar_num = pMinChar_num;
			mMaxChar_num = pMaxChar_num;
			
			mInput_mc.text_txt.type = TextFieldType.INPUT;
			mInput_mc.text_txt.selectable = true;
			mInput_mc.text_txt.multiline = false;
			mInput_mc.text_txt.text = "";
			mInput_mc.text_txt.restrict = pRestrict_str;
			mInput_mc.text_txt.maxChars = mMaxChar_num;
			
			this.onFocusOut(null);
			
			if (pTabIndex_num != 0)
			{
				mInput_mc.text_txt.tabEnabled = true;
				mInput_mc.text_txt.tabIndex = pTabIndex_num;	
			}
			
			mInput_mc.addEventListener(FocusEvent.FOCUS_IN, onFocusIn);
			mInput_mc.addEventListener(FocusEvent.FOCUS_OUT, onFocusOut);
		}
		
		public function setEnterCall(pCall:ICall):void
		{
			mEnterCall = pCall;
		}
		
		public function getTextField():TextField
		{
			return mInput_mc.text_txt;
		}
		
		public function getTimeline():MovieClip
		{
			return mTimeline_mc;
		}
		
		public function setDefaultText(pText_str:String):void
		{
			mDefaultText.setText(pText_str);
		}
		
		public function setText(pText:*):void
		{
			mInput_mc.text_txt.text = pText + "";
			
			try{
				mTimeline_mc.stage.focus = mTimeline_mc.stage;
			}catch(e){	}
			this.onFocusOut(null);
			this.checkError();
		}
		
		override public function checkError():Boolean 
		{
			var wordLength_num:Number = this.getData().length;
			var error_bol:Boolean = true;
			if (wordLength_num >= mMinChar_num && wordLength_num <= mMaxChar_num)
			{
				error_bol = false;
				this.hideError();
			}
			else
			{
				this.showError();
			}
			return error_bol;
		}
		
		public function getData():String
		{
			return this.getText();
		}
		
		override public function dispose():void 
		{
			mTimeline_mc.stage.removeEventListener(MouseEvent.CLICK, onClickHandler);
			
			mInput_mc.removeEventListener(FocusEvent.FOCUS_IN, onFocusIn);
			mInput_mc.removeEventListener(FocusEvent.FOCUS_OUT, onFocusOut);
			
			mInput_mc.text_txt.tabEnabled = false;
			mInput_mc.text_txt.tabIndex = 0;
			
			this.setText("");
			this.setDefaultText("");
		}
		
		protected function onFocusIn(e:FocusEvent):void
		{
			mDefault_mc.visible = false;
			
			mTimeline_mc.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
			mTimeline_mc.stage.addEventListener(MouseEvent.CLICK, onClickHandler);
		}
		
		protected function onFocusOut(e:FocusEvent):void
		{
			mDefault_mc.visible = this.getText().length == 0;
			
			mTimeline_mc.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
			mTimeline_mc.stage.removeEventListener(MouseEvent.CLICK, onClickHandler);
		}
		
		protected function onKeyDownHandler(e:KeyboardEvent):void
		{
			if (e.keyCode == 13)
			{
				if(mEnterCall)
					mEnterCall.execute();
				
				if(mTimeline_mc.stage)
					mTimeline_mc.stage.focus = null;
					
				this.onFocusOut(null);
			}
		}
		
		protected function getText():String
		{
			return mInput_mc.text_txt.text;
		}
		
		protected function onClickHandler(e:MouseEvent):void
		{
			if (e.target != mInput_mc.text_txt)
			{
				if(mTimeline_mc.stage)
					mTimeline_mc.stage.focus = null;
			}
		}
	}

}