/// <summary>
	/// Does the hide.
	/// </summary>
	private IEnumerator DoHide(object parameter)
	{
		float wait = OnBeginHide(parameter);
		if (wait > 0)
			yield return new WaitForSeconds(wait);
		else
			yield return null;

        if (status == GUIPanelStatus.Hiding)
        {
            OnEndHide(hideAction == GUIPanelHideAction.Destroy);

            switch (hideAction)
            {
                case GUIPanelHideAction.Disable:
					guiControlDlg.SetActive(false);
                    status = GUIPanelStatus.Hidden;
                    break;

                case GUIPanelHideAction.Destroy:
					guiControlDlg.SetActive(false);
					status = GUIPanelStatus.Hidden;
					StartCoroutine("WaitForDestroy");
                    break;
            }
        }
	}
	IEnumerator WaitForDestroy()
	{
		yield return new WaitForSeconds(destroyTimeout);
		Destroy(guiControlDlg);
        status = GUIPanelStatus.Invalid;
	}
    public void InitialDefaulState()
    {
        status = GUIPanelStatus.Hiding;
        SaveActiveState();
		guiControlDlg.SetActive(false);
    }
	/// <summary>
	/// Hides the specified after time out.
	/// </summary>
	public void Hide(object parameter)
	{
		if (gameObject == null)
			return;

        // End showing
        if (status == GUIPanelStatus.Showing)
        {
            iTween.Stop(guiControlLocation);
            OnEndShow();
            status = GUIPanelStatus.Showed;
        }

		if (status == GUIPanelStatus.Showed)
		{
			status = GUIPanelStatus.Hiding;

			SaveActiveState();

			StartCoroutine(DoHide(parameter));
		}
        AvUIManager.instance.CheckShowBorder();
    }
	private IEnumerator DoShow(object parameter)
	{
        //Debug.LogWarning("DoShow" + parameter);
		yield return new WaitForSeconds(showDelay);
        if (isSetupLocation && guiControlLocation!=null)
        {
            Vector3 pos = guiControlLocation.transform.localPosition;
            pos.x = vectorSetupLocation.x;
            pos.y = vectorSetupLocation.y;
            pos.z = 0;
            guiControlLocation.transform.localPosition = pos;
        }
        //Debug.LogWarning("OnBeginShow" + parameter);
		float wait = OnBeginShow(parameter);


        AvUIManager.instance.CheckShowBorder();
		if (wait > 0)
			yield return new WaitForSeconds(wait);
		else
			yield return null;
        if (status == GUIPanelStatus.Showing)
        {
            OnEndShow();
            status = GUIPanelStatus.Showed;
        }
	}
	/// <summary>
	/// Tries the show.
	/// </summary>
	public bool TryShow(object parameter)
	{
        if (status == GUIPanelStatus.Invalid)
        {
            Init();
        }
		StopCoroutine("WaitForDestroy");

        // End hiding
        if (status == GUIPanelStatus.Hiding)
        {
            iTween.Stop(guiControlLocation);
            OnEndHide(hideAction == GUIPanelHideAction.Destroy);
            status = GUIPanelStatus.Hidden;
        }

		if (status == GUIPanelStatus.Hidden || status == GUIPanelStatus.Ok)
		{
			status = GUIPanelStatus.Showing;

			RestoreActiveState(true);
            if (isHasAlpha)
            {
                isHasAlpha = false;
                OnResetAlpha();
            }
            //Debug.LogWarning("2" + parameter);
			StartCoroutine(DoShow(parameter));
			//Debug.LogWarning("3");
			return true;
		}

		if (status == GUIPanelStatus.Showed || status == GUIPanelStatus.Showing)
		{
            StartCoroutine(DoShow(parameter));
			Debug.LogWarning("4");
			return true;
		}
		Debug.LogWarning("5");
		return false;
	}
	/// <summary>
	/// Inits this instance.
	/// </summary>
	public bool Init()
	{
        if (status >= GUIPanelStatus.Ok)
			return true;
		status = GUIPanelStatus.Invalid; 
		
		try
		{
			guiControlDlg = OnInit();
           	if (guiControlDlg != null)
			{
				status = GUIPanelStatus.Ok;
			}
           
			return true;
		}
		catch (System.Exception ex)
		{
			Debug.LogError("Init GUI panel - Init " + this.GetType().Name + "Exception - "+ ex);
		}

		return false;
	}