js/application.js

 avatar
unknown
javascript
2 years ago
9.5 kB
4
Indexable
(function () {

    // start: menu
    // var burger = document.querySelector('.header-top-bar .container');
    var $body = $('body');
    var body = document.querySelector('body');
    var navigation = document.querySelectorAll('.navigation li');

    // burger.onclick = function () {
    //     body.classList.toggle('menu-opened');
    //     animate();
    // }

    // navigation.forEach(function (e) {
    //     e.onclick = function () {
    //         // animate();
    //         // body.classList.remove('menu-opened');
    //     }
    // })

    // var animate = function (num = 0) {
    //     setTimeout(function () {
    //         for (let i of navigation) {
    //             num += 1;
    //             setTimeout(function () {
    //                 i.classList.toggle('active');
    //             }, 30 * num);
    //         }
    //     }, 300);
    // }
    // // end: menu

    window.helpers = {
        captcha() {
            const script = document.createElement('script');
            script.type = 'text/javascript';
            script.async = true;
            script.defer = true;
            script.src = 'https://www.google.com/recaptcha/api.js';

            document.head.appendChild(script);
        }
    }


    // start: page load
    var links = document.querySelectorAll('.navigation [data-remote="true"]');
    var container = document.querySelector('#main-container');
    var current_page = window.location.pathname;
    var hash = window.location.hash || '';

    if (current_page === '/') current_page = '/home';
    load_page(current_page + hash);

    function activeCurrentPage(page) {
        if (document.querySelector('.navigation .active')) {
            document.querySelector('.navigation .active').classList.remove('active');
        }

        if (document.querySelector(`.navigation [href="${page}"]`)) {
            document.querySelector(`.navigation [href="${page}"]`).parentNode.classList.add('active');
        }
    }

    activeCurrentPage(current_page);

    links.forEach(function (link) {
        link.onclick = function (event) {
            event.preventDefault();
            var page = this.getAttribute('href');
            load_page(page);
            activeCurrentPage(page);
            $('body').toggleClass('nav-open');
        }
    });

    window.onpopstate = function () {
        var page = window.location.pathname;
        hash = window.location.hash || '';
        if (page === '/') page = '/home';
        load_page(page, hash);
    };

    function load_page(page, hash = '') {
        fetch(`pages/${page}.html`)
            .then(function (response) {
                return response.text()
            })
            .then(function (html) {
                body.setAttribute('data-page', page.replace('/', ''));
                container.innerHTML = html;
                window.history.pushState(null, page, window.location.origin + page + hash);
                window.scrollTo({top: 0, behavior: 'smooth'});
                fade_in_elements();

                if ($('[data-load]').length) {
                    window.helpers[$('[data-load]').data('load')]()
                }
            })
            .catch(function (err) {
                console.log('Failed to fetch page: ', err);
            });
    }

    function fade_in_elements() {
        var elements = document.querySelectorAll('.fade-in');

        elements.forEach((element, index) => {
            setTimeout(() => {
                element.classList.add('fade-in--start');
                element.onanimationend = (e) => e.target.classList.add('fade-in--end');
            }, 250 * index);
        });
    }
    // end: page load

    $body.on('click', '[data-scroll-to]', e => {
        const header = document.querySelector('header');
        window.scrollTo({top: $(e.target.dataset.scrollTo).offset().top - header.offsetHeight, behavior: 'smooth'});
    });

    // mobile nav
    $('[data-toggle="offcanvas"], #navToggle').on('click', function () {
        $body.toggleClass('nav-open');
    });

    const navbar = $('.js-navbar');

    function matchViewport(mediaWidth) {
        return window.matchMedia(`screen and (${mediaWidth})`);
    }

    // run on window resize
    matchViewport('min-width: 1200px').addEventListener('change', function() {
        this.matches ? navbar.removeClass('offcanvas-collapse') : navbar.addClass('offcanvas-collapse');
    });

    // run on window load
    matchViewport('min-width: 1200px').matches ? (navbar.removeClass('offcanvas-collapse'), body.classList.remove('nav-open')) : navbar.addClass('offcanvas-collapse');

    // cookies
    const cookies = document.cookie.split('; ');
    const cookiesBox = document.querySelector('.cookies');

    if (!cookies.includes('cookie-accepted=true')) {
        showCookies();
    }

    function showCookies() {
        setTimeout(() => {
            cookiesBox.style.transform = 'translateY(0) scale(1)';
            cookiesBox.style.opacity = '1';
            cookiesBox.style.visibility = 'visible';
            cookiesBox.style.filter = 'blur(0)';
        }, 900);
    }

    function hideCookies() {
        cookiesBox.style.transform = 'translateY(100) scale(0)';
        cookiesBox.style.opacity = '0';
        cookiesBox.style.visibility = 'hidden';
        cookiesBox.style.filter = 'blur(100)';
    }

    const cookieAccept = document.querySelector('.cookies__button');
    cookieAccept.addEventListener('click', () => {
        document.cookie = `cookie-accepted=true; max-age=31536000;`;
        hideCookies();
    });


    // start: formularz
    $(document).on('submit', '.wedding-form', function (e) {
        e.preventDefault();

        var button = $('.wyslij-formularz');
        button.html('<div class="spinner-border" role="status"></div> Wysyłanie...').attr('disabled', true);

        var alert = $('.alert');
        alert.hide().removeClass('alert-danger alert-success');

        $.post('/php/form.class.php', $(this).serializeArray()).done(function (resp) {
            var resp = JSON.parse(resp);

            $('.wedding-form input').css('border', '1px solid transparent');
            $('.wedding-form label').css('color', 'white');

            if (resp.status === 'error') {
                for (let i in resp.elements) {
                    $('[name="' + resp.elements[i] + '"]').css('border', '2px solid red').next('label').css('color', 'red');
                }

                button.text('Wyślij').attr('disabled', false);
                alert.addClass('alert-danger').html('Pola oznaczone gwiazdką * są wymagane.<br>Prosimy uzpełnić brakujące pozycje, oraz ponownie wysłać formularz.').show();
            }

            if (resp.status === 'success') {
                button.text('Wyślij').attr('disabled', false);
                alert.addClass('alert-success').html('Dziękujemy za wypełnienie formularza planu wesela.<br>Na podany adres email została wysłana kopia dokumentu w formacie pdf.').show();
            }
        });
    });


    $(document).on('change', '.checkbox-option', function () {
        ($(this).val() === 'tak') ? $(this).closest('.has-hidden-contents').find('.hidden-contents:first').fadeIn(): $(this).closest('.has-hidden-contents').find('.hidden-contents:first').fadeOut();
    });

    $(document).on('change', '[name=first_dance]', function () {
        $('[name=first_dance_title]').prop('disabled', true);
        if ($(this).is(':checked')) $(this).parent().find('[name=first_dance_title]').prop('disabled', false);
    });
    // end: formularz

    // contact-form
    $(document).on('submit', '.contact-form', function (e) {
        e.preventDefault();

        $(e.target).find('.is-invalid').removeClass('is-invalid');
        $(e.target).find('.invalid-feedback').remove();
        $('.alert').remove();

        const button = $(e.target).find('button[type=submit]');
        button.html(`<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
            <span class="sr-only">Wysyłanie...</span>
        Wysyłanie..`);

        const action = $(e.target).attr('action');
        $.post(action, $(this).serializeArray()).done(function (response) {
            const resp = JSON.parse(response);

            setTimeout(function() {
                if (resp.error) {
                    for (let key in resp.elements) {
                        $(`#${key}`).addClass('is-invalid').parent().append(`<div class="invalid-feedback">
                            ${resp.elements[key]}
                        </div>`);
                    }
                } else {
                    $(e.target).append('<div class="alert alert-primary mt-3" role="alert">Wiadomość wysłana.</div>');
                    $('.alert').show();
                    $(e.target).trigger("reset");
                }

                button.text('Wyślij');
            }, 500);
        }).fail(function(err) {
            console.log(err);
            $(e.target).append('<div class="alert alert-danger mt-3" role="alert">Wystąpił problem z wysłaniem formularza.</div>');
            $('.alert').show();
        })
    });
    // end: contact-form
}());
Editor is loading...