/// <summary>
        /// Function to save the current page reference in session and redirect to signup/signin page
        /// </summary>
        /// <param name="currentPage"></param>
        /// <param name="permission">Defines user permission for current action to be performed</param>
        /// <param name="UrlToGoto">Alternative URL to be redirected (Note: Session reference to previous page will be cleared).</param>
        static public void ProfileRedirect(this BaseSublayout page, UnderstoodDotOrg.Common.Constants.UserPermission permission, string UrlToGoto = null, bool preserveURL = false)
        {
            // only set redirect if we don't already have a place to go back to - this will allow us to "chain" permission checks without losing original return URL
            if (page.Session[Constants.SessionPreviousUrl] == null && !preserveURL)
            {
                page.Session[Constants.SessionPreviousUrl] = page.Page.Request.RawUrl;
            }

            switch (permission)
            {
            case Constants.UserPermission.CommunityUser:
                //is user logged in?
                if (page.CurrentMember == null)
                {
                    //not logged in, please log in
                    page.Page.Response.Redirect(SignInPageItem.GetSignInPage().GetUrl());
                }
                else
                {
                    //is user registered for community?
                    if (String.IsNullOrEmpty(page.CurrentMember.ScreenName))
                    {
                        //redirect to community sign-up
                        redirect(page, RegisterCommunityProfileItem.GetRegisterCommunityProfilePage().GetUrl());
                    }
                }
                break;

            case Constants.UserPermission.RegisteredUser:
                //is user logged in?
                if (page.CurrentMember == null)
                {
                    //not logged in, please log in
                    redirect(page, SignInPageItem.GetSignInPage().GetUrl());
                }
                break;

            case Constants.UserPermission.AnonymousUser:
                break;

            case Constants.UserPermission.AdminUser:
                break;

            case Constants.UserPermission.Moderator:
                break;

            case Constants.UserPermission.Blogger:
                break;

            case Constants.UserPermission.Expert:
                break;

            case Constants.UserPermission.InternationalUser:
                //redirect to international user page
                if (page.isInternationalUser == Constants.GeoIPLookup.InternationalStatus.UnknownInternationalUser)
                {
                    redirect(page, InternationalUserPageItem.GetInternationalUserPage().GetUrl());
                }
                break;

            case Constants.UserPermission.AgreedToTerms:
                //redirect to T&C if they have not agreed yet
                var termsUrl = TermsandConditionsItem.GetTermsAndConditionsPage().GetUrl();

                if (page.CurrentMember != null && !page.CurrentMember.AgreedToSignUpTerms && !page.Request.RawUrl.Contains(termsUrl))
                {
                    redirect(page, termsUrl);
                }
                break;

            case Constants.UserPermission.CanPersonalize:
                if (page.CurrentMember == null)
                {
                    redirect(page, SignInPageItem.GetSignInPage().GetUrl());
                }
                else
                {
                    if (page.CurrentMember.Children == null || page.CurrentMember.Children.Count == 0)
                    {
                        redirect(page, RegisterChildInformationItem.GetRegisterChildInfoPage().GetUrl());
                    }
                }

                break;

            default:
                break;
            }

            if (!preserveURL)
            {
                //everything's fine, redirect to page if it was passed
                page.Page.Session[Constants.SessionPreviousUrl] = null;
            }

            if (!String.IsNullOrEmpty(UrlToGoto))
            {
                redirect(page, UrlToGoto);
            }
        }
        protected void uxSubmit_Click(object sender, EventArgs e)
        {
            // server-side validation
            string name     = string.Empty;
            string email    = string.Empty;
            string password = string.Empty;

            string zip            = uxZipCode.Text.RemoveHTML();
            bool   newsletter     = uxNewsletterSignup.Checked;
            bool   isFacebookUser = !string.IsNullOrEmpty(AccessToken);

            if (!string.IsNullOrEmpty(uxFirstName.Text))
            {
                name = uxFirstName.Text.RemoveHTML();
            }

            if (!string.IsNullOrEmpty(uxEmailAddress.Text))
            {
                email = uxEmailAddress.Text;
            }

            if (isFacebookUser)
            {
                password = Constants.FacebookMember_Password;
            }
            else if (!string.IsNullOrEmpty(uxPassword.Text) && !string.IsNullOrEmpty(uxPasswordConfirm.Text) && uxPassword.Text == uxPasswordConfirm.Text)
            {
                password = uxPassword.Text;
            }

            if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(email) && !string.IsNullOrEmpty(password))
            {
                // damnit barry, this is how you get ants.
                // the site keeps breaking when we test, and its breaking ugly.
                // if someone clicks to create a new user, we have to blow up the existing user or we're going to have a problem.
                this.FlushRegisteringUser();

                //everything's cool
                if (this.registeringUser == null)
                {
                    this.registeringUser = new Domain.Membership.Member();
                }

                this.registeringUser.FirstName = name;

                //bg: adding in zip code
                this.registeringUser.ZipCode = zip.Trim();

                //adding marker for FB users
                this.registeringUser.isFacebookUser = isFacebookUser;

                var membershipManager = new MembershipManager();

                try
                {
                    // helps to call the right addMember method...
                    this.registeringUser = membershipManager.AddMember(this.registeringUser, email, password);
                }
                catch (Exception ex)
                {
                    uxErrorMessage.Text = ex.Message;
                    return;
                }

                this.CurrentMember = this.registeringUser;
                this.CurrentUser   = membershipManager.GetUser(this.CurrentMember.MemberId);

                Response.Redirect(TermsandConditionsItem.GetTermsAndConditionsPage().GetUrl());
            }
            else
            {
                //something failed...
                uxErrorMessage.Text = DictionaryConstants.SomethingFailedError;
            }
        }