$('.login-form .input-group').each(function (index, elem) { elem = $(elem); elem.find('.form-control').on('focusin', function (e) { elem.find('.input-group-text').addClass('active'); }); elem.find('.form-control').on('focusout', function (e) { elem.find('.input-group-text').removeClass('active'); elem.find('.form-control').tooltip('hide'); }); }); $('#btn-change-view-sign-up').click(function () { Login.currentSubmitCaller = defaultLoginCaller; $('#btn-change-view-sign-up').hide(); $('#btn-change-view-sign-in').show(); $('#reset-password-wrapper').hide(); $('#sign-in-wrapper').hide(); $('#sign-up-wrapper').show(); }); $('#btn-change-view-sign-in').click(function () { $('#btn-change-view-sign-in').hide(); $('#btn-change-view-sign-up').show(); $('#reset-password-wrapper').hide(); $('#sign-up-wrapper').hide(); $('#sign-in-wrapper').show(); }); $('#btn-change-view-reset-password').click(function () { $('#btn-change-view-sign-in').hide(); $('#btn-change-view-sign-up').show(); $('#reset-password-wrapper').show(); $('#sign-up-wrapper').hide(); $('#sign-in-wrapper').hide(); }); $('#btn-change-view-continue-login').click(function () { Login.currentSubmitCaller = defaultLoginCaller; $('#sign-in-wrapper').show(); $('#reset-password-wrapper').hide(); }); var Login = { nameValidator: function (val, noChange) { var words = val.split(' '); var newWords = []; for (var i = 0; i < words.length; i++) { if (words[i].length) { words[i] = words[i].trim(); if (!/^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßnjƊŽ∂ð]{2,32}$/.test(words[i])) { return { content: val, valid: false, invalid: true }; } words[i] = words[i].charAt(0).toUpperCase() + words[i].substring(1); newWords[newWords.length] = words[i]; } } var result = newWords.join(' '); return { content: noChange ? val : result, valid: result.length > 0, invalid: result.length == 0 }; }, passwordValidator: function (input1, input2) { return function () { var isValid = input1.val().length >= 6 && (!input2 || input1.val() == input2.val()); return { valid: isValid, invalid: !isValid }; } } }; Login.validators = { 'sign-in': { 'username': function (val) { return { content: val.trim() }; } }, 'sign-up': { 'username': function (val, noChange) { return { content: noChange ? val : val.trim().toLowerCase(), valid: val.length >= 6, invalid: val.length < 6 }; }, 'first-name': Login.nameValidator, 'last-name': Login.nameValidator, 'password': Login.passwordValidator( $('#sign-up-password-1')), 'password-confirm': Login.passwordValidator( $('#sign-up-password-1'), $('#sign-up-password-2')), 'email-address': function (val, noChange) { return { content: noChange ? val : val.trim().toLowerCase(), valid: validateEmail(val), invalid: !validateEmail(val) }; } }, 'reset-password': { 'username': function (val, noChange) { val = noChange ? val : val.trim(); return { content: val, valid: val.length >= 6, invalid: val.length < 6 }; } }, 'change-password': { 'password': Login.passwordValidator( $('#reset-password-password-1')), 'password-confirm': Login.passwordValidator( $('#reset-password-password-1'), $('#reset-password-password-2')) } }; $('.form-control').on('focusout', function (e) { var target = $(e.target); var form = target.closest('form'); var formType = form.attr('data-type'); var name = target.attr('name'); var validator = Login.validators[formType][name]; if (validator) { target.removeClass('is-valid is-invalid'); var result = validator(target.val()); if (typeof result.content != 'undefined') target.val(result.content); if (result.valid) target.addClass('is-valid'); if (result.invalid) target.addClass('is-invalid'); } }); $('#sign-up input').on('input', function (e) { $(e.target).prop('edited', true); $('#sign-up button[type=submit]').prop('disabled', !validateAccountCreateForm()); }); $('#reset-password input').on('input', function (e) { $(e.target).prop('edited', true); $('#reset-password button[type=submit]').prop('disabled', !validateResetPasswordForm()); }); $('#change-password input').on('input', function (e) { $(e.target).prop('edited', true); $('#change-password button[type=submit]').prop('disabled', !validateChangePasswordForm()); }); $('#sign-up button[type=submit]').prop('disabled', !validateAccountCreateForm()); $('#reset-password button[type=submit]').prop('disabled', !validateResetPasswordForm()); $('#change-password button[type=submit]').prop('disabled', !validateChangePasswordForm()); function validateAccountCreateForm() { return defaultFormValidate($('#sign-up')); } function validateResetPasswordForm() { return defaultFormValidate($('#reset-password')); } function validateChangePasswordForm() { return defaultFormValidate($('#change-password')); } function defaultFormValidate(formElem) { var validateResult = true; formElem.find('.form-control').each(function (index, elem) { var target = $(elem); var form = target.closest('form'); var formType = form.attr('data-type'); var name = target.attr('name'); var validator = Login.validators[formType][name]; if (validator) { target.removeClass('is-valid is-invalid'); var result = validator(target.val(), true); if (typeof result.content != 'undefined') target.val(result.content); if (result.valid) target.addClass('is-valid'); if (result.invalid && target.prop('edited')) target.addClass('is-invalid'); if (result.invalid) validateResult = false; } }); return validateResult; } $('.login-form').submit(function (e) { e.preventDefault(); Login.currentSubmitCaller(e); return false; }); function defaultLoginCaller(e) { var form = $(e.target); var data = { type: form.attr('data-type') }; if (data.type == 'sign-in') { data.username = form.find('*[name=username]').val(); data.password = form.find('*[name=password]').val(); data.staySignedIn = form.find('*[name=stay-signed-in]').prop('checked'); } else if (data.type == 'sign-up') { data.username = form.find('*[name=username]').val(); data.password = form.find('*[name=password]').val(); data.passwordConfirm = form.find('*[name=password-confirm]').val(); data.firstName = form.find('*[name=first-name]').val(); data.lastName = form.find('*[name=last-name]').val(); data.emailAddress = form.find('*[name=email-address]').val(); data.staySignedIn = form.find('*[name=stay-signed-in]').prop('checked'); } else if (data.type == 'reset-password') { data.username = form.find('*[name=username]').val(); } form.find('.form-inputs').hide(); form.find('.form-meta').hide(); form.find('.form-spinner').html('
').show(); form.find('button[type=submit]').prop('disabled', true); $.ajax({ url: '/wg_login/submit', method: 'POST', data: { data: JSON.stringify(data) } }).done(function (res) { if (!res.success || data.type != 'sign-in') form.find('.form-spinner').hide(); var meta = form.find('.form-meta'); meta.show(); var submitButton = form.find('button[type=submit]'); form.find('*[name]').removeClass('is-invalid'); form.find('.invalid-feedback').remove(); addFormHints(res, form); if (res.success) { if (data.type == 'sign-in') { var href = qs('ref'); window.location.href = href ? href : '/'; } else if (data.type == 'sign-up') { var pinInput = $(''); pinInput.on('input', function () { var val = pinInput.val().toUpperCase(); pinInput.val(val); submitButton.prop('disabled', val.length != 5); }); pinInput.on('focusout', function () { var val = pinInput.val().trim(); pinInput.val(val); submitButton.prop('disabled', val.length != 5); }); meta.html('').append($('

') .append('Eine Bestätigungsmail wurde an ') .append($('"').text(res.emailAddress)) .append(' gesendet. Klicke dort einfach auf den Link oder gib die PIN hier ein.')); var pinInputGroup = $('
'); pinInputGroup.append(pinInput); meta.append(pinInputGroup); Login.currentSubmitCaller = signUpConfirmCaller; } else if (data.type == 'reset-password') { var passwordResetPinInput = $(''); passwordResetPinInput.on('input', function () { var val = passwordResetPinInput.val().toUpperCase(); passwordResetPinInput.val(val); submitButton.prop('disabled', val.length != 5); }); passwordResetPinInput.on('focusout', function () { var val = passwordResetPinInput.val().trim(); passwordResetPinInput.val(val); submitButton.prop('disabled', val.length != 5); }); meta.html('').append($('

') .append('Eine Bestätigungsmail wurde an deine E-Mail Adresse gesendet.' + ' Klicke dort einfach auf den Link oder gib die PIN hier ein.')); var passwordResetPinInputGroup = $('
'); passwordResetPinInputGroup.append(passwordResetPinInput); if (res.telegramAuth) { meta.find('p').append(' Ein zusätzlicher Link und Code wurde dir per Telegram geschickt.'); } if (res.pinFail) { passwordResetPinInput.prop('disabled', true); meta.find('p').append('
Beim erstellen des Anmeldecodes ist etwas schiefgelaufen.'); } meta.append(passwordResetPinInputGroup); Login.currentSubmitCaller = passwordResetCaller; } } else { console.log(submitButton); if (!data.message) { form.find('.form-inputs').show(); meta.hide(); submitButton.prop('disabled', false); } else { meta.html(data.message).show(); } } focusFirstFailed(form, res); }).fail(function () { alert('Fehler'); }); } // confirm pin function signUpConfirmCaller(e) { var form = $(e.target); var data = { pin: $('#sign-up-confirm-pin').val() }; form.find('.form-inputs').hide(); form.find('.form-meta').hide(); form.find('.form-spinner').html('
').show(); form.find('button[type=submit]').prop('disabled', true); $.ajax({ url: '/wg_login/validate_pin', method: 'POST', data: { data: JSON.stringify(data) } }).done(function (res) { form.find('.form-spinner').hide(); var meta = form.find('.form-meta'); meta.show(); var submitButton = form.find('button[type=submit]'); form.find('*[name]').removeClass('is-invalid'); form.find('.invalid-feedback').remove(); addFormHints(res, form); $('#sign-up-confirm-pin').prop('disabled', res.disabled); if (res.success) { meta.html('').append($('

Du hast deinen Account erfolgreich erstellt. ' + 'Viel Spaß auf der Seite 😊!

')); submitButton.text('Auf geht\'s!'); Login.currentSubmitCaller = function () { window.location.href = '/'; }; $('.change-view').remove(); submitButton.prop('disabled', false); } else { $('#sign-up-confirm-pin').val('').focus(); submitButton.prop('disabled', true); } focusFirstFailed(form, res); }).fail(function () { form.find('.form-spinner').hide(); form.find('.form-meta').show(); alert('Fehler'); }); } // confirm pin function passwordResetCaller(e) { var form = $(e.target); var data = { pin: $('#reset-password-confirm-pin').val() }; form.find('.form-inputs').hide(); form.find('.form-meta').hide(); form.find('.form-spinner').html('
').show(); form.find('button[type=submit]').prop('disabled', true); $.ajax({ url: '/wg_login/validate_pin_reset_password', method: 'POST', data: { data: JSON.stringify(data) } }).done(function (res) { form.find('.form-spinner').hide(); var meta = form.find('.form-meta'); meta.show(); var submitButton = form.find('button[type=submit]'); form.find('*[name]').removeClass('is-invalid'); form.find('.invalid-feedback').remove(); addFormHints(res, form); // form.find('submit').prop('disabled', res.disabled); if (res.success) { window.location.href = res.href; } else { $('#reset-password-confirm-pin').val('').focus(); submitButton.prop('disabled', true); } }).fail(function () { form.find('.form-spinner').hide(); form.find('.form-meta').show(); alert('Fehler'); }); } $('.change-password-form').submit(function (e) { e.preventDefault(); var form = $(e.target); form.find('.form-inputs').hide(); form.find('.form-meta').hide(); form.find('.form-spinner').html('
').show(); form.find('button[type=submit]').prop('disabled', true); var data = { password: $('#reset-password-password-1').val(), passwordConfirm: $('#reset-password-password-2').val() }; $.ajax({ method: 'POST', data: { data: JSON.stringify(data) } }).done(function (res) { form.find('.form-spinner').hide(); var meta = form.find('.form-meta'); meta.show(); var submitButton = form.find('button[type=submit]'); form.find('*[name]').removeClass('is-invalid'); form.find('.invalid-feedback').remove(); addFormHints(res, form); if (res.success) { meta.html('').append($('

Das Passwort wurde erfolgreich' + ' geändert, du kannst es nun erneut versuchen.

')); submitButton.text('Jetzt aber!'); submitButton.attr('type', 'button'); submitButton.click(function () { window.location.href = '/wg_login'; }); $('.change-view').remove(); submitButton.prop('disabled', false); } else { alert('Da ist etwas schief gelaufen (das sollte eigentlich nicht passieren).'); submitButton.prop('disabled', true); } }).fail(function () { form.find('.form-spinner').hide(); form.find('.form-meta').show(); alert('Fehler'); }); return false; }); function addFormHints(res, form) { if (res.failed) { for (var i = 0; i < res.failed.length; i++) { var formElement = form.find('*[name=' + res.failed[i].name + ']'); formElement.prop('disabled', !!res.failed[i].disabled); var feedback = $('
').text(res.failed[i].message); formElement.addClass('is-invalid'); formElement.after(feedback); } } } function focusFirstFailed(form, res) { if (res.failed && res.failed.length > 0) form.find('input[name="' + res.failed[0].name + '"]').focus().select(); } Login.currentSubmitCaller = defaultLoginCaller; 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(String(email).toLowerCase()); } function qs(key) { key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&"); var match = location.search.match(new RegExp("[?&]" + key + "=([^&]+)(&|$)")); return match && decodeURIComponent(match[1].replace(/\+/g, " ")); } $('*[data-toggle="tooltip"]').tooltip();