"use strict"; ; (function ($, window, document, undefined) { 'use strict'; var merchant = merchant || {}; $(document).ready(function () { // AjaxSave var $ajaxForm = $('.merchant-module-page-ajax-form'); var $ajaxHeader = $('.merchant-module-page-ajax-header'); var $ajaxSaveBtn = $('.merchant-module-save-button'); $('.merchant-module-page-content').on('change keypress change.merchant', ':input:not(.merchant-module-question-answer-textarea):not(.merchant-license-code-input)', function () { if (!merchant.show_save) { $ajaxHeader.addClass('merchant-show'); $ajaxHeader.removeClass('merchant-saving'); merchant.show_save = true; } }); $ajaxForm.ajaxForm({ beforeSubmit: function beforeSubmit() { $ajaxHeader.addClass('merchant-saving'); }, success: function success() { $ajaxHeader.removeClass('merchant-show'); merchant.show_save = false; // Module Alert after Ajax Save if (!$('.merchant-module-action').hasClass('merchant-enabled')) { var $moduleAlert = $('.merchant-module-alert'); $moduleAlert.addClass('merchant-show'); $(document).off('click.merchant-alert-close'); $(document).on('click.merchant-alert-close', function (e) { if (!$(e.target).closest('.merchant-module-alert-wrapper').length) { $moduleAlert.removeClass('merchant-show'); $(document).off('click.merchant-alert-close'); } }); } } }); $('.merchant-module-question-answer-button').on('click', function (e) { e.preventDefault(); var $button = $(this); var $textarea = $('.merchant-module-question-answer-textarea'); $('.merchant-module-question-answer-dropdown').removeClass('merchant-show'); $('.merchant-module-question-thank-you-dropdown').addClass('merchant-show'); window.wp.ajax.post('merchant_module_feedback', { subject: $textarea.data('subject'), message: $textarea.val(), module: $button.closest('.merchant-module-action').find('.merchant-module-page-button-action-activate').data('module'), nonce: window.merchant.nonce }); }); $('.merchant-module-page-button-action-activate').on('click', function (e) { e.preventDefault(); $('.merchant-module-question-list-dropdown').removeClass('merchant-show'); $('.merchant-module-question-answer-dropdown').removeClass('merchant-show'); $('.merchant-module-question-answer-form').removeClass('merchant-show'); $('.merchant-module-question-answer-title').removeClass('merchant-show'); $('.merchant-module-question-thank-you-dropdown').removeClass('merchant-show'); $('.merchant-module-question-answer-textarea').val(''); window.wp.ajax.post('merchant_module_activate', { module: $(this).data('module'), nonce: window.merchant.nonce }).done(function () { $('body').removeClass('merchant-module-disabled').addClass('merchant-module-enabled'); $('.merchant-module-action').addClass('merchant-enabled'); }); }); $('.merchant-module-page-button-action-deactivate').on('click', function (e) { e.preventDefault(); window.wp.ajax.post('merchant_module_deactivate', { module: $(this).data('module'), nonce: window.merchant.nonce }).done(function () { $('body').removeClass('merchant-module-enabled').addClass('merchant-module-disabled'); $('.merchant-module-action').removeClass('merchant-enabled'); $('.merchant-module-question-list-dropdown').addClass('merchant-show'); }); }); $('.merchant-module-question-list-dropdown li').on('click', function (e) { var $question = $(this); var target = $question.data('answer-target'); var $answer = $('[data-answer-title="' + target + '"]'); if ($answer.length) { $answer.addClass('merchant-show').siblings().removeClass('merchant-show'); $('.merchant-module-question-answer-dropdown').addClass('merchant-show'); $('.merchant-module-question-answer-textarea').attr('data-subject', $question.text().trim()); } else { $('.merchant-module-question-thank-you-dropdown').addClass('merchant-show'); $('.merchant-module-question-answer-dropdown').removeClass('merchant-show'); } $('.merchant-module-question-answer-textarea').val(''); $('.merchant-module-question-list-dropdown').removeClass('merchant-show'); }); $('.merchant-module-dropdown-close').on('click', function (e) { e.preventDefault(); $(this).closest('.merchant-module-dropdown').removeClass('merchant-show'); }); $('.merchant-module-page-button-deactivate').on('click', function (e) { e.preventDefault(); var $button = $(this); var $dropdown = $('.merchant-module-deactivate-dropdown'); $dropdown.toggleClass('merchant-show'); $(document).off('click.merchant-close'); $(document).on('click.merchant-close', function (e) { if (!$(e.target).closest('.merchant-module-deactivate').length) { $dropdown.removeClass('merchant-show'); $(document).off('click.merchant-close'); } }); }); $('.merchant-range').each(function () { var $range = $(this); var $rangeInput = $range.find('.merchant-range-input'); var $numberInput = $range.find('.merchant-range-number-input'); $rangeInput.on('change input merchant.range merchant-init.range', function (e) { var $range = $(this); var value = (e.type === 'merchant' ? $numberInput.val() : $range.val()) || 0; var min = $range.attr('min') || 0; var max = $range.attr('max') || 1; var percentage = (value - min) / (max - min) * 100; $range.css({ 'background': 'linear-gradient(to right, #3858E9 0%, #3858E9 ' + percentage + '%, #ddd ' + percentage + '%, #ddd 100%)' }); $rangeInput.val(value); $numberInput.val(value); }).trigger('merchant-init.range'); $numberInput.on('change input blur', function () { if ($rangeInput.hasClass('merchant-range-input')) { $rangeInput.val($(this).val()).trigger('merchant.range'); } }); }); // Sortable. var SortableField = { init: function init(field) { this.events(); }, events: function events() { var self = this; $('.merchant-sortable').each(function () { var field = $(this), input = field.find('.merchant-sortable-input'); // Init sortable. $(field.find('ul.merchant-sortable-list').first()).sortable({ // Update value when we stop sorting. update: function update() { input.val(self.sortableGetNewVal(field)).trigger('change.merchant'); } }).disableSelection().find('li').each(function () { // Enable/disable options when we click on the eye of Thundera. $(this).find('i.visibility').click(function () { $(this).toggleClass('dashicons-visibility-faint').parents('li:eq(0)').toggleClass('invisible'); }); }).click(function () { // Update value when click in the eye. if ($(event.target).hasClass('dashicons-visibility')) { input.val(self.sortableGetNewVal(field)).trigger('change.merchant'); } }); }); }, sortableGetNewVal: function sortableGetNewVal(field) { var items = $(field.find('li')); var newVal = []; _.each(items, function (item) { if (!$(item).hasClass('invisible')) { newVal.push($(item).data('value')); } }); return JSON.stringify(newVal); } }; // Intialize Sortable. SortableField.init(); // Sortable Repeater. var SortableRepeaterField = { init: function init(field) { var self = this; // Update the values for all our input fields and initialise the sortable repeater. $('.merchant-sortable-repeater-control').each(function () { // If there is an existing customizer value, populate our rows var defaultValuesArray = JSON.parse($(this).find('.merchant-sortable-repeater-input').val()); var numRepeaterItems = defaultValuesArray.length; if (numRepeaterItems > 0) { // Add the first item to our existing input field $(this).find('.repeater-input').val(defaultValuesArray[0]); // Create a new row for each new value if (numRepeaterItems > 1) { var i; for (i = 1; i < numRepeaterItems; ++i) { self.appendRow($(this), defaultValuesArray[i]); } } } // Make our Repeater fields sortable. if (!$(this).hasClass('disable-sorting')) { $(this).find('.merchant-sortable-repeater.sortable').sortable({ update: function update(event, ui) { self.getAllInputs($(this).parent()); } }); } }); // Events. this.events(); }, events: function events() { var self = this; // Remove item starting from it's parent element $('.merchant-sortable-repeater.sortable').on('click', '.customize-control-sortable-repeater-delete', function (event) { event.preventDefault(); var numItems = $(this).parent().parent().find('.repeater').length; if (numItems > 1) { $(this).parent().slideUp('fast', function () { var parentContainer = $(this).parent().parent(); $(this).remove(); self.getAllInputs(parentContainer); }); } else { // $(this).parent().find('.repeater-input').val(''); self.getAllInputs($(this).parent().parent().parent()); } }); // Add new item $('.customize-control-sortable-repeater-add').click(function (event) { event.preventDefault(); self.appendRow($(this).parent()); self.getAllInputs($(this).parent()); }); // Refresh our hidden field if any fields change $('.merchant-sortable-repeater.sortable').change(function () { self.getAllInputs($(this).parent()); }); $('.merchant-sortable-repeater.sortable').on('focusout', '.repeater-input', function () { self.getAllInputs($(this).parent()); }); }, /** * Append a new row to our list of elements. * */ appendRow: function appendRow($element) { var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var newRow = '
'; $element.find('.sortable').append(newRow); $element.find('.sortable').find('.repeater:last').slideDown('slow', function () { $(this).find('input').focus(); }); }, /** * Get the values from the repeater input fields and add to our hidden field. * */ getAllInputs: function getAllInputs($element) { var inputValues = $element.find('.repeater-input').map(function () { return $(this).val(); }).toArray(); // Add all the values from our repeater fields to the hidden field (which is the one that actually gets saved) $element.find('.merchant-sortable-repeater-input').val(JSON.stringify(inputValues)); // Important! Make sure to trigger change event so Customizer knows it has to save the field $element.find('.merchant-sortable-repeater-input').trigger('change'); } }; // Initialize Sortable Repeater. SortableRepeaterField.init(); // Flexible Content. var FlexibleContentField = { init: function init(field) { var self = this; // Update the values for all our input fields and initialise the sortable repeater. $('.merchant-flexible-content-control').each(function () { var $content = $(this).find('.merchant-flexible-content'); $content.sortable({ axis: 'y', cursor: 'move', helper: 'original', handle: '.customize-control-flexible-content-move', stop: function stop(event, ui) { $content.trigger('merchant.sorted'); self.refreshNumbers($content); } }); }); // Events. this.events(); }, events: function events() { var self = this; $('.customize-control-flexible-content-add-button').click(function (event) { event.preventDefault(); event.stopImmediatePropagation(); $(this).parent().find('.customize-control-flexible-content-add-list').toggleClass('active'); }); $('.customize-control-flexible-content-add').click(function (event) { event.preventDefault(); event.stopImmediatePropagation(); var $field = $('.merchant-flexible-content-control[data-id=' + $(this).data('id') + ']'); var $layouts = $field.find('.layouts'); var $selected = $(this).data('layout'); var $layout = $layouts.find('.layout[data-type=' + $selected + ']').clone(true); var $content = $field.find('.merchant-flexible-content'); var $items = $content.find('.layout'); $layout.find('input, select').each(function () { if ($(this).data('name')) { $(this).attr('name', $(this).data('name').replace('0', $items.length)); } }); $layout.find('.layout-count').text($items.length + 1); $content.append($layout); $content.removeClass('empty'); $(this).parent().removeClass('active'); if ($layout.find('.merchant-module-page-setting-field-upload').length) { initUploadField($layout.find('.merchant-module-page-setting-field-upload')); } if ($layout.find('.merchant-module-page-setting-field-select_ajax').length) { initSelectAjax($layout.find('.merchant-module-page-setting-field-select_ajax')); } $(document).trigger('merchant-flexible-content-added', [$layout]); }); $('.customize-control-flexible-content-delete').click(function (event) { event.preventDefault(); var $item = $(this).closest('.layout'); var $content = $item.parent(); $item.remove(); if ($content.find('.layout').length === 0) { $content.addClass('empty'); } self.refreshNumbers($content); $(document).trigger('merchant-flexible-content-deleted', [$item]); }); }, refreshNumbers: function refreshNumbers($content) { $content.find('.layout').each(function (index) { var $count = $(this).find('.layout-count').text(); var $inputIndex = parseInt($count) - 1; $(this).find('.layout-count').text(index + 1); $(this).find('input, select').each(function () { if ($(this).attr('name')) { $(this).attr('name', $(this).attr('name').replace('[' + $inputIndex + ']', '[*refreshed*' + index + ']')); } }); }); $content.find('.layout').each(function (index) { // We've added *refreshed* tp the attribute name in the prior loop as refreshing the numbers in the attribute can cause // checked boxes to be unchecked due to similar attribute names during the change while sorting, within this loop we remove them $(this).find('input, select').each(function () { $(this).attr('name', $(this).attr('name').replace('*refreshed*', '')); }); }); $content.parent().find('input').trigger('change.merchant'); } }; // Initialize Flexible Content. FlexibleContentField.init(); $(document).on('merchant-admin-check-fields merchant-flexible-content-added', function () { $('.merchant-module-page-setting-field').each(function () { var $field = $(this); if ($field.data('condition') && $field.data('condition').length) { var condition = $field.data('condition'); var $target = $(this).closest('.layout-body').find('input[name*="' + condition[0] + '"],select[name*="' + condition[0] + '"]'); if (!$target.length) { $target = $('input[name="merchant[' + condition[0] + ']"],select[name="merchant[' + condition[0] + ']"]'); } if ($target.length) { var passed = false; switch (condition[1]) { case '==': if ($target.attr('type') === 'radio' || $target.attr('type') === 'checkbox') { if ($target.is(':checked') && $target.val() == condition[2]) { passed = true; } } if ($target.is('select') && $target.val() == condition[2]) { passed = true; } break; case 'any': if ($target.attr('type') === 'radio' || $target.attr('type') === 'checkbox') { if ($target.is(':checked') && condition[2].split('|').includes($target.val())) { passed = true; } } if ($target.is('select') && condition[2].split('|').includes($target.val())) { passed = true; } break; } if (passed) { $field.removeClass('merchant-hide').addClass('merchant-show'); } else { $field.removeClass('merchant-show').addClass('merchant-hide'); } } } }); }).trigger('merchant.change'); $(document).on('change', '.merchant-module-page-setting-field', function () { $(document).trigger('merchant-admin-check-fields'); }).trigger('merchant.change'); $(document).trigger('merchant-admin-check-fields'); $(document).on('merchant-admin-check-color-fields merchant-flexible-content-added', function () { $('.merchant-color').each(function () { var $color = $(this); var $picker = $color.find('.merchant-color-picker'); var $input = $color.find('.merchant-color-input'); var inited = false; var pickr; $picker.off('click').on('click', function (e) { e.preventDefault(); e.stopPropagation(); var $bodyHTML = $('body,html'); $bodyHTML.addClass('merchant-height-auto'); if (!inited) { pickr = new Pickr({ el: $picker.get(0), container: 'body', theme: 'merchant', appClass: 'merchant-pcr-app', default: $input.val() || $picker.data('default-color') || '#212121', swatches: ['#000000', '#F44336', '#E91E63', '#673AB7', '#03A9F4', '#8BC34A', '#FFEB3B', '#FFC107', '#FFFFFF'], sliders: 'h', useAsButton: true, components: { hue: true, preview: true, opacity: true, interaction: { input: true, clear: true } }, i18n: { 'btn:clear': 'Default' } }); pickr.on('change', function (color) { var colorCode; if (color.a === 1) { pickr.setColorRepresentation('HEX'); colorCode = color.toHEXA().toString(0); } else { pickr.setColorRepresentation('RGBA'); colorCode = color.toRGBA().toString(0); } $picker.css({ 'background-color': colorCode }); if ($input.val() !== colorCode) { $input.val(colorCode).trigger('change.merchant'); } }); pickr.on('clear', function () { var defaultColor = $picker.data('default-color'); if (defaultColor) { pickr.setColor(defaultColor); } else { $picker.css({ 'background-color': 'white' }); $input.val(''); } }); pickr.on('hide', function () { $bodyHTML.removeClass('merchant-height-auto'); }); $picker.data('pickr', pickr); setTimeout(function () { pickr.show(); }, 200); inited = true; } else { pickr.setColor($input.val()); } }); $input.on('change keyup', function () { var colorCode = $(this).val(); $picker.css({ 'background-color': colorCode }); }); }); }); $(document).trigger('merchant-admin-check-color-fields'); // Create Page Control. var CreatePageControl = { init: function init() { this.events(); }, events: function events() { var self = this; $(document).on('click', '.merchant-create-page-control-button', function (e) { e.preventDefault(); var $this = $(this), $create_message = $this.parent().find('.merchant-create-page-control-create-message'), $success_message = $this.parent().find('.merchant-create-page-control-success-message'), initial_text = $this.text(), creating_text = $this.data('creating-text'), created_text = $this.data('created-text'), page_title = $this.data('page-title'), page_meta_key = $this.data('page-meta-key'), page_meta_value = $this.data('page-meta-value'), option_name = $this.data('option-name'), nonce = $this.data('nonce'); if (!page_title) { return false; } $(this).text(creating_text); $(this).attr('disabled', true); $.ajax({ type: 'post', url: ajaxurl, data: { action: 'merchant_create_page_control', page_title: page_title, page_meta_key: page_meta_key, page_meta_value: page_meta_value, option_name: option_name, nonce: nonce }, success: function success(response) { self.ajaxResponseHandler(response, $this, $success_message, $create_message); } }); }); }, ajaxResponseHandler: function ajaxResponseHandler(response, $this, $success_message, $create_message) { if ('success' === response.status) { var href = $success_message.find('a').attr('href'), newhref = href.replace('?post=&', '?post=' + response.page_id + '&'); $success_message.find('a').attr('href', newhref); $success_message.css('display', 'block'); $create_message.remove(); $this.remove(); } } }; // Initialize Create Page Control. CreatePageControl.init(); $('.merchant-module-page-setting-field-gallery').each(function () { var $this = $(this); var $button = $this.find('.merchant-gallery-button'); var $input = $this.find('.merchant-gallery-input'); var $images = $this.find('.merchant-gallery-images'); var $remove = $this.find('.merchant-gallery-remove'); var wpMediaFrame; var sortable = $images.sortable({ helper: 'original', update: function update(event, ui) { var selectedIds = []; $images.find('.merchant-gallery-image').each(function () { selectedIds.push($(this).data('item-id')); }); $input.val(selectedIds.join(',')).trigger('change'); } }); $remove.on('click', function (e) { e.preventDefault(); $(this).parent().remove(); var selectedIds = []; $images.find('.merchant-gallery-image').each(function () { selectedIds.push($(this).data('item-id')); }); $input.val(selectedIds.join(',')).trigger('change'); }); $button.on('click', function (e) { var $btn = $(this); var ids = $input.val(); var mode = ids ? 'edit' : 'add'; e.preventDefault(); if (typeof window.wp === 'undefined' || !window.wp.media || !window.wp.media.gallery) { return; } if (mode === 'add') { wpMediaFrame = window.wp.media({ library: { type: 'image' }, frame: 'post', state: 'gallery', multiple: true }); wpMediaFrame.open(); } else { wpMediaFrame = window.wp.media.gallery.edit('[gallery ids="' + ids + '"]'); } wpMediaFrame.on('update', function (selection) { $images.empty(); var selectedIds = selection.models.map(function (attachment) { var item = attachment.toJSON(); var thumb = item.sizes && item.sizes.thumbnail && item.sizes.thumbnail.url ? item.sizes.thumbnail.url : item.url; $images.append('