// // Copyright (c) 2008, Brian Frank and Andy Frank // // History: // 2 Apr 08 Andy Frank Creation // function User() {} /** * Focus username field. */ User.focusUsername = function() { var elem = $("#username"); if (elem != null) elem.focus(); } $(document).ready(User.focusUsername); ////////////////////////////////////////////////////////////////////////// // Login ////////////////////////////////////////////////////////////////////////// /** * Perform a two-stage login. */ User.login = function() { // indicate we're working var submit = $("input[type='submit']"); submit.attr("value", "Logging in..."); submit.attr("disabled", "disabled"); // attempt first stage to aquire the salt for this user $.ajax({ type: "POST", url: "/sidewalk/user/?view=sidewalk::LoginView&webappWidgetCall=sidewalk::LoginView.onSalt", data: { username: $("#username").val() }, success: function(salt) { User.authenticate(salt); }, error: User.loginError }); // don't submit form return false; } /** * Authenticate credentials. */ User.authenticate = function(salt) { var username = $("#username").val(); var password = $("#password").val(); var remember = $("#remember").attr("checked"); var digest = SHA1(username + salt + password); $.ajax({ type: "POST", url: "/sidewalk/user/?view=sidewalk::LoginView&webappWidgetCall=sidewalk::LoginView.onAuthenticate", data: { username:username, digest:digest, remember:remember }, success: function(url) { window.location = (redirect != null) ? redirect : url; }, error: User.loginError }); } /** * Respond to a login failure. */ User.loginError = function(xhr, status, err) { msg = "Failed to authenticate"; // if already visible, flash, otherwise slide in var elem = $("form p.error"); if (elem.css("display") == "none") elem.text(msg).show("fast"); else elem.text(msg).fadeTo("fast", 0.5, function() { elem.fadeTo("fast", 1.0) }); // reset form var submit = $("input[type='submit']"); submit.attr("value", "Login"); submit.removeAttr("disabled"); User.focusUsername(); } ////////////////////////////////////////////////////////////////////////// // Register ////////////////////////////////////////////////////////////////////////// /** * Validate the registration form. */ User.validate = function() { // indicate we're working var submit = $("input[type='submit']"); submit.attr("value", "Registering..."); submit.attr("disabled", "disabled"); // catch client-side errors first var username = $("#username").val(); var password = $("#password").val(); var confirm = $("#confirm").val(); var valid = username.length < 32 && username.length > 2 && username == username.match(/[a-zA-Z][a-zA-Z0-9_]*/); if (username == "") User.validateResp("Username required"); else if (!valid) { User.validateResp("Invalid username
" + "Username may contain only letters,
" + "numbers and underscores, and must
" + "be between 3-32 characters"); } else if (password == "") User.validateResp("Password required"); else if (password != confirm) User.validateResp("Password not confirmed"); else { // client looks good, now validate server-side errors $.ajax({ type: "POST", url: "/sidewalk/user/?view=sidewalk::RegisterView&webappWidgetCall=sidewalk::RegisterView.onValidate", data: { username: $("#username").val() }, success: function(salt) { User.register(salt); }, error: function() { User.validateResp("Username already taken"); } }); } // don't submit form return false; } /** * Handle the validation response. */ User.validateResp = function(err) { if (err != null) { // if already visible, flash var elem = $("form p.error"); if (elem.css("display") == "none") elem.html(err).show("fast"); else elem.html(err).fadeTo("fast", 0.5, function() { elem.fadeTo("fast", 1.0) }); User.focusUsername(); } // reset form var submit = $("input[type='submit']"); submit.attr("value", "Register"); submit.removeAttr("disabled"); } /** * Register the user. */ User.register = function(salt) { var username = $("#username").val(); var password = $("#password").val(); var digest = SHA1(username + salt + password); $.ajax({ type: "POST", url: "/sidewalk/user/?view=sidewalk::RegisterView&webappWidgetCall=sidewalk::RegisterView.onRegister", data: { username:username, salt:salt, digest:digest }, success: function(url) { window.location = url; }, error: function() { User.validateResp("Register failed"); } }); } ////////////////////////////////////////////////////////////////////////// // UserView ////////////////////////////////////////////////////////////////////////// User.updateEmailPref = function() { var email = $("input[name='email']"); if (email.val() == null) return; var send = $("input[name='send']"); var policy = $("select[name='policy']"); var filter = $("select[name='filter']"); if (email.val().length == 0) { send.attr("disabled", "disabled"); policy.attr("disabled", "disabled"); filter.attr("disabled", "disabled"); } else { send.removeAttr("disabled"); if (send.attr("checked")) { policy.removeAttr("disabled"); filter.removeAttr("disabled"); } else { policy.attr("disabled", "disabled"); filter.attr("disabled", "disabled"); } } } $(document).ready(User.updateEmailPref); ////////////////////////////////////////////////////////////////////////// // ChangePasswordView ////////////////////////////////////////////////////////////////////////// /** * Validate the new password and change it. */ User.changePassword = function() { // indicate we're working var submit = $("input[type='submit']"); submit.attr("value", "Changing password..."); submit.attr("disabled", "disabled"); // catch client-side errors first var username = $("#username").val(); var salt = $("#salt").val(); var password = $("#password").val(); var confirm = $("#confirm").val(); if (password == "") User.changePasswordResp("Password required"); else if (password != confirm) User.changePasswordResp("Password not confirmed"); else { // password confirmed, update password var digest = SHA1(username + salt + password); $.ajax({ type: "POST", url: "/sidewalk/user/" + $("#userid").val() + "?view=sidewalk::ChangePasswordView&webappWidgetCall=sidewalk::ChangePasswordView.onChangePassword", data: { digest:digest }, success: function(url) { window.location = url; }, error: function() { User.changePasswordResp("Change password failed"); } }); } // don't submit form return false; } /** * Handle the change password response. */ User.changePasswordResp = function(err) { if (err != null) { // if already visible, flash var elem = $("form p.error"); if (elem.css("display") == "none") elem.html(err).show("fast"); else elem.html(err).fadeTo("fast", 0.5, function() { elem.fadeTo("fast", 1.0) }); User.focusUsername(); } // reset form var submit = $("input[type='submit']"); submit.attr("value", "Change Password"); submit.removeAttr("disabled"); }