(function() {
jQuery(document).ready(function($) {
// initial resize of [cusrev_reviews_grid] and Trust Badges
crResizeAllGridItems();
crResizeTrustBadges();
//enable attachment of images to comments
jQuery("form#commentform").attr( "enctype", "multipart/form-data" ).attr( "encoding", "multipart/form-data" );
//prevent review submission if captcha is not solved
jQuery("#commentform").on( "submit", function(event) {
if( cr_ajax_object.ivole_recaptcha === '1' ) {
var recaptcha = jQuery("#g-recaptcha-response").val();
if (recaptcha === "") {
event.preventDefault();
alert("Please confirm that you are not a robot");
}
}
} );
//show lightbox when click on images attached to reviews
jQuery("ol.commentlist").on("click", ".cr-comment-a", function(t) {
if(cr_ajax_object.disable_lightbox === '0') {
//only if lightbox is not disabled in settings of the plugin
t.preventDefault();
const oo = jQuery(".pswp");
if ( 0 < oo.length ) {
const o = oo[0];
var pics = jQuery(this).parent().parent().find(".cr-comment-a img");
var this_pic = jQuery(this).find("img");
var inx = 0;
if (pics.length > 0 && this_pic.length > 0) {
var a = [];
for (i = 0; i < pics.length; i++) {
a.push({
src: pics[i].src,
w: pics[i].naturalWidth,
h: pics[i].naturalHeight,
title: pics[i].alt
});
if (this_pic[0].src == pics[i].src) {
inx = i;
}
}
var r = {
index: inx
};
new PhotoSwipe(o, PhotoSwipeUI_Default, a, r).init();
}
}
}
});
// play a video when a user clicks on it in the reviews grid
jQuery(".cr-reviews-grid").on("click", ".image-row-vid, .cr-comment-videoicon", function(t) {
if( ! jQuery(this).closest(".image-row").hasClass( "cr-vid-playing" ) ) {
jQuery(this).closest(".image-row").addClass( "cr-vid-playing" );
jQuery(this).closest(".image-row").find(".image-row-vid").prop( "controls", true );
jQuery(this).closest(".image-row").find(".image-row-vid").get(0).play();
} else {
jQuery(this).closest(".image-row").find(".image-row-vid").get(0).pause();
jQuery(this).closest(".image-row").find(".image-row-vid").prop( "controls", false );
jQuery(this).closest(".image-row").removeClass( "cr-vid-playing" );
}
return false;
} );
// play a video when a user clicks on it in the media pop-up window
jQuery(".cr-ajax-reviews-cus-images-modal").on("click", ".cr-ajax-reviews-video, .cr-ajax-reviews-video .cr-comment-videoicon", function(t) {
if( ! jQuery(this).closest(".cr-ajax-reviews-video").hasClass( "cr-vid-playing" ) ) {
jQuery(this).closest(".cr-ajax-reviews-video").addClass( "cr-vid-playing" );
jQuery(this).closest(".cr-ajax-reviews-video").find("video").prop( "controls", true );
jQuery(this).closest(".cr-ajax-reviews-video").find("video").get(0).play();
} else {
jQuery(this).closest(".cr-ajax-reviews-video").find("video").get(0).pause();
jQuery(this).closest(".cr-ajax-reviews-video").find("video").prop( "controls", false );
jQuery(this).closest(".cr-ajax-reviews-video").removeClass( "cr-vid-playing" );
}
return false;
} );
// open a gallery with media files in the reviews grid
jQuery(".cr-reviews-grid").on("click", ".media-row-count", function(t) {
if ( cr_ajax_object.disable_lightbox === '0' ) {
// only if lightbox is not disabled in settings of the plugin
t.preventDefault();
const oo = jQuery(".pswp");
let media = jQuery(this).parent().find(".image-row-vid,.image-row-img"),
this_media = jQuery(this),
inx = 0;
if (media.length > 0 && this_media.length > 0) {
const o = oo[0];
var a = [];
for (i = 0; i < media.length; i++) {
if ( "vid" === media[i].dataset.crmedia ) {
a.push({
html: '
',
title: media[i].dataset.crtitle
});
} else {
a.push({
src: media[i].src,
w: media[i].naturalWidth,
h: media[i].naturalHeight,
title: media[i].alt
});
}
if (this_media[0].src == media[i].src) {
inx = i;
}
}
var r = {
index: inx
};
new PhotoSwipe(o, PhotoSwipeUI_Default, a, r).init();
}
}
} );
// play or pause a video in the gallery
jQuery(document).on("click", ".cr-video-wrapper .cr-media-video", function(t) {
const vid = jQuery(this).get(0);
if ( vid ) {
const isVideoPlaying = !!( vid.currentTime > 0 && !vid.paused && !vid.ended && vid.readyState > 2 );
if ( isVideoPlaying ) {
vid.pause();
} else {
vid.play();
}
}
return false;
} );
// show a lightbox when a user clicks on images in the reviews grid
jQuery(".cr-reviews-grid").on("click", ".image-row-img, .image-row-count", function(t) {
if(cr_ajax_object.disable_lightbox === '0') {
// only if lightbox is not disabled in settings of the plugin
t.preventDefault();
const oo = jQuery(".pswp");
if ( 0 < oo.length ) {
const o = oo[0];
var pics = jQuery(this).parent().find("img.image-row-img");
var this_pic = jQuery(this);
var inx = 0;
if (pics.length > 0 && this_pic.length > 0) {
var a = [];
for (i = 0; i < pics.length; i++) {
a.push({
src: pics[i].src,
w: pics[i].naturalWidth,
h: pics[i].naturalHeight,
title: pics[i].alt
});
if (this_pic[0].src == pics[i].src) {
inx = i;
}
}
var r = {
index: inx
};
new PhotoSwipe(o, PhotoSwipeUI_Default, a, r).init();
}
}
}
});
//register a listener for votes on for reviews
initVoteClick("ol.commentlist", ".cr-voting-a", "cr_vote_review");
//register a listener for the voting buttons on modal
initVoteClick(".cr-ajax-reviews-cus-images-modal", ".cr-voting-a", "cr_vote_review");
//register a listener for the voting buttons on Q & A
initVoteClick(".cr-qna-block .cr-qna-list-block", ".cr-voting-a", "cr_vote_question");
//show a lightbox when click on videos attached to reviews
jQuery("ol.commentlist").on("click", ".cr-video-a, .cr-comment-videoicon", function(t) {
if( ! jQuery(this).closest(".cr-comment-videos").hasClass( "cr-comment-videos-modal" ) ) {
let tt = jQuery(this).closest("[class*='cr-comment-video-']");
jQuery(this).closest(".cr-comment-videos").addClass( "cr-comment-videos-modal" );
tt.addClass( "cr-comment-video-modal" );
tt.find( "video" ).prop( "controls", true );
tt.find( ".cr-comment-videoicon" ).hide();
tt.find( "video" ).get(0).play();
return false;
}
return false;
} );
//close a video lightbox
jQuery("ol.commentlist").on( "click", ".cr-comment-videos", function(t) {
if( jQuery(this).hasClass( "cr-comment-videos-modal" ) ) {
jQuery(this).removeClass( "cr-comment-videos-modal" );
jQuery(this).find("[class*='cr-comment-video-']").each(function(index, element){
if( jQuery(element).hasClass( "cr-comment-video-modal" ) ) {
jQuery(element).removeClass( "cr-comment-video-modal" );
jQuery(element).find( "video").get(0).pause();
jQuery(element).find( "video" ).prop( "controls", false );
jQuery(element).find( ".cr-comment-videoicon" ).show();
jQuery(element).removeAttr("style");
}
});
return false;
}
} );
//show more ajax reviews
jQuery(".cr-show-more-reviews-prd").on( "click", function(t) {
t.preventDefault();
crShowMoreReviewsPrd( jQuery(this) );
} );
// ajax sorting of reviews
jQuery(".cr-ajax-reviews-sort").on( "change", function(t) {
t.preventDefault();
if ( jQuery(this).parents(".cr-all-reviews-shortcode").length ) {
// sorting in the all reviews block
cr_filter_all_reviews( jQuery(this) );
} else {
// sorting on a product page
var cr_product_id = jQuery(this).parents(".cr-reviews-ajax-comments").find(".commentlist.cr-ajax-reviews-list").attr("data-product");
var cr_sort = jQuery(this).children("option:selected").val();
var cr_rating = jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-summaryBox-ajax tr.ivole-histogramRow.ivole-histogramRow-s a.ivole-histogram-a").attr("data-rating");
if(!cr_rating){
cr_rating = 0;
}
var cr_data = {
"action": "cr_sort_reviews",
"productID": cr_product_id,
"sort": cr_sort,
"rating": cr_rating
};
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-search-no-reviews").hide();
jQuery(this).parents(".cr-reviews-ajax-comments").find('.cr-ajax-search input').val("").trigger("change");
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-show-more-reviews-prd").hide();
jQuery(this).parents(".cr-reviews-ajax-comments").find(".commentlist.cr-ajax-reviews-list").hide();
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-show-more-review-spinner").show();
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-summaryBox-ajax").addClass("cr-summaryBar-updating");
jQuery(this).addClass("cr-sort-updating");
jQuery.post( {
url: cr_ajax_object.ajax_url,
data: cr_data,
context: this,
success: function(response) {
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-show-more-review-spinner").hide();
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-summaryBox-ajax").removeClass("cr-summaryBar-updating");
jQuery(this).removeClass("cr-sort-updating");
if(response.page > 0){
jQuery(this).parents(".cr-reviews-ajax-comments").find(".commentlist.cr-ajax-reviews-list").empty();
jQuery(this).parents(".cr-reviews-ajax-comments").find(".commentlist.cr-ajax-reviews-list").append(response.html);
jQuery(this).parents(".cr-reviews-ajax-comments").find(".commentlist.cr-ajax-reviews-list").show();
jQuery(this).parents(".cr-reviews-ajax-comments").attr("data-page",response.page);
if( response.show_more_label ) {
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-show-more-reviews-prd").text( response.show_more_label );
}
if ( response.count_row ) {
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-count-row .cr-count-row-count").html( response.count_row );
}
if(!response.last_page){
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-show-more-reviews-prd").show();
}
}
},
dataType: "json"
} );
}
} );
//ajax filtering of reviews
jQuery(".cr-reviews-ajax-comments").on("click", "a.ivole-histogram-a, .cr-seeAllReviews", function(t){
t.preventDefault();
let tmpParent = jQuery(this).parents(".cr-reviews-ajax-comments");
let cr_product_id = tmpParent.find(".commentlist.cr-ajax-reviews-list").attr("data-product");
let cr_nonce = tmpParent.find(".cr-summaryBox-ajax").attr("data-nonce");
let cr_rating = jQuery(this).attr("data-rating");
let cr_sort = tmpParent.find(".cr-ajax-reviews-sort").children("option:selected").val();
let cr_data = {
"action": "cr_filter_reviews",
"productID": cr_product_id,
"rating": cr_rating,
"sort": cr_sort,
"security": cr_nonce
};
tmpParent.find(".cr-summaryBox-ajax tr.ivole-histogramRow.ivole-histogramRow-s").removeClass("ivole-histogramRow-s");
if( cr_rating > 0 ) {
jQuery(this).closest("tr.ivole-histogramRow").addClass("ivole-histogramRow-s");
}
tmpParent.find(".cr-search-no-reviews").hide();
tmpParent.find('.cr-ajax-search input').val("").trigger("change");
tmpParent.find(".cr-show-more-reviews-prd").hide();
tmpParent.find(".commentlist.cr-ajax-reviews-list").hide();
tmpParent.find(".cr-show-more-review-spinner").show();
tmpParent.find(".cr-summaryBox-ajax").addClass("cr-summaryBar-updating");
tmpParent.find(".cr-ajax-reviews-sort").addClass("cr-sort-updating");
jQuery.post( {
url: cr_ajax_object.ajax_url,
data: cr_data,
context: tmpParent,
success: function(response) {
this.find(".cr-show-more-review-spinner").hide();
this.find(".cr-summaryBox-ajax").removeClass("cr-summaryBar-updating");
this.find(".cr-ajax-reviews-sort").removeClass("cr-sort-updating");
if(response.page > 0) {
this.find(".commentlist.cr-ajax-reviews-list").empty();
this.find(".commentlist.cr-ajax-reviews-list").append(response.html);
this.find(".commentlist.cr-ajax-reviews-list").show();
this.attr("data-page",response.page);
if( response.show_more_label ) {
this.find( ".cr-show-more-reviews-prd" ).text( response.show_more_label );
}
if ( response.count_row ) {
this.find(".cr-count-row .cr-count-row-count").html( response.count_row );
}
if(!response.last_page){
this.find(".cr-show-more-reviews-prd").show();
}
}
},
dataType: "json"
} );
} );
// ajax search typing
jQuery('.cr-ajax-search input').on("keyup", function(e){
if(e.keyCode == 13){
jQuery(this).parents(".cr-ajax-search").find("button").trigger("click");
}
// show clear icon
if(jQuery(this).val() !== "") {
jQuery(this).parents(".cr-ajax-search").find(".cr-clear-input").css("display", "inline-block");
} else {
jQuery(this).parents(".cr-ajax-search").find(".cr-clear-input").css("display", "none");
}
}).on("change", function(){
if(jQuery(this).val() === "") jQuery(this).parents(".cr-ajax-search").find(".cr-clear-input").hide();
});
//
jQuery('.cr-reviews-ajax-reviews .cr-ajax-search input').on( 'keyup', crDebounce(
( ref ) => {
jQuery(ref.target).parents(".cr-reviews-ajax-comments").attr("data-page", 0);
jQuery(ref.target).parents(".cr-reviews-ajax-reviews").find(".cr-ajax-reviews-list").empty();
crShowMoreReviewsPrd( jQuery(ref.target) );
},
1000
) );
// clear search field
jQuery(".cr-ajax-search .cr-clear-input").on("click", function () {
jQuery(this).prev("input").val("");
jQuery(this).parents(".cr-ajax-search").find(".cr-clear-input").hide();
jQuery(this).parents(".cr-ajax-search").find("button").trigger("click");
//
if( jQuery(this).parents(".cr-reviews-ajax-reviews").length ) {
// clear search in the case of product pages
jQuery(this).parents(".cr-reviews-ajax-comments").attr("data-page", 0);
jQuery(this).parents(".cr-reviews-ajax-reviews").find(".cr-ajax-reviews-list").empty();
crShowMoreReviewsPrd( jQuery(this) );
}
});
// ajax search of reviews
jQuery(".cr-ajax-search button").on("click", function (e) {
e.preventDefault();
//search in the all reviews block
if( jQuery(this).parents(".cr-all-reviews-shortcode").length ){
// search in ajax version of the All Reviews block / shortcode
cr_filter_all_reviews( jQuery(this) );
} else {
jQuery(this).parents(".cr-reviews-ajax-comments").attr("data-page", 0);
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-ajax-reviews-list").empty();
crShowMoreReviewsPrd( jQuery(this) );
}
});
jQuery(".cr-ajax-reviews-add-review, .cr-nosummary-add").on( "click", function(t) {
t.preventDefault();
jQuery(this).closest(".cr-reviews-ajax-reviews").find(".cr-reviews-ajax-comments").hide();
jQuery(this).closest(".cr-reviews-ajax-reviews").find(".cr-ajax-reviews-review-form").show();
} );
// click to filter reviews by tags
jQuery(".cr-review-tags-filter span.cr-tags-filter").on( "click", function (e) {
e.preventDefault();
if(jQuery(this).hasClass("cr-tag-selected")) {
jQuery(this).removeClass("cr-tag-selected");
} else {
jQuery(this).addClass("cr-tag-selected");
}
if ( jQuery(this).parents(".cr-all-reviews-shortcode").length ) {
// tags filtering in the all reviews shortcode
cr_filter_all_reviews( jQuery(this) );
} else {
// tags filtering on a product page
jQuery(this).parents(".cr-reviews-ajax-comments").attr("data-page", 0);
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-ajax-reviews-list").empty();
crShowMoreReviewsPrd( jQuery(this) );
}
} );
//open popup window with pictures
jQuery(".cr-comment-image-top .cr-comment-image-top-item").on( "click", function(t) {
t.preventDefault();
jQuery("body").addClass("cr-noscroll");
let slide_no = jQuery(this).data("slide");
let imgParent = jQuery(this).closest(".cr-ajax-reviews-cus-images-div").parent();
imgParent.find(".cr-ajax-reviews-cus-images-modal-cont").addClass("cr-mask-active");
imgParent.find(".cr-ajax-reviews-cus-images-modal .cr-ajax-reviews-cus-images-slider-main").slickk('setPosition');
imgParent.find(".cr-ajax-reviews-cus-images-modal .cr-ajax-reviews-cus-images-slider-nav").slickk('setPosition');
if ( typeof slide_no !== 'undefined' ) {
imgParent.find(".cr-ajax-reviews-cus-images-modal .cr-ajax-reviews-cus-images-slider-main").slickk('slickGoTo', slide_no, true);
imgParent.find(".cr-ajax-reviews-cus-images-modal .cr-ajax-reviews-cus-images-slider-nav").slickk('slickGoTo', slide_no, true);
}
} );
jQuery(".cr-comment-image-top .cr-comment-videoicon").on( "click", function(t) {
jQuery(this).closest( ".cr-comment-image-top" ).find( ".cr-comment-image-top-item" ).trigger( "click" );
} );
//close popup window with pictures
jQuery(".cr-ajax-reviews-cus-images-modal-cont, .cr-ajax-reviews-cus-images-modal .cr-ajax-reviews-cus-images-close").on( "click", function(t) {
t.preventDefault();
let closeParent = jQuery(this).closest(".cr-ajax-reviews-cus-images-modal-cont.cr-mask-active");
closeParent.find(".cr-ajax-reviews-cus-images-modal .cr-ajax-reviews-cus-images-slider-main").slickk('slickGoTo',0,true);
closeParent.find(".cr-ajax-reviews-cus-images-modal .cr-ajax-reviews-cus-images-slider-nav").slickk('slickGoTo',0,true);
closeParent.removeClass("cr-mask-active");
jQuery("body").removeClass("cr-noscroll");
} );
jQuery(".cr-ajax-reviews-cus-images-modal-cont .cr-ajax-reviews-cus-images-modal").on( "click", function(t) {
t.stopPropagation();
} );
//Product variations
jQuery(".single_variation_wrap").on( "show_variation", function ( event, variation ) {
if(jQuery(".cr_gtin").length){
jQuery(".cr_gtin_val").text(variation._cr_gtin);
}
if(jQuery(".cr_mpn").length){
jQuery(".cr_mpn_val").text(variation._cr_mpn);
}
if(jQuery(".cr_brand").length){
jQuery(".cr_brand_val").text(variation._cr_brand);
}
});
//Reset Product variations
jQuery(document).on('reset_data', function () {
var cr_gtin = jQuery(".cr_gtin"),
cr_mpn = jQuery(".cr_mpn"),
cr_brand = jQuery(".cr_brand");
if(cr_gtin.length){
jQuery(".cr_gtin_val").text(cr_gtin.data("o_content"));
}
if(cr_mpn.length){
jQuery(".cr_mpn_val").text(cr_mpn.data("o_content"));
}
if(cr_brand.length){
jQuery(".cr_brand_val").text(cr_brand.data("o_content"));
}
});
// show more ajax reviews in the all reviews block
jQuery('.cr-all-reviews-shortcode .cr-show-more-button').on("click", function (e) {
e.preventDefault();
cr_filter_all_reviews( jQuery(this), true );
});
jQuery('.cr-all-reviews-shortcode').on("click", ".cr-page-numbers-a", function (e) {
e.preventDefault();
cr_filter_all_reviews( jQuery(this), true );
});
// filter ajax reviews in the all reviews block
jQuery(".cr-all-reviews-shortcode").on("click", "a.cr-histogram-a, .cr-seeAllReviews", function(t){
t.preventDefault();
let cr_rating = jQuery(this).data("rating");
jQuery("div.ivole-summaryBox tr.ivole-histogramRow.ivole-histogramRow-s").removeClass("ivole-histogramRow-s");
if ( cr_rating > 0 ) {
jQuery(this).closest("tr.ivole-histogramRow").addClass("ivole-histogramRow-s");
}
jQuery(this).parents(".cr-all-reviews-shortcode").find(".cr-review-tags-filter .cr-tag-selected").removeClass("cr-tag-selected");
cr_filter_all_reviews( jQuery(this) );
});
// show more ajax reviews in the grid
jQuery( ".cr-reviews-grid .cr-show-more-button" ).on( "click", function (e) {
e.preventDefault();
let $this = jQuery(this),
$spinner = $this.next(".cr-show-more-spinner"),
cr_rating = $this.parents(".cr-reviews-grid").find(".ivole-summaryBox.cr-grid-reviews-ajax tr.ivole-histogramRow.ivole-histogramRow-s a.cr-histogram-a").attr("data-rating"),
attributes = $this.parents(".cr-reviews-grid").data("attributes");
attributes.comment__not_in = $this.parents(".cr-reviews-grid").find(".cr-review-card.cr-card-product").map( function() {
return jQuery(this).data("reviewid");
} ).get();
attributes.comment__not_in = attributes.comment__not_in.concat(
$this.parents(".cr-reviews-grid").find(".cr-review-card.cr-card-shop").map(function(){
return jQuery(this).data("reviewid");
}).get() );
var grid_data = {
'action': "ivole_show_more_grid_reviews",
'rating': cr_rating,
'attributes': attributes
};
$this.hide();
$spinner.show();
jQuery.post(cr_ajax_object.ajax_url, grid_data, function(response) {
$spinner.hide();
$reviews = jQuery(response.html).find(".cr-review-card");
if($reviews.length){
$this.parents(".cr-reviews-grid").find(".cr-reviews-grid-inner").colcade("append", $reviews);
$this.show();
} else {
$this.hide();
}
}).fail(function(response) {
$spinner.hide();
$this.show();
$this.parent().append('
" )
);
}
} else {
mediaPreview.removeClass( "cr-form-visible" );
mediaPreview.parents( ".cr-form-item-subcontainer" ).removeClass( "cr-form-visible" );
}
}
}, "json" );
} );
cr_maybe_download_media_frontend();
if( "object" === typeof elementorFrontend && "hooks" in elementorFrontend ) {
elementorFrontend.hooks.addAction( "frontend/element_ready/widget", function( $scope ) {
if( -1 !== $scope.data( "widget_type" ).indexOf( "shortcode" ) ) {
if( 0 < $scope.find( ".cr-reviews-grid-inner" ).length ) {
crResizeAllGridItems();
}
}
} );
}
} );
function initVoteClick(sel1, sel2, action) {
jQuery(sel1).on("click", sel2, function(e) {
e.preventDefault();
let reviewIDhtml = jQuery(this).data("vote");
let parent = jQuery(this).parents(".cr-voting-cont-uni");
if(reviewIDhtml != null) {
let reviewID = reviewIDhtml;
let data = {
"action": action,
"reviewID": reviewID,
"upvote": jQuery(this).data("upvote")
};
parent.find(".cr-voting-a").removeClass("cr-voting-active");
parent.find(".cr-voting-a").addClass("cr-voting-update");
jQuery.post(cr_ajax_object.ajax_url, data, function(response) {
parent.find(".cr-voting-a").removeClass("cr-voting-update");
if( response.code === 0 ) {
if( response.votes ) {
parent.find(".cr-voting-upvote-count").text("(" + response.votes.upvotes + ")");
parent.find(".cr-voting-downvote-count").text("(" + response.votes.downvotes + ")");
}
if( 0 !== response.votes.current ) {
if( 0 < response.votes.current ) {
parent.find(".cr-voting-upvote").addClass("cr-voting-active");
} else {
parent.find(".cr-voting-downvote").addClass("cr-voting-active");
}
}
}
}, "json");
}
});
}
function crValidateQnaHelper( refElement ) {
let ret = true;
let modal = refElement.closest( '.cr-qna-block' ).find( '.cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal' );
if( modal.find( '.cr-qna-new-q-form-q' ).val().trim().length <= 0 ) {
modal.find( '.cr-qna-new-q-form-q' ).addClass( 'cr-qna-new-q-form-invalid' );
ret = false;
} else {
modal.find( '.cr-qna-new-q-form-q' ).removeClass( 'cr-qna-new-q-form-invalid' );
}
if( modal.find( '.cr-qna-new-q-form-name' ).val().trim().length <= 0 ) {
modal.find( '.cr-qna-new-q-form-name' ).addClass( 'cr-qna-new-q-form-invalid' );
ret = false;
} else {
modal.find( '.cr-qna-new-q-form-name' ).removeClass( 'cr-qna-new-q-form-invalid' );
}
if( ! crValidateEmail( modal.find( '.cr-qna-new-q-form-email' ).val().trim() ) ) {
modal.find( '.cr-qna-new-q-form-email' ).addClass( 'cr-qna-new-q-form-invalid' );
ret = false;
} else {
modal.find( '.cr-qna-new-q-form-email' ).removeClass( 'cr-qna-new-q-form-invalid' );
}
return ret;
}
function crValidateQna( refElement ) {
if( crValidateQnaHelper( refElement ) ) {
refElement.closest( '.cr-qna-block' ).find( '.cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-s button.cr-qna-new-q-form-s-b' ).addClass( 'cr-q-active' );
} else {
refElement.closest( '.cr-qna-block' ).find( '.cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-s button.cr-qna-new-q-form-s-b' ).removeClass( 'cr-q-active' );
}
}
function crValidateEmail(email) {
var re = /\S+@\S+\.\S+/;
return re.test(email);
}
function crNewQna(token) {
var cr_nonce = jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input .cr-qna-new-q-form-s-b').attr("data-nonce");
var cr_post_id = jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input .cr-qna-new-q-form-s-b').attr("data-post");
var cr_current_post_id = jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input .cr-qna-new-q-form-s-b').attr("data-product");
var cr_text = jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-q').val().trim();
var cr_name = jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-name').val().trim();
var cr_email = jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-email').val().trim();
var cr_question_id = jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input .cr-qna-new-q-form-s-b').attr("data-question");
var cr_data = {
"action": "cr_new_qna",
"productID": cr_post_id,
"currentPostID": cr_current_post_id,
"questionID": cr_question_id,
"text": cr_text,
"name": cr_name,
"email": cr_email,
"security": cr_nonce,
"cptcha": token
};
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input .cr-qna-new-q-form-s-b').css( 'display', 'none' );
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input .cr-qna-new-q-form-s-p').css( 'display', 'inline-block' );
jQuery.post(cr_ajax_object.ajax_url, cr_data, function(response) {
if( 0 === response.code ) {
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-error').css( 'display', 'none' );
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input').css( 'display', 'none' );
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-ok').css( 'display', 'block' );
} else {
if( response.description && response.description.length > 0 ) {
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-error p.cr-qna-new-q-form-text span.cr-qna-new-q-form-text-additional').text( response.description );
}
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-ok').css( 'display', 'none' );
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input').css( 'display', 'none' );
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-error').css( 'display', 'block' );
}
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-q').val('');
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-q, #cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form .cr-qna-new-q-form-name, #cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form .cr-qna-new-q-form-email').removeClass( 'cr-qna-new-q-form-notinit' );
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input .cr-qna-new-q-form-s-b').css( 'display', 'inline-block' );
jQuery('#cr_qna.cr-qna-block .cr-qna-new-q-overlay .cr-qna-new-q-form.cr-q-modal .cr-qna-new-q-form-input .cr-qna-new-q-form-s-p').css( 'display', 'none' );
}, "json");
}
function cr_keyup_delay(fn, ms) {
let timer = 0;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(fn.bind(this, ...args), ms || 0);
};
}
function cr_filter_all_reviews( refElement, show_more = false ) {
let attributes = refElement.parents(".cr-all-reviews-shortcode").data("attributes"),
cr_rating = refElement.parents(".cr-all-reviews-shortcode").find(".ivole-summaryBox .ivole-histogramRow.ivole-histogramRow-s .cr-histogram-a").attr("data-rating"),
cr_search = refElement.parents(".cr-all-reviews-shortcode").find(".cr-ajax-search input").val(),
cr_sort = refElement.parents(".cr-all-reviews-shortcode").find(".cr-ajax-reviews-sort").children("option:selected").val();
let cr_tags = [];
refElement.parents(".cr-all-reviews-shortcode").find(".cr-review-tags-filter .cr-tags-filter.cr-tag-selected").each(
function() {
cr_tags.push( jQuery(this).attr("data-crtagid") );
}
);
let cr_data = {
"action": "cr_show_more_all_reviews",
"attributes": attributes,
"rating": cr_rating,
"page": 0,
"search": cr_search,
"sort": cr_sort,
"tags": cr_tags
};
//
if( show_more ) {
cr_data.page = refElement.data( "page" );
// click on 'show more' button
jQuery(".cr-search-no-reviews").hide();
jQuery('.cr-show-more-button').hide();
// dim the list of comments when dealing with the pagination
if ( refElement.hasClass( "cr-page-numbers-a" ) ) {
refElement.closest( ".cr-all-reviews-shortcode" ).find( ".commentlist" ).addClass( "cr-pagination-load" );
refElement.closest( ".cr-all-reviews-shortcode" ).find( ".cr-all-reviews-pagination" ).addClass( "cr-pagination-load" );
} else {
refElement.closest( ".cr-all-reviews-shortcode" ).find( ".cr-show-more-review-spinner" ).show();
}
jQuery.post(
{
url: cr_ajax_object.ajax_url,
data: cr_data,
context: refElement,
success: function(response) {
let shcode = jQuery(this).closest( ".cr-all-reviews-shortcode" );
shcode.find( ".cr-show-more-review-spinner" ).hide();
if( response.html !== "" ) {
if ( jQuery(this).hasClass( "cr-page-numbers-a" ) ) {
shcode.find(".commentlist").find("*").not(".cr-pagination-review-spinner").remove();
shcode.find(".commentlist").prepend(response.html);
} else {
shcode.find(".commentlist").append(response.html);
}
if( ! response.last_page ) {
shcode.find(".cr-show-more-button").text( response.show_more_label );
shcode.find(".cr-show-more-button").show();
}
shcode.find(".cr-show-more-button").data( "page", response.page );
shcode.find(".cr-count-row .cr-count-row-count").html( response.count_row );
if ( response.pagination !== "" ) {
shcode.find(".cr-all-reviews-pagination").html(response.pagination);
}
} else {
shcode.find(".cr-show-more-button").hide();
}
if( response.html == "" && response.page === 1 ){
shcode.find( ".cr-search-no-reviews" ).show();
}
shcode.find( ".commentlist" ).removeClass( "cr-pagination-load" );
shcode.find( ".cr-all-reviews-pagination" ).removeClass( "cr-pagination-load" );
},
dataType: "json"
}
);
} else {
// click on 'search' button
refElement.closest(".cr-all-reviews-shortcode").find(".cr-search-no-reviews").hide();
refElement.closest(".cr-all-reviews-shortcode").find(".cr-show-more-button").hide();
refElement.closest(".cr-all-reviews-shortcode").find(".commentlist").hide();
refElement.closest(".cr-all-reviews-shortcode").find(".cr-show-more-review-spinner").show();
refElement.closest(".cr-all-reviews-shortcode").find(".ivole-summaryBox").addClass("cr-summaryBar-updating");
refElement.closest(".cr-all-reviews-shortcode").find(".cr-seeAllReviews").addClass("cr-seeAll-updating");
refElement.closest(".cr-all-reviews-shortcode").find(".cr-ajax-reviews-sort").addClass("cr-sort-updating");
refElement.closest(".cr-all-reviews-shortcode").find(".cr-review-tags-filter").addClass("cr-tags-updating");
refElement.closest(".cr-all-reviews-shortcode").find(".cr-all-reviews-pagination").hide();
jQuery.post(
{
url: cr_ajax_object.ajax_url,
data: cr_data,
context: refElement,
success: function(response) {
let shcode = jQuery(this).closest( ".cr-all-reviews-shortcode" );
shcode.find( ".cr-show-more-review-spinner" ).hide();
shcode.find(".ivole-summaryBox").removeClass("cr-summaryBar-updating");
shcode.find(".cr-seeAllReviews").removeClass("cr-seeAll-updating");
shcode.find(".cr-ajax-reviews-sort").removeClass("cr-sort-updating");
shcode.find(".cr-review-tags-filter").removeClass("cr-tags-updating");
if(response.html !== ""){
shcode.find(".commentlist").empty();
shcode.find(".commentlist").append(response.html);
shcode.find(".commentlist").show();
shcode.find(".cr-show-more-button").data("page",response.page);
if( !response.last_page ){
shcode.find(".cr-show-more-button").text( response.show_more_label );
shcode.find(".cr-show-more-button").show();
}
} else {
shcode.find(".cr-search-no-reviews").show();
}
shcode.find(".cr-count-row .cr-count-row-count").html( response.count_row );
shcode.find(".cr-all-reviews-pagination").html(response.pagination);
shcode.find(".cr-all-reviews-pagination").show();
},
dataType: "json"
}
);
}
}
function cr_maybe_download_media_frontend() {
jQuery(".cr-comment-image-ext,.cr-comment-video-ext").each(function() {
let ajaxData = {
"action": "cr_auto_download_media_frontend",
"reviewID": jQuery(this).data("reviewid")
}
jQuery.post(cr_ajax_object.ajax_url, ajaxData, function(response) {
// do nothing
}, "json");
return false;
});
}
function cr_validate_review_form( submitBtn ) {
const validateEmail = (email) => {
return email.match(
/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
);
};
let validationResult = true;
submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-rating-cont.cr-review-form-rating-req" ).each( function( index ) {
if( 1 > jQuery( this ).find( ".cr-review-form-rating-actv" ).length ) {
jQuery( this ).closest( ".cr-review-form-rating" ).addClass( "cr-review-form-error" );
validationResult = false;
}
} );
if( 1 > submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-comment-txt" ).val().trim().length ) {
submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-comment" ).addClass( "cr-review-form-error" );
validationResult = false;
}
if( 1 > submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-name .cr-review-form-txt" ).val().trim().length ) {
submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-name" ).addClass( "cr-review-form-error" );
validationResult = false;
}
if( ! validateEmail( submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-email .cr-review-form-txt" ).val().trim() ) ) {
submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-email" ).addClass( "cr-review-form-error" );
validationResult = false;
}
// validate custom questions
submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-onsite-question.cr-review-form-que-req" ).each( function( index ) {
if ( 0 < jQuery( this ).find( "input[type=text]" ).length ) {
if( 1 > jQuery( this ).find( "input[type=text]" ).val().trim().length ) {
jQuery( this ).closest( ".cr-onsite-question" ).addClass( "cr-review-form-error" );
validationResult = false;
} else {
jQuery( this ).closest( ".cr-onsite-question" ).removeClass( "cr-review-form-error" );
}
}
if ( 0 < jQuery( this ).find( "input[type=number]" ).length ) {
if( 1 > jQuery( this ).find( "input[type=number]" ).val().trim().length ) {
jQuery( this ).closest( ".cr-onsite-question" ).addClass( "cr-review-form-error" );
validationResult = false;
} else {
jQuery( this ).closest( ".cr-onsite-question" ).removeClass( "cr-review-form-error" );
}
}
} );
// validate terms and conditions if available
if ( 0 < submitBtn.closest( ".cr-review-form-wrap" ).find( '.cr-review-form-terms' ).length ) {
if ( ! submitBtn.closest( ".cr-review-form-wrap" ).find( '.cr-review-form-terms .cr-review-form-checkbox' ).is(':checked') ) {
submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-terms" ).addClass( "cr-review-form-error" );
validationResult = false;
}
}
// validate captcha if available
if ( 0 < submitBtn.closest( ".cr-review-form-wrap" ).find( '.cr-review-form-captcha .cr-recaptcha' ).length ) {
if ( grecaptcha ) {
let widgetId = 0;
// check if there are multiple captchas on a page
if ( 0 < jQuery( ".cr-review-form-captcha .cr-recaptcha" ).length ) {
jQuery( ".cr-review-form-captcha .cr-recaptcha" ).each(
function( index ) {
if (
submitBtn.closest( '.cr-review-form-wrap' ).find( '.cr-review-form-captcha .cr-recaptcha' ).data( 'crcaptchaid' ) === jQuery(this).data( 'crcaptchaid' )
) {
widgetId = index;
}
}
);
}
//
let captchaCheck = "";
if ( 0 < widgetId ) {
captchaCheck = grecaptcha.getResponse( widgetId );
} else {
captchaCheck = grecaptcha.getResponse();
}
if ( ! captchaCheck.length > 0 ) {
submitBtn.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-captcha" ).addClass( "cr-review-form-error" );
validationResult = false;
}
}
}
return validationResult;
}
function cr_reset_review_form( refElement ) {
// reset the rating bar
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-rating-cont .cr-review-form-rating-inner" ).removeClass( "cr-review-form-rating-actv" );
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-rating-cont .cr-review-form-rating-inner .cr-rating-act" ).hide();
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-rating-cont .cr-review-form-rating-inner .cr-rating-deact" ).show();
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-rating-cont .cr-review-form-rating-nbr" ).text( "0/5" );
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-rating" ).removeClass( "cr-review-form-error" );
// reset the comment field
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-comment-txt" ).val('');
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-comment" ).removeClass( "cr-review-form-error" );
// reset the name field
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-name .cr-review-form-txt" ).val('');
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-name" ).removeClass( "cr-review-form-error" );
// reset the email field
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-email .cr-review-form-txt" ).val('');
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-email" ).removeClass( "cr-review-form-error" );
// reset the custom questions
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-onsite-questions .cr-onsite-question" ).removeClass( "cr-review-form-error" );
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-onsite-questions .cr-onsite-question input[type = 'text']" ).val('');
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-onsite-questions .cr-onsite-question input[type = 'number']" ).val('');
// reset the media files
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-form-item-media .cr-upload-images-containers" ).remove();
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-form-item-media .cr-form-item-media-preview" ).removeClass( "cr-form-visible" );
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-form-item-media .cr-form-item-media-preview" ).parents( ".cr-form-item-subcontainer" ).removeClass( "cr-form-visible" );
// reset the terms and conditions checkbox
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-terms .cr-review-form-checkbox" ).prop( 'checked', false );
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-terms" ).removeClass( "cr-review-form-error" );
// reset recaptcha
refElement.closest( ".cr-review-form-wrap" ).find( ".cr-review-form-captcha" ).removeClass( "cr-review-form-error" );
}
function crDebounce(callback, wait) {
let timeout;
return (...args) => {
clearTimeout(timeout);
if ( 0 < args.length && 13 === args[0].keyCode ) {
wait = 0;
} else {
wait = 1000;
}
timeout = setTimeout(function () { callback.apply(this, args); }, wait);
};
}
function crShowMoreReviewsPrd( refElement ) {
let cr_product_id = refElement.parents(".cr-reviews-ajax-comments").find(".commentlist.cr-ajax-reviews-list").attr("data-product");
let cr_nonce = refElement.parents(".cr-reviews-ajax-comments").attr("data-nonce");
let cr_page = refElement.parents(".cr-reviews-ajax-comments").attr("data-page");
let cr_sort = refElement.parents(".cr-reviews-ajax-comments").find(".cr-ajax-reviews-sort").children("option:selected").val();
let cr_rating = refElement.parents(".cr-reviews-ajax-comments").find(".cr-summaryBox-ajax tr.ivole-histogramRow.ivole-histogramRow-s a.ivole-histogram-a").attr("data-rating");
let cr_search = refElement.parents(".cr-reviews-ajax-comments").find(".cr-ajax-search input").val();
let cr_tags = [];
refElement.parents(".cr-reviews-ajax-comments").find(".cr-review-tags-filter .cr-tags-filter.cr-tag-selected").each(
function() {
cr_tags.push( jQuery(this).attr("data-crtagid") );
}
);
if ( ! cr_rating ){
cr_rating = 0;
}
let cr_data = {
"action": "cr_show_more_reviews",
"productID": cr_product_id,
"page": cr_page,
"sort": cr_sort,
"rating": cr_rating,
"search": cr_search,
"tags": cr_tags,
"security": cr_nonce
};
refElement.parents(".cr-reviews-ajax-comments").find(".cr-summaryBox-ajax").addClass("cr-summaryBar-updating");
refElement.parents(".cr-reviews-ajax-comments").find(".cr-ajax-reviews-sort").addClass("cr-sort-updating");
refElement.parents(".cr-reviews-ajax-comments").find(".cr-review-tags-filter").addClass("cr-review-tags-filter-disabled");
refElement.parents(".cr-reviews-ajax-comments").find(".cr-search-no-reviews").hide();
refElement.parents(".cr-reviews-ajax-comments").find(".cr-show-more-reviews-prd").hide();
refElement.parents(".cr-reviews-ajax-comments").find(".cr-show-more-review-spinner").show();
jQuery.post( {
url: cr_ajax_object.ajax_url,
data: cr_data,
context: refElement,
success: function(response) {
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-show-more-review-spinner").hide();
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-summaryBox-ajax").removeClass("cr-summaryBar-updating");
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-ajax-reviews-sort").removeClass("cr-sort-updating");
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-review-tags-filter").removeClass("cr-review-tags-filter-disabled");
if( response.page > 0 ) {
jQuery(this).parents(".cr-reviews-ajax-comments").find(".commentlist.cr-ajax-reviews-list").append( response.html );
jQuery(this).parents(".cr-reviews-ajax-comments").attr("data-page",response.page);
if ( response.show_more_label ) {
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-show-more-reviews-prd").text( response.show_more_label );
}
if ( response.count_row ) {
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-count-row .cr-count-row-count").html( response.count_row );
}
if ( ! response.last_page ) {
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-show-more-reviews-prd").show();
}
cr_maybe_download_media_frontend();
}
if ( response.html == null && response.page === 1 ) {
jQuery(this).parents(".cr-reviews-ajax-comments").find(".cr-search-no-reviews").show();
}
},
dataType: "json"
} );
}
})();
function crResizeAllGridItems() {
jQuery(".cr-reviews-grid-inner").each( function() {
if(800 > jQuery(this).width()) {
jQuery(this).find(".cr-reviews-grid-col3").addClass("cr-reviews-grid-col-none");
}
if(550 > jQuery(this).width()) {
jQuery(this).find(".cr-reviews-grid-col2").addClass("cr-reviews-grid-col-none");
}
jQuery(this).colcade( {
columns: ".cr-reviews-grid-col",
items: ".cr-review-card"
} );
} );
}
function crResizeTrustBadges() {
jQuery(".cr-trustbadgef").each(function() {
let badge = jQuery(this).find(".cr-badge").eq(0);
let scale = jQuery(this).width() / badge.outerWidth();
if( 1 > scale ) {
badge.css("transform", "scale(" + scale + ")");
}
badge.css("visibility", "visible");
});
}
;
/*!
* Colcade v0.2.0
* Lightweight masonry layout
* by David DeSandro
* MIT license
*/
/*jshint browser: true, undef: true, unused: true */
( function( window, factory ) {
// universal module definition
/*jshint strict: false */
/*global define: false, module: false */
if ( typeof define == 'function' && define.amd ) {
// AMD
define( factory );
} else if ( typeof module == 'object' && module.exports ) {
// CommonJS
module.exports = factory();
} else {
// browser global
window.Colcade = factory();
}
}( window, function factory() {
// -------------------------- Colcade -------------------------- //
function Colcade( element, options ) {
element = getQueryElement( element );
// do not initialize twice on same element
if ( element && element.colcadeGUID ) {
var instance = instances[ element.colcadeGUID ];
instance.option( options );
return instance;
}
this.element = element;
// options
this.options = {};
this.option( options );
// items from the last append operation and ColumnHeights before the append
this.lastAppend = [];
this.lastColumnHeights = [];
// kick things off
this.create();
element.classList.add('cr-colcade-loaded');
}
var proto = Colcade.prototype;
proto.option = function( options ) {
this.options = extend( this.options, options );
};
// globally unique identifiers
var GUID = 0;
// internal store of all Colcade intances
var instances = {};
proto.create = function() {
this.errorCheck();
// add guid for Colcade.data
var guid = this.guid = ++GUID;
this.element.colcadeGUID = guid;
instances[ guid ] = this; // associate via id
// update initial properties & layout
this.reload();
// events
this._windowResizeHandler = this.onWindowResize.bind( this );
this._loadHandler = this.onLoad.bind( this );
window.addEventListener( 'resize', this._windowResizeHandler );
this.element.addEventListener( 'load', this._loadHandler, true );
};
proto.errorCheck = function() {
var errors = [];
if ( !this.element ) {
errors.push( 'Bad element: ' + this.element );
}
if ( !this.options.columns ) {
errors.push( 'columns option required: ' + this.options.columns );
}
if ( !this.options.items ) {
errors.push( 'items option required: ' + this.options.items );
}
if ( errors.length ) {
throw new Error( '[Colcade error] ' + errors.join('. ') );
}
};
// update properties and do layout
proto.reload = function() {
this.updateColumns();
this.updateItems();
this.layout();
};
proto.updateColumns = function() {
this.columns = querySelect( this.options.columns, this.element );
};
proto.updateItems = function() {
this.items = querySelect( this.options.items, this.element );
};
proto.getActiveColumns = function() {
return this.columns.filter( function( column ) {
var style = getComputedStyle( column );
return style.display != 'none';
});
};
// ----- layout ----- //
// public, updates activeColumns
proto.layout = function() {
this.activeColumns = this.getActiveColumns();
this._layout();
};
// private, does not update activeColumns
proto._layout = function() {
// reset column heights
this.columnHeights = this.activeColumns.map( function() {
return 0;
});
// layout all items
this.layoutItems( this.items );
};
proto.layoutItems = function( items ) {
items.forEach( this.layoutItem, this );
};
proto.layoutItem = function( item ) {
// layout item by appending to column
var minHeight = Math.min.apply( Math, this.columnHeights );
var index = this.columnHeights.indexOf( minHeight );
this.activeColumns[ index ].appendChild( item );
// at least 1px, if item hasn't loaded
// Not exactly accurate, but it's cool
this.columnHeights[ index ] += item.offsetHeight || 1;
};
// ----- adding items ----- //
proto.append = function( elems ) {
var items = this.getQueryItems( elems );
// add items to collection
this.items = this.items.concat( items );
// capture the items and columnHeights for future onLoad events triggered by images load
this.lastAppend.length = 0;
this.lastAppend = items.slice();
this.lastColumnHeights.length = 0;
this.lastColumnHeights = this.columnHeights.slice();
// lay them out
this.layoutItems( items );
};
proto.prepend = function( elems ) {
var items = this.getQueryItems( elems );
// add items to collection
this.items = items.concat( this.items );
// lay out everything
this._layout();
};
proto.getQueryItems = function( elems ) {
elems = makeArray( elems );
var fragment = document.createDocumentFragment();
elems.forEach( function( elem ) {
fragment.appendChild( elem );
});
return querySelect( this.options.items, fragment );
};
proto.empty = function() {
this.lastAppend.length = 0;
this.lastColumnHeights.length = 0;
//
this.items.forEach( function( item ) {
item.remove();
}, this );
this.items.length = 0;
// lay out everything
this._layout();
};
// ----- measure column height ----- //
proto.measureColumnHeight = function( elem ) {
var boundingRect = this.element.getBoundingClientRect();
this.activeColumns.forEach( function( column, i ) {
// if elem, measure only that column
// if no elem, measure all columns
if ( !elem || column.contains( elem ) ) {
var lastChildRect = column.lastElementChild.getBoundingClientRect();
// not an exact calculation as it includes top border, and excludes item bottom margin
this.columnHeights[ i ] = lastChildRect.bottom - boundingRect.top;
}
}, this );
};
// ----- events ----- //
proto.onWindowResize = function() {
clearTimeout( this.resizeTimeout );
this.resizeTimeout = setTimeout( function() {
this.onDebouncedResize();
}.bind( this ), 100 );
};
proto.onDebouncedResize = function() {
var activeColumns = this.getActiveColumns();
// check if columns changed
var isSameLength = activeColumns.length == this.activeColumns.length;
var isSameColumns = true;
this.activeColumns.forEach( function( column, i ) {
isSameColumns = isSameColumns && column == activeColumns[i];
});
if ( isSameLength && isSameColumns ) {
return;
}
// activeColumns changed
this.activeColumns = activeColumns;
this._layout();
};
proto.onLoad = function( event ) {
this.measureColumnHeight( event.target );
if( 0 < this.lastColumnHeights.length && 0 < this.lastAppend.length ) {
this.columnHeights.length = 0;
this.columnHeights = this.lastColumnHeights.slice();
this.layoutItems( this.lastAppend );
}
};
// ----- destroy ----- //
proto.destroy = function() {
// move items back to container
this.items.forEach( function( item ) {
this.element.appendChild( item );
}, this );
// remove events
window.removeEventListener( 'resize', this._windowResizeHandler );
this.element.removeEventListener( 'load', this._loadHandler, true );
// remove data
delete this.element.colcadeGUID;
delete instances[ this.guid ];
};
// -------------------------- HTML init -------------------------- //
docReady( function() {
var dataElems = querySelect('[data-colcade]');
dataElems.forEach( htmlInit );
});
function htmlInit( elem ) {
// convert attribute "foo: bar, qux: baz" into object
var attr = elem.getAttribute('data-colcade');
var attrParts = attr.split(',');
var options = {};
attrParts.forEach( function( part ) {
var pair = part.split(':');
var key = pair[0].trim();
var value = pair[1].trim();
options[ key ] = value;
});
new Colcade( elem, options );
}
Colcade.data = function( elem ) {
elem = getQueryElement( elem );
var id = elem && elem.colcadeGUID;
return id && instances[ id ];
};
// -------------------------- jQuery -------------------------- //
Colcade.makeJQueryPlugin = function( $ ) {
$ = $ || window.jQuery;
if ( !$ ) {
return;
}
$.fn.colcade = function( arg0 /*, arg1 */) {
// method call $().colcade( 'method', { options } )
if ( typeof arg0 == 'string' ) {
// shift arguments by 1
var args = Array.prototype.slice.call( arguments, 1 );
return methodCall( this, arg0, args );
}
// just $().colcade({ options })
plainCall( this, arg0 );
return this;
};
function methodCall( $elems, methodName, args ) {
var returnValue;
$elems.each( function( i, elem ) {
// get instance
var colcade = $.data( elem, 'colcade' );
if ( !colcade ) {
return;
}
// apply method, get return value
var value = colcade[ methodName ].apply( colcade, args );
// set return value if value is returned, use only first value
returnValue = returnValue === undefined ? value : returnValue;
});
return returnValue !== undefined ? returnValue : $elems;
}
function plainCall( $elems, options ) {
$elems.each( function( i, elem ) {
var colcade = $.data( elem, 'colcade' );
if ( colcade ) {
// set options & init
colcade.option( options );
colcade.layout();
} else {
// initialize new instance
colcade = new Colcade( elem, options );
$.data( elem, 'colcade', colcade );
}
});
}
};
// try making plugin
Colcade.makeJQueryPlugin();
// -------------------------- utils -------------------------- //
function extend( a, b ) {
for ( var prop in b ) {
a[ prop ] = b[ prop ];
}
return a;
}
// turn element or nodeList into an array
function makeArray( obj ) {
var ary = [];
if ( Array.isArray( obj ) ) {
// use object if already an array
ary = obj;
} else if ( obj && typeof obj.length == 'number' ) {
// convert nodeList to array
for ( var i=0; i < obj.length; i++ ) {
ary.push( obj[i] );
}
} else {
// array of single index
ary.push( obj );
}
return ary;
}
// get array of elements
function querySelect( selector, elem ) {
elem = elem || document;
var elems = elem.querySelectorAll( selector );
return makeArray( elems );
}
function getQueryElement( elem ) {
if ( typeof elem == 'string' ) {
elem = document.querySelector( elem );
}
return elem;
}
function docReady( onReady ) {
if ( document.readyState == 'complete' ) {
onReady();
return;
}
document.addEventListener( 'DOMContentLoaded', onReady );
}
// -------------------------- end -------------------------- //
return Colcade;
}));
;
var resetFeedbackButtons = function() {
document.getElementById('wpaicg-prompt-thumbs_up').disabled = false;
document.getElementById('wpaicg-prompt-thumbs_up').style.display = 'inline-block';
document.getElementById('wpaicg-prompt-thumbs_down').disabled = false;
document.getElementById('wpaicg-prompt-thumbs_down').style.display = 'inline-block';
};
var wpaicgPlayGround = {
init: function(){
var wpaicg_PlayGround = this;
var wpaicgFormsShortcode = document.getElementsByClassName('wpaicg-playground-shortcode');
var wpaicgClearButtons = document.getElementsByClassName('wpaicg-prompt-clear');
var wpaicgStopButtons = document.getElementsByClassName('wpaicg-prompt-stop-generate');
var wpaicgSaveButtons = document.getElementsByClassName('wpaicg-prompt-save-draft');
var wpaicgDownloadButtons = document.getElementsByClassName('wpaicg-prompt-download');
var wpaicgCopyButtons = document.getElementsByClassName('wpaicg-prompt-copy_button');
var wpaicgThumbsUpButtons = document.getElementsByClassName('wpaicg-prompt-thumbs_up');
var wpaicgThumbsDownButtons = document.getElementsByClassName('wpaicg-prompt-thumbs_down');
if(wpaicgDownloadButtons && wpaicgDownloadButtons.length){
for(var i=0;i < wpaicgDownloadButtons.length;i++) {
var wpaicgDownloadButton = wpaicgDownloadButtons[i];
wpaicgDownloadButton.addEventListener('click', function (e) {
e.preventDefault();
var wpaicgDownloadButton = e.currentTarget;
var wpaicgForm = wpaicgDownloadButton.closest('.wpaicg-prompt-form');
var formID = wpaicgForm.getAttribute('data-id');
var wpaicgFormData = window['wpaicgForm'+formID];
var currentContent = wpaicg_PlayGround.getContent(wpaicgFormData.response,formID);
// Replace with space
currentContent = currentContent.replace(/ /g, ' ');
var element = document.createElement('a');
currentContent = currentContent.replace(/ /g,"\n");
currentContent = currentContent.replace(/ /g,"\n");
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(currentContent));
element.setAttribute('download', 'response.txt');
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
});
}
}
if(wpaicgCopyButtons && wpaicgCopyButtons.length){
for(var i=0; i < wpaicgCopyButtons.length; i++){
var wpaicgCopyButton = wpaicgCopyButtons[i];
wpaicgCopyButton.addEventListener('click', function (e) {
e.preventDefault();
var wpaicgCopyButton = e.currentTarget;
var originalText = wpaicgCopyButton.textContent; // Store the original text
wpaicgCopyButton.textContent = "👍";
setTimeout(function() {
wpaicgCopyButton.textContent = originalText; // Restore the original text after 2 seconds
}, 2000);
var wpaicgForm = wpaicgCopyButton.closest('.wpaicg-prompt-form');
var formID = wpaicgForm.getAttribute('data-id');
var wpaicgFormData = window['wpaicgForm'+formID];
var responseText = wpaicgPlayGround.getContent(wpaicgFormData.response, formID);
// Replace with space
responseText = responseText.replace(/ /g, ' ');
// Replace single occurrences of or with a newline
responseText = responseText.replace(/ /g, '\r\n');
// Replace double occurrences of
or
with double newline
responseText = responseText.replace(/\r\n\r\n/g, '\r\n\r\n');
// Copy responseText to clipboard
navigator.clipboard.writeText(responseText).then(function() {
console.log('Text successfully copied to clipboard');
}).catch(function(err) {
console.error('Unable to copy text to clipboard', err);
});
});
}
}
if(wpaicgClearButtons && wpaicgClearButtons.length){
for(var i=0;i < wpaicgClearButtons.length;i++){
var wpaicgClearButton = wpaicgClearButtons[i];
wpaicgClearButton.addEventListener('click', function (e) {
e.preventDefault();
var wpaicgClearButton = e.currentTarget;
var wpaicgForm = wpaicgClearButton.closest('.wpaicg-prompt-form');
var formID = wpaicgForm.getAttribute('data-id');
var wpaicgFormData = window['wpaicgForm'+formID];
var wpaicgSaveResult = wpaicgForm.getElementsByClassName('wpaicg-prompt-save-result')[0];
wpaicg_PlayGround.setContent(wpaicgFormData.response,formID,'');
wpaicgSaveResult.style.display = 'none';
});
}
}
if(wpaicgStopButtons && wpaicgStopButtons.length){
for(var i=0;i < wpaicgStopButtons.length;i++){
var wpaicgStopButton = wpaicgStopButtons[i];
wpaicgStopButton.addEventListener('click', function (e) {
e.preventDefault();
var wpaicgStopButton = e.currentTarget;
var wpaicgForm = wpaicgStopButton.closest('.wpaicg-prompt-form');
var eventID = wpaicgStopButton.getAttribute('data-event');
var wpaicgSaveResult = wpaicgForm.getElementsByClassName('wpaicg-prompt-save-result')[0];
var wpaicgGenerateBtn = wpaicgForm.getElementsByClassName('wpaicg-generate-button')[0];
wpaicg_PlayGround.eventClose(eventID,wpaicgStopButton,wpaicgSaveResult,wpaicgGenerateBtn);
});
}
}
if(wpaicgSaveButtons && wpaicgSaveButtons.length){
for(var i=0;i < wpaicgSaveButtons.length;i++){
var wpaicgSaveButton = wpaicgSaveButtons[i];
wpaicgSaveButton.addEventListener('click', function (e) {
e.preventDefault();
var wpaicgSaveButton = e.currentTarget;
var wpaicgForm = wpaicgSaveButton.closest('.wpaicg-prompt-form');
var formID = wpaicgForm.getAttribute('data-id');
var wpaicgFormData = window['wpaicgForm'+formID];
var title = wpaicgForm.getElementsByClassName('wpaicg-prompt-post_title')[0].value;
var content = wpaicg_PlayGround.getContent(wpaicgFormData.response,formID);
if (title === '') {
alert('Please insert title');
} else if (content === '') {
alert('Please wait generate content')
} else {
const xhttp = new XMLHttpRequest();
xhttp.open('POST', wpaicgFormData.ajax);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var encodedContent = encodeURIComponent(content);
xhttp.send('action=wpaicg_save_draft_post_extra&title=' + title + '&content=' + encodedContent+'&save_source=promptbase&nonce='+wpaicgFormData.ajax_nonce);
wpaicg_PlayGround.loading.add(wpaicgSaveButton);
xhttp.onreadystatechange = function (oEvent) {
if (xhttp.readyState === 4) {
wpaicg_PlayGround.loading.remove(wpaicgSaveButton);
if (xhttp.status === 200) {
var wpaicg_response = this.responseText;
wpaicg_response = JSON.parse(wpaicg_response);
if (wpaicg_response.status === 'success') {
window.location.href = wpaicgFormData.post+'?post=' + wpaicg_response.id + '&action=edit';
} else {
alert(wpaicg_response.msg);
}
} else {
alert('Something went wrong');
}
}
}
}
});
}
}
if(wpaicgFormsShortcode && wpaicgFormsShortcode.length){
for(var i = 0;i< wpaicgFormsShortcode.length;i++){
var wpaicgFormShortcode = wpaicgFormsShortcode[i];
var wpaicgForm = wpaicgFormShortcode.getElementsByClassName('wpaicg-prompt-form')[0];
wpaicgForm.addEventListener('submit', function (e) {
e.preventDefault();
var wpaicgForm = e.currentTarget;
var formID = wpaicgForm.getAttribute('data-id');
var formSource = wpaicgForm.getAttribute('data-source');
var wpaicgFormData = window['wpaicgForm'+formID];
if (wpaicgFormData && wpaicgFormData.feedback_buttons === 'yes') {
resetFeedbackButtons();
}
var wpaicgMaxToken = wpaicgForm.getElementsByClassName('wpaicg-prompt-max_tokens')[0];
var wpaicgTemperature = wpaicgForm.getElementsByClassName('wpaicg-prompt-temperature')[0];
var wpaicgTopP = wpaicgForm.getElementsByClassName('wpaicg-prompt-top_p')[0];
var wpaicgBestOf = wpaicgForm.getElementsByClassName('wpaicg-prompt-best_of')[0];
var wpaicgFP = wpaicgForm.getElementsByClassName('wpaicg-prompt-frequency_penalty')[0];
var wpaicgPP = wpaicgForm.getElementsByClassName('wpaicg-prompt-presence_penalty')[0];
var wpaicgMaxLines = wpaicgForm.getElementsByClassName('wpaicg-prompt-max-lines')[0];
var wpaicgGenerateBtn = wpaicgForm.getElementsByClassName('wpaicg-generate-button')[0];
var wpaicgSaveResult = wpaicgForm.getElementsByClassName('wpaicg-prompt-save-result')[0];
var wpaicgStop = wpaicgForm.getElementsByClassName('wpaicg-prompt-stop-generate')[0];
var max_tokens = wpaicgMaxToken.value;
var temperature = wpaicgTemperature.value;
var top_p = wpaicgTopP.value;
var best_of = wpaicgBestOf.value;
var frequency_penalty = wpaicgFP.value;
var presence_penalty = wpaicgPP.value;
var error_message = false;
if (max_tokens === '') {
error_message = 'Please enter max tokens';
} else if (parseFloat(max_tokens) < 1 || parseFloat(max_tokens) > 8000) {
error_message = 'Please enter a valid max tokens value between 1 and 8000';
} else if (temperature === '') {
error_message = 'Please enter temperature';
} else if (parseFloat(temperature) < 0 || parseFloat(temperature) > 1) {
error_message = 'Please enter a valid temperature value between 0 and 1';
} else if (top_p === '') {
error_message = 'Please enter Top P';
} else if (parseFloat(top_p) < 0 || parseFloat(top_p) > 1) {
error_message = 'Please enter a valid Top P value between 0 and 1';
} else if (best_of === '') {
error_message = 'Please enter best of';
} else if (parseFloat(best_of) < 1 || parseFloat(best_of) > 20) {
error_message = 'Please enter a valid best of value between 0 and 1';
} else if (frequency_penalty === '') {
error_message = 'Please enter frequency penalty';
} else if (parseFloat(frequency_penalty) < 0 || parseFloat(frequency_penalty) > 2) {
error_message = 'Please enter a valid frequency penalty value between 0 and 2';
} else if (presence_penalty === '') {
error_message = 'Please enter presence penalty';
} else if (parseFloat(presence_penalty) < 0 || parseFloat(presence_penalty) > 2) {
error_message = 'Please enter a valid presence penalty value between 0 and 2';
}
if (error_message) {
alert(error_message);
} else {
if (typeof wpaicgFormData.fields === 'object') {
for (var i = 0; i < wpaicgFormData.fields.length; i++) {
var form_field = wpaicgFormData.fields[i];
var field = wpaicgForm.getElementsByClassName('wpaicg-form-field-' + i)[0];
var field_type = form_field['type'] !== undefined ? form_field['type'] : 'text';
var field_label = form_field['label'] !== undefined ? form_field['label'] : '';
var field_min = form_field['min'] !== undefined ? form_field['min'] : '';
var field_max = form_field['max'] !== undefined ? form_field['max'] : '';
if (field_type !== 'radio' && field_type !== 'checkbox') {
var field_value = field.value;
if (field_type === 'text' || field_type === 'textarea' || field_type === 'email' || field_type === 'url') {
if (field_min !== '' && field_value.length < parseInt(field_min)) {
error_message = field_label + ' minimum ' + field_min + ' characters';
} else if (field_max !== '' && field_value.length > parseInt(field_max)) {
error_message = field_label + ' maximum ' + field_max + ' characters';
} else if (field_type === 'email' && !wpaicg_PlayGround.validate.email(field_value)) {
error_message = field_label + ' must be email address';
} else if (field_type === 'url' && !wpaicg_PlayGround.validate.url(field_value)) {
error_message = field_label + ' must be url';
}
} else if (field_type === 'number') {
if (field_min !== '' && parseFloat(field_value) < parseInt(field_min)) {
error_message = field_label + ' minimum ' + field_min;
} else if (field_max !== '' && parseFloat(field_value) > parseInt(field_max)) {
error_message = field_label + ' maximum ' + field_max;
}
}
} else if (field_type === 'checkbox' || field_type === 'radio') {
var field_inputs = field.getElementsByTagName('input');
var field_checked = false;
if (field_inputs && field_inputs.length) {
for (var y = 0; y < field_inputs.length; y++) {
var field_input = field_inputs[y];
if (field_input.checked) {
field_checked = true;
}
}
}
if (!field_checked) {
error_message = field_label + ' is required';
}
}
}
}
if(error_message){
alert(error_message);
}
else{
if (typeof wpaicgFormData.fields === 'object') {
for (var i = 0; i < wpaicgFormData.fields.length; i++) {
var form_field = wpaicgFormData.fields[i];
var field_type = form_field.type;
var field = wpaicgForm.getElementsByClassName('wpaicg-form-field-' + i)[0];
var field_name = form_field['id'] !== undefined ? form_field['id'] : '';
var field_value;
if (field_type === 'checkbox' || field_type === 'radio') {
field_value = '';
var field_inputs = field.getElementsByTagName('input');
if (field_inputs && field_inputs.length) {
for (var y = 0; y < field_inputs.length; y++) {
var field_input = field_inputs[y];
if (field_input.checked) {
var current_field_value = field_input.value;
if (current_field_value !== undefined && current_field_value !== '') {
field_value += (field_value === '' ? '' : ', ') + current_field_value;
}
}
}
}
} else {
field_value = field.value;
}
var sRegExInput = new RegExp('{' + field_name + '}', 'g');
}
}
let queryString = new URLSearchParams(new FormData(wpaicgForm)).toString();
wpaicg_PlayGround.loading.add(wpaicgGenerateBtn);
wpaicgSaveResult.style.display = 'none';
wpaicgStop.style.display = 'inline';
wpaicg_PlayGround.setContent(wpaicgFormData.response,formID,'');
queryString += '&source_stream='+formSource+'&nonce='+wpaicgFormData.ajax_nonce;
var eventID = Math.ceil(Math.random()*1000000);
// Set the eventID as a data attribute on all thumbs up buttonsß
for (var i = 0; i < wpaicgThumbsUpButtons.length; i++) {
wpaicgThumbsUpButtons[i].setAttribute('data-eventid', eventID);
}
// Set the eventID as a data attribute on all thumbs down buttons
for (var i = 0; i < wpaicgThumbsDownButtons.length; i++) {
wpaicgThumbsDownButtons[i].setAttribute('data-eventid', eventID);
}
wpaicgStop.setAttribute('data-event',eventID);
window['eventGenerator'+eventID] = new EventSource(wpaicgFormData.event + '&' + queryString);
if(formSource === 'form'){
queryString += '&action=wpaicg_form_log';
}
else{
queryString += '&action=wpaicg_prompt_log';
}
wpaicg_PlayGround.process(queryString,eventID,wpaicgFormData,formID,wpaicgStop,wpaicgSaveResult,wpaicgGenerateBtn,wpaicgMaxLines);
}
}
})
}
// Function to handle the feedback button click
var handleFeedbackButtonClick = function(e) {
e.preventDefault();
var button = e.currentTarget;
var formID = button.getAttribute('data-id');
var eventID = button.getAttribute('data-eventid');
var feedbackType = button.id.replace('wpaicg-prompt-', '');
var wpaicgFormData = window['wpaicgForm' + formID];
var modal = jQuery('#wpaicg_feedbackModal');
var datasource = wpaicgFormData.datasource;
var textareaID = wpaicgFormData.feedbackID;
// Update the emoji in the modal
modal.find('.emoji').text(feedbackType == 'thumbs_up' ? '👍' : '👎');
modal.fadeIn();
jQuery('.wpaicg_feedbackModal-overlay').fadeIn();
// Define the action parameter
var myaction = (datasource === 'promptbase') ? 'wpaicg_save_prompt_feedback' : 'wpaicg_save_feedback';
// Handle the submit feedback button click
jQuery('#wpaicg_submitFeedback').off('click').on('click', function() {
modal.find('textarea').attr('id', textareaID);
var comment = jQuery('#' + textareaID).val();
console.log('comment: ' + comment);
var responseText = wpaicgPlayGround.getContent(wpaicgFormData.response, formID);
// Replace with space
responseText = responseText.replace(/ /g, ' ');
// Replace single occurrences of or with a newline
responseText = responseText.replace(/ /g, '\r\n');
// Replace double occurrences of
or
with double newline
responseText = responseText.replace(/\r\n\r\n/g, '\r\n\r\n');
// Send AJAX request to save feedback
const xhttp = new XMLHttpRequest();
xhttp.open('POST', wpaicgFormData.ajax);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send('action=' + myaction + '&formID=' + formID + '&feedback=' + feedbackType + '&comment=' + encodeURIComponent(comment) + '&nonce=' + wpaicgFormData.ajax_nonce + '&formname=' + wpaicgFormData.name + '&sourceID=' + wpaicgFormData.sourceID + '&response=' + responseText + '&eventID=' + eventID);
xhttp.onreadystatechange = function(oEvent) {
if (xhttp.readyState === 4) {
if (xhttp.status === 200) {
var response = JSON.parse(xhttp.responseText);
if (response.status === 'success') {
// Upon successful feedback submission:
// Disable the clicked feedback button and hide the other one
if (feedbackType === 'thumbs_up') {
document.getElementById('wpaicg-prompt-thumbs_up').disabled = true;
document.getElementById('wpaicg-prompt-thumbs_down').style.display = 'none';
} else {
document.getElementById('wpaicg-prompt-thumbs_down').disabled = true;
document.getElementById('wpaicg-prompt-thumbs_up').style.display = 'none';
}
// clear the feedback text area
jQuery('#' + textareaID).val('');
} else {
alert(response.msg); // Show the error message returned from the backend
}
} else {
alert('Error: ' + xhttp.status + ' - ' + xhttp.statusText + '\n\n' + xhttp.responseText);
}
modal.fadeOut();
jQuery('.wpaicg_feedbackModal-overlay').fadeOut();
}
}
});
// Handle the close modal button click
jQuery('#closeFeedbackModal').off('click').on('click', function() {
modal.fadeOut();
jQuery('.wpaicg_feedbackModal-overlay').fadeOut();
});
};
// Attach event listeners
for (var k = 0; k < wpaicgThumbsUpButtons.length; k++) {
wpaicgThumbsUpButtons[k].addEventListener('click', handleFeedbackButtonClick);
}
for (var k = 0; k < wpaicgThumbsDownButtons.length; k++) {
wpaicgThumbsDownButtons[k].addEventListener('click', handleFeedbackButtonClick);
}
}
},
process: function(queryString,eventID,wpaicgFormData,formID,wpaicgStop,wpaicgSaveResult,wpaicgGenerateBtn,wpaicgMaxLines){
var wpaicg_PlayGround = this;
var wpaicg_break_newline = wpaicgParams.logged_in === "1" ? '
' : '\n';
var startTime = new Date();
var wpaicg_response_events = 0;
var wpaicg_newline_before = false;
var prompt_response = '';
var wpaicg_limited_token = false;
var count_line = 0;
var wpaicg_limitLines = parseFloat(wpaicgMaxLines.value);
var currentContent = '';
window['eventGenerator'+eventID].onmessage = function (e) {
currentContent = wpaicg_PlayGround.getContent(wpaicgFormData.response,formID);
if (e.data === "[LIMITED]") {
console.log('Limited token');
wpaicg_limited_token = true;
count_line += 1;
wpaicg_PlayGround.setContent(wpaicgFormData.response,formID,currentContent + wpaicg_break_newline);
wpaicg_response_events = 0;
} else if (e.data.includes("GoogleError")) {
var error_message = e.data.match(/GoogleError: (.*)/);
if (error_message) {
alert('Error: ' + error_message[1]);
} else {
alert('Unknown error occurred');
}
count_line += 1;
wpaicg_PlayGround.setContent(wpaicgFormData.response,formID,currentContent + wpaicg_break_newline);
wpaicg_response_events = 0;
}
// else if data is DONE then close the event
else if (e.data === "[DONE]") {
count_line += 1;
wpaicg_PlayGround.setContent(wpaicgFormData.response,formID,currentContent + wpaicg_break_newline);
wpaicg_response_events = 0;
}
else {
var result = JSON.parse(e.data);
// Check if the response contains the finish_reason property and if it's set to "stop"
var hasFinishReason = result.choices &&
result.choices[0] &&
(result.choices[0].finish_reason === "stop" ||
result.choices[0].finish_reason === "length") ||
(result.choices[0].finish_details &&
result.choices[0].finish_details.type === "stop");
if (hasFinishReason) {
count_line += 1;
wpaicg_PlayGround.setContent(wpaicgFormData.response,formID,currentContent + wpaicg_break_newline);
wpaicg_response_events = 0;
}
var content_generated = '';
if (result.error !== undefined) {
content_generated = result.error.message;
} else {
content_generated = result.choices[0].delta !== undefined ? (result.choices[0].delta.content !== undefined ? result.choices[0].delta.content : '') : result.choices[0].text;
}
prompt_response += content_generated;
// Preserve leading/trailing spaces when appending
if(content_generated.trim() === '' && content_generated.includes(' ')) {
content_generated = ' ';
}
// if response is not text area then if content_generated is /n then add
if(wpaicgFormData.response !== 'textarea'){
if(content_generated === '\n'){
content_generated = ' ';
}
}
if ((content_generated === '\n' || content_generated === ' \n' || content_generated === '.\n' || content_generated === '\n\n' || content_generated === '"\n') && wpaicg_response_events > 0 && currentContent !== '') {
if (!wpaicg_newline_before) {
wpaicg_newline_before = true;
wpaicg_PlayGround.setContent(wpaicgFormData.response,formID,currentContent + wpaicg_break_newline);
}
}
else if(content_generated.indexOf("\n") > -1 && wpaicg_response_events > 0 && currentContent !== ''){
if (!wpaicg_newline_before) {
wpaicg_newline_before = true;
if(wpaicgFormData.response === 'textarea'){
if(!wpaicg_PlayGround.editor(formID)){
content_generated = content_generated.replace(/\n/g,' ');
}
}
else{
content_generated = content_generated.replace(/\n/g,' ');
}
wpaicg_PlayGround.setContent(wpaicgFormData.response,formID,currentContent + content_generated);
}
}
else if (content_generated === '\n' && wpaicg_response_events === 0 && currentContent === '') {
} else {
wpaicg_newline_before = false;
wpaicg_response_events += 1;
wpaicg_PlayGround.setContent(wpaicgFormData.response,formID,currentContent + content_generated);
}
}
if (count_line === wpaicg_limitLines) {
if(!wpaicg_limited_token) {
let endTime = new Date();
let timeDiff = endTime - startTime;
timeDiff = timeDiff / 1000;
queryString += '&prompt_id=' + wpaicgFormData.id + '&prompt_name=' + wpaicgFormData.name + '&prompt_response=' + encodeURIComponent(prompt_response) + '&duration=' + timeDiff + '&_wpnonce=' + wpaicgFormData.nonce + '&source_id=' + wpaicgFormData.sourceID + '&eventID=' + eventID;
const xhttp = new XMLHttpRequest();
xhttp.open('POST', wpaicgFormData.ajax);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send(queryString);
xhttp.onreadystatechange = function (oEvent) {
if (xhttp.readyState === 4) {
}
}
}
wpaicg_PlayGround.eventClose(eventID,wpaicgStop,wpaicgSaveResult,wpaicgGenerateBtn,wpaicg_limited_token);
}
}
},
editor: function (form_id){
var basicEditor = true;
if(wpaicg_prompt_logged){
var editor = tinyMCE.get('wpaicg-prompt-result-'+form_id);
if ( document.getElementById('wp-wpaicg-prompt-result-'+form_id+'-wrap').classList.contains('tmce-active') && editor ) {
basicEditor = false;
}
}
return basicEditor;
},
setContent: function (type,form_id,value){
if(type === 'textarea') {
// Check if the output is for a textarea and convert back to a space
value = value.replace(/ /g, ' ');
if (this.editor(form_id)) {
document.getElementById('wpaicg-prompt-result-'+form_id).value = value;
} else {
var editor = tinyMCE.get('wpaicg-prompt-result-'+form_id);
editor.setContent(value);
}
}
else{
document.getElementById('wpaicg-prompt-result-'+form_id).innerHTML = value;
}
},
getContent: function (type,form_id){
if(type === 'textarea') {
if (this.editor(form_id)) {
return document.getElementById('wpaicg-prompt-result-'+form_id).value
} else {
var editor = tinyMCE.get('wpaicg-prompt-result-'+form_id);
var content = editor.getContent();
content = content.replace(/<\/?p(>|$)/g, "");
return content;
}
}
else return document.getElementById('wpaicg-prompt-result-'+form_id).innerHTML;
},
loading: {
add: function (btn){
btn.setAttribute('disabled','disabled');
btn.innerHTML += '';
},
remove: function (btn){
btn.removeAttribute('disabled');
btn.removeChild(btn.getElementsByTagName('span')[0]);
}
},
eventClose: function (eventID,btn,btnResult,btn_generator,wpaicg_limited_token){
btn.style.display = 'none';
if(!wpaicg_limited_token) {
btnResult.style.display = 'block';
}
this.loading.remove(btn_generator);
window['eventGenerator'+eventID].close();
},
validate: {
email: function (email){
return String(email)
.toLowerCase()
.match(
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
);
},
url: function (url){
try {
new URL(url);
return true;
} catch (err) {
return false;
}
}
}
}
wpaicgPlayGround.init();
;
let wpaicgInit = {
wpaicgImageForm: null,
wpaicgImageGenerated: null,
wpaicgImageGrid: null,
wpaicgImageLoading: null,
wpaicgImageSaveBtn: null,
wpaicgImageMessage: null,
wpaicgImageConvertBar: null,
wpaicg_image_modal_close: null,
wpaicgNumberImages: null,
wpaicgImageGenerateBtn: null,
wpaicgImageSelectAll: null,
wpaicgStartTime: null,
init: function (){
this.search();
this.image();
return this;
},
search: function(){
let that = this;
let wpaicgSearchs = document.getElementsByClassName('wpaicg-search');
if(wpaicgSearchs && wpaicgSearchs.length){
for(let i=0;i';
for(let i = 0; i < wpaicg_response.source.length; i++){
let item = wpaicg_response.source[i];
wpaicgSearchSource.innerHTML += item;
}
}
}
else{
wpaicgSearchResult.innerHTML = '
'+wpaicgParams.languages.no_result+'
';
}
}
else{
wpaicgSearchResult.innerHTML = '
'+wpaicg_response.msg+'
';
}
}
else{
wpaicgSearchResult.innerHTML = '
'+wpaicgParams.languages.wrong+'
';
}
}
else{
wpaicgSearchResult.innerHTML = '
'+wpaicgParams.languages.wrong+'
';
}
}
}
}
},
imageModal: function (id){
var item = document.getElementById('wpaicg-image-item-'+id);
var alt = item.querySelectorAll('.wpaicg-image-item-alt')[0].value;
var title = item.querySelectorAll('.wpaicg-image-item-title')[0].value;
var caption = item.querySelectorAll('.wpaicg-image-item-caption')[0].value;
var description = item.querySelectorAll('.wpaicg-image-item-description')[0].value;
var url = item.querySelectorAll('input[type=checkbox]')[0].value;
document.querySelectorAll('.wpaicg_modal_content')[0].innerHTML = '';
document.querySelectorAll('.wpaicg-overlay')[0].style.display = 'block';
document.querySelectorAll('.wpaicg_modal')[0].style.display = 'block';
document.querySelectorAll('.wpaicg_modal_title')[0].innerHTML = wpaicgParams.languages.edit_image;
var html = '
';
html += '
';
html += '
';
html += '';
html += '';
html += '';
html += '';
html += '';
html += '
';
html += '
';
document.querySelectorAll('.wpaicg_modal_content')[0].innerHTML = html;
wpaicgImageCloseModal();
},
image_generator: function(data, start, max, multi_steps,form_action){
let that = this;
const xhttp = new XMLHttpRequest();
xhttp.open('POST', wpaicgParams.ajax_url);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send(data);
xhttp.onreadystatechange = function(oEvent) {
if (xhttp.readyState === 4) {
if (xhttp.status === 200) {
var wpaicg_response = this.responseText;
res = JSON.parse(wpaicg_response);
if(res.status === 'success'){
for(var idx = 0; idx < res.imgs.length; idx++){
let idImageBox = idx;
if(multi_steps){
idImageBox = start -1;
}
var img = res.imgs[idx];
var html = '
';
if(wpaicgParams.logged_in === '1') {
html += '';
}
html += '';
html += '';
html += '';
html += '';
if(wpaicgParams.logged_in === '1') {
html += '';
}
else {
html += '';
}
html += '
';
that.wpaicgImageGrid.innerHTML += html;
}
if(multi_steps){
if(start === max){
wpaicgImageRmLoading(that.wpaicgImageGenerateBtn);
that.wpaicgImageSelectAll.classList.remove('selectall')
that.wpaicgImageSelectAll.innerHTML = wpaicgSelectAllText;
that.wpaicgImageSelectAll.style.display = 'block';
that.wpaicgImageLoading.style.display = 'none';
that.wpaicgImageSaveBtn.style.display = 'block';
}
else{
that.image_generator(data, start+1, max, multi_steps,form_action)
}
}
else{
if(form_action === 'wpaicg_image_generator'){
let endTime = new Date();
let timeDiff = endTime - that.wpaicgStartTime;
timeDiff = timeDiff/1000;
data += '&action=wpaicg_image_log&duration='+timeDiff+'&_wpnonce_image_log='+wpaicgImageNonce+'&shortcode=['+wpaicgImageShortcode+']&source_id='+wpaicgImageSourceID;
const xhttp = new XMLHttpRequest();
xhttp.open('POST', wpaicgParams.ajax_url);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send(data);
xhttp.onreadystatechange = function (oEvent) {
if (xhttp.readyState === 4) {
}
}
}
wpaicgImageRmLoading(that.wpaicgImageGenerateBtn);
that.wpaicgImageSelectAll.classList.remove('selectall')
that.wpaicgImageSelectAll.innerHTML = '';
that.wpaicgImageSelectAll.style.display = 'block';
that.wpaicgImageLoading.style.display = 'none';
that.wpaicgImageSaveBtn.style.display = 'block';
}
}
else{
wpaicgImageRmLoading(that.wpaicgImageGenerateBtn);
that.wpaicgImageLoading.style.display = 'none';
let errorMessage = document.createElement('div');
errorMessage.style.color = '#f00';
errorMessage.classList.add('wpaicg-image-error');
errorMessage.innerHTML = res.msg;
that.wpaicgImageGenerated.prepend(errorMessage);
setTimeout(function (){
errorMessage.remove();
},3000);
}
}
else{
that.wpaicgImageLoading.style.display = 'none';
wpaicgImageRmLoading(that.wpaicgImageGenerateBtn);
alert('Something went wrong');
}
}
}
},
save_image: function (items,start){
let that = this;
if(start >= items.length){
that.wpaicgImageConvertBar.getElementsByTagName('small')[0].innerHTML = items.length+'/'+items.length;
that.wpaicgImageConvertBar.getElementsByTagName('span')[0].style.width = '100%';
that.wpaicgImageMessage.innerHTML = wpaicgParams.languages.save_image_success;
wpaicgImageRmLoading(that.wpaicgImageSaveBtn);
setTimeout(function (){
that.wpaicgImageMessage.innerHTML = '';
},2000)
}
else{
var id = items[start];
var item = document.getElementById('wpaicg-image-item-'+id);
var data = 'action=wpaicg_save_image_media';
data += '&image_alt='+item.querySelectorAll('.wpaicg-image-item-alt')[0].value;
data += '&image_title='+item.querySelectorAll('.wpaicg-image-item-title')[0].value;
data += '&image_caption='+item.querySelectorAll('.wpaicg-image-item-caption')[0].value;
data += '&image_description='+item.querySelectorAll('.wpaicg-image-item-description')[0].value;
data += '&image_url='+encodeURIComponent(item.querySelectorAll('.wpaicg-image-item-select')[0].value);
data +='&nonce='+wpaicgImageSaveNonce;
const xhttp = new XMLHttpRequest();
xhttp.open('POST', wpaicgParams.ajax_url);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send(data);
xhttp.onreadystatechange = function(oEvent) {
if (xhttp.readyState === 4) {
if (xhttp.status === 200) {
var wpaicg_response = this.responseText;
res = JSON.parse(wpaicg_response);
if(res.status === 'success'){
var currentPos = start+1;
var percent = Math.ceil(currentPos*100/items.length);
that.wpaicgImageConvertBar.getElementsByTagName('small')[0].innerHTML = currentPos+'/'+items.length;
that.wpaicgImageConvertBar.getElementsByTagName('span')[0].style.width = percent+'%';
that.save_image(items, start+1);
}
else{
that.wpaicgImageConvertBar.classList.add('wpaicg_error');
wpaicgImageRmLoading(that.wpaicgImageSaveBtn);
alert(res.msg);
}
} else {
alert(wpaicgParams.languages.wrong);
that.wpaicgImageConvertBar.classList.add('wpaicg_error');
wpaicgImageRmLoading(that.wpaicgImageSaveBtn);
}
}
}
}
},
image: function (){
let that = this;
let wpaicgImageForm = document.getElementById('wpaicg-image-generator-form');
if(wpaicgImageForm){
this.wpaicgImageForm = wpaicgImageForm;
this.wpaicgImageGenerated = wpaicgImageForm.getElementsByClassName('image-generated')[0];
this.wpaicgImageGrid = wpaicgImageForm.getElementsByClassName('image-grid')[0];
this.wpaicgImageLoading = wpaicgImageForm.getElementsByClassName('image-generate-loading')[0];
this.wpaicgImageSaveBtn = wpaicgImageForm.getElementsByClassName('image-generator-save')[0];
this.wpaicgImageMessage = wpaicgImageForm.getElementsByClassName('wpaicg_message')[0];
this.wpaicgImageConvertBar = wpaicgImageForm.getElementsByClassName('wpaicg-convert-bar')[0];
this.wpaicg_image_modal_close = wpaicgImageForm.getElementsByClassName('wpaicg_image_modal_close');
this.wpaicgNumberImages = wpaicgImageForm.querySelector('select[name=num_images]');
this.wpaicgImageGenerateBtn = wpaicgImageForm.getElementsByClassName('wpaicg_button_generate')[0];
this.wpaicgImageSelectAll = wpaicgImageForm.getElementsByClassName('wpaicg_image_select_all')[0];
this.wpaicgImageSaveBtn.addEventListener('click', function (e) {
var items = [];
document.querySelectorAll('.wpaicg-image-item input[type=checkbox]').forEach(function (item) {
if (item.checked) {
items.push(item.getAttribute('data-id'));
}
});
if (items.length) {
that.wpaicgImageConvertBar.style.display = 'block';
that.wpaicgImageConvertBar.classList.remove('wpaicg_error');
that.wpaicgImageConvertBar.getElementsByTagName('small')[0].innerHTML = '0/' + items.length;
that.wpaicgImageConvertBar.getElementsByTagName('span')[0].style.width = 0;
that.wpaicgImageMessage.innerHTML = '';
wpaicgImageLoadingEffect(that.wpaicgImageSaveBtn);
that.save_image(items, 0);
} else {
alert(wpaicgParams.languages.select_save_error);
}
})
this.wpaicgImageSelectAll.addEventListener('click', function (e) {
if (that.wpaicgImageSelectAll.classList.contains('selectall')) {
that.wpaicgImageSelectAll.classList.remove('selectall');
that.wpaicgImageSelectAll.innerHTML = wpaicgSelectAllText;
document.querySelectorAll('.wpaicg-image-item input[type=checkbox]').forEach(function (item) {
item.checked = false;
})
} else {
that.wpaicgImageSelectAll.classList.add('selectall');
that.wpaicgImageSelectAll.innerHTML = wpaicgParams.languages.unselect;
document.querySelectorAll('.wpaicg-image-item input[type=checkbox]').forEach(function (item) {
item.checked = true;
})
}
});
wpaicgImageForm.addEventListener('submit', function (e) {
e.preventDefault();
var form_action = wpaicgImageForm.querySelectorAll('input[name=action]')[0].value;
if (form_action === 'wpaicg_image_stable_diffusion') {
that.wpaicgNumberImages = wpaicgImageForm.querySelector('select[name=num_outputs]');
}
var num_images = parseInt(that.wpaicgNumberImages.value);
if (num_images > 0) {
var wpaicg_error = false;
if (form_action === 'wpaicg_image_stable_diffusion') {
var prompt_strength = parseFloat(document.getElementById('prompt_strength').value);
var num_inference_steps = parseFloat(document.getElementById('num_inference_steps').value);
var guidance_scale = parseFloat(document.getElementById('guidance_scale').value);
if (prompt_strength < 0 || prompt_strength > 1) {
wpaicg_error = wpaicgParams.languages.prompt_strength
} else if (num_inference_steps < 1 || num_inference_steps > 500) {
wpaicg_error = wpaicgParams.languages.num_inference_steps
} else if (guidance_scale < 1 || guidance_scale > 20) {
wpaicg_error = wpaicgParams.languages.guidance_scale
}
}
if (wpaicg_error) {
alert(wpaicg_error);
} else {
const queryString = new URLSearchParams(new FormData(wpaicgImageForm)).toString();
that.wpaicgImageSaveBtn.style.display = 'none';
wpaicgImageLoadingEffect(that.wpaicgImageGenerateBtn);
that.wpaicgImageConvertBar.style.display = 'none';
that.wpaicgImageLoading.style.display = 'flex';
that.wpaicgImageGrid.innerHTML = '';
that.wpaicgImageSelectAll.style.display = 'none';
let wpaicgImageError = document.getElementsByClassName('wpaicg-image-error');
if (wpaicgImageError.length) {
wpaicgImageError[0].remove();
}
if (form_action === 'wpaicg_image_stable_diffusion') {
that.image_generator(queryString, 1, num_images, true, form_action);
} else {
that.wpaicgStartTime = new Date();
that.image_generator(queryString, 1, num_images, false, form_action);
}
}
} else {
alert(wpaicgParams.languages.error_image)
}
return false;
});
}
}
}
window['wpaicgInit'] = wpaicgInit.init();
;
function loadConversations() {
var clientId = localStorage.getItem('wpaicg_chat_client_id');
if (!clientId) {
// Show conversation starters for each chat interface when there are no conversations
showAllConversationStarters();
return;
}
// Load conversations for both chat interfaces
loadChatInterface('.wpaicg-chat-shortcode', 'shortcode', clientId);
loadChatInterface('.wpaicg-chatbox', 'widget', clientId);
}
function showAllConversationStarters() {
// Target both interfaces
var containers = ['.wpaicg-chat-shortcode', '.wpaicg-chatbox'];
containers.forEach(containerSelector => {
var chatContainers = document.querySelectorAll(containerSelector);
chatContainers.forEach(chatContainer => {
showConversationStarters(chatContainer);
});
});
}
function loadChatInterface(containerSelector, type, clientId) {
var chatContainers = document.querySelectorAll(containerSelector);
chatContainers.forEach(chatContainer => {
// Read autoload chat conversations setting, default to '0' if not set
var autoloadConversations = chatContainer.getAttribute('data-autoload_chat_conversations');
if (autoloadConversations === null) {
autoloadConversations = '1'; // Default value if attribute does not exist
}
// Fetch the bot ID based on the type
var botId = chatContainer.getAttribute('data-bot-id') || '0';
// Determine the history key based on whether it's a custom bot or not
var historyKey = botId !== '0'
? `wpaicg_chat_history_custom_bot_${botId}_${clientId}`
: `wpaicg_chat_history_${type}_${clientId}`;
if (autoloadConversations === '0') {
// Retrieve and display the chat history
var chatHistory = localStorage.getItem(historyKey);
if (chatHistory) {
chatHistory = JSON.parse(chatHistory);
// Convert old format messages to new format
chatHistory = chatHistory.map(message => {
if (typeof message === 'string') {
return {
id: '', // Old messages won't have an ID, so leave it empty
text: message
};
}
return message; // Leave new format messages as is
});
// Save the updated history back to localStorage in the new format
localStorage.setItem(historyKey, JSON.stringify(chatHistory));
var chatBox = chatContainer.querySelector('.wpaicg-chatbox-messages, .wpaicg-chat-shortcode-messages'); // Generalized selector
if (!chatBox) {
console.error(`No chat box found within the ${type} container.`);
return;
}
chatBox.innerHTML = ''; // Clears the chat box
chatHistory.forEach(message => {
reconstructMessage(chatBox, message, chatContainer);
});
chatBox.appendChild(document.createElement('br'));
requestAnimationFrame(() => {
requestAnimationFrame(() => {
chatBox.scrollTop = chatBox.scrollHeight; // Scrolls to the bottom
});
});
hideConversationStarter(chatContainer);
} else {
showConversationStarters(chatContainer);
}
} else {
showConversationStarters(chatContainer);
}
});
}
function reconstructMessage(chatBox, message, chatContainer) {
var messageElement = document.createElement('li');
// Check if message is an object and has a 'text' property
var messageText = typeof message === 'object' && message.text ? message.text : message;
// Determine if the message is from the user or AI
var isUserMessage = messageText.startsWith('Human:');
var isWidget = chatContainer.classList.contains('wpaicg-chatbox');
// Apply the correct class based on message source and container type
if (isUserMessage) {
messageElement.className = isWidget ? 'wpaicg-chat-user-message' : 'wpaicg-user-message';
} else {
messageElement.className = isWidget ? 'wpaicg-chat-ai-message' : 'wpaicg-ai-message';
}
// Format the message content
var formattedMessage = messageText.replace('Human:', '').replace('AI:', '').replace(/\n/g, ' ');
var userBgColor = chatContainer.getAttribute('data-user-bg-color');
var aiBgColor = chatContainer.getAttribute('data-ai-bg-color');
var fontSize = chatContainer.getAttribute('data-fontsize');
var fontColor = chatContainer.getAttribute('data-color');
var useAvatar = parseInt(chatContainer.getAttribute('data-use-avatar')) || 0;
var userAvatar = chatContainer.getAttribute('data-user-avatar');
var aiAvatar = chatContainer.getAttribute('data-ai-avatar');
var displayName = isUserMessage ? (useAvatar ? `` : 'You:') : (useAvatar ? `` : 'AI:');
messageElement.style.backgroundColor = isUserMessage ? userBgColor : aiBgColor;
messageElement.style.color = fontColor;
messageElement.style.fontSize = fontSize;
messageElement.innerHTML = `
${displayName}${formattedMessage}
`;
chatBox.appendChild(messageElement);
}
function hideConversationStarter(chatContainer) {
var starters = chatContainer.querySelectorAll('.wpaicg-conversation-starters');
starters.forEach(starter => starter.style.display = 'none');
}
function showConversationStarters(chatContainer) {
const startersContainer = chatContainer.querySelector('.wpaicg-conversation-starters');
if (startersContainer) { // Check if the container exists
startersContainer.style.visibility = 'visible'; // Make the container visible if it exists
const starters = startersContainer.querySelectorAll('.wpaicg-conversation-starter');
starters.forEach((starter, index) => {
setTimeout(() => {
starter.style.opacity = "1";
starter.style.transform = "translateY(0)";
}, index * 150); // Staggered appearance
});
}
}
function wpaicgChatShortcodeSize() {
var wpaicgWindowWidth = window.innerWidth;
var wpaicgWindowHeight = window.innerHeight;
var chatShortcodes = document.getElementsByClassName('wpaicg-chat-shortcode');
if (chatShortcodes !== null && chatShortcodes.length) {
for (var i = 0; i < chatShortcodes.length; i++) {
var chatShortcode = chatShortcodes[i];
var parentChat = chatShortcode.parentElement;
var parentWidth = parentChat.offsetWidth;
var chatWidth = chatShortcode.getAttribute('data-width');
var chatHeight = chatShortcode.getAttribute('data-height');
var chatFooter = chatShortcode.getAttribute('data-footer') === 'true';
var chatBar = chatShortcode.getAttribute('data-has-bar');
var chatRounded = parseFloat(chatShortcode.getAttribute('data-chat_rounded'));
var textRounded = parseFloat(chatShortcode.getAttribute('data-text_rounded'));
var textHeight = parseFloat(chatShortcode.getAttribute('data-text_height'));
var textInput = chatShortcode.getElementsByClassName('wpaicg-chat-shortcode-typing')[0];
textInput.style.height = textHeight + 'px';
textInput.style.borderRadius = textRounded + 'px';
chatShortcode.style.borderRadius = chatRounded + 'px';
chatShortcode.style.overflow = 'hidden';
chatWidth = chatWidth !== null ? chatWidth : '350';
chatHeight = chatHeight !== null ? chatHeight : '400';
if (chatShortcode.classList.contains('wpaicg-fullscreened')) {
parentWidth = wpaicgWindowWidth;
chatWidth = resolveDimension(chatWidth, parentWidth);
chatHeight = resolveDimension(chatHeight, wpaicgWindowHeight);
var chatPreviewBot = chatShortcode.closest('.wpaicg-bot-preview');
if (chatPreviewBot && chatPreviewBot.offsetWidth < chatWidth) {
chatWidth = chatPreviewBot.offsetWidth;
}
chatShortcode.style.width = chatWidth + 'px';
chatShortcode.style.maxWidth = chatWidth + 'px';
chatShortcode.style.height = chatHeight + 'px';
chatShortcode.style.maxHeight = chatHeight + 'px';
chatShortcode.style.marginTop = 0;
var deduceHeight = 69;
if (chatFooter) {
deduceHeight += 60; // Adjusted for footer height
}
if (chatBar) {
deduceHeight += 30;
}
var chatMessages = chatShortcode.getElementsByClassName('wpaicg-chat-shortcode-messages')[0];
chatMessages.style.height = (chatHeight - deduceHeight - textHeight) + 'px';
// Scroll to the bottom
chatMessages.scrollTop = chatMessages.scrollHeight;
} else {
// Original non-fullscreen logic
if (chatWidth.indexOf('%') < 0) {
if (chatWidth.indexOf('px') < 0) {
chatWidth = parseFloat(chatWidth);
} else {
chatWidth = parseFloat(chatWidth.replace(/px/g, ''));
}
} else {
chatWidth = parseFloat(chatWidth.replace(/%/g, ''));
if (chatWidth < 100) {
chatWidth = chatWidth * parentWidth / 100;
} else {
chatWidth = '';
}
}
if (chatHeight.indexOf('%') < 0) {
if (chatHeight.indexOf('px') < 0) {
chatHeight = parseFloat(chatHeight);
} else {
chatHeight = parseFloat(chatHeight.replace(/px/g, ''));
}
} else {
chatHeight = parseFloat(chatHeight.replace(/%/g, ''));
chatHeight = chatHeight * wpaicgWindowHeight / 100;
}
if (chatWidth !== '') {
chatShortcode.style.width = chatWidth + 'px';
chatShortcode.style.maxWidth = chatWidth + 'px';
} else {
chatShortcode.style.width = '';
chatShortcode.style.maxWidth = '';
}
if (chatShortcode.classList.contains('wpaicg-fullscreened')) {
chatShortcode.style.marginTop = 0;
} else {
chatShortcode.style.marginTop = '';
}
var chatMessages = chatShortcode.getElementsByClassName('wpaicg-chat-shortcode-messages')[0];
var deduceHeight = 69;
if (chatFooter) {
deduceHeight += 60; // Adjusted for footer height
}
if (chatBar) {
deduceHeight += 30;
}
chatMessages.style.height = (chatHeight - deduceHeight) + 'px';
}
}
}
}
function wpaicgChatBoxSize() {
var wpaicgWindowWidth = window.innerWidth;
var wpaicgWindowHeight = window.innerHeight;
var chatWidgets = document.getElementsByClassName('wpaicg_chat_widget_content');
var chatPreviewBox = document.getElementsByClassName('wpaicg-chatbox-preview-box');
if (chatWidgets.length) {
for (var i = 0; i < chatWidgets.length; i++) {
var chatWidget = chatWidgets[i];
var chatbox = chatWidget.getElementsByClassName('wpaicg-chatbox')[0];
var chatWidth = chatbox.getAttribute('data-width') || '350';
var chatHeight = chatbox.getAttribute('data-height') || '400';
var chatFooter = chatbox.getAttribute('data-footer');
var chatboxBar = chatbox.getElementsByClassName('wpaicg-chatbox-action-bar');
var textHeight = parseFloat(chatbox.getAttribute('data-text_height'));
// Adjust dimensions for the preview box if present
if (chatPreviewBox.length && chatPreviewBox[0].offsetWidth) {
wpaicgWindowWidth = chatPreviewBox[0].offsetWidth;
}
// Calculate dimensions dynamically
chatWidth = resolveDimension(chatWidth, wpaicgWindowWidth);
chatHeight = resolveDimension(chatHeight, wpaicgWindowHeight);
chatbox.style.width = chatWidth + 'px';
chatbox.style.height = chatHeight + 'px';
chatWidget.style.width = chatWidth + 'px';
chatWidget.style.height = chatHeight + 'px';
if (chatPreviewBox.length) {
chatPreviewBox[0].style.height = (chatHeight + 125) + 'px'; // Adjusting preview box height
}
// Adjusting heights for content and message areas
var actionBarHeight = chatboxBar.length ? 40 : 0; // Assuming action bar height is 40
var footerHeight = chatFooter ? 60 : 0; // Adjusting footer height if enabled
var contentHeight = chatHeight - textHeight - actionBarHeight - footerHeight - 20; // Including some padding
var messagesHeight = contentHeight - 20; // Additional space for inner padding or margins
var chatboxContent = chatWidget.getElementsByClassName('wpaicg-chatbox-content')[0];
var chatboxMessages = chatWidget.getElementsByClassName('wpaicg-chatbox-messages')[0];
chatboxContent.style.height = contentHeight + 'px';
chatboxMessages.style.height = messagesHeight + 'px';
// Ensure last message is visible
chatboxMessages.scrollTop = chatboxMessages.scrollHeight;
}
}
}
function resolveDimension(value, totalSize) {
if (value.includes('%')) {
return parseFloat(value) / 100 * totalSize;
} else if (value.includes('px')) {
return parseFloat(value.replace('px', ''));
}
return parseFloat(value); // Default to parsing the value as pixels if no units are specified
}
function wpaicgChatInit() {
let wpaicgMicIcon = '';
let wpaicgStopIcon = '';
var wpaicgChatStream;
var wpaicgChatRec;
var wpaicgInput;
var wpaicgChatAudioContext = window.AudioContext || window.webkitAudioContext;
var wpaicgaudioContext;
var wpaicgMicBtns = document.querySelectorAll('.wpaicg-mic-icon');
var wpaicgChatTyping = document.querySelectorAll('.wpaicg-chatbox-typing');
var wpaicgShortcodeTyping = document.querySelectorAll('.wpaicg-chat-shortcode-typing');
var wpaicgChatSend = document.querySelectorAll('.wpaicg-chatbox-send');
var wpaicgShortcodeSend = document.querySelectorAll('.wpaicg-chat-shortcode-send');
var wpaicgChatFullScreens = document.getElementsByClassName('wpaicg-chatbox-fullscreen');
var wpaicgChatCloseButtons = document.getElementsByClassName('wpaicg-chatbox-close-btn');
var wpaicgChatDownloadButtons = document.getElementsByClassName('wpaicg-chatbox-download-btn');
var wpaicg_chat_widget_toggles = document.getElementsByClassName('wpaicg_toggle');
var wpaicg_chat_widgets = document.getElementsByClassName('wpaicg_chat_widget');
var imageInputThumbnail = null; // Variable to store the image thumbnail
function setupConversationStarters() {
const starters = document.querySelectorAll('.wpaicg-conversation-starter');
starters.forEach(starter => {
starter.addEventListener('click', function() {
const messageText = starter.innerText || starter.textContent;
const chatContainer = starter.closest('.wpaicg-chat-shortcode') || starter.closest('.wpaicg-chatbox');
const type = chatContainer.classList.contains('wpaicg-chat-shortcode') ? 'shortcode' : 'widget';
const typingInput = type === 'shortcode' ? chatContainer.querySelector('.wpaicg-chat-shortcode-typing') : chatContainer.querySelector('.wpaicg-chatbox-typing');
typingInput.value = messageText;
wpaicgSendChatMessage(chatContainer, typingInput, type);
// Hide all starters
starters.forEach(starter => {
starter.style.display = 'none';
});
});
});
}
setupConversationStarters();
var imageIcon = document.querySelector('.wpaicg-img-icon');
var spinner = document.querySelector('.wpaicg-img-spinner');
var thumbnailPlaceholder = document.querySelector('.wpaicg-thumbnail-placeholder');
if (imageIcon) {
imageIcon.addEventListener('click', function() {
var imageInput = document.getElementById('imageUpload');
imageInput.click();
});
}
var imageInput = document.getElementById('imageUpload');
if (imageInput) {
imageInput.addEventListener('change', function() {
if (this.files && this.files[0]) {
var file = this.files[0]; // Store the file reference here
// Show the spinner and hide the image icon
imageIcon.style.display = 'none';
spinner.style.display = 'inline-block';
imageIcon.title = file.name; // Optional: show image name on hover
// Hide the spinner and show the image icon and thumbnail after a delay
setTimeout(function() {
spinner.style.display = 'none';
imageIcon.style.display = 'inline-block'; // Re-display image icon
// Now set the thumbnail image using the stored file reference
thumbnailPlaceholder.style.backgroundImage = `url(${URL.createObjectURL(file)})`;
thumbnailPlaceholder.style.backgroundSize = 'cover';
thumbnailPlaceholder.style.backgroundPosition = 'center';
thumbnailPlaceholder.style.backgroundRepeat = 'no-repeat';
thumbnailPlaceholder.style.display = 'inline-block'; // Display thumbnail
}, 2000);
}
});
}
// Function to set up event listeners on all clear chat buttons
function setupClearChatButtons() {
var wpaicgChatClearButtons = document.querySelectorAll('.wpaicg-chatbox-clear-btn');
wpaicgChatClearButtons.forEach(button => {
button.addEventListener('click', function() {
var chatContainer = button.closest('[data-bot-id]'); // Finds the nearest parent with 'data-bot-id'
if (chatContainer) {
var botId = chatContainer.getAttribute('data-bot-id') || '0';
var clientId = localStorage.getItem('wpaicg_chat_client_id');
clearChatHistory(botId, clientId, chatContainer);
}
});
});
}
// Function to clear the chat history from local storage and the display
function clearChatHistory(botId, clientId, chatContainer) {
var isCustomBot = botId !== '0';
var type = chatContainer.classList.contains('wpaicg-chat-shortcode') ? 'shortcode' : 'widget'; // Determine the type based on class
var historyKey = isCustomBot
? `wpaicg_chat_history_custom_bot_${botId}_${clientId}`
: `wpaicg_chat_history_${type}_${clientId}`; // Adjust history key based on type
// Remove the item from local storage
localStorage.removeItem(historyKey);
// Clear the chat display
var chatBoxSelector = '.wpaicg-chatbox-messages, .wpaicg-chat-shortcode-messages'; // Generalized selector for both types
var chatBox = chatContainer.querySelector(chatBoxSelector);
if (chatBox) {
chatBox.innerHTML = ''; // Clear the chat box visually
}
}
// Call this function once your DOM is fully loaded or at the end of your script
setupClearChatButtons();
if(wpaicg_chat_widget_toggles !== null && wpaicg_chat_widget_toggles.length){
for(var i=0;i/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
function wpaicgstartChatRecording() {
let constraints = {audio: true, video: false}
navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
wpaicgaudioContext = new wpaicgChatAudioContext();
wpaicgChatStream = stream;
wpaicgInput = wpaicgaudioContext.createMediaStreamSource(stream);
wpaicgChatRec = new Recorder(wpaicgInput, {numChannels: 1});
wpaicgChatRec.record();
})
}
function wpaicgstopChatRecording(mic) {
wpaicgChatRec.stop();
wpaicgChatStream.getAudioTracks()[0].stop();
wpaicgChatRec.exportWAV(function (blob) {
let type = mic.getAttribute('data-type');
let parentChat;
let chatContent;
let chatTyping;
if (type === 'widget') {
parentChat = mic.closest('.wpaicg-chatbox');
chatContent = parentChat.querySelectorAll('.wpaicg-chatbox-content')[0];
chatTyping = parentChat.querySelectorAll('.wpaicg-chatbox-typing')[0];
} else {
parentChat = mic.closest('.wpaicg-chat-shortcode');
chatContent = parentChat.querySelectorAll('.wpaicg-chat-shortcode-content')[0];
chatTyping = parentChat.querySelectorAll('.wpaicg-chat-shortcode-typing')[0];
}
wpaicgSendChatMessage(parentChat, chatTyping, type, blob);
});
}
// Function to generate a random string
function generateRandomString(length) {
let result = '';
let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
function setupButtonListeners(isCopyEnabled, isFeedbackEnabled, class_ai_item, emptyClipboardSVG, checkedClipboardSVG, thumbsUpSVG, thumbsDownSVG, showFeedbackModal, aiBg, fontColor, usrBg, chat, wpaicg_nonce, chatbot_identity) {
let hideTimeout;
// Show buttons on hover or touchstart of the icon container
jQuery(document).on('mouseenter touchstart', `li.${class_ai_item} .wpaicg-icon-container`, function (event) {
clearTimeout(hideTimeout);
// Prevent triggering on scroll or unintended touches
if (event.type === 'touchstart') {
event.stopPropagation();
}
const buttons = jQuery(this).find('.wpaicg-copy-button, .wpaicg-thumbs-up-button, .wpaicg-thumbs-down-button');
// Display copy button if enabled
if (isCopyEnabled) {
buttons.filter('.wpaicg-copy-button').css({
display: 'inline-block',
opacity: 1,
visibility: 'visible'
});
}
// Display feedback buttons if enabled
if (isFeedbackEnabled) {
buttons.filter('.wpaicg-thumbs-up-button, .wpaicg-thumbs-down-button').css({
display: 'inline-block',
opacity: 1,
visibility: 'visible'
});
}
});
// Hide buttons after leaving the icon container
jQuery(document).on('mouseleave touchend', `li.${class_ai_item} .wpaicg-icon-container`, function () {
const buttons = jQuery(this).find('.wpaicg-copy-button, .wpaicg-thumbs-up-button, .wpaicg-thumbs-down-button');
hideTimeout = setTimeout(() => {
buttons.css({
opacity: 0,
visibility: 'hidden',
display: 'none'
});
}, 2000);
});
// Copy text functionality remains unchanged
jQuery(document).on('click', '.wpaicg-copy-button', function () {
const chatId = jQuery(this).data('chat-id');
const messageText = document.getElementById(chatId).innerText;
navigator.clipboard.writeText(messageText).then(() => {
// Change icon to check mark
jQuery(this).html(checkedClipboardSVG);
setTimeout(() => {
// Reset icon to original after 2 seconds
jQuery(this).html(emptyClipboardSVG);
}, 2000);
}).catch(err => console.error('Failed to copy text: ', err));
});
// Feedback functionality remains unchanged
jQuery(document).on('click', '.wpaicg-thumbs-up-button, .wpaicg-thumbs-down-button', function () {
const feedbackType = jQuery(this).hasClass('wpaicg-thumbs-up-button') ? 'up' : 'down';
const chatId = jQuery(this).data('chat-id').replace('wpaicg-chat-message-', '');
showFeedbackModal(feedbackType, chatId, aiBg, fontColor, usrBg, chat, wpaicg_nonce, chatbot_identity);
});
}
function showFeedbackModal(feedbackType, chatId, bgColor, textColor, usrBg, chat, wpaicg_nonce, chatbot_identity) {
const chatWidget = jQuery('.wpaicg_chat_widget');
const feedbackTitle = chat.getAttribute('data-feedback_title') || 'Feedback';
const feedbackMessage = chat.getAttribute('data-feedback_message') || 'Please provide details: (optional)';
const feedbackSuccessMessage = chat.getAttribute('data-feedback_success') || 'Thank you for your feedback!';
const chatShortcode = jQuery(chat).closest('.wpaicg-chat-shortcode');
const wasFullscreen = chatShortcode.hasClass('wpaicg-fullscreened');
if (wasFullscreen) {
// Exit fullscreen mode before showing feedback modal
const fullScreenBtn = chatShortcode.find('.wpaicg-chatbox-fullscreen');
wpaicgFullScreen(fullScreenBtn[0]); // Exit fullscreen
}
if (chatWidget.hasClass('wpaicg_widget_open')) {
chatWidget.data('was-open', true);
chatWidget.removeClass('wpaicg_widget_open');
} else {
chatWidget.data('was-open', false);
}
const modalHtml = `
${feedbackTitle}
${feedbackMessage}
`;
jQuery('body').append(modalHtml);
jQuery('.wpaicg-feedback-modal-close').on('click', function () {
jQuery('.wpaicg-feedback-modal-overlay').fadeOut(300, function () {
jQuery(this).remove();
if (wasFullscreen) {
// Restore fullscreen after feedback modal is closed
const fullScreenBtn = chatShortcode.find('.wpaicg-chatbox-fullscreen');
wpaicgFullScreen(fullScreenBtn[0]); // Re-enter fullscreen
}
if (chatWidget.data('was-open')) {
chatWidget.addClass('wpaicg_widget_open');
}
});
});
jQuery('.wpaicg-feedback-modal-submit').on('click', function() {
const modal = jQuery(this).closest('.wpaicg-feedback-modal');
const feedbackText = modal.find('.wpaicg-feedback-textarea').val();
const feedbackType = jQuery(this).data('feedback-type');
const chatId = jQuery(this).data('chat-id');
const nonce = wpaicg_nonce;
const submitButton = jQuery(this);
const spinner = submitButton.find('.wpaicg-feedback-spinner');
const feedbackMessageElement = modal.find('.wpaicg-feedback-message');
spinner.show();
submitButton.prop('disabled', true);
jQuery.ajax({
url: wpaicgParams.ajax_url,
method: 'POST',
data: {
action: 'wpaicg_submit_feedback',
chatId: chatId,
feedbackType: feedbackType,
feedbackDetails: feedbackText,
_wpnonce: nonce,
chatbot_id: chatbot_identity,
},
success: function(response) {
feedbackMessageElement.html(`${feedbackSuccessMessage}`).fadeIn(300);
setTimeout(() => {
jQuery('.wpaicg-feedback-modal-overlay').fadeOut(300, function() {
jQuery(this).remove();
if (chatWidget.data('was-open')) {
chatWidget.addClass('wpaicg_widget_open');
}
if (wasFullscreen) {
const fullScreenBtn = chatShortcode.find('.wpaicg-chatbox-fullscreen');
wpaicgFullScreen(fullScreenBtn[0]); // Re-enter fullscreen
}
});
}, 2000);
},
error: function(error) {
feedbackMessageElement.html(`Error. Please try again later.`).fadeIn(300);
setTimeout(() => {
jQuery('.wpaicg-feedback-modal-overlay').fadeOut(300, function() {
jQuery(this).remove();
if (chatWidget.data('was-open')) {
chatWidget.addClass('wpaicg_widget_open');
}
if (wasFullscreen) {
const fullScreenBtn = chatShortcode.find('.wpaicg-chatbox-fullscreen');
wpaicgFullScreen(fullScreenBtn[0]); // Re-enter fullscreen
}
});
}, 2000);
},
complete: function() {
spinner.hide();
submitButton.prop('disabled', false);
}
});
});
}
function wpaicgSendChatMessage(chat, typing, type, blob) {
hideConversationStarters();
let wpaicg_box_typing = typing;
let wpaicg_ai_thinking, wpaicg_messages_box, class_user_item, class_ai_item;
let wpaicgMessage = '';
let wpaicgData = new FormData();
let wpaicg_you = chat.getAttribute('data-you') + ':';
let wpaicg_ai_name = chat.getAttribute('data-ai-name') + ':';
let wpaicg_nonce = chat.getAttribute('data-nonce');
let wpaicg_use_avatar = parseInt(chat.getAttribute('data-use-avatar'));
let wpaicg_bot_id = parseInt(chat.getAttribute('data-bot-id'));
let wpaicg_user_avatar = chat.getAttribute('data-user-avatar');
let wpaicg_ai_avatar = chat.getAttribute('data-ai-avatar');
let wpaicg_user_bg = chat.getAttribute('data-user-bg-color');
let wpaicg_font_size = chat.getAttribute('data-fontsize');
let wpaicg_speech = chat.getAttribute('data-speech');
let wpaicg_voice = chat.getAttribute('data-voice');
let elevenlabs_model = chat.getAttribute('data-elevenlabs-model');
if (elevenlabs_model === null || elevenlabs_model === undefined) {
elevenlabs_model = chat.getAttribute('data-elevenlabs_model');
}
let elevenlabs_voice = chat.getAttribute('data-elevenlabs-voice');
if (elevenlabs_voice === null || elevenlabs_voice === undefined) {
elevenlabs_voice = chat.getAttribute('data-elevenlabs_voice');
}
let wpaicg_voice_error = chat.getAttribute('data-voice-error');
let wpaicg_typewriter_effect = chat.getAttribute('data-typewriter-effect');
let wpaicg_typewriter_speed = chat.getAttribute('data-typewriter-speed');
let url = chat.getAttribute('data-url');
let post_id = chat.getAttribute('data-post-id');
let wpaicg_ai_bg = chat.getAttribute('data-ai-bg-color');
let wpaicg_font_color = chat.getAttribute('data-color');
let voice_service = chat.getAttribute('data-voice_service');
let voice_language = chat.getAttribute('data-voice_language');
let voice_name = chat.getAttribute('data-voice_name');
let voice_device = chat.getAttribute('data-voice_device');
let openai_model = chat.getAttribute('data-openai_model');
let openai_voice = chat.getAttribute('data-openai_voice');
let openai_output_format = chat.getAttribute('data-openai_output_format');
let openai_voice_speed = chat.getAttribute('data-openai_voice_speed');
let openai_stream_nav = chat.getAttribute('data-openai_stream_nav');
let voice_speed = chat.getAttribute('data-voice_speed');
let voice_pitch = chat.getAttribute('data-voice_pitch');
var chat_pdf = chat.getAttribute('data-pdf');
// Handle image upload
var imageInput = document.getElementById('imageUpload');
var imageUrl = ''; // Variable to store the URL of the uploaded image for preview
if(imageInput){
if (imageInput.files && imageInput.files[0]) {
// Append image file to FormData object
wpaicgData.append('image', imageInput.files[0], imageInput.files[0].name);
// Create a URL for the uploaded image file for preview
imageUrl = URL.createObjectURL(imageInput.files[0]);
}
}
if (type === 'widget') {
wpaicg_ai_thinking = chat.getElementsByClassName('wpaicg-bot-thinking')[0];
wpaicg_messages_box = chat.getElementsByClassName('wpaicg-chatbox-messages')[0];
class_user_item = 'wpaicg-chat-user-message';
class_ai_item = 'wpaicg-chat-ai-message';
wpaicg_messages_box.scrollTop = wpaicg_messages_box.scrollHeight;
// Retrieve all message elements
const messages = wpaicg_messages_box.querySelectorAll('li');
// Ensure messages exist and scroll to the last message
if (messages.length > 0) {
messages[messages.length - 1].scrollIntoView();
}
} else {
wpaicg_ai_thinking = chat.getElementsByClassName('wpaicg-bot-thinking')[0];
wpaicg_messages_box = chat.getElementsByClassName('wpaicg-chat-shortcode-messages')[0];
class_user_item = 'wpaicg-user-message';
class_ai_item = 'wpaicg-ai-message';
}
if (wpaicg_use_avatar) {
wpaicg_you = '';
wpaicg_ai_name = '';
}
wpaicg_ai_thinking.style.display = 'block';
let wpaicg_question = wpaicgescapeHtml(wpaicg_box_typing.value);
if (!wpaicg_question.trim() && blob === undefined) {
wpaicg_ai_thinking.style.display = 'none';
return; // Exit the function if no message or blob is provided
}
wpaicgMessage += '
';
// If an image URL is available, add an tag to display the image
if (imageUrl !== '') {
wpaicgMessage += '
';
wpaicgMessage += '
';
wpaicgMessage += '';
wpaicgMessage += '
'; // Closing the div tag
wpaicgMessage += '
';
}
wpaicg_messages_box.innerHTML += wpaicgMessage;
wpaicg_messages_box.scrollTop = wpaicg_messages_box.scrollHeight;
// Hide the thumbnail placeholder
var thumbnailPlaceholder = document.querySelector('.wpaicg-thumbnail-placeholder');
if (thumbnailPlaceholder) {
thumbnailPlaceholder.style.display = 'none'; // Hide the thumbnail after message is sent
}
// Reset the image input after sending the message if imageInput exists first
if (imageInput) {
imageInput.value = '';
}
let chat_type = chat.getAttribute('data-type');
let stream_nav;
let chatbot_identity;
// Check if it's a bot with dynamic ID
if (wpaicg_bot_id && wpaicg_bot_id !== "0") {
stream_nav = openai_stream_nav;
chatbot_identity = 'custom_bot_' + wpaicg_bot_id;
} else {
// Check if it's a shortcode or widget based on chat_type
if (chat_type === "shortcode") {
stream_nav = chat.getAttribute('data-openai_stream_nav');
chatbot_identity = 'shortcode';
} else if (chat_type === "widget") {
stream_nav = chat.getAttribute('data-openai_stream_nav');
chatbot_identity = 'widget';
}
}
wpaicgData.append('chatbot_identity', chatbot_identity);
// Check for existing client_id in localStorage
let clientID = localStorage.getItem('wpaicg_chat_client_id');
if (!clientID) {
// Generate and store a new client ID if not found
clientID = generateRandomString(10); // Generate a 10 character string
localStorage.setItem('wpaicg_chat_client_id', clientID);
}
//append client_id to wpaicgData
wpaicgData.append('wpaicg_chat_client_id', clientID);
// Hide the image thumbnail after sending the message
if (imageInputThumbnail) {
imageInputThumbnail.style.display = 'none';
}
// Function to update chat history in local storage for a specific bot identity
function updateChatHistory(message, sender, wpaicg_randomnum) {
let chatHistoryKey = 'wpaicg_chat_history_' + chatbot_identity + '_' + clientID;
let chatHistory = localStorage.getItem(chatHistoryKey);
chatHistory = chatHistory ? JSON.parse(chatHistory) : [];
// Format and add the new message
let formattedMessage = (sender === 'user' ? "Human: " : "AI: ") + message.trim();
chatHistory.push({
id: wpaicg_randomnum,
text: formattedMessage,
});
// Keep only the last 10 messages if there are more than 5
if (chatHistory.length > 10) {
chatHistory = chatHistory.slice(-10);
}
// Calculate total character count
let totalCharCount = chatHistory.reduce((total, msg) => total + msg.length, 0);
// Clear chat history if total character count exceeds 20000
if (totalCharCount > 20000) {
chatHistory = [];
}
localStorage.setItem(chatHistoryKey, JSON.stringify(chatHistory));
}
if (stream_nav === "1") {
updateChatHistory(wpaicg_question, 'user');
wpaicgData.append('wpaicg_chat_history', localStorage.getItem('wpaicg_chat_history_' + chatbot_identity + '_' + clientID));
handleStreaming(wpaicgData,wpaicg_messages_box,wpaicg_box_typing,wpaicg_ai_thinking,class_ai_item,chat, chatbot_identity, clientID, wpaicg_use_avatar, wpaicg_ai_avatar,wpaicg_nonce);
}
else {
updateChatHistory(wpaicg_question, 'user');
// append chat history to wpaicgData
wpaicgData.append('wpaicg_chat_history', localStorage.getItem('wpaicg_chat_history_' + chatbot_identity + '_' + clientID));
var wpaicg_randomnum = Math.floor((Math.random() * 100000) + 1);
const chatId = `wpaicg-chat-message-${wpaicg_randomnum}`;
// append wpaicg_randomnum to wpaicgData
wpaicgData.append('chat_id', wpaicg_randomnum);
// Extract copy and feedback settings from the chat element
const copyEnabled = chat.getAttribute('data-copy_btn') === "1";
const feedbackEnabled = chat.getAttribute('data-feedback_btn') === "1";
const fontColor = chat.getAttribute('data-color');
const usrBg = chat.getAttribute('data-user-bg-color');
const emptyClipboardSVG = ``;
const checkedClipboardSVG = ``;
const thumbsUpSVG = ``;
const thumbsDownSVG = ``;
const xhttp = new XMLHttpRequest();
wpaicg_box_typing.value = '';
xhttp.open('POST', wpaicgParams.ajax_url, true);
xhttp.send(wpaicgData);
xhttp.onreadystatechange = function (oEvent) {
if (xhttp.readyState === 4) {
var wpaicg_message = '';
var wpaicg_response_text = '';
if (xhttp.status === 200) {
var wpaicg_response = this.responseText;
if (wpaicg_response !== '') {
wpaicg_response = JSON.parse(wpaicg_response);
wpaicg_ai_thinking.style.display = 'none'
if (wpaicg_response.status === 'success') {
wpaicg_response_text = wpaicg_response.data;
wpaicg_message = `