package com.guru.project.clinique.game.questionStep
{
	import caurina.transitions.Equations;
	import caurina.transitions.Tweener;
	import com.guru.call.FunctionCall;
	import com.guru.call.ICall;
	import com.guru.component.CommonFunction;
	import com.guru.component.sectionStructure.SectionStructureStepBase;
	import com.guru.component.tracking.Tracking;
	import com.guru.display.button.LabelDragButton;
	import com.guru.display.LabelMovieClip;
	import com.guru.display.scrollPanel.GuruScrollPanel;
	import com.guru.utils.Delegate;
	import com.guru.utils.MovieClipUtil;
	import com.guru.utils.TimerUtil;
	import flash.display.MovieClip;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class GameSectionQuestionStep extends SectionStructureStepBase
	{
		private var mScene_num:Number;
		
		private var mBackground_mc:MovieClip;
		private var mTracyFrontControl:LabelMovieClip;
		private var mTracyBackControl:LabelMovieClip;
		
		private var mQuestion_mc:MovieClip;
		private var mQuestionContent_mc:MovieClip;
		private var mQuestionControl:LabelMovieClip;
		
		private var mDescription_mc:MovieClip;
		private var mDescriptionContent_mc:MovieClip;
		private var mDescriptionControl:LabelMovieClip;
		
		private var mItemBtn_array:Array;
		private var mBtnOriginalPoint_array:Array;
		private var mBtnOriginalRotation_array:Array;
		private var mDragHitArea_mc:MovieClip;
		
		private var mReference0_mc:MovieClip;
		private var mReference1_mc:MovieClip;
		private var mWrong_mc:MovieClip;
		
		private var mHitAreaControl:LabelMovieClip;
		
		public function GameSectionQuestionStep(pTimeline_mc:MovieClip, pNextCall:ICall = null, pPrevCall:ICall = null, pData_obj:Object = null)
		{
			super(pTimeline_mc, pNextCall, pPrevCall, pData_obj);
			
			mScene_num = mData_obj["scene"].shift();
			mData_obj["current"] = mScene_num;
			trace("scene: " + mScene_num);
			
			mBackground_mc = mTimeline_mc.background_mc;
			mBackground_mc.gotoAndStop(mScene_num + 1);
			
			mDragHitArea_mc = mTimeline_mc.dragHitArea_mc;
			
			mTracyFrontControl = new LabelMovieClip(mTimeline_mc.tracyFront_mc, "hide");
			mTracyBackControl = new LabelMovieClip(mTimeline_mc.tracyBack_mc, "hide");
			
			mWrong_mc = mTimeline_mc.wrong_mc;
			mWrong_mc.mouseEnabled = false;
			
			mHitAreaControl = new LabelMovieClip(mTimeline_mc.dragHitArea_mc, "hide");
			
			mQuestion_mc = mTimeline_mc.question_mc;
			mQuestion_mc.mouseEnabled = false;
			mQuestion_mc.mouseChildren = false;
			mQuestionContent_mc = mQuestion_mc.content_mc;
			mQuestionControl = new LabelMovieClip(mQuestion_mc, "show");
			mQuestionContent_mc.gotoAndStop(mScene_num + 1);
			
			mDescription_mc = mTimeline_mc.description_mc;
			mDescription_mc.mouseEnabled = false;
			mDescription_mc.mouseChildren = false;
			mDescriptionContent_mc = mDescription_mc.content_mc;
			mDescriptionControl = new LabelMovieClip(mDescription_mc, "hide");
			
			mReference0_mc = mTimeline_mc.referencePoint0_mc;
			mReference1_mc = mTimeline_mc.referencePoint1_mc;
			
			mItemBtn_array = new Array();
			mBtnOriginalPoint_array = new Array();
			mBtnOriginalRotation_array = new Array();
			var btn_mc:MovieClip;
			for (var i:Number = 0; btn_mc = mTimeline_mc["itemBtn" + i + "_mc"]; i++ )
			{
				var btn:LabelDragButton = new LabelDragButton(btn_mc);
				btn.setDragableArea(new Rectangle(mBackground_mc.x, mBackground_mc.y, mBackground_mc.width, mBackground_mc.height));
				btn.setOverCall(new FunctionCall(this, onItemOver, i));
				btn.setOutCall(new FunctionCall(this, onItemOut, i));
				btn.setDragStartCall(new FunctionCall(this, onItemDragStart, i));
				btn.setDragStopCall(new FunctionCall(this, onItemDragStop, i));
				btn.setDraggingCall(new FunctionCall(this, onItemDragging, i));
				mItemBtn_array.push(btn);
				mBtnOriginalPoint_array.push(new Point(btn_mc.x, btn_mc.y));
				mBtnOriginalRotation_array.push(btn_mc.rotation);
			}
			
			this.enableBtn(false);
		}
		
		override protected function onFadeInDone(pDoneCall:ICall = null):void 
		{
			this.enableBtn(true);
			
			super.onFadeInDone(pDoneCall);
			
			this.tweenBtn(true);
		}
		
		override public function dispose():void 
		{
			mTracyFrontControl.dispose();
			mTracyBackControl.dispose();
			mQuestionControl.dispose();
			mDescriptionControl.dispose();
			mHitAreaControl.dispose();
			
			while (mItemBtn_array.length > 0)
			{
				var btn:LabelDragButton = mItemBtn_array.shift();
				btn.dispose();
			}
		
			super.dispose();
		}
		
		private function swapBtn(pIndex_num:Number = -1):void
		{
			var targetIndex_num:Number;
			var i:Number;
			for (i = 0; i < mItemBtn_array.length; i++ )
			{
				var btn:LabelDragButton = mItemBtn_array[i];
				
				if (isNaN(targetIndex_num))
					targetIndex_num = mTimeline_mc.getChildIndex(btn.getTimeline());
				targetIndex_num = Math.max(targetIndex_num, mTimeline_mc.getChildIndex(btn.getTimeline()));
			}
			
			mTimeline_mc.swapChildrenAt(mTimeline_mc.getChildIndex(mItemBtn_array[pIndex_num].getTimeline()), targetIndex_num);
		}
		
		private function enableBtn(pEnable_bol:Boolean, pExcludeIndex_num:Number = -1):void
		{
			for (var i:Number = 0; i < mItemBtn_array.length; i++ )
			{
				if(i != pExcludeIndex_num)
					LabelDragButton(mItemBtn_array[i]).enabled = pEnable_bol;
			}
		}
		
		private function tweenBtn(pTween_bol:Boolean):void
		{
			for (var i:Number = 0; i < mItemBtn_array.length; i++ )
			{
				if (pTween_bol)
				{
					this.doTweenBtn(i);
				}
				else
				{
					Tweener.removeTweens(mItemBtn_array[i].getTimeline());
				}
			}
		}
		
		private function doTweenBtn(pIndex_num:Number):void
		{
			var btn:LabelDragButton = mItemBtn_array[pIndex_num];
			var btn_mc:MovieClip = btn.getTimeline();
			var delta_num:Number = 10;
			var original_pt:Point = mBtnOriginalPoint_array[pIndex_num];
			var x_num:Number = original_pt.x + CommonFunction.genRandomNumber(delta_num) - delta_num/2;
			var y_num:Number = original_pt.y + CommonFunction.genRandomNumber(delta_num) - delta_num/2;
			var rotation_num:Number = mBtnOriginalRotation_array[pIndex_num] + CommonFunction.genRandomNumber(delta_num) - delta_num/2;
			this.tweenMcTo(btn_mc, x_num, y_num, rotation_num, false, new FunctionCall(this, doTweenBtn, pIndex_num));
		}
		
		private function onQuestionDone():void
		{
			mNextStepCall.execute(null, mData_obj);
		}
		
		private function onItemOver(pIndex_num:Number):void
		{	
			this.tweenBtn(false);
			
			this.swapBtn(pIndex_num);
			
			mQuestionControl.playTo("hide", new FunctionCall(mDescriptionControl, mDescriptionControl.playTo, "hide", new FunctionCall(this, doItemOver, pIndex_num)));
		}
		
		private function doItemOver(pIndex_num:Number):void
		{
			mDescriptionContent_mc.gotoAndStop(pIndex_num + 1);
			mDescriptionControl.playTo("show");
		}
		
		private function onItemOut(pIndex_num:Number):void
		{
			this.tweenBtn(true);
			
			mDescriptionControl.playTo("hide");
			mQuestionControl.playTo("hide", new FunctionCall(mQuestionControl, mQuestionControl.playTo, "show"));
		}
		
		private function doItemOut(pIndex_num:Number):void
		{
			mQuestionControl.playTo("show");
		}
		
		private function onItemDragStart(pIndex_num:Number):void
		{
			this.enableBtn(false, pIndex_num);
			mDescriptionControl.playTo("hide");
			mQuestionControl.playTo("hide");
		}
		
		private function onItemDragging(pIndex_num:Number):void
		{
			var btn:LabelDragButton = mItemBtn_array[pIndex_num];
			if (MovieClipUtil.complexHitTestObject(btn.getTimeline(), mDragHitArea_mc, 1))
			{
				mHitAreaControl.playTo("show");
			}
			else
			{
				mHitAreaControl.playTo("hide");
			}
		}
		
		private function onItemDragStop(pIndex_num:Number):void
		{
			var btn:LabelDragButton = mItemBtn_array[pIndex_num];
			var original_pt:Point = mBtnOriginalPoint_array[pIndex_num];
			var btn_mc:MovieClip = btn.getTimeline();
			if (MovieClipUtil.complexHitTestObject(btn.getTimeline(), mDragHitArea_mc, 1))
			{
				if (pIndex_num == mScene_num)
				{
					this.enableBtn(false, pIndex_num);
					
					mTracyBackControl.playTo("show");
					mTracyFrontControl.playTo("show");
					
					for (var i:Number = 0; i < mItemBtn_array.length; i++ )
					{
						if (mItemBtn_array[i] == btn)
						{
							mItemBtn_array.splice(i, 1);
							break;
						}
					}
					btn.dispose();
				
					//this.tweenMcTo(btn_mc, mReference0_mc.x, mReference0_mc.y, Math.round(Math.random()*10000)%40 - 20, true, new FunctionCall(this, tweenMcTo, btn_mc, mReference1_mc.x, mReference1_mc.y, 0, true, new FunctionCall(this, onQuestionDone)));
					this.tweenMcTo(btn_mc, mReference0_mc.x, mReference0_mc.y, Math.round(Math.random() * 10000) % 40 - 20, true, new FunctionCall(this, tweenMcTo, btn_mc, mReference1_mc.x, mReference1_mc.y, 0, true));
					this.onQuestionDone();
				}
				else
				{
					this.enableBtn(false);
					mWrong_mc.gotoAndPlay(2);
					this.tweenMcTo(btn.getTimeline(), original_pt.x, original_pt.y, btn.getTimeline().rotation, true, new FunctionCall(this, onItemDragStopDone));
				}
			}
			else
			{
				this.enableBtn(false);
				if (btn_mc.x == original_pt.x && btn_mc.y == original_pt.y)
					this.onItemDragStopDone();
				else
					this.tweenMcTo(btn_mc, original_pt.x, original_pt.y, btn_mc.rotation, true, new FunctionCall(this, onItemDragStopDone));
			}
		}
		
		private function onItemDragStopDone():void
		{
			this.enableBtn(true);
			mQuestionControl.playTo("show");
			
			this.tweenBtn(true);
		}
		
		private function tweenMcTo(pTarget_mc:MovieClip, pX_num:Number, pY_num:Number, pRotation_num:Number, pEase_bol:Boolean = true, pDoneCall:ICall = null):void
		{
			var param_obj:Object = new Object();
			param_obj["x"] = pX_num;
			param_obj["y"] = pY_num;
			param_obj["rotation"] = pRotation_num;
			param_obj["time"] = 30;
			param_obj["useFrames"] = true;
			param_obj["onComplete"] = new Delegate(this, onTweenDone, pDoneCall).getFunction();
			if(!pEase_bol)
				param_obj["transition"] = Equations.easeNone;
			Tweener.addTween(pTarget_mc, param_obj);
		}
		
		private function onTweenDone(e:*, pDoneCall:ICall = null):void
		{
			if (pDoneCall)
				pDoneCall.execute();
		}
		
	}

}