Viewing File: /home/maglabs/bambinos/wp-content/themes/juliette/assets/addon/js/subscribe-form.js

(function ($, elementor) {

    "use strict";


    /**
     * Ajax Handlers
     */
    var NovaworksHandlerUtils = {
        /**
         * Rendering notice message
         *
         * @param  {String} type    Message type
         * @param  {String} message Message content
         * @return {Void}
         */
        noticeCreate: function (type, message, isPublicPage) {
            var notice,
                rightDelta = 0,
                timeoutId,
                isPublic = isPublicPage || false;

            if (!message || 'true' === isPublic) {
                return false;
            }

            notice = $('<div class="novaworks-handler-notice ' + type + '"><span class="dashicons"></span><div class="inner">' + message + '</div></div>');

            $('body').prepend(notice);
            reposition();
            rightDelta = -1 * (notice.outerWidth(true) + 10);
            notice.css({'right': rightDelta});

            timeoutId = setTimeout(function () {
                notice.css({'right': 10}).addClass('show-state');
            }, 100);
            timeoutId = setTimeout(function () {
                rightDelta = -1 * (notice.outerWidth(true) + 10);
                notice.css({right: rightDelta}).removeClass('show-state');
            }, 4000);
            timeoutId = setTimeout(function () {
                notice.remove();
                clearTimeout(timeoutId);
            }, 4500);

            function reposition() {
                var topDelta = 100;

                $('.novaworks-handler-notice').each(function () {
                    $(this).css({top: topDelta});
                    topDelta += $(this).outerHeight(true);
                });
            }
        },

        /**
         * Serialize form into
         *
         * @return {Object}
         */
        serializeObject: function (form) {

            var self = this,
                json = {},
                pushCounters = {},
                patterns = {
                    'validate': /^[a-zA-Z][a-zA-Z0-9_-]*(?:\[(?:\d*|[a-zA-Z0-9_-]+)\])*$/,
                    'key': /[a-zA-Z0-9_-]+|(?=\[\])/g,
                    'push': /^$/,
                    'fixed': /^\d+$/,
                    'named': /^[a-zA-Z0-9_-]+$/
                };

            this.build = function (base, key, value) {
                base[key] = value;

                return base;
            };

            this.push_counter = function (key) {
                if (undefined === pushCounters[key]) {
                    pushCounters[key] = 0;
                }

                return pushCounters[key]++;
            };

            $.each(form.serializeArray(), function () {
                var k, keys, merge, reverseKey;

                // Skip invalid keys
                if (!patterns.validate.test(this.name)) {
                    return;
                }

                keys = this.name.match(patterns.key);
                merge = this.value;
                reverseKey = this.name;

                while (undefined !== (k = keys.pop())) {

                    // Adjust reverseKey
                    reverseKey = reverseKey.replace(new RegExp('\\[' + k + '\\]$'), '');

                    // Push
                    if (k.match(patterns.push)) {
                        merge = self.build([], self.push_counter(reverseKey), merge);
                    } else if (k.match(patterns.fixed)) {
                        merge = self.build([], k, merge);
                    } else if (k.match(patterns.named)) {
                        merge = self.build({}, k, merge);
                    }
                }

                json = $.extend(true, json, merge);
            });

            return json;
        }
    };

    var NovaworksAjaxHandler = function (options) {
        /**
         * General default settings
         *
         * @type {Object}
         */
        var self = this,
            settings = {
                'handlerId': '',
                'cache': false,
                'processData': true,
                'url': '',
                'async': false,
                'beforeSendCallback': function () { },
                'errorCallback': function () { },
                'successCallback': function () { },
                'completeCallback': function () { }
            };

        /**
         * Checking options, settings and options merging
         *
         */
        if (options) {
            $.extend(settings, options);
        }

        /**
         * Check if handlerId ready to using
         *
         */
        if (!window[settings.handlerId]) {
            if (window.console) {
                window.console.warn('Handler id not found');
            }
            return false;
        }

        /**
         * Set handler settings from localized global variable
         *
         * @type {Object}
         */
        self.handlerSettings = window[settings.handlerId] || {};

        /**
         * Ajax request instance
         *
         * @type {Object}
         */
        self.ajaxRequest = null;

        /**
         * Ajax processing state
         *
         * @type {Boolean}
         */
        self.ajaxProcessing = false;

        /**
         * Set ajax request data
         *
         * @type {Object}
         */
        self.data = {
            'action': self.handlerSettings.action,
            'nonce': self.handlerSettings.nonce
        };

        /**
         * Check ajax url is empty
         */
        if ('' === settings.url) {

            // Check public request
            if ('false' === self.handlerSettings.is_public) {
                settings.url = window.NovaworksElementConfigs.ajaxurl;
            } else {
                settings.url = window.NovaworksElementConfigs.ajaxurl;
            }
        }

        /**
         * Init ajax request
         *
         * @return {Void}
         */
        self.send = function () {
            if (self.ajaxProcessing) {
                NovaworksHandlerUtils.noticeCreate('error-notice', self.handlerSettings.sys_messages.wait_processing, self.handlerSettings.is_public);
            }
            self.ajaxProcessing = true;

            self.ajaxRequest = jQuery.ajax({
                type: self.handlerSettings.type,
                url: settings.url,
                data: self.data,
                cache: settings.cache,
                dataType: self.handlerSettings.data_type,
                processData: settings.processData,
                beforeSend: function (jqXHR, ajaxSettings) {
                    if (null !== self.ajaxRequest && !settings.async) {
                        self.ajaxRequest.abort();
                    }

                    if (settings.beforeSendCallback && 'function' === typeof (settings.beforeSendCallback)) {
                        settings.beforeSendCallback(jqXHR, ajaxSettings);
                    }
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    $(document).trigger({
                        type: 'novaworks-ajax-handler-error',
                        jqXHR: jqXHR,
                        textStatus: textStatus,
                        errorThrown: errorThrown
                    });

                    if (settings.errorCallback && 'function' === typeof (settings.errorCallback)) {
                        settings.errorCallback(jqXHR, textStatus, errorThrown);
                    }
                },
                success: function (data, textStatus, jqXHR) {
                    self.ajaxProcessing = false;

                    $(document).trigger({
                        type: 'novaworks-ajax-handler-success',
                        response: data,
                        jqXHR: jqXHR,
                        textStatus: textStatus
                    });

                    if (settings.successCallback && 'function' === typeof (settings.successCallback)) {
                        settings.successCallback(data, textStatus, jqXHR);
                    }

                    NovaworksHandlerUtils.noticeCreate(data.type, data.message, self.handlerSettings.is_public);
                },
                complete: function (jqXHR, textStatus) {
                    $(document).trigger({
                        type: 'novaworks-ajax-handler-complete',
                        jqXHR: jqXHR,
                        textStatus: textStatus
                    });

                    if (settings.completeCallback && 'function' === typeof (settings.completeCallback)) {
                        settings.completeCallback(jqXHR, textStatus);
                    }
                }

            });
        };

        /**
         * Send data ajax request
         *
         * @param  {Object} data User data
         * @return {Void}
         */
        self.sendData = function (data) {
            var sendData = data || {};
            self.data = {
                'action': self.handlerSettings.action,
                'nonce': self.handlerSettings.nonce,
                'data': sendData
            };

            self.send();
        };

        /**
         * Send form serialized data
         * @param  {String} formId Form selector
         * @return {Void}
         */
        self.sendFormData = function (formId) {
            var form = $(formId),
                data;

            data = NovaworksHandlerUtils.serializeObject(form);

            self.sendData(data);
        };
    };

    $(window).on('elementor/frontend/init', function () {

        elementor.hooks.addAction('frontend/element_ready/novaworks-subscribe-form.default', function ($scope) {

            var $target = $scope.find('.novaworks-subscribe-form'),
                scoreId = $scope.data('id'),
                settings = $target.data('settings'),
                subscribeFormAjaxId = 'novaworks_elementor_subscribe_form_ajax',
                $subscribeForm = $('.novaworks-subscribe-form__form', $target),
                $fields = $('.novaworks-subscribe-form__fields', $target),
                $mailField = $('.novaworks-subscribe-form__mail-field', $target),
                $inputData = $mailField.data('instance-data'),
                $submitButton = $('.novaworks-subscribe-form__submit', $target),
                $subscribeFormMessage = $('.novaworks-subscribe-form__message', $target),
                timeout = null,
                invalidMailMessage = window.novaworks_elementor_subscribe_form_ajax.sys_messages.invalid_mail || window.NovaworksElementConfigs.invalidMail;

            var novaworksSubscribeFormAjax = new NovaworksAjaxHandler({
                handlerId: subscribeFormAjaxId,

                successCallback: function (data) {
                    var successType = data.type,
                        message = data.message || '',
                        responceClass = 'novaworks-subscribe-form--response-' + successType;

                    $submitButton.removeClass('loading');

                    $target.removeClass('novaworks-subscribe-form--response-error');
                    $target.addClass(responceClass);

                    $('span', $subscribeFormMessage).html(message);
                    $subscribeFormMessage.css({'visibility': 'visible'});

                    timeout = setTimeout(function () {
                        $subscribeFormMessage.css({'visibility': 'hidden'});
                        $target.removeClass(responceClass);
                    }, 20000);

                    if (settings['redirect']) {
                        window.location.href = settings['redirect_url'];
                    }

                    $(window).trigger({
                        type: 'NovaworksElement/subscribe',
                        elementId: scoreId,
                        successType: successType,
                        inputData: $inputData
                    });
                }
            });

            $mailField.on('focus', function () {
                $mailField.removeClass('mail-invalid');
            });

            $(document).keydown(function (event) {

                if (13 === event.keyCode && $mailField.is(':focus')) {
                    subscribeHandle();

                    return false;
                }
            });

            $submitButton.on('click', function () {
                subscribeHandle();
                return false;
            });

            function subscribeHandle() {
                var inputValue = $mailField.val(),
                    sendData = {
                        'email': inputValue,
                        'use_target_list_id': settings['use_target_list_id'] || false,
                        'target_list_id': settings['target_list_id'] || '',
                        'data': $inputData
                    },
                    serializeArray = $subscribeForm.serializeArray(),
                    additionalFields = {};

                if (window.NovaworksElementTools.validateEmail(inputValue)) {

                    $.each(serializeArray, function (key, fieldData) {

                        if ('email' === fieldData.name) {
                            sendData[fieldData.name] = fieldData.value;
                        } else {
                            additionalFields[fieldData.name] = fieldData.value;
                        }
                    });

                    sendData['additional'] = additionalFields;

                    novaworksSubscribeFormAjax.sendData(sendData);

                    $submitButton.addClass('loading');
                }
                else {
                    $mailField.addClass('mail-invalid');

                    $target.addClass('novaworks-subscribe-form--response-error');
                    $('span', $subscribeFormMessage).html(invalidMailMessage);
                    $subscribeFormMessage.css({'visibility': 'visible'});

                    timeout = setTimeout(function () {
                        $target.removeClass('novaworks-subscribe-form--response-error');
                        $subscribeFormMessage.css({'visibility': 'hidden'});
                        $mailField.removeClass('mail-invalid');
                    }, 20000);
                }
            }
        });
    });

}(jQuery, window.elementorFrontend));
Back to Directory File Manager