165 lines
5.2 KiB
JavaScript
165 lines
5.2 KiB
JavaScript
'use strict';
|
|
/* global location $ */
|
|
|
|
// Validate email addresses
|
|
function validateEmail(email) {
|
|
var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
return re.test(email);
|
|
}
|
|
|
|
// Replace inputed value with response
|
|
function replaceFromEndpoint(type, selector, cb) {
|
|
$.get('/validate?'+type+'='+$(selector).val())
|
|
.done(function(data){
|
|
$(selector).val(data);
|
|
cb();
|
|
});
|
|
}
|
|
|
|
// On page load
|
|
$(function(){
|
|
var slugNotUnique, emailNotUnique;
|
|
|
|
// Set timezone in password change link
|
|
$('#password').attr('href',"/settings/password?tz="+new Date().getTimezoneOffset());
|
|
|
|
// Delete account
|
|
$('#delete').click(function(){
|
|
if (confirm("Are you sure you want to delete your account? This CANNOT be undone! ")) {
|
|
$.ajax({
|
|
url: '/settings',
|
|
type: 'DELETE',
|
|
success: function(){
|
|
location.reload();
|
|
},
|
|
fail: function(){
|
|
alert("Failed to delete account!");
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
function validateForm(input) {
|
|
|
|
// Perform basic check, then validate uniqueness
|
|
basicCheck(function(){ validateUniqueness(input); });
|
|
|
|
function basicCheck(cb){
|
|
var checkedCount = 0;
|
|
|
|
// Check slug
|
|
if (!$('#slug-input').val()){
|
|
$('#slug-help').show().text("A slug is required. ");
|
|
$('#submit-group .main').prop('disabled',true).prop('title',"You need to enter a slug. ");
|
|
if (checkedCount>0) {cb();} else {checkedCount++;}
|
|
}
|
|
else {
|
|
if (!slugNotUnique){ $('#slug-help').hide(); }
|
|
if (checkedCount>0) {cb();} else {checkedCount++;}
|
|
}
|
|
|
|
// Check email
|
|
if (!$('#email-input').val()){
|
|
$('#email-help').show().text("An email is required. ");
|
|
$('#submit-group .main').prop('disabled',true).prop('title',"You need to enter an email address. ");
|
|
if (checkedCount>0) {cb();} else {checkedCount++;}
|
|
}
|
|
else if (!validateEmail($('#email-input').val())) {
|
|
$('#email-help').show().text("You must enter a valid email address. ");
|
|
$('#submit-group .main').prop('disabled',true).prop('title',"You need to enter a valid email address. ");
|
|
if (checkedCount>0) {cb();} else {checkedCount++;}
|
|
}
|
|
else {
|
|
if (!emailNotUnique){ $('#email-help').hide(); }
|
|
if (checkedCount>0) {cb();} else {checkedCount++;}
|
|
}
|
|
}
|
|
|
|
function validateUniqueness(input){
|
|
|
|
function recheckBasic(){
|
|
if ($('#email-help').is(":visible") && $('#email-help').text().substring(0,25)!=="Unable to confirm unique ") {
|
|
$('#submit-group .main').prop('disabled',true).prop('title',"You need to supply a different email address. ");
|
|
}
|
|
else if ($('#slug-help').is(":visible") && $('#slug-help').text().substring(0,25)!=="Unable to confirm unique ") {
|
|
$('#submit-group .main').prop('disabled',true).prop('title',"You need to supply a different slug. ");
|
|
}
|
|
else if ( $('#slug-help').text().substring(0,25)==="Unable to confirm unique " ) {
|
|
$('#submit-group .main').prop('title',"Unable to confirm unique slug with the server. This might not work... ");
|
|
}
|
|
else if ( $('#email-help').text().substring(0,25)==="Unable to confirm unique " ) {
|
|
$('#submit-group .main').prop('title',"Unable to confirm unique email with the server. This might not work... ");
|
|
}
|
|
else {
|
|
$('#submit-group .main').prop('disabled',false).prop('title',"Click here to save your changes. ");
|
|
}
|
|
}
|
|
|
|
// Should server be queried for unique values?
|
|
if (input && $('#'+input+'-input').val()) {
|
|
if (input==='email' && !validateEmail($('#email-input').val())) {}
|
|
|
|
// Query server for unique values
|
|
else {
|
|
$.ajax({
|
|
url: '/validate?'+input+'='+$('#'+input+'-input').val(),
|
|
type: 'GET',
|
|
statusCode: {
|
|
|
|
// Is unique
|
|
200: function(){
|
|
$('#'+input+'-help').hide();
|
|
if (input==='slug'){ slugNotUnique=false; }
|
|
else if (input==='email'){ emailNotUnique=false; }
|
|
recheckBasic();
|
|
},
|
|
|
|
// Isn't unique
|
|
400: function(){
|
|
if (input==='slug'){ slugNotUnique=true; }
|
|
else if (input==='email'){ emailNotUnique=true; }
|
|
$('#'+input+'-help').show().text("That "+input+" is already in use by another user. ");
|
|
$('#submit-group .main').prop('disabled',true).prop('title',"You need to supply a different "+input+". ");
|
|
}
|
|
|
|
} })
|
|
|
|
// Server error
|
|
.error( function(){
|
|
if (input==='slug'){ slugNotUnique=undefined; }
|
|
else if (input==='email'){ emailNotUnique=undefined; }
|
|
$('#'+input+'-help').show().text("Unable to confirm unique "+input+". This might not work... ");
|
|
recheckBasic();
|
|
});
|
|
|
|
} }
|
|
|
|
// Nothing changed. Recheck basic validations
|
|
else { recheckBasic(); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Input change listeners
|
|
$('#slug-input').change(function(){
|
|
if (!$('#slug-input').val()){
|
|
$('#slug-help').show().text("A slug is required. ");
|
|
$('#submit-group .main').prop('disabled',true).prop('title',"You need to enter a slug. ");
|
|
}
|
|
else {
|
|
$('#slug-help').hide();
|
|
replaceFromEndpoint('slugify','#slug-input',function(){
|
|
validateForm('slug');
|
|
});
|
|
}
|
|
});
|
|
$('#email-input').change(function(){
|
|
validateForm('email');
|
|
});
|
|
$('#name-input').change(function(){
|
|
replaceFromEndpoint('xss','#name-input',validateForm);
|
|
});
|
|
|
|
});
|