HEX
Server: Apache
System: Linux srv13.cpanelhost.cl 3.10.0-962.3.2.lve1.5.38.el7.x86_64 #1 SMP Thu Jun 18 05:28:41 EDT 2020 x86_64
User: cca63905 (4205)
PHP: 7.3.20
Disabled: NONE
Upload Files
File: /home4/cca63905/www/nueva/modules/chatgptcontentgenerator/views/js/admin.js
/**
* 2007-2024 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author    PrestaShop SA <contact@prestashop.com>
*  @copyright 2007-2024 PrestaShop SA
*  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*
* Don't forget to prefix your containers with your own identifier
* to avoid any conflicts with others containers.
*/

const gptPageSettings = {
    productsList: {
        words: 400,
        minWords: 100,
        maxWords: 1000,
        step: 1,
        replaceContent: false,
        skipExistingDescription: true, // generate new content if empty
        skipExistingTitle: true,
    },
    productForm: {
        words: 400,
        minWords: 100,
        maxWords: 1000,
        step: 1,
        replaceContent: false,
        skipExistingDescription: false, // generate new content if empty
        skipExistingTitle: false,
        spinOffStockCommon: spinOffStockCommon,
        spinOffStockIndividual: spinOffStockIndividual,
        spinOffStock: spinOffStock,
    },
    categoriesList: {
        words: 180,
        minWords: 10,
        maxWords: 1000,
        step: 1,
        skipExistingDescription: true,
        skipExistingTitle: true,
        replaceContent: false,
    },
    categoryForm: {
        words: 180,
        minWords: 10,
        maxWords: 1000,
        step: 1,
    },
    cmsForm: {
        words: 1000,
        minWords: 100,
        maxWords: 2000,
        step: 1,
    },
    postForm: {
        words: 300,
        minWords: 100,
        maxWords: 1000,
        step: 1,
        replaceContent: false,
        skipExistingDescription: false, // generate new content if empty
        skipExistingTitle: false,
    },
};

$(function () {
    if (typeof adminPageName == 'undefined') {
        return;
    }

    if (typeof gptShopInfo == 'undefined' || !!gptShopInfo === false) {
        console.error('The gptShopInfo is not defined. Make sure that the the shop data is agreement on the module configuration page');
        return;
    }

    if (typeof ChatGptContent == 'undefined') {
        console.error('The ChatGptContent is not defined.');
        return;
    }

    // function renderLoaderlayer(el) {
    //     el.length > 0 && el.css('position', 'relative')
    //             .append('<div id="gpt_description_loader" class="content-loader-layer"><div class="loader-wrapper"><div class="content-loader"></div></div></div>');
    // }
    var renderLoaderlayer = ChatGptContent.renderLoaderlayer;

    function getWordsFiled(value, min, max, step) {
        return '<div class="col-md-4">'+
                    '<div class="input-group">' +
                        '<input type="number" id="gpt_description_length" title="' + gptI18n.maxLength + '" class="form-control" min="' + min + '" step="' + step + '" max="' + max + '" value="' + value + '">' +
                        '<div class="input-group-append">' +
                            '<span class="input-group-text"> ' + gptI18n.words + '</span>' +
                        '</div>' +
                    '</div>' +
                '</div>';
    }

    function getInfoButton(message) {
        return '<a class="btn tooltip-link delete pl-0 pr-0">' +
                '<span class="help-box gpt-tooltip" data-toggle="popover" data-content="' + message.replace(/\"/g, "\'") + '" data-original-title="" title=""></span>' +
            '</a>';
    }

    var removeLoaderLayer = ChatGptContent.removeLoaderLayer;

    function renderAlertMessage(messageText, element) {
        var object = $('<div class="alert alert-danger mt-2" role="alert">' +
                        '<p class="alert-text">' + messageText + '</p>' +
                    '</div>');
        if (!!element && element.length) {
            element.append(object);
        }
    }

    function renderCustomRequestForm (element, options) {
        options = Object.assign({}, {
            contentWrapperSelector: '',
            contentEditorPreffix: '',
            entity: '',
        }, options);

        var customRequestObject = new ChatGptCustomRequest({}, function (instance) {
            async function customRequest () {
                var content = new ChatGptContent(),
                    idLang = content.getPageLanguageId();
                var gptEditedtext = document.querySelector('#gpt_edited_text');
                renderLoaderlayer(instance.getWrapper());
                var response = await content.customRequest(instance.getText(), {entity: options.entity});
                if (typeof response.inQueue != 'undefined' && response.inQueue) {
                    response = await content.awaitRequestResponse(response.requestId);

                    // display error message if the request is failure
                    if (response && response.status != 'success') {
                        if (response.status == 'quota_over') {
                            window.showErrorMessage(gptI18n.subscriptionLimitЕxceeded);
                        } else {
                            window.showErrorMessage(response.text);
                        }
                        removeLoaderLayer();
                        return;
                    }
                }

                if (response && response.text) {
                    content.setContentIntoEditor(
                        content.convertTextToHtml(response.text),
                        {format: 'html'},
                        tinymce.get(options.contentEditorPreffix + idLang)
                    );

                    window.showSuccessMessage(gptI18n.successMessage.replace(/\%words\%/g, response.nbWords));
                }
                if (gptEditedtext) {
                    gptEditedtext.value = 1;
                }
                removeLoaderLayer();
            }

            var currentContent = tinymce.get(options.contentEditorPreffix + (new ChatGptContent()).getPageLanguageId())
                                    .getContent({format: 'text'})
                                    .trim();

            if (currentContent !== '') {
                (new ChatGptModal)
                    .setHeader(gptI18n.modalTitle)
                    .setBody(gptI18n.confirmCustomRequest)
                    .addAction({
                            title: gptI18n.buttonCancel,
                            class: 'btn btn-outline-secondary'
                        }, function (actionInstance) {
                            actionInstance.getModal().destroy();
                        })
                    .addAction({
                            title: '<i class="material-icons">send</i> ' + gptI18n.buttonSend,
                        }, function (actionInstance) {
                            customRequest();
                            actionInstance.getModal().destroy();
                        })
                    .open();
                return;
            }

            customRequest();
        }).renderInto(element);
    }

    // init description form //////////////////////////////////////
    var descriptionModal = new ChatGptModal({
        closable: false,
        keyboard: false,
        backdrop: false,
        class: 'black-modal modal-with-tabs'
    });

    descriptionModal
        .setHeader(gptI18n.bulkGeneratingDescription)
        .setBody(
            '<div>' + ChatGptForm.descriptionForm() + '</div>'
        )
    ;
    // END init description form //////////////////////////////////////

    // init translation form //////////////////////////////////////
    var trasnalationModal = new ChatGptModal({
        closable: false,
        keyboard: false,
        backdrop: false,
        class: 'black-modal modal-with-tabs'
    });

    trasnalationModal
        .setHeader(gptI18n.translatingSettings)
        .setBody(
            '<div>' + ChatGptForm.traslationForm() + '</div>'
        )
    ;
    // END init translation form //////////////////////////////////////

    // init rewrite form //////////////////////////////////////
    var rewriteModal = new ChatGptModal({
        closable: false,
        keyboard: false,
        backdrop: false,
        class: 'black-modal modal-with-tabs'
    });

    rewriteModal
        .setHeader(gptI18n.bulkRewriteTitle)
        .setBody(
            '<div>' + ChatGptForm.rewriteForm() + '</div>'
        )
    ;
    // END init rewrite form //////////////////////////////////////

    // init post form //////////////////////////////////////
    var productPostModal = new ChatGptModal({
        closable: false,
        keyboard: false,
        backdrop: false,
        class: 'black-modal modal-with-tabs product-post-modal'
    });

    productPostModal
        .setHeader(gptI18n.productPostTitle)
        .setBody(
            '<div>' + ChatGptForm.productPostForm() + '</div>'
        )
    ;
    // END init post form //////////////////////////////////////

    // init meta title form ////////////////////////////////////
    var metaTitleModal = new ChatGptModal({
        closable: false,
        keyboard: false,
        backdrop: false,
        class: 'black-modal modal-with-tabs'
    });

    metaTitleModal
        .setHeader(gptI18n.generateMetaTitle)
        .setBody(
            '<div>' + ChatGptForm.metaDataForm() + '</div>'
        )
    ;
    // END init meta title form //////////////////////////////////

    // init meta description form ////////////////////////////////////
    var metaDescriptionModal = new ChatGptModal({
        closable: false,
        keyboard: false,
        backdrop: false,
        class: 'black-modal modal-with-tabs'
    });

    metaDescriptionModal
        .setHeader(gptI18n.generateMetaDescription)
        .setBody(
            '<div>' + ChatGptForm.metaDataForm() + '</div>'
        )
    ;
    // END init meta description form //////////////////////////////////

    // init seo tags form ////////////////////////////////////
    var seoTagsModal = new ChatGptModal({
        closable: false,
        keyboard: false,
        backdrop: false,
        class: 'black-modal modal-with-tabs'
    });

    seoTagsModal
        .setHeader(gptI18n.generateSeoTags)
        .setBody(
            '<div>' + ChatGptForm.metaDataForm() + '</div>'
        )
    ;
    // END init seo tags form //////////////////////////////////

    function translateEventHandler (e) {
        e.preventDefault();

        var button = $(this);

        trasnalationModal.setBody(
            '<div>' + ChatGptForm.traslationForm() + '</div>'
        ).setActions([])
        .addAction({
            title: gptI18n.buttonCancel,
            class: 'btn btn-outline-secondary'
        }, function (cancelButton) {
            cancelButton.getModal().destroy();
        }).addAction({
            title: gptI18n.buttonTranslate,
        }, async function (actionInstance) {
            try {
                // define translate options
                var options = {
                    replace: true,
                    originLanguageId: +$('input[name="origin_language"]:checked').val(),
                    targetLanguages: [],
                };

                if (isNaN(options.originLanguageId) || options.originLanguageId == 0) {
                    alert('Please choose the origin language');
                    return;
                }

                // define selected languages
                $('.gpt-languages-list').each(function () {
                    var value = +($(this).is(':checked') ? this.value : 0);
                    if (
                        value != 0 &&
                        options.targetLanguages.indexOf(value) == -1 &&
                        value != options.originLanguageId // ignore origin language
                    ) {
                        options.targetLanguages.push(value);
                    }
                });

                if (options.targetLanguages.length == 0) {
                    alert(gptI18n.pleaseSelectLanguages);
                    return;
                }

                var contentEditorPreffix = button.data('content-editor-preffix');
                if (!!contentEditorPreffix == false) {
                    console.warn('The content editor is not set');
                    return;
                }
                var gptEditedtext = document.querySelector('#gpt_edited_text');

                ChatGptContent.renderLoaderlayer($('body'));
                try {
                    for (var langIndex = 0; langIndex < options.targetLanguages.length; langIndex ++) {
                        var content = new ChatGptContent();
                        var editor = document.getElementById(contentEditorPreffix + options.originLanguageId);
                        var text = content.getContentFromEditor(editor, 'html');

                        var translatedContent = await content.translateText(text, {
                            fromLangauge: content.getLanguageById(options.originLanguageId).iso_code,
                            toLanguage: content.getLanguageById(options.targetLanguages[langIndex]).iso_code,
                            entity: button.data('entity')
                        }, true);

                        if (typeof translatedContent.inQueue != 'undefined' && translatedContent.inQueue) {
                            translatedContent = await content.awaitRequestResponse(translatedContent.requestId);

                            if (translatedContent && translatedContent.status != 'success') {
                                if (translatedContent.status == 'quota_over') {
                                    var errorMessage = gptI18n.subscriptionLimitЕxceeded;
                                } else {
                                    var errorMessage = translatedContent.text;
                                }
                                handleModalError(
                                    actionInstance.getModal(),
                                    'Language: ' + content.getLanguageById(options.targetLanguages[langIndex]).name + '<br/>' + errorMessage
                                );

                                ChatGptContent.removeLoaderLayer();
                                return;
                            }
                        }

                        if (translatedContent && translatedContent.text) {
                            editor = document.getElementById(contentEditorPreffix + options.targetLanguages[langIndex]);
                            content.setContentIntoEditor(
                                (editor.tagName == 'INPUT' ? translatedContent.text : content.convertTextToHtml(translatedContent.text)),
                                {format: 'html'},
                                editor
                            );

                            var editorId = editor.getAttribute('id');
                            if (editorId.includes('_seo_tags_')) {
                                content.setContentIntoTags(translatedContent.text, editor);
                            }

                            window.showSuccessMessage('Language: ' + content.getLanguageById(options.targetLanguages[langIndex]).iso_code.toUpperCase() + ': ' + gptI18n.successMessage.replace(/\%words\%/g, translatedContent.nbWords));
                        }
                        if (gptEditedtext) {
                            gptEditedtext.value = 1;
                        }
                    }
                } catch (err) {
                    ChatGptContent.removeLoaderLayer();
                    handleModalError(
                        actionInstance.getModal(),
                        'Language: ' + (new ChatGptContent()).getLanguageById(options.targetLanguages[langIndex]).name + '<br/>' + err
                    );
                    return;
                }
            } catch (err) {
                ChatGptContent.removeLoaderLayer();
                handleModalError(actionInstance.getModal(), err);
                return;
            }

            ChatGptContent.removeLoaderLayer();
            actionInstance.getModal().destroy();
        });

        trasnalationModal.open();
    };

    window.GptTranslateEventHandler = translateEventHandler;

    function rewriteEventHandler (e) {
        e.preventDefault();

        var button = $(this);

        rewriteModal.setBody(
            '<div>' + ChatGptForm.rewriteForm() + '</div>'
        ).setActions([])
        .addAction({
            title: gptI18n.buttonCancel,
            class: 'btn btn-outline-secondary'
        }, function (cancelButton) {
            cancelButton.getModal().destroy();
        }).addAction({
            title: gptI18n.buttonRewrite,
        }, async function (actionInstance) {
            try {
                // define translate options
                var options = {
                    entity: button.data('entity'),
                    replace: +$("#allow_gen_content_0").is(':checked'),
                    fieldName: button.data('field-name'),
                    languages: [],
                };

                // define selected languages
                $('.gpt-languages-list').each(function () {
                    var value = +($(this).is(':checked') ? this.value : 0);
                    if (value != 0 && options.languages.indexOf(value) == -1) {
                        options.languages.push(value);
                    }
                });

                if (options.languages.length == 0) {
                    alert(gptI18n.pleaseSelectLanguages);
                    return;
                }

                var contentEditorPreffix = button.data('content-editor-preffix');
                if (!!contentEditorPreffix == false) {
                    console.warn('The content editor is not set');
                    return;
                }
                var gptEditedtext = document.querySelector('#gpt_edited_text');
                ChatGptContent.renderLoaderlayer($('body'));
                try {
                    for (var langIndex = 0; langIndex < options.languages.length; langIndex ++) {
                        var content = new ChatGptContent();
                        var editor = document.getElementById(contentEditorPreffix + options.languages[langIndex]);
                        var text = content.getContentFromEditor(editor, 'html');
                        options.idLang = options.languages[langIndex];

                        var rewriteContent = await content.rewriteText(text, options, true);

                        if (typeof rewriteContent.inQueue != 'undefined' && rewriteContent.inQueue) {
                            rewriteContent = await content.awaitRequestResponse(rewriteContent.requestId);

                            if (rewriteContent && rewriteContent.status != 'success') {
                                if (rewriteContent.status == 'quota_over') {
                                    var errorMessage = gptI18n.subscriptionLimitЕxceeded;
                                } else {
                                    var errorMessage = rewriteContent.text;
                                }
                                handleModalError(
                                    actionInstance.getModal(),
                                    'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + errorMessage
                                );

                                ChatGptContent.removeLoaderLayer();
                                return;
                            }
                        }

                        if (rewriteContent && rewriteContent.text) {
                            editor = document.getElementById(contentEditorPreffix + options.languages[langIndex]);

                            var newText = '';
                            if (editor.tagName == 'INPUT') {
                                newText = rewriteContent.text;
                            } else {
                                newText = content.convertTextToHtml(rewriteContent.text);
                            }

                            if (options.replace == false) {
                                newText = content.getContentFromEditor(editor, 'html') + ' ' + newText;
                            }

                            content.setContentIntoEditor(
                                newText,
                                {format: 'html'},
                                editor
                            );

                            window.showSuccessMessage('Language: ' + content.getLanguageById(options.languages[langIndex]).iso_code.toUpperCase() + ': ' + gptI18n.successMessage.replace(/\%words\%/g, rewriteContent.nbWords));
                        }
                        if (gptEditedtext) {
                            gptEditedtext.value = 1;
                        }
                    }
                } catch (err) {
                    ChatGptContent.removeLoaderLayer();
                    handleModalError(
                        actionInstance.getModal(),
                        'Language: ' + (new ChatGptContent()).getLanguageById(options.languages[langIndex]).name + '<br/>' + err
                    );
                    return;
                }
            } catch (err) {
                ChatGptContent.removeLoaderLayer();
                handleModalError(actionInstance.getModal(), err);
                return;
            }

            ChatGptContent.removeLoaderLayer();
            actionInstance.getModal().destroy();
        });

        rewriteModal.open(function () {
            // init tooltips
            $(".gpt-tooltip").popover();
        });
    };

    window.GptRewriteEventHandler = rewriteEventHandler;

    /**
     * Handle error and print in modal body
     */
    function handleModalError (modal, errorMessage) {
        if (!!modal.find('.progress-bar') && modal.find('.progress-bar').length) {
            progressBar = modal.find('.progress-bar');
            progressBar.removeClass('progress-bar-success');
            progressBar.addClass('progress-bar-danger');
            modal.find('#process_translate_status').text(gptI18n.bulkTranslationProcessFail);
            modal.find("#process_translate_error_log").show().text(errorMessage);
        } else {
            // clean body
            modal.find('body').html('');
            // render message
            renderAlertMessage(errorMessage, modal.find('body'));
        }

        // render close button
        modal
            .setActions([])
            .addAction({
                    title: gptI18n.buttonClose,
                    class: 'btn btn-outline-secondary'
                }, function (closeButton) {
                    closeButton.getModal().destroy();
                })
            .renderActions();
    }

    function displayRenewLimitsModal (message) {
        ChatGptForm.displayRenewLimitsModal(message);
    }

    if (adminPageName == 'productForm') {
        if (!gptShopInfo.subscription || gptShopInfo.subscription.availableProductWords == 0) {
            if (!gptShopInfo.subscription || !gptShopInfo.subscription.plan) {
                // renderAlertMessage(gptI18n.subscriptionNotAvaialable, $("#description"));
                renderAlertMessage(gptI18n.subscriptionNotAvaialable, $(gptVarVersion.selectors.pfDescription));
                displayRenewLimitsModal(gptI18n.subscriptionNotAvaialable);
            } else if (gptShopInfo.subscription.plan.productWords == 0) {
                // renderAlertMessage(gptI18n.subscriptionPlanNoFeature, $("#description"));
                renderAlertMessage(gptI18n.subscriptionPlanNoFeature, $(gptVarVersion.selectors.pfDescription));
                displayRenewLimitsModal(gptI18n.subscriptionPlanNoFeature);
            }  else if (gptShopInfo.subscription.availableProductWords == 0) {
                // renderAlertMessage(gptI18n.subscriptionLimitЕxceeded + ' ' + gptI18n.renewOrOrderSubscription, $("#description"));
                renderAlertMessage(gptI18n.subscriptionLimitЕxceeded + ' ' + gptI18n.renewOrOrderSubscription, $(gptVarVersion.selectors.pfDescription));
                displayRenewLimitsModal(gptI18n.subscriptionLimitЕxceeded);
            }
            return;
        } else if (gptShopInfo.subscription.ownApiKey && gptShopInfo.hasGptApiKey == false) {
            renderAlertMessage(gptI18n.gptApiKeyNotSet, $(gptVarVersion.selectors.pfDescription));
            // displayRenewLimitsModal(gptI18n.gptApiKeyNotSet);
            return;
        }

        $(".summary-description-container").css('overflow', 'visible');

        var actionObject = (new ChatGptAction({
            id: "gpt_description_button",
            title: gptI18n.buttonName,
            type: 'single'
        }))
            // .renderInto($("#description"));
            .renderInto($(gptVarVersion.selectors.pfDescription));

        var generateProductMetaTitleObject = (new ChatGptAction({
            id: "gpt_generate_meta_title_button",
            title: gptI18n.buttonGenerate,
            type: 'single',
        }))
            .renderInto($('#product_seo_meta_title_help'), 'after');

        var generateProductMetaDescriptionObject = (new ChatGptAction({
            id: "gpt_generate_meta_description_button",
            title: gptI18n.buttonGenerate,
            type: 'single',
        }))
            .renderInto($('#product_seo_meta_description_help'), 'after');

        var generateProductSeoTagsObject = (new ChatGptAction({
            id: "gpt_generate_tags_button",
            title: gptI18n.buttonGenerate,
            contentEditorPreffix: 'product_seo_tags_',
            type: 'single',
        }))
            .renderInto($('#product_seo_tags_help'), 'after');

        // $(".gpt-tooltip").popover();

        if (gptShopInfo.subscription.plan.customRequest) {
            // renderCustomRequestForm($("#description"), {
            //     contentEditorPreffix: 'form_step1_description_',
            renderCustomRequestForm($(gptVarVersion.selectors.pfDescription), {
                contentEditorPreffix: gptVarVersion.contentEditorPreffix.description,
                entity: 'product',
            });
        }

        //rewrite product short description button
        var rewriteProductShortDescriptionObject = (new ChatGptAction({
            entity: 'product',
            id: "gpt_rewrite_description_short_button",
            title: gptI18n.buttonRewrite,
            type: 'single',
            // contentEditorPreffix: 'form_step1_description_short_',
            contentEditorPreffix: gptVarVersion.contentEditorPreffix.descriptionShort,
            fieldName: 'description'
        }))
            // .renderInto($("#description_short"));
            .renderInto($(gptVarVersion.selectors.pfDescriptionShort));

        //rewrite product description button
        var rewriteProductDescriptionObject = (new ChatGptAction({
            entity: 'product',
            id: "gpt_rewrite_description_button",
            title: gptI18n.buttonRewrite,
            type: 'button',
            // contentEditorPreffix: 'form_step1_description_',
            contentEditorPreffix: gptVarVersion.contentEditorPreffix.description,
            fieldName: 'description'
        }))
            // .renderInto($("#description .gpt-button-wraper"));
            .renderInto($(gptVarVersion.selectors.pfDescription + " .gpt-button-wraper"));

        rewriteProductShortDescriptionObject.getButton().on('click', rewriteEventHandler);
        rewriteProductDescriptionObject.getButton().on('click', rewriteEventHandler);

        if (gptLanguages.length > 1) {
            // translate product name button
            var translateProductNameObject = new ChatGptTranslateAction({
                entity: 'product',
                languages: gptLanguages,
                wrapperSelector: '#form_step1_name',
                // contentEditorPreffix: 'form_step1_name_',
                contentEditorPreffix: gptVarVersion.contentEditorPreffix.name,
                type: 'button',
                title: gptI18n.buttonTranslate,
                buttonClass: 'btn btn-primary mt-2',
            });
                // .renderInto($("#form_step1_names").closest('.row').parent(), 'append');

            if (gptIsNewVersion) {
                translateProductNameObject.renderInto($("#product_header .product-type-preview"), 'before');
            } else {
                translateProductNameObject.renderInto($("#form_step1_names").closest('.row').parent(), 'append');
            }

            // translate product short description button
            var translateProductShortDescriptionObject = new ChatGptTranslateAction({
                entity: 'product',
                languages: gptLanguages,
                // wrapperSelector: '#description_short',
                // contentEditorPreffix: 'form_step1_description_short_',
                wrapperSelector: gptVarVersion.selectors.pfDescriptionShort,
                contentEditorPreffix: gptVarVersion.contentEditorPreffix.descriptionShort,
                buttonClass: 'btn btn-primary mr-2',
                type: 'button',
                title: gptI18n.buttonTranslate
            })
                // .renderInto($("#description_short .gpt-button-wraper"), 'prepend');
                .renderInto($(gptVarVersion.selectors.pfDescriptionShort + " .gpt-button-wraper"), 'prepend');

            // translate product description button
            var translateProductDescriptionObject = new ChatGptTranslateAction({
                entity: 'product',
                languages: gptLanguages,
                wrapperSelector: gptVarVersion.selectors.pfDescription,
                contentEditorPreffix: gptVarVersion.contentEditorPreffix.description,
                buttonClass: 'btn btn-primary ml-2 mr-2',
                type: 'button',
                title: gptI18n.buttonTranslate
            })
                // .renderInto($("#description #gpt_description_button"), 'after');
                .renderInto($(gptVarVersion.selectors.pfDescription + " #gpt_description_button"), 'after');

            // translate product seo meta title
            var translateProductSeoMetaTitleObject = new ChatGptTranslateAction({
                entity: 'product',
                languages: gptLanguages,
                wrapperSelector: gptVarVersion.selectors.pfMetaTitle,
                contentEditorPreffix: gptVarVersion.contentEditorPreffix.meta_title,
                buttonClass: 'btn btn-primary ml-2 mr-2',
                type: 'button',
                title: gptI18n.buttonTranslate
            })
                .renderInto($('#gpt_generate_meta_title_button'), 'after');

            // translate product seo meta description
            var translateProductMetaDescriptionObject = new ChatGptTranslateAction({
                entity: 'product',
                languages: gptLanguages,
                wrapperSelector: gptVarVersion.selectors.pfMetaDescription,
                contentEditorPreffix: gptVarVersion.contentEditorPreffix.meta_description,
                buttonClass: 'btn btn-primary ml-2 mr-2',
                type: 'button',
                title: gptI18n.buttonTranslate
            })
                .renderInto($('#gpt_generate_meta_description_button'), 'after');

            //translate product seo tags
            var translateProductSeoTagsObject = new ChatGptTranslateAction({
                entity: 'product',
                languages: gptLanguages,
                wrapperSelector: gptVarVersion.selectors.pfSeoTags,
                contentEditorPreffix: gptVarVersion.contentEditorPreffix.seo_tags,
                buttonClass: 'btn btn-primary ml-2 mr-2',
                type: 'button',
                title: gptI18n.buttonTranslate
            })
                .renderInto($('#gpt_generate_tags_button'), 'after');

            translateProductSeoMetaTitleObject.getButton().on('click', translateEventHandler);
            translateProductMetaDescriptionObject.getButton().on('click', translateEventHandler);
            translateProductSeoTagsObject.getButton().on('click', translateEventHandler);

            translateProductShortDescriptionObject.getButton().on('click', translateEventHandler);
            translateProductNameObject.getButton().on('click', translateEventHandler);
            translateProductDescriptionObject.getButton().on('click', translateEventHandler);
            // actionObject.setActions([{element:translateProductDescriptionObject.renderHtml(), callback: translateEventHandler}]);
        }

        //product post
        var productPostObject = (new ChatGptAction({
            entity: 'product',
            id: "gpt_product_post_button",
            title: 'Generate blog post for product',
            type: 'button',
            class: 'btn btn-primary ' + (gptLanguages.length > 1 ? 'ml-2' : '') + ' mt-2',
            contentEditorPreffix: '',
            fieldName: false
        }));
            // .renderInto($("#form_step1_names").closest('.row').parent(), 'append');
        if (gptIsNewVersion) {
            productPostObject.renderInto($("#product_header .product-type-preview"), 'before');
        } else {
            productPostObject.renderInto($("#form_step1_names").closest('.row').parent(), 'append');
        }

        productPostObject.getButton().on('click', function () {
            GptPostContent.productPostEventHandler(productPostModal, function (modal) {
                var content = new ChatGptContent(),
                    idDefaultCategory = 0;
                $('input.default-category').each(function () {
                    if ($(this).is(':checked')) {
                        idDefaultCategory = +this.value
                    }
                });

                return {
                    productName: $("#form_step1_name_" + content.getPageLanguageId()).val(),
                    idDefaultCategory: idDefaultCategory,
                    idBrand: !!+$("#form_step1_id_manufacturer").val() && $("#form_step1_id_manufacturer").val(),
                }
            }, function (modal, posts, products) {
                // close current modal
                modal.destroy();

                // display new popup with the posts list
                var postsModal = new ChatGptModal({
                    closable: false,
                    keyboard: false,
                    backdrop: false,
                    class: 'black-modal modal-with-tabs product-post-modal'
                });

                postsModal
                    .setHeader(gptI18n.productPostTitle)
                    .setBody(
                            '<div class="alert alert-success" role="alert">' +
                                '<p class="alert-text">' + gptI18n.bulkGenerationProcessCompleted + '</p>' +
                            '</div>' +
                            '<table class="table">' +
                                '<thead>' +
                                    '<tr>' +
                                        '<th>' + 'Id' + '</th>' +
                                        '<th>' + 'Title' + '</th>' +
                                        '<th></th>' +
                                    '</tr>' +
                                '</thead>' +
                                '<tbody>' +
                                    (function () {
                                        var output = '';
                                        for (var i = 0; i < posts.length; i ++) {
                                            output += '<tr>' +
                                                            '<td>' + posts[i].id + '</td>' +
                                                            '<td>' + posts[i].title + '</td>' +
                                                            '<td><a href="' + gptPostEditUrl + '&id_gptcontent_post=' + posts[i].id + '" target="_blank">edit</a></td>' +
                                                        '</tr>';
                                        }
                                        return output;
                                    }()) +
                                '</tbody>' +
                            '</table>'
                        )
                    .addAction({
                            title: gptI18n.buttonCancel,
                            class: 'btn btn-outline-secondary'
                        }, function (cancelButton) {
                            cancelButton.getModal().destroy();
                        })
                    .open(function () {
                        // init tooltips
                        $(".gpt-tooltip").popover();
                    })
                ;
            });
        });

        actionObject.getButton().on('click', function (e) {
            e.preventDefault();

            descriptionModal.setBody(
                '<div>' + ChatGptForm.descriptionForm() + '</div>'
            ).setActions([])
            .addAction({
                title: gptI18n.buttonCancel,
                class: 'btn btn-outline-secondary'
            }, function (cancelButton) {
                cancelButton.getModal().destroy();
            }).addAction({
                title: gptI18n.buttonRegenerate,
            }, async function (actionInstance) {
                // define bulk options
                var options = {
                    replace: +$("#allow_gen_content_0").is(':checked'),
                    skipExistingContent: 0, // +$("#skip_existing_content_1").is(':checked'),
                    maxWords: +$("#gpt_description_length").val(),
                    languages: [],
                    useProductCategory: +$("#use_product_category_1").is(':checked'),
                    useProductBrand: +$("#use_product_brand_1").is(':checked'),
                    useProductEan: +$("#use_product_ean_1").is(':checked'),
                    contentType: $('input[name="desc_or_characteristics"]:checked').val(),
                    idDefaultCategory: 0,
                    // idBrand: !!+$("#form_step1_id_manufacturer").val() && $("#form_step1_id_manufacturer").val(),
                    idBrand: !!+$(gptVarVersion.selectors.pfManufacturerId).val() && $(gptVarVersion.selectors.pfManufacturerId).val(),
                    idContentTemplate: +$('select#id_content_template').val()
                };

                if (options.idContentTemplate > 0) {
                    options.languages = gptContentTemplates[options.idContentTemplate].langs;
                } else {
                    // define selected languages
                    $('.gpt-languages-list').each(function () {
                        var value = +($(this).is(':checked') ? this.value : 0);
                        if (value != 0 && options.languages.indexOf(value) == -1) {
                            options.languages.push(value);
                        }
                    });
                }

                if (isNaN(options.maxWords) || options.maxWords < gptPageSettings[adminPageName].minWords) {
                    alert(gptI18n.maxWordsNotValid.replace('%min_words%', gptPageSettings[adminPageName].minWords));
                    return;
                }

                if (options.languages.length == 0) {
                    alert(gptI18n.pleaseSelectLanguages);
                    return;
                }

                $('input.default-category').each(function () {
                    if ($(this).is(':checked')) {
                        options.idDefaultCategory = +this.value
                    }
                });

                var content = new ChatGptContent(),
                    productName = '';

                ChatGptContent.renderLoaderlayer($('body'));

                for (var langIndex = 0; langIndex < options.languages.length; langIndex ++) {
                    try {
                        options.idLang = options.languages[langIndex];
                        // productName = $("#form_step1_name_" + options.idLang).val();
                        productName = $(gptVarVersion.selectors.pfName + options.idLang).val();
                        var description = await content.getProductDescription(productName, options, true);

                        var gptEditedtext = document.querySelector('#gpt_edited_text');

                        if (typeof description.inQueue != 'undefined' && description.inQueue) {
                            description = await content.awaitRequestResponse(description.requestId);

                            // display error message if the request is failure
                            if (description && description.status != 'success') {
                                if (description.status == 'quota_over') {
                                    var errorMessage = gptI18n.subscriptionLimitЕxceeded;
                                } else {
                                    var errorMessage = description.text;
                                }

                                handleModalError(
                                    actionInstance.getModal(),
                                    'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + errorMessage
                                );

                                ChatGptContent.removeLoaderLayer();
                                return;
                            }
                        }

                        if (description && description.text) {
                            var text = content.convertTextToHtml(description.text);
                            if (options.replace == false) {
                                // text = content.getContentFromEditor(document.getElementById('form_step1_description_' + options.languages[langIndex]), 'html') + text;
                                text = content.getContentFromEditor(document.getElementById(gptVarVersion.contentEditorPreffix.description + options.languages[langIndex]), 'html') + text;
                            }

                            content.setContentIntoEditor(
                                text,
                                {format: 'html'},
                                // tinymce.get('form_step1_description_' + options.languages[langIndex])
                                tinymce.get(gptVarVersion.contentEditorPreffix.description + options.languages[langIndex])
                            );

                            window.showSuccessMessage('Language: ' + content.getLanguageById(options.languages[langIndex]).iso_code.toUpperCase() + ': ' + gptI18n.successMessage.replace(/\%words\%/g, description.nbWords));
                        }
                        if (gptEditedtext) {
                            gptEditedtext.value = 1;
                        }
                    } catch (err) {
                        ChatGptContent.removeLoaderLayer();
                        handleModalError(
                            actionInstance.getModal(),
                            'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + err
                        );
                        return;
                    }
                }
                ChatGptContent.removeLoaderLayer();
                actionInstance.getModal().destroy();
            });

            descriptionModal.open(function () {
                // init tooltips
                $(".gpt-tooltip").popover();
            });
        });
        generateProductMetaTitleObject.getButton().on('click', function (e) {
            e.preventDefault();

            metaTitleModal.setBody(
                '<div>' + ChatGptForm.metaDataForm() + '</div>'
            ).setActions([])
                .addAction({
                    title: gptI18n.buttonCancel,
                    class: 'btn btn-outline-secondary'
                }, function (cancelButton) {
                    cancelButton.getModal().destroy();
                }).addAction({
                title: gptI18n.buttonRegenerate,
            }, async function (actionInstance) {
                // define bulk options
                var options = {
                    languages: [],
                    useProductDescription: +$("#use_product_description_1").is(':checked'),
                    entity: 'product',
                };

                $('.gpt-languages-list').each(function () {
                    var value = +($(this).is(':checked') ? this.value : 0);
                    if (value != 0 && options.languages.indexOf(value) == -1) {
                        options.languages.push(value);
                    }
                });

                if (options.languages.length == 0) {
                    alert(gptI18n.pleaseSelectLanguages);
                    return;
                }

                var content = new ChatGptContent(),
                    productName = '';

                var productDescription = '';

                ChatGptContent.renderLoaderlayer($('body'));

                for (var langIndex = 0; langIndex < options.languages.length; langIndex ++) {
                    var requestText = 'Generate meta title for product. Generated text length have not exceed 70 characters. Generate text in a language: ' + content.getLanguageById(options.languages[langIndex]).name + '. ';
                    try {
                        options.idLang = options.languages[langIndex];
                        // productName = $("#form_step1_name_" + options.idLang).val();
                        productName = $(gptVarVersion.selectors.pfName + options.idLang).val();
                        productDescription = $('#product_description_description_' + options.idLang).val();
                        if (options.useProductDescription) {
                            requestText += 'Generate text based on product description: ' + productDescription + '. ';
                            var meta_title = await content.customRequest(requestText, options, true);
                        } else {
                            requestText += 'Generate text based on product name: ' + productName + '. ';
                            var meta_title = await content.customRequest(requestText, options, true);
                        }

                        if (typeof meta_title.inQueue != 'undefined' && meta_title.inQueue) {
                            meta_title = await content.awaitRequestResponse(meta_title.requestId);

                            // display error message if the request is failure
                            if (meta_title && meta_title.status != 'success') {
                                if (meta_title.status == 'quota_over') {
                                    var errorMessage = gptI18n.subscriptionLimitЕxceeded;
                                } else {
                                    var errorMessage = meta_title.text;
                                }

                                handleModalError(
                                    actionInstance.getModal(),
                                    'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + errorMessage
                                );

                                ChatGptContent.removeLoaderLayer();
                                return;
                            }
                        }

                        if (meta_title && meta_title.text) {
                            var text = content.convertTextToHtml(meta_title.text);

                            content.setContentIntoEditor(
                                meta_title.text,
                                {format: 'html'},
                                'product_seo_meta_title_' + options.languages[langIndex]
                            );

                            window.showSuccessMessage('Language: ' + content.getLanguageById(options.languages[langIndex]).iso_code.toUpperCase() + ': ' + gptI18n.successMessage.replace(/\%words\%/g, meta_title.nbWords));
                        }
                    } catch (err) {
                        ChatGptContent.removeLoaderLayer();
                        handleModalError(
                            actionInstance.getModal(),
                            'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + err
                        );
                        return;
                    }
                }
                ChatGptContent.removeLoaderLayer();
                actionInstance.getModal().destroy();
            });

            metaTitleModal.open(function () {
                // init tooltips
                $(".gpt-tooltip").popover();
            });
        });

        generateProductMetaDescriptionObject.getButton().on('click', function (e) {
            e.preventDefault();

            metaDescriptionModal.setBody(
                '<div>' + ChatGptForm.metaDataForm() + '</div>'
            ).setActions([])
                .addAction({
                    title: gptI18n.buttonCancel,
                    class: 'btn btn-outline-secondary'
                }, function (cancelButton) {
                    cancelButton.getModal().destroy();
                }).addAction({
                title: gptI18n.buttonRegenerate,
            }, async function (actionInstance) {
                // define bulk options
                var options = {
                    languages: [],
                    useProductDescription: +$("#use_product_description_1").is(':checked'),
                    entity: 'product',
                };

                $('.gpt-languages-list').each(function () {
                    var value = +($(this).is(':checked') ? this.value : 0);
                    if (value != 0 && options.languages.indexOf(value) == -1) {
                        options.languages.push(value);
                    }
                });

                if (options.languages.length == 0) {
                    alert(gptI18n.pleaseSelectLanguages);
                    return;
                }

                var content = new ChatGptContent(),
                    productName = '';

                var productDescription = '';

                ChatGptContent.renderLoaderlayer($('body'));

                for (var langIndex = 0; langIndex < options.languages.length; langIndex ++) {
                    var requestText = 'Generate meta description for product. Generated text length have not exceed 160 characters. Generate text in a language: ' + content.getLanguageById(options.languages[langIndex]).name + '. ';
                    try {
                        options.idLang = options.languages[langIndex];
                        // productName = $("#form_step1_name_" + options.idLang).val();
                        productName = $(gptVarVersion.selectors.pfName + options.idLang).val();
                        productDescription = $('#product_description_description_' + options.idLang).val();
                        if (options.useProductDescription) {
                            requestText += 'Generate text based on product description: ' + productDescription + '. ';
                            var meta_description = await content.customRequest(requestText, options, true);
                        } else {
                            requestText += 'Generate text based on product name: ' + productName + '. ';
                            var meta_description = await content.customRequest(requestText, options, true);
                        }

                        if (typeof meta_description.inQueue != 'undefined' && meta_description.inQueue) {
                            meta_description = await content.awaitRequestResponse(meta_description.requestId);

                            // display error message if the request is failure
                            if (meta_description && meta_description.status != 'success') {
                                if (meta_description.status == 'quota_over') {
                                    var errorMessage = gptI18n.subscriptionLimitЕxceeded;
                                } else {
                                    var errorMessage = meta_description.text;
                                }

                                handleModalError(
                                    actionInstance.getModal(),
                                    'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + errorMessage
                                );

                                ChatGptContent.removeLoaderLayer();
                                return;
                            }
                        }

                        if (meta_description && meta_description.text) {
                            var text = content.convertTextToHtml(meta_description.text);

                            content.setContentIntoEditor(
                                meta_description.text,
                                {format: 'html'},
                                'product_seo_meta_description_' + options.languages[langIndex]
                            );

                            window.showSuccessMessage('Language: ' + content.getLanguageById(options.languages[langIndex]).iso_code.toUpperCase() + ': ' + gptI18n.successMessage.replace(/\%words\%/g, meta_description.nbWords));
                        }
                    } catch (err) {
                        ChatGptContent.removeLoaderLayer();
                        handleModalError(
                            actionInstance.getModal(),
                            'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + err
                        );
                        return;
                    }
                }
                ChatGptContent.removeLoaderLayer();
                actionInstance.getModal().destroy();
            });

            metaDescriptionModal.open(function () {
                // init tooltips
                $(".gpt-tooltip").popover();
            });

        });

        generateProductSeoTagsObject.getButton().on('click', function (e) {
            e.preventDefault();
            var button = $(this);
            seoTagsModal.setBody(
                '<div>' + ChatGptForm.metaDataForm() + '</div>'
            ).setActions([])
                .addAction({
                    title: gptI18n.buttonCancel,
                    class: 'btn btn-outline-secondary'
                }, function (cancelButton) {
                    cancelButton.getModal().destroy();
                }).addAction({
                title: gptI18n.buttonRegenerate,
            }, async function (actionInstance) {
                // define bulk options
                var options = {
                    languages: [],
                    useProductDescription: +$("#use_product_description_1").is(':checked'),
                    entity: 'product',
                };

                $('.gpt-languages-list').each(function () {
                    var value = +($(this).is(':checked') ? this.value : 0);
                    if (value != 0 && options.languages.indexOf(value) == -1) {
                        options.languages.push(value);
                    }
                });

                if (options.languages.length == 0) {
                    alert(gptI18n.pleaseSelectLanguages);
                    return;
                }
                var contentEditorPreffix = button.data('content-editor-preffix');

                var content = new ChatGptContent(),
                    productName = '';

                var productDescription = '';

                ChatGptContent.renderLoaderlayer($('body'));

                for (var langIndex = 0; langIndex < options.languages.length; langIndex ++) {
                    var requestText = 'Generate keywords tags for product. Format of tags must be: ' + 'word1,word2,word3...etc' + '. The number of generated tags have not exceed 15 tags. Generate keywords tags in a language: ' + content.getLanguageById(options.languages[langIndex]).name + '. ';
                    try {
                        var editor = document.getElementById(contentEditorPreffix + options.languages[langIndex]);
                        options.idLang = options.languages[langIndex];
                        // productName = $("#form_step1_name_" + options.idLang).val();
                        productName = $(gptVarVersion.selectors.pfName + options.idLang).val();
                        productDescription = $('#product_description_description_' + options.idLang).val();
                        if (options.useProductDescription) {
                            requestText += 'Generate keywords tags based on product description: ' + productDescription + '. ';
                            var seo_tags = await content.customRequest(requestText, options, true);
                        } else {
                            requestText += 'Generate keywords tags based on product name: ' + productName + '. ';
                            var seo_tags = await content.customRequest(requestText, options, true);
                        }

                        if (typeof seo_tags.inQueue != 'undefined' && seo_tags.inQueue) {
                            seo_tags = await content.awaitRequestResponse(seo_tags.requestId);

                            // display error message if the request is failure
                            if (seo_tags && seo_tags.status != 'success') {
                                if (seo_tags.status == 'quota_over') {
                                    var errorMessage = gptI18n.subscriptionLimitЕxceeded;
                                } else {
                                    var errorMessage = seo_tags.text;
                                }

                                handleModalError(
                                    actionInstance.getModal(),
                                    'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + errorMessage
                                );

                                ChatGptContent.removeLoaderLayer();
                                return;
                            }
                        }

                        if (seo_tags && seo_tags.text) {

                            content.setContentIntoTags(
                                seo_tags.text,
                                editor,
                            );

                            window.showSuccessMessage('Language: ' + content.getLanguageById(options.languages[langIndex]).iso_code.toUpperCase() + ': ' + gptI18n.successMessage.replace(/\%words\%/g, seo_tags.nbWords));
                        }
                    } catch (err) {
                        ChatGptContent.removeLoaderLayer();
                        handleModalError(
                            actionInstance.getModal(),
                            'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + err
                        );
                        return;
                    }
                }
                ChatGptContent.removeLoaderLayer();
                actionInstance.getModal().destroy();
            });

            seoTagsModal.open(function () {
                // init tooltips
                $(".gpt-tooltip").popover();
            });
        });

    } else if (adminPageName == 'categoryForm') {
        var gptWidgetSettings = {
            descriptionWrapper: $("#category_description"),
            descriptionEditorPrefix: 'category_description_',
            descriptionWrapperSelector: '#category_description',
            nameWrapper: $('label[for="category_name"] + div'),
            nameWrapperSelector: 'label[for=\'category_name\'] + div',
            nameEditorPrefix: 'category_name_',
        };
        if (isLegacyController) {
            gptWidgetSettings.descriptionWrapper = $("#description_" + (new ChatGptContent).getPageLanguageId())
                .closest('.translatable-field')
                .parent()
                .addClass('category-description-wrapper');
            gptWidgetSettings.descriptionWrapperSelector = '.category-description-wrapper';
            gptWidgetSettings.descriptionEditorPrefix = 'description_';
            gptWidgetSettings.nameWrapper = $("#name_" + (new ChatGptContent).getPageLanguageId())
                .closest('.translatable-field')
                .parent()
                .addClass('category-name-wrapper');
            gptWidgetSettings.nameWrapperSelector = '.category-name-wrapper';
            gptWidgetSettings.nameEditorPrefix = 'name_';
        }
        if (!gptShopInfo.subscription || gptShopInfo.subscription.availableCategoryWords == 0) {
            if (!gptShopInfo.subscription || !gptShopInfo.subscription.plan) {
                renderAlertMessage(gptI18n.subscriptionNotAvaialable, gptWidgetSettings.descriptionWrapper);
                displayRenewLimitsModal(gptI18n.subscriptionNotAvaialable);
            } else if (gptShopInfo.subscription.plan.categoryWords == 0) {
                renderAlertMessage(gptI18n.subscriptionPlanNoFeature, gptWidgetSettings.descriptionWrapper);
                displayRenewLimitsModal(gptI18n.subscriptionPlanNoFeature);
            }  else if (gptShopInfo.subscription.availableCategoryWords == 0) {
                renderAlertMessage(gptI18n.subscriptionLimitЕxceeded + ' ' + gptI18n.renewOrOrderSubscription, gptWidgetSettings.descriptionWrapper);
                displayRenewLimitsModal(gptI18n.subscriptionLimitЕxceeded);
            }
            return;
        } else if (gptShopInfo.subscription.ownApiKey && gptShopInfo.hasGptApiKey == false) {
            renderAlertMessage(gptI18n.gptApiKeyNotSet, gptWidgetSettings.descriptionWrapper);
            // displayRenewLimitsModal(gptI18n.gptApiKeyNotSet);
            return;
        }

        var contentAction = (new ChatGptAction({
            id: "gpt_description_button",
            title: gptI18n.buttonName,
            type: 'single'
        }))
            .renderInto(gptWidgetSettings.descriptionWrapper);

        //rewrite category description button
        var rewriteCategoryDescriptionObject = (new ChatGptAction({
            entity: 'category',
            id: "gpt_rewrite_description_button",
            title: gptI18n.buttonRewrite,
            type: 'button',
            class: isLegacyController ? 'btn btn-primary ml-2' : 'btn btn-primary',
            contentEditorPreffix: gptWidgetSettings.descriptionEditorPrefix,
            fieldName: 'description'
        }))
            .renderInto(gptWidgetSettings.descriptionWrapper.find('.gpt-button-wraper'));

        rewriteCategoryDescriptionObject.getButton().on('click', rewriteEventHandler);

        if (gptLanguages.length > 1) {
            // translate category name button
            var translateNameObject = new ChatGptTranslateAction({
                entity: 'category',
                languages: gptLanguages,
                wrapperSelector: gptWidgetSettings.nameWrapperSelector,
                contentEditorPreffix: gptWidgetSettings.nameEditorPrefix,
                title: gptI18n.buttonTranslate,
                type: 'single'
            })
                .renderInto(gptWidgetSettings.nameWrapper, 'append');

            // translate category description button
            var translateCategoryDescriptionObject = new ChatGptTranslateAction({
                entity: 'category',
                languages: gptLanguages,
                wrapperSelector: gptWidgetSettings.descriptionWrapperSelector,
                contentEditorPreffix: gptWidgetSettings.descriptionEditorPrefix,
                buttonClass: 'btn btn-primary ml-2 mr-2',
                type: 'button',
                title: gptI18n.buttonTranslate
            })
                .renderInto(gptWidgetSettings.descriptionWrapper.find('#gpt_description_button'), 'after');

            translateNameObject.getButton().on('click', translateEventHandler);
            translateCategoryDescriptionObject.getButton().on('click', translateEventHandler);
            // contentAction.setActions([{element:translateCategoryDescriptionObject.renderHtml(), callback: translateEventHandler}]);
        }

        if (gptShopInfo.subscription.plan.customRequest) {
            renderCustomRequestForm(gptWidgetSettings.descriptionWrapper, {
                contentEditorPreffix: gptWidgetSettings.descriptionEditorPrefix,
                entity: 'category',
            });
        }

        contentAction.getButton().on('click', function (e) {
            e.preventDefault();

            descriptionModal.setBody(
                '<div>' + ChatGptForm.descriptionForm() + '</div>'
            ).setActions([])
            .addAction({
                title: gptI18n.buttonCancel,
                class: 'btn btn-outline-secondary'
            }, function (cancelButton) {
                cancelButton.getModal().destroy();
            }).addAction({
                title: gptI18n.buttonRegenerate,
            }, async function (actionInstance) {
                // define bulk options
                var options = {
                    replace: +$("#allow_gen_content_0").is(':checked'),
                    skipExistingContent: 0,
                    maxWords: +$("#gpt_description_length").val(),
                    languages: [],
                    idContentTemplate: +$('select#id_content_template').val(),
                };

                if (options.idContentTemplate > 0) {
                    options.languages = gptContentTemplates[options.idContentTemplate].langs;
                } else {
                    // define selected languages
                    $('.gpt-languages-list').each(function () {
                        var value = +($(this).is(':checked') ? this.value : 0);
                        if (value != 0 && options.languages.indexOf(value) == -1) {
                            options.languages.push(value);
                        }
                    });
                }

                if (isNaN(options.maxWords) || options.maxWords < gptPageSettings[adminPageName].minWords) {
                    alert(gptI18n.maxWordsNotValid.replace('%min_words%', gptPageSettings[adminPageName].minWords));
                    return;
                }

                if (options.languages.length == 0) {
                    alert(gptI18n.pleaseSelectLanguages);
                    return;
                }

                var content = new ChatGptContent(),
                    categoryName = '';

                var gptEditedtext = document.querySelector('#gpt_edited_text');

                ChatGptContent.renderLoaderlayer($('body'));

                for (var langIndex = 0; langIndex < options.languages.length; langIndex ++) {
                    try {
                        options.idLang = options.languages[langIndex];
                        categoryName = $("#" + gptWidgetSettings.nameEditorPrefix + options.idLang).val();

                        var description = await content.getCategoryDescription(categoryName, options, true);

                        if (typeof description.inQueue != 'undefined' && description.inQueue) {
                            description = await content.awaitRequestResponse(description.requestId);

                            // display error message if the request is failure
                            if (description && description.status != 'success') {
                                if (description.status == 'quota_over') {
                                    var errorMessage = gptI18n.subscriptionLimitЕxceeded;
                                } else {
                                    var errorMessage = description.text;
                                }

                                handleModalError(
                                    actionInstance.getModal(),
                                    'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + errorMessage
                                );

                                ChatGptContent.removeLoaderLayer();
                                return;
                            }
                        }

                        if (description && description.text) {
                            var text = content.convertTextToHtml(description.text);
                            if (options.replace == false) {
                                text = content.getContentFromEditor(document.getElementById(gptWidgetSettings.descriptionEditorPrefix + options.languages[langIndex]), 'html') + text;
                            }
                            content.setContentIntoEditor(
                                text,
                                {format: 'html'},
                                tinymce.get(gptWidgetSettings.descriptionEditorPrefix + options.languages[langIndex])
                            );

                            window.showSuccessMessage('Language: ' + content.getLanguageById(options.languages[langIndex]).iso_code.toUpperCase() + ': ' + gptI18n.successMessage.replace(/\%words\%/g, description.nbWords));
                        }
                        if (gptEditedtext) {
                            gptEditedtext.value = 1;
                        }
                    } catch (err) {
                        ChatGptContent.removeLoaderLayer();
                        handleModalError(
                            actionInstance.getModal(),
                            'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + err
                        );
                        return;
                    }
                }
                ChatGptContent.removeLoaderLayer();
                actionInstance.getModal().destroy();
            });

            descriptionModal.open(function () {
                // init tooltips
                $(".gpt-tooltip").popover();
            });
        });
    }  else if (adminPageName == 'cmsForm') {
        var gptWidgetSettings = {
            descriptionWrapper: $("#cms_page_content"),
            descriptionEditorPrefix: 'cms_page_content_',
            descriptionWrapperSelector: '#cms_page_content',
            nameWrapper: $('label[for="category_name"] + div'),
            nameWrapperSelector: 'label[for=\'category_name\'] + div',
            nameEditorPrefix: 'cms_page_title_',
        };
        if (isLegacyController) {
            gptWidgetSettings.descriptionWrapper = $("#content_" + (new ChatGptContent).getPageLanguageId())
                .closest('.translatable-field')
                .parent()
                .addClass('cms-description-wrapper');
            gptWidgetSettings.descriptionWrapperSelector = '.cms-description-wrapper';
            gptWidgetSettings.descriptionEditorPrefix = 'content_';
            gptWidgetSettings.nameWrapper = $("#name_" + (new ChatGptContent).getPageLanguageId())
                .closest('.translatable-field')
                .parent()
                .addClass('cms-name-wrapper');
            gptWidgetSettings.nameWrapperSelector = '.cms-name-wrapper';
            gptWidgetSettings.nameEditorPrefix = 'name_';
        }

        if (!gptShopInfo.subscription || gptShopInfo.subscription.availablePageWords == 0) {
            var alertMessage = '';
            if (!gptShopInfo.subscription || !gptShopInfo.subscription.plan) {
                alertMessage = gptI18n.subscriptionNotAvaialable;
                displayRenewLimitsModal(gptI18n.subscriptionNotAvaialable);
            } else if (gptShopInfo.subscription.plan.productWords == 0) {
                alertMessage = gptI18n.subscriptionPlanNoFeature;
                displayRenewLimitsModal(gptI18n.subscriptionPlanNoFeature);
            }  else if (gptShopInfo.subscription.availablePageWords == 0) {
                alertMessage = gptI18n.subscriptionLimitЕxceeded + ' ' + gptI18n.renewOrOrderSubscription;
                displayRenewLimitsModal(gptI18n.subscriptionLimitЕxceeded);
            }
            renderAlertMessage(alertMessage, gptWidgetSettings.descriptionWrapper);
            return;
        } else if (gptShopInfo.subscription.ownApiKey && gptShopInfo.hasGptApiKey == false) {
            renderAlertMessage(gptI18n.gptApiKeyNotSet, gptWidgetSettings.descriptionWrapper);
            // displayRenewLimitsModal(gptI18n.gptApiKeyNotSet);
            return;
        }

        var contentAction = (new ChatGptAction({
            id: "gpt_description_button",
            title: gptI18n.buttonName,
            type: 'single'
        }))
            .renderInto(gptWidgetSettings.descriptionWrapper);

        if (gptShopInfo.subscription.plan.customRequest) {
            renderCustomRequestForm(gptWidgetSettings.descriptionWrapper, {
                contentEditorPreffix: gptWidgetSettings.descriptionEditorPrefix,
                entity: 'page',
            });
        }

        // define wrapper for translate action
        var translateWrapper = $("#" + gptWidgetSettings.nameEditorPrefix + (new ChatGptContent).getPageLanguageId()).closest('.input-container');
        if (isLegacyController) {
            translateWrapper = $("#" + gptWidgetSettings.nameEditorPrefix + (new ChatGptContent).getPageLanguageId())
                .closest('.form-group');
        }

        //rewrite category name button
        var rewriteCategoryNameObject = (new ChatGptAction({
            entity: 'page',
            id: "gpt_rewrite_name_button",
            title: gptI18n.buttonRewrite,
            type: 'single',
            class: isLegacyController ? 'btn btn-primary ml-2' : 'btn btn-primary',
            contentEditorPreffix: gptWidgetSettings.nameEditorPrefix,
            fieldName: 'name'
        }))
            .renderInto(translateWrapper);

        //rewrite category description button
        var rewriteCategoryDescriptionObject = (new ChatGptAction({
            entity: 'page',
            id: "gpt_rewrite_description_button",
            title: gptI18n.buttonRewrite,
            type: 'button',
            class: isLegacyController ? 'btn btn-primary ml-2' : 'btn btn-primary',
            contentEditorPreffix: gptWidgetSettings.descriptionEditorPrefix,
            fieldName: 'content'
        }))
            .renderInto(gptWidgetSettings.descriptionWrapper.find('.gpt-button-wraper'));

        rewriteCategoryNameObject.getButton().on('click', rewriteEventHandler);
        rewriteCategoryDescriptionObject.getButton().on('click', rewriteEventHandler);

        if (gptLanguages.length > 1) {
            // translate page title button
            var translateTitleObject = new ChatGptTranslateAction({
                entity: 'page',
                languages: gptLanguages,
                contentEditorPreffix: gptWidgetSettings.nameEditorPrefix,
                buttonClass: 'btn btn-primary mr-2',
                title: gptI18n.buttonTranslate,
                type: 'button'
            })
                .renderInto(translateWrapper.find('.gpt-button-wraper'), 'prepend');

            translateTitleObject.getButton().on('click', translateEventHandler);

            // translate page content button
            var translatePageContentObject = new ChatGptTranslateAction({
                entity: 'page',
                languages: gptLanguages,
                wrapperSelector: gptWidgetSettings.descriptionWrapperSelector,
                contentEditorPreffix: gptWidgetSettings.descriptionEditorPrefix,
                buttonClass: 'btn btn-primary ml-2 mr-2',
                type: 'button',
                title: gptI18n.buttonTranslate
            })
                .renderInto(gptWidgetSettings.descriptionWrapper.find('#gpt_description_button'), 'after');

            translatePageContentObject.getButton().on('click', translateEventHandler);
        }

        contentAction.getButton().on('click', function (e) {
            e.preventDefault();

            descriptionModal.setHeader(gptI18n.titlePageConentGeneration)
            .setBody(
                '<div>' + ChatGptForm.descriptionForm() + '</div>'
            ).setActions([])
            .addAction({
                title: gptI18n.buttonCancel,
                class: 'btn btn-outline-secondary'
            }, function (cancelButton) {
                cancelButton.getModal().destroy();
            }).addAction({
                title: gptI18n.buttonRegenerate,
            }, async function (actionInstance) {
                // define bulk options
                var options = {
                    replace: +$("#allow_gen_content_0").is(':checked'),
                    skipExistingContent: 0,
                    maxWords: +$("#gpt_description_length").val(),
                    languages: [],
                    idContentTemplate: +$('select#id_content_template').val(),
                };

                if (options.idContentTemplate > 0) {
                    options.languages = gptContentTemplates[options.idContentTemplate].langs;
                } else {
                    // define selected languages
                    $('.gpt-languages-list').each(function () {
                        var value = +($(this).is(':checked') ? this.value : 0);
                        if (value != 0 && options.languages.indexOf(value) == -1) {
                            options.languages.push(value);
                        }
                    });
                }

                if (isNaN(options.maxWords) || options.maxWords < gptPageSettings[adminPageName].minWords) {
                    alert(gptI18n.maxWordsNotValid.replace('%min_words%', gptPageSettings[adminPageName].minWords));
                    return;
                }

                if (options.languages.length == 0) {
                    alert(gptI18n.pleaseSelectLanguages);
                    return;
                }

                var content = new ChatGptContent(),
                    pageName = '';

                var gptEditedtext = document.querySelector('#gpt_edited_text');

                ChatGptContent.renderLoaderlayer($('body'));

                for (var langIndex = 0; langIndex < options.languages.length; langIndex ++) {
                    try {
                        options.idLang = options.languages[langIndex];
                        pageName = $("#" + gptWidgetSettings.nameEditorPrefix + options.idLang).val();

                        var pageContent = await content.getPageContent(pageName, options, true);

                        if (typeof pageContent.inQueue != 'undefined' && pageContent.inQueue) {
                            pageContent = await content.awaitRequestResponse(pageContent.requestId);

                            // display error message if the request is failure
                            if (pageContent && pageContent.status != 'success') {
                                if (pageContent.status == 'quota_over') {
                                    var errorMessage = gptI18n.subscriptionLimitЕxceeded;
                                } else {
                                    var errorMessage = pageContent.text;
                                }

                                handleModalError(
                                    actionInstance.getModal(),
                                    'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + errorMessage
                                );

                                ChatGptContent.removeLoaderLayer();
                                return;
                            }
                        }

                        if (pageContent && pageContent.text) {
                            var text = content.convertTextToHtml(pageContent.text);
                            if (options.replace == false) {
                                var existingContent = content.getContentFromEditor(document.getElementById(gptWidgetSettings.descriptionEditorPrefix + options.languages[langIndex]), 'html');
                                text = (!!existingContent ? existingContent : '') + text;
                            }
                            content.setContentIntoEditor(
                                text,
                                {format: 'html'},
                                tinymce.get(gptWidgetSettings.descriptionEditorPrefix + options.idLang)
                            );

                            window.showSuccessMessage('Language: ' + content.getLanguageById(options.languages[langIndex]).iso_code.toUpperCase() + ': ' + gptI18n.successMessage.replace(/\%words\%/g, pageContent.nbWords));
                        }
                        if (gptEditedtext) {
                            gptEditedtext.value = 1;
                        }
                    } catch (err) {
                        ChatGptContent.removeLoaderLayer();
                        handleModalError(
                            actionInstance.getModal(),
                            'Language: ' + content.getLanguageById(options.languages[langIndex]).name + '<br/>' + err
                        );
                        return;
                    }
                }
                ChatGptContent.removeLoaderLayer();
                actionInstance.getModal().destroy();
            });

            descriptionModal.open(function () {
                // init tooltips
                $(".gpt-tooltip").popover();
            });
        });
    }
});