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