(function($) { 'use strict'; $(function() { // Initialize modern animations and interactions initModernAnimations(); // Auto-save feedback for AI settings form specifically $('.king-addons-settings-form').on('submit', function(e) { // Ensure the form is not prevented from submitting showSaveAnimation(); // Explicitly allow form submission return true; }); // Input focus animations $('input, select, textarea').on('focus', function() { $(this).closest('tr').addClass('focused'); }).on('blur', function() { $(this).closest('tr').removeClass('focused'); }); // Checkbox animations $('input[type="checkbox"]').on('change', function() { if ($(this).is(':checked')) { $(this).addClass('checked-animation'); setTimeout(() => $(this).removeClass('checked-animation'), 300); } }); // ---- Provider switching ------------------------------------------- var $provider = $('#king-addons-ai-provider'); function activeProvider() { return $provider.length ? $provider.val() : 'openai'; } // Show only the rows belonging to the selected provider. The rows are // hidden by a class rather than an inline style so this stays in step // with the server-rendered initial state. function applyProviderVisibility() { var provider = activeProvider(); $('.ka-ai-provider-row').each(function() { var $row = $(this); $row.toggleClass('ka-ai-row-hidden', !$row.hasClass('ka-ai-provider-' + provider)); }); } function apiKeyField() { return activeProvider() === 'openrouter' ? $('#king-addons-openrouter-api-key') : $('input[name="king_addons_ai_options[openai_api_key]"]'); } // ---- Shared helpers ----------------------------------------------- var $refreshButton = $('#king-addons-ai-refresh-models-button'); var $spinner = $('#king-addons-ai-refresh-models-spinner'); var $statusSpan = $('#king-addons-ai-refresh-models-status'); var $testButton = $('#king-addons-ai-test-connection-button'); var $testSpinner = $('#king-addons-ai-test-connection-spinner'); var $testStatus = $('#king-addons-ai-test-connection-status'); function showSpinner($el, visible) { if (visible) { $el.css({ visibility: 'visible', display: 'inline-block' }).addClass('is-active'); } else { $el.css({ visibility: 'hidden', display: 'none' }).removeClass('is-active'); } } function errorMessage(jqXHR, fallback) { try { var parsed = JSON.parse(jqXHR.responseText); if (parsed.data && parsed.data.message) { return parsed.data.message; } } catch (e) { // ignore JSON parse errors } return fallback; } // Rebuilds one model