1(function ($) { 2 'use strict'; 3 4 $(document).ready(function () { 5 $(document).on('submit', '.ai-toolkits-form', function (e) { 6 var ai_toolkits_form = $(this); 7 8 // Force all selectors to update their original select elements before form submission 9 ai_toolkits_form.find('.ai-toolkits-select').each(function () { 10 var $select = $(this); 11 var selectorInstance = $select.data('-selector'); 12 if (selectorInstance && typeof selectorInstance.updateOriginalSelect === 'function') { 13 selectorInstance.updateOriginalSelect(); 14 } 15 }); 16 17 // Force all dual range sliders to update their hidden inputs before form submission 18 ai_toolkits_form.find('.ai-toolkits-input-range-dual-wrapper').each(function () { 19 var $wrapper = $(this); 20 var $minInput = $wrapper.find('.ai-toolkits-input-range-dual-min'); 21 var $maxInput = $wrapper.find('.ai-toolkits-input-range-dual-max'); 22 var $minHidden = $wrapper.find('.ai-toolkits-range-dual-hidden-min'); 23 var $maxHidden = $wrapper.find('.ai-toolkits-range-dual-hidden-max'); 24 25 if ($minInput.length && $maxInput.length && $minHidden.length && $maxHidden.length) { 26 var min = parseInt($minInput.val()); 27 var max = parseInt($maxInput.val()); 28 29 // Ensure min <= max 30 if (min > max) { 31 min = max; 32 } 33 34 // Update hidden inputs 35 $minHidden.val(min); 36 $maxHidden.val(max); 37 } 38 }); 39 40 var ai_toolkits_btn = ai_toolkits_form.find('input[type="submit"]'); 41 ai_toolkits_btn.addClass('ai-toolkits-link-disabled').siblings('.ai-toolkits-waiting').removeClass('ai-toolkits-display-none'); 42 43 var ajax_url = ai_toolkits_ajax.ajax_url; 44 var data = { 45 action: 'ai_toolkits_ajax_nopriv', 46 ai_toolkits_ajax_nopriv_nonce: ai_toolkits_ajax.ai_toolkits_ajax_nonce, 47 ai_toolkits_get_nonce: ai_toolkits_action.ai_toolkits_get_nonce, 48 ai_toolkits_ajax_nopriv_type: 'ai_toolkits_form_save', 49 ai_toolkits_form_id: ai_toolkits_form.attr('id'), 50 ai_toolkits_form_type: ai_toolkits_btn.attr('data-ai-toolkits-type'), 51 ai_toolkits_form_subtype: ai_toolkits_btn.attr('data-ai-toolkits-subtype'), 52 ai_toolkits_form_user_id: ai_toolkits_btn.attr('data-ai-toolkits-user-id'), 53 ai_toolkits_form_post_id: ai_toolkits_btn.attr('data-ai-toolkits-post-id'), 54 ai_toolkits_form_post_type: ai_toolkits_btn.attr('data-ai-toolkits-post-type'), 55 ai_toolkits_ajax_keys: [], 56 }; 57 58 if (!(typeof window['ai_toolkits_window_vars'] !== 'undefined')) { 59 window['ai_toolkits_window_vars'] = []; 60 } 61 62 // First pass: collect all field names to detect duplicates (html_multi fields) 63 var field_names_count = {}; 64 var field_info = {}; // Store field metadata (node, type) for each unique field name 65 $(ai_toolkits_form.find('input:not([type="submit"]), select, textarea')).each(function (index, element) { 66 var field_name = element.name; 67 if (field_name) { 68 if (!field_names_count[field_name]) { 69 field_names_count[field_name] = 0; 70 // Store metadata from first occurrence 71 field_info[field_name] = { 72 node: element.nodeName, 73 type: element.type, 74 is_multiple: $(this).attr('multiple') === 'multiple' 75 }; 76 } 77 field_names_count[field_name]++; 78 } 79 }); 80 81 // Second pass: collect values, treating duplicate names as arrays 82 $(ai_toolkits_form.find('input:not([type="submit"]), select, textarea')).each(function (index, element) { 83 var is_multiple = $(this).attr('multiple'); 84 var field_name = element.name; 85 var is_html_multi_field = field_names_count[field_name] > 1; 86 87 if (is_multiple || is_html_multi_field) { 88 // Initialize array if not exists 89 if (!(typeof window['ai_toolkits_window_vars']['form_field_' + field_name] !== 'undefined')) { 90 window['ai_toolkits_window_vars']['form_field_' + field_name] = []; 91 } 92 93 // Handle checkboxes in multiple fields 94 if ($(this).is(':checkbox')) { 95 if ($(this).is(':checked')) { 96 window['ai_toolkits_window_vars']['form_field_' + field_name].push($(element).val()); 97 } else { 98 // For unchecked checkboxes in multiple fields, push empty string to maintain array structure 99 window['ai_toolkits_window_vars']['form_field_' + field_name].push(''); 100 } 101 } else { 102 // For non-checkbox multiple fields, push the value 103 // If it's a select with custom selector, try to get values from selector instance 104 if ($(this).is('select') && $(this).hasClass('ai-toolkits-select')) { 105 var selectorInstance = $(this).data('-selector'); 106 if (selectorInstance && selectorInstance.selectedValues && selectorInstance.selectedValues.length > 0) { 107 // Use values from selector instance
108 selectorInstance.selectedValues.forEach(function (val) { 109 window['ai_toolkits_window_vars']['form_field_' + field_name].push(val); 110 }); 111 } else { 112 // Fallback to reading from the select element 113 window['ai_toolkits_window_vars']['form_field_' + field_name].push($(element).val()); 114 } 115 } else { 116 window['ai_toolkits_window_vars']['form_field_' + field_name].push($(element).val()); 117 } 118 } 119 120 data[field_name] = window['ai_toolkits_window_vars']['form_field_' + field_name]; 121 } else { 122 if ($(this).is(':checkbox')) { 123 if ($(this).is(':checked')) { 124 data[field_name] = $(element).val(); 125 } else { 126 data[field_name] = ''; 127 } 128 } else if ($(this).is(':radio')) { 129 if ($(this).is(':checked')) { 130 data[field_name] = $(element).val(); 131 } 132 } else if ($(this).is('select') && $(this).hasClass('ai-toolkits-select')) { 133 // For select elements with custom selector, try to get value from selector instance first 134 var selectorInstance = $(this).data('-selector'); 135 if (selectorInstance && selectorInstance.selectedValues && selectorInstance.selectedValues.length > 0) { 136 data[field_name] = selectorInstance.selectedValues[0]; 137 } else { 138 // Fallback to reading from the select element 139 data[field_name] = $(element).val(); 140 } 141 } else { 142 data[field_name] = $(element).val(); 143 } 144 } 145 }); 146 147 // Third pass: add unique field entries to ajax_keys (only once per field name) 148 var processed_fields = {}; 149 $(ai_toolkits_form.find('input:not([type="submit"]), select, textarea')).each(function (index, element) { 150 var field_name = element.name; 151 if (field_name && !processed_fields[field_name]) { 152 var is_html_multi_field = field_names_count[field_name] > 1; 153 var is_multiple = field_info[field_name] ? field_info[field_name].is_multiple : ($(this).attr('multiple') === 'multiple'); 154 155 data.ai_toolkits_ajax_keys.push({ 156 id: field_name, 157 node: field_info[field_name] ? field_info[field_name].node : element.nodeName, 158 type: field_info[field_name] ? field_info[field_name].type : element.type, 159 multiple: (is_multiple || is_html_multi_field) ? true : false, 160 }); 161 162 processed_fields[field_name] = true; 163 } 164 }); 165 166 $.post(ajax_url, data, function (response) { 167 // Strip UTF-8 BOM characters that may leak from PHP includes 168 if (typeof response === 'string') { 169 response = response.replace(/^\uFEFF+/, ''); 170 } 171 var response_json = JSON.parse(response); 172 173 if (response_json['error_key'] == 'ai_toolkits_form_save_error_unlogged') { 174 ai_toolkits_get_main_message(ai_toolkits_i18n.user_unlogged); 175 176 if (!$('.userspn-profile-wrapper .user-unlogged').length) { 177 $('.userspn-profile-wrapper').prepend('<div class="userspn-alert userspn-alert-warning user-unlogged">' + ai_toolkits_i18n.user_unlogged + '</div>'); 178 } 179 180 AI_TOOLKITS_Popups.open($('#userspn-profile-popup')); 181 $('#userspn-login input#user_login').focus(); 182 } else if (response_json['error_key'] != '') { 183 ai_toolkits_get_main_message(ai_toolkits_i18n.an_error_has_occurred); 184 } else { 185 ai_toolkits_get_main_message(ai_toolkits_i18n.saved_successfully); 186 187 // Trigger custom event when settings form is successfully saved 188 if (ai_toolkits_form.attr('id') === 'ai-toolkits-form-setting') { 189 $(document).trigger('ai-toolkits-settings-saved'); 190 } 191 } 192 193 if (response_json['update_list']) { 194 $('.ai-toolkits-' + data.ai_toolkits_form_post_type + '-list').html(response_json['update_html']); 195 } 196 197 if (response_json['popup_close']) { 198 AI_TOOLKITS_Popups.close(); 199 $('.ai-toolkits-menu-more-overlay').fadeOut('fast'); 200 } 201 202 if (response_json['check'] == 'post_check') { 203 AI_TOOLKITS_Popups.close(); 204 $('.ai-toolkits-menu-more-overlay').fadeOut('fast'); 205 $('.ai-toolkits-' + data.ai_toolkits_form_post_type + '-list-item[data-' + data.ai_toolkits_form_post_type + '-id="' + data.ai_toolkits_form_post_id + '"] .ai-toolkits-check-wrapper i').text('task_alt'); 206 } else if (response_json['check'] == 'post_uncheck') { 207 AI_TOOLKITS_Popups.close(); 208 $('.ai-toolkits-menu-more-overlay').fadeOut('fast'); 209 $('.ai-toolkits-' + data.ai_toolkits_form_post_type + '-list-item[data-' + data.ai_toolkits_form_post_type + '-id="' + data.ai_toolkits_form_post_id + '"] .ai-toolkits-check-wrapper i').text('radio_button_unchecked'); 210 } 211 212 ai_toolkits_btn.removeClass('ai-toolkits-link-disabled').siblings('.ai-toolkits-waiting').addClass('ai-toolkits-display-none') 213 }); 214 215 delete window['ai_toolkits_window_vars']; 216 return false;
217 }); 218 219 $(document).on('click', '.ai-toolkits-popup-open-ajax', function (e) { 220 e.preventDefault(); 221 222 var ai_toolkits_btn = $(this); 223 var ai_toolkits_ajax_type = ai_toolkits_btn.attr('data-ai-toolkits-ajax-type'); 224 var ai_toolkits_popup_element = $('#' + ai_toolkits_btn.attr('data-ai-toolkits-popup-id')); 225 226 AI_TOOLKITS_Popups.open(ai_toolkits_popup_element, { 227 beforeShow: function (instance, popup) { 228 var ajax_url = ai_toolkits_ajax.ajax_url; 229 var data = { 230 action: 'ai_toolkits_ajax', 231 ai_toolkits_ajax_type: ai_toolkits_ajax_type, 232 ai_toolkits_ajax_nonce: ai_toolkits_ajax.ai_toolkits_ajax_nonce, 233 ai_toolkits_get_nonce: ai_toolkits_action.ai_toolkits_get_nonce, 234 }; 235 236 $.ajax({ 237 url: ajax_url, 238 type: 'POST', 239 data: data, 240 success: function (response) { 241 try { 242 243 // Check if response is already an object (parsed JSON) 244 var response_json = typeof response === 'object' ? response : null; 245 246 // If not an object, try to parse as JSON 247 if (!response_json) { 248 try { 249 response_json = JSON.parse(typeof response === 'string' ? response.replace(/^\uFEFF+/, '') : response); 250 } catch (parseError) { 251 // If parsing fails, assume it's HTML content 252 ai_toolkits_popup_element.find('.ai-toolkits-popup-content').html(response); 253 254 // Initialize media uploaders if function exists 255 if (typeof initMediaUpload === 'function') { 256 $('.ai-toolkits-image-upload-wrapper').each(function () { 257 initMediaUpload($(this), 'image'); 258 }); 259 $('.ai-toolkits-audio-upload-wrapper').each(function () { 260 initMediaUpload($(this), 'audio'); 261 }); 262 $('.ai-toolkits-video-upload-wrapper').each(function () { 263 initMediaUpload($(this), 'video'); 264 }); 265 } 266 return; 267 } 268 } 269 270 // Handle JSON response 271 if (response_json.error_key) { 272 var errorMessage = response_json.error_message || ai_toolkits_i18n.an_error_has_occurred; 273 ai_toolkits_get_main_message(errorMessage); 274 return; 275 } 276 277 // Handle successful JSON response with HTML content 278 if (response_json.html) { 279 ai_toolkits_popup_element.find('.ai-toolkits-popup-content').html(response_json.html); 280 281 // Initialize media uploaders if function exists 282 if (typeof initMediaUpload === 'function') { 283 $('.ai-toolkits-image-upload-wrapper').each(function () { 284 initMediaUpload($(this), 'image'); 285 }); 286 $('.ai-toolkits-audio-upload-wrapper').each(function () { 287 initMediaUpload($(this), 'audio'); 288 }); 289 $('.ai-toolkits-video-upload-wrapper').each(function () { 290 initMediaUpload($(this), 'video'); 291 }); 292 } 293 } else { 294 ai_toolkits_get_main_message(ai_toolkits_i18n.an_error_has_occurred); 295 } 296 } catch (e) { 297 ai_toolkits_get_main_message(ai_toolkits_i18n.an_error_has_occurred); 298 } 299 }, 300 error: function (xhr, status, error) { 301 } 302 }); 303 }, 304 afterClose: function () { 305 ai_toolkits_popup_element.find('.ai-toolkits-popup-content').html('<div class="ai-toolkits-loader-circle-wrapper"><div class="ai-toolkits-text-align-center"><div class="ai-toolkits-loader-circle"><div></div><div></div><div></div><div></div></div></div></div>'); 306 }, 307 }); 308 }); 309 310 // Event listener for simple popups (non-AJAX) 311 $(document).on('click', '.ai-toolkits-popup-open', function (e) { 312 e.preventDefault(); 313 314 var ai_toolkits_btn = $(this); 315 var ai_toolkits_popup_element = $('#' + ai_toolkits_btn.attr('data-ai-toolkits-popup-id')); 316 317 if (ai_toolkits_popup_element.length) { 318 AI_TOOLKITS_Popups.open(ai_toolkits_popup_element); 319 } 320 }); 321 322 // Generate event listeners for duplicate and remove functions based on CPTs 323 var ai_toolkits_cpts_mapping = { 324 'ai_toolkits_asset': 'assets', 325 'ai_toolkits_liability': 'liabilities' 326 }; 327 328 // Loop through CPTs to create duplicate event listeners
329 Object.keys(ai_toolkits_cpts).forEach(function (cpt) { 330 var cpt_short = cpt.replace('ai_toolkits_', ''); 331 var container_class = '.ai-toolkits-' + ai_toolkits_cpts_mapping[cpt]; 332 333 // Duplicate event listener 334 $(document).on('click', '.ai-toolkits-' + cpt + '-duplicate-post', function (e) { 335 e.preventDefault(); 336 337 $(container_class).fadeOut('fast'); 338 var ai_toolkits_btn = $(this); 339 var ai_toolkits_id = ai_toolkits_btn.closest('.ai-toolkits-' + cpt_short).attr('data-ai_toolkits_' + cpt_short + '-id'); 340 341 var ajax_url = ai_toolkits_ajax.ajax_url; 342 var data = { 343 action: 'ai_toolkits_ajax', 344 ai_toolkits_ajax_type: 'ai_toolkits_' + cpt_short + '_duplicate', 345 ['ai_toolkits_' + cpt_short + '_id']: ai_toolkits_id, 346 ai_toolkits_ajax_nonce: ai_toolkits_ajax.ai_toolkits_ajax_nonce, 347 }; 348 349 $.post(ajax_url, data, function (response) { 350 if (typeof response === 'string') { response = response.replace(/^\uFEFF+/, ''); } 351 var response_json = JSON.parse(response); 352 353 if (response_json['error_key'] != '') { 354 ai_toolkits_get_main_message(response_json['error_content']); 355 } else { 356 $(container_class).html(response_json['html']); 357 } 358 359 $(container_class).fadeIn('slow'); 360 $('.ai-toolkits-menu-more-overlay').fadeOut('fast'); 361 }); 362 }); 363 364 // Remove event listener (for popup button) 365 $(document).on('click', '.ai-toolkits-' + cpt + '-remove', function (e) { 366 e.preventDefault(); 367 368 $(container_class).fadeOut('fast'); 369 var ai_toolkits_id = $('.ai-toolkits-menu-more.ai-toolkits-active').closest('.ai-toolkits-' + cpt_short).attr('data-ai_toolkits_' + cpt_short + '-id'); 370 371 var ajax_url = ai_toolkits_ajax.ajax_url; 372 var data = { 373 action: 'ai_toolkits_ajax', 374 ai_toolkits_ajax_type: 'ai_toolkits_' + cpt_short + '_remove', 375 ['ai_toolkits_' + cpt_short + '_id']: ai_toolkits_id, 376 ai_toolkits_ajax_nonce: ai_toolkits_ajax.ai_toolkits_ajax_nonce, 377 }; 378 379 $.post(ajax_url, data, function (response) { 380 if (typeof response === 'string') { response = response.replace(/^\uFEFF+/, ''); } 381 var response_json = JSON.parse(response); 382 383 if (response_json['error_key'] != '') { 384 ai_toolkits_get_main_message(response_json['error_content']); 385 } else { 386 $(container_class).html(response_json['html']); 387 ai_toolkits_get_main_message(ai_toolkits_i18n.removed_successfully); 388 } 389 390 $(container_class).fadeIn('slow'); 391 $('.ai-toolkits-menu-more-overlay').fadeOut('fast'); 392 393 AI_TOOLKITS_Popups.close(); 394 }); 395 }); 396 }); 397 }); 398})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.