//
// 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");
}