public IEnumerator OnNewGuest(VOGControllerAuth ctrl, AvatarGender gender)
    {
        try
        {
            ctrl.DisableInput();

            //Create guest
            ApiCall call = VostopiaClient.Authentication.BeginSignInGuest(gender);
            IEnumerator e = call.Wait();
            while (e.MoveNext()) { yield return e.Current; }
            if (!VostopiaClient.Authentication.EndSignIn(call))
            {
                ctrl.ShowMessageDialog("Uh-oh", "There was an error creating a guest account for you. Please try again.", () => { });
                yield break;
            }

            //Store authentication key
            if (call.ResponseData["authKey"] != null)
            {
                string authKey = (string)call.ResponseData["authKey"];
                ctrl.StoreGuestAuthenticationKey(authKey);
            }

            //Continue to auth completed screen
            ctrl.AuthenticationCompleted();
        }
        finally
        {
            ctrl.EnableInput();
        }
    }
    public IEnumerator OnAuthenticate(VOGControllerAuth ctrl)
    {
        try
        {
            ctrl.DisableInput();

            if (CurrentPasswordData == null || CurrentPasswordData.User == null)
            {
                ctrl.ShowMessageDialog("Doh!", "An error occurred during authentication.  Please try again", () => { });
                yield break;
            }
            VostopiaUser user = CurrentPasswordData.User;

            //Try to authenticate user
            ApiCall call = VostopiaClient.Authentication.BeginSignIn(user.Username, Password, true);
            IEnumerator e = call.Wait();
            while (e.MoveNext()) { yield return e.Current; }
            if (!VostopiaClient.Authentication.EndSignIn(call))
            {
                ctrl.ShowMessageDialog("Uh-oh", "The password you entered doesn't match our records.  Please try again or use the 'Send me a new password' option below.", () => { });
                yield break;
            }

            //Store authentication key
            if (call.ResponseData["authKey"] != null)
            {
                ctrl.StoreUserAuthenticationKey(user, (string)call.ResponseData["authKey"]);
            }

            ctrl.AuthenticationCompleted();
        }
        finally
        {
            ctrl.EnableInput();
        }
    }
    public IEnumerator OnSignIn(VOGControllerAuth ctrl)
    {
        try
        {
            ctrl.DisableInput();

            var authSelectData = new VOGStateAuthSelect.AuthSelectData();
            authSelectData.EnableCancel = false;

            //Make sure we have UserAuth object
            if (UserAuth == null || string.IsNullOrEmpty(UserAuth.AuthKey))
            {
                ctrl.ShowMessageDialog("Doh!", "An error occurred during authentication. Please try again", () =>
                {
                    ctrl.StartTransition(AuthSelectorScreen, authSelectData);
                });
                yield break;
            }

            //Try to authenticate user
            ApiCall call = VostopiaClient.Authentication.BeginSignInAuthKey(UserAuth.AuthKey);
            IEnumerator e = call.Wait();
            while (e.MoveNext()) { yield return e.Current; }
            if (!VostopiaClient.Authentication.EndSignIn(call))
            {
                ctrl.ShowMessageDialog("Session Expired", "Your authentication session has expired. Please sign in again.", () =>
                {
                    ctrl.StartTransition(AuthSelectorScreen, authSelectData);
                });
                yield break;
            }

            //Continue to auth completed screen
            ctrl.AuthenticationCompleted();
        }
        finally
        {
            ctrl.EnableInput();
        }
    }
    public IEnumerator OnNewUser(VOGControllerAuth ctrl, AvatarGender gender)
    {
        try
        {
            ctrl.DisableInput();

            //Create user
            ApiCall call = VostopiaClient.Authentication.BeginRegister(Email, KeepInTouch, gender);
            IEnumerator e = call.Wait();
            while (e.MoveNext()) { yield return e.Current; }
            var registerResult = VostopiaClient.Authentication.EndRegister(call);
            if (registerResult != VostopiaAuthenticationClient.RegisterResult.SUCCESS)
            {
                Debug.LogWarning("Error creating new user, " + registerResult);
                string msg = "";
                if (registerResult == VostopiaAuthenticationClient.RegisterResult.USER_ALREADY_EXISTS)
                {
                    msg = "That email address is already in use!  Please try another.";
                }
                else if (registerResult == VostopiaAuthenticationClient.RegisterResult.INVALID_EMAIL)
                {
                    msg = "That email address doesn't make sense to us =(  Please try again.";
                }
                else
                {
                    msg = "Something went wrong while creating your account =(  Please try again.";
                }

                //Show message box and return to previous screen
                ctrl.ShowMessageDialog("Uh-oh", msg, () =>
                {
                    ctrl.StartBackTransition();
                });

                yield break;
            }

            //Store authentication key
            if (call.ResponseData["authKey"] != null)
            {
                string authKey = (string)call.ResponseData["authKey"];
                ctrl.StoreGuestAuthenticationKey(authKey);
            }

            //Continue to auth completed screen
            ctrl.AuthenticationCompleted();
        }
        finally
        {
            ctrl.EnableInput();
        }
    }