public static Tuple <Singular.Web.MessageType, String> ChangePassword(ChangeDetails details)
        {
            // Check for any business rule failures
            if (!details.CheckAllRules())
            {
                return(Tuple.Create(Singular.Web.MessageType.Validation, "Validation failed"));
            }

            // Check if the password meets complexity requirements
            Singular.Misc.Password.PasswordChecker passwordChecker = new Singular.Misc.Password.PasswordChecker(8, true, true, true, false, 1);
            if (!passwordChecker.CheckPassword(details.NewPassword))
            {
                return(Tuple.Create(Singular.Web.MessageType.Warning, passwordChecker.ErrorMessage));
            }

            // Attempt to change the user's password
            DataRow result = CommandProc.GetDataRow(
                "CmdProcs.cmdChangePassword",
                new string[] { "@UserID", "@OldPassword", "@NewPassword" },
                new object[] {
                Singular.Settings.CurrentUserID,
                OETWebSecurity.GetPasswordHash(details.OldPassword),
                OETWebSecurity.GetPasswordHash(details.NewPassword)
            });

            if (!(bool)result[0])
            {
                return(Tuple.Create(Singular.Web.MessageType.Warning, "The password you entered doesn't match your current password."));
            }
            else
            {
                return(Tuple.Create(Singular.Web.MessageType.Success, "Change Password Success."));
            }
        }
        /// <summary>
        /// Setup the login status control
        /// </summary>
        protected override void Setup()
        {
            base.Setup();

            HTMLDiv <object> container = Helpers.Div();

            container.Style.Display = Display.inlineblock;
            container.Style.MarginLeft("20px");

            string loginUrl   = VirtualPathUtility.ToAbsolute(FormsAuthentication.LoginUrl);
            string defaultUrl = VirtualPathUtility.ToAbsolute(FormsAuthentication.DefaultUrl);

            // Logged in
            if (Singular.Security.Security.HasAuthenticatedUser)
            {
                OETIdentity identity = OETWebSecurity.CurrentIdentity();

                var loginStatus = container.Helpers.DivC("login-status");
                {
                    loginStatus.Attributes["data-ContextMenu"] = "cmSecurity";

                    // User label
                    var userLabel = loginStatus.Helpers.HTMLTag("span", "Hello " + identity.FirstName);
                    {
                        userLabel.Style.Display = Display.inlineblock;
                    }

                    // Icon
                    loginStatus.Helpers.Image().Glyph = Singular.Web.FontAwesomeIcon.user;

                    // Context menu
                    var contextMenu = loginStatus.Helpers.DivC("context-menu-ls");
                    {
                        contextMenu.Attributes["id"] = "cmSecurity";
                        contextMenu.Style.TextAlign  = Singular.Web.TextAlign.right;

                        var contextMenuMain = contextMenu.Helpers.DivC("CM-Main");
                        {
                            var contextMenuMainHeader = contextMenuMain.Helpers.Div();
                            {
                                contextMenuMainHeader.AddClass("CM-Header");
                                contextMenuMainHeader.Helpers.Div().Helpers.HTML(identity.UserNameReadable);
                                contextMenuMainHeader.Helpers.Div().Helpers.HTML(identity.EmailAddress);
                            }

                            var contextMenuBody = contextMenuMain.Helpers.Div();
                            {
                                contextMenuBody.AddClass("Selectable");

                                // Uncomment if you have an edit profile page
                                // var contextMenuEditProfile = contextMenuBody.Helpers.Div();
                                // {
                                //   contextMenuEditProfile.Helpers.LinkFor(null, null, VirtualPathUtility.ToAbsolute("~/Profile.aspx"), "Edit Profile");
                                // }

                                // Change password
                                var contextMenuChangePassword = contextMenuBody.Helpers.Div();
                                {
                                    contextMenuChangePassword.Helpers.LinkFor(null, null, VirtualPathUtility.ToAbsolute("~/Account/ChangePassword.aspx"), "Change Password");
                                }

                                // Logout
                                var contextMenuLogout = contextMenuBody.Helpers.Div();
                                {
                                    contextMenuLogout.Helpers.LinkFor(null, null, defaultUrl + "?SCmd=Logout", "Logout");
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                // Logged out
                var loggedOutDiv = container.Helpers.Div();
                {
                    loggedOutDiv.Style.FontSize = "14px";
                    loggedOutDiv.Helpers.LinkFor(null, null, loginUrl, "Login").Style["text-decoration"] = "none";
                    loggedOutDiv.Helpers.Image().Glyph = FontAwesomeIcon.user;
                }
            }
        }