jQuery(document).ready(function($) { // ========================================== // 1. WOOCOMMERCE AFFILIATE AI CHAT LOGIC // ========================================== $('#waf-send-ai').on('click', function(e) { e.preventDefault(); var promptText = $('#waf-ai-prompt').val(); var $responseDiv = $('#waf-ai-response'); if(promptText.trim() === '') { alert('Please enter a prompt first.'); return; } $responseDiv.html('AI is processing...'); $.ajax({ url: waf_ajax.ajax_url, type: 'POST', data: { action: 'waf_ask_ai', prompt: promptText }, success: function(res) { if(res.success) { $responseDiv.html(res.data.replace(/\n/g, '
')); } else { $responseDiv.html('Error: ' + res.data + ''); } }, error: function() { $responseDiv.html('Connection failed.'); } }); }); // ========================================== // 2. MEDIA UPLOADER LOGIC // ========================================== $('.waf-media-btn').on('click', function(e) { e.preventDefault(); var $button = $(this); var $input = $button.prev('input[type="hidden"]'); var $preview = $button.next('.waf-media-preview'); var isGallery = ($input.attr('id') === 'adv_gallery_ids'); var mediaFrame = wp.media({ title: 'Select Media', button: { text: 'Use this media' }, multiple: isGallery }); mediaFrame.on('select', function() { var selection = mediaFrame.state().get('selection'); var ids = isGallery ? ($input.val() ? $input.val().split(',') : []) : []; if(!isGallery) { $preview.empty(); ids = []; } selection.map(function(attachment) { attachment = attachment.toJSON(); if (ids.indexOf(attachment.id.toString()) === -1) { ids.push(attachment.id); var imgUrl = (attachment.sizes && attachment.sizes.thumbnail) ? attachment.sizes.thumbnail.url : attachment.url; $preview.append('
'); } }); $input.val(ids.join(',')); }); mediaFrame.open(); }); $(document).on('click', '.waf-remove-image', function(e) { e.preventDefault(); var $item = $(this).closest('.waf-preview-item'); var idToRemove = $item.data('id').toString(); var $input = $item.closest('.waf-media-preview').prevAll('input[type="hidden"]').first(); var currentIds = $input.val().split(','); var newIds = currentIds.filter(function(id) { return id !== idToRemove && id !== ""; }); $input.val(newIds.join(',')); $item.fadeOut(300, function() { $(this).remove(); }); }); // ========================================== // 3. TOGGLE GROUP & METHOD // ========================================== var $groupToggle = $('#adv_is_group'); var $hideableFields = $('.waf-hideable-field'); function toggleGroupFields() { if ($groupToggle.is(':checked')) { $hideableFields.slideUp(300); } else { $hideableFields.slideDown(300); } } if ($groupToggle.length) { toggleGroupFields(); $groupToggle.on('change', toggleGroupFields); } $(document).on('change', '#adv_api_setting', function() { var selectedMethod = $(this).val(); var $wcApiWrap = $('#waf_wc_api_wrap'); if (selectedMethod === 'woocommerce') { $wcApiWrap.stop(true, true).slideDown(300); } else { $wcApiWrap.stop(true, true).slideUp(300); } }); if ($('#adv_api_setting').length) { $('#adv_api_setting').trigger('change'); } // ========================================== // 4. TOGGLE IMPORT MODE & TARGET TYPE // ========================================== $('#waf_import_mode').on('change', function() { var isAll = $(this).is(':checked'); if(isAll) { $('#waf_import_mode_label').text('Import All Products').css('color', '#2271b1'); $('#waf_custom_import_wrap').slideUp(300); } else { $('#waf_import_mode_label').text('Custom Import').css('color', '#d63638'); $('#waf_custom_import_wrap').slideDown(300); } }); $('#waf_custom_import_type').on('change', function() { var type = $(this).val(); if (type === 'category_query') { $('#waf_import_cat_query_wrap').slideDown(300); $('#waf_import_ids_wrap').slideUp(300); } else { $('#waf_import_ids_wrap').slideDown(300); $('#waf_import_cat_query_wrap').slideUp(300); } }); // ========================================== // 5. RUN IMPORT & DELETE ACTIONS (AJAX) // ========================================== var advId = $('#waf_current_adv_id').val(); $('#waf_run_import_btn').on('click', function(e) { e.preventDefault(); if(!advId || advId === '0') { alert("Please save this Advertiser first before running an import!"); return; } var $btn = $(this); var $spinner = $('#waf_import_progress'); var $statusText = $('#waf_import_status_text'); $btn.prop('disabled', true); $spinner.addClass('is-active'); $statusText.text('Preparing import connection...'); $.post(waf_ajax.ajax_url, { action: 'waf_run_import', adv_id: advId }, function(response) { $btn.prop('disabled', false); $spinner.removeClass('is-active'); if(response.success) { $statusText.css('color', '#46b450').text(response.data); } else { $statusText.css('color', '#d63638').text('Failed: ' + response.data); } }); }); $('#waf_delete_products_btn').on('click', function(e) { e.preventDefault(); if(!advId || advId === '0') { return; } if(!confirm('WARNING! Are you sure you want to permanently delete ALL products from this Advertiser? (Including downloaded images)')) return; var $btn = $(this); var $spinner = $('#waf_delete_progress'); $btn.prop('disabled', true).text('Deleting...'); $spinner.addClass('is-active'); $.post(waf_ajax.ajax_url, { action: 'waf_delete_products', adv_id: advId }, function(response) { $spinner.removeClass('is-active'); if(response.success) { alert(response.data); window.location.reload(); } else { alert('Failed: ' + response.data); $btn.prop('disabled', false).html(' Delete Products'); } }); }); // ========================================== // 6. SORTABLE STORE MENU // ========================================== var $sortableList = $('#waf-sortable-list'); if ($sortableList.length) { $sortableList.sortable({ handle: '.waf-sort-handle', axis: 'y', start: function(event, ui) { var currentLevel = parseInt(ui.item.data('level')); var $children = $(); ui.item.nextAll('tr').each(function() { if (parseInt($(this).data('level')) > currentLevel) { $children = $children.add($(this)); } else { return false; } }); $children.hide(); ui.item.data('children', $children); }, stop: function(event, ui) { var $children = ui.item.data('children'); ui.item.after($children); $children.show(); var newOrder = []; $('#waf-sortable-list tr').each(function() { newOrder.push($(this).data('id')); }); $.post(waf_ajax.ajax_url, { action: 'waf_save_advertiser_order', order: newOrder }, function(response) { if (response.success) { $('body').css('cursor', 'wait'); window.location.reload(); } }); } }); } // ========================================== // 7. JSON VIEWER & TEST API // ========================================== var lastFetchedRawJson = ""; var cachedApiCategories = []; $(document).on('click', '.waf-json-tab', function(e) { e.preventDefault(); if ($(this).attr('id') === 'waf_copy_json') return; $('.waf-json-tab').not('#waf_copy_json').removeClass('active'); $(this).addClass('active'); var target = $(this).data('target'); if (target === 'tree') { $('#waf_json_raw').hide(); $('#waf_json_tree').show(); } else { $('#waf_json_tree').hide(); $('#waf_json_raw').show(); } }); $('#waf_copy_json').on('click', function(e) { e.preventDefault(); var $btn = $(this); if (lastFetchedRawJson === "") { alert("No API data available to copy."); return; } navigator.clipboard.writeText(lastFetchedRawJson).then(function() { var originalHtml = $btn.html(); $btn.html(' Copied!'); $btn.css('background', '#2271b1'); setTimeout(function() { $btn.html(originalHtml); $btn.css('background', '#4CAF50'); }, 2000); }); }); $('#waf_json_search').on('input', function() { var term = $(this).val().toLowerCase(); var $tree = $('#waf_json_tree'); if (term === '') { $tree.find('details, summary, div').show(); return; } if (!$('.waf-json-tab[data-target="tree"]').hasClass('active')) { $('.waf-json-tab[data-target="tree"]').trigger('click'); } $tree.find('details').prop('open', true); $tree.find('details, summary, div').hide(); $tree.find('summary, div').each(function() { if ($(this).text().toLowerCase().indexOf(term) > -1) { $(this).show(); $(this).parents('details').show(); $(this).parents('details').children('summary').show(); } }); }); $('#waf_test_api_btn').on('click', function(e) { e.preventDefault(); var $btn = $(this); var url = $('#wc_test_url').val(), key = $('#wc_test_key').val(), secret = $('#wc_test_secret').val(); if (url === '' || key === '' || secret === '') { alert("Please fill in the URL, Key, and Secret."); return; } $btn.prop('disabled', true); $('#waf_api_status').html('Connecting...'); function syntaxHighlight(json) { json = json.replace(/&/g, '&').replace(//g, '>'); return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { var cls = 'number'; if (/^"/.test(match)) { if (/:$/.test(match)) cls = 'key'; else cls = 'string'; } else if (/true|false/.test(match)) { cls = 'boolean'; } else if (/null/.test(match)) { cls = 'null'; } var color = '#abb2bf'; if (cls === 'key') color = '#e06c75'; if (cls === 'string') color = '#98c379'; if (cls === 'number') color = '#d19a66'; if (cls === 'boolean') color = '#56b6c2'; return '' + match + ''; }); } function buildCollapsibleTree(obj) { if (typeof obj !== 'object' || obj === null) return ''; var html = ''; var keys = Object.keys(obj); keys.forEach(function(key) { var val = obj[key]; var type = Array.isArray(val) ? 'array' : (val === null ? 'null' : typeof val); if (type === 'object' && val !== null) { html += '
' + key + ' {Object}' + buildCollapsibleTree(val) + '
'; } else if (type === 'array') { html += '
' + key + ' [Array]'; if (val.length > 0 && typeof val[0] === 'object' && val[0] !== null) { html += buildCollapsibleTree(val[0]); } else if (val.length > 0) { html += '
primitive items
'; } html += '
'; } else { html += '
' + key + '
'; } }); return html; } $.post(waf_ajax.ajax_url, { action: 'waf_test_wc_api', url: url, key: key, secret: secret }, function(response) { $btn.prop('disabled', false); if (response.success) { $('#waf_api_status').html('Data Loaded.'); if (response.data && response.data.store_categories) { cachedApiCategories = response.data.store_categories; } lastFetchedRawJson = JSON.stringify(response.data, null, 4); $('#waf_json_raw').html(syntaxHighlight(lastFetchedRawJson)); $('#waf_json_tree').html('
' + buildCollapsibleTree(response.data) + '
'); } else { $('#waf_api_status').html('Error!'); var errMsg = '' + response.data + ''; $('#waf_json_raw, #waf_json_tree').html(errMsg); lastFetchedRawJson = ""; } }).fail(function() { $btn.prop('disabled', false); $('#waf_api_status').html('Network Error!'); }); }); // ========================================== // 8. CATEGORY MAPPING & WOOCOMMERCE QUICK EDIT // ========================================== $('#waf_add_cat_mapping').on('click', function(e) { e.preventDefault(); var $newRow = $('#waf_cat_mapping_template .waf-cat-row').first().clone(); $newRow.css({ 'margin-left': '0px', 'width': 'calc(100% - 0px)' }); $newRow.find('input[type="text"]').val(''); $newRow.find('input[type="hidden"]').val(0); $newRow.find('select').prop('selectedIndex', 0); $('#waf_cat_mapping_container').append($newRow); }); $(document).on('click', '.waf-remove-cat-row', function(e) { e.preventDefault(); $(this).closest('.waf-cat-row').remove(); }); if(typeof inlineEditPost !== 'undefined') { var wp_inline_edit = inlineEditPost.edit; inlineEditPost.edit = function(id) { wp_inline_edit.apply(this, arguments); var post_id = 0; if (typeof(id) == 'object') { post_id = parseInt(this.getId(id)); } if (post_id > 0) { var edit_row = $('#edit-' + post_id); var post_row = $('#post-' + post_id); var adv_id = post_row.find('.waf-adv-val').text(); edit_row.find('select[name="waf_advertiser_id"]').val(adv_id); } }; } });
Fatal error: Cannot redeclare run_wooaffiliate_hub() (previously declared in /home/u812340890/domains/catalogcraze.com/public_html/wp-content/plugins/wooaffiliate-hub/wooaffiliate-hub.php:33) in /home/u812340890/domains/catalogcraze.com/public_html/wp-content/plugins/wooaffiliate-hub/includes/class-waf-frontend.php on line 33