function onGoogleSignIn(googleUser) {
    var token = googleUser.getAuthResponse().id_token;
    googleUser.disconnect(); // Fix.

    validateSignin('google', token);
}

function onFacebookStatusChange(response) {
    if (response.status != 'connected') {
        return;
    }
    
    validateSignin('facebook', response.authResponse.accessToken);
}

function validateSignin(type, token) {
    var $form = $('form.form-signin').first();
    $('input[name="type"]', $form).val(type);
    $('input[name="token"]', $form).val(token);

    var $formSignin = $('#form-signin');
    if ($formSignin.length) {
        $formSignin.submit();
        $formSignin.hide();
        $progress = getProgress(0,100,100,'signin');
        $progress.insertAfter($formSignin);
    }

    var $nextStep = $('#form-registration-next');
    if ($nextStep.length) {
        $nextStep.trigger('click');
    }
}

function loadSignInEvents() {
    var $submitButton = $('#form-signin button[type="submit"]').prop('disabled', true);
    var $inputIdentifier = $('#form-signin input[name="identifier"]');
    var $inputPassword = $('#form-signin input[name="password"]');

    $inputPassword.on('change paste keyup', function() {
        $submitButton.prop('disabled', ($inputIdentifier.val().length == 0 || $inputPassword.val().length == 0));
    });

    $inputIdentifier.on('change paste keyup', function() {
        $submitButton.prop('disabled', ($inputIdentifier.val().length == 0 || $inputPassword.val().length == 0));
    });
}

function loadRegistrationEvents() {
    var $nextButton = $('#form-registration-next').prop('disabled', true);
    $nextButton.click(function(event) {
        $('#panel-method').fadeOut('slow', function() {
            $('#panel-method').hide();
            $('#panel-username').fadeIn('slow');
            $('#panel-username input[name="username"]').focus();
        });
    });

    var $inputEmail = $('#form-registration input[name="email"]');
    var $inputPassword = $('#form-registration input[name="password"]');
    $inputPassword.on('change paste keyup', function() {
        $nextButton.prop('disabled', ($inputEmail.val().length == 0 || $inputPassword.val().length < 10));
    });
    $inputEmail.on('change paste keyup', function() {
        $nextButton.prop('disabled', ($inputEmail.val().length == 0 || $inputPassword.val().length < 10));
    });

    var $submitButton = $('#form-registration-terms').prop('disabled', true);
    var $inputUsername = $('#form-registration input[name="username"]');
    var $isUsernameOk = false;

    var enableSubmitButton = function() {
        $submitButton.prop('disabled', !$isUsernameOk);
    };

    $inputUsername.on('change paste keyup', _.debounce(function(){
        if ($inputUsername.val().length < 4) {
            $isUsernameOk = false;
            enableSubmitButton();
            $('#username-availability').hide();
            $('#username-available').hide();
            $('#username-unavailable').hide();
            $('#username-error').hide();
            return
        }

        var $data = {};
        $data['username'] = $inputUsername.val();

        $.ajax({
            url: $inputUsername.attr('data-verify-url'),
            type: 'POST',
            data: JSON.stringify($data),
            global: false,
            success: function(data) {
                $('#username-availability').show();
                if (data.available) {
                    $isUsernameOk = true;
                    $('#username-available').show();
                    $('#username-unavailable').hide();
                    $('#username-error').hide();
                    $('#username-availability').removeClass('alert-danger').addClass('alert-success');
                    $('#username-available .content').text(data.message);
                } else {
                    $isUsernameOk = false;
                    $('#username-available').hide();
                    $('#username-unavailable').show();
                    $('#username-error').hide();
                    $('#username-availability').removeClass('alert-success').addClass('alert-danger');
                    $('#username-unavailable .content').text(data.message);
                }
                enableSubmitButton();
            },
            error: function(xhr) {
                $isUsernameOk = false;
                $('#username-available').hide();
                $('#username-unavailable').hide();
                $('#username-error').show();
                $('#username-availability').removeClass('alert-success').addClass('alert-danger');
                $('#username-error .content').text(errorMessage(xhr) + '. ' + errorReason(xhr) + ' ' + errorRecovery(xhr));
                enableSubmitButton();
            },
        });
    }, 400)).trigger('change');
}

$(function(){
    $('.fb-signin').click(function() {
        FB.login(function(response) {
            if (response.authResponse) {
                FB.getLoginStatus(function(response) {
                    onFacebookStatusChange(response);
                });
            }
        }, {scope: 'email,public_profile', return_scopes: true});
    });

    $('.fb-signin, .g-signin').parent('div').show();

    loadSignInEvents();
    loadRegistrationEvents();
});