PageSourceSearch

https://www.bhutanaudit.gov.bt/wp-content/plugins/supportcandy/framework/scripts.js?ver=3.4.4

js bhutanaudit.gov.bt collected 2026-10-02 12:49:17 UTC 91,507 bytes, 3,448 lines download raw bytes

1jQuery(document).ready(function () {
2  wpsc_reset_responsive_style();
3  jQuery(window).resize(function () {
4    wpsc_reset_responsive_style(true);
5  });
6  wpsc_document_ready();
7
8  // for check there is value in reply box.
9  jQuery(window).on("popstate", function () {
10    if (wpsc_is_description_text()) {
11      if (!confirm(supportcandy.translations.warning_message)) {
12        return;
13      }
14    }
15  });
16
17  // Change the element from h1 to h2
18  if (jQuery('#link-modal-title').length > 0) {
19    jQuery('#link-modal-title').replaceWith('<h2 id="link-modal-title">' + jQuery('#link-modal-title').html() + '</h2>');
20  }
21});
22
23/**
24 * Apply responsive styles based on container size
25 */
26function wpsc_reset_responsive_style(isWindowResize = false) {
27  var lastContainerWidth = supportcandy.lastContainerWidth
28    ? supportcandy.lastContainerWidth
29    : 0;
30  var containerWidth = jQuery("#wpsc-container").outerWidth();
31
32  if (isWindowResize && lastContainerWidth === containerWidth) {
33    return;
34  }
35
36  supportcandy.lastContainerWidth = containerWidth;
37
38  jQuery("#wpsc-container").hide();
39  var style = "xs";
40  if (containerWidth <= 768) {
41    style = "xs";
42  } else if (containerWidth > 768 && containerWidth <= 992) {
43    style = "sm";
44  } else if (containerWidth > 992 && containerWidth <= 1200) {
45    style = "md";
46  } else {
47    style = "lg";
48  }
49  supportcandy.responsiveStyle = style;
50  var styleURL =
51    supportcandy.plugin_url +
52    "framework/responsive/" +
53    style +
54    ".css?version=" +
55    supportcandy.version;
56  var styleEl =
57    '<link id="wpsc-responsive-css" rel="stylesheet" type="text/css" href="' +
58    styleURL +
59    '" />';
60  jQuery("#wpsc-responsive-css").remove();
61  jQuery("head").append(styleEl);
62  wpsc_apply_responsive_styles();
63  jQuery("#wpsc-container").show();
64}
65
66/**
67 * Apply visible elements on screen resize
68 */
69function wpsc_el_reset_visible() {
70  jQuery(
71    ".wpsc-visible-xs,.wpsc-visible-sm,.wpsc-visible-md,.wpsc-visible-lg"
72  ).hide();
73  jQuery(".wpsc-visible-" + supportcandy.responsiveStyle).show();
74}
75
76/**
77 * Apply hidden elements on screen resize
78 */
79function wpsc_el_reset_hidden() {
80  jQuery(
81    ".wpsc-hidden-xs,.wpsc-hidden-sm,.wpsc-hidden-md,.wpsc-hidden-lg"
82  ).show();
83  jQuery(".wpsc-hidden-" + supportcandy.responsiveStyle).hide();
84}
85
86/**
87 * Toggle humbargar menu
88 */
89function wpsc_toggle_humbargar() {
90  var flag = supportcandy.humbargar ? true : false;
91  if (flag) {
92    jQuery(".wpsc-humbargar-menu").hide(
93      "slide",
94      { direction: "right" },
95      200,
96      function () {
97        jQuery(".wpsc-humbargar-overlay").hide();
98      }
99    );
100    supportcandy.humbargar = false;
101  } else {
102    jQuery(".wpsc-humbargar-overlay").show();
103    jQuery(".wpsc-humbargar-menu").show("slide", { direction: "right" }, 200);
104    supportcandy.humbargar = true;
105  }
106}
107
108/**
109 * Close humbargar menu if open
110 */
111function wpsc_close_humbargar() {
112  var flag = supportcandy.humbargar ? true : false;
113  if (flag) {
114    jQuery(".wpsc-humbargar-menu").hide();
115    jQuery(".wpsc-humbargar-overlay").hide();
116    supportcandy.humbargar = false;
117  }
118}
119
120/**
121 * Bulk selector change
122 */
123function wpsc_bulk_select_change() {
124  var checked = jQuery(".wpsc-bulk-selector").is(":checked");
125  jQuery(".wpsc-bulk-select").prop("checked", checked);
126}
127
128/**
129 * Bulk item selector change
130 */
131function wpsc_bulk_item_select_change() {
132  var items = jQuery(".wpsc-bulk-select:checked");
133  var checked = items.length === 0 ? false : true;
134  jQuery(".wpsc-bulk-selector").prop("checked", checked);
135}
136
137/**
138 * Show modal with loading screen
139 */
140function wpsc_show_modal() {
141  jQuery(".wpsc-modal .inner-container").hide();
142  jQuery(".wpsc-modal .loader").show();
143  jQuery(".wpsc-modal").show();
144}
145
146/**
147 * Close modal
148 */
149function wpsc_show_modal_inner_container() {
150  jQuery(".wpsc-modal .loader").hide();
151  jQuery(".wpsc-modal .inner-container").show(
152    "slide",
153    { direction: "up" },
154    200
155  );
156}
157
158/**
159 * Close modal
160 */
161function wpsc_close_modal() {
162  jQuery(".wpsc-modal .inner-container").hide(
163    "slide",
164    { direction: "up" },
165    200,
166    function () {
167      jQuery(".wpsc-modal").hide();
168    }
169  );
170}
171
172/**
173 * OFF toggle button click
174 */
175function wpsc_toggle_off(el) {
176  var off = jQuery(el);
177  var on = jQuery(el).next();
178  var input = on.next();
179
180  if (input.val() === 0) {
181    return;
182  }
183
184  input.val(0);
185  on.removeClass("active");
186  off.addClass("active");
187}
188
189/**
190 * ON toggle button click
191 */
192function wpsc_toggle_on(el) {
193  var on = jQuery(el);
194  var off = jQuery(el).prev();
195  var input = on.next();
196
197  if (input.val() === 1) {
198    return;
199  }
200
201  input.val(1);
202  off.removeClass("active");
203  on.addClass("active");
204}
205
206/**
207 * Scroll to top of WPSC component
208 */
209function wpsc_scroll_top() {
210  jQuery("html, body").animate(
211    {
212      scrollTop: jQuery("#wpsc-container").offset().top - 42,
213    },
214    500
215  );
216}
217
218/**
219 * Toggle individual widgets
220 */
221function wpsc_toggle_mob_it_widgets() {
222  var status = parseInt(
223    jQuery(".wpsc-it-mob-widgets-inner-container").data("status")
224  );
225
226  if (!status) {
227    jQuery(".wpsc-it-mob-widgets-inner-container").slideDown();
228    jQuery(".wpsc-it-mob-widget-trigger-btn .down").hide();
229    jQuery(".wpsc-it-mob-widget-trigger-btn .up").show();
230    jQuery(".wpsc-it-mob-widgets-inner-container").data("status", 1);
231  } else {
232    jQuery(".wpsc-it-mob-widgets-inner-container").slideUp();
233    jQuery(".wpsc-it-mob-widget-trigger-btn .up").hide();
234    jQuery(".wpsc-it-mob-widget-trigger-btn .down").show();
235    jQuery(".wpsc-it-mob-widgets-inner-container").data("status", 0);
236  }
237}
238
239/**
240 *  Get refresh current ticket
241 */
242function wpsc_it_ab_refresh(ticket_id) {
243  if (wpsc_is_description_text()) {
244    if (confirm(supportcandy.translations.warning_message)) {
245      wpsc_clear_saved_draft_reply(ticket_id);
246    } else {
247      return;
248    }
249  }
250
251  wpsc_get_individual_ticket(ticket_id);
252}
253
254/**
255 * Get close current ticket modal UI
256 */
257function wpsc_it_close_ticket(ticket_id, nonce) {
258  if (wpsc_is_description_text()) {
259    if (!confirm(supportcandy.translations.warning_message)) return;
260  }
261
262  var flag = confirm(supportcandy.translations.confirm);
263  if (flag) {
264    if (wpsc_is_description_text()) {
265      wpsc_clear_saved_draft_reply(ticket_id);
266    }
267  } else {
268    return;
269  }
270
271  var data = { action: "wpsc_it_close_ticket", ticket_id, _ajax_nonce: nonce };
272  jQuery.post(supportcandy.ajax_url, data, function (response) {
273    wpsc_run_ajax_background_process();
274    wpsc_after_close_ticket(ticket_id);
275  });
276}
277
278/**
279 * Get duplicate ticket
280 */
281function wpsc_it_get_duplicate_ticket(ticket_id, nonce) {
282  wpsc_show_modal();
283  var data = {
284    action: "wpsc_it_get_duplicate_ticket",
285    ticket_id,
286    _ajax_nonce: nonce,
287  };
288  jQuery.post(supportcandy.ajax_url, data, function (response) {
289    jQuery(".wpsc-modal-header").text(response.title);
290    jQuery(".wpsc-modal-body").html(response.body);
291    jQuery(".wpsc-modal-footer").html(response.footer);
292    wpsc_show_modal_inner_container();
293  });
294}
295
296/**
297 * Set duplicate ticket
298 */
299function wpsc_it_set_duplicate_ticket(el, ticket_id) {
300  if (wpsc_is_description_text()) {
301    if (confirm(supportcandy.translations.warning_message)) {
302      wpsc_clear_saved_draft_reply(ticket_id);
303    } else {
304      return;
305    }
306  }
307
308  var form = jQuery("form.duplicate")[0];
309  var dataform = new FormData(form);
310  jQuery(".wpsc-modal-footer button").attr("disabled", true);
311  jQuery(el).text(supportcandy.translations.please_wait);
312
313  jQuery
314    .ajax({
315      url: supportcandy.ajax_url,
316      type: "POST",
317      data: dataform,
318      processData: false,
319      contentType: false,
320    })
321    .done(function (response) {
322      wpsc_close_modal();
323      wpsc_get_individual_ticket(response.ticket_id);
324    });
325}
326
327/**
328 * Get delete ticket
329 */
330function wpsc_it_delete_ticket(ticket_id, nonce) {
331  if (wpsc_is_description_text()) {
332    if (!confirm(supportcandy.translations.warning_message)) {
333      return;
334    } else {
335      var is_tinymce =
336        typeof tinyMCE != "undefined" &&
337        tinyMCE.activeEditor &&
338        !tinyMCE.activeEditor.isHidden();
339      if (is_tinymce && tinymce.get("description")) {
340        tinyMCE.get("description").setContent("");
341      } else {
342        jQuery("#description").val("");
343      }
344      wpsc_clear_saved_draft_reply(ticket_id);
345    }
346  }
347
348  var flag = confirm(supportcandy.translations.confirm);
349  if (!flag) {
350    return;
351  }
352
353  var data = { action: "wpsc_it_delete_ticket", ticket_id, _ajax_nonce: nonce };
354  jQuery.post(supportcandy.ajax_url, data, function (response) {
355    wpsc_get_ticket_list();
356    wpsc_run_ajax_background_process();
357  });
358}
359
360/**
361 * Restore ticket
362 */
363function wpsc_it_ticket_restore(ticket_id, nonce) {
364  var flag = confirm(supportcandy.translations.confirm);
365  if (!flag) {
366    return;
367  }
368
369  var data = {
370    action: "wpsc_it_ticket_restore",
371    ticket_id,
372    _ajax_nonce: nonce,
373  };
374  jQuery.post(supportcandy.ajax_url, data, function (response) {
375    wpsc_get_individual_ticket(ticket_id);
376  });
377}
378
379/**
380 * Get delete ticket
381 */
382function wpsc_it_archive_ticket(ticket_id, nonce) {
383  if (wpsc_is_description_text()) {
384    if (!confirm(supportcandy.translations.warning_message)) {
385      return;
386    } else {
387      var is_tinymce =
388        typeof tinyMCE != "undefined" &&
389        tinyMCE.activeEditor &&
390        !tinyMCE.activeEditor.isHidden();
391      if (is_tinymce && tinymce.get("description")) {
392        var description = tinyMCE.get("description").setContent("");
393      } else {
394        var description = jQuery("#description").val("");
395      }
396      wpsc_clear_saved_draft_reply(ticket_id);
397    }
398  }
399
400  var flag = confirm(supportcandy.translations.confirm);
401  if (!flag) {
402    return;
403  }
404
405  var data = { action: "wpsc_it_archive_ticket", ticket_id, _ajax_nonce: nonce };
406  jQuery.post(supportcandy.ajax_url, data, function (response) {
407    wpsc_get_ticket_list();
408    wpsc_run_ajax_background_process();
409  });
410}
411
412/**
413 * Delete permanently
414 */
415function wpsc_it_delete_permanently(ticket_id, nonce) {
416  var flag = confirm(supportcandy.translations.delete_permanently);
417  if (!flag) {
418    return;
419  }
420
421  var data = {
422    action: "wpsc_it_delete_permanently",
423    ticket_id,
424    _ajax_nonce: nonce,
425  };
426  jQuery.post(supportcandy.ajax_url, data, function (response) {
427    wpsc_get_ticket_list();
428  });
429}
430
431/**
432 *  Get edit ticket subject modal UI
433 */
434function wpsc_it_get_edit_subject(ticket_id) {
435  wpsc_show_modal();
436  var data = {
437    action: "wpsc_it_get_edit_subject",
438    ticket_id,
439  };
440  jQuery.post(supportcandy.ajax_url, data, function (response) {
441    jQuery(".wpsc-modal-header").text(response.title);
442    jQuery(".wpsc-modal-body").html(response.body);
443    jQuery(".wpsc-modal-footer").html(response.footer);
444    wpsc_show_modal_inner_container();
445  });
446}
447
448/**
449 *  Set edit ticket subject
450 */
451function wpsc_it_set_edit_subject(el, ticket_id) {
452  if (wpsc_is_description_text()) {
453    if (!confirm(supportcandy.translations.warning_message)) {
454      wpsc_clear_saved_draft_reply(ticket_id);
455    } else {
456      return;
457    }
458  }
459
460  var form = jQuery("form.edit-subject")[0];
461  var dataform = new FormData(form);
462  jQuery(".wpsc-modal-footer button").attr("disabled", true);
463  jQuery(el).text(supportcandy.translations.please_wait);
464  jQuery
465    .ajax({
466      url: supportcandy.ajax_url,
467      type: "POST",
468      data: dataform,
469      processData: false,
470      contentType: false,
471    })
472    .done(function (res) {
473      wpsc_close_modal();
474      wpsc_get_individual_ticket(ticket_id);
475    });
476}
477
478/**
479 * Get change status modal UI
480 */
481function wpsc_it_get_edit_ticket_status(ticket_id, nonce) {
482  wpsc_show_modal();
483  var data = {
484    action: "wpsc_it_get_edit_ticket_status",
485    ticket_id,
486    _ajax_nonce: nonce,
487  };
488  jQuery.post(supportcandy.ajax_url, data, function (response) {
489    // Set to modal.
490    jQuery(".wpsc-modal-header").text(response.title);
491    jQuery(".wpsc-modal-body").html(response.body);
492    jQuery(".wpsc-modal-footer").html(response.footer);
493    // Display modal.
494    wpsc_show_modal_inner_container();
495  });
496}
497
498/**
499 * Update ticket status
500 *
501 * @param {*} el
502 */
503function wpsc_it_set_edit_ticket_status(el, ticket_id) {
504  if (wpsc_is_description_text()) {
505    if (confirm(supportcandy.translations.warning_message)) {
506      wpsc_clear_saved_draft_reply(ticket_id);
507    } else {
508      return;
509    }
510  }
511
512  var form = jQuery("form.frm-edit-ticket-status")[0];
513  var dataform = new FormData(form);
514  jQuery(".wpsc-modal-footer button").attr("disabled", true);
515  jQuery(el).text(supportcandy.translations.please_wait);
516  jQuery
517    .ajax({
518      url: supportcandy.ajax_url,
519      type: "POST",
520      data: dataform,
521      processData: false,
522      contentType: false,
523    })
524    .done(function (res) {
525      wpsc_close_modal();
526      wpsc_get_individual_ticket(ticket_id);
527      wpsc_run_ajax_background_process();
528    });
529}
530
531/**
532 * Get additional recipients modal UI
533 */
534function wpsc_it_get_add_ar(ticket_id, nonce) {
535  wpsc_show_modal();
536  var data = {
537    action: "wpsc_it_get_add_ar",
538    ticket_id,
539    _ajax_nonce: nonce,
540  };
541  jQuery.post(supportcandy.ajax_url, data, function (response) {
542    jQuery(".wpsc-modal-header").text(response.title);
543    jQuery(".wpsc-modal-body").html(response.body);
544    jQuery(".wpsc-modal-footer").html(response.footer);
545    wpsc_show_modal_inner_container();
546  });
547}
548
549/**
550 * Update additional recipients
551 *
552 * @param {*} el
553 */
554function wpsc_it_set_add_ar(el, ticket_id) {
555  if (wpsc_is_description_text()) {
556    if (confirm(supportcandy.translations.warning_message)) {
557      wpsc_clear_saved_draft_reply(ticket_id);
558    } else {
559      return;
560    }
561  }
562
563  var form = jQuery("form.additional-recipients")[0];
564  var dataform = new FormData(form);
565  jQuery(".wpsc-modal-footer button").attr("disabled", true);
566  jQuery(el).text(supportcandy.translations.please_wait);
567  jQuery
568    .ajax({
569      url: supportcandy.ajax_url,
570      type: "POST",
571      data: dataform,
572      processData: false,
573      contentType: false,
574    })
575    .done(function (res) {
576      wpsc_close_modal();
577      wpsc_get_individual_ticket(ticket_id);
578    });
579}
580
581/**
582 * Get assigned agents modal UI
583 */
584function wpsc_it_get_edit_assigned_agents(ticket_id, nonce) {
585  wpsc_show_modal();
586  var data = {
587    action: "wpsc_it_get_edit_assigned_agents",
588    ticket_id,
589    _ajax_nonce: nonce,
590  };
591  jQuery.post(supportcandy.ajax_url, data, function (response) {
592    jQuery(".wpsc-modal-header").text(response.title);
593    jQuery(".wpsc-modal-body").html(response.body);
594    jQuery(".wpsc-modal-footer").html(response.footer);
595    wpsc_show_modal_inner_container();
596  });
597}
598
599/**
600 * Update assigned agents
601 *
602 * @param {*} el
603 */
604function wpsc_it_set_edit_assigned_agents(el, ticket_id, uniqueId) {
605  if (wpsc_is_description_text()) {
606    if (confirm(supportcandy.translations.warning_message)) {
607      wpsc_clear_saved_draft_reply(ticket_id);
608    } else {
609      return;
610    }
611  }
612
613  var form = jQuery("form.change-assignee." + uniqueId)[0];
614  var dataform = new FormData(form);
615  jQuery(".wpsc-modal-footer button").attr("disabled", true);
616  jQuery(el).text(supportcandy.translations.please_wait);
617  jQuery
618    .ajax({
619      url: supportcandy.ajax_url,
620      type: "POST",
621      data: dataform,
622      processData: false,
623      contentType: false,
624    })
625    .done(function (res) {
626      wpsc_close_modal();
627      if (res.viewPermission) {
628        wpsc_get_individual_ticket(ticket_id);
629      } else {
630        wpsc_get_ticket_list();
631      }
632      wpsc_run_ajax_background_process();
633    });
634}
635
636/**
637 * Get raised by modal UI
638 */
639function wpsc_it_get_edit_raised_by(ticket_id, nonce) {
640  wpsc_show_modal();
641  var data = {
642    action: "wpsc_it_get_edit_raised_by",
643    ticket_id,
644    _ajax_nonce: nonce,
645  };
646  jQuery.post(supportcandy.ajax_url, data, function (response) {
647    // Set to modal.
648    jQuery(".wpsc-modal-header").text(response.title);
649    jQuery(".wpsc-modal-body").html(response.body);
650    jQuery(".wpsc-modal-footer").html(response.footer);
651    // Display modal.
652    wpsc_show_modal_inner_container();
653  });
654}
655
656/**
657 * Update raised by
658 *
659 * @param {*} el
660 */
661function wpsc_it_set_edit_raised_by(el, ticket_id, uniqueId) {
662  if (wpsc_is_description_text()) {
663    if (confirm(supportcandy.translations.warning_message)) {
664      wpsc_clear_saved_draft_reply(ticket_id);
665    } else {
666      return;
667    }
668  }
669
670  var type = jQuery(".type." + uniqueId).val();
671  if (type == "new") {
672    var name = jQuery(".name." + uniqueId)
673      .val()
674      .trim();
675    var email = jQuery(".email." + uniqueId)
676      .val()
677      .trim();
678    if (!name || !email) {
679      return;
680    }
681
682    if (!validateEmail(email)) {
683      alert(supportcandy.translations.raisedByEditWidget.invalidEmail);
684      return;
685    }
686  }
687
688  var form = jQuery("form.change-raised-by." + uniqueId)[0];
689  var dataform = new FormData(form);
690  jQuery(".wpsc-modal-footer button").attr("disabled", true);
691  jQuery(el).text(supportcandy.translations.please_wait);
692  jQuery
693    .ajax({
694      url: supportcandy.ajax_url,
695      type: "POST",
696      data: dataform,
697      processData: false,
698      contentType: false,
699    })
700    .done(function (res) {
701      wpsc_close_modal();
702      wpsc_get_individual_ticket(ticket_id);
703    });
704}
705
706/**
707 * Get ticket fields modal UI
708 */
709function wpsc_it_get_edit_ticket_fields(ticket_id, nonce) {
710  wpsc_show_modal();
711  var data = {
712    action: "wpsc_it_get_edit_ticket_fields",
713    ticket_id,
714    _ajax_nonce: nonce,
715  };
716  jQuery.post(supportcandy.ajax_url, data, function (response) {
717    jQuery(".wpsc-modal-header").text(response.title);
718    jQuery(".wpsc-modal-body").html(response.body);
719    jQuery(".wpsc-modal-footer").html(response.footer);
720    wpsc_show_modal_inner_container();
721  });
722}
723
724/**
725 * Update ticket fields
726 *
727 * @param {*} el
728 */
729function wpsc_it_set_edit_ticket_fields(el, ticket_id) {
730  if (wpsc_is_description_text()) {
731    if (confirm(supportcandy.translations.warning_message)) {
732      wpsc_clear_saved_draft_reply(ticket_id);
733    } else {
734      return;
735    }
736  }
737
738  var form = jQuery("form.change-ticket-fields")[0];
739  var dataform = new FormData(form);
740  jQuery(".wpsc-modal-footer button").attr("disabled", true);
741  jQuery(el).text(supportcandy.translations.please_wait);
742  jQuery
743    .ajax({
744      url: supportcandy.ajax_url,
745      type: "POST",
746      data: dataform,
747      processData: false,
748      contentType: false,
749    })
750    .done(function (res) {
751      wpsc_close_modal();
752      wpsc_get_individual_ticket(ticket_id);
753    });
754}
755
756/**
757 * Get agent only filds modal UI
758 */
759function wpsc_it_get_edit_agentonly_fields(ticket_id, nonce) {
760  wpsc_show_modal();
761  var data = {
762    action: "wpsc_it_get_edit_agentonly_fields",
763    ticket_id,
764    _ajax_nonce: nonce,
765  };
766  jQuery.post(supportcandy.ajax_url, data, function (response) {
767    jQuery(".wpsc-modal-header").text(response.title);
768    jQuery(".wpsc-modal-body").html(response.body);
769    jQuery(".wpsc-modal-footer").html(response.footer);
770    wpsc_show_modal_inner_container();
771  });
772}
773
774/**
775 * Update agent only fields
776 *
777 * @param {*} el
778 */
779function wpsc_it_set_edit_agentonly_fields(el, ticket_id) {
780  if (wpsc_is_description_text()) {
781    if (confirm(supportcandy.translations.warning_message)) {
782      wpsc_clear_saved_draft_reply(ticket_id);
783    } else {
784      return;
785    }
786  }
787
788  var form = jQuery("form.change-agentonly-fields")[0];
789  var dataform = new FormData(form);
790  jQuery(".wpsc-modal-footer button").attr("disabled", true);
791  jQuery(el).text(supportcandy.translations.please_wait);
792  jQuery
793    .ajax({
794      url: supportcandy.ajax_url,
795      type: "POST",
796      data: dataform,
797      processData: false,
798      contentType: false,
799    })
800    .done(function (res) {
801      wpsc_close_modal();
802      wpsc_get_individual_ticket(ticket_id);
803    });
804}
805
806/**
807 * Get edit thread
808 */
809function wpsc_it_get_edit_thread(el, ticket_id, thread_id, nonce) {
810  var thread = jQuery(el).closest(".wpsc-thread");
811  thread.html(supportcandy.loader_html);
812
813  var data = {
814    action: "wpsc_it_get_edit_thread",
815    ticket_id,
816    thread_id,
817    _ajax_nonce: nonce,
818  };
819  jQuery.post(supportcandy.ajax_url, data, function (res) {
820    thread.html(res);
821  });
822}
823
824/**
825 * Set edit thread
826 */
827function wpsc_it_set_edit_thread(el, uniqueId) {
828  var form = jQuery("form.edit-thread")[0];
829  var dataform = new FormData(form);
830
831  var is_tinymce =
832    typeof tinyMCE != "undefined" &&
833    tinyMCE.activeEditor &&
834    !tinyMCE.activeEditor.isHidden();
835  var description =
836    is_tinymce && tinymce.get(uniqueId)
837      ? tinyMCE.get(uniqueId).getContent()
838      : jQuery("#" + uniqueId)
839          .val()
840          .trim();
841  if (!description) {
842    return;
843  }
844
845  dataform.append("thread_content", description);
846
847  var thread = jQuery(el).closest(".wpsc-thread");
848  thread.html(supportcandy.loader_html);
849
850  jQuery
851    .ajax({
852      url: supportcandy.ajax_url,
853      type: "POST",
854      data: dataform,
855      processData: false,
856      contentType: false,
857    })
858    .done(function (res) {
859      if (thread.next().length > 0) {
860        thread.next().before(res);
861      } else {
862        thread.parent().append(res);
863      }
864      thread.remove();
865    });
866}
867
868/**
869 * Delete thread
870 */
871function wpsc_it_thread_delete(el, ticket_id, thread_id, nonce) {
872  var flag = confirm(supportcandy.translations.confirm);
873  if (!flag) {
874    return;
875  }
876
877  var thread = jQuery(el).closest(".wpsc-thread");
878  thread.html(supportcandy.loader_html);
879
880  var data = {
881    action: "wpsc_it_thread_delete",
882    ticket_id,
883    thread_id,
884    _ajax_nonce: nonce,
885  };
886  jQuery.post(supportcandy.ajax_url, data, function (res) {
887    if (res.trim()) {
888      if (thread.next().length > 0) {
889        thread.next().before(res);
890      } else {
891        thread.parent().append(res);
892      }
893    }
894    thread.remove();
895  });
896}
897
898/**
899 * Get thread html
900 */
901function wpsc_it_get_thread(el, ticket_id, thread_id, _ajax_nonce) {
902  var thread = jQuery(el).closest(".wpsc-thread");
903  thread.html(supportcandy.loader_html);
904
905  var data = {
906    action: "wpsc_it_get_thread",
907    ticket_id,
908    thread_id,
909    _ajax_nonce,
910  };
911  jQuery.post(supportcandy.ajax_url, data, function (res) {
912    if (thread.next().length > 0) {
913      thread.next().before(res);
914    } else {
915      thread.parent().append(res);
916    }
917    thread.remove();
918  });
919}
920
921/**
922 * View thread log
923 */
924function wpsc_it_view_thread_log(ticket_id, thread_id, log_id, _ajax_nonce) {
925  wpsc_show_modal();
926  var data = {
927    action: "wpsc_it_view_thread_log",
928    ticket_id,
929    thread_id,
930    log_id,
931    _ajax_nonce,
932  };
933  jQuery.post(supportcandy.ajax_url, data, function (response) {
934    jQuery(".wpsc-modal-header").text(response.title);
935    jQuery(".wpsc-modal-body").html(response.body);
936    jQuery(".wpsc-modal-footer").html(response.footer);
937    wpsc_show_modal_inner_container();
938  });
939}
940
941/**
942 * View thread
943 */
944function wpsc_it_view_deleted_thread(ticket_id, thread_id, _ajax_nonce) {
945  wpsc_show_modal();
946  var data = {
947    action: "wpsc_it_view_deleted_thread",
948    ticket_id,
949    thread_id,
950    _ajax_nonce,
951  };
952  jQuery.post(supportcandy.ajax_url, data, function (response) {
953    jQuery(".wpsc-modal-header").text(response.title);
954    jQuery(".wpsc-modal-body").html(response.body);
955    jQuery(".wpsc-modal-footer").html(response.footer);
956    wpsc_show_modal_inner_container();
957  });
958}
959
960/**
961 * Restore thread
962 */
963function wpsc_it_restore_thread(ticket_id, thread_id, _ajax_nonce) {
964  var flag = confirm(supportcandy.translations.confirm);
965  if (!flag) {
966    return;
967  }
968
969  wpsc_close_modal();
970  var thread = jQuery(".wpsc-thread." + thread_id);
971  thread.html(supportcandy.loader_html);
972
973  var data = {
974    action: "wpsc_it_restore_thread",
975    ticket_id,
976    thread_id,
977    _ajax_nonce,
978  };
979  jQuery.post(supportcandy.ajax_url, data, function (res) {
980    if (thread.next().length > 0) {
981      thread.next().before(res);
982    } else {
983      thread.parent().append(res);
984    }
985    thread.remove();
986  });
987}
988
989/**
990 * Restore thread
991 */
992function wpsc_it_thread_delete_permanently(ticket_id, thread_id, _ajax_nonce) {
993  var flag = confirm(supportcandy.translations.confirm);
994  if (!flag) {
995    return;
996  }
997
998  wpsc_close_modal();
999  var thread = jQuery(".wpsc-thread." + thread_id);
1000  thread.html(supportcandy.loader_html);
1001
1002  var data = {
1003    action: "wpsc_it_thread_delete_permanently",
1004    ticket_id,
1005    thread_id,
1006    _ajax_nonce,
1007  };
1008  jQuery.post(supportcandy.ajax_url, data, function (res) {
1009    thread.remove();
1010  });
1011}
1012
1013/**
1014 * Get macros modal UI
1015 */
1016function wpsc_get_macros() {
1017  wpsc_show_modal();
1018  var data = {
1019    action: "wpsc_get_mac
1019ros",
1020  };
1021  jQuery.post(supportcandy.ajax_url, data, function (response) {
1022    // Set to modal.
1023    jQuery(".wpsc-modal-header").text(response.title);
1024    jQuery(".wpsc-modal-body").html(response.body);
1025    jQuery(".wpsc-modal-footer").html(response.footer);
1026    // Display modal.
1027    wpsc_show_modal_inner_container();
1028    jQuery("input[type=text]").focus();
1029  });
1030}
1031
1032/**
1033 * Add and condition item
1034 * @param {*} el
1035 * @param {*} uniqueId
1036 */
1037function wpsc_add_and_condition(el, uniqueId) {
1038  var container = jQuery(el)
1039    .closest(".wpsc-form-filter-container")
1040    .find(".and-container");
1041  container.append(jQuery(".and-template." + uniqueId).html());
1042  container = container.find(".and-item:last-child .or-container");
1043  container.append(jQuery(".or-template." + uniqueId).html());
1044  container.find("select").selectWoo();
1045}
1046
1047/**
1048 * Add and condition item
1049 * @param {*} el
1050 * @param {*} uniqueId
1051 */
1052function wpsc_add_or_condition(el, uniqueId) {
1053  var container = jQuery(el).closest(".and-item").find(".or-container");
1054  container.append(jQuery(".or-template." + uniqueId).html());
1055  container.find(":last-child").find("select").selectWoo();
1056}
1057
1058/**
1059 * Remove condition item
1060 * @param {*} el
1061 */
1062function wpsc_remove_condition_item(el) {
1063  var andItem = jQuery(el).closest(".and-item");
1064  jQuery(el).closest(".wpsc-form-filter-item").remove();
1065  if (andItem.find(".or-container").children().length === 0) {
1066    jQuery(andItem).remove();
1067  }
1068}
1069
1070/**
1071 * Get JSON string for the condition input of given name
1072 * @param {*} name
1073 */
1074function wpsc_get_condition_json(name) {
1075  var conditions = [];
1076  jQuery(".wpsc-form-filter-container." + name + " .and-item").each(
1077    function () {
1078      var andCondition = [];
1079      jQuery(this)
1080        .find(".wpsc-form-filter-item")
1081        .each(function () {
1082          var slug = jQuery(this).find("select.filter").first().val();
1083          if (!slug) {
1084            return;
1085          }
1086          var operator = jQuery(this).find("select.operator").first().val();
1087          if (!operator) {
1088            return;
1089          }
1090          var operand_val_1 = jQuery(this).find(".operand_val_1").first().val();
1091          if (!operand_val_1) {
1092            return;
1093          }
1094          var filter = { slug, operator, operand_val_1 };
1095          if (operator === "BETWEEN") {
1096            var operand_val_2 = jQuery(this)
1097              .find(".operand_val_2")
1098              .first()
1099              .val();
1100            if (!operand_val_2) {
1101              return;
1102            }
1103            filter.operand_val_2 = operand_val_2;
1104          }
1105          andCondition.push(filter);
1106        });
1107      conditions.push(andCondition);
1108    }
1109  );
1110  return conditions;
1111}
1112
1113/**
1114 * Get form filter oprators
1115 */
1116function wpsc_get_ticket_filter_operators(el, nonce) {
1117  var content = jQuery(el).closest(".content");
1118  var slug = jQuery(el).val().trim();
1119
1120  content.find(".conditional, .wpsc-inline-loader").remove();
1121  if (!slug) {
1122    return;
1123  }
1124
1125  content.append(supportcandy.inline_loader);
1126  var data = {
1127    action: "wpsc_get_ticket_filter_operators",
1128    slug: slug,
1129    _ajax_nonce: nonce,
1130  };
1131  jQuery.post(supportcandy.ajax_url, data, function (response) {
1132    content.find(".wpsc-inline-loader").remove();
1133    content.append(response);
1134  });
1135}
1136
1137/**
1138 * Get ticket filter value input(s)
1139 */
1140function wpsc_get_ticket_filter_operands(el, id, nonce) {
1141  var content = jQuery(el).closest(".content");
1142  var operator = jQuery(el).val().trim();
1143
1144  content.find(".conditional.operand, .wpsc-inline-loader").remove();
1145  if (!operator) {
1146    return;
1147  }
1148
1149  content.append(supportcandy.inline_loader);
1150  var data = {
1151    action: "wpsc_get_ticket_filter_operands",
1152    operator,
1153    id,
1154    _ajax_nonce: nonce,
1155  };
1156  jQuery.post(supportcandy.ajax_url, data, function (response) {
1157    content.find(".wpsc-inline-loader").remove();
1158    content.append(response);
1159  });
1160}
1161
1162/**
1163 * Single file attachment upload handler
1164 */
1165function wpsc_set_attach_single(el, uniqueId, slug) {
1166  var fileAttachment = el.files[0];
1167  wpsc_file_upload(fileAttachment, uniqueId, slug, true);
1168  jQuery(el).val("");
1169}
1170
1171/**
1172 * Myltiple file attachment upload handler
1173 */
1174function wpsc_set_attach_multiple(el, uniqueId, slug) {
1175  jQuery.each(el.files, function (index, fileAttachment) {
1176    wpsc_file_upload(fileAttachment, uniqueId, slug);
1177  });
1178  jQuery(el).val("");
1179}
1180
1181/**
1182 * Trigger description attachments
1183 */
1184function wpsc_trigger_desc_attachments(uniqueId) {
1185  jQuery("input." + uniqueId).trigger("click");
1186}
1187
1188/**
1189 * Remove an attachment
1190 */
1191function wpsc_remove_attachment(el) {
1192  var single = jQuery(el).data("single");
1193  var uniqueId = jQuery(el).data("uniqueid");
1194  jQuery(el).closest(".wpsc-editor-attachment").remove();
1195  if (single) {
1196    jQuery("input." + uniqueId).show();
1197  }
1198}
1199
1200/**
1201 * Attachment upload progess update
1202 */
1203function wpscAttachmentUploadProgress(e) {
1204  if (e.lengthComputable) {
1205    var max = e.total;
1206    var current = e.loaded;
1207    var progrss = current / max;
1208    e.currentTarget.attachment
1209      .find(".attachment-waiting")
1210      .circleProgress("value", progrss);
1211  }
1212}
1213
1214/**
1215 * Change raised by or create ticket as
1216 */
1217function wpsc_get_change_create_as(nonce) {
1218  wpsc_show_modal();
1219  var data = { action: "wpsc_get_change_create_as", _ajax_nonce: nonce };
1220  jQuery.post(supportcandy.ajax_url, data, function (response) {
1221    // Set to modal.
1222    jQuery(".wpsc-modal-header").text(response.title);
1223    jQuery(".wpsc-modal-body").html(response.body);
1224    jQuery(".wpsc-modal-footer").html(response.footer);
1225    // Display modal.
1226    wpsc_show_modal_inner_container();
1227  });
1228}
1229
1230/**
1231 * Change create as
1232 */
1233function wpsc_set_change_create_as(uniqueId, _ajax_nonce) {
1234  var name = jQuery("input.name." + uniqueId)
1235    .val()
1236    .trim();
1237  var email = jQuery("input.email." + uniqueId)
1238    .val()
1239    .trim();
1240  if (!name || !email) {
1241    alert(supportcandy.translations.req_fields_missing);
1242    return;
1243  }
1244
1245  if (!validateEmail(email)) {
1246    alert(supportcandy.translations.invalidEmail);
1247    return;
1248  }
1249
1250  var data = { action: "wpsc_add_new_create_as", name, email, _ajax_nonce };
1251  jQuery.post(supportcandy.ajax_url, data, function (response) {
1252    jQuery("input.name").val(response.name);
1253    jQuery("input.email").val(response.email);
1254
1255    // add option and select.
1256    if (jQuery("select.create-as").val() != response.id) {
1257      var newOption = new Option(response.label, response.id, false, false);
1258      jQuery("select.create-as").append(newOption);
1259      jQuery("select.create-as").val(response.id).trigger("change");
1260    }
1261
1262    wpsc_close_modal();
1263    wpsc_after_change_create_as();
1264  });
1265}
1266
1267/**
1268 * Check visibility conditions
1269 */
1270function wpsc_check_tff_visibility() {
1271  var conditionalFields = jQuery(".wpsc-tff.conditional");
1272  if (conditionalFields.length === 0) {
1273    return;
1274  }
1275
1276  const callerId = Math.floor(Math.random() * 100000);
1277  supportcandy.checkTffVisibityCallers =
1278    supportcandy.checkTffVisibityCallers || [];
1279  supportcandy.checkTffVisibityCallers.push(callerId);
1280
1281  jQuery(".wpsc-ct-loader").html(supportcandy.inline_loader);
1282  jQuery("select.create-as").attr("disabled", true);
1283
1284  var form = jQuery("form.wpsc-create-ticket")[0];
1285  var dataform = new FormData(form);
1286
1287  var is_tinymce =
1288    typeof tinyMCE != "undefined" &&
1289    tinyMCE.activeEditor &&
1290    !tinyMCE.activeEditor.isHidden();
1291  if (is_tinymce && tinymce.get("description")) {
1292    var description = tinyMCE.get("description").getContent();
1293  } else {
1294    var description = jQuery("#description").val();
1295  }
1296
1297  dataform.append("description", description);
1298  dataform.append("action", "wpsc_check_tff_visibility");
1299  jQuery
1300    .ajax({
1301      url: supportcandy.ajax_url,
1302      type: "POST",
1303      data: dataform,
1304      processData: false,
1305      contentType: false,
1306    })
1307    .done(function (results) {
1308      jQuery.each(results, function (key, val) {
1309        if (parseInt(val) === 0) {
1310          jQuery(".wpsc-tff." + key).addClass("wpsc-hidden");
1311          jQuery(".wpsc-tff." + key).removeClass("wpsc-visible");
1312        } else {
1313          jQuery(".wpsc-tff." + key).removeClass("wpsc-hidden");
1314          jQuery(".wpsc-tff." + key).addClass("wpsc-visible");
1315        }
1316      });
1317      jQuery(".wpsc-ct-loader").html("");
1318      jQuery("select.create-as").removeAttr("disabled");
1319    })
1320    .fail(function (xhr, status, error) {
1321      console.error("AJAX request failed:", status, error);
1322      jQuery(".wpsc-ct-loader").html("");
1323      jQuery("select.create-as").removeAttr("disabled");
1324    })
1325    .always(function () {
1326      // remove callerId from supportcandy.checkTffVisibityCallers array
1327      supportcandy.checkTffVisibityCallers =
1328        supportcandy.checkTffVisibityCallers.filter(function (id) {
1329          return id !== callerId;
1330        });
1331    });
1332}
1333
1334/**
1335 * Validate input for email address
1336 */
1337function validateEmail(email) {
1338  var re =
1339    /^(([^<>()\[\]\\.,;:\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,}))$/;
1340  return re.test(email);
1341}
1342
1343/**
1344 * Validate input for URL
1345 */
1346function validateURL(url) {
1347  var re =
1348    /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/;
1349  return re.test(url);
1350}
1351
1352/**
1353 * Validate input for number
1354 */
1355function validateNumber(number) {
1356  var re = /^[0-9]+$/;
1357  return re.test(number);
1358}
1359
1360/**
1361 * Change event for filter
1362 */
1363function wpsc_tl_filter_change(el, type) {
1364  const filterSlug = jQuery(el).val()?.trim();
1365  const isTicketList = type === 'ticket_list';
1366  supportcandy.prevFilter = supportcandy.ticketList.filters.filterSlug;
1367
1368  if (filterSlug === 'custom') {
1369    wpsc_tl_get_custom_filter( type );
1370    return;
1371  }
1372
1373  supportcandy.ticketList.filters = { filterSlug };
1374  isTicketList ? wpsc_get_tickets() : wpsc_get_archive_tickets();
1375}
1376
1377/**
1378 * Change ticket list page
1379 */
1380function wpsc_tl_set_page(page, type) {
1381  switch (page) {
1382    case "first":
1383      if (supportcandy.ticketList.pagination.current_page == 1) {
1384        return;
1385      }
1386      supportcandy.ticketList.filters.page_no = 1;
1387      break;
1388
1389    case "prev":
1390      if (supportcandy.ticketList.pagination.current_page < 2) {
1391        return;
1392      }
1393      supportcandy.ticketList.filters.page_no =
1394        supportcandy.ticketList.pagination.current_page - 1;
1395      break;
1396
1397    case "next":
1398      if (!supportcandy.ticketList.pagination.has_next_page) {
1399        return;
1400      }
1401      supportcandy.ticketList.filters.page_no =
1402        supportcandy.ticketList.pagination.current_page + 1;
1403      break;
1404
1405    case "last":
1406      if (
1407        supportcandy.ticketList.pagination.current_page ==
1408        supportcandy.ticketList.pagination.total_pages
1409      ) {
1410        return;
1411      }
1412      supportcandy.ticketList.filters.page_no =
1413        supportcandy.ticketList.pagination.total_pages;
1414      break;
1415  }
1416  type === 'ticket_list' ? wpsc_get_tickets() : wpsc_get_archive_tickets();
1417}
1418
1419/**
1420 * Reset ticket list filters
1421 */
1422function wpsc_tl_reset_filter( type ) {
1423  var filters = { filterSlug: "" };
1424  supportcandy.ticketList.filters = filters;
1425  type === 'ticket_list' ? wpsc_get_tickets() : wpsc_get_archive_tickets();
1426}
1427
1428/**
1429 * Search input keyup
1430 */
1431function wpsc_tl_search_keyup(e, el, type) {
1432  if (e.keyCode !== 13) {
1433    return;
1434  }
1435  var search = jQuery(el).val().trim();
1436  supportcandy.ticketList.filters.search = search;
1437  supportcandy.ticketList.filters.page_no = 1;
1438  type === 'ticket_list' ? wpsc_get_tickets() : wpsc_get_archive_tickets();
1439}
1440
1441/**
1442 * Apply filters
1443 */
1444function wpsc_tl_apply_filter_btn_click( type ) {
1445  supportcandy.ticketList.filters.search = jQuery("input.wpsc-search-input")
1446    .val()
1447    .trim();
1448  supportcandy.ticketList.filters.orderby = jQuery(
1449    "select.wpsc-input-sort-by"
1450  ).val();
1451  supportcandy.ticketList.filters.order = jQuery(
1452    "select.wpsc-input-sort-order"
1453  ).val();
1454  supportcandy.ticketList.filters.page_no = 1;
1455  type === 'ticket_list' ? wpsc_get_tickets() : wpsc_get_archive_tickets();
1456}
1457
1458/**
1459 * Get custom filter UI
1460 */
1461function wpsc_tl_get_custom_filter( type ) {
1462  wpsc_show_modal();
1463  
1464  const isTicketList = type === 'ticket_list';
1465  const action = isTicketList ? 'wpsc_get_tl_custom_filter' : 'wpsc_get_atl_custom_filter';
1466
1467  const data = {
1468    action,
1469    _ajax_nonce: supportcandy.nonce,
1470  };
1471  if (supportcandy.ticketList.filters.filterSlug === 'custom') {
1472    data.filters = supportcandy.ticketList.filters;
1473  }
1474  jQuery.post(supportcandy.ajax_url, data, function (response) {
1475    jQuery('.wpsc-modal-header').text(response.title);
1476    jQuery('.wpsc-modal-body').html(response.body);
1477    jQuery('.wpsc-modal-footer').html(response.footer);
1478    wpsc_show_modal_inner_container();
1479  });
1480}
1481
1482/**
1483 * Apply custom filter
1484 */
1485function wpsc_tl_apply_custom_filter(el, type) {
1486
1487  var filters = wpsc_get_condition_json("custom_filters");
1488  if (
1489    filters.length === 0 ||
1490    (filters.length === 1 && filters[0].length === 0)
1491  ) {
1492    alert(supportcandy.translations.req_fields_missing);
1493    return;
1494  }
1495  
1496  const cust_filter = type === "ticket_list" ? "wpsc-tl-custom-filter" : "wpsc-atl-custom-filter";
1497  filters = {
1498    filterSlug: "custom",
1499    "parent-filter": jQuery(
1500      "." + cust_filter + " select[name=parent-filter]"
1501    ).val(),
1502    filters: JSON.stringify(filters),
1503    orderby: jQuery("." + cust_filter + " select[name=sort-by]").val(),
1504    order: jQuery("." + cust_filter + " select[name=sort-order]").val(),
1505    page_no: 1,
1506  };
1507  supportcandy.ticketList.filters = filters;
1508
1509  wpsc_close_modal();
1510  type === "ticket_list" ? wpsc_get_tickets() : wpsc_get_archive_tickets();
1511}
1512
1513/**
1514 * Edit ticket list filter
1515 */
1516function wpsc_tl_edit_filter( type ) {
1517  if (supportcandy.ticketList.filters.filterSlug == "custom") {
1518    wpsc_tl_get_custom_filter( type );
1519  } else {
1520    type === "ticket_list" ? wpsc_tl_get_edit_saved_filter() : wpsc_atl_get_edit_saved_filter();
1521  }
1522}
1523
1524/**
1525 * Add saved filter
1526 */
1527function wpsc_tl_add_saved_filter() {
1528  var filters = wpsc_get_condition_json("custom_filters");
1529  if (
1530    filters.length === 0 ||
1531    (filters.length === 1 && filters[0].length === 0)
1532  ) {
1533    alert(supportcandy.translations.req_fields_missing);
1534    return;
1535  }
1536
1537  filters = {
1538    "parent-filter": jQuery(
1539      ".wpsc-tl-custom-filter select[name=parent-filter]"
1540    ).val(),
1541    filters: JSON.stringify(filters),
1542    orderby: jQuery(".wpsc-tl-custom-filter select[name=sort-by]").val(),
1543    order: jQuery(".wpsc-tl-custom-filter select[name=sort-order]").val(),
1544  };
1545
1546  supportcandy.tempFilters = filters;
1547  wpsc_close_modal();
1548  setTimeout(function () {
1549    wpsc_tl_get_add_saved_filter();
1550  }, 500);
1551}
1552
1553/**
1554 * Get add saved filter ui
1555 */
1556function wpsc_tl_get_add_saved_filter() {
1557  wpsc_show_modal();
1558  var data = { action: "wpsc_tl_get_add_saved_filter" };
1559  jQuery.post(supportcandy.ajax_url, data, function (response) {
1560    // Set to modal.
1561    jQuery(".wpsc-modal-header").text(response.title);
1562    jQuery(".wpsc-modal-body").html(response.body);
1563    jQuery(".wpsc-modal-footer").html(response.footer);
1564    // Display modal.
1565    wpsc_show_modal_inner_container();
1566  });
1567}
1568
1569/**
1570 * Save and apply custom filter
1571 */
1572function wpsc_tl_set_add_saved_filter(el, nonce) {
1573  var label = jQuery("input.wpsc-cf-label").val().trim();
1574  if (!label) {
1575    alert(supportcandy.translations.req_fields_missing);
1576    return;
1577  }
1578
1579  jQuery(".wpsc-modal-footer button").attr("disabled", true);
1580  jQuery(el).text(supportcandy.translations.please_wait);
1581
1582  var data = {
1583    action: "wpsc_tl_set_add_saved_filter",
1584    filters: supportcandy.tempFilters,
1585    _ajax_nonce: nonce,
1586  };
1587  data.filters.label = label;
1588
1589  jQuery.post(supportcandy.ajax_url, data, function (response) {
1590    supportcandy.ticketList.filters = { filterSlug: response.slug };
1591    wpsc_close_modal();
1592    wpsc_get_ticket_list();
1593  });
1594}
1595
1596/**
1597 * Get edit saved filter modal
1598 */
1599function wpsc_tl_get_edit_saved_filter() {
1600  wpsc_show_modal();
1601  var data = {
1602    action: "wpsc_tl_get_edit_saved_filter",
1603    filterSlug: supportcandy.ticketList.filters.filterSlug,
1604    _ajax_nonce: supportcandy.nonce,
1605  };
1606  jQuery.post(supportcandy.ajax_url, data, function (response) {
1607    // Set to modal.
1608    jQuery(".wpsc-modal-header").text(response.title);
1609    jQuery(".wpsc-modal-body").html(response.body);
1610    jQuery(".wpsc-modal-footer").html(response.footer);
1611    // Display modal.
1612    wpsc_show_modal_inner_container();
1613  });
1614}
1615
1616/**
1617 * Set edit saved filter
1618 */
1619function wpsc_tl_set_edit_saved_filter(el) {
1620  var label = jQuery("input.wpsc-cf-label").val().trim();
1621  if (!label) {
1622    alert(supportcandy.translations.req_fields_missing);
1623    return;
1624  }
1625
1626  var filters = wpsc_get_condition_json("custom_filters");
1627  if (
1628    filters.length === 0 ||
1629    (filters.length === 1 && filters[0].length === 0)
1630  ) {
1631    alert(supportcandy.translations.req_fields_missing);
1632    return;
1633  }
1634
1635  jQuery(".wpsc-modal-footer button").attr("disabled", true);
1636  jQuery(el).text(supportcandy.translations.please_wait);
1637
1638  var form = jQuery(".wpsc-tl-custom-filter")[0];
1639  var dataform = new FormData(form);
1640  dataform.append("filters", JSON.stringify(filters));
1641
1642  jQuery
1643    .ajax({
1644      url: supportcandy.ajax_url,
1645      type: "POST",
1646      data: dataform,
1647      processData: false,
1648      contentType: false,
1649    })
1650    .done(function (res) {
1651      wpsc_close_modal();
1652      wpsc_get_ticket_list();
1653    });
1654}
1655
1656/**
1657 * Delete saved filter
1658 */
1659function wpsc_tl_delete_saved_filter( type ) {
1660  var flag = confirm(supportcandy.translations.confirm);
1661  if (!flag) {
1662    return;
1663  }
1664
1665  var data = {
1666    action: "wpsc_tl_delete_saved_filter",
1667    slug: supportcandy.ticketList.filters.filterSlug,
1668    _ajax_nonce: supportcandy.nonce,
1669  };
1670  jQuery.post(supportcandy.ajax_url, data, function (res) {
1671    supportcandy.ticketList.filters = { filterSlug: "" };
1672    wpsc_get_ticket_list();
1673  });
1674}
1675
1676/**
1677 * Close custom filter modal
1678 */
1679function wpsc_tl_close_custom_filter_modal() {
1680  jQuery("select.wpsc-input-filter").val(supportcandy.prevFilter);
1681  wpsc_close_modal();
1682}
1683
1684/**
1685 * Get form filter oprators
1686 */
1687function wpsc_tc_get_operators(el, nonce) {
1688  var content = jQuery(el).closest(".content");
1689  var slug = jQuery(el).val().trim();
1690
1691  content.find(".conditional, .wpsc-inline-loader").remove();
1692  if (!slug) {
1693    return;
1694  }
1695
1696  content.append(supportcandy.inline_loader);
1697  var data = {
1698    action: "wpsc_tc_get_operators",
1699    slug: slug,
1700    _ajax_nonce: nonce,
1701  };
1702  jQuery.post(supportcandy.ajax_url, data, function (response) {
1703    content.find(".wpsc-inline-loader").remove();
1704    content.append(response);
1705  });
1706}
1707
1708/**
1709 * Get email notification condition operands
1710 */
1711function wpsc_tc_get_operand(el, slug, nonce) {
1712  var content = jQuery(el).closest(".content");
1713  var operator = jQuery(el).val().trim();
1714
1715  content.find(".conditional.operand, .wpsc-inline-loader").remove();
1716  if (!operator) {
1717    return;
1718  }
1719
1720  content.append(supportcandy.inline_loader);
1721  var data = {
1722    action: "wpsc_tc_get_operand",
1723    operator,
1724    slug,
1725    _ajax_nonce: nonce,
1726  };
1727  jQuery.post(supportcandy.ajax_url, data, function (response) {
1728    content.find(".wpsc-inline-loader").remove();
1729    content.append(response);
1730  });
1731}
1732
1733/**
1734 * Add image to editor
1735 *
1736 * @param {*} editor
1737 */
1738function wpsc_add_custom_image_tinymce(editor, nonce) {
1739  wpsc_show_modal();
1740  var data = {
1741    action: "wpsc_add_custom_image_tinymce",
1742    editor_id: editor.id,
1743    _ajax_nonce: nonce,
1744  };
1745  jQuery.post(supportcandy.ajax_url, data, function (response) {
1746    // Set to modal.
1747    jQuery(".wpsc-modal-header").text(response.title);
1748    jQuery(".wpsc-modal-body").html(response.body);
1749    jQuery(".wpsc-modal-footer").html(response.footer);
1750    // Display modal.
1751    wpsc_show_modal_inner_container();
1752  });
1753}
1754
1755/**
1756 * Check whether given url has image or not
1757 *
1758 * @param {*} url
1759 */
1760function isValidImageURL(url) {
1761  if (typeof url !== "string") {
1762    return false;
1763  }
1764  return !!url.match(/\w+\.(jpg|jpeg|gif|png|tiff|bmp)$/gi);
1765}
1766
1767/**
1768 * Upload image to tinymce editor
1769 *
1770 * @param {*} el
1771 */
1772function wpsc_insert_editor_img(ed) {
1773  if (
1774    jQuery("#wpsc-tinymce-image-url").val().trim() === "" &&
1775    validateURL(jQuery("#wpsc-tinymce-image-url").val().trim()) &&
1776    isValidImageURL(jQuery("#wpsc-tinymce-image-url").val().trim())
1777  ) {
1778    alert(supportcandy.translations.req_fields_error);
1779    return;
1780  }
1781
1782  if (jQuery("#wpsc-tinymce-image-width").val().trim() === "") {
1783    alert(supportcandy.translations.req_fields_error);
1784    return;
1785  }
1786
1787  if (jQuery("#wpsc-tinymce-image-height").val().trim() === "") {
1788    alert(supportcandy.translations.req_fields_error);
1789    return;
1790  }
1791
1792  var is_tinymce =
1793    typeof tinyMCE != "undefined" &&
1794    tinyMCE.activeEditor &&
1795    !tinyMCE.activeEditor.isHidden();
1796  if (!is_tinymce) {
1797    return;
1798  }
1799
1800  wpsc_close_modal();
1801
1802  var source = jQuery("#wpsc-tinymce-image-url").val().trim();
1803  var height = jQuery("#wpsc-tinymce-image-height").val().trim();
1804  var width = jQuery("#wpsc-tinymce-image-width").val().trim();
1805  tinymce
1806    .get(ed)
1807    .execCommand(
1808      "mceInsertContent",
1809      false,
1810      '<img height="' +
1811        height +
1812        '" width="' +
1813        width +
1814        '" src="' +
1815        source +
1816        '"/>'
1817    );
1818}
1819
1820/**
1821 * Add image to editor
1822 *
1823 * @param {*} editor
1824 */
1825function wpsc_edit_custom_image_tinymce(editor, image_obj, nonce) {
1826  if (!(editor && image_obj)) {
1827    alert(supportcandy.translations.req_fields_error);
1828    return;
1829  }
1830
1831  wpsc_show_modal();
1832  var data = {
1833    action: "wpsc_edit_custom_image_tinymce",
1834    editor_id: editor.id,
1835    height: image_obj.height,
1836    width: image_obj.width,
1837    src: image_obj.src,
1838    _ajax_nonce: nonce,
1839  };
1840  jQuery.post(supportcandy.ajax_url, data, function (response) {
1841    // Set to modal.
1842    jQuery(".wpsc-modal-header").text(response.title);
1843    jQuery(".wpsc-modal-body").html(response.body);
1844    jQuery(".wpsc-modal-footer").html(response.footer);
1845    // Display modal.
1846    wpsc_show_modal_inner_container();
1847  });
1848}
1849
1850/**
1851 * Get create ticket from thread
1852 */
1853function wpsc_it_thread_new_ticket(el, ticket_id, thread_id, nonce) {
1854  wpsc_show_modal();
1855  var data = {
1856    action: "wpsc_it_thread_new_ticket",
1857    ticket_id,
1858    thread_id,
1859    _ajax_nonce: nonce,
1860  };
1861  jQuery.post(supportcandy.ajax_url, data, function (response) {
1862    jQuery(".wpsc-modal-header").text(response.title);
1863    jQuery(".wpsc-modal-body").html(response.body);
1864    jQuery(".wpsc-modal-footer").html(response.footer);
1865    wpsc_show_modal_inner_container();
1866  });
1867}
1868
1869/**
1870 * Get thread info
1871 *
1872 * @param {*} thread_id
1873 */
1874function wpsc_it_thread_info(el, ticket_id, thread_id, nonce, type = 'ticket_list') {
1875  wpsc_show_modal();
1876  var data = {
1877    action: type === 'ticket_list' ? "wpsc_it_thread_info" : "wpsc_it_archive_thread_info",
1878    thread_id,
1879    ticket_id,
1880    _ajax_nonce: nonce,
1881  };
1882  jQuery.post(supportcandy.ajax_url, data, function (response) {
1883    jQuery(".wpsc-modal-header").text(response.title);
1884    jQuery(".wpsc-modal-body").html(response.body);
1885    jQuery(".wpsc-modal-footer").html(response.footer);
1886    wpsc_show_modal_inner_container();
1887  });
1888}
1889
1890/**
1891 * Set thread new ticket
1892 */
1893function wpsc_it_set_thread_new_ticket(el, thread_id, nonce) {
1894  var form = jQuery("form.new_ticket_from_thread")[0];
1895  var dataform = new FormData(form);
1896  jQuery(".wpsc-modal-footer button").attr("disabled", true);
1897  jQuery(el).text(supportcandy.translations.please_wait);
1898  jQuery
1899    .ajax({
1900      url: supportcandy.ajax_url,
1901      type: "POST",
1902      data: dataform,
1903      processData: false,
1904      contentType: false,
1905    })
1906    .done(function (response) {
1907      wpsc_close_modal();
1908      wpsc_get_individual_ticket(response.ticket_id);
1909    });
1910}
1911
1912/**
1913 * Get customer other tickets
1914 */
1915function wpsc_get_rb_other_tickets(el, ticket_id, nonce) {
1916  wpsc_show_modal();
1917  var data = {
1918    action: "wpsc_get_rb_other_tickets",
1919    ticket_id,
1920    _ajax_nonce: nonce,
1921  };
1922  jQuery.post(supportcandy.ajax_url, data, function (response) {
1923    jQuery(".wpsc-modal-header").text(response.title);
1924    jQuery(".wpsc-modal-body").html(response.body);
1925    jQuery(".wpsc-modal-footer").html(response.footer);
1926    wpsc_show_modal_inner_container();
1927  });
1928}
1929
1930/**
1931 * Get raised by info
1932 */
1933function wpsc_get_rb_info(el, ticket_id, nonce) {
1934  wpsc_show_modal();
1935  var data = { action: "wpsc_get_rb_info", ticket_id, _ajax_nonce: nonce };
1936  jQuery.post(supportcandy.ajax_url, data, function (response) {
1937    jQuery(".wpsc-modal-header").text(response.title);
1938    jQuery(".wpsc-modal-body").html(response.body);
1939    jQuery(".wpsc-modal-footer").html(response.footer);
1940    wpsc_show_modal_inner_container();
1941  });
1942}
1943
1944/**
1945 *  Thread expander
1946 */
1947function wpsc_ticket_thread_expander_toggle(el) {
1948  var height = parseInt(jQuery(el).parent().find(".thread-text").height());
1949  if (height === 100) {
1950    jQuery(el).parent().find(".thread-text").height("auto");
1951    jQuery(el).text(supportcandy.translations.view_less);
1952  } else {
1953    jQuery(el).parent().find(".thread-text").height(100);
1954    jQuery(el).text(supportcandy.translations.view_more);
1955  }
1956}
1957
1958/**
1959 * Get change bulk status
1960 */
1961function wpsc_bulk_change_status(nonce) {
1962  var items = jQuery(".wpsc-bulk-select:checked");
1963  var checked = items.length === 0 ? false : true;
1964  jQuery(".wpsc-bulk-selector").prop("checked", checked);
1965  if (items.length != 0) {
1966    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
1967      .map(function () {
1968        return this.value;
1969      })
1970      .get();
1971    wpsc_show_modal();
1972    var data = {
1973      action: "wpsc_bulk_change_status",
1974      ticket_ids,
1975      _ajax_nonce: nonce,
1976    };
1977    jQuery.post(supportcandy.ajax_url, data, function (response) {
1978      // Set to modal.
1979      jQuery(".wpsc-modal-header").text(response.title);
1980      jQuery(".wpsc-modal-body").html(response.body);
1981      jQuery(".wpsc-modal-footer").html(response.footer);
1982      // Display modal.
1983      wpsc_show_modal_inner_container();
1984    });
1985  }
1986}
1987
1988/**
1989 * Load older threads
1990 */
1991function wpsc_load_older_threads(el, ticket_id) {
1992  if (supportcandy.reply_form_position === "top") {
1993    jQuery(".wpsc-it-thread-section-container").append(
1994      supportcandy.loader_html
1995    );
1996  } else {
1997    jQuery(".wpsc-it-thread-section-container").prepend(
1998      supportcandy.loader_html
1999    );
2000  }
2001
2002  var oldBtnContainer = jQuery(el).parent();
2003  oldBtnContainer.hide();
2004
2005  var data = {
2006    action: "wpsc_load_older_threads",
2007    ticket_id,
2008    last_thread: supportcandy.threads.last_thread,
2009  };
2010  jQuery.post(supportcandy.ajax_url, data, function (response) {
2011    jQuery(".wpsc-it-thread-section-container").find(".wpsc-loader").remove();
2012    // add threads.
2013    if (supportcandy.reply_form_position === "top") {
2014      jQuery(".wpsc-it-thread-section-container").append(response.threads);
2015    } else {
2016      var scrollHeightBody = jQuery("body").prop("scrollHeight");
2017      var windowScrollTop = jQuery(window).scrollTop();
2018      jQuery(".wpsc-it-thread-section-container").prepend(response.threads);
2019      var scrollDiff = jQuery("body").prop("scrollHeight") - scrollHeightBody;
2020      jQuery(window).scrollTop(windowScrollTop + scrollDiff);
2021    }
2022    // show btn if there are more threads available.
2023    if (response.has_next_page) {
2024      supportcandy.threads.last_thread = response.last_thread;
2025      oldBtnContainer.show();
2026    }
2027  });
2028}
2029
2030/**
2031 * Set change bulk status
2032 */
2033function wpsc_set_bulk_change_status(el) {
2034  var form = jQuery("form.frm-edit-bulk-status")[0];
2035  var dataform = new FormData(form);
2036  jQuery(".wpsc-modal-footer button").attr("disabled", true);
2037  jQuery(el).text(supportcandy.translations.please_wait);
2038  jQuery
2039    .ajax({
2040      url: supportcandy.ajax_url,
2041      type: "POST",
2042      data: dataform,
2043      processData: false,
2044      contentType: false,
2045    })
2046    .done(function (res) {
2047      wpsc_close_modal();
2048      wpsc_get_ticket_list();
2049      wpsc_run_ajax_background_process();
2050    });
2051}
2052
2053/**
2054 * Get bulk assign agent
2055 */
2056function wpsc_bulk_assign_agents(nonce) {
2057  var items = jQuery(".wpsc-bulk-select:checked");
2058  var checked = items.length === 0 ? false : true;
2059  jQuery(".wpsc-bulk-selector").prop("checked", checked);
2060  if (items.length != 0) {
2061    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
2062      .map(function () {
2063        return this.value;
2064      })
2065      .get();
2066    wpsc_show_modal();
2067    var data = {
2068      action: "wpsc_bulk_assign_agents",
2069      ticket_ids,
2070      _ajax_nonce: nonce,
2071    };
2072    jQuery.post(supportcandy.ajax_url, data, function (response) {
2073      // Set to modal.
2074      jQuery(".wpsc-modal-header").text(response.title);
2075      jQuery(".wpsc-modal-body").html(response.body);
2076      jQuery(".wpsc-modal-footer").html(response.footer);
2077      // Display modal.
2078      wpsc_show_modal_inner_container();
2079    });
2080  }
2081}
2082
2083/**
2084 * Set change assign agent
2085 */
2086function wpsc_set_bulk_assign_agent(el) {
2087  var form = jQuery("form.frm-bulk-assign-agent")[0];
2088  var dataform = new FormData(form);
2089  jQuery(".wpsc-modal-footer button").attr("disabled", true);
2090  jQuery(el).text(supportcandy.translations.please_wait);
2091  jQuery
2092    .ajax({
2093      url: supportcandy.ajax_url,
2094      type: "POST",
2095      data: dataform,
2096      processData: false,
2097      contentType: false,
2098    })
2099    .done(function (res) {
2100      wpsc_close_modal();
2101      wpsc_get_ticket_list();
2102      wpsc_run_ajax_background_process();
2103    });
2104}
2105
2106/**
2107 * Get bulk assign tags
2108 */
2109function wpsc_bulk_assign_tags(nonce) {
2110  var items = jQuery(".wpsc-bulk-select:checked");
2111  var checked = items.length === 0 ? false : true;
2112  jQuery(".wpsc-bulk-selector").prop("checked", checked);
2113  if (items.length != 0) {
2114    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
2115      .map(function () {
2116        return this.value;
2117      })
2118      .get();
2119    wpsc_show_modal();
2120    var data = {
2121      action: "wpsc_bulk_assign_tags",
2122      ticket_ids,
2123      _ajax_nonce: nonce,
2124    };
2125    jQuery.post(supportcandy.ajax_url, data, function (response) {
2126      // Set to modal.
2127      jQuery(".wpsc-modal-header").text(response.title);
2128      jQuery(".wpsc-modal-body").html(response.body);
2129      jQuery(".wpsc-modal-footer").html(response.footer);
2130      // Display modal.
2131      wpsc_show_modal_inner_container();
2132    });
2133  }
2134}
2135
2136/**
2137 * Set change assign tags
2138 */
2139function wpsc_set_bulk_assign_tag(el) {
2140  var form = jQuery("form.frm-bulk-assign-tags")[0];
2141  var dataform = new FormData(form);
2142
2143  var tags = dataform.getAll("tags[]");
2144  if (!tags.length) {
2145    return;
2146  }
2147
2148  jQuery(".wpsc-modal-footer button").attr("disabled", true);
2149  jQuery(el).text(supportcandy.translations.please_wait);
2150  jQuery
2151    .ajax({
2152      url: supportcandy.ajax_url,
2153      type: "POST",
2154      data: dataform,
2155      processData: false,
2156      contentType: false,
2157    })
2158    .done(function (res) {
2159      wpsc_close_modal();
2160      wpsc_get_ticket_list();
2161      wpsc_run_ajax_background_process();
2162    });
2163}
2164
2165/**
2166 * Get bulk archive ticket
2167 */
2168function wpsc_bulk_archive_tickets(nonce) {
2169  var items = jQuery(".wpsc-bulk-select:checked");
2170  var checked = items.length === 0 ? false : true;
2171  jQuery(".wpsc-bulk-selector").prop("checked", checked);
2172  if (items.length != 0) {
2173    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
2174      .map(function () {
2175        return this.value;
2176      })
2177      .get();
2178    var flag = confirm(supportcandy.translations.confirm);
2179    if (!flag) {
2180      return;
2181    }
2182
2183    var data = {
2184      action: "wpsc_bulk_archive_tickets",
2185      ticket_ids,
2186      _ajax_nonce: nonce,
2187    };
2188    jQuery.post(supportcandy.ajax_url, data, function (response) {
2189      wpsc_get_ticket_list();
2190      wpsc_run_ajax_background_process();
2191    });
2192  }
2193}
2194
2195/**
2196 * Get bulk permanently delete ticket
2197 */
2198function wpsc_bulk_permanently_delete_tickets(nonce) {
2199  var items = jQuery(".wpsc-bulk-select:checked");
2200  var checked = items.length === 0 ? false : true;
2201  jQuery(".wpsc-bulk-selector").prop("checked", checked);
2202  if (items.length != 0) {
2203    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
2204      .map(function () {
2205        return this.value;
2206      })
2207      .get();
2208    var flag = confirm(supportcandy.translations.delete_permanently);
2209    if (!flag) {
2210      return;
2211    }
2212
2213    var data = {
2214      action: "wpsc_bulk_permanently_delete_tickets",
2215      ticket_ids,
2216      _ajax_nonce: nonce,
2217    };
2218    jQuery.post(supportcandy.ajax_url, data, function (response) {
2219      wpsc_get_ticket_list();
2220      wpsc_run_ajax_background_process();
2221    });
2222  }
2223}
2224
2225/**
2226 * Set agent working hrs
2227 */
2228function wpsc_set_agent_wh_hrs(el) {
2229  const form = jQuery(".wpsc-frm-agent-wh")[0];
2230  const dataform = new FormData(form);
2231  jQuery(el).text(supportcandy.translations.please_wait);
2232  jQuery(".wpsc-section-container").html(supportcandy.loader_html);
2233  jQuery
2234    .ajax({
2235      url: supportcandy.ajax_url,
2236      type: "POST",
2237      data: dataform,
2238      processData: false,
2239      contentType: false,
2240    })
2241    .done(function (res) {
2242      window.location.reload();
2243    });
2244}
2245
2246/**
2247 * Set add agent exception
2248 */
2249function wpsc_set_add_agent_wh_exception(el) {
2250  var title = jQuery("input[name=title]").val();
2251  var from_date = jQuery("input[name=exception_date]").val();
2252  if (!title || !from_date) {
2253    alert(supportcandy.translations.req_fields_missing);
2254    return;
2255  }
2256  const form = jQuery(".wpsc-frm-add-agent-exception")[0];
2257  const dataform = new FormData(form);
2258  jQuery(el).text(supportcandy.translations.please_wait);
2259  jQuery
2260    .ajax({
2261      url: supportcandy.ajax_url,
2262      type: "POST",
2263      data: dataform,
2264      processData: false,
2265      contentType: false,
2266    })
2267    .done(function (res) {
2268      window.location.reload();
2269    });
2270}
2271
2272/**
2273 * Update agent working hour exception
2274 */
2275function wpsc_set_edit_agent_wh_exception(el) {
2276  var title = jQuery("input[name=title]").val();
2277  var from_date = jQuery("input[name=exception_date]").val();
2278  if (!title || !from_date) {
2279    alert(supportcandy.translations.req_fields_missing);
2280    return;
2281  }
2282
2283  const form = jQuery(".wpsc-frm-edit-agent-exception")[0];
2284  const dataform = new FormData(form);
2285  jQuery(el).text(supportcandy.translations.please_wait);
2286  jQuery
2287    .ajax({
2288      url: supportcandy.ajax_url,
2289      type: "POST",
2290      data: dataform,
2291      processData: false,
2292      contentType: false,
2293    })
2294    .done(function (res) {
2295      window.location.reload();
2296    });
2297}
2298
2299/**
2300 * Get agent profile holiday actions
2301 */
2302function wpsc_get_ap_leaves_actions(dateSelected, nonce) {
2303  supportcandy.temp.dateSelected = dateSelected;
2304  wpsc_show_modal();
2305  var data = {
2306    action: "wpsc_get_ap_leaves_actions",
2307    dateSelected,
2308    _ajax_nonce: nonce,
2309  };
2310  jQuery.post(supportcandy.ajax_url, data, function (response) {
2311    // Set to modal.
2312    jQuery(".wpsc-modal-header").text(response.title);
2313    jQuery(".wpsc-modal-body").html(response.body);
2314    jQuery(".wpsc-modal-footer").html(response.footer);
2315    // Display modal.
2316    wpsc_show_modal_inner_container();
2317  });
2318}
2319
2320/**
2321 * Set agent profile holiday actions
2322 */
2323function wpsc_set_ap_leaves_actions(el) {
2324  const form = jQuery(".wpsc-frm-ap-holiday-actions")[0];
2325  const dataform = new FormData(form);
2326  dataform.append("dateSelected", supportcandy.temp.dateSelected);
2327  jQuery(el).text(supportcandy.translations.please_wait);
2328  jQuery
2329    .ajax({
2330      url: supportcandy.ajax_url,
2331      type: "POST",
2332      data: dataform,
2333      processData: false,
2334      contentType: false,
2335    })
2336    .done(function (response) {
2337      jQuery.each(supportcandy.temp.dateSelected, function (index, value) {
2338        if (response.action == "add" && response.is_recurring == 1) {
2339          jQuery("td")
2340            .find("[data-date=" + value + "]")
2341            .css({ "background-color": "#eb4d4b" });
2342        } else if (response.action == "add" && response.is_recurring == 0) {
2343          jQuery("td")
2344            .find("[data-date=" + value + "]")
2345            .css({ "background-color": "#f0932b" });
2346        } else {
2347          jQuery("td")
2348            .find("[data-date=" + value + "]")
2349            .css("background-color", "unset");
2350        }
2351      });
2352      supportcandy.temp.holidayList = response.holidayList;
2353      wpsc_close_modal();
2354    });
2355}
2356
2357/**
2358 * Clear dates
2359 */
2360function wpsc_clear_date(el) {
2361  jQuery(el).prev().val("");
2362
2363  var conditionalFields = jQuery(".wpsc-tff.conditional");
2364  if (conditionalFields.length !== 0) {
2365    wpsc_check_tff_visibility();
2366  }
2367}
2368
2369/**
2370 * Check whether there is text in reply box
2371 */
2372function wpsc_is_description_text() {
2373  var is_tinymce =
2374    typeof tinyMCE != "undefined" &&
2375    tinyMCE.activeEditor &&
2376    !tinyMCE.activeEditor.isHidden();
2377  if (is_tinymce && tinymce.get("description")) {
2378    var description = tinyMCE.get("description").getContent();
2379  } else {
2380    var description = jQuery("#description").val();
2381  }
2382
2383  var flag = false;
2384  if (description && description.length != 0) {
2385    flag = true;
2386  }
2387
2388  return flag;
2389}
2390
2391/**
2392 * Get Edit customer info
2393 *
2394 * @param {Int} ticket_id
2395 */
2396function wpsc_get_edit_rb_info(el, ticket_id, nonce) {
2397  wpsc_show_modal();
2398  var data = { action: "wpsc_get_edit_rb_info", ticket_id, _ajax_nonce: nonce };
2399  jQuery.post(supportcandy.ajax_url, data, function (response) {
2400    jQuery(".wpsc-modal-header").text(response.title);
2401    jQuery(".wpsc-modal-body").html(response.body);
2402    jQuery(".wpsc-modal-footer").html(response.footer);
2403    wpsc_show_modal_inner_container();
2404  });
2405}
2406
2407/**
2408 * Set edit customer info
2409 *
2410 * @param {object} el
2411 * @param {Int} ticket_id
2412 */
2413function wpsc_set_edit_rb_info(el, ticket_id, nonce) {
2414  var form = jQuery("form.frm-edit-rb-info")[0];
2415  var dataform = new FormData(form);
2416  jQuery(".wpsc-modal-footer button").attr("disabled", true);
2417  jQuery(el).text(supportcandy.translations.please_wait);
2418  jQuery
2419    .ajax({
2420      url: supportcandy.ajax_url,
2421      type: "POST",
2422      data: dataform,
2423      processData: false,
2424      contentType: false,
2425    })
2426    .done(function (res) {
2427      wpsc_close_modal();
2428      setTimeout(function () {
2429        wpsc_get_rb_info(el, ticket_id, nonce);
2430      }, 500);
2431    });
2432}
2433
2434/**
2435 * Get tickets based on filter set
2436 */
2437function wpsc_get_archive_tickets() {
2438  jQuery(".wpsc-bulk-selector").prop("checked", false);
2439  jQuery(".wpsc-ticket-list").html(supportcandy.loader_html);
2440
2441  var data = {
2442    action: "wpsc_get_archive_tickets",
2443    _ajax_nonce: supportcandy.nonce,
2444    is_frontend : supportcandy.is_frontend
2445  };
2446  if (
2447    typeof supportcandy.ticketList != "undefined" &&
2448    typeof supportcandy.ticketList.filters != "undefined"
2449  ) {
2450    data.filters = supportcandy.ticketList.filters;
2451  }
2452
2453  jQuery.post(supportcandy.ajax_url, data, function (response) {
2454    jQuery(".wpsc-filter-actions").html(response.filter_actions);
2455    jQuery(".wpsc-ticket-bulk-actions").html(response.bulk_actions);
2456    jQuery(".wpsc-ticket-list").html(response.tickets);
2457    jQuery(".wpsc-pagination-txt").text(response.pagination_str);
2458    jQuery("select.wpsc-input-filter").val(response.filters.filterSlug);
2459    jQuery("select.wpsc-input-sort-by").val(response.filters.orderby);
2460    jQuery("select.wpsc-input-sort-order").val(response.filters.order);
2461    jQuery("input.wpsc-search-input").val(response.filters.search);
2462    if (response.pagination.total_pages > 1) {
2463      jQuery(".wpsc-pagination-btn").show();
2464    } else {
2465      jQuery(".wpsc-pagination-btn").hide();
2466    }
2467    supportcandy.ticketList = {
2468      filters: response.filters,
2469      pagination: response.pagination,
2470    };
2471  });
2472}
2473
2474/**
2475 * Get tickets based on filter set
2476 */
2477function wpsc_get_tickets() {
2478  jQuery(".wpsc-bulk-selector").prop("checked", false);
2479  jQuery(".wpsc-ticket-list").html(supportcandy.loader_html);
2480
2481  var data = {
2482    action: "wpsc_get_tickets",
2483    _ajax_nonce: supportcandy.nonce,
2484    is_frontend: supportcandy.is_frontend,
2485  };
2486  if (
2487    typeof supportcandy.ticketList != "undefined" &&
2488    typeof supportcandy.ticketList.filters != "undefined"
2489  ) {
2490    data.filters = supportcandy.ticketList.filters;
2491  }
2492
2493  jQuery.post(supportcandy.ajax_url, data, function (response) {
2494    jQuery(".wpsc-filter-actions").html(response.filter_actions);
2495    jQuery(".wpsc-ticket-bulk-actions").html(response.bulk_actions);
2496    jQuery(".wpsc-ticket-list").html(response.tickets);
2497    jQuery(".wpsc-pagination-txt").text(response.pagination_str);
2498    jQuery("select.wpsc-input-filter").val(response.filters.filterSlug);
2499    jQuery("select.wpsc-input-sort-by").val(response.filters.orderby);
2500    jQuery("select.wpsc-input-sort-order").val(response.filters.order);
2501    jQuery("input.wpsc-search-input").val(response.filters.search);
2502    if (response.pagination.total_pages > 1) {
2503      jQuery(".wpsc-pagination-btn").show();
2504    } else {
2505      jQuery(".wpsc-pagination-btn").hide();
2506    }
2507    supportcandy.ticketList = {
2508      filters: response.filters,
2509      pagination: response.pagination,
2510    };
2511  });
2512}
2513
2514/**
2515 * Copy ticket url
2516 *
2517 * @param {int} ticket_id
2518 */
2519function wpsc_it_copy_url(ticket_id) {
2520  var temp = jQuery("<input>");
2521  jQuery("body").append(temp);
2522  temp.val(jQuery("#wpsc-ticket-url").text()).select();
2523  document.execCommand("copy");
2524  temp.remove();
2525  alert(supportcandy.translations.copy_url);
2526}
2527
2528/**
2529 * Open auto-refresh toggle
2530 */
2531function wpsc_get_tl_auto_refresh() {
2532  wpsc_show_modal();
2533
2534  // Get modal parts from static modals.
2535  var headerText = jQuery(
2536    ".wpsc-tl_snippets .auto-refresh .modal-header"
2537  ).text();
2538  var bodyHTML = jQuery(".wpsc-tl_snippets .auto-refresh .modal-body").html();
2539  var footerHTML = jQuery(
2540    ".wpsc-tl_snippets .auto-refresh .modal-footer"
2541  ).html();
2542
2543  // Set them to modal.
2544  jQuery(".wpsc-modal-header").text(headerText);
2545  jQuery(".wpsc-modal-body").html(bodyHTML);
2546  jQuery(".wpsc-modal-footer").html(footerHTML);
2547
2548  // Set current status.
2549  var status = supportcandy.tl_auto_refresh ? supportcandy.tl_auto_refresh : 0;
2550  var el = status
2551    ? jQuery(".wpsc-modal .toggle-on")
2552    : jQuery(".wpsc-modal .toggle-off");
2553  jQuery(".wpsc-modal-body input").val(status);
2554  status ? wpsc_toggle_on(el) : wpsc_toggle_off(el);
2555
2556  // Display modal.
2557  wpsc_show_modal_inner_container();
2558}
2559
2560/**
2561 * Set auto-refresh settings
2562 */
2563function wpsc_set_tl_auto_refresh(el) {
2564  jQuery(".wpsc-modal-footer button").attr("disabled", true);
2565  jQuery(el).text(supportcandy.translations.please_wait);
2566  var status = parseInt(jQuery(".wpsc-modal-body input").val());
2567  wpsc_close_modal();
2568  if (supportcandy.tl_auto_refresh !== status) {
2569    supportcandy.tl_auto_refresh = status;
2570    if (status === 1) {
2571      wpsc_tl_auto_refresh();
2572    }
2573  }
2574}
2575
2576/**
2577 * Auto refresh
2578 */
2579function wpsc_tl_auto_refresh() {
2580  if (
2581    supportcandy.current_section === "ticket-list" &&
2582    !supportcandy.ticketListIsIndividual &&
2583    supportcandy.tl_auto_refresh === 1 &&
2584    !(
2585      jQuery(".wpsc-bulk-select:checked").length ||
2586      jQuery(".wpsc-search-input").is(":focus")
2587    )
2588  ) {
2589    wpsc_get_tickets();
2590    if (
2591      typeof supportcandy.tl_auto_refresh_schedule !== "undefined" &&
2592      supportcandy.tl_auto_refresh_schedule == true
2593    ) {
2594      return;
2595    }
2596    supportcandy.tl_auto_refresh_schedule = true;
2597    setTimeout(function () {
2598      supportcandy.tl_auto_refresh_schedule = false;
2599      wpsc_tl_auto_refresh();
2600    }, 60000);
2601  }
2602}
2603
2604/**
2605 * User logout
2606 */
2607function wpsc_user_logout(el, nonce) {
2608  jQuery(el).text(supportcandy.translations.please_wait);
2609  var data = { action: "wpsc_user_logout", _ajax_nonce: nonce };
2610  jQuery.post(supportcandy.ajax_url, data, function (res) {
2611    window.location.reload();
2612  });
2613}
2614
2615/**
2616 * Close model popup on escape key.
2617 */
2618jQuery(document).keydown(function (e) {
2619  if (e.keyCode == 27) {
2620    wpsc_close_modal();
2621  }
2622});
2623
2624/**
2625 * Get customer info
2626 */
2627function wpsc_view_customer_info(customer_id, _ajax_nonce) {
2628  wpsc_show_modal();
2629  var data = { action: "wpsc_view_customer_info", customer_id, _ajax_nonce };
2630  jQuery.post(supportcandy.ajax_url, data, function (response) {
2631    jQuery(".wpsc-modal-header").text(response.title);
2632    jQuery(".wpsc-modal-body").html(response.body);
2633    jQuery(".wpsc-modal-footer").html(response.footer);
2634    wpsc_show_modal_inner_container();
2635  });
2636}
2637
2638/**
2639 * Get edit customer info
2640 */
2641function wpsc_get_edit_customer_info(customer_id, _ajax_nonce) {
2642  wpsc_show_modal();
2643  var data = {
2644    action: "wpsc_get_edit_customer_info",
2645    customer_id,
2646    _ajax_nonce,
2647  };
2648  jQuery.post(supportcandy.ajax_url, data, function (response) {
2649    jQuery(".wpsc-modal-header").text(response.title);
2650    jQuery(".wpsc-modal-body").html(response.body);
2651    jQuery(".wpsc-modal-footer").html(response.footer);
2652    wpsc_show_modal_inner_container();
2653  });
2654}
2655
2656/**
2657 * Set edit customer info
2658 */
2659function wpsc_set_edit_customer_info(el, id, nonce) {
2660  var form = jQuery("form.frm-edit-customer-info")[0];
2661  var dataform = new FormData(form);
2662  jQuery(".wpsc-modal-footer button").attr("disabled", true);
2663  jQuery(el).text(supportcandy.translations.please_wait);
2664
2665  jQuery
2666    .ajax({
2667      url: supportcandy.ajax_url,
2668      type: "POST",
2669      data: dataform,
2670      processData: false,
2671      contentType: false,
2672    })
2673    .done(function (res) {
2674      wpsc_close_modal();
2675      wpsc_scroll_top();
2676      wpsc_view_customer_detailed_info(res.customer_id, res.nonce);
2677    });
2678}
2679
2680/**
2681 * Get customer logs
2682 */
2683function wpsc_view_customer_logs(customer_id, _ajax_nonce) {
2684  wpsc_show_modal();
2685  var data = { action: "wpsc_view_customer_logs", customer_id, _ajax_nonce };
2686  jQuery.post(supportcandy.ajax_url, data, function (response) {
2687    jQuery(".wpsc-modal-header").text(response.title);
2688    jQuery(".wpsc-modal-body").html(response.body);
2689    jQuery(".wpsc-modal-footer").html(response.footer);
2690    wpsc_show_modal_inner_container();
2691  });
2692}
2693
2694/**
2695 *
2696 * @param {*} ticket
2697 */
2698function wpsc_clear_saved_draft_reply(ticket_id) {
2699  var draft_replies = JSON.parse(localStorage.getItem("wpsc_auto_draft")) || {};
2700  var is_tinymce =
2701    typeof tinyMCE != "undefined" &&
2702    tinyMCE.activeEditor &&
2703    !tinyMCE.activeEditor.isHidden();
2704  if (is_tinymce && tinymce.get("description")) {
2705    tinyMCE.get("description").setContent("");
2706  }
2707  jQuery("#description").val("");
2708  if (!ticket_id) return;
2709  delete draft_replies[ticket_id];
2710  localStorage.setItem("wpsc_auto_draft", JSON.stringify(draft_replies));
2711}
2712
2713/**
2714 * Run background processes.
2715 */
2716function wpsc_run_ajax_background_process() {
2717  var data = { action: "wpsc_run_ajax_background_process" };
2718  jQuery.post(supportcandy.ajax_url, data, function (response) {});
2719}
2720
2721/**
2722 * Assign ticket to self
2723 */
2724function wpsc_self_assign_ticket(ticket_id, nonce) {
2725  var data = {
2726    action: "wpsc_self_assign_ticket",
2727    ticket_id,
2728    _ajax_nonce: nonce,
2729  };
2730
2731  jQuery.post(supportcandy.ajax_url, data, function (response) {
2732    wpsc_get_individual_ticket(ticket_id);
2733  });
2734}
2735
2736/**
2737 * Delete wpsc_auto_draft localStorage after 24 hr
2738 */
2739function wpsc_delete_auto_draft() {
2740  var draft_cron_time = localStorage.getItem("wpsc_draft_cron_time");
2741  if (!draft_cron_time) {
2742    localStorage.setItem("wpsc_draft_cron_time", new Date().getTime());
2743  }
2744  var diff = new Date().getTime() - draft_cron_time;
2745  if (diff < 3600000) {
2746    return;
2747  }
2748  var draft_replies = JSON.parse(localStorage.getItem("wpsc_auto_draft")) || {};
2749  Object.keys(draft_replies).forEach((ticket_id) => {
2750    var timeDifference =
2751      new Date() - new Date(draft_replies[ticket_id].date_updated);
2752    if (timeDifference > 86400000) {
2753      delete draft_replies[ticket_id];
2754    }
2755  });
2756  localStorage.setItem("wpsc_auto_draft", JSON.stringify(draft_replies));
2757  localStorage.setItem("wpsc_draft_cron_time", new Date().getTime());
2758}
2759
2760/**
2761 * Delete customer
2762 */
2763function wpsc_delete_customer(customer_id, nonce) {
2764  if (!confirm(supportcandy.translations.customer_delete_warn)) {
2765    return;
2766  }
2767
2768  var data = {
2769    action: "wpsc_delete_customer",
2770    customer_id,
2771    _ajax_nonce: nonce,
2772  };
2773  jQuery.post(supportcandy.ajax_url, data, function (response) {
2774    window.location.reload();
2775  });
2776}
2777
2778/**
2779 * Dashboard - Get filter from and to dates based on duration slug
2780 */
2781function wpsc_db_set_filter_duration_dates(duration) {
2782  let dateStr = "";
2783  let date = new Date();
2784  let from_date, to_date;
2785
2786  switch (duration) {
2787    case "today":
2788      dateStr = date.toISOString().split("T")[0];
2789      date_from_to = {
2790        from: dateStr,
2791        to: dateStr,
2792      };
2793      break;
2794
2795    case "yesterday":
2796      date.setDate(date.getDate() - 1);
2797      dateStr = date.toISOString().split("T")[0];
2798      date_from_to = {
2799        from: dateStr,
2800        to: dateStr,
2801      };
2802      break;
2803
2804    case "this-week":
2805      let firstDayOfWeek = date.getDay() === 0 ? 6 : date.getDay() - 1;
2806      date.setDate(date.getDate() - firstDayOfWeek);
2807      from_date = date.toISOString().split("T")[0];
2808      date.setDate(date.getDate() + 6);
2809      to_date = date.toISOString().split("T")[0];
2810      date_from_to = {
2811        from: from_date,
2812        to: to_date,
2813      };
2814      break;
2815
2816    case "last-week":
2817      let firstDayOfLastWeek = date.getDay() === 0 ? 7 : date.getDay();
2818      date.setDate(date.getDate() - firstDayOfLastWeek - 6);
2819      from_date = date.toISOString().split("T")[0];
2820      date.setDate(date.getDate() + 6);
2821      to_date = date.toISOString().split("T")[0];
2822      date_from_to = {
2823        from: from_date,
2824        to: to_date,
2825      };
2826      break;
2827
2828    case "last-7":
2829      date.setDate(date.getDate() - 1); // Exclude today
2830      to_date = date.toISOString().split("T")[0];
2831      date.setDate(date.getDate() - 6); // Last 7 days from yesterday
2832      from_date = date.toISOString().split("T")[0];
2833      date_from_to = {
2834        from: from_date,
2835        to: to_date,
2836      };
2837      break;
2838
2839    case "last-30-days":
2840      date.setDate(date.getDate() - 1); // Exclude today
2841      to_date = date.toISOString().split("T")[0];
2842      date.setDate(date.getDate() - 29); // Last 30 days from yesterday
2843      from_date = date.toISOString().split("T")[0];
2844      date_from_to = {
2845        from: from_date,
2846        to: to_date,
2847      };
2848      break;
2849
2850    case "this-month":
2851      let this_month_starts = new Date(date.getFullYear(), date.getMonth(), 1);
2852      let this_month_ends = new Date(
2853        date.getFullYear(),
2854        date.getMonth() + 1,
2855        0
2856      );
2857      date_from_to = {
2858        from: `${this_month_starts.getFullYear()}-${(
2859          this_month_starts.getMonth() + 1
2860        )
2861          .toString()
2862          .padStart(2, "0")}-${this_month_starts
2863          .getDate()
2864          .toString()
2865          .padStart(2, "0")}`,
2866        to: `${this_month_ends.getFullYear()}-${(this_month_ends.getMonth() + 1)
2867          .toString()
2868          .padStart(2, "0")}-${this_month_ends
2869          .getDate()
2870          .toString()
2871          .padStart(2, "0")}`,
2872      };
2873      break;
2874
2875    case "last-month":
2876      date.setMonth(date.getMonth() - 1);
2877      let last_month_starts = new Date(date.getFullYear(), date.getMonth(), 1);
2878      let last_month_ends = new Date(
2879        date.getFullYear(),
2880        date.getMonth() + 1,
2881        0
2882      );
2883      date_from_to = {
2884        from: `${last_month_starts.getFullYear()}-${(
2885          last_month_starts.getMonth() + 1
2886        )
2887          .toString()
2888          .padStart(2, "0")}-${last_month_starts
2889          .getDate()
2890          .toString()
2891          .padStart(2, "0")}`,
2892        to: `${last_month_ends.getFullYear()}-${(last_month_ends.getMonth() + 1)
2893          .toString()
2894          .padStart(2, "0")}-${last_month_ends
2895          .getDate()
2896          .toString()
2897          .padStart(2, "0")}`,
2898      };
2899      break;
2900
2901    case "this-quarter":
2902      let this_quarter_month_starts = Math.floor(date.getMonth() / 3) * 3;
2903      let quarter_start = new Date(
2904        date.getFullYear(),
2905        this_quarter_month_starts,
2906        1
2907      );
2908      let quarter_end = new Date(
2909        date.getFullYear(),
2910        this_quarter_month_starts + 3,
2911        0
2912      );
2913      date_from_to = {
2914        from: `${quarter_start.getFullYear()}-${(quarter_start.getMonth() + 1)
2915          .toString()
2916          .padStart(2, "0")}-${quarter_start
2917          .getDate()
2918          .toString()
2919          .padStart(2, "0")}`,
2920        to: `${quarter_end.getFullYear()}-${(quarter_end.getMonth() + 1)
2921          .toString()
2922          .padStart(2, "0")}-${quarter_end
2923          .getDate()
2924          .toString()
2925          .padStart(2, "0")}`,
2926      };
2927      break;
2928
2929    case "last-quarter":
2930      let last_quarter_month_ends = Math.floor(date.getMonth() / 3) * 3 - 1; // End month of last quarter
2931      let last_quarter_month_starts = last_quarter_month_ends - 2; // Start month of last quarter
2932      if (last_quarter_month_ends < 0) {
2933        last_quarter_month_ends += 12;
2934        last_quarter_month_starts += 12;
2935      }
2936      let last_quarter_start = new Date(
2937        date.getFullYear(),
2938        last_quarter_month_starts,
2939        1
2940      );
2941      let last_quarter_end = new Date(
2942        date.getFullYear(),
2943        last_quarter_month_ends + 1,
2944        0
2945      );
2946      date_from_to = {
2947        from: `${last_quarter_start.getFullYear()}-${(
2948          last_quarter_start.getMonth() + 1
2949        )
2950          .toString()
2951          .padStart(2, "0")}-${last_quarter_start
2952          .getDate()
2953          .toString()
2954          .padStart(2, "0")}`,
2955        to: `${last_quarter_end.getFullYear()}-${(
2956          last_quarter_end.getMonth() + 1
2957        )
2958          .toString()
2959          .padStart(2, "0")}-${last_quarter_end
2960          .getDate()
2961          .toString()
2962          .padStart(2, "0")}`,
2963      };
2964      break;
2965
2966    case "this-year":
2967      date_from_to = {
2968        from: `${date.getFullYear()}-01-01`,
2969        to: `${date.getFullYear()}-12-31`,
2970      };
2971      break;
2972
2973    case "last-year":
2974      date_from_to = {
2975        from: `${date.getFullYear() - 1}-01-01`,
2976        to: `${date.getFullYear() - 1}-12-31`,
2977      };
2978      break;
2979  }
2980  return date_from_to;
2981}
2982
2983/**
2984 * Get batches for async report loading
2985 */
2986function wpsc_rp_get_baches(fromDate, toDate) {
2987  let diffTime = Math.abs(toDate - fromDate);
2988  let diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1;
2989
2990  let batches = [];
2991  let batchData = [];
2992
2993  if (diffDays == 1) {
2994    // one day.
2995
2996    for (var i = 0; i <= 23; i++) {
2997      var hr = String(i);
2998      hr = hr.length == 1 ? "0" + hr : hr;
2999      batchData.push({
3000        fromDate: fromDate.toISOString().split("T")[0] + " " + hr + ":00:00",
3001        toDate: fromDate.toISOString().split("T")[0] + " " + hr + ":59:59",
3002        durationType: "day",
3003      });
3004    }
3005  } else if (diffDays <= 31) {
3006    // days.
3007
3008    do {
3009      batchData.push({
3010        fromDate: fromDate.toISOString().split("T")[0] + " 00:00:00",
3011        toDate: fromDate.toISOString().split("T")[0] + " 23:59:59",
3012        durationType: "days",
3013      });
3014      fromDate.setDate(fromDate.getDate() + 1);
3015    } while (fromDate <= toDate);
3016  } else if (diffDays <= 180) {
3017    // weeks.
3018
3019    var from = fromDate.toISOString().split("T")[0];
3020    fromDate.setDate(fromDate.getDate() + (7 - fromDate.getDay()));
3021    batchData.push({
3022      fromDate: from + " 00:00:00",
3023      toDate: fromDate.toISOString().split("T")[0] + " 23:59:59",
3024      durationType: "weeks",
3025    });
3026    do {
3027      fromDate.setDate(fromDate.getDate() + 1);
3028      var from = new Date(fromDate.toLocaleDateString("en-CA"));
3029      fromDate.setDate(fromDate.getDate() + 6);
3030      var to = new Date(fromDate.toLocaleDateString("en-CA"));
3031      to = toDate < to ? new Date(toDate.toLocaleDateString("en-CA")) : to;
3032      batchData.push({
3033        fromDate: from.toISOString().split("T")[0] + " 00:00:00",
3034        toDate: to.toISOString().split("T")[0] + " 23:59:59",
3035        durationType: "weeks",
3036      });
3037    } while (fromDate < toDate);
3038  } else if (diffDays <= 720) {
3039    // months.
3040
3041    // convert toDate from local to UTC.
3042    toDate = new Date(
3043      toDate.getFullYear(),
3044      toDate.getMonth(),
3045      toDate.getDate()
3046    );
3047
3048    var from = fromDate.toISOString().split("T")[0];
3049    if (fromDate.getMonth() == 11) {
3050      fromDate = new Date(fromDate.getFullYear(), 11, 31);
3051    } else {
3052      fromDate = new Date(fromDate.getFullYear(), fromDate.getMonth() + 1, 0);
3053    }
3054    batchData.push({
3055      fromDate: from + " 00:00:00",
3056      toDate: fromDate.toISOString().split("T")[0] + " 23:59:59",
3057      durationType: "months",
3058    });
3059    do {
3060      fromDate.setDate(fromDate.getDate() + 1);
3061      var from = new Date(fromDate.toLocaleDateString("en-CA"));
3062      if (fromDate.getMonth() == 11) {
3063        fromDate = new Date(fromDate.getFullYear(), 11, 31);
3064      } else {
3065        fromDate = new Date(fromDate.getFullYear(), fromDate.getMonth() + 1, 0);
3066      }
3067      var to = new Date(fromDate.toLocaleDateString("en-CA"));
3068      to = toDate < to ? new Date(toDate.toLocaleDateString("en-CA")) : to;
3069      batchData.push({
3070        fromDate: from.toISOString().split("T")[0] + " 00:00:00",
3071        toDate: to.toISOString().split("T")[0] + " 23:59:59",
3072        durationType: "months",
3073      });
3074    } while (fromDate < toDate);
3075  } else {
3076    // years.
3077
3078    // convert toDate from local to UTC.
3079    toDate = new Date(
3080      toDate.getFullYear(),
3081      toDate.getMonth(),
3082      toDate.getDate()
3083    );
3084
3085    var from = fromDate.toISOString().split("T")[0];
3086    fromDate = new Date(fromDate.getFullYear(), 11, 31);
3087    batchData.push({
3088      fromDate: from + " 00:00:00",
3089      toDate: fromDate.toISOString().split("T")[0] + " 23:59:59",
3090      durationType: "years",
3091    });
3092    do {
3093      fromDate.setDate(fromDate.getDate() + 1);
3094      var from = new Date(fromDate.toLocaleDateString("en-CA"));
3095      fromDate = new Date(fromDate.getFullYear(), 11, 31);
3096      var to = new Date(fromDate.toLocaleDateString("en-CA"));
3097      to = toDate < to ? new Date(toDate.toLocaleDateString("en-CA")) : to;
3098      batchData.push({
3099        fromDate: from.toISOString().split("T")[0] + " 00:00:00",
3100        toDate: to.toISOString().split("T")[0] + " 23:59:59",
3101        durationType: "years",
3102      });
3103    } while (fromDate < toDate);
3104  }
3105
3106  // devide into batches of 5.
3107  var batchLength = batchData.length;
3108  for (var i = 0; i < batchLength; i = i + 5) {
3109    var batch = [];
3110    var counter = 0;
3111    do {
3112      var index = i + counter;
3113      if (index == batchLength) {
3114        break;
3115      }
3116      batch.push(batchData[index]);
3117      counter++;
3118    } while (counter < 5);
3119    batches.push(batch);
3120  }
3121
3122  return batches;
3123}
3124
3125function wpsc_generate_random_color() {
3126  var minLuminance = 0.7;
3127
3128  do {
3129    var color = Math.floor(Math.random() * 16777216); // 0x000000 to 0xFFFFFF
3130    var red = (color >> 16) & 0xff;
3131    var green = (color >> 8) & 0xff;
3132    var blue = color & 0xff;
3133
3134    // Calculate luminance (brightness).
3135    var luminance = (0.299 * red + 0.587 * green + 0.114 * blue) / 255;
3136  } while (luminance < minLuminance);
3137
3138  return "#" + color.toString(16).toUpperCase();
3139}
3140
3141// onclick load respective card ticket list
3142function wpsc_get_dbc_ticket_list(element, card) {
3143  var count = parseInt(jQuery(element).find(".wpsc-dbc-count").text(), 10);
3144  if (count === 0) {
3145    return;
3146  }
3147  var data = {
3148    action: "wpsc_dash_card_count_filter",
3149    card: card,
3150    view: supportcandy.is_frontend,
3151    _ajax_nonce: supportcandy.nonce,
3152  };
3153  jQuery.post(supportcandy.ajax_url, data, function (response) {
3154    if (response.url) {
3155      window.location = response.url;
3156    }
3157  });
3158}
3159
3160// onclick load respective card ticket list
3161function wpsc_get_agent_status_ticket_list(agent_id, status_id, nonce) {
3162  var data = {
3163    action: "wpsc_get_agent_status_ticket_list",
3164    agent_id: agent_id,
3165    status_id: status_id,
3166    view: supportcandy.is_frontend,
3167    _ajax_nonce: nonce,
3168  };
3169  jQuery.post(supportcandy.ajax_url, data, function (response) {
3170    if (response.url) {
3171      window.location = response.url;
3172    }
3173  });
3174}
3175
3176/**
3177 * Refresh tags list
3178 */
3179function wpsc_it_refresh_tags(ticket_id) {
3180  jQuery(".wpsc-it-tag-body").html(supportcandy.loader_html);
3181
3182  var data = { action: "wpsc_it_refresh_tags", ticket_id };
3183  jQuery.post(supportcandy.ajax_url, data, function (res) {
3184    jQuery(".wpsc-it-tag-body").html(res);
3185  });
3186}
3187
3188/**
3189 * View user wordpress profile
3190 */
3191function wpsc_wp_user_profile(el, ticket_id, nonce) {
3192  var data = {
3193    action: "wpsc_wp_user_profile",
3194    ticket_id,
3195    _ajax_nonce: nonce,
3196  };
3197  jQuery.post(supportcandy.ajax_url, data, function (response) {
3198    if (response.url) {
3199      window.open(response.url, "_blank");
3200    }
3201  });
3202}
3203
3204/**
3205 * Restore archived ticket
3206 */
3207function wpsc_it_restore_archived(ticket_id, nonce) {
3208
3209  if (!confirm(supportcandy.translations.confirm)){
3210    return;
3211  }
3212
3213  var data = {
3214    action: "wpsc_it_restore_archived",
3215    ticket_id,
3216    _ajax_nonce: nonce
3217  };
3218
3219  jQuery.post(
3220    supportcandy.ajax_url,
3221    data,
3222    function (response) {
3223      wpsc_get_archive_ticket_list();
3224    }
3225  );
3226}
3227
3228/**
3229 *  Get refresh current ticket
3230 */
3231function wpsc_it_archive_ab_refresh(ticket_id) {
3232  if (wpsc_is_description_text()) {
3233    if (confirm(supportcandy.translations.confirm)) {
3234      wpsc_clear_saved_draft_reply(ticket_id);
3235    } else {
3236      return;
3237    }
3238  }
3239
3240  wpsc_get_individual_archive_ticket(ticket_id);
3241}
3242
3243/**
3244 * Load older threads
3245 */
3246function wpsc_load_older_archive_threads(el, ticket_id) {
3247  if (supportcandy.reply_form_position === "top") {
3248    jQuery(".wpsc-it-thread-section-container").append(
3249      supportcandy.loader_html
3250    );
3251  } else {
3252    jQuery(".wpsc-it-thread-section-container").prepend(
3253      supportcandy.loader_html
3254    );
3255  }
3256
3257  var oldBtnContainer = jQuery(el).parent();
3258  oldBtnContainer.hide();
3259
3260  var data = {
3261    action: "wpsc_load_older_archive_threads",
3262    ticket_id,
3263    last_thread: supportcandy.threads.last_thread,
3264  };
3265  jQuery.post(supportcandy.ajax_url, data, function (response) {
3266    jQuery(".wpsc-it-thread-section-container").find(".wpsc-loader").remove();
3267    // add threads.
3268    if (supportcandy.reply_form_position === "top") {
3269      jQuery(".wpsc-it-thread-section-container").append(response.threads);
3270    } else {
3271      var scrollHeightBody = jQuery("body").prop("scrollHeight");
3272      var windowScrollTop = jQuery(window).scrollTop();
3273      jQuery(".wpsc-it-thread-section-container").prepend(response.threads);
3274      var scrollDiff = jQuery("body").prop("scrollHeight") - scrollHeightBody;
3275      jQuery(window).scrollTop(windowScrollTop + scrollDiff);
3276    }
3277    // show btn if there are more threads available.
3278    if (response.has_next_page) {
3279      supportcandy.threads.last_thread = response.last_thread;
3280      oldBtnContainer.show();
3281    }
3282  });
3283}
3284
3285
3286/**
3287 * Delete permanently
3288 */
3289function wpsc_iat_delete_permanently(ticket_id, nonce) {
3290  var flag = confirm(supportcandy.translations.delete_permanently);
3291  if (!flag) {
3292    return;
3293  }
3294
3295  var data = {
3296    action: "wpsc_iat_delete_permanently",
3297    ticket_id,
3298    _ajax_nonce: nonce,
3299  };
3300  jQuery.post(supportcandy.ajax_url, data, function (response) {
3301    wpsc_get_archive_ticket_list();
3302  });
3303}
3304
3305/**
3306 * Get bulk delete archive ticket
3307 */
3308function wpsc_bulk_delete_archive_tickets(nonce) {
3309  var items = jQuery(".wpsc-bulk-select:checked");
3310  var checked = items.length === 0 ? false : true;
3311  jQuery(".wpsc-bulk-selector").prop("checked", checked);
3312  if (items.length != 0) {
3313    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
3314      .map(function () {
3315        return this.value;
3316      })
3317      .get();
3318    var flag = confirm(supportcandy.translations.delete_permanently);
3319    if (!flag) {
3320      return;
3321    }
3322
3323    var data = {
3324      action: "wpsc_bulk_delete_archive_tickets",
3325      ticket_ids,
3326      _ajax_nonce: nonce,
3327    };
3328    jQuery.post(supportcandy.ajax_url, data, function (response) {
3329      wpsc_get_archive_ticket_list();
3330      wpsc_run_ajax_background_process();
3331    });
3332  }
3333}
3334
3335/**
3336 * Restore bulk archive tickets
3337 */
3338function wpsc_bulk_restore_archive_tickets(nonce) {
3339  var items = jQuery(".wpsc-bulk-select:checked");
3340  var checked = items.length === 0 ? false : true;
3341  jQuery(".wpsc-bulk-selector").prop("checked", checked);
3342  if (items.length != 0) {
3343    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
3344      .map(function () {
3345        return this.value;
3346      })
3347      .get();
3348    var flag = confirm(supportcandy.translations.confirm);
3349    if (!flag) {
3350      return;
3351    }
3352    var data = {
3353      action: "wpsc_bulk_restore_archive_tickets",
3354      ticket_ids,
3355      _ajax_nonce: nonce,
3356    };
3357    jQuery.post(supportcandy.ajax_url, data, function (response) {
3358      wpsc_get_archive_ticket_list();
3359    });
3360  }
3361}
3362
3363/**
3364 * Get bulk archive ticket
3365 */
3366function wpsc_bulk_delete_tickets(nonce) {
3367  var items = jQuery(".wpsc-bulk-select:checked");
3368  var checked = items.length === 0 ? false : true;
3369  jQuery(".wpsc-bulk-selector").prop("checked", checked);
3370  if (items.length != 0) {
3371    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
3372      .map(function () {
3373        return this.value;
3374      })
3375      .get();
3376    var flag = confirm(supportcandy.translations.confirm);
3377    if (!flag) {
3378      return;
3379    }
3380
3381    var data = {
3382      action: "wpsc_bulk_delete_tickets",
3383      ticket_ids,
3384      _ajax_nonce: nonce,
3385    };
3386    jQuery.post(supportcandy.ajax_url, data, function (response) {
3387      wpsc_get_ticket_list();
3388      wpsc_run_ajax_background_process();
3389    });
3390  }
3391}
3392
3393/**
3394 * Restore bulk tickets
3395 */
3396function wpsc_bulk_restore_tickets(nonce) {
3397  var items = jQuery(".wpsc-bulk-select:checked");
3398  var checked = items.length === 0 ? false : true;
3399  jQuery(".wpsc-bulk-selector").prop("checked", checked);
3400  if (items.length != 0) {
3401    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
3402      .map(function () {
3403        return this.value;
3404      })
3405      .get();
3406    var flag = confirm(supportcandy.translations.confirm);
3407    if (!flag) {
3408      return;
3409    }
3410    var data = {
3411      action: "wpsc_bulk_restore_tickets",
3412      ticket_ids,
3413      _ajax_nonce: nonce,
3414    };
3415    jQuery.post(supportcandy.ajax_url, data, function (response) {
3416      wpsc_get_ticket_list();
3417    });
3418  }
3419}
3420
3421/**
3422 * Deletes bulk ticket permanentaly
3423 */
3424function wpsc_bulk_delete_tickets_permanently(nonce) {
3425  var items = jQuery(".wpsc-bulk-select:checked");
3426  var checked = items.length === 0 ? false : true;
3427  jQuery(".wpsc-bulk-selector").prop("checked", checked);
3428  if (items.length != 0) {
3429    var ticket_ids = jQuery(".wpsc-bulk-select:checked")
3430      .map(function () {
3431        return this.value;
3432      })
3433      .get();
3434    var flag = confirm(supportcandy.translations.confirm);
3435    if (!flag) {
3436      return;
3437    }
3438
3439    var data = {
3440      action: "wpsc_bulk_delete_tickets_permanently",
3441      ticket_ids,
3442      _ajax_nonce: nonce,
3443    };
3444    jQuery.post(supportcandy.ajax_url, data, function (response) {
3445      wpsc_get_ticket_list();
3446    });
3447  }
3448}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.