/** * Accepta Background Control JavaScript */ (function($) { 'use strict'; wp.customize.bind('ready', function() { initializeBackgroundControls(); }); // Also initialize when controls are added dynamically wp.customize.control.bind('add', function(control) { if (control.params && (control.params.type === 'accepta-background' || control.params.type === 'accepta-hero-background')) { setTimeout(function() { initializeBackgroundControls(); }, 100); } }); function initializeBackgroundControls() { var $wrappers = $('.accepta-background-control-wrapper'); // Initialize all existing controls $wrappers.each(function(index) { var $wrapper = $(this); if (!$wrapper.data('initialized')) { var controlId = $wrapper.data('control-id'); if (!controlId) { var $hiddenInput = $wrapper.find('.accepta-background-hidden'); var inputId = $hiddenInput.attr('id'); if (inputId) { controlId = inputId.replace('_customize-input-', '').replace(/-/g, '_'); } else { var settingLink = $hiddenInput.attr('data-customize-setting-link'); if (settingLink) { controlId = settingLink; } } } if (controlId) { initializeSingleBackgroundControl($wrapper, controlId); } else { // Try to get control ID from wrapper data attribute var wrapperControlId = $wrapper.data('control-id'); if (wrapperControlId) { initializeSingleBackgroundControl($wrapper, wrapperControlId); } } } else { } }); } function initializeSingleBackgroundControl($wrapper, controlId) { if (!$wrapper.length) { return; } if ($wrapper.data('initialized')) { return; // Already initialized } $wrapper.data('initialized', true); // Get control ID if not provided if (!controlId) { var $hiddenInput = $wrapper.find('.accepta-background-hidden'); var inputId = $hiddenInput.attr('id'); if (inputId) { controlId = inputId.replace('_customize-input-', '').replace(/-/g, '_'); } else { var settingLink = $hiddenInput.attr('data-customize-setting-link'); if (settingLink) { controlId = settingLink; } } } // Initialize color pickers // Regular HEX color pickers (solid color, gradient colors) var $hexColorInputs = $wrapper.find('.accepta-background-color'); var $gradientColorInputs = $wrapper.find('.accepta-background-gradient-start, .accepta-background-gradient-end'); if ($hexColorInputs.length > 0) { $hexColorInputs.each(function(index) { var $input = $(this); if (!$input.data('wpColorPicker')) { $input.wpColorPicker({ change: function(event, ui) { updateBackgroundValue($wrapper, controlId); } }); } else { } }); } // Initialize gradient color pickers if ($gradientColorInputs.length > 0) { $gradientColorInputs.each(function(index) { var $input = $(this); if (!$input.data('wpColorPicker')) { $input.wpColorPicker({ change: function(event, ui) { updateBackgroundValue($wrapper, controlId); }, clear: function() { $input.val('#000000'); updateBackgroundValue($wrapper, controlId); } }); } else { } }); } // Initialize color picker for overlay color var $overlayColorInput = $wrapper.find('.accepta-background-overlay-color'); if ($overlayColorInput.length > 0) { if (!$overlayColorInput.data('wpColorPicker')) { $overlayColorInput.wpColorPicker({ change: function(event, ui) { updateBackgroundValue($wrapper, controlId); } }); } else { } } // Opacity slider $wrapper.on('input change', '.accepta-background-overlay-opacity', function() { var opacity = $(this).val(); $wrapper.find('.accepta-opacity-value').text(opacity); updateBackgroundValue($wrapper, controlId); }); // Background type selector - make labels clickable and handle changes var $typeLabels = $wrapper.find('.accepta-background-type-selector label'); $wrapper.on('click', '.accepta-background-type-selector label', function(e) { e.preventDefault(); e.stopPropagation(); var $label = $(this); var $radio = $label.find('input[type="radio"]'); if ($radio.length && !$radio.prop('checked')) { var type = $radio.val(); // Update radio button $radio.prop('checked', true).trigger('change'); } else if ($radio.length) { } }); $wrapper.on('change', 'input[name$="_type"]', function() { var type = $(this).val(); $wrapper.find('.accepta-background-option').hide(); var $targetOption = $wrapper.find('.accepta-background-' + type); $targetOption.show(); // Show/hide overlay options - show for both image and video types // Note: overlay state is preserved, but only applies when image or video tab is active if (type === 'image' || type === 'video') { $wrapper.find('.accepta-background-overlay').show(); } else { $wrapper.find('.accepta-background-overlay').hide(); } // Update label styling $wrapper.find('.accepta-background-type-selector label').removeClass('active'); $(this).closest('label').addClass('active'); // Update the background value when type changes (important for video tab) updateBackgroundValue($wrapper, controlId); // Show/hide gradient angle for linear gradients and load gradient values if (type === 'gradient') { var gradientType = $wrapper.find('.accepta-background-gradient-type').val(); if (gradientType === 'linear') { $wrapper.find('.accepta-gradient-angle').show(); } else { $wrapper.find('.accepta-gradient-angle').hide(); } // Ensure gradient values are loaded from saved data if form fields are empty setTimeout(function() { if (wp.customize && wp.customize.control(controlId)) { var savedValue = wp.customize.control(controlId).setting.get(); if (savedValue) { try { var data = JSON.parse(savedValue); if (data.type === 'gradient') { // Load gradient values if form fields are empty if (!$wrapper.find('.accepta-background-gradient-start').val() && data.gradient_start) { $wrapper.find('.accepta-background-gradient-start').val(data.gradient_start); if ($wrapper.find('.accepta-background-gradient-start').data('wpColorPicker')) { $wrapper.find('.accepta-background-gradient-start').wpColorPicker('color', data.gradient_start); } } if (!$wrapper.find('.accepta-background-gradient-end').val() && data.gradient_end) { $wrapper.find('.accepta-background-gradient-end').val(data.gradient_end); if ($wrapper.find('.accepta-background-gradient-end').data('wpColorPicker')) { $wrapper.find('.accepta-background-gradient-end').wpColorPicker('color', data.gradient_end); } } if (!$wrapper.find('.accepta-background-gradient-angle').val() && data.gradient_angle) { $wrapper.find('.accepta-background-gradient-angle').val(data.gradient_angle); } if (!$wrapper.find('.accepta-background-gradient-type').val() && data.gradient_type) { $wrapper.find('.accepta-background-gradient-type').val(data.gradient_type).trigger('change'); } } } catch (e) { // Silent error } } } }, 100); } updateBackgroundValue($wrapper, controlId); }); // Set initial active state var $checkedRadio = $wrapper.find('input[name$="_type"]:checked'); if ($checkedRadio.length) { var initialType = $checkedRadio.val(); $checkedRadio.closest('label').addClass('active'); // Trigger initial show/hide $wrapper.find('.accepta-background-option').hide(); var $initialOption = $wrapper.find('.accepta-background-' + initialType); $initialOption.show(); // Show/hide overlay based on initial type if (initialType === 'image') { $wrapper.find('.accepta-background-overlay').show(); } else { $wrapper.find('.accepta-background-overlay').hide(); } } else { // If none checked, check the first one var $firstRadio = $wrapper.find('input[name$="_type"]').first(); if ($firstRadio.length) { var firstType = $firstRadio.val(); $firstRadio.prop('checked', true).closest('label').addClass('active'); $wrapper.find('.accepta-background-option').hide(); $wrapper.find('.accepta-background-' + firstType).show(); // Show/hide overlay based on first type if (firstType === 'image') { $wrapper.find('.accepta-background-overlay').show(); } else { $wrapper.find('.accepta-background-overlay').hide(); } updateBackgroundValue($wrapper, controlId); } else { } } // Initialize opacity value display var initialOpacity = $wrapper.find('.accepta-background-overlay-opacity').val(); $wrapper.find('.accepta-opacity-value').text(initialOpacity || '0.5'); // Gradient type change $wrapper.on('change', '.accepta-background-gradient-type', function() { var gradientType = $(this).val(); if (gradientType === 'linear') { $wrapper.find('.accepta-gradient-angle').show(); } else { $wrapper.find('.accepta-gradient-angle').hide(); } updateBackgroundValue($wrapper, controlId); }); // Gradient color pickers change (already handled by wpColorPicker change event, but adding as backup) $wrapper.on('change', '.accepta-background-gradient-start, .accepta-background-gradient-end', function() { updateBackgroundValue($wrapper, controlId); }); // All other field changes $wrapper.on('change input', '.accepta-background-gradient-angle, .accepta-background-image-size, .accepta-background-image-repeat, .accepta-background-image-position, .accepta-background-image-attachment', function() { updateBackgroundValue($wrapper, controlId); }); // Video field changes $wrapper.on('change', '.accepta-background-video-type', function() { var videoType = $(this).val(); if (videoType === 'mp4') { $wrapper.find('.accepta-video-url-option').hide(); $wrapper.find('.accepta-video-mp4-option').show(); } else { $wrapper.find('.accepta-video-url-option').show(); $wrapper.find('.accepta-video-mp4-option').hide(); } updateBackgroundValue($wrapper, controlId); }); $wrapper.on('change input', '.accepta-background-video-url, .accepta-background-video-mp4, .accepta-background-video-autoplay, .accepta-background-video-loop, .accepta-background-video-muted, .accepta-background-video-controls', function() { // Ensure video tab is selected when video fields are changed var $videoTypeRadio = $wrapper.find('input[name$="_type"][value="video"]'); if ($videoTypeRadio.length && !$videoTypeRadio.is(':checked')) { $videoTypeRadio.prop('checked', true).trigger('change'); } updateBackgroundValue($wrapper, controlId); }); // Video upload var videoFrame; $wrapper.on('click', '.accepta-background-video-button', function(e) { e.preventDefault(); if (videoFrame) { videoFrame.open(); return; } videoFrame = wp.media({ title: 'Select MP4 Video', button: { text: 'Use this video' }, library: { type: 'video' }, multiple: false }); videoFrame.on('select', function() { var attachment = videoFrame.state().get('selection').first().toJSON(); $wrapper.find('.accepta-background-video-mp4').val(attachment.url); $wrapper.find('.accepta-background-video-remove').show(); updateBackgroundValue($wrapper, controlId); }); videoFrame.open(); }); // Video remove $wrapper.on('click', '.accepta-background-video-remove', function(e) { e.preventDefault(); $wrapper.find('.accepta-background-video-mp4').val(''); $(this).hide(); updateBackgroundValue($wrapper, controlId); }); // Image upload var frame; $wrapper.on('click', '.accepta-background-image-button', function(e) { e.preventDefault(); if (frame) { frame.open(); return; } frame = wp.media({ title: 'Select Background Image', button: { text: 'Use this image' }, multiple: false }); frame.on('select', function() { var attachment = frame.state().get('selection').first().toJSON(); $wrapper.find('.accepta-background-image-url').val(attachment.url); $wrapper.find('.accepta-background-image-preview').html('').show(); $wrapper.find('.accepta-background-image-remove').show(); updateBackgroundValue($wrapper, controlId); }); frame.open(); }); // Image remove $wrapper.on('click', '.accepta-background-image-remove', function(e) { e.preventDefault(); $wrapper.find('.accepta-background-image-url').val(''); $wrapper.find('.accepta-background-image-preview').hide(); $(this).hide(); updateBackgroundValue($wrapper, controlId); }); // Overlay toggle - make label clickable and handle changes var $overlayToggle = $wrapper.find('.accepta-overlay-toggle'); $wrapper.on('click', '.accepta-overlay-toggle', function(e) { e.preventDefault(); e.stopPropagation(); var $checkbox = $(this).find('.accepta-background-overlay-enabled'); if ($checkbox.length) { var newState = !$checkbox.prop('checked'); $checkbox.prop('checked', newState).trigger('change'); } }); $wrapper.on('change', '.accepta-background-overlay-enabled', function() { var enabled = $(this).is(':checked'); var $overlayOptions = $wrapper.find('.accepta-overlay-options'); if (enabled) { $overlayOptions.show(); } else { $overlayOptions.hide(); } updateBackgroundValue($wrapper, controlId); }); // Set initial overlay state var $overlayCheckbox = $wrapper.find('.accepta-background-overlay-enabled'); if ($overlayCheckbox.length) { var isChecked = $overlayCheckbox.is(':checked'); if (isChecked) { $wrapper.find('.accepta-overlay-options').show(); } else { $wrapper.find('.accepta-overlay-options').hide(); } } // Overlay opacity slider $wrapper.on('input change', '.accepta-background-overlay-opacity', function() { var opacity = $(this).val(); $wrapper.find('.accepta-opacity-value').text(opacity); updateBackgroundValue($wrapper, controlId); }); // Reset button $wrapper.on('click', '.accepta-background-reset', function(e) { e.preventDefault(); e.stopPropagation(); if (!confirm('Are you sure you want to reset all background settings to defaults?')) { return; } // Get default values from data attribute (jQuery .data() auto-parses JSON) var defaultValuesAttr = $wrapper.attr('data-default-values'); var defaultValues = $wrapper.data('default-values'); // If .data() didn't parse it (returns string), parse it manually if (typeof defaultValues === 'string') { try { // Decode HTML entities first if needed var decoded = $('
').html(defaultValues).text(); defaultValues = JSON.parse(decoded); } catch (e) { // Try parsing the raw attribute try { defaultValues = JSON.parse(defaultValuesAttr); } catch (e2) { return; } } } if (defaultValues && typeof defaultValues === 'object') { resetToDefaults($wrapper, defaultValues, controlId); } else { } }); // Load saved values loadSavedValues($wrapper, controlId); } function resetToDefaults($wrapper, defaults, controlId) { // First, clear the image completely before switching types $wrapper.find('.accepta-background-image-url').val(''); $wrapper.find('.accepta-background-image-preview').hide().html(''); $wrapper.find('.accepta-background-image-remove').hide(); // Reset background type first $wrapper.find('input[name$="_type"][value="' + defaults.type + '"]').prop('checked', true).trigger('change'); // Wait a bit for the change event to process setTimeout(function() { // Reset solid color if (defaults.color) { $wrapper.find('.accepta-background-color').val(defaults.color); if ($wrapper.find('.accepta-background-color').data('wpColorPicker')) { $wrapper.find('.accepta-background-color').wpColorPicker('color', defaults.color); } } // Reset gradient if (defaults.gradient_type) { $wrapper.find('.accepta-background-gradient-type').val(defaults.gradient_type).trigger('change'); } if (defaults.gradient_angle) { $wrapper.find('.accepta-background-gradient-angle').val(defaults.gradient_angle); } if (defaults.gradient_start) { $wrapper.find('.accepta-background-gradient-start').val(defaults.gradient_start); if ($wrapper.find('.accepta-background-gradient-start').data('wpColorPicker')) { $wrapper.find('.accepta-background-gradient-start').wpColorPicker('color', defaults.gradient_start); } } if (defaults.gradient_end) { $wrapper.find('.accepta-background-gradient-end').val(defaults.gradient_end); if ($wrapper.find('.accepta-background-gradient-end').data('wpColorPicker')) { $wrapper.find('.accepta-background-gradient-end').wpColorPicker('color', defaults.gradient_end); } } // Reset image - always clear it if default is empty if (defaults.image && defaults.image !== '') { $wrapper.find('.accepta-background-image-url').val(defaults.image); $wrapper.find('.accepta-background-image-preview').html('').show(); $wrapper.find('.accepta-background-image-remove').show(); } else { // Clear image completely $wrapper.find('.accepta-background-image-url').val(''); $wrapper.find('.accepta-background-image-preview').hide().html(''); $wrapper.find('.accepta-background-image-remove').hide(); } if (defaults.size) { $wrapper.find('.accepta-background-image-size').val(defaults.size); } if (defaults.repeat) { $wrapper.find('.accepta-background-image-repeat').val(defaults.repeat); } if (defaults.position) { $wrapper.find('.accepta-background-image-position').val(defaults.position); } if (defaults.attachment) { $wrapper.find('.accepta-background-image-attachment').val(defaults.attachment); } // Reset video options (if control supports video) if (defaults.video_type !== undefined) { $wrapper.find('.accepta-background-video-type').val(defaults.video_type || 'youtube').trigger('change'); $wrapper.find('.accepta-background-video-url').val(defaults.video_url || ''); $wrapper.find('.accepta-background-video-mp4').val(defaults.video_mp4 || ''); $wrapper.find('.accepta-background-video-autoplay').prop('checked', defaults.video_autoplay !== false); $wrapper.find('.accepta-background-video-loop').prop('checked', defaults.video_loop !== false); $wrapper.find('.accepta-background-video-muted').prop('checked', defaults.video_muted !== false); $wrapper.find('.accepta-background-video-controls').prop('checked', defaults.video_controls === true); if (!defaults.video_mp4) { $wrapper.find('.accepta-background-video-remove').hide(); } } // Reset overlay - always reset checkbox state to false (unchecked) var overlayEnabled = defaults.overlay_enabled === true || defaults.overlay_enabled === 'true' || defaults.overlay_enabled === 1; var $overlayCheckbox = $wrapper.find('.accepta-background-overlay-enabled'); // Always uncheck the overlay checkbox on reset $overlayCheckbox.prop('checked', false); // Hide overlay options $wrapper.find('.accepta-overlay-options').hide(); // Trigger change event to ensure UI updates $overlayCheckbox.trigger('change'); // Reset overlay color if (defaults.overlay_color) { $wrapper.find('.accepta-background-overlay-color').val(defaults.overlay_color); if ($wrapper.find('.accepta-background-overlay-color').data('wpColorPicker')) { $wrapper.find('.accepta-background-overlay-color').wpColorPicker('color', defaults.overlay_color); } } if (defaults.overlay_opacity !== undefined) { $wrapper.find('.accepta-background-overlay-opacity').val(defaults.overlay_opacity); $wrapper.find('.accepta-opacity-value').text(defaults.overlay_opacity); } // Update the value - this will trigger the live preview updateBackgroundValue($wrapper, controlId); // Ensure the preview updates by explicitly triggering the setting change setTimeout(function() { if (wp.customize && wp.customize.control(controlId)) { var setting = wp.customize.control(controlId).setting; if (setting) { // Get the current value from the hidden input var currentValue = $wrapper.find('.accepta-background-hidden').val(); // Force update by setting the value again setting.set(currentValue); } } }, 150); }, 100); } function loadSavedValues($wrapper, controlId) { if (wp.customize && wp.customize.control(controlId)) { var savedValue = wp.customize.control(controlId).setting.get(); if (savedValue) { try { var data = JSON.parse(savedValue); // Update background type if (data.type) { var $typeRadio = $wrapper.find('input[name$="_type"][value="' + data.type + '"]'); if ($typeRadio.length) { $typeRadio.prop('checked', true).trigger('change'); // Also update the visual state $wrapper.find('.accepta-background-type-selector label').removeClass('active'); $typeRadio.closest('label').addClass('active'); } } // Update solid color if (data.color) { $wrapper.find('.accepta-background-color').val(data.color); if ($wrapper.find('.accepta-background-color').data('wpColorPicker')) { $wrapper.find('.accepta-background-color').wpColorPicker('color', data.color); } } // Update gradient options if (data.gradient_type !== undefined) { $wrapper.find('.accepta-background-gradient-type').val(data.gradient_type || 'linear').trigger('change'); } if (data.gradient_angle !== undefined) { $wrapper.find('.accepta-background-gradient-angle').val(data.gradient_angle || '90'); } if (data.gradient_start !== undefined) { // Check if this is hero background control var isHero = controlId === 'accepta_hero_background'; var defaultGradientStart = isHero ? '#6F9C50' : '#2c3e50'; var gradientStart = data.gradient_start || defaultGradientStart; $wrapper.find('.accepta-background-gradient-start').val(gradientStart); setTimeout(function() { if ($wrapper.find('.accepta-background-gradient-start').data('wpColorPicker')) { $wrapper.find('.accepta-background-gradient-start').wpColorPicker('color', gradientStart); } }, 100); } if (data.gradient_end !== undefined) { // Check if this is hero background control var isHero = controlId === 'accepta_hero_background'; var defaultGradientEnd = isHero ? '#568F0C' : '#34495e'; var gradientEnd = data.gradient_end || defaultGradientEnd; $wrapper.find('.accepta-background-gradient-end').val(gradientEnd); setTimeout(function() { if ($wrapper.find('.accepta-background-gradient-end').data('wpColorPicker')) { $wrapper.find('.accepta-background-gradient-end').wpColorPicker('color', gradientEnd); } }, 100); } // Update video options (if control supports video) if (data.video_type !== undefined) { $wrapper.find('.accepta-background-video-type').val(data.video_type || 'youtube').trigger('change'); $wrapper.find('.accepta-background-video-url').val(data.video_url || ''); $wrapper.find('.accepta-background-video-mp4').val(data.video_mp4 || ''); $wrapper.find('.accepta-background-video-autoplay').prop('checked', data.video_autoplay !== false); $wrapper.find('.accepta-background-video-loop').prop('checked', data.video_loop !== false); $wrapper.find('.accepta-background-video-muted').prop('checked', data.video_muted !== false); $wrapper.find('.accepta-background-video-controls').prop('checked', data.video_controls === true); if (data.video_mp4) { $wrapper.find('.accepta-background-video-remove').show(); } } // Update overlay checkbox if (data.overlay_enabled !== undefined) { $wrapper.find('.accepta-background-overlay-enabled').prop('checked', data.overlay_enabled); $wrapper.find('.accepta-overlay-options').toggle(data.overlay_enabled); } // Update overlay color if (data.overlay_color) { $wrapper.find('.accepta-background-overlay-color').val(data.overlay_color); setTimeout(function() { if ($wrapper.find('.accepta-background-overlay-color').data('wpColorPicker')) { $wrapper.find('.accepta-background-overlay-color').wpColorPicker('color', data.overlay_color); } }, 100); } if (data.overlay_opacity !== undefined) { $wrapper.find('.accepta-background-overlay-opacity').val(data.overlay_opacity); $wrapper.find('.accepta-opacity-value').text(data.overlay_opacity); } } catch (e) { } } } } function updateBackgroundValue($wrapper, controlId) { var type = $wrapper.find('input[name$="_type"]:checked').val(); // If no type is selected, default to solid if (!type) { type = 'solid'; $wrapper.find('input[name$="_type"][value="solid"]').prop('checked', true); } // Get existing data first to preserve values (especially image) var existingData = {}; if (wp.customize && wp.customize.control(controlId)) { var savedValue = wp.customize.control(controlId).setting.get(); if (savedValue) { try { existingData = JSON.parse(savedValue); } catch (e) { // Try from hidden input as fallback var currentValue = $wrapper.find('.accepta-background-hidden').val(); if (currentValue) { try { existingData = JSON.parse(currentValue); } catch (e2) { existingData = {}; } } } } } var data = { type: type }; if (type === 'solid') { // Check if this is hero background control var controlId = $wrapper.data('control-id'); var isHero = controlId === 'accepta_hero_background'; var defaultColor = isHero ? '#6F9C50' : '#2c3e50'; data.color = $wrapper.find('.accepta-background-color').val() || defaultColor; data.image = ''; // Clear image when switching to solid // Preserve overlay state, but it won't apply (only applies to image) if (existingData.overlay_enabled !== undefined) { data.overlay_enabled = existingData.overlay_enabled; } // Preserve video data even when not on video tab if (existingData.video_type !== undefined) { data.video_type = existingData.video_type; data.video_url = existingData.video_url || ''; data.video_mp4 = existingData.video_mp4 || ''; data.video_autoplay = existingData.video_autoplay !== undefined ? existingData.video_autoplay : true; data.video_loop = existingData.video_loop !== undefined ? existingData.video_loop : true; data.video_muted = existingData.video_muted !== undefined ? existingData.video_muted : true; data.video_controls = existingData.video_controls !== undefined ? existingData.video_controls : false; } } else if (type === 'gradient') { // Get gradient values from form fields, use existing data as fallback, then defaults var gradientTypeValue = $wrapper.find('.accepta-background-gradient-type').val(); data.gradient_type = gradientTypeValue || (existingData.gradient_type !== undefined ? existingData.gradient_type : 'linear'); var gradientAngleValue = $wrapper.find('.accepta-background-gradient-angle').val(); data.gradient_angle = gradientAngleValue || (existingData.gradient_angle !== undefined ? existingData.gradient_angle : '90'); // Check if this is hero background control var isHero = controlId === 'accepta_hero_background'; var defaultGradientStart = isHero ? '#6F9C50' : '#2c3e50'; var gradientStartValue = $wrapper.find('.accepta-background-gradient-start').val(); data.gradient_start = gradientStartValue || (existingData.gradient_start !== undefined ? existingData.gradient_start : defaultGradientStart); var defaultGradientEnd = isHero ? '#568F0C' : '#34495e'; var gradientEndValue = $wrapper.find('.accepta-background-gradient-end').val(); data.gradient_end = gradientEndValue || (existingData.gradient_end !== undefined ? existingData.gradient_end : defaultGradientEnd); data.image = ''; // Clear image when switching to gradient // Preserve overlay state, but it won't apply (only applies to image) if (existingData.overlay_enabled !== undefined) { data.overlay_enabled = existingData.overlay_enabled; } // Preserve video data even when not on video tab if (existingData.video_type !== undefined) { data.video_type = existingData.video_type; data.video_url = existingData.video_url || ''; data.video_mp4 = existingData.video_mp4 || ''; data.video_autoplay = existingData.video_autoplay !== undefined ? existingData.video_autoplay : true; data.video_loop = existingData.video_loop !== undefined ? existingData.video_loop : true; data.video_muted = existingData.video_muted !== undefined ? existingData.video_muted : true; data.video_controls = existingData.video_controls !== undefined ? existingData.video_controls : false; } } else if (type === 'image') { // Always preserve existing image data - only update if form field has a value var imageUrl = $wrapper.find('.accepta-background-image-url').val() || ''; // If form field is empty, use existing saved image if (!imageUrl && existingData.image) { imageUrl = existingData.image; } data.image = imageUrl; // Preserve all image settings, only update if form has values var sizeValue = $wrapper.find('.accepta-background-image-size').val(); data.size = sizeValue || existingData.size || 'cover'; var repeatValue = $wrapper.find('.accepta-background-image-repeat').val(); data.repeat = repeatValue || existingData.repeat || 'no-repeat'; var positionValue = $wrapper.find('.accepta-background-image-position').val(); data.position = positionValue || existingData.position || 'center'; var attachmentValue = $wrapper.find('.accepta-background-image-attachment').val(); data.attachment = attachmentValue || existingData.attachment || 'scroll'; // Preserve video data even when not on video tab if (existingData.video_type !== undefined) { data.video_type = existingData.video_type; data.video_url = existingData.video_url || ''; data.video_mp4 = existingData.video_mp4 || ''; data.video_autoplay = existingData.video_autoplay !== undefined ? existingData.video_autoplay : true; data.video_loop = existingData.video_loop !== undefined ? existingData.video_loop : true; data.video_muted = existingData.video_muted !== undefined ? existingData.video_muted : true; data.video_controls = existingData.video_controls !== undefined ? existingData.video_controls : false; } } else if (type === 'video') { // Video options - get from form fields, preserve existing if empty var videoTypeValue = $wrapper.find('.accepta-background-video-type').val(); data.video_type = videoTypeValue || (existingData.video_type !== undefined ? existingData.video_type : 'youtube'); var videoUrlValue = $wrapper.find('.accepta-background-video-url').val() || ''; // If form field is empty, use existing saved video URL if (!videoUrlValue && existingData.video_url) { videoUrlValue = existingData.video_url; } data.video_url = videoUrlValue; var videoMp4Value = $wrapper.find('.accepta-background-video-mp4').val() || ''; // If form field is empty, use existing saved video MP4 if (!videoMp4Value && existingData.video_mp4) { videoMp4Value = existingData.video_mp4; } data.video_mp4 = videoMp4Value; // Get checkbox states, use existing if checkboxes don't exist (for hero control) var $autoplayCheckbox = $wrapper.find('.accepta-background-video-autoplay'); data.video_autoplay = $autoplayCheckbox.length ? $autoplayCheckbox.is(':checked') : (existingData.video_autoplay !== undefined ? existingData.video_autoplay : true); var $loopCheckbox = $wrapper.find('.accepta-background-video-loop'); data.video_loop = $loopCheckbox.length ? $loopCheckbox.is(':checked') : (existingData.video_loop !== undefined ? existingData.video_loop : true); var $mutedCheckbox = $wrapper.find('.accepta-background-video-muted'); data.video_muted = $mutedCheckbox.length ? $mutedCheckbox.is(':checked') : (existingData.video_muted !== undefined ? existingData.video_muted : true); var $controlsCheckbox = $wrapper.find('.accepta-background-video-controls'); data.video_controls = $controlsCheckbox.length ? $controlsCheckbox.is(':checked') : (existingData.video_controls !== undefined ? existingData.video_controls : false); // Preserve other background data if (existingData.color !== undefined) { data.color = existingData.color; } if (existingData.gradient_type !== undefined) { data.gradient_type = existingData.gradient_type; data.gradient_angle = existingData.gradient_angle; data.gradient_start = existingData.gradient_start; data.gradient_end = existingData.gradient_end; } if (existingData.image !== undefined) { data.image = existingData.image; data.size = existingData.size; data.repeat = existingData.repeat; data.position = existingData.position; data.attachment = existingData.attachment; } } // Overlay options data.overlay_enabled = $wrapper.find('.accepta-background-overlay-enabled').is(':checked'); data.overlay_color = $wrapper.find('.accepta-background-overlay-color').val() || '#000000'; data.overlay_opacity = $wrapper.find('.accepta-background-overlay-opacity').val() || '0.5'; var jsonValue = JSON.stringify(data); $wrapper.find('.accepta-background-hidden').val(jsonValue); if (wp.customize && wp.customize.control(controlId)) { var setting = wp.customize.control(controlId).setting; if (setting) { // Set the value - this will automatically trigger the live preview if transport is postMessage setting.set(jsonValue); } else { } } else { } } // Register control types wp.customize.controlConstructor['accepta-background'] = wp.customize.Control.extend({ ready: function() { var control = this; var $wrapper = control.container.find('.accepta-background-control-wrapper'); if ($wrapper.length) { var isInitialized = $wrapper.data('initialized'); if (!isInitialized) { // Initialize this specific control var controlId = $wrapper.data('control-id') || control.id; // Use multiple timeouts to ensure DOM is ready setTimeout(function() { initializeSingleBackgroundControl($wrapper, controlId); }, 50); setTimeout(function() { if (!$wrapper.data('initialized')) { initializeSingleBackgroundControl($wrapper, controlId); } else { } }, 200); } } else { // Try to find wrapper in the entire document as fallback var $globalWrapper = $('.accepta-background-control-wrapper[data-control-id="' + control.id + '"]'); if ($globalWrapper.length) { var controlId = $globalWrapper.data('control-id') || control.id; initializeSingleBackgroundControl($globalWrapper, controlId); } } } }); // Register hero background control type (uses same JS as base background control) wp.customize.controlConstructor['accepta-hero-background'] = wp.customize.controlConstructor['accepta-background']; })(jQuery);