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 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();
        }
    }
    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();
        }
    }
    /**
     * Sign in as guest. If a guest authkey is found in playerprefs, use that to log in as the same guest.
     * If no guest authkey is found, show the sign in as guest screen, where the user gets to select a gender.
     */
    public IEnumerator OnSignInGuest(VOGControllerAuth ctrl)
    {
        try
        {
            ctrl.DisableInput();

            //Try to authenticate as the same guest as last time (if there's a last time)
            string authKey = ctrl.GetStoredGuestAuthenticationKey();

            //Don't use saved guest account if ctrl is pressed while clicking on the button
            if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))
            {
                authKey = null;
            }

            bool completed = false;
            if (!string.IsNullOrEmpty(authKey))
            {
                ApiCall call = VostopiaClient.Authentication.BeginSignInAuthKey(authKey);
                IEnumerator e = call.Wait();
                while (e.MoveNext()) { yield return e.Current; }
                if (VostopiaClient.Authentication.EndSignIn(call))
                {
                    //Complete auth
                    ctrl.AuthenticationCompleted();
                    completed = true;
                }
            }

            //otherwise, send on to gender select screen
            if (!completed)
            {
                ctrl.StartTransition(GuestState);
            }
        }
        finally
        {
            ctrl.EnableInput();
        }
    }