var loginSuccessCallback= null;
var editSuccessCallback= null;
var editAccountDetails= null;

function showOrHideDiv(div, show) {
  if (show) {
    div.show();
  } else {
    div.hide();
  }
}
$(function() {
  $(".loginLink").live("click", function(e) {
    e.preventDefault();
    displayLoginDialog("login");
    return false;
  });
  $(".lostPasswordLink").live("click", function(e) {
    e.preventDefault();
    displayLoginDialog("lostPassword");
    return false;
  });
  $(".lostActivationLink").live("click", function(e) {
    e.preventDefault();
    displayLoginDialog("activation");
    return false;
  });
  $(".logoutLink").live("click", function(e) {
    e.preventDefault();
    logout();
    return false;
  });
  $(".registerLink").live("click", function(e) {
    e.preventDefault();
    displayLoginDialog("register");
    return false;
  });
  $(".accountEditLink").live("click", function(e) {
    e.preventDefault();
    displayEditDialogDialog("accountEdit");
    return false;
  });
  $(".changePasswordLink").live("click", function(e) {
    e.preventDefault();
    displayEditDialogDialog("changePassword");
    return false;
  });
  
  
});

function updateLoggedInAs() {
  $("#login").load("/user/current.ajax");
}

// Dialog pop-up
function dialogPopup(title, content, buttons) {
  if (buttons === undefined) {
    buttons= {
        Ok: function() {
          $("#popupDialog").dialog("close");
          $("#popupDialog").dialog("destroy");
          $(".ui-widget-overlay:last").attr("style", $(".ui-widget-overlay:last").attr("style") + "; opacity: 0.85");
        }
    };
  }
  
  $("#popupDialog *").remove();
  $("#popupDialog").append("<p>" + content + "</p>");
  $("#popupDialog").dialog({
    title: title,
    bgiframe: true,
    modal: true,
    resizable: false,
    buttons: buttons,
    width: 350,
    zIndex:22000,
    autoOpen: false
  });
  
  $("#popupDialog").dialog("open");
  
  $("#popupDialog + .ui-dialog-buttonpane button").attr("style", "float: right");
  $(".ui-widget-overlay:not(:last)").attr("style", $(".ui-widget-overlay:not(:last)").attr("style") + "; opacity: 0");
}

// General buttons
var closeButtons= {
  Close: function() {
    $(this).dialog("close");
  }
};

// Login dialog
function displayLoginDialog(mode, loginCallback) {
  $("#loginDialog").dialog({
    bgiframe: true,
    modal: true,
    resizable: false,
    width: 450,
    position: ['center',100],
    zIndex: 21000,
    autoOpen: false
  });
  
  loginSuccessCallback= loginCallback;
  
  if (mode == "login") {
    showLoginForm();
  } else if (mode == "register") {
    showRegisterPersonal();
  } else if (mode == "activation") {
    showActivationForm();
  } else if (mode == "lostPassword") {
    showLostPasswordForm();
  } else {
    showLoginForm();
  }
  
  $("#loginDialog").dialog("open");
}

function loginSuccess() {
  updateLoggedInAs();
  $("#loginDialog").dialog("close");
  $("#loginDialog").dialog("destroy");
  if (loginSuccessCallback != null) {
    loginSuccessCallback();
    loginSuccessCallback= null;
  }
}

function showLoginDialogDiv(divToShow) {
  showOrHideDiv($("#inlineLogin"), ("#inlineLogin" == divToShow));
  showOrHideDiv($("#inlineRegister"), ("#inlineRegister" == divToShow));
  showOrHideDiv($("#inlineActivation"), ("#inlineActivation" == divToShow));
  showOrHideDiv($("#inlineLostPassword"), ("#inlineLostPassword" == divToShow));
}

// Login
function showLoginDiv(divToShow) {
  showOrHideDiv($("#inlineLoginForm"), ("#inlineLoginForm" == divToShow));
  showOrHideDiv($("#inlineLoginSubmitted"), ("#inlineLoginSubmitted" == divToShow));
}

$(function() {
  $("#loginForm").submit(function() {
    $(this).ajaxSubmit({
      dataType: "xml",
      success: function(data) {
        aStatus= $("status", data).text();
        if (aStatus == 'success') {
          loginSuccess();
        } else if (aStatus == 'notActivated') {
          showActivationForm($("#inlineLogin input[name='username']").val(), $("#inlineLogin input[name='password']").val());
        } else {
          dialogPopup("Login", 'Invalid username or password');
          showLoginForm();
        }
        
      },
      error: function(data) {
        dialogPopup("Login", 'Sorry. A system error has prevented you logging in. This has been reported to a system administrator. Please try again later.');
        showLoginForm();
      },
      cache: false
    });
    
    return false;
  });
});

// Login buttons
var loginButtons= {
  Login: function() {
    login();
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Register New Account": function() {
    showRegisterPersonal();
  },
  "Lost Password": function() {
    showLostPasswordForm();
  }
};

// Login: Form
function showLoginForm() {
  $("#loginDialog").dialog("option", "title", "Login");
  $("#loginDialog").dialog("option", "buttons", loginButtons);
  
  showLoginDiv("#inlineLoginForm");
  
  showLoginDialogDiv("#inlineLogin");
  
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(3)").attr("style", "float: left");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
}

function login() {
  showLoginSubmitted();
  $("#loginForm").submit();
}

// Login: Submitted
function showLoginSubmitted() {
  $("#loginDialog").dialog("option", "title", "<img src='/style/img/ajax-loader.gif' style='float: left; padding-right: 4px; margin-left: -6px' width='16' height='16'/>Login");
  $("#loginDialog").dialog("option", "buttons", closeButtons);
  
  showLoginDiv("#inlineLoginSubmitted");
  
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(3)").attr("style", "float: left");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
}

// Registration
function showRegisterDiv(divToShow) {
  showOrHideDiv($("#inlineRegisterPersonal"), ("#inlineRegisterPersonal" == divToShow));
  showOrHideDiv($("#inlineRegisterContact"), ("#inlineRegisterContact" == divToShow));
  showOrHideDiv($("#inlineRegisterLogin"), ("#inlineRegisterLogin" == divToShow));
  showOrHideDiv($("#inlineRegisterSubscribe"), ("#inlineRegisterSubscribe" == divToShow));
  showOrHideDiv($("#inlineRegisterSubmitted"), ("#inlineRegisterSubmitted" == divToShow));
}

function register() {
  showRegisterSubmitted();
  $("#registerForm").submit();
}

$(function() {
  $("#registerForm").submit(function() {
    $(this).ajaxSubmit({
      success: function(data) {
        aStatus= $("status", data).text();
        if (aStatus == 'success') {
          showActivationForm($("#inlineRegisterLogin input[name='username']").val(), $("#inlineRegisterLogin input[name='password']").val());
        } else if (aStatus == "fail") {
          
          reasonHtml= "<ul>";
          
          $("reason li", data).each(function() {
            reasonHtml+= "<li>" + $(this).text() + "</li>";
          });
          reasonHtml+= "<ul>";
          
          dialogPopup("Registration Error", "The registration failed for the following reason: " + reasonHtml);
          
          if ($("firstErrorPage", data).text() == "personal") {
            showRegisterPersonal();
          } else if ($("firstErrorPage", data).text() == "contact") {
            showRegisterContact();
          } else if ($("firstErrorPage", data).text() == "login") {
            showRegisterLogin();
          }
          
        } else {
          dialogPopup("Registration Error", 'Unsuccessful registration for unknown reason. Reason given: ' + aStatus);
          showRegisterSubscribe();
        }
      },
      error: function(data) {
        dialogPopup("Registration Error", 'Sorry. A system error has prevented you registering. This has been reported to a system administrator. Please try again later.');
        showRegisterSubscribe();
      },
      cache: false
    });
    
    return false;
  });
});

// Registration: personal details
var registerPersonalButtons= {
  Next: function() {
    valid= validateRegisterPersonal();
    if (valid) {
      showRegisterContact();
    } else {
      dialogPopup("Registration Validation", "Please fix highlighted validation errors");
    }
  },
  Previous: function() {},
  Cancel: function() {
    $(this).dialog("close");
  },
  "Login Form": function() {
    showLoginForm();
  },
  "Lost Password": function() {
    showLostPasswordForm();
  }
};

function validateRegisterPersonal() {
  valid= true;
  
  $("#inlineRegisterPersonal td.validation").html("");
  
  firstname= $("#inlineRegisterPersonal input[name='firstname']");
  if ($.trim(firstname.val()) == "") {
    $("td.validation", firstname.parent().parent()).html("*");
    valid= false;
  }
  
  lastname= $("#inlineRegisterPersonal input[name='lastname']");
  if ($.trim(lastname.val()) == "") {
    $("td.validation", lastname.parent().parent()).html("*");
    valid= false;
  }
  
  company= $("#inlineRegisterPersonal input[name='company']");
  if ($.trim(company.val()) == "") {
    $("td.validation", company.parent().parent()).html("*");
    valid= false;
  }
  
  return valid;
}

function showRegisterPersonal() {
  $("#loginDialog").dialog("option", "title", "Register: Personal Details (Step 1/4)");
  $("#loginDialog").dialog("option", "buttons", registerPersonalButtons);
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(2)").attr("disabled", "disabled");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(2)").addClass("ui-state-disable");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(5)").attr("style", "float: left");
  
  showRegisterDiv("#inlineRegisterPersonal");
  
  showLoginDialogDiv("#inlineRegister");
}

// Registration: contact details
var registerContactButtons= {
  Next: function() {
    valid= validateRegisterContact();
    if (valid) {
      showRegisterLogin();
    } else {
      dialogPopup("Registration Validation", "Please fix highlighted validation errors");
    }
  },
  Previous: function() {
    showRegisterPersonal()
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Login Form": function() {
    showLoginForm();
  },
  "Lost Password": function() {
    showLostPasswordForm();
  }
};

function checkEmail(emailAddress) {
  if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(emailAddress)) {
    return true;
  } else {
    return false;
  }
}

function validateRegisterContact() {
  valid= true;
  
  $("#inlineRegisterContact td.validation").html("");
  
  email= $("#inlineRegisterContact input[name='email']");
  if ($.trim(email.val()) == "") {
    $("td.validation", email.parent().parent()).html("*");
    valid= false;
  } else if (!checkEmail($.trim(email.val()))) {
    $("td.validation", email.parent().parent()).html("Email address is not valid");
    valid= false;
  }
  
  return valid;
}

function showRegisterContact() {
  $("#loginDialog").dialog("option", "title", "Register: Contact Details (Step 2/4)");
  $("#loginDialog").dialog("option", "buttons", registerContactButtons);
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(5)").attr("style", "float: left");
  
  showRegisterDiv("#inlineRegisterContact");
  
  showLoginDialogDiv("#inlineRegister");
}

// Registration: login details
var registerLoginButtons= {
  Next: function() {
    valid= validateRegisterLogin()
    if (valid) {
      showRegisterSubscribe();
    } else {
      dialogPopup("Registration Validation", "Please fix highlighted validation errors");
    }
  },
  Previous: function() {
    showRegisterContact()
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Login Form": function() {
    showLoginForm();
  },
  "Lost Password": function() {
    showLostPasswordForm();
  }
};

function validateRegisterLogin() {
  valid= true;
  
  $("#inlineRegisterContact td.validation").html("");
  
  username= $("#inlineRegisterLogin input[name='username']");
  if ($.trim(username.val()) == "") {
    $("td.validation", username.parent().parent()).html("*");
    valid= false;
  }
  
  password= $("#inlineRegisterLogin input[name='password']");
  aConfirm= $("#inlineRegisterLogin input[name='confirm']");
  
  if ($.trim(password.val()) == "") {
    $("td.validation", password.parent().parent()).html("*");
    valid= false;
  } else if ($.trim(password.val()).length < 6) {
    $("td.validation", password.parent().parent()).html("Passwords must be more than 6 letters long");
    valid= false;
  } else if ($.trim(password.val()) != $.trim(aConfirm.val())) {
    $("td.validation", password.parent().parent()).html("Passwords do not match");
    valid= false;
  }
  
  return valid;
}

function showRegisterLogin() {
  $("#loginDialog").dialog("option", "title", "Register: Login Details (Step 3/4)");
  $("#loginDialog").dialog("option", "buttons", registerLoginButtons);
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(5)").attr("style", "float: left");
  
  showRegisterDiv("#inlineRegisterLogin");
  
  showLoginDialogDiv("#inlineRegister");
}

// Registration: Newsletter Subscriptions
var registerSubscribeButtons= {
  Register: function() {
    register();
  },
  Previous: function() {
    showRegisterLogin()
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Login Form": function() {
    showLoginForm();
  },
  "Lost Password": function() {
    showLostPasswordForm();
  }
};

function showRegisterSubscribe() {
  $("#loginDialog").dialog("option", "title", "Register: Newsletter Subscriptions (Step 4/4)");
  $("#loginDialog").dialog("option", "buttons", registerSubscribeButtons);
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(5)").attr("style", "float: left");
  
  showRegisterDiv("#inlineRegisterSubscribe");
  
  showLoginDialogDiv("#inlineRegister");
}

// Registration: submitted
function showRegisterSubmitted() {
  $("#loginDialog").dialog("option", "title", "<img src='/style/img/ajax-loader.gif' style='float: left; padding-right: 4px; margin-left: -6px' width='16' height='16'/>Register: Submitted");
  $("#loginDialog").dialog("option", "buttons", closeButtons);
  
  showRegisterDiv("#inlineRegisterSubmitted");
  
  showLoginDialogDiv("#inlineRegister");
}

// Activation
function showActivationDiv(divToShow) {
  showOrHideDiv($("#inlineActivationForm"), ("#inlineActivationForm" == divToShow));
  showOrHideDiv($("#inlineActivationSubmitted"), ("#inlineActivationSubmitted" == divToShow));
}

function activate() {
  showActivationSubmitted();
  $("#activateForm").submit();
}

$(function() {
  $("#activateForm").submit(function() {
    $(this).ajaxSubmit({
      success: function(data) {
        aStatus= $("status", data).text();
        if (aStatus == 'success') {
          loginSuccess();
        } else if (aStatus == "invalidActivationCode") {
          dialogPopup("Activation Failed", "The code you supplied is invalid.");
          showActivationForm(null, null);
        } else if (aStatus == "alreadyActivated") {
          dialogPopup("Activation Failed", "Your account has already been activated.");
          showLoginForm();
        } else if (aStatus == "invalidLogin") {
          dialogPopup("Activation Failed", "The username/password you supplied are invalid.");
          showActivationForm(null, null);
        } else if (aStatus == "fail") {
          reasonHtml= "<ul>";
          
          $("reason li", data).each(function() {
            reasonHtml+= "<li>" + $(this).text() + "</li>";
          });
          reasonHtml+= "<ul>";
          
          dialogPopup("Activation Failed", "The activation failed for the following reason: " + reasonHtml);
          
          showActivationForm(null, null);
        } else {
          dialogPopup("Activation Error", 'Unsuccessful activation for unknown reason. Reason given: ' + aStatus);
          showActivationForm(null, null);
        }
      },
      error: function(data) {
        dialogPopup("Activation Error", 'Sorry. A system error has prevented you activating. This has been reported to a system administrator. Please try again later.');
        showActivationForm(null, null);
      },
      cache: false
    });
    
    return false;
  });
});

// Activation: form
var activationFormButtons= {
  Activate: function() {
      activate();
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Login Form": function() {
    showLoginForm();
  },
  "Lost Password": function() {
    showLostPasswordForm();
  }
};

function showActivationForm(username, password) {
  $("#loginDialog").dialog("option", "title", "Account Activation");
  $("#loginDialog").dialog("option", "buttons", activationFormButtons);
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(3)").attr("style", "float: left");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  
  if (username != null) {
    $("#activationUsername").val(username);
  }
  
  if (password != null) {
    $("#activationPassword").val(password);
  }
  
  showActivationDiv("#inlineActivationForm");
  
  showLoginDialogDiv("#inlineActivation");
}

// Activation: submitted
function showActivationSubmitted() {
  $("#loginDialog").dialog("option", "title", "<img src='/style/img/ajax-loader.gif' style='float: left; padding-right: 4px; margin-left: -6px' width='16' height='16'/>Account Activation");
  $("#loginDialog").dialog("option", "buttons", closeButtons);
  
  showActivationDiv("#inlineActivationSubmitted");
  
  showLoginDialogDiv("#inlineActivation");
}

// Lost Password
function showLostPasswordDiv(divToShow) {
  showOrHideDiv($("#inlineLostPasswordForm"), ("#inlineLostPasswordForm" == divToShow));
  showOrHideDiv($("#inlineLostPasswordSubmitted"), ("#inlineLostPasswordSubmitted" == divToShow));
}

function lostPassword() {
  showLostPasswordSubmitted();
  $("#lostPasswordForm").submit();
}

$(function() {
  $("#lostPasswordForm").submit(function() {
    $(this).ajaxSubmit({
      success: function(data) {
        aStatus= $("status", data).text();
        if (aStatus == 'success') {
          dialogPopup("Lost Password Success", "Your password has been set to the value you set. You have been emailed your username and a new activation code.");
          showActivationForm();
        } else if (aStatus == "fail") {
          
          reasonHtml= "<ul>";
          
          $("reason li", data).each(function() {
            reasonHtml+= "<li>" + $(this).text() + "</li>";
          });
          reasonHtml+= "<ul>";
          
          dialogPopup("Lost Password Error", "Your lost password request failed for the following reason: " + reasonHtml);
          showLostPasswordForm();
        } else {
          dialogPopup("Lost Password Error", 'Unsuccessful lost password for unknown reason. Reason given: ' + aStatus);
        }
      },
      error: function(data) {
        dialogPopup("Lost Password Error", 'Sorry. A system error has prevented you resetting your password. This has been reported to a system administrator. Please try again later.');
        showLostPasswordForm();
      },
      cache: false
    });
    
    return false;
  });
});

// Lost Password: form
var lostPasswordFormButtons= {
  "Reset Password": function() {
    valid= validateLostPasswordForm()
      if (valid) {
        lostPassword();
      } else {
        dialogPopup("Lost Password Validation", "Please fix highlighted validation errors");
      }
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Register New Account": function() {
    showRegisterPersonal();
  },
  "Login Form": function() {
    showLoginForm();
  }
};

function showLostPasswordForm() {
  $("#loginDialog").dialog("option", "title", "Lost Password");
  $("#loginDialog").dialog("option", "buttons", lostPasswordFormButtons);
  
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(3)").attr("style", "float: left");
  $("#loginDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  
  showLoginDialogDiv("#inlineLostPassword");
  
  showLostPasswordDiv("#inlineLostPasswordForm");
}

function validateLostPasswordForm() {
  valid= true;
  
  $("#inlineLostPasswordForm td.validation").html("");
  
  email= $("#inlineLostPasswordForm input[name='email']");
  if ($.trim(email.val()) == "") {
    $("td.validation", email.parent().parent()).html("*");
    valid= false;
  } else if (!checkEmail($.trim(email.val()))) {
    $("td.validation", email.parent().parent()).html("Email address is not valid");
    valid= false;
  }
  
  password= $("#inlineLostPasswordForm input[name='password']");
  aConfirm= $("#inlineLostPasswordForm input[name='confirm']");
  
  if ($.trim(password.val()) == "") {
    $("td.validation", password.parent().parent()).html("*");
    valid= false;
  } else if ($.trim(password.val()).length < 6) {
    $("td.validation", password.parent().parent()).html("Passwords must be more than 6 letters long");
    valid= false;
  } else if ($.trim(password.val()) != $.trim(aConfirm.val())) {
    $("td.validation", password.parent().parent()).html("Passwords do not match");
    valid= false;
  }
  
  return valid;
}

// Lost Password: submitted
function showLostPasswordSubmitted() {
  $("#accountEditDialog").dialog("option", "title", "<img src='/style/img/ajax-loader.gif' style='float: left; padding-right: 4px; margin-left: -6px' width='16' height='16'/>Lost Password");
  $("#accountEditDialog").dialog("option", "buttons", closeButtons);
  
  showLoginDialogDiv("#inlineLostPassword");
  
  showLostPasswordDiv("#inlineLostPasswordSubmitted");
}

// Logout
function logout() {
  $("#login").html("Logout in progress...");
  $.ajax({
    url: "/user/logout.ajax",
    success: function() {
      updateLoggedInAs();
    },
    error: function() {
      dialogPopup("Logout", "A server error has prevented you logging out. This has been reported to a system administrator. Please try again later.");
    }
  });
}

// Account Edit
function displayEditDialogDialog(mode, editCallback) {
  $("#accountEditDialog").dialog({
    bgiframe: true,
    modal: true,
    resizable: false,
    width: 450,
    position: ['center',100],
    zIndex: 21000,
    autoOpen: false
  });
  
  editSuccessCallback= editCallback;
  
  if (mode == "accountEdit") {
    loadAccountDetails();
  } else if (mode == "changePassword") {
    showChangePasswordForm();
  } else {
    loadAccountDetails();
  }
  
  $("#accountEditDialog").dialog("open");
}

function loadAccountDetails() {
  if (editAccountDetails == null) {
    showAccountEditLoading();
    $.ajax({
      url: "/user/currentDetails.ajax",
      success: function(data) {
        aStatus= $("status", data).text();
        if (aStatus == 'notLoggedIn') {
          dialogPopup("Edit Account Error", "Your login session has expired. Please login again.");
          $("#accountEditDialog").dialog("close");
          $("#accountEditDialog").dialog("destroy");
        } else {
          // pre-populate personal fields
          $("#inlineAccountEditPersonal input[name='firstname']").val($("first_name", data).text());
          $("#inlineAccountEditPersonal input[name='lastname']").val($("last_name", data).text());
          $("#inlineAccountEditPersonal input[name='company']").val($("company", data).text());
          $("#inlineAccountEditPersonal input[name='job_title']").val($("job_title", data).text());
          
          // pre-populate contact fields
          $("#inlineAccountEditContact input[name='email']").val($("email", data).text());
          $("#inlineAccountEditContact input[name='website']").val($("website", data).text());
          $("#inlineAccountEditContact input[name='phone']").val($("tel_number", data).text());
          $("#inlineAccountEditContact input[name='address']").val($("address1", data).text());
          $("#inlineAccountEditContact input[name='locality']").val($("address2", data).text());
          $("#inlineAccountEditContact input[name='city']").val($("city", data).text());
          $("#inlineAccountEditContact input[name='county']").val($("state", data).text());
          $("#inlineAccountEditContact input[name='post_code']").val($("postal_code", data).text());
          $("#inlineAccountEditContact input[name='country']").val($("country_code", data).text());
          
          // pre-populate login fields
          $("#inlineAccountEditLogin input[name='username']").val($("username", data).text());
          
          showAccountEditPersonal();
        }
      },
      error: function() {
        dialogPopup("Edit Account Error", "Sorry. A system error has prevented you editing your account. This has been reported to a system administrator. Please try again later.");
        $("#accountEditDialog").dialog("close");
        $("#accountEditDialog").dialog("destroy");
      }
    });
  } else {
    showAccountEditPersonal();
  }
}

function showAccountEditDialogDiv(divToShow) {
  showOrHideDiv($("#inlineAccountEdit"), ("#inlineAccountEdit" == divToShow));
  showOrHideDiv($("#inlineChangePassword"), ("#inlineChangePassword" == divToShow));
}

function showAccountEditDiv(divToShow) {
  showOrHideDiv($("#inlineAccountEditLoading"), ("#inlineAccountEditLoading" == divToShow));
  showOrHideDiv($("#inlineAccountEditPersonal"), ("#inlineAccountEditPersonal" == divToShow));
  showOrHideDiv($("#inlineAccountEditContact"), ("#inlineAccountEditContact" == divToShow));
  showOrHideDiv($("#inlineAccountEditLogin"), ("#inlineAccountEditLogin" == divToShow));
  showOrHideDiv($("#inlineAccountEditSubscribe"), ("#inlineAccountEditSubscribe" == divToShow));
  showOrHideDiv($("#inlineAccountEditSubmitted"), ("#inlineAccountEditSubmitted" == divToShow));
}

function accountEdit() {
  showAccountEditSubmitted();
  $("#accountEditForm").submit();
}

function editSuccess() {
  updateLoggedInAs();
  $("#accountEditDialog").dialog("close");
  $("#accountEditDialog").dialog("destroy");
  if (editSuccessCallback != null) {
    editSuccessCallback();
    editSuccessCallback= null;
  }
}

$(function() {
  $("#accountEditForm").submit(function() {
    $(this).ajaxSubmit({
      success: function(data) {
        aStatus= $("status", data).text();
        if (aStatus == 'success') {
          dialogPopup("Account Edit Success", "Your account has been updated.");
          editSuccess();
          $("#accountEditDialog").dialog("close");
          $("#accountEditDialog").dialog("destroy");
        } else if (aStatus == "emailChanged") {
          displayLoginDialog("activation", editSuccess);
          dialogPopup("Account Edit Success", "Your account has been updated. You have changed your email address, and so will need to reactivate your account with the activation code you were sent.");
          $("#accountEditDialog").dialog("close");
          $("#accountEditDialog").dialog("destroy");
          
        } else if (aStatus == "fail") {
          
          reasonHtml= "<ul>";
          
          $("reason li", data).each(function() {
            reasonHtml+= "<li>" + $(this).text() + "</li>";
          });
          reasonHtml+= "<ul>";
          
          dialogPopup("Account Edit Error", "The account edit failed for the following reason: " + reasonHtml);
          
          if ($("firstErrorPage", data).text() == "personal") {
            showAccountEditPersonal();
          } else if ($("firstErrorPage", data).text() == "contact") {
            showAccountEditContact();
          } else if ($("firstErrorPage", data).text() == "login") {
            showAccountEditLogin();
          }
        } else if (aStatus == 'notLoggedIn') {
          dialogPopup("Account Edit Error", "Your login session has expired. Please login and try again.");
          $("#accountEditDialog").dialog("close");
          $("#accountEditDialog").dialog("destroy");
        } else {
          dialogPopup("Account Edit Error", 'Unsuccessful account edit for unknown reason. Reason given: ' + aStatus);
          showAccountEditSubscribe();
        }
      },
      error: function(data) {
        dialogPopup("Account Edit Error", 'Sorry. A system error has prevented you editing your account. This has been reported to a system administrator. Please try again later.');
        showAccountEditSubscribe();
      },
      cache: false
    });
    
    return false;
  });
});

// Account Edit: loading details
var accountEditLoadingButtons= {
  Next: function() {},
  Previous: function() {},
  Cancel: function() {
    $(this).dialog("close");
  },
  "Change Password": function() {
    showChangePasswordForm();
  }
};

function showAccountEditLoading() {
  $("#accountEditDialog").dialog("option", "title", "<img src='/style/img/ajax-loader.gif' style='float: left; padding-right: 4px; margin-left: -6px' width='16' height='16'/>Account Edit: Loading...");
  $("#accountEditDialog").dialog("option", "buttons", accountEditLoadingButtons);
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(1)").attr("disabled", "disabled");
  $("#accountEditDialog + ui-dialog-buttonpane button:nth-child(1)").addClass("ui-state-disable");
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(2)").attr("disabled", "disabled");
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(2)").addClass("ui-state-disable");
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  
  showAccountEditDiv("#inlineAccountEditLoading");
  
  showAccountEditDialogDiv("#inlineAccountEdit");
}

// Account Edit: personal details
var accountEditPersonalButtons= {
  Next: function() {
    valid= validateAccountEditPersonal();
    if (valid) {
      showAccountEditContact();
    } else {
      dialogPopup("Account Edit Validation", "Please fix highlighted validation errors");
    }
  },
  Previous: function() {},
  Cancel: function() {
    $(this).dialog("close");
  },
  "Change Password": function() {
    showChangePasswordForm();
  }
};

function validateAccountEditPersonal() {
  valid= true;
  
  $("#inlineAccountEditPersonal td.validation").html("");
  
  firstname= $("#inlineAccountEditPersonal input[name='firstname']");
  if ($.trim(firstname.val()) == "") {
    $("td.validation", firstname.parent().parent()).html("*");
    valid= false;
  }
  
  lastname= $("#inlineAccountEditPersonal input[name='lastname']");
  if ($.trim(lastname.val()) == "") {
    $("td.validation", lastname.parent().parent()).html("*");
    valid= false;
  }
  
  company= $("#inlineAccountEditPersonal input[name='company']");
  if ($.trim(company.val()) == "") {
    $("td.validation", company.parent().parent()).html("*");
    valid= false;
  }
  
  return valid;
}

function showAccountEditPersonal() {
  $("#accountEditDialog").dialog("option", "title", "Account Edit: Personal Details (Step 1 of 4)");
  $("#accountEditDialog").dialog("option", "buttons", accountEditPersonalButtons);
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(2)").attr("disabled", "disabled");
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(2)").addClass("ui-state-disable");
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  
  showAccountEditDiv("#inlineAccountEditPersonal");
  
  showAccountEditDialogDiv("#inlineAccountEdit");
}

// Account Edit: contact details
var accountEditContactButtons= {
  Next: function() {
    valid= validateAccountEditContact();
    if (valid) {
      showAccountEditLogin();
    } else {
      dialogPopup("Account Edit Validation", "Please fix highlighted validation errors");
    }
  },
  Previous: function() {
    showAccountEditPersonal()
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Change Password": function() {
    showChangePasswordForm();
  }
};

function checkEmail(emailAddress) {
  if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(emailAddress)) {
    return true;
  } else {
    return false;
  }
}

function validateAccountEditContact() {
  valid= true;
  
  $("#inlineAccountEditContact td.validation").html("");
  
  email= $("#inlineAccountEditContact input[name='email']");
  if ($.trim(email.val()) == "") {
    $("td.validation", email.parent().parent()).html("*");
    valid= false;
  } else if (!checkEmail($.trim(email.val()))) {
    $("td.validation", email.parent().parent()).html("Email address is not valid");
    valid= false;
  }
  
  return valid;
}

function showAccountEditContact() {
  $("#accountEditDialog").dialog("option", "title", "Account Edit: Contact Details (Step 2 of 4)");
  $("#accountEditDialog").dialog("option", "buttons", accountEditContactButtons);
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  
  showAccountEditDiv("#inlineAccountEditContact");
  
  showAccountEditDialogDiv("#inlineAccountEdit");
}

// Account Edit: login details
var accountEditLoginButtons= {
  Next: function() {
    valid= validateAccountEditLogin()
    if (valid) {
      showAccountEditSubscribe();
    } else {
      dialogPopup("Account Edit Validation", "Please fix highlighted validation errors");
    }
  },
  Previous: function() {
    showAccountEditContact()
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Change Password": function() {
    showChangePasswordForm();
  }
};

function validateAccountEditLogin() {
  valid= true;
  
  $("#inlineAccountEditContact td.validation").html("");
  
  username= $("#inlineAccountEditLogin input[name='username']");
  if ($.trim(username.val()) == "") {
    $("td.validation", username.parent().parent()).html("*");
    valid= false;
  }
  
  return valid;
}

function showAccountEditLogin() {
  $("#accountEditDialog").dialog("option", "title", "Account Edit: Login Details (Step 3 of 4)");
  $("#accountEditDialog").dialog("option", "buttons", accountEditLoginButtons);
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  
  showAccountEditDiv("#inlineAccountEditLogin");
  
  showAccountEditDialogDiv("#inlineAccountEdit");
}

// Account Edit: Newsletter Subscriptions
var accountEditSubscribeButtons= {
  "Apply": function() {
    accountEdit();
  },
  Previous: function() {
    showAccountEditLogin()
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Change Password": function() {
    showChangePasswordForm();
  }
};

function showAccountEditSubscribe() {
  $("#accountEditDialog").dialog("option", "title", "Account Edit: Newsletter Subscriptions (Step 4 of 4)");
  $("#accountEditDialog").dialog("option", "buttons", accountEditSubscribeButtons);
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(4)").attr("style", "float: left");
  
  showAccountEditDiv("#inlineAccountEditSubscribe");
  
  showAccountEditDialogDiv("#inlineAccountEdit");
}

// Account Edit: submitted
function showAccountEditSubmitted() {
  $("#accountEditDialog").dialog("option", "title", "<img src='/style/img/ajax-loader.gif' style='float: left; padding-right: 4px; margin-left: -6px' width='16' height='16'/>Account Edit: Submitted");
  $("#accountEditDialog").dialog("option", "buttons", closeButtons);
  
  showAccountEditDiv("#inlineAccountEditSubmitted");
  
  showAccountEditDialogDiv("#inlineAccountEdit");
}

// Change Password
function showChangePasswordDiv(divToShow) {
  showOrHideDiv($("#inlineChangePasswordForm"), ("#inlineChangePasswordForm" == divToShow));
  showOrHideDiv($("#inlineChangePasswordSubmitted"), ("#inlineChangePasswordSubmitted" == divToShow));
}

function changePassword() {
  showChangePasswordSubmitted();
  $("#changePasswordForm").submit();
}

$(function() {
  $("#changePasswordForm").submit(function() {
    $(this).ajaxSubmit({
      success: function(data) {
        aStatus= $("status", data).text();
        if (aStatus == 'success') {
          dialogPopup("Change Password Success", "Your password has been changed.");
          $("#accountEditDialog").dialog("close");
          $("#accountEditDialog").dialog("destroy");
        } else if (aStatus == "fail") {
          
          reasonHtml= "<ul>";
          
          $("reason li", data).each(function() {
            reasonHtml+= "<li>" + $(this).text() + "</li>";
          });
          reasonHtml+= "<ul>";
          
          dialogPopup("Change Password Error", "Your change password request failed for the following reason: " + reasonHtml);
          showChangePasswordForm();
        } else {
          dialogPopup("Change Password Error", 'Unsuccessful change password for unknown reason. Reason given: ' + aStatus);
        }
      },
      error: function(data) {
        dialogPopup("Change Password Error", 'Sorry. A system error has prevented you changing your password. This has been reported to a system administrator. Please try again later.');
        showChangePasswordForm();
      },
      cache: false
    });
    
    return false;
  });
});

// Change Password: form
var changePasswordFormButtons= {
  "Change Password": function() {
    valid= validateChangePasswordForm()
      if (valid) {
        changePassword();
      } else {
        dialogPopup("Change Password Validation", "Please fix highlighted validation errors");
      }
  },
  Cancel: function() {
    $(this).dialog("close");
  },
  "Edit Account": function() {
    loadAccountDetails();
  }
};

function showChangePasswordForm() {
  $("#accountEditDialog").dialog("option", "title", "Change Password");
  $("#accountEditDialog").dialog("option", "buttons", changePasswordFormButtons);
  $("#accountEditDialog + .ui-dialog-buttonpane button:nth-child(3)").attr("style", "float: left");
  
  showChangePasswordDiv("#inlineChangePasswordForm");
  
  showAccountEditDialogDiv("#inlineChangePassword");
}

function validateChangePasswordForm() {
  valid= true;
  
  $("#inlineChangePasswordForm td.validation").html("");
  
  currentPassword= $("#inlineChangePasswordForm input[name='existing']");
  if ($.trim(currentPassword.val()) == "") {
    $("td.validation", username.parent().parent()).html("*");
    $("td.validation", currentPassword.parent().parent()).html("*");
    valid= false;
  }
  
  password= $("#inlineChangePasswordForm input[name='password']");
  aConfirm= $("#inlineChangePasswordForm input[name='confirm']");
  
  if ($.trim(password.val()) == "") {
    $("td.validation", password.parent().parent()).html("*");
    valid= false;
  } else if ($.trim(password.val()).length < 6) {
    $("td.validation", password.parent().parent()).html("Passwords must be more than 6 letters long");
    valid= false;
  } else if ($.trim(password.val()) != $.trim(aConfirm.val())) {
    $("td.validation", password.parent().parent()).html("Passwords do not match");
    valid= false;
  }
  
  return valid;
}

// Change Password: submitted
function showChangePasswordSubmitted() {
  $("#accountEditDialog").dialog("option", "title", "<img src='/style/img/ajax-loader.gif' style='float: left; padding-right: 4px; margin-left: -6px' width='16' height='16'/>Change Password");
  $("#accountEditDialog").dialog("option", "buttons", closeButtons);
  
  showChangePasswordDiv("#inlineChangePasswordSubmitted");
  
  showAccountEditDialogDiv("#inlineChangePassword");
}
