PageSourceSearch

https://www.everfortuneai.com.tw/js/scripts.bundle.js?v=20261009084109

js everfortuneai.com.tw collected 2026-10-09 00:41:27 UTC 212,954 bytes, 8,291 lines download raw bytes

1//
2// Global init of core components
3//
4
5// Init components
6var KTComponents = function () {
7  // Public methods
8  return {
9    init: function () {
10      KTApp.init();
11      KTDrawer.init();
12      KTMenu.init();
13      KTScroll.init();
14      KTSticky.init();
15      KTSwapper.init();
16      KTToggle.init();
17      KTScrolltop.init();
18      KTDialer.init();
19      KTImageInput.init();
20      KTPasswordMeter.init();
21    }
22  }
23}();
24
25// On document ready
26if (document.readyState === "loading") {
27  document.addEventListener("DOMContentLoaded", function () {
28    KTComponents.init();
29  });
30} else {
31  KTComponents.init();
32}
33
34// Init page loader
35window.addEventListener("load", function () {
36  KTApp.hidePageLoading();
37});
38
39// Declare KTApp for Webpack support
40if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
41  window.KTComponents = module.exports = KTComponents;
42}
43"use strict";
44
45// Class definition
46var KTApp = function () {
47  var initialized = false;
48  var select2FocusFixInitialized = false;
49  var countUpInitialized = false;
50
51  var createBootstrapTooltip = function (el, options) {
52    if (el.getAttribute("data-kt-initialized") === "1") {
53      return;
54    }
55
56    var delay = {};
57
58    // Handle delay options
59    if (el.hasAttribute('data-bs-delay-hide')) {
60      delay['hide'] = el.getAttribute('data-bs-delay-hide');
61    }
62
63    if (el.hasAttribute('data-bs-delay-show')) {
64      delay['show'] = el.getAttribute('data-bs-delay-show');
65    }
66
67    if (delay) {
68      options['delay'] = delay;
69    }
70
71    // Check dismiss options
72    if (el.hasAttribute('data-bs-dismiss') && el.getAttribute('data-bs-dismiss') == 'click') {
73      options['dismiss'] = 'click';
74    }
75
76    // Initialize popover
77    var tp = new bootstrap.Tooltip(el, options);
78
79    // Handle dismiss
80    if (options['dismiss'] && options['dismiss'] === 'click') {
81      // Hide popover on element click
82      el.addEventListener("click", function (e) {
83        el.blur();
84        tp.hide();
85      });
86    }
87
88    el.setAttribute("data-kt-initialized", "1");
89
90    return tp;
91  }
92
93  var createBootstrapTooltips = function () {
94    var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
95
96    var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
97      createBootstrapTooltip(tooltipTriggerEl, {});
98    });
99  }
100
101  var createBootstrapPopover = function (el, options) {
102    if (el.getAttribute("data-kt-initialized") === "1") {
103      return;
104    }
105
106    var delay = {};
107
108    // Handle delay options
109    if (el.hasAttribute('data-bs-delay-hide')) {
110      delay['hide'] = el.getAttribute('data-bs-delay-hide');
111    }
112
113    if (el.hasAttribute('data-bs-delay-show')) {
114      delay['show'] = el.getAttribute('data-bs-delay-show');
115    }
116
117    if (delay) {
118      options['delay'] = delay;
119    }
120
121    // Handle dismiss option
122    if (el.getAttribute('data-bs-dismiss') == 'true') {
123      options['dismiss'] = true;
124    }
125
126    if (options['dismiss'] === true) {
127      options['template'] = '<div class="popover" role="tooltip"><div class="popover-arrow"></div><span class="popover-dismiss btn btn-icon"></span><h3 class="popover-header"></h3><div class="popover-body"></div></div>'
128    }
129
130    // Initialize popover
131    var popover = new bootstrap.Popover(el, options);
132
133    // Handle dismiss click
134    if (options['dismiss'] === true) {
135      var dismissHandler = function (e) {
136        popover.hide();
137      }
138
139      el.addEventListener('shown.bs.popover', function () {
140        var dismissEl = document.getElementById(el.getAttribute('aria-describedby'));
141        dismissEl.addEventListener('click', dismissHandler);
142      });
143
144      el.addEventListener('hide.bs.popover', function () {
145        var dismissEl = document.getElementById(el.getAttribute('aria-describedby'));
146        dismissEl.removeEventListener('click', dismissHandler);
147      });
148    }
149
150    el.setAttribute("data-kt-initialized", "1");
151
152    return popover;
153  }
154
155  var createBootstrapPopovers = function () {
156    var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'));
157
158    var popoverList = popoverTriggerList.map(function (popoverTriggerEl) {
159      createBootstrapPopover(popoverTriggerEl, {});
160    });
161  }
162
163  var createBootstrapToasts = function () {
164    var toastElList = [].slice.call(document.querySelectorAll('.toast'));
165    var toastList = toastElList.map(function (toastEl) {
166      if (toastEl.getAttribute("data-kt-initialized") === "1") {
167        return;
168      }
169
170      toastEl.setAttribute("data-kt-initialized", "1");
171
172      return new bootstrap.Toast(toastEl, {})
173    });
174  }
175
176  var createButtons = function () {
177    var buttonsGroup = [].slice.call(document.querySelectorAll('[data-kt-buttons="true"]'));
178
179    buttonsGroup.map(function (group) {
180      if (group.getAttribute("data-kt-initialized") === "1") {
181        return;
182      }
183
184      var selector = group.hasAttribute('data-kt-buttons-target') ? group.getAttribute('data-kt-buttons-target') : '.btn';
185      var activeButtons = [].slice.call(group.querySelectorAll(selector));
186
187      // Toggle Handler
188      KTUtil.on(group, selector, 'click', function (e) {
189        activeButtons.map(function (button) {
190          button.classList.remove('active');
191        });
192
193        this.classList.add('active');
194      });
195
196      group.setAttribute("data-kt-initialized", "1");
197    });
198  }
199
200  var createDateRangePickers = function () {
201    // Check if jQuery included
202    if (typeof jQuery == 'undefined') {
203      return;
204    }
205
206    // Check if daterangepicker included
207    if (typeof $.fn.daterangepicker === 'undefined') {
208      return;
209    }
210
211    var elements = [].slice.call(document.querySelectorAll('[data-kt-daterangepicker="true"]'));
212    var start = moment().subtract(29, 'days');
213    var end = moment();
214
215    elements.map(function (element) {
216      if (element.getAttribute("data-kt-initialized") === "1") {
217        return;
218      }
219
220      var display = element.querySelector('div');
221      var attrOpens = element.hasAttribute('data-kt-daterangepicker-opens') ? element.getAttribute('data-kt-daterangepicker-opens') : 'left';
222      var range = element.getAttribute('data-kt-daterangepicker-range');
223
224      var cb = function (start, end) {
225        var current = moment();
226
227        if (display) {
228          if (current.isSame(start, "day") && current.isSame(end, "day")) {
229            display.innerHTML = start.format('D MMM YYYY');
230          } else {
231            display.innerHTML = start.format('D MMM YYYY') + ' - ' + end.format('D MMM YYYY');
232          }
233        }
234      }
235
236      if (range === "today") {
237        start = moment();
238        end = moment();
239      }
240
241      $(element).daterangepicker({
242        startDate: start,
243        endDate: end,
244        opens: attrOpens,
245        ranges: {
246          'Today': [moment(), moment()],
247          'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
248          'Last 7 Days': [moment().subtract(6, 'days'), moment()],
249          'Last 30 Days': [moment().subtract(29, 'days'), moment()],
250          'This Month': [moment().startOf('month'), moment().endOf('month')],
251          'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
252        }
253      }, cb);
254
255      cb(start, end);
256
257      element.setAttribute("data-kt-initialized", "1");
258    });
259  }
260
261  var createSelect2 = function () {
262    // Check if jQuery included
263    if (typeof jQuery == 'undefined') {
264      return;
265    }
266
267    // Check if select2 included
268    if (typeof $.fn.select2 === 'undefined') {
269      return;
270    }
271
272    var elements = [].slice.call(document.querySelectorAll('[data-control
272="select2"], [data-kt-select2="true"]'));
273
274    elements.map(function (element) {
275      if (element.getAttribute("data-kt-initialized") === "1") {
276        return;
277      }
278
279      var options = {
280        dir: document.body.getAttribute('direction')
281      };
282
283      if (element.getAttribute('data-hide-search') == 'true') {
284        options.minimumResultsForSearch = Infinity;
285      }
286
287      $(element).select2(options);
288
289      // Handle Select2's KTMenu parent case
290      if (element.hasAttribute('data-dropdown-parent') && element.hasAttribute('multiple')) {
291        var parentEl = document.querySelector(element.getAttribute('data-dropdown-parent'));
292
293        if (parentEl && parentEl.hasAttribute("data-kt-menu")) {
294          var menu = KTMenu.getInstance(parentEl);
295
296          if (!menu) {
297            menu = new KTMenu(parentEl);
298          }
299
300          if (menu) {
301            $(element).on('select2:unselect', function (e) {
302              element.setAttribute("data-multiple-unselect", "1");
303            });
304
305            menu.on("kt.menu.dropdown.hide", function (item) {
306              if (element.getAttribute("data-multiple-unselect") === "1") {
307                element.removeAttribute("data-multiple-unselect");
308                return false;
309              }
310            });
311          }
312        }
313      }
314
315      element.setAttribute("data-kt-initialized", "1");
316    });
317  }
318
319  var createAutosize = function () {
320    if (typeof autosize === 'undefined') {
321      return;
322    }
323
324    var inputs = [].slice.call(document.querySelectorAll('[data-kt-autosize="true"]'));
325
326    inputs.map(function (input) {
327      if (input.getAttribute("data-kt-initialized") === "1") {
328        return;
329      }
330
331      autosize(input);
332
333      input.setAttribute("data-kt-initialized", "1");
334    });
335  }
336
337  var createCountUp = function () {
338    if (typeof countUp === 'undefined') {
339      return;
340    }
341
342    var elements = [].slice.call(document.querySelectorAll('[data-kt-countup="true"]:not(.counted)'));
343
344    elements.map(function (element) {
345      if (KTUtil.isInViewport(element) && KTUtil.visible(element)) {
346        if (element.getAttribute("data-kt-initialized") === "1") {
347          return;
348        }
349
350        var options = {};
351
352        var value = element.getAttribute('data-kt-countup-value');
353        value = parseFloat(value.replace(/,/g, ""));
354
355        if (element.hasAttribute('data-kt-countup-start-val')) {
356          options.startVal = parseFloat(element.getAttribute('data-kt-countup-start-val'));
357        }
358
359        if (element.hasAttribute('data-kt-countup-duration')) {
360          options.duration = parseInt(element.getAttribute('data-kt-countup-duration'));
361        }
362
363        if (element.hasAttribute('data-kt-countup-decimal-places')) {
364          options.decimalPlaces = parseInt(element.getAttribute('data-kt-countup-decimal-places'));
365        }
366
367        if (element.hasAttribute('data-kt-countup-prefix')) {
368          options.prefix = element.getAttribute('data-kt-countup-prefix');
369        }
370
371        if (element.hasAttribute('data-kt-countup-separator')) {
372          options.separator = element.getAttribute('data-kt-countup-separator');
373        }
374
375        if (element.hasAttribute('data-kt-countup-suffix')) {
376          options.suffix = element.getAttribute('data-kt-countup-suffix');
377        }
378
379        var count = new countUp.CountUp(element, value, options);
380
381        count.start();
382
383        element.classList.add('counted');
384
385        element.setAttribute("data-kt-initialized", "1");
386      }
387    });
388  }
389
390  var createCountUpTabs = function () {
391    if (typeof countUp === 'undefined') {
392      return;
393    }
394
395    if (countUpInitialized === false) {
396      // Initial call
397      createCountUp();
398
399      // Window scroll event handler
400      window.addEventListener('scroll', createCountUp);
401    }
402
403    // Tabs shown event handler
404    var tabs = [].slice.call(document.querySelectorAll('[data-kt-countup-tabs="true"][data-bs-toggle="tab"]'));
405    tabs.map(function (tab) {
406      if (tab.getAttribute("data-kt-initialized") === "1") {
407        return;
408      }
409
410      tab.addEventListener('shown.bs.tab', createCountUp);
411
412      tab.setAttribute("data-kt-initialized", "1");
413    });
414
415    countUpInitialized = true;
416  }
417
418  var createTinySliders = function () {
419    if (typeof tns === 'undefined') {
420      return;
421    }
422
423    // Sliders
424    const elements = Array.prototype.slice.call(document.querySelectorAll('[data-tns="true"]'), 0);
425
426    if (!elements && elements.length === 0) {
427      return;
428    }
429
430    elements.forEach(function (el) {
431      if (el.getAttribute("data-kt-initialized") === "1") {
432        return;
433      }
434
435      const obj = initTinySlider(el);
436      KTUtil.data(el).set('tns', tns);
437
438      el.setAttribute("data-kt-initialized", "1");
439    });
440  }
441
442  var initTinySlider = function (el) {
443    if (!el) {
444      return;
445    }
446
447    const tnsOptions = {};
448
449    // Convert string boolean
450    const checkBool = function (val) {
451      if (val === 'true') {
452        return true;
453      }
454      if (val === 'false') {
455        return false;
456      }
457      return val;
458    };
459
460    // get extra options via data attributes
461    el.getAttributeNames().forEach(function (attrName) {
462      // more options; https://github.com/ganlanyuan/tiny-slider#options
463      if ((/^data-tns-.*/g).test(attrName)) {
464        let optionName = attrName.replace('data-tns-', '').toLowerCase().replace(/(?:[\s-])\w/g, function (match) {
465          return match.replace('-', '').toUpperCase();
466        });
467
468        if (attrName === 'data-tns-responsive') {
469          // fix string with a valid json
470          const jsonStr = el.getAttribute(attrName).replace(/(\w+:)|(\w+ :)/g, function (matched) {
471            return '"' + matched.substring(0, matched.length - 1) + '":';
472          });
473          try {
474            // convert json string to object
475            tnsOptions[optionName] = JSON.parse(jsonStr);
476          }
477          catch (e) {
478          }
479        }
480        else {
481          tnsOptions[optionName] = checkBool(el.getAttribute(attrName));
482        }
483      }
484    });
485
486    const opt = Object.assign({}, {
487      container: el,
488      slideBy: 'page',
489      autoplay: true,
490      center: true,
491      autoplayButtonOutput: false,
492    }, tnsOptions);
493
494    if (el.closest('.tns')) {
495      KTUtil.addClass(el.closest('.tns'), 'tns-initiazlied');
496    }
497
498    return tns(opt);
499  }
500
501  var initSmoothScroll = function () {
502    if (initialized === true) {
503      return;
504    }
505
506    if (typeof SmoothScroll === 'undefined') {
507      return;
508    }
509
510    new SmoothScroll('a[data-kt-scroll-toggle][href*="#"]', {
511      speed: 1000,
512      speedAsDuration: true,
513      offset: function (anchor, toggle) {
514        // Integer or Function returning an integer. How far to offset the scrolling anchor location in pixels
515        // This example is a function, but you could do something as simple as `offset: 25`
516
517        // An example returning different values based on whether the clicked link was in the header nav or not
518        if (anchor.hasAttribute('data-kt-scroll-offset')) {
519          var val = KTUtil.getResponsiveValue(anchor.getAttribute('data-kt-scroll-offset'));
520
521          return val;
522        } else {
523          return 0;
524        }
525      }
526    });
527  }
528
529  var initCard = function () {
530    // Toggle Handler
531    KTUtil.on(document.body, '[data-kt-card-action="remove"]', 'click', function (e) {
532      e.preventDefault();
533
534      const card = this.closest('.card');
535
536      if (!card) {
537        return;
538      }
539
540      const confirmMessage = this.getAttribute("data-kt-card-confirm-message");
541      const confirm = this.getAttribute("data-kt-card-confirm") === "true";
542
543      if (confirm) {
544        // Show message popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/
545        Swal.fire({
546          text: confirmMessage ? confirmMessage : "Are you sure to remove ?",
547          icon: "warning",
548          buttonsStyling: false,
549          confirmButtonText: "Confirm",
550          denyButtonText: "Cancel",
551          customClass: {
552            confirmButton: "btn btn-primary",
553            denyButton: "btn btn-danger"
554          }
555        }).then(function (result) {
556          if (result.isConfirmed) {
557            card.remove();
558          }
559        });
560      } else {
561        card.remove();
562      }
563    });
564  }
565
566  var initModal = function () {
567    var elements = Array.prototype.slice.call(document.querySelectorAll("[data-bs-stacked-modal]"));
568
569    if (elements && elements.length > 0) {
570      elements.forEach((element) => {
571        if (element.getAttribute("data-kt-initialized") === "1") {
572          return;
573        }
574
575        element.setAttribute("data-kt-initialized", "1");
576
577        element.addEventListener("click", function (e) {
578          e.preventDefault();
579
580          const modalEl = document.querySelector(this.getAttribute("data-bs-stacked-modal"));
581
582          if (modalEl) {
583            const modal = new bootstrap.Modal(modalEl, { backdrop: false });
584            modal.show();
585          }
586        });
587      });
588    }
589  }
590
591  var initCheck = function () {
592    if (initialized === true) {
593      return;
594    }
595
596    // Toggle Handler
597    KTUtil.on(document.body, '[data-kt-check="true"]', 'change', function (e) {
598      var check = this;
599      var targets = document.querySelectorAll(check.getAttribute('data-kt-check-target'));
600
601      KTUtil.each(targets, function (target) {
602        if (target.type == 'checkbox') {
603          target.checked = check.checked;
604        } else {
605          target.classList.toggle('active');
606        }
607      });
608    });
609  }
610
611  var initBootstrapCollapse = function () {
612    if (initialized === true) {
613      return;
614    }
615
616    KTUtil.on(document.body, '.collapsible[data-bs-toggle="collapse"]', 'click', function (e) {
617      if (this.classList.contains('collapsed')) {
618        this.classList.remove('active');
619        this.blur();
620      } else {
621        this.classList.add('active');
622      }
623
624      if (this.hasAttribute('data-kt-toggle-text')) {
625        var text = this.getAttribute('data-kt-toggle-text');
626        var target = this.querySelector('[data-kt-toggle-text-target="true"]');
627        var target = target ? target : this;
628
629        this.setAttribute('data-kt-toggle-text', target.innerText);
630        target.innerText = text;
631      }
632    });
633  }
634
635  var initBootstrapRotate = function () {
636    if (initialized === true) {
637      return;
638    }
639
640    KTUtil.on(document.body, '[data-kt-rotate="true"]', 'click', function (e) {
641      if (this.classList.contains('active')) {
642        this.classList.remove('active');
643        this.blur();
644      } else {
645        this.classList.add('active');
646      }
647    });
648  }
649
650  var initLozad = function () {
651    // Check if lozad included
652    if (typeof lozad === 'undefined') {
653      return;
654    }
655
656    const observer = lozad(); // lazy loads elements with default selector as '.lozad'
657    observer.observe();
658  }
659
660  var showPageLoading = function () {
661    document.body.classList.add('page-loading');
662    document.body.setAttribute('data-kt-app-page-loading', "on");
663  }
664
665  var hidePageLoading = function () {
666    // CSS3 Transitions only after page load(.page-loading or .app-page-loading class added to body tag and remove with JS on page load
666)
667    document.body.classList.remove('page-loading');
668    document.body.removeAttribute('data-kt-app-page-loading');
669  }
670
671  return {
672    init: function () {
673      initLozad();
674
675      initSmoothScroll();
676
677      initCard();
678
679      initModal();
680
681      initCheck();
682
683      initBootstrapCollapse();
684
685      initBootstrapRotate();
686
687      createBootstrapTooltips();
688
689      createBootstrapPopovers();
690
691      createBootstrapToasts();
692
693      createDateRangePickers();
694
695      createButtons();
696
697      createSelect2();
698
699      createCountUp();
700
701      createCountUpTabs();
702
703      createAutosize();
704
705      createTinySliders();
706
707      initialized = true;
708    },
709
710    initTinySlider: function (el) {
711      initTinySlider(el);
712    },
713
714    showPageLoading: function () {
715      showPageLoading();
716    },
717
718    hidePageLoading: function () {
719      hidePageLoading();
720    },
721
722    createBootstrapPopover: function (el, options) {
723      return createBootstrapPopover(el, options);
724    },
725
726    createBootstrapTooltip: function (el, options) {
727      return createBootstrapTooltip(el, options);
728    }
729  };
730}();
731
732// Declare KTApp for Webpack support
733if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
734  module.exports = KTApp;
735}
736"use strict";
737
738// Class definition
739var KTBlockUI = function (element, options) {
740  //////////////////////////////
741  // ** Private variables  ** //
742  //////////////////////////////
743  var the = this;
744
745  if (typeof element === "undefined" || element === null) {
746    return;
747  }
748
749  // Default options
750  var defaultOptions = {
751    zIndex: false,
752    overlayClass: '',
753    overflow: 'hidden',
754    message: '<span class="spinner-border text-primary"></span>'
755  };
756
757  ////////////////////////////
758  // ** Private methods  ** //
759  ////////////////////////////
760
761  var _construct = function () {
762    if (KTUtil.data(element).has('blockui')) {
763      the = KTUtil.data(element).get('blockui');
764    } else {
765      _init();
766    }
767  }
768
769  var _init = function () {
770    // Variables
771    the.options = KTUtil.deepExtend({}, defaultOptions, options);
772    the.element = element;
773    the.overlayElement = null;
774    the.blocked = false;
775    the.positionChanged = false;
776    the.overflowChanged = false;
777
778    // Bind Instance
779    KTUtil.data(the.element).set('blockui', the);
780  }
781
782  var _block = function () {
783    if (KTEventHandler.trigger(the.element, 'kt.blockui.block', the) === false) {
784      return;
785    }
786
787    var isPage = (the.element.tagName === 'BODY');
788
789    var position = KTUtil.css(the.element, 'position');
790    var overflow = KTUtil.css(the.element, 'overflow');
791    var zIndex = isPage ? 10000 : 1;
792
793    if (the.options.zIndex > 0) {
794      zIndex = the.options.zIndex;
795    } else {
796      if (KTUtil.css(the.element, 'z-index') != 'auto') {
797        zIndex = KTUtil.css(the.element, 'z-index');
798      }
799    }
800
801    the.element.classList.add('blockui');
802
803    if (position === "absolute" || position === "relative" || position === "fixed") {
804      KTUtil.css(the.element, 'position', 'relative');
805      the.positionChanged = true;
806    }
807
808    if (the.options.overflow === 'hidden' && overflow === 'visible') {
809      KTUtil.css(the.element, 'overflow', 'hidden');
810      the.overflowChanged = true;
811    }
812
813    the.overlayElement = document.createElement('DIV');
814    the.overlayElement.setAttribute('class', 'blockui-overlay ' + the.options.overlayClass);
815
816    the.overlayElement.innerHTML = the.options.message;
817
818    KTUtil.css(the.overlayElement, 'z-index', zIndex);
819
820    the.element.append(the.overlayElement);
821    the.blocked = true;
822
823    KTEventHandler.trigger(the.element, 'kt.blockui.after.blocked', the)
824  }
825
826  var _release = function () {
827    if (KTEventHandler.trigger(the.element, 'kt.blockui.release', the) === false) {
828      return;
829    }
830
831    the.element.classList.add('blockui');
832
833    if (the.positionChanged) {
834      KTUtil.css(the.element, 'position', '');
835    }
836
837    if (the.overflowChanged) {
838      KTUtil.css(the.element, 'overflow', '');
839    }
840
841    if (the.overlayElement) {
842      KTUtil.remove(the.overlayElement);
843    }
844
845    the.blocked = false;
846
847    KTEventHandler.trigger(the.element, 'kt.blockui.released', the);
848  }
849
850  var _isBlocked = function () {
851    return the.blocked;
852  }
853
854  var _destroy = function () {
855    KTUtil.data(the.element).remove('blockui');
856  }
857
858  // Construct class
859  _construct();
860
861  ///////////////////////
862  // ** Public API  ** //
863  ///////////////////////
864
865  // Plugin API
866  the.block = function () {
867    _block();
868  }
869
870  the.release = function () {
871    _release();
872  }
873
874  the.isBlocked = function () {
875    return _isBlocked();
876  }
877
878  the.destroy = function () {
879    return _destroy();
880  }
881
882  // Event API
883  the.on = function (name, handler) {
884    return KTEventHandler.on(the.element, name, handler);
885  }
886
887  the.one = function (name, handler) {
888    return KTEventHandler.one(the.element, name, handler);
889  }
890
891  the.off = function (name, handlerId) {
892    return KTEventHandler.off(the.element, name, handlerId);
893  }
894
895  the.trigger = function (name, event) {
896    return KTEventHandler.trigger(the.element, name, event, the, event);
897  }
898};
899
900// Static methods
901KTBlockUI.getInstance = function (element) {
902  if (element !== null && KTUtil.data(element).has('blockui')) {
903    return KTUtil.data(element).get('blockui');
904  } else {
905    return null;
906  }
907}
908
909// Webpack support
910if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
911  module.exports = KTBlockUI;
912}
913"use strict";
914// DOCS: https://javascript.info/cookie
915
916// Class definition
917var KTCookie = function () {
918  return {
919    // returns the cookie with the given name,
920    // or undefined if not found
921    get: function (name) {
922      var matches = document.cookie.match(new RegExp(
923        "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
924      ));
925
926      return matches ? decodeURIComponent(matches[1]) : null;
927    },
928
929    // Please note that a cookie value is encoded,
930    // so getCookie uses a built-in decodeURIComponent function to decode it.
931    set: function (name, value, options) {
932      if (typeof options === "undefined" || options === null) {
933        options = {};
934      }
935
936      options = Object.assign({}, {
937        path: '/'
938      }, options);
939
940      if (options.expires instanceof Date) {
941        options.expires = options.expires.toUTCString();
942      }
943
944      var updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);
945
946      for (var optionKey in options) {
947        if (options.hasOwnProperty(optionKey) === false) {
948          continue;
949        }
950
951        updatedCookie += "; " + optionKey;
952        var optionValue = options[optionKey];
953
954        if (optionValue !== true) {
955          updatedCookie += "=" + optionValue;
956        }
957      }
958
959      document.cookie = updatedCookie;
960    },
961
962    // To remove a cookie, we can call it with a negative expiration date:
963    remove: function (name) {
964      this.set(name, "", {
965        'max-age': -1
966      });
967    }
968  }
969}();
970
971// Webpack support
972if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
973  module.exports = KTCookie;
974}
975
976"use strict";
977
978// Class definition
979var KTDialer = function (element, options) {
980  ////////////////////////////
981  // ** Private variables  ** //
982  ////////////////////////////
983  var the = this;
984
985  if (!element) {
986    return;
987  }
988
989  // Default options
990  var defaultOptions = {
991    min: null,
992    max: null,
993    step: 1,
994    currency: false,
995    decimals: 0,
996    prefix: "",
997    suffix: ""
998  };
999
1000  ////////////////////////////
1001  // ** Private methods  ** //
1002  ////////////////////////////
1003
1004  // Constructor
1005  var _construct = function () {
1006    if (KTUtil.data(element).has('dialer') === true) {
1007      the = KTUtil.data(element).get('dialer');
1008    } else {
1009      _init();
1010    }
1011  }
1012
1013  // Initialize
1014  var _init = function () {
1015    // Variables
1016    the.options = KTUtil.deepExtend({}, defaultOptions, options);
1017
1018    // Elements
1019    the.element = element;
1020    the.incElement = the.element.querySelector('[data-kt-dialer-control="increase"]');
1021    the.decElement = the.element.querySelector('[data-kt-dialer-control="decrease"]');
1022    the.inputElement = the.element.querySelector('input[type]');
1023
1024    // Set Values
1025    if (_getOption('currency') === 'true') {
1026      the.options.currency = true;
1027    }
1028
1029    if (_getOption('decimals')) {
1030      the.options.decimals = parseInt(_getOption('decimals'));
1031    }
1032
1033    if (_getOption('prefix')) {
1034      the.options.prefix = _getOption('prefix');
1035    }
1036
1037    if (_getOption('suffix')) {
1038      the.options.suffix = _getOption('suffix');
1039    }
1040
1041    if (_getOption('step')) {
1042      the.options.step = parseFloat(_getOption('step'));
1043    }
1044
1045    if (_getOption('min')) {
1046      the.options.min = parseFloat(_getOption('min'));
1047    }
1048
1049    if (_getOption('max')) {
1050      the.options.max = parseFloat(_getOption('max'));
1051    }
1052
1053    the.value = parseFloat(the.inputElement.value.replace(/[^\d.]/g, ''));
1054
1055    _setValue();
1056
1057    // Event Handlers
1058    _handlers();
1059
1060    // Bind Instance
1061    KTUtil.data(the.element).set('dialer', the);
1062  }
1063
1064  // Handlers
1065  var _handlers = function () {
1066    KTUtil.addEvent(the.incElement, 'click', function (e) {
1067      e.preventDefault();
1068
1069      _increase();
1070    });
1071
1072    KTUtil.addEvent(the.decElement, 'click', function (e) {
1073      e.preventDefault();
1074
1075      _decrease();
1076    });
1077
1078    KTUtil.addEvent(the.inputElement, 'input', function (e) {
1079      e.preventDefault();
1080
1081      _setValue();
1082    });
1083  }
1084
1085  // Event handlers
1086  var _increase = function () {
1087    // Trigger "after.dialer" event
1088    KTEventHandler.trigger(the.element, 'kt.dialer.increase', the);
1089
1090    the.inputElement.value = the.value + the.options.step;
1091    _setValue();
1092
1093    // Trigger "before.dialer" event
1094    KTEventHandler.trigger(the.element, 'kt.dialer.increased', the);
1095
1096    return the;
1097  }
1098
1099  var _decrease = function () {
1100    // Trigger "after.dialer" event
1101    KTEventHandler.trigger(the.element, 'kt.dialer.decrease', the);
1102
1103    the.inputElement.value = the.value - the.options.step;
1104
1105    _setValue();
1106
1107    // Trigger "before.dialer" event
1108    KTEventHandler.trigger(the.element, 'kt.dialer.decreased', the);
1109
1110    return the;
1111  }
1112
1113  // Set Input Value
1114  var _setValue = function (value) {
1115    // Trigger "after.dialer" event
1116    KTEventHandler.trigger(the.element, 'kt.dialer.change', the);
1117
1118    if (value !== undefined) {
1119      the.value = value;
1120    } else {
1121      the.value = _parse(the.inputElement.value);
1122    }
1123
1124    if (the.options.min !== null && the.value < the.options.min) {
1125      the.value = the.options.min;
1126    }
1127
1128    if (the.options.max !== null && the.value > the.options.max) {
1129      the.value = the.options.max;
1130    }
1131
1132    the.inputElement.value = _format(the.value);
1133
1134    // Trigger input change event
1135    the.inputElement.dispatchEvent(new Event('change'));
1136
1137    // Trigger "after.dialer" event
1138    KTEventHandler.trigger(the.element, 'kt.dialer.changed', the);
1139  }
1140
1141  var _parse = function (val) {
1142    val = val
1143      .replace(/[^0-9.-]/g, '')       // remove chars except number, hyphen, point. 
1144      .replace(/(\..*)\./g, '$1')     // remove multiple points.
1145      .replace(/(?!^)-/g, '')         // remove middle hyphen.
1146      .replace(/^0+(\d)/gm, '$1');    // remove multiple leading zeros. <-- I added this.
1147
1148    val = parseFloat(val);
1149
1150    if (isNaN(val)) {
1151      val = 0;
1152    }
1153
1154    return val;
1155  }
1156
1157  // Format
1158  var _format = function (val) {
1159    val = parseFloat(val).toFixed(the.options.decimals);
1160
1161    if (the.options.currency) {
1162      val = val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
1163    }
1164
1165    return the.options.prefix + val + the.options.suffix;
1166  }
1167
1168  // Get option
1169  var _getOption = function (name) {
1170    if (the.element.hasAttribute('data-kt-dialer-' + name) === true) {
1171      var attr = the.element.getAttribute('data-kt-dialer-' + name);
1172      var value = attr;
1173
1174      return value;
1175    } else {
1176      return null;
1177    }
1178  }
1179
1180  var _destroy = function () {
1181    KTUtil.data(the.element).remove('dialer');
1182  }
1183
1184  // Construct class
1185  _construct();
1186
1187  ///////////////////////
1188  // ** Public API  ** //
1189  ///////////////////////
1190
1191  // Plugin API
1192  the.setMinValue = function (value) {
1193    the.options.min = value;
1194  }
1195
1196  the.setMaxValue = function (value) {
1197    the.options.max = value;
1198  }
1199
1200  the.setValue = function (value) {
1201    _setValue(value);
1202  }
1203
1204  the.getValue = function () {
1205    return the.inputElement.value;
1206  }
1207
1208  the.update = function () {
1209    _setValue();
1210  }
1211
1212  the.increase = function () {
1213    return _increase();
1214  }
1215
1216  the.decrease = function () {
1217    return _decrease();
1218  }
1219
1220  the.getElement = function () {
1221    return the.element;
1222  }
1223
1224  the.destroy = function () {
1225    return _destroy();
1226  }
1227
1228  // Event API
1229  the.on = function (name, handler) {
1230    return KTEventHandler.on(the.element, name, handler);
1231  }
1232
1233  the.one = function (name, handler) {
1234    return KTEventHandler.one(the.element, name, handler);
1235  }
1236
1237  the.off = function (name, handlerId) {
1238    return KTEventHandler.off(the.element, name, handlerId);
1239  }
1240
1241  the.trigger = function (name, event) {
1242    return KTEventHandler.trigger(the.element, name, event, the, event);
1243  }
1244};
1245
1246// Static methods
1247KTDialer.getInstance = function (element) {
1248  if (element !== null && KTUtil.data(element).has('dialer')) {
1249    return KTUtil.data(element).get('dialer');
1250  } else {
1251    return null;
1252  }
1253}
1254
1255// Create instances
1256KTDialer.createInstances = function (selector = '[data-kt-dialer="true"]') {
1257  // Get instances
1258  var elements = document.querySelectorAll(selector);
1259
1260  if (elements && elements.length > 0) {
1261    for (var i = 0, len = elements.length; i < len; i++) {
1262      new KTDialer(elements[i]);
1263    }
1264  }
1265}
1266
1267// Global initialization
1268KTDialer.init = function () {
1269  KTDialer.createInstances();
1270};
1271
1272// Webpack support
1273if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
1274  module.exports = KTDialer;
1275}
1276"use strict";
1277
1278var KTDrawerHandlersInitialized = false;
1279
1280// Class definition
1281var KTDrawer = function (element, options) {
1282  //////////////////////////////
1283  // ** Private variables  ** //
1284  //////////////////////////////
1285  var the = this;
1286
1287  if (typeof element === "undefined" || element === null) {
1288    return;
1289  }
1290
1291  // Default options
1292  var defaultOptions = {
1293    overlay: true,
1294    direction: 'end',
1295    baseClass: 'drawer',
1296    overlayClass: 'drawer-overlay'
1297  };
1298
1299  ////////////////////////////
1300  // ** Private methods  ** //
1301  ////////////////////////////
1302
1303  var _construct = function () {
1304    if (KTUtil.data(element).has('drawer')) {
1305      the = KTUtil.data(element).get('drawer');
1306    } else {
1307      _init();
1308    }
1309  }
1310
1311  var _init = function () {
1312    // Variables
1313    the.options = KTUtil.deepExtend({}, defaultOptions, options);
1314    the.uid = KTUtil.getUniqueId('drawer');
1315    the.element = element;
1316    the.overlayElement = null;
1317    the.name = the.element.getAttribute('data-kt-drawer-name');
1318    the.shown = false;
1319    the.lastWidth;
1320    the.lastHeight;
1321    the.toggleElement = null;
1322
1323    // Set initialized
1324    the.element.setAttribute('data-kt-drawer', 'true');
1325
1326    // Event Handlers
1327    _handlers();
1328
1329    // Update Instance
1330    _update();
1331
1332    // Bind Instance
1333    KTUtil.data(the.element).set('drawer', the);
1334  }
1335
1336  var _handlers = function () {
1337    var togglers = _getOption('toggle');
1338    var closers = _getOption('close');
1339
1340    if (togglers !== null && togglers.length > 0) {
1341      KTUtil.on(document.body, togglers, 'click', function (e) {
1342        e.preventDefault();
1343
1344        the.toggleElement = this;
1345        _toggle();
1346      });
1347    }
1348
1349    if (closers !== null && closers.length > 0) {
1350      KTUtil.on(document.body, closers, 'click', function (e) {
1351        e.preventDefault();
1352
1353        the.closeElement = this;
1354        _hide();
1355      });
1356    }
1357  }
1358
1359  var _toggle = function () {
1360    if (KTEventHandler.trigger(the.element, 'kt.drawer.toggle', the) === false || _getOption("activate") === false) {
1361      return;
1362    }
1363
1364    if (the.shown === true) {
1365      _hide();
1366    } else {
1367      _show();
1368    }
1369
1370    KTEventHandler.trigger(the.element, 'kt.drawer.toggled', the);
1371  }
1372
1373  var _hide = function () {
1374    if (KTEventHandler.trigger(the.element, 'kt.drawer.hide', the) === false) {
1375      return;
1376    }
1377
1378    the.shown = false;
1379
1380    _deleteOverlay();
1381
1382    document.body.removeAttribute('data-kt-drawer-' + the.name, 'on');
1383    document.body.removeAttribute('data-kt-drawer');
1384
1385    KTUtil.removeClass(the.element, the.options.baseClass + '-on');
1386
1387    if (the.toggleElement !== null) {
1388      KTUtil.removeClass(the.toggleElement, 'active');
1389    }
1390
1391    KTEventHandler.trigger(the.element, 'kt.drawer.after.hidden', the) === false
1392  }
1393
1394  var _show = function () {
1395    if (KTEventHandler.trigger(the.element, 'kt.drawer.show', the) === false) {
1396      return;
1397    }
1398
1399    the.shown = true;
1400
1401    _createOverlay();
1402    document.body.setAttribute('data-kt-drawer-' + the.name, 'on');
1403    document.body.setAttribute('data-kt-drawer', 'on');
1404
1405    KTUtil.addClass(the.element, the.options.baseClass + '-on');
1406
1407    if (the.toggleElement !== null) {
1408      KTUtil.addClass(the.toggleElement, 'active');
1409    }
1410
1411    KTEventHandler.trigger(the.element, 'kt.drawer.shown', the);
1412  }
1413
1414  var _update = function () {
1415    var width = _getWidth();
1416    var height = _getHeight();
1417    var direction = _getOption('direction');
1418
1419    var top = _getOption('top');
1420    var bottom = _getOption('bottom');
1421    var start = _getOption('start');
1422    var end = _getOption('end');
1423
1424    // Reset state
1425    if (KTUtil.hasClass(the.element, the.options.baseClass + '-on') === true && String(document.body.getAttribute('data-kt-drawer-' + the.name + '-')) === 'on') {
1426      the.shown = true;
1427    } else {
1428      the.shown = false;
1429    }
1430
1431    // Activate/deactivate
1432    if (_getOption('activate') === true) {
1433      KTUtil.addClass(the.element, the.options.baseClass);
1434      KTUtil.addClass(the.element, the.options.baseClass + '-' + direction);
1435
1436      if (width) {
1437        KTUtil.css(the.element, 'width', width, true);
1438        the.lastWidth = width;
1439      }
1440
1441      if (height) {
1442        KTUtil.css(the.element, 'height', height, true);
1443        the.lastHeight = height;
1444      }
1445
1446      if (top) {
1447        KTUtil.css(the.element, 'top', top);
1448      }
1449
1450      if (bottom) {
1451        KTUtil.css(the.element, 'bottom', bottom);
1452      }
1453
1454      if (start) {
1455        if (KTUtil.isRTL()) {
1456          KTUtil.css(the.element, 'right', start);
1457        } else {
1458          KTUtil.css(the.element, 'left', start);
1459        }
1460      }
1461
1462      if (end) {
1463        if (KTUtil.isRTL()) {
1464          KTUtil.css(the.element, 'left', end);
1465        } else {
1466          KTUtil.css(the.element, 'right', end);
1467        }
1468      }
1469    } else {
1470      KTUtil.removeClass(the.element, the.options.baseClass);
1471      KTUtil.removeClass(the.element, the.options.baseClass + '-' + direction);
1472
1473      KTUtil.css(the.element, 'width', '');
1474      KTUtil.css(the.element, 'height', '');
1475
1476      if (top) {
1477        KTUtil.css(the.element, 'top', '');
1478      }
1479
1480      if (bottom) {
1481        KTUtil.css(the.element, 'bottom', '');
1482      }
1483
1484      if (start) {
1485        if (KTUtil.isRTL()) {
1486          KTUtil.css(the.element, 'right', '');
1487        } else {
1488          KTUtil.css(the.element, 'left', '');
1489        }
1490      }
1491
1492      if (end) {
1493        if (KTUtil.isRTL()) {
1494          KTUtil.css(the.element, 'left', '');
1495        } else {
1496          KTUtil.css(the.element, 'right', '');
1497        }
1498      }
1499
1500      _hide();
1501    }
1502  }
1503
1504  var _createOverlay = function () {
1505    if (_getOption('overlay') === true) {
1506      the.overlayElement = document.createElement('DIV');
1507
1508      KTUtil.css(the.overlayElement, 'z-index', KTUtil.css(the.element, 'z-index') - 1); // update
1509
1510      document.body.append(the.overlayElement);
1511
1512      KTUtil.addClass(the.overlayElement, _getOption('overlay-class'));
1513
1514      KTUtil.addEvent(the.overlayElement, 'click', function (e) {
1515        e.preventDefault();
1516
1517        if (_getOption('permanent') !== true) {
1518          _hide();
1519        }
1520      });
1521    }
1522  }
1523
1524  var _deleteOverlay = function () {
1525    if (the.overlayElement !== null) {
1526      KTUtil.remove(the.overlayElement);
1527    }
1528  }
1529
1530  var _getOption = function (name) {
1531    if (the.element.hasAttribute('data-kt-drawer-' + name) === true) {
1532      var attr = the.element.getAttribute('data-kt-drawer-' + name);
1533      var value = KTUtil.getResponsiveValue(attr);
1534
1535      if (value !== null && String(value) === 'true') {
1536        value = true;
1537      } else if (value !== null && String(value) === 'false') {
1538        value = false;
1539      }
1540
1541      return value;
1542    } else {
1543      var optionName = KTUtil.snakeToCamel(name);
1544
1545      if (the.options[optionName]) {
1546        return KTUtil.getResponsiveValue(the.options[optionName]);
1547      } else {
1548        return null;
1549      }
1550    }
1551  }
1552
1553  var _getWidth = function () {
1554    var width = _getOption('width');
1555
1556    if (width === 'auto') {
1557      width = KTUtil.css(the.element, 'width');
1558    }
1559
1560    return width;
1561  }
1562
1563  var _getHeight = function () {
1564    var height = _getOption('height');
1565
1566    if (height === 'auto') {
1567      height = KTUtil.css(the.element, 'height');
1568    }
1569
1570    return height;
1571  }
1572
1573  var _destroy = function () {
1574    KTUtil.data(the.element).remove('drawer');
1575  }
1576
1577  // Construct class
1578  _construct();
1579
1580  ///////////////////////
1581  // ** Public API  ** //
1582  ///////////////////////
1583
1584  // Plugin API
1585  the.toggle = function () {
1586    return _toggle();
1587  }
1588
1589  the.show = function () {
1590    return _show();
1591  }
1592
1593  the.hide = function () {
1594    return _hide();
1595  }
1596
1597  the.isShown = function () {
1598    return the.shown;
1599  }
1600
1601  the.update = function () {
1602    _update();
1603  }
1604
1605  the.goElement = function () {
1606    return the.element;
1607  }
1608
1609  the.destroy = function () {
1610    return _destroy();
1611  }
1612
1613  // Event API
1614  the.on = function (name, handler) {
1615    return KTEventHandler.on(the.element, name, handler);
1616  }
1617
1618  the.one = function (name, handler) {
1619    return KTEventHandler.one(the.element, name, handler);
1620  }
1621
1622  the.off = function (name, handlerId) {
1623    return KTEventHandler.off(the.element, name, handlerId);
1624  }
1625
1626  the.trigger = function (name, event) {
1627    return KTEventHandler.trigger(the.element, name, event, the, event);
1628  }
1629};
1630
1631// Static methods
1632KTDrawer.getInstance = function (element) {
1633  if (element !== null && KTUtil.data(element).has('drawer')) {
1634    return KTUtil.data(element).get('drawer');
1635  } else {
1636    return null;
1637  }
1638}
1639
1640// Hide all drawers and skip one if provided
1641KTDrawer.hideAll = function (skip = null, selector = '[data-kt-drawer="true"]') {
1642  var items = document.querySelectorAll(selector);
1643
1644  if (items && items.length > 0) {
1645    for (var i = 0, len = items.length; i < len; i++) {
1646      var item = items[i];
1647      var drawer = KTDrawer.getInstance(item);
1648
1649      if (!drawer) {
1650        continue;
1651      }
1652
1653      if (skip) {
1654        if (item !== skip) {
1655          drawer.hide();
1656        }
1657      } else {
1658        drawer.hide();
1659      }
1660    }
1661  }
1662}
1663
1664// Update all drawers
1665KTDrawer.updateAll = function (selector = '[data-kt-drawer="true"]') {
1666  var items = document.querySelectorAll(selector);
1667
1668  if (items && items.length > 0) {
1669    for (var i = 0, len = items.length; i < len; i++) {
1670      var drawer = KTDrawer.getInstance(items[i]);
1671
1672      if (drawer) {
1673        drawer.update();
1674      }
1675    }
1676  }
1677}
1678
1679// Create instances
1680KTDrawer.createInstances = function (selector = '[data-kt-drawer="true"]') {
1681  // Initialize Menus
1682  var elements = document.querySelectorAll(selector);
1683
1684  if (elements && elements.length > 0) {
1685    for (var i = 0, len = elements.length; i < len; i++) {
1686      new KTDrawer(elements[i]);
1687    }
1688  }
1689}
1690
1691// Toggle instances
1692KTDrawer.handleShow = function () {
1693  // External drawer toggle handler
1694  KTUtil.on(document.body, '[data-kt-drawer-show="true"][data-kt-drawer-target]', 'click', function (e) {
1695    e.preventDefault();
1696
1697    var element = document.querySelector(this.getAttribute('data-kt-drawer-target'));
1698
1699    if (element) {
1700      KTDrawer.getInstance(element).show();
1701    }
1702  });
1703}
1704
1705// Handle escape key press
1706KTDrawer.handleEscapeKey = function () {
1707  document.addEventListener('keydown', (event) => {
1708    if (event.key === 'Escape') {
1709      //if esc key was not pressed in combination with ctrl or alt or shift
1710      const isNotCombinedKey = !(event.ctrlKey || event.altKey || event.shiftKey);
1711      if (isNotCombinedKey) {
1712        var elements = document.querySelectorAll('.drawer-on[data-kt-drawer="true"]:not([data-kt-drawer-escape="false"])');
1713        var drawer;
1714
1715        if (elements && elements.length > 0) {
1716          for (var i = 0, len = elements.length; i < len; i++) {
1717            drawer = KTDrawer.getInstance(elements[i]);
1718            if (drawer.isShown()) {
1719              drawer.hide();
1720            }
1721          }
1722        }
1723      }
1724    }
1725  });
1726}
1727
1728// Dismiss instances
1729KTDrawer.handleDismiss = function () {
1730  // External drawer toggle handler
1731  KTUtil.on(document.body, '[data-kt-drawer-dismiss="true"]', 'click', function (e) {
1732    var element = this.closest('[data-kt-drawer="true"]');
1733
1734    if (element) {
1735      var drawer = KTDrawer.getInstance(element);
1736      if (drawer.isShown()) {
1737        drawer.hide();
1738      }
1739    }
1740  });
1741}
1742
1743// Handle resize
1744KTDrawer.handleResize = function () {
1745  // Window resize Handling
1746  window.addEventListener('resize', function () {
1747    var timer;
1748
1749    KTUtil.throttle(timer, function () {
1750      // Locate and update drawer instances on window resize
1751      var elements = document.querySelectorAll('[data-kt-drawer="true"]');
1752
1753      if (elements && elements.length > 0) {
1754        for (var i = 0, len = elements.length; i < len; i++) {
1755          var drawer = KTDrawer.getInstance(elements[i]);
1756          if (drawer) {
1757            drawer.update();
1758          }
1759        }
1760      }
1761    }, 200);
1762  });
1763}
1764
1765// Global initialization
1766KTDrawer.init = function () {
1767  KTDrawer.createInstances();
1768
1769  if (KTDrawerHandlersInitialized === false) {
1770    KTDrawer.handleResize();
1771    KTDrawer.handleShow();
1772    KTDrawer.handleDismiss();
1773    KTDrawer.handleEscapeKey();
1774
1775    KTDrawerHandlersInitialized = true;
1776  }
1777};
1778
1779// Webpack support
1780if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
1781  module.exports = KTDrawer;
1782}
1783"use strict";
1784
1785// Class definition
1786var KTEventHandler = function () {
1787  ////////////////////////////
1788  // ** Private Variables  ** //
1789  ////////////////////////////
1790  var _handlers = {};
1791
1792  ////////////////////////////
1793  // ** Private Methods  ** //
1794  ////////////////////////////
1795  var _triggerEvent = function (element, name, target) {
1796    var returnValue = true;
1797    var eventValue;
1798
1799    if (KTUtil.data(element).has(name) === true) {
1800      var handlerIds = KTUtil.data(element).get(name);
1801      var handlerId;
1802
1803      for (var i = 0; i < handlerIds.length; i++) {
1804        handlerId = handlerIds[i];
1805
1806        if (_handlers[name] && _handlers[name][handlerId]) {
1807          var handler = _handlers[name][handlerId];
1808          var value;
1809
1810          if (handler.name === name) {
1811            if (handler.one == true) {
1812              if (handler.fired == false) {
1813                _handlers[name][handlerId].fired = true;
1814
1815                eventValue = handler.callback.call(this, target);
1816              }
1817            } else {
1818              eventValue = handler.callback.call(this, target);
1819            }
1820
1821            if (eventValue === false) {
1822              returnValue = false;
1823            }
1824          }
1825        }
1826      }
1827    }
1828
1829    return returnValue;
1830  }
1831
1832  var _addEvent = function (element, name, callback, one) {
1833    var handlerId = KTUtil.getUniqueId('event');
1834    var handlerIds = KTUtil.data(element).get(name);
1835
1836    if (!handlerIds) {
1837      handlerIds = [];
1838    }
1839
1840    handlerIds.push(handlerId);
1841
1842    KTUtil.data(element).set(name, handlerIds);
1843
1844    if (!_handlers[name]) {
1845      _handlers[name] = {};
1846    }
1847
1848    _handlers[name][handlerId] = {
1849      name: name,
1850      callback: callback,
1851      one: one,
1852      fired: false
1853    };
1854
1855    return handlerId;
1856  }
1857
1858  var _removeEvent = function (element, name, handlerId) {
1859    var handlerIds = KTUtil.data(element).get(name);
1860    var index = handlerIds && handlerIds.indexOf(handlerId);
1861
1862    if (index !== -1) {
1863      handlerIds.splice(index, 1);
1864      KTUtil.data(element).set(name, handlerIds);
1865    }
1866
1867    if (_handlers[name] && _handlers[name][handlerId]) {
1868      delete _handlers[name][handlerId];
1869    }
1870  }
1871
1872  ////////////////////////////
1873  // ** Public Methods  ** //
1874  ////////////////////////////
1875  return {
1876    trigger: function (element, name, target) {
1877      return _triggerEvent(element, name, target);
1878    },
1879
1880    on: function (element, name, handler) {
1881      return _addEvent(element, name, handler);
1882    },
1883
1884    one: function (element, name, handler) {
1885      return _addEvent(element, name, handler, true);
1886    },
1887
1888    off: function (element, name, handlerId) {
1889      return _removeEvent(element, name, handlerId);
1890    },
1891
1892    debug: function () {
1893      for (var b in _handlers) {
1894        if (_handlers.hasOwnProperty(b)) console.log(b);
1895      }
1896    }
1897  }
1898}();
1899
1900// Webpack support
1901if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
1902  module.exports = KTEventHandler;
1903}
1904
1905"use strict";
1906
1907// Class definition
1908var KTFeedback = function (options) {
1909  ////////////////////////////
1910  // ** Private Variables  ** //
1911  ////////////////////////////
1912  var the = this;
1913
1914  // Default options
1915  var defaultOptions = {
1916    'width': 100,
1917    'placement': 'top-center',
1918    'content': '',
1919    'type': 'popup'
1920  };
1921
1922  ////////////////////////////
1923  // ** Private methods  ** //
1924  ////////////////////////////
1925
1926  var _construct = function () {
1927    _init();
1928  }
1929
1930  var _init = function () {
1931    // Variables
1932    the.options = KTUtil.deepExtend({}, defaultOptions, options);
1933    the.uid = KTUtil.getUniqueId('feedback');
1934    the.element;
1935    the.shown = false;
1936
1937    // Event Handlers
1938    _handlers();
1939
1940    // Bind Instance
1941    KTUtil.data(the.element).set('feedback', the);
1942  }
1943
1944  var _handlers = function () {
1945    KTUtil.addEvent(the.element, 'click', function (e) {
1946      e.preventDefault();
1947
1948      _go();
1949    });
1950  }
1951
1952  var _show = function () {
1953    if (KTEventHandler.trigger(the.element, 'kt.feedback.show', the) === false) {
1954      return;
1955    }
1956
1957    if (the.options.type === 'popup') {
1958      _showPopup();
1959    }
1960
1961    KTEventHandler.trigger(the.element, 'kt.feedback.shown', the);
1962
1963    return the;
1964  }
1965
1966  var _hide = function () {
1967    if (KTEventHandler.trigger(the.element, 'kt.feedback.hide', the) === false) {
1968      return;
1969    }
1970
1971    if (the.options.type === 'popup') {
1972      _hidePopup();
1973    }
1974
1975    the.shown = false;
1976
1977    KTEventHandler.trigger(the.element, 'kt.feedback.hidden', the);
1978
1979    return the;
1980  }
1981
1982  var _showPopup = function () {
1983    the.element = document.createElement("DIV");
1984
1985    KTUtil.addClass(the.element, 'feedback feedback-popup');
1986    KTUtil.setHTML(the.element, the.options.content);
1987
1988    if (the.options.placement == 'top-center') {
1989      _setPopupTopCenterPosition();
1990    }
1991
1992    document.body.appendChild(the.element);
1993
1994    KTUtil.addClass(the.element, 'feedback-shown');
1995
1996    the.shown = true;
1997  }
1998
1999  var _setPopupTopCenterPosition = function () {
2000    var width = KTUtil.getResponsiveValue(the.options.width);
2001    var height = KTUtil.css(the.element, 'height');
2002
2003    KTUtil.addClass(the.element, 'feedback-top-center');
2004
2005    KTUtil.css(the.element, 'width', width);
2006    KTUtil.css(the.element, 'left', '50%');
2007    KTUtil.css(the.element, 'top', '-' + height);
2008  }
2009
2010  var _hidePopup = function () {
2011    the.element.remove();
2012  }
2013
2014  var _destroy = function () {
2015    KTUtil.data(the.element).remove('feedback');
2016  }
2017
2018  // Construct class
2019  _construct();
2020
2021  ///////////////////////
2022  // ** Public API  ** //
2023  ///////////////////////
2024
2025  // Plugin API
2026  the.show = function () {
2027    return _show();
2028  }
2029
2030  the.hide = function () {
2031    return _hide();
2032  }
2033
2034  the.isShown = function () {
2035    return the.shown;
2036  }
2037
2038  the.getElement = function () {
2039    return the.element;
2040  }
2041
2042  the.destroy = function () {
2043    return _destroy();
2044  }
2045
2046  // Event API
2047  the.on = function (name, handler) {
2048    return KTEventHandler.on(the.element, name, handler);
2049  }
2050
2051  the.one = function (name, handler) {
2052    return KTEventHandler.one(the.element, name, handler);
2053  }
2054
2055  the.off = function (name, handlerId) {
2056    return KTEventHandler.off(the.element, name, handlerId);
2057  }
2058
2059  the.trigger = function (name, event) {
2060    return KTEventHandler.trigger(the.element, name, event, the, event);
2061  }
2062};
2063
2064// Webpack support
2065if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
2066  module.exports = KTFeedback;
2067}
2068
2069"use strict";
2070
2071// Class definition
2072var KTImageInput = function (element, options) {
2073  ////////////////////////////
2074  // ** Private Variables  ** //
2075  ////////////////////////////
2076  var the = this;
2077
2078  if (typeof element === "undefined" || element === null) {
2079    return;
2080  }
2081
2082  // Default Options
2083  var defaultOptions = {
2084
2085  };
2086
2087  ////////////////////////////
2088  // ** Private Methods  ** //
2089  ////////////////////////////
2090
2091  var _construct = function () {
2092    if (KTUtil.data(element).has('image-input') === true) {
2093      the = KTUtil.data(element).get('image-input');
2094    } else {
2095      _init();
2096    }
2097  }
2098
2099  var _init = function () {
2100    // Variables
2101    the.options = KTUtil.deepExtend({}, defaultOptions, options);
2102    the.uid = KTUtil.getUniqueId('image-input');
2103
2104    // Elements
2105    the.element = element;
2106    the.inputElement = KTUtil.find(element, 'input[type="file"]');
2107    the.wrapperElement = KTUtil.find(element, '.image-input-wrapper');
2108    the.cancelElement = KTUtil.find(element, '[data-kt-image-input-action="cancel"]');
2109    the.removeElement = KTUtil.find(element, '[data-kt-image-input-action="remove"]');
2110    the.hiddenElement = KTUtil.find(element, 'input[type="hidden"]');
2111    the.src = KTUtil.css(the.wrapperElement, 'backgroundImage');
2112
2113    // Set initialized
2114    the.element.setAttribute('data-kt-image-input', 'true');
2115
2116    // Event Handlers
2117    _handlers();
2118
2119    // Bind Instance
2120    KTUtil.data(the.element).set('image-input', the);
2121  }
2122
2123  // Init Event Handlers
2124  var _handlers = function () {
2125    KTUtil.addEvent(the.inputElement, 'change', _change);
2126    KTUtil.addEvent(the.cancelElement, 'click', _cancel);
2127    KTUtil.addEvent(the.removeElement, 'click', _remove);
2128  }
2129
2130  // Event Handlers
2131  var _change = function (e) {
2132    e.preventDefault();
2133
2134    if (the.inputElement !== null && the.inputElement.files && the.inputElement.files[0]) {
2135      // Fire change event
2136      if (KTEventHandler.trigger(the.element, 'kt.imageinput.change', the) === false) {
2137        return;
2138      }
2139
2140      var reader = new FileReader();
2141
2142      reader.onload = function (e) {
2143        KTUtil.css(the.wrapperElement, 'background-image', 'url(' + e.target.result + ')');
2144      }
2145
2146      reader.readAsDataURL(the.inputElement.files[0]);
2147
2148      the.element.classList.add('image-input-changed');
2149      the.element.classList.remove('image-input-empty');
2150
2151      // Fire removed event
2152      KTEventHandler.trigger(the.element, 'kt.imageinput.changed', the);
2153    }
2154  }
2155
2156  var _cancel = function (e) {
2157    e.preventDefault();
2158
2159    // Fire cancel event
2160    if (KTEventHandler.trigger(the.element, 'kt.imageinput.cancel', the) === false) {
2161      return;
2162    }
2163
2164    the.element.classList.remove('image-input-changed');
2165    the.element.classList.remove('image-input-empty');
2166
2167    if (the.src === 'none') {
2168      KTUtil.css(the.wrapperElement, 'background-image', '');
2169      the.element.classList.add('image-input-empty');
2170    } else {
2171      KTUtil.css(the.wrapperElement, 'background-image', the.src);
2172    }
2173
2174    the.inputElement.value = "";
2175
2176    if (the.hiddenElement !== null) {
2177      the.hiddenElement.value = "0";
2178    }
2179
2180    // Fire canceled event
2181    KTEventHandler.trigger(the.element, 'kt.imageinput.canceled', the);
2182  }
2183
2184  var _remove = function (e) {
2185    e.preventDefault();
2186
2187    // Fire remove event
2188    if (KTEventHandler.trigger(the.element, 'kt.imageinput.remove', the) === false) {
2189      return;
2190    }
2191
2192    the.element.classList.remove('image-input-changed');
2193    the.element.classList.add('image-input-empty');
2194
2195    KTUtil.css(the.wrapperElement, 'background-image', "none");
2196    the.inputElement.value = "";
2197
2198    if (the.hiddenElement !== null) {
2199      the.hiddenElement.value = "1";
2200    }
2201
2202    // Fire removed event
2203    KTEventHandler.trigger(the.element, 'kt.imageinput.removed', the);
2204  }
2205
2206  var _destroy = function () {
2207    KTUtil.data(the.element).remove('image-input');
2208  }
2209
2210  // Construct Class
2211  _construct();
2212
2213  ///////////////////////
2214  // ** Public API  ** //
2215  ///////////////////////
2216
2217  // Plugin API
2218  the.getInputElement = function () {
2219    return the.inputElement;
2220  }
2221
2222  the.getElement = function () {
2223    return the.element;
2224  }
2225
2226  the.destroy = function () {
2227    return _destroy();
2228  }
2229
2230  // Event API
2231  the.on = function (name, handler) {
2232    return KTEventHandler.on(the.element, name, handler);
2233  }
2234
2235  the.one = function (name, handler) {
2236    return KTEventHandler.one(the.element, name, handler);
2237  }
2238
2239  the.off = function (name, handlerId) {
2240    return KTEventHandler.off(the.element, name, handlerId);
2241  }
2242
2243  the.trigger = function (name, event) {
2244    return KTEventHandler.trigger(the.element, name, event, the, event);
2245  }
2246};
2247
2248// Static methods
2249KTImageInput.getInstance = function (element) {
2250  if (element !== null && KTUtil.data(element).has('image-input')) {
2251    return KTUtil.data(element).get('image-input');
2252  } else {
2253    return null;
2254  }
2255}
2256
2257// Create instances
2258KTImageInput.createInstances = function (selector = '[data-kt-image-input]') {
2259  // Initialize Menus
2260  var elements = document.querySelectorAll(selector);
2261
2262  if (elements && elements.length > 0) {
2263    for (var i = 0, len = elements.length; i < len; i++) {
2264      new KTImageInput(elements[i]);
2265    }
2266  }
2267}
2268
2269// Global initialization
2270KTImageInput.init = function () {
2271  KTImageInput.createInstances();
2272};
2273
2274// Webpack Support
2275if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
2276  module.exports = KTImageInput;
2277}
2278
2279"use strict";
2280
2281var KTMenuHandlersInitialized = false;
2282
2283// Class definition
2284var KTMenu = function (element, options) {
2285  ////////////////////////////
2286  // ** Private Variables  ** //
2287  ////////////////////////////
2288  var the = this;
2289
2290  if (typeof element === "undefined" || element === null) {
2291    return;
2292  }
2293
2294  // Default Options
2295  var defaultOptions = {
2296    dropdown: {
2297      hoverTimeout: 200,
2298      zindex: 107
2299    },
2300
2301    accordion: {
2302      slideSpeed: 250,
2303      expand: false
2304    }
2305  };
2306
2307  ////////////////////////////
2308  // ** Private Methods  ** //
2309  ////////////////////////////
2310
2311  var _construct = function () {
2312    if (KTUtil.data(element).has('menu') === true) {
2313      the = KTUtil.data(element).get('menu');
2314    } else {
2315      _init();
2316    }
2317  }
2318
2319  var _init = function () {
2320    the.options = KTUtil.deepExtend({}, defaultOptions, options);
2321    the.uid = KTUtil.getUniqueId('menu');
2322    the.element = element;
2323    the.triggerElement;
2324    the.disabled = false;
2325
2326    // Set initialized
2327    the.element.setAttribute('data-kt-menu', 'true');
2328
2329    _setTriggerElement();
2330    _update();
2331
2332    KTUtil.data(the.element).set('menu', the);
2333  }
2334
2335  var _destroy = function () {  // todo
2336
2337  }
2338
2339  // Event Handlers
2340  // Toggle handler
2341  var _click = function (element, e) {
2342    if (element.hasAttribute('href') && element.getAttribute("href") !== "#") {
2343      return;
2344    }
2345
2346    e.preventDefault();
2347
2348    if (the.disabled === true) {
2349      return;
2350    }
2351
2352    var item = _getItemElement(element);
2353
2354    if (_getOptionFromElementAttribute(item, 'trigger') !== 'click') {
2355      return;
2356    }
2357
2358    if (_getOptionFromElementAttribute(item, 'toggle') === false) {
2359      _show(item);
2360    } else {
2361      _toggle(item);
2362    }
2363  }
2364
2365  // Link handler
2366  var _link = function (element, e) {
2367    if (the.disabled === true) {
2368      return;
2369    }
2370
2371    if (KTEventHandler.trigger(the.element, 'kt.menu.link.click', element) === false) {
2372      return;
2373    }
2374
2375    // Dismiss all shown dropdowns
2376    KTMenu.hideDropdowns();
2377
2378    KTEventHandler.trigger(the.element, 'kt.menu.link.clicked', element);
2379  }
2380
2381  // Dismiss handler
2382  var _dismiss = function (element, e) {
2383    var item = _getItemElement(element);
2384    var items = _getItemChildElements(item);
2385
2386    if (item !== null && _getItemSubType(item) === 'dropdown') {
2387      _hide(item); // hide items dropdown
2388      // Hide all child elements as well
2389
2390      if (items.length > 0) {
2391        for (var i = 0, len = items.length; i < len; i++) {
2392          if (items[i] !== null && _getItemSubType(items[i]) === 'dropdown') {
2393            _hide(tems[i]);
2394          }
2395        }
2396      }
2397    }
2398  }
2399
2400  // Mouseover handle
2401  var _mouseover = function (element, e) {
2402    var item = _getItemElement(element);
2403
2404    if (the.disabled === true) {
2405      return;
2406    }
2407
2408    if (item === null) {
2409      return;
2410    }
2411
2412    if (_getOptionFromElementAttribute(item, 'trigger') !== 'hover') {
2413      return;
2414    }
2415
2416    if (KTUtil.data(item).get('hover') === '1') {
2417      clearTimeout(KTUtil.data(item).get('timeout'));
2418      KTUtil.data(item).remove('hover');
2419      KTUtil.data(item).remove('timeout');
2420    }
2421
2422    _show(item);
2423  }
2424
2425  // Mouseout handle
2426  var _mouseout = function (element, e) {
2427    var item = _getItemElement(element);
2428
2429    if (the.disabled === true) {
2430      return;
2431    }
2432
2433    if (item === null) {
2434      return;
2435    }
2436
2437    if (_getOptionFromElementAttribute(item, 'trigger') !== 'hover') {
2438      return;
2439    }
2440
2441    var timeout = setTimeout(function () {
2442      if (KTUtil.data(item).get('hover') === '1') {
2443        _hide(item);
2444      }
2445    }, the.options.dropdown.hoverTimeout);
2446
2447    KTUtil.data(item).set('hover', '1');
2448    KTUtil.data(item).set('timeout', timeout);
2449  }
2450
2451  // Toggle item sub
2452  var _toggle = function (item) {
2453    if (!item) {
2454      item = the.triggerElement;
2455    }
2456
2457    if (_isItemSubShown(item) === true) {
2458      _hide(item);
2459    } else {
2460      _show(item);
2461    }
2462  }
2463
2464  // Show item sub
2465  var _show = function (item) {
2466    if (!item) {
2467      item = the.triggerElement;
2468    }
2469
2470    if (_isItemSubShown(item) === true) {
2471      return;
2472    }
2473
2474    if (_getItemSubType(item) === 'dropdown') {
2475      _showDropdown(item); // // show current dropdown
2476    } else if (_getItemSubType(item) === 'accordion') {
2477      _showAccordion(item);
2478    }
2479
2480    // Remember last submenu type
2481    KTUtil.data(item).set('type', _getItemSubType(item));  // updated
2482  }
2483
2484  // Hide item sub
2485  var _hide = function (item) {
2486    if (!item) {
2487      item = the.triggerElement;
2488    }
2489
2490    if (_isItemSubShown(item) === false) {
2491      return;
2492    }
2493
2494    if (_getItemSubType(item) === 'dropdown') {
2495      _hideDropdown(item);
2496    } else if (_getItemSubType(item) === 'accordion') {
2497      _hideAccordion(item);
2498    }
2499  }
2500
2501  // Reset item state classes if item sub type changed
2502  var _reset = function (item) {
2503    if (_hasItemSub(item) === false) {
2504      return;
2505    }
2506
2507    var sub = _getItemSubElement(item);
2508
2509    // Reset sub state if sub type is changed during the window resize
2510    if (KTUtil.data(item).has('type') && KTUtil.data(item).get('type') !== _getItemSubType(item)) {  // updated
2511      KTUtil.removeClass(item, 'hover');
2512      KTUtil.removeClass(item, 'show');
2513      KTUtil.removeClass(sub, 'show');
2514    }  // updated
2515  }
2516
2517  // Update all item state classes if item sub type changed
2518  var _update = function () {
2519    var items = the.element.querySelectorAll('.menu-item[data-kt-menu-trigger]');
2520
2521    if (items && items.length > 0) {
2522      for (var i = 0, len = items.length; i < len; i++) {
2523        _reset(items[i]);
2524      }
2525    }
2526  }
2527
2528  // Set external trigger element
2529  var _setTriggerElement = function () {
2530    var target = document.querySelector('[data-kt-menu-target="#' + the.element.getAttribute('id') + '"]');
2531
2532    if (target !== null) {
2533      the.triggerElement = target;
2534    } else if (the.element.closest('[data-kt-menu-trigger]')) {
2535      the.triggerElement = the.element.closest('[data-kt-menu-trigger]');
2536    } else if (the.element.parentNode && KTUtil.child(the.element.parentNode, '[data-kt-menu-trigger]')) {
2537      the.triggerElement = KTUtil.child(the.element.parentNode, '[data-kt-menu-trigger]');
2538    }
2539
2540    if (the.triggerElement) {
2541      KTUtil.data(the.triggerElement).set('menu', the);
2542    }
2543  }
2544
2545  // Test if menu has external trigger element
2546  var _isTriggerElement = function (item) {
2547    return (the.triggerElement === item) ? true : false;
2548  }
2549
2550  // Test if item's sub is shown
2551  var _isItemSubShown = function (item) {
2552    var sub = _getItemSubElement(item);
2553
2554    if (sub !== null) {
2555      if (_getItemSubType(item) === 'dropdown') {
2556        if (KTUtil.hasClass(sub, 'show') === true && sub.hasAttribute('data-popper-placement') === true) {
2557          return true;
2558        } else {
2559          return false;
2560        }
2561      } else {
2562        return KTUtil.hasClass(item, 'show');
2563      }
2564    } else {
2565      return false;
2566    }
2567  }
2568
2569  // Test if item dropdown is permanent
2570  var _isItemDropdownPermanent = function (item) {
2571    return _getOptionFromElementAttribute(item, 'permanent') === true ? true : false;
2572  }
2573
2574  // Test if item's parent is shown
2575  var _isItemParentShown = function (item) {
2576    return KTUtil.parents(item, '.menu-item.show').length > 0;
2577  }
2578
2579  // Test of it is item sub element
2580  var _isItemSubElement = function (item) {
2581    return KTUtil.hasClass(item, 'menu-sub');
2582  }
2583
2584  // Test if item has sub
2585  var _hasItemSub = function (item) {
2586    return (KTUtil.hasClass(item, 'menu-item') && item.hasAttribute('data-kt-menu-trigger'));
2587  }
2588
2589  // Get link element
2590  var _getItemLinkElement = function (item) {
2591    return KTUtil.child(item, '.menu-link');
2592  }
2593
2594  // Get toggle element
2595  var _getItemToggleElement = function (item) {
2596    if (the.triggerElement) {
2597      return the.triggerElement;
2598    } else {
2599      return _getItemLinkElement(item);
2600    }
2601  }
2602
2603  // Get item sub element
2604  var _getItemSubElement = function (item) {
2605    if (_isTriggerElement(item) === true) {
2606      return the.element;
2607    } if (item.classList.contains('menu-sub') === true) {
2608      return item;
2609    } else if (KTUtil.data(item).has('sub')) {
2610      return KTUtil.data(item).get('sub');
2611    } else {
2612      return KTUtil.child(item, '.menu-sub');
2613    }
2614  }
2615
2616  // Get item sub type
2617  var _getItemSubType = function (element) {
2618    var sub = _getItemSubElement(element);
2619
2620    if (sub && parseInt(KTUtil.css(sub, 'z-index')) > 0) {
2621      return "dropdown";
2622    } else {
2623      return "accordion";
2624    }
2625  }
2626
2627  // Get item element
2628  var _getItemElement = function (element) {
2629    var item, sub;
2630
2631    // Element is the external trigger element
2632    if (_isTriggerElement(element)) {
2633      return element;
2634    }
2635
2636    // Element has item toggler attribute
2637    if (element.hasAttribute('data-kt-menu-trigger')) {
2638      return element;
2639    }
2640
2641    // Element has item DOM reference in it's data storage
2642    if (KTUtil.data(element).has('item')) {
2643      return KTUtil.data(element).get('item');
2644    }
2645
2646    // Item is parent of element
2647    if ((item = element.closest('.menu-item'))) {
2648      return item;
2649    }
2650
2651    // Element's parent has item DOM reference in it's data storage
2652    if ((sub = element.closest('.menu-sub'))) {
2653      if (KTUtil.data(sub).has('item') === true) {
2654        return KTUtil.data(sub).get('item')
2655      }
2656    }
2657  }
2658
2659  // Get item parent element
2660  var _getItemParentElement = function (item) {
2661    var sub = item.closest('.menu-sub');
2662    var parentItem;
2663
2664    if (sub && KTUtil.data(sub).has('item')) {
2665      return KTUtil.data(sub).get('item');
2666    }
2667
2668    if (sub && (parentItem = sub.closest('.menu-item[data-kt-menu-trigger]'))) {
2669      return parentItem;
2670    }
2671
2672    return null;
2673  }
2674
2675  // Get item parent elements
2676  var _getItemParentElements = function (item) {
2677    var parents = [];
2678    var parent;
2679    var i = 0;
2680
2681    do {
2682      parent = _getItemParentElement(item);
2683
2684      if (parent) {
2685        parents.push(parent);
2686        item = parent;
2687      }
2688
2689      i++;
2690    } while (parent !== null && i < 20);
2691
2692    if (the.triggerElement) {
2693      parents.unshift(the.triggerElement);
2694    }
2695
2696    return parents;
2697  }
2698
2699  // Get item child element
2700  var _getItemChildElement = function (item) {
2701    var selector = item;
2702    var element;
2703
2704    if (KTUtil.data(item).get('sub')) {
2705      selector = KTUtil.data(item).get('sub');
2706    }
2707
2708    if (selector !== null) {
2709      //element = selector.querySelector('.show.menu-item[data-kt-menu-trigger]');
2710      element = selector.querySelector('.menu-item[data-kt-menu-trigger]');
2711
2712      if (element) {
2713        return element;
2714      } else {
2715        return null;
2716      }
2717    } else {
2718      return null;
2719    }
2720  }
2721
2722  // Get item child elements
2723  var _getItemChildElements = function (item) {
2724    var children = [];
2725    var child;
2726    var i = 0;
2727
2728    do {
2729      child = _getItemChildElement(item);
2730
2731      if (child) {
2732        children.push(child);
2733        item = child;
2734      }
2735
2736      i++;
2737    } while (child !== null && i < 20);
2738
2739    return children;
2740  }
2741
2742  // Show item dropdown
2743  var _showDropdown = function (item) {
2744    // Handle dropdown show event
2745    if (KTEventHandler.trigger(the.element, 'kt.menu.dropdown.show', item) === false) {
2746      return;
2747    }
2748
2749    // Hide all currently shown dropdowns except current one
2750    KTMenu.hideDropdowns(item);
2751
2752    var toggle = _isTriggerElement(item) ? item : _getItemLinkElement(item);
2753    var sub = _getItemSubElement(item);
2754
2755    var width = _getOptionFromElementAttribute(item, 'width');
2756    var height = _getOptionFromElementAttribute(item, 'height');
2757
2758    var zindex = the.options.dropdown.zindex; // update
2759    var parentZindex = KTUtil.getHighestZindex(item); // update
2760
2761    // Apply a new z-index if dropdown's toggle element or it's parent has greater z-index // update
2762    if (parentZindex !== null && parentZindex >= zindex) {
2763      zindex = parentZindex + 1;
2764    }
2765
2766    if (zindex > 0) {
2767      KTUtil.css(sub, 'z-index', zindex);
2768    }
2769
2770    if (width !== null) {
2771      KTUtil.css(sub, 'width', width);
2772    }
2773
2774    if (height !== null) {
2775      KTUtil.css(sub, 'height', height);
2776    }
2777
2778    KTUtil.css(sub, 'display', '');
2779    KTUtil.css(sub, 'overflow', '');
2780
2781    // Init popper(new)
2782    _initDropdownPopper(item, sub);
2783
2784    KTUtil.addClass(item, 'show');
2785    KTUtil.addClass(item, 'menu-dropdown');
2786    KTUtil.addClass(sub, 'show');
2787
2788    // Append the sub the the root of the menu
2789    if (_getOptionFromElementAttribute(item, 'overflow') === true) {
2790      document.body.appendChild(sub);
2791      KTUtil.data(item).set('sub', sub);
2792      KTUtil.data(sub).set('item', item);
2793      KTUtil.data(sub).set('menu', the);
2794    } else {
2795      KTUtil.data(sub).set('item', item);
2796    }
2797
2798    // Handle dropdown shown event
2799    KTEventHandler.trigger(the.element, 'kt.menu.dropdown.shown', item);
2800  }
2801
2802  // Hide item dropdown
2803  var _hideDropdown = function (item) {
2804    // Handle dropdown hide event
2805    if (KTEventHandler.trigger(the.element, 'kt.menu.dropdown.hide', item) === false) {
2806      return;
2807    }
2808
2809    var sub = _getItemSubElement(item);
2810
2811    KTUtil.css(sub, 'z-index', '');
2812    KTUtil.css(sub, 'width', '');
2813    KTUtil.css(sub, 'height', '');
2814
2815    KTUtil.removeClass(item, 'show');
2816    KTUtil.removeClass(item, 'menu-dropdown');
2817    KTUtil.removeClass(sub, 'show');
2818
2819    // Append the sub back to it's parent
2820    if (_getOptionFromElementAttribute(item, 'overflow') === true) {
2821      if (item.classList.contains('menu-item')) {
2822        item.appendChild(sub);
2823      } else {
2824        KTUtil.insertAfter(the.element, item);
2825      }
2826
2827      KTUtil.data(item).remove('sub');
2828      KTUtil.data(sub).remove('item');
2829      KTUtil.data(sub).remove('menu');
2830    }
2831
2832    // Destroy popper(new)
2833    _destroyDropdownPopper(item);
2834
2835    // Handle dropdown hidden event
2836    KTEventHandler.trigger(the.element, 'kt.menu.dropdown.hidden', item);
2837  }
2838
2839  // Init dropdown popper(new)
2840  var _initDropdownPopper = function (item, sub) {
2841    // Setup popper instance
2842    var reference;
2843    var attach = _getOptionFromElementAttribute(item, 'attach');
2844
2845    if (attach) {
2846      if (attach === 'parent') {
2847        reference = item.parentNode;
2848      } else {
2849        reference = document.querySelector(attach);
2850      }
2851    } else {
2852      reference = item;
2853    }
2854
2855    var popper = Popper.createPopper(reference, sub, _getDropdownPopperConfig(item));
2856    KTUtil.data(item).set('popper', popper);
2857  }
2858
2859  // Destroy dropdown popper(new)
2860  var _destroyDropdownPopper = function (item) {
2861    if (KTUtil.data(item).has('popper') === true) {
2862      KTUtil.data(item).get('popper').destroy();
2863      KTUtil.data(item).remove('popper');
2864    }
2865  }
2866
2867  // Prepare popper config for dropdown(see: https://popper.js.org/docs/v2/)
2868  var _getDropdownPopperConfig = function (item) {
2869    // Placement
2870    var placement = _getOptionFromElementAttribute(item, 'placement');
2871    if (!placement) {
2872      placement = 'right';
2873    }
2874
2875    // Offset
2876    var offsetValue = _getOptionFromElementAttribute(item, 'offset');
2877    var offset = offsetValue ? offsetValue.split(",") : [];
2878
2879    if (offset.length === 2) {
2880      offset[0] = parseInt(offset[0]);
2881      offset[1] = parseInt(offset[1]);
2882    }
2883
2884    // Strategy
2885    var strategy = _getOptionFromElementAttribute(item, 'overflow') === true ? 'absolute' : 'fixed';
2886
2887    var altAxis = _getOptionFromElementAttribute(item, 'flip') !== false ? true : false;
2888
2889    var popperConfig = {
2890      placement: placement,
2891      strategy: strategy,
2892      modifiers: [{
2893        name: 'offset',
2894        options: {
2895          offset: offset
2896        }
2897      }, {
2898        name: 'preventOverflow',
2899        options: {
2900          altAxis: altAxis
2901        }
2902      }, {
2903        name: 'flip',
2904        options: {
2905          flipVariations: false
2906        }
2907      }]
2908    };
2909
2910    return popperConfig;
2911  }
2912
2913  // Show item accordion
2914  var _showAccordion = function (item) {
2915    if (KTEventHandler.trigger(the.element, 'kt.menu.accordion.show', item) === false) {
2916      return;
2917    }
2918
2919    var sub = _getItemSubElement(item);
2920    var expand = the.options.accordion.expand;
2921
2922    if (_getOptionFromElementAttribute(item, 'expand') === true) {
2923      expand = true;
2924    } else if (_getOptionFromElementAttribute(item, 'expand') === false) {
2925      expand = false;
2926    } else if (_getOptionFromElementAttribute(the.element, 'expand') === true) {
2927      expand = true;
2928    }
2929
2930    if (expand === false) {
2931      _hideAccordions(item);
2932    }
2933
2934    if (KTUtil.data(item).has('popper') === true) {
2935      _hideDropdown(item);
2936    }
2937
2938    KTUtil.addClass(item, 'hover');
2939
2940    KTUtil.addClass(item, 'showing');
2941
2942    KTUtil.slideDown(sub, the.options.accordion.slideSpeed, function () {
2943      KTUtil.removeClass(item, 'showing');
2944      KTUtil.addClass(item, 'show');
2945      KTUtil.addClass(sub, 'show');
2946
2947      KTEventHandler.trigger(the.element, 'kt.menu.accordion.shown', item);
2948    });
2949  }
2950
2951  // Hide item accordion
2952  var _hideAccordion = function (item) {
2953    if (KTEventHandler.trigger(the.element, 'kt.menu.accordion.hide', item) === false) {
2954      return;
2955    }
2956
2957    var sub = _getItemSubElement(item);
2958
2959    KTUtil.addClass(item, 'hiding');
2960
2961    KTUtil.slideUp(sub, the.options.accordion.slideSpeed, function () {
2962      KTUtil.removeClass(item, 'hiding');
2963      KTUtil.removeClass(item, 'show');
2964      KTUtil.removeClass(sub, 'show');
2965
2966      KTUtil.removeClass(item, 'hover'); // update
2967
2968      KTEventHandler.trigger(the.element, 'kt.menu.accordion.hidden', item);
2969    });
2970  }
2971
2972  var _setActiveLink = function (link) {
2973    var item = _getItemElement(link);
2974
2975    if (!item) {
2976      return;
2977    }
2978
2979    var parentItems = _getItemParentElements(item);
2980    var parentTabPane = link.closest('.tab-pane');
2981
2982    var activeLinks = [].slice.call(the.element.querySelectorAll('.menu-link.active'));
2983    var activeParentItems = [].slice.call(the.element.querySelectorAll('.menu-item.here, .menu-item.show'));
2984
2985    if (_getItemSubType(item) === "accordion") {
2986      _showAccordion(item);
2987    } else {
2988      item.classList.add("here");
2989    }
2990
2991    if (parentItems && parentItems.length > 0) {
2992      for (var i = 0, len = parentItems.length; i < len; i++) {
2993        var parentItem = parentItems[i];
2994
2995        if (_getItemSubType(parentItem) === "accordion") {
2996          _showAccordion(parentItem);
2997        } else {
2998          parentItem.classList.add("here");
2999        }
3000      }
3001    }
3002
3003    activeLinks.map(function (activeLink) {
3004      activeLink.classList.remove("active");
3005    });
3006
3007    activeParentItems.map(function (activeParentItem) {
3008      if (activeParentItem.contains(item) === false) {
3009        activeParentItem.classList.remove("here");
3010        activeParentItem.classList.remove("show");
3011      }
3012    });
3013
3014    // Handle tab
3015    if (parentTabPane && bootstrap.Tab) {
3016      var tabEl = the.element.querySelector('[data-bs-target="#' + parentTabPane.getAttribute("id") + '"]');
3017      var tab = new bootstrap.Tab(tabEl);
3018
3019      if (tab) {
3020        tab.show();
3021      }
3022    }
3023
3024    link.classList.add("active");
3025  }
3026
3027  var _getLinkByAttribute = function (value, name = "href") {
3028    var link = the.element.querySelector('.menu-link[' + name + '="' + value + '"]');
3029
3030    if (link) {
3031      return link;
3032    } else {
3033      null;
3034    }
3035  }
3036
3037  // Hide all shown accordions of item
3038  var _hideAccordions = function (item) {
3039    var itemsToHide = KTUtil.findAll(the.element, '.show[data-kt-menu-trigger]');
3040    var itemToHide;
3041
3042    if (itemsToHide && itemsToHide.length > 0) {
3043      for (var i = 0, len = itemsToHide.length; i < len; i++) {
3044        itemToHide = itemsToHide[i];
3045
3046        if (_getItemSubType(itemToHide) === 'accordion' && itemToHide !== item && item.contains(itemToHide) === false && itemToHide.contains(item) === false) {
3047          _hideAccordion(itemToHide);
3048        }
3049      }
3050    }
3051  }
3052
3053  // Get item option(through html attributes)
3054  var _getOptionFromElementAttribute = function (item, name) {
3055    var attr;
3056    var value = null;
3057
3058    if (item && item.hasAttribute('data-kt-menu-' + name)) {
3059      attr = item.getAttribute('data-kt-menu-' + name);
3060      value = KTUtil.getResponsiveValue(attr);
3061
3062      if (value !== null && String(value) === 'true') {
3063        value = true;
3064      } else if (value !== null && String(value) === 'false') {
3065        value = false;
3066      }
3067    }
3068
3069    return value;
3070  }
3071
3072  var _destroy = function () {
3073    KTUtil.data(the.element).remove('menu');
3074  }
3075
3076  // Construct Class
3077  _construct();
3078
3079  ///////////////////////
3080  // ** Public API  ** //
3081  ///////////////////////
3082
3083  // Event Handlers
3084  the.click = function (element, e) {
3085    return _click(element, e);
3086  }
3087
3088  the.link = function (element, e) {
3089    return _link(element, e);
3090  }
3091
3092  the.dismiss = function (element, e) {
3093    return _dismiss(element, e);
3094  }
3095
3096  the.mouseover = function (element, e) {
3097    return _mouseover(element, e);
3098  }
3099
3100  the.mouseout = function (element, e) {
3101    return _mouseout(element, e);
3102  }
3103
3104  // General Methods
3105  the.getItemTriggerType = function (item) {
3106    return _getOptionFromElementAttribute(item, 'trigger');
3107  }
3108
3109  the.getItemSubType = function (element) {
3110    return _getItemSubType(element);
3111  }
3112
3113  the.show = function (item) {
3114    return _show(item);
3115  }
3116
3117  the.hide = function (item) {
3118    return _hide(item);
3119  }
3120
3121  the.toggle = function (item) {
3122    return _toggle(item);
3123  }
3124
3125  the.reset = function (item) {
3126    return _reset(item);
3127  }
3128
3129  the.update = function () {
3130    return _update();
3131  }
3132
3133  the.getElement = function () {
3134    return the.element;
3135  }
3136
3137  the.setActiveLink = function (link) {
3138    return _setActiveLink(link);
3139  }
3140
3141  the.getLinkByAttribute = function (value, name = "href") {
3142    return _getLinkByAttribute(value, name);
3143  }
3144
3145  the.getItemLinkElement = function (item) {
3146    return _getItemLinkElement(item);
3147  }
3148
3149  the.getItemToggleElement = function (item) {
3150    return _getItemToggleElement(item);
3151  }
3152
3153  the.getItemSubElement = function (item) {
3154    return _getItemSubElement(item);
3155  }
3156
3157  the.getItemParentElements = function (item) {
3158    return _getItemParentElements(item);
3159  }
3160
3161  the.isItemSubShown = function (item) {
3162    return _isItemSubShown(item);
3163  }
3164
3165  the.isItemParentShown = function (item) {
3166    return _isItemParentShown(item);
3167  }
3168
3169  the.getTriggerElement = function () {
3170    return the.triggerElement;
3171  }
3172
3173  the.isItemDropdownPermanent = function (item) {
3174    return _isItemDropdownPermanent(item);
3175  }
3176
3177  the.destroy = function () {
3178    return _destroy();
3179  }
3180
3181  the.disable = function () {
3182    the.disabled = true;
3183  }
3184
3185  the.enable = function () {
3186    the.disabled = false;
3187  }
3188
3189  // Accordion Mode Methods
3190  the.hideAccordions = function (item) {
3191    return _hideAccordions(item);
3192  }
3193
3194  // Event API
3195  the.on = function (name, handler) {
3196    return KTEventHandler.on(the.element, name, handler);
3197  }
3198
3199  the.one = function (name, handler) {
3200    return KTEventHandler.one(the.element, name, handler);
3201  }
3202
3203  the.off = function (name, handlerId) {
3204    return KTEventHandler.off(the.element, name, handlerId);
3205  }
3206};
3207
3208// Get KTMenu instance by element
3209KTMenu.getInstance = function (element) {
3210  var menu;
3211  var item;
3212
3213  if (!element) {
3214    return null;
3215  }
3216
3217  // Element has menu DOM reference in it's DATA storage
3218  if (KTUtil.data(element).has('menu')) {
3219    return KTUtil.data(element).get('menu');
3220  }
3221
3222  // Element has .menu parent
3223  if (menu = element.closest('.menu')) {
3224    if (KTUtil.data(menu).has('menu')) {
3225      return KTUtil.data(menu).get('menu');
3226    }
3227  }
3228
3229  // Element has a parent with DOM reference to .menu in it's DATA storage
3230  if (KTUtil.hasClass(element, 'menu-link')) {
3231    var sub = element.closest('.menu-sub');
3232
3233    if (KTUtil.data(sub).has('menu')) {
3234      return KTUtil.data(sub).get('menu');
3235    }
3236  }
3237
3238  return null;
3239}
3240
3241// Hide all dropdowns and skip one if provided
3242KTMenu.hideDropdowns = function (skip) {
3243  var items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
3244
3245  if (items && items.length > 0) {
3246    for (var i = 0, len = items.length; i < len; i++) {
3247      var item = items[i];
3248      var menu = KTMenu.getInstance(item);
3249
3250      if (menu && menu.getItemSubType(item) === 'dropdown') {
3251        if (skip) {
3252          if (menu.getItemSubElement(item).contains(skip) === false && item.contains(skip) === false && item !== skip) {
3253            menu.hide(item);
3254          }
3255        } else {
3256          menu.hide(item);
3257        }
3258      }
3259    }
3260  }
3261}
3262
3263// Update all dropdowns popover instances
3264KTMenu.updateDropdowns = function () {
3265  var items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
3266
3267  if (items && items.length > 0) {
3268    for (var i = 0, len = items.length; i < len; i++) {
3269      var item = items[i];
3270
3271      if (KTUtil.data(item).has('popper')) {
3272        KTUtil.data(item).get('popper').forceUpdate();
3273      }
3274    }
3275  }
3276}
3277
3278// Global handlers
3279KTMenu.initHandlers = function () {
3280  // Dropdown handler
3281  document.addEventListener("click", function (e) {
3282    var items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]:not([data-kt-menu-static="true"])');
3283    var menu;
3284    var item;
3285    var sub;
3286    var menuObj;
3287
3288    if (items && items.length > 0) {
3289      for (var i = 0, len = items.length; i < len; i++) {
3290        item = items[i];
3291        menuObj = KTMenu.getInstance(item);
3292
3293        if (menuObj && menuObj.getItemSubType(item) === 'dropdown') {
3294          menu = menuObj.getElement();
3295          sub = menuObj.getItemSubElement(item);
3296
3297          if (item === e.target || item.contains(e.target)) {
3298            continue;
3299          }
3300
3301          if (sub === e.target || sub.contains(e.target)) {
3302            continue;
3303          }
3304
3305          menuObj.hide(item);
3306        }
3307      }
3308    }
3309  });
3310
3311  // Sub toggle handler(updated)
3312  KTUtil.on(document.body, '.menu-item[data-kt-menu-trigger] > .menu-link, [data-kt-menu-trigger]:not(.menu-item):not([data-kt-menu-trigger="auto"])', 'click', function (e) {
3313    var menu = KTMenu.getInstance(this);
3314
3315    if (menu !== null) {
3316      return menu.click(this, e);
3317    }
3318  });
3319
3320  // Link handler
3321  KTUtil.on(document.body, '.menu-item:not([data-kt-menu-trigger]) > .menu-link', 'click', function (e) {
3322    var menu = KTMenu.getInstance(this);
3323
3324    if (menu !== null) {
3325      return menu.link(this, e);
3326    }
3327  });
3328
3329  // Dismiss handler
3330  KTUtil.on(document.body, '[data-kt-menu-dismiss="true"]', 'click', function (e) {
3331    var menu = KTMenu.getInstance(this);
3332
3333    if (menu !== null) {
3334      return menu.dismiss(this, e);
3335    }
3336  });
3337
3338  // Mouseover handler
3339  KTUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseover', function (e) {
3340    var menu = KTMenu.getInstance(this);
3341
3342    if (menu !== null && menu.getItemSubType(this) === 'dropdown') {
3343      return menu.mouseover(this, e);
3344    }
3345  });
3346
3347  // Mouseout handler
3348  KTUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseout', function (e) {
3349    var menu = KTMenu.getInstance(this);
3350
3351    if (menu !== null && menu.getItemSubType(this) === 'dropdown') {
3352      return menu.mouseout(this, e);
3353    }
3354  });
3355
3356  // Resize handler
3357  window.addEventListener('resize', function () {
3358    var menu;
3359    var timer;
3360
3361    KTUtil.throttle(timer, function () {
3362      // Locate and update Offcanvas instances on window resize
3363      var elements = document.querySelectorAll('[data-kt-menu="true"]');
3364
3365      if (elements && elements.length > 0) {
3366        for (var i = 0, len = elements.length; i < len; i++) {
3367          menu = KTMenu.getInstance(elements[i]);
3368          if (menu) {
3369            menu.update();
3370          }
3371        }
3372      }
3373    }, 200);
3374  });
3375}
3376
3377// Render menus by url
3378KTMenu.updateByLinkAttribute = function (value, name = "href") {
3379  // Set menu link active state by attribute value
3380  var elements = document.querySelectorAll('[data-kt-menu="true"]');
3381
3382  if (elements && elements.length > 0) {
3383    for (var i = 0, len = elements.length; i < len; i++) {
3384      var menu = KTMenu.getInstance(elements[i]);
3385
3386      if (menu) {
3387        var link = menu.getLinkByAttribute(value, name);
3388        if (link) {
3389          menu.setActiveLink(link);
3390        }
3391      }
3392    }
3393  }
3394}
3395
3396// Global instances
3397KTMenu.createInstances = function (selector = '[data-kt-menu="true"]') {
3398  // Initialize menus
3399  var elements = document.querySelectorAll(selector);
3400  if (elements && elements.length > 0) {
3401    for (var i = 0, len = elements.length; i < len; i++) {
3402      new KTMenu(elements[i]);
3403    }
3404  }
3405}
3406
3407// Global initialization
3408KTMenu.init = function () {
3409  KTMenu.createInstances();
3410
3411  if (KTMenuHandlersInitialized === false) {
3412    KTMenu.initHandlers();
3413
3414    KTMenuHandlersInitialized = true;
3415  }
3416};
3417
3418// Webpack support
3419if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
3420  module.exports = KTMenu;
3421}
3422
3423"use strict";
3424
3425// Class definition
3426var KTPasswordMeter = function (element, options) {
3427  ////////////////////////////
3428  // ** Private variables  ** //
3429  ////////////////////////////
3430  var the = this;
3431
3432  if (!element) {
3433    return;
3434  }
3435
3436  // Default Options
3437  var defaultOptions = {
3438    minLength: 8,
3439    checkUppercase: true,
3440    checkLowercase: true,
3441    checkDigit: true,
3442    checkChar: true,
3443    scoreHighlightClass: 'active'
3444  };
3445
3446  ////////////////////////////
3447  // ** Private methods  ** //
3448  ////////////////////////////
3449
3450  // Constructor
3451  var _construct = function () {
3452    if (KTUtil.data(element).has('password-meter') === true) {
3453      the = KTUtil.data(element).get('password-meter');
3454    } else {
3455      _init();
3456    }
3457  }
3458
3459  // Initialize
3460  var _init = function () {
3461    // Variables
3462    the.options = KTUtil.deepExtend({}, defaultOptions, options);
3463    the.score = 0;
3464    the.checkSteps = 5;
3465
3466    // Elements
3467    the.element = element;
3468    the.inputElement = the.element.querySelector('input[type]');
3469    the.visibilityElement = the.element.querySelector('[data-kt-password-meter-control="visibility"]');
3470    the.highlightElement = the.element.querySelector('[data-kt-password-meter-control="highlight"]');
3471
3472    // Set initialized
3473    the.element.setAttribute('data-kt-password-meter', 'true');
3474
3475    // Event Handlers
3476    _handlers();
3477
3478    // Bind Instance
3479    KTUtil.data(the.element).set('password-meter', the);
3480  }
3481
3482  // Handlers
3483  var _handlers = function () {
3484    if (the.highlightElement) {
3485      the.inputElement.addEventListener('input', function () {
3486        _check();
3487      });
3488    }
3489
3490    if (the.visibilityElement) {
3491      the.visibilityElement.addEventListener('click', function () {
3492        _visibility();
3493      });
3494    }
3495  }
3496
3497  // Event handlers
3498  var _check = function () {
3499    var score = 0;
3500    var checkScore = _getCheckScore();
3501
3502    if (_checkLength() === true) {
3503      score = score + checkScore;
3504    }
3505
3506    if (the.options.checkUppercase === true && _checkLowercase() === true) {
3507      score = score + checkScore;
3508    }
3509
3510    if (the.options.checkLowercase === true && _checkUppercase() === true) {
3511      score = score + checkScore;
3512    }
3513
3514    if (the.options.checkDigit === true && _checkDigit() === true) {
3515      score = score + checkScore;
3516    }
3517
3518    if (the.options.checkChar === true && _checkChar() === true) {
3519      score = score + checkScore;
3520    }
3521
3522    the.score = score;
3523
3524    _highlight();
3525  }
3526
3527  var _checkLength = function () {
3528    return the.inputElement.value.length >= the.options.minLength;  // 20 score
3529  }
3530
3531  var _checkLowercase = function () {
3532    return /[a-z]/.test(the.inputElement.value);  // 20 score
3533  }
3534
3535  var _checkUppercase = function () {
3536    return /[A-Z]/.test(the.inputElement.value);  // 20 score
3537  }
3538
3539  var _checkDigit = function () {
3540    return /[0-9]/.test(the.inputElement.value);  // 20 score
3541  }
3542
3543  var _checkChar = function () {
3544    return /[~`!#@$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g.test(the.inputElement.value);  // 20 score
3545  }
3546
3547  var _getCheckScore = function () {
3548    var count = 1;
3549
3550    if (the.options.checkUppercase === true) {
3551      count++;
3552    }
3553
3554    if (the.options.checkLowercase === true) {
3555      count++;
3556    }
3557
3558    if (the.options.checkDigit === true) {
3559      count++;
3560    }
3561
3562    if (the.options.checkChar === true) {
3563      count++;
3564    }
3565
3566    the.checkSteps = count;
3567
3568    return 100 / the.checkSteps;
3569  }
3570
3571  var _highlight = function () {
3572    var items = [].slice.call(the.highlightElement.querySelectorAll('div'));
3573    var total = items.length;
3574    var index = 0;
3575    var checkScore = _getCheckScore();
3576    var score = _getScore();
3577
3578    items.map(function (item) {
3579      index++;
3580
3581      if ((checkScore * index * (the.checkSteps / total)) <= score) {
3582        item.classList.add('active');
3583      } else {
3584        item.classList.remove('active');
3585      }
3586    });
3587  }
3588
3589  var _visibility = function () {
3590    var visibleIcon = the.visibilityElement.querySelector(':scope > i:not(.d-none)');
3591    var hiddenIcon = the.visibilityElement.querySelector(':scope > i.d-none');
3592
3593    if (the.inputElement.getAttribute('type').toLowerCase() === 'password') {
3594      the.inputElement.setAttribute('type', 'text');
3595    } else {
3596      the.inputElement.setAttribute('type', 'password');
3597    }
3598
3599    visibleIcon.classList.add('d-none');
3600    hiddenIcon.classList.remove('d-none');
3601
3602    the.inputElement.focus();
3603  }
3604
3605  var _reset = function () {
3606    the.score = 0;
3607
3608    _highlight();
3609  }
3610
3611  // Gets current password score
3612  var _getScore = function () {
3613    return the.score;
3614  }
3615
3616  var _destroy = function () {
3617    KTUtil.data(the.element).remove('password-meter');
3618  }
3619
3620  // Construct class
3621  _construct();
3622
3623  ///////////////////////
3624  // ** Public API  ** //
3625  ///////////////////////
3626
3627  // Plugin API
3628  the.check = function () {
3629    return _check();
3630  }
3631
3632  the.getScore = function () {
3633    return _getScore();
3634  }
3635
3636  the.reset = function () {
3637    return _reset();
3638  }
3639
3640  the.destroy = function () {
3641    return _destroy();
3642  }
3643};
3644
3645// Static methods
3646KTPasswordMeter.getInstance = function (element) {
3647  if (element !== null && KTUtil.data(element).has('password-meter')) {
3648    return KTUtil.data(element).get('password-meter');
3649  } else {
3650    return null;
3651  }
3652}
3653
3654// Create instances
3655KTPasswordMeter.createInstances = function (selector = '[data-kt-password-meter]') {
3656  // Get instances
3657  var elements = document.body.querySelectorAll(selector);
3658
3659  if (elements && elements.length > 0) {
3660    for (var i = 0, len = elements.length; i < len; i++) {
3661      // Initialize instances
3662      new KTPasswordMeter(elements[i]);
3663    }
3664  }
3665}
3666
3667// Global initialization
3668KTPasswordMeter.init = function () {
3669  KTPasswordMeter.createInstances();
3670};
3671
3672// Webpack support
3673if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
3674  module.exports = KTPasswordMeter;
3675}
3676"use strict";
3677
3678var KTScrollHandlersInitialized = false;
3679
3680// Class definition
3681var KTScroll = function (element, options) {
3682  ////////////////////////////
3683  // ** Private Variables  ** //
3684  ////////////////////////////
3685  var the = this;
3686
3687  if (!element) {
3688    return;
3689  }
3690
3691  // Default options
3692  var defaultOptions = {
3693    saveState: true
3694  };
3695
3696  ////////////////////////////
3697  // ** Private Methods  ** //
3698  ////////////////////////////
3699
3700  var _construct = function () {
3701    if (KTUtil.data(element).has('scroll')) {
3702      the = KTUtil.data(element).get('scroll');
3703    } else {
3704      _init();
3705    }
3706  }
3707
3708  var _init = function () {
3709    // Variables
3710    the.options = KTUtil.deepExtend({}, defaultOptions, options);
3711
3712    // Elements
3713    the.element = element;
3714    the.id = the.element.getAttribute('id');
3715
3716    // Set initialized
3717    the.element.setAttribute('data-kt-scroll', 'true');
3718
3719    // Update
3720    _update();
3721
3722    // Bind Instance
3723    KTUtil.data(the.element).set('scroll', the);
3724  }
3725
3726  var _setupHeight = function () {
3727    var heightType = _getHeightType();
3728    var height = _getHeight();
3729
3730    // Set height
3731    if (height !== null && height.length > 0) {
3732      KTUtil.css(the.element, heightType, height);
3733    } else {
3734      KTUtil.css(the.element, heightType, '');
3735    }
3736  }
3737
3738  var _setupState = function () {
3739    var namespace = _getStorageNamespace();
3740
3741    if (_getOption('save-state') === true && the.id) {
3742      if (localStorage.getItem(namespace + the.id + 'st')) {
3743        var pos = parseInt(localStorage.getItem(namespace + the.id + 'st'));
3744
3745        if (pos > 0) {
3746          the.element.scroll({
3747            top: pos,
3748            behavior: 'instant'
3749          });
3750        }
3751      }
3752    }
3753  }
3754
3755  var _getStorageNamespace = function (postfix) {
3756    return document.body.hasAttribute("data-kt-name") ? document.body.getAttribute("data-kt-name") + "_" : "";
3757  }
3758
3759  var _setupScrollHandler = function () {
3760    if (_getOption('save-state') === true && the.id) {
3761      the.element.addEventListener('scroll', _scrollHandler);
3762    } else {
3763      the.element.removeEventListener('scroll', _scrollHandler);
3764    }
3765  }
3766
3767  var _destroyScrollHandler = function () {
3768    the.element.removeEventListener('scroll', _scrollHandler);
3769  }
3770
3771  var _resetHeight = function () {
3772    KTUtil.css(the.element, _getHeightType(), '');
3773  }
3774
3775  var _scrollHandler = function () {
3776    var namespace = _getStorageNamespace();
3777    localStorage.setItem(namespace + the.id + 'st', the.element.scrollTop);
3778  }
3779
3780  var _update = function () {
3781    // Activate/deactivate
3782    if (_getOption('activate') === true || the.element.hasAttribute('data-kt-scroll-activate') === false) {
3783      _setupHeight();
3784      _setupStretchHeight();
3785      _setupScrollHandler();
3786      _setupState();
3787    } else {
3788      _resetHeight()
3789      _destroyScrollHandler();
3790    }
3791  }
3792
3793  var _setupStretchHeight = function () {
3794    var stretch = _getOption('stretch');
3795
3796    // Stretch
3797    if (stretch !== null) {
3798      var elements = document.querySelectorAll(stretch);
3799
3800      if (elements && elements.length == 2) {
3801        var element1 = elements[0];
3802        var element2 = elements[1];
3803        var diff = _getElementHeight(element2) - _getElementHeight(element1);
3804
3805        if (diff > 0) {
3806          var height = parseInt(KTUtil.css(the.element, _getHeightType())) + diff;
3807
3808          KTUtil.css(the.element, _getHeightType(), String(height) + 'px');
3809        }
3810      }
3811    }
3812  }
3813
3814  var _getHeight = function () {
3815    var height = _getOption(_getHeightType());
3816
3817    if (height instanceof Function) {
3818      return height.call();
3819    } else if (height !== null && typeof height === 'string' && height.toLowerCase() === 'auto') {
3820      return _getAutoHeight();
3821    } else {
3822      return height;
3823    }
3824  }
3825
3826  var _getAutoHeight = function () {
3827    var height = KTUtil.getViewPort().height;
3828    var dependencies = _getOption('dependencies');
3829    var wrappers = _getOption('wrappers');
3830    var offset = _getOption('offset');
3831
3832    // Spacings
3833    height = height - _getElementSpacing(the.element);
3834
3835    // Height dependencies
3836    //console.log('Q:' + JSON.stringify(dependencies));
3837
3838    if (dependencies !== null) {
3839      var elements = document.querySelectorAll(dependencies);
3840
3841      if (elements && elements.length > 0) {
3842        for (var i = 0, len = elements.length; i < len; i++) {
3843          if (KTUtil.visible(elements[i]) === false) {
3844            continue;
3845          }
3846
3847          height = height - _getElementHeight(elements[i]);
3848        }
3849      }
3850    }
3851
3852    // Wrappers
3853    if (wrappers !== null) {
3854      var elements = document.querySelectorAll(wrappers);
3855      if (elements && elements.length > 0) {
3856        for (var i = 0, len = elements.length; i < len; i++) {
3857          if (KTUtil.visible(elements[i]) === false) {
3858            continue;
3859          }
3860
3861          height = height - _getElementSpacing(elements[i]);
3862        }
3863      }
3864    }
3865
3866    // Custom offset
3867    if (offset !== null && typeof offset !== 'object') {
3868      height = height - parseInt(offset);
3869    }
3870
3871    return String(height) + 'px';
3872  }
3873
3874  var _getElementHeight = function (element) {
3875    var height = 0;
3876
3877    if (element !== null) {
3878      height = height + parseInt(KTUtil.css(element, 'height'));
3879      height = height + parseInt(KTUtil.css(element, 'margin-top'));
3880      height = height + parseInt(KTUtil.css(element, 'margin-bottom'));
3881
3882      if (KTUtil.css(element, 'border-top')) {
3883        height = height + parseInt(KTUtil.css(element, 'border-top'));
3884      }
3885
3886      if (KTUtil.css(element, 'border-bottom')) {
3887        height = height + parseInt(KTUtil.css(element, 'border-bottom'));
3888      }
3889    }
3890
3891    return height;
3892  }
3893
3894  var _getElementSpacing = function (element) {
3895    var spacing = 0;
3896
3897    if (element !== null) {
3898      spacing = spacing + parseInt(KTUtil.css(element, 'margin-top'));
3899      spacing = spacing + parseInt(KTUtil.css(element, 'margin-bottom'));
3900      spacing = spacing + parseInt(KTUtil.css(element, 'padding-top'));
3901      spacing = spacing + parseInt(KTUtil.css(element, 'padding-bottom'));
3902
3903      if (KTUtil.css(element, 'border-top')) {
3904        spacing = spacing + parseInt(KTUtil.css(element, 'border-top'));
3905      }
3906
3907      if (KTUtil.css(element, 'border-bottom')) {
3908        spacing = spacing + parseInt(KTUtil.css(element, 'border-bottom'));
3909      }
3910    }
3911
3912    return spacing;
3913  }
3914
3915  var _getOption = function (name) {
3916    if (the.element.hasAttribute('data-kt-scroll-' + name) === true) {
3917      var attr = the.element.getAttribute('data-kt-scroll-' + name);
3918
3919      var value = KTUtil.getResponsiveValue(attr);
3920
3921      if (value !== null && String(value) === 'true') {
3922        value = true;
3923      } else if (value !== null && String(value) === 'false') {
3924        value = false;
3925      }
3926
3927      return value;
3928    } else {
3929      var optionName = KTUtil.snakeToCamel(name);
3930
3931      if (the.options[optionName]) {
3932        return KTUtil.getResponsiveValue(the.options[optionName]);
3933      } else {
3934        return null;
3935      }
3936    }
3937  }
3938
3939  var _getHeightType = function () {
3940    if (_getOption('height')) {
3941      return 'height';
3942    } if (_getOption('min-height')) {
3943      return 'min-height';
3944    } if (_getOption('max-height')) {
3945      return 'max-height';
3946    }
3947  }
3948
3949  var _destroy = function () {
3950    KTUtil.data(the.element).remove('scroll');
3951  }
3952
3953  // Construct Class
3954  _construct();
3955
3956  ///////////////////////
3957  // ** Public API  ** //
3958  ///////////////////////
3959
3960  the.update = function () {
3961    return _update();
3962  }
3963
3964  the.getHeight = function () {
3965    return _getHeight();
3966  }
3967
3968  the.getElement = function () {
3969    return the.element;
3970  }
3971
3972  the.destroy = function () {
3973    return _destroy();
3974  }
3975};
3976
3977// Static methods
3978KTScroll.getInstance = function (element) {
3979  if (element !== null && KTUtil.data(element).has('scroll')) {
3980    return KTUtil.data(element).get('scroll');
3981  } else {
3982    return null;
3983  }
3984}
3985
3986// Create instances
3987KTScroll.createInstances = function (selector = '[data-kt-scroll="true"]') {
3988  // Initialize Menus
3989  var elements = document.body.querySelectorAll(selector);
3990
3991  if (elements && elements.length > 0) {
3992    for (var i = 0, len = elements.length; i < len; i++) {
3993      new KTScroll(elements[i]);
3994    }
3995  }
3996}
3997
3998// Window resize handling
3999KTScroll.handleResize = function () {
4000  window.addEventListener('resize', function () {
4001    var timer;
4002
4003    KTUtil.throttle(timer, function () {
4004      // Locate and update Offcanvas instances on window resize
4005      var elements = document.body.querySelectorAll('[data-kt-scroll="true"]');
4006
4007      if (elements && elements.length > 0) {
4008        for (var i = 0, len = elements.length; i < len; i++) {
4009          var scroll = KTScroll.getInstance(elements[i]);
4010          if (scroll) {
4011            scroll.update();
4012          }
4013        }
4014      }
4015    }, 200);
4016  });
4017}
4018
4019// Global initialization
4020KTScroll.init = function () {
4021  KTScroll.createInstances();
4022
4023  if (KTScrollHandlersInitialized === false) {
4024    KTScroll.handleResize();
4025
4026    KTScrollHandlersInitialized = true;
4027  }
4028};
4029
4030// Webpack Support
4031if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
4032  module.exports = KTScroll;
4033}
4034
4035"use strict";
4036
4037// Class definition
4038var KTScrolltop = function (element, options) {
4039  ////////////////////////////
4040  // ** Private variables  ** //
4041  ////////////////////////////
4042  var the = this;
4043
4044  if (typeof element === "undefined" || element === null) {
4045    return;
4046  }
4047
4048  // Default options
4049  var defaultOptions = {
4050    offset: 300,
4051    speed: 600
4052  };
4053
4054  ////////////////////////////
4055  // ** Private methods  ** //
4056  ////////////////////////////
4057
4058  var _construct = function () {
4059    if (KTUtil.data(element).has('scrolltop')) {
4060      the = KTUtil.data(element).get('scrolltop');
4061    } else {
4062      _init();
4063    }
4064  }
4065
4066  var _init = function () {
4067    // Variables
4068    the.options = KTUtil.deepExtend({}, defaultOptions, options);
4069    the.uid = KTUtil.getUniqueId('scrolltop');
4070    the.element = element;
4071
4072    // Set initialized
4073    the.element.setAttribute('data-kt-scrolltop', 'true');
4074
4075    // Event Handlers
4076    _handlers();
4077
4078    // Bind Instance
4079    KTUtil.data(the.element).set('scrolltop', the);
4080  }
4081
4082  var _handlers = function () {
4083    var timer;
4084
4085    window.addEventListener('scroll', function () {
4086      KTUtil.throttle(timer, function () {
4087        _scroll();
4088      }, 200);
4089    });
4090
4091    KTUtil.addEvent(the.element, 'click', function (e) {
4092      e.preventDefault();
4093
4094      _go();
4095    });
4096  }
4097
4098  var _scroll = function () {
4099    var offset = parseInt(_getOption('offset'));
4100
4101    var pos = KTUtil.getScrollTop(); // current vertical position
4102
4103    if (pos > offset) {
4104      if (document.body.hasAttribute('data-kt-scrolltop') === false) {
4105        document.body.setAttribute('data-kt-scrolltop', 'on');
4106      }
4107    } else {
4108      if (document.body.hasAttribute('data-kt-scrolltop') === true) {
4109        document.body.removeAttribute('data-kt-scrolltop');
4110      }
4111    }
4112  }
4113
4114  var _go = function () {
4115    var speed = parseInt(_getOption('speed'));
4116
4117    window.scrollTo({ top: 0, behavior: 'smooth' });
4118    //KTUtil.scrollTop(0, speed);
4119  }
4120
4121  var _getOption = function (name) {
4122    if (the.element.hasAttribute('data-kt-scrolltop-' + name) === true) {
4123      var attr = the.element.getAttribute('data-kt-scrolltop-' + name);
4124      var value = KTUtil.getResponsiveValue(attr);
4125
4126      if (value !== null && String(value) === 'true') {
4127        value = true;
4128      } else if (value !== null && String(value) === 'false') {
4129        value = false;
4130      }
4131
4132      return value;
4133    } else {
4134      var optionName = KTUtil.snakeToCamel(name);
4135
4136      if (the.options[optionName]) {
4137        return KTUtil.getResponsiveValue(the.options[optionName]);
4138      } else {
4139        return null;
4140      }
4141    }
4142  }
4143
4144  var _destroy = function () {
4145    KTUtil.data(the.element).remove('scrolltop');
4146  }
4147
4148  // Construct class
4149  _construct();
4150
4151  ///////////////////////
4152  // ** Public API  ** //
4153  ///////////////////////
4154
4155  // Plugin API
4156  the.go = function () {
4157    return _go();
4158  }
4159
4160  the.getElement = function () {
4161    return the.element;
4162  }
4163
4164  the.destroy = function () {
4165    return _destroy();
4166  }
4167};
4168
4169// Static methods
4170KTScrolltop.getInstance = function (element) {
4171  if (element && KTUtil.data(element).has('scrolltop')) {
4172    return KTUtil.data(element).get('scrolltop');
4173  } else {
4174    return null;
4175  }
4176}
4177
4178// Create instances
4179KTScrolltop.createInstances = function (selector = '[data-kt-scrolltop="true"]') {
4180  // Initialize Menus
4181  var elements = document.body.querySelectorAll(selector);
4182
4183  if (elements && elements.length > 0) {
4184    for (var i = 0, len = elements.length; i < len; i++) {
4185      new KTScrolltop(elements[i]);
4186    }
4187  }
4188}
4189
4190// Global initialization
4191KTScrolltop.init = function () {
4192  KTScrolltop.createInstances();
4193};
4194
4195// Webpack support
4196if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
4197  module.exports = KTScrolltop;
4198}
4199
4200"use strict";
4201
4202// Class definition
4203var KTSearch = function (element, options) {
4204  ////////////////////////////
4205  // ** Private variables  ** //
4206  ////////////////////////////
4207  var the = this;
4208
4209  if (!element) {
4210    return;
4211  }
4212
4213  // Default Options
4214  var defaultOptions = {
4215    minLength: 2,  // Miniam text lenght to query search
4216    keypress: true,  // Enable search on keypress 
4217    enter: true,  // Enable search on enter key press
4218    layout: 'menu',  // Use 'menu' or 'inline' layout options to display search results
4219    responsive: null, // Pass integer value or bootstrap compatible breakpoint key(sm,md,lg,xl,xxl) to enable reponsive form mode for device width below the breakpoint value
4220    showOnFocus: true // Always show menu on input focus
4221  };
4222
4223  ////////////////////////////
4224  // ** Private methods  ** //
4225  ////////////////////////////
4226
4227  // Construct
4228  var _construct = function () {
4229    if (KTUtil.data(element).has('search') === true) {
4230      the = KTUtil.data(element).get('search');
4231    } else {
4232      _init();
4233    }
4234  }
4235
4236  // Init
4237  var _init = function () {
4238    // Variables
4239    the.options = KTUtil.deepExtend({}, defaultOptions, options);
4240    the.processing = false;
4241
4242    // Elements
4243    the.element = element;
4244    the.contentElement = _getElement('content');
4245    the.formElement = _getElement('form');
4246    the.inputElement = _getElement('input');
4247    the.spinnerElement = _getElement('spinner');
4248    the.clearElement = _getElement('clear');
4249    the.toggleElement = _getElement('toggle');
4250    the.submitElement = _getElement('submit');
4251    the.toolbarElement = _getElement('toolbar');
4252    the.minLength = parseInt(_getOption('min-length'));
4253
4254    the.resultsElement = _getElement('results');
4255    the.suggestionElement = _getElement('suggestion');
4256    the.emptyElement = _getElement('empty');
4257
4258    // Set initialized
4259    the.element.setAttribute('data-kt-search', 'true');
4260
4261    // Layout
4262    the.layout = _getOption('layout');
4263
4264    // Menu
4265    if (the.layout === 'menu') {
4266      the.menuObject = new KTMenu(the.contentElement);
4267    } else {
4268      the.menuObject = null;
4269    }
4270
4271    // Update
4272    _update();
4273
4274    // Event Handlers
4275    _handlers();
4276
4277    // Bind Instance
4278    KTUtil.data(the.element).set('search', the);
4279  }
4280
4281  // Handlera
4282  var _handlers = function () {
4283    // Focus
4284    the.inputElement.addEventListener('focus', _focus);
4285
4286    // Blur
4287    the.inputElement.addEventListener('blur', _blur);
4288
4289    // Keypress
4290    if (_getOption('keypress') === true) {
4291      the.inputElement.addEventListener('input', _input);
4292    }
4293
4294    // Submit
4295    if (the.submitElement) {
4296      the.submitElement.addEventListener('click', _search);
4297    }
4298
4299    // Enter
4300    if (_getOption('enter') === true) {
4301      the.inputElement.addEventListener('keypress', _enter);
4302    }
4303
4304    // Clear 
4305    if (the.clearElement) {
4306      the.clearElement.addEventListener('click', _clear);
4307    }
4308
4309    // Menu
4310    if (the.menuObject) {
4311      // Toggle menu
4312      if (the.toggleElement) {
4313        the.toggleElement.addEventListener('click', _show);
4314
4315        the.menuObject.on('kt.menu.dropdown.show', function (item) {
4316          if (KTUtil.visible(the.toggleElement)) {
4317            the.toggleElement.classList.add('active');
4318            the.toggleElement.classList.add('show');
4319          }
4320        });
4321
4322        the.menuObject.on('kt.menu.dropdown.hide', function (item) {
4323          if (KTUtil.visible(the.toggleElement)) {
4324            the.toggleElement.classList.remove('active');
4325            the.toggleElement.classList.remove('show');
4326          }
4327        });
4328      }
4329
4330      the.menuObject.on('kt.menu.dropdown.shown', function () {
4331        the.inputElement.focus();
4332      });
4333    }
4334
4335    // Window resize handling
4336    window.addEventListener('resize', function () {
4337      var timer;
4338
4339      KTUtil.throttle(timer, function () {
4340        _update();
4341      }, 200);
4342    });
4343  }
4344
4345  // Focus
4346  var _focus = function () {
4347    the.element.classList.add('focus');
4348
4349    if (_getOption('show-on-focus') === true || the.inputElement.value.length >= the.minLength) {
4350      _show();
4351    }
4352  }
4353
4354  // Blur
4355  var _blur = function () {
4356    the.element.classList.remove('focus');
4357  }
4358
4359  // Enter 
4360  var _enter = function (e) {
4361    var key = e.charCode || e.keyCode || 0;
4362
4363    if (key == 13) {
4364      e.preventDefault();
4365
4366      _search();
4367    }
4368  }
4369
4370  // Input
4371  var _input = function () {
4372    if (_getOption('min-length')) {
4373      if (the.inputElement.value.length >= the.minLength) {
4374        _search();
4375      } else if (the.inputElement.value.length === 0) {
4376        _clear();
4377      }
4378    }
4379  }
4380
4381  // Search
4382  var _search = function () {
4383    if (the.processing === false) {
4384      // Show search spinner
4385      if (the.spinnerElement) {
4386        the.spinnerElement.classList.remove("d-none");
4387      }
4388
4389      // Hide search clear button
4390      if (the.clearElement) {
4391        the.clearElement.classList.add("d-none");
4392      }
4393
4394      // Hide search toolbar
4395      if (the.toolbarElement && the.formElement.contains(the.toolbarElement)) {
4396        the.toolbarElement.classList.add("d-none");
4397      }
4398
4399      // Focus input
4400      the.inputElement.focus();
4401
4402      the.processing = true;
4403      KTEventHandler.trigger(the.element, 'kt.search.process', the);
4404    }
4405  }
4406
4407  // Complete
4408  var _complete = function () {
4409    if (the.spinnerElement) {
4410      the.spinnerElement.classList.add("d-none");
4411    }
4412
4413    // Show search toolbar
4414    if (the.clearElement) {
4415      the.clearElement.classList.remove("d-none");
4416    }
4417
4418    if (the.inputElement.value.length === 0) {
4419      _clear();
4420    }
4421
4422    // Focus input
4423    the.inputElement.focus();
4424
4425    _show();
4426
4427    the.processing = false;
4428  }
4429
4430  // Clear
4431  var _clear = function () {
4432    if (KTEventHandler.trigger(the.element, 'kt.search.clear', the) === false) {
4433      return;
4434    }
4435
4436    // Clear and focus input
4437    the.inputElement.value = "";
4438    the.inputElement.focus();
4439
4440    // Hide clear icon
4441    if (the.clearElement) {
4442      the.clearElement.classList.add("d-none");
4443    }
4444
4445    // Show search toolbar
4446    if (the.toolbarElement && the.formElement.contains(the.toolbarElement)) {
4447      the.toolbarElement.classList.remove("d-none");
4448    }
4449
4450    // Hide menu
4451    if (_getOption('show-on-focus') === false) {
4452      _hide();
4453    }
4454
4455    KTEventHandler.trigger(the.element, 'kt.search.cleared', the);
4456  }
4457
4458  // Update
4459  var _update = function () {
4460    // Handle responsive form
4461    if (the.layout === 'menu') {
4462      var responsiveFormMode = _getResponsiveFormMode();
4463
4464      if (responsiveFormMode === 'on' && the.contentElement.contains(the.formElement) === false) {
4465        the.contentElement.prepend(the.formElement);
4466        the.formElement.classList.remove('d-none');
4467      } else if (responsiveFormMode === 'off' && the.contentElement.contains(the.formElement) === true) {
4468        the.element.prepend(the.formElement);
4469        the.formElement.classList.add('d-none');
4470      }
4471    }
4472  }
4473
4474  // Show menu
4475  var _show = function () {
4476    if (the.menuObject) {
4477      _update();
4478
4479      the.menuObject.show(the.element);
4480    }
4481  }
4482
4483  // Hide menu
4484  var _hide = function () {
4485    if (the.menuObject) {
4486      _update();
4487
4488      the.menuObject.hide(the.element);
4489    }
4490  }
4491
4492  // Get option
4493  var _getOption = function (name) {
4494    if (the.element.hasAttribute('data-kt-search-' + name) === true) {
4495      var attr = the.element.getAttribute('data-kt-search-' + name);
4496      var value = KTUtil.getResponsiveValue(attr);
4497
4498      if (value !== null && String(value) === 'true') {
4499        value = true;
4500      } else if (value !== null && String(value) === 'false') {
4501        value = false;
4502      }
4503
4504      return value;
4505    } else {
4506      var optionName = KTUtil.snakeToCamel(name);
4507
4508      if (the.options[optionName]) {
4509        return KTUtil.getResponsiveValue(the.options[optionName]);
4510      } else {
4511        return null;
4512      }
4513    }
4514  }
4515
4516  // Get element
4517  var _getElement = function (name) {
4518    return the.element.querySelector('[data-kt-search-element="' + name + '"]');
4519  }
4520
4521  // Check if responsive form mode is enabled
4522  var _getResponsiveFormMode = function () {
4523    var responsive = _getOption('responsive');
4524    var width = KTUtil.getViewPort().width;
4525
4526    if (!responsive) {
4527      return null;
4528    }
4529
4530    var breakpoint = KTUtil.getBreakpoint(responsive);
4531
4532    if (!breakpoint) {
4533      breakpoint = parseInt(responsive);
4534    }
4535
4536    if (width < breakpoint) {
4537      return "on";
4538    } else {
4539      return "off";
4540    }
4541  }
4542
4543  var _destroy = function () {
4544    KTUtil.data(the.element).remove('search');
4545  }
4546
4547  // Construct class
4548  _construct();
4549
4550  ///////////////////////
4551  // ** Public API  ** //
4552  ///////////////////////
4553
4554  // Plugin API
4555  the.show = function () {
4556    return _show();
4557  }
4558
4559  the.hide = function () {
4560    return _hide();
4561  }
4562
4563  the.update = function () {
4564    return _update();
4565  }
4566
4567  the.search = function () {
4568    return _search();
4569  }
4570
4571  the.complete = function () {
4572    return _complete();
4573  }
4574
4575  the.clear = function () {
4576    return _clear();
4577  }
4578
4579  the.isProcessing = function () {
4580    return the.processing;
4581  }
4582
4583  the.getQuery = function () {
4584    return the.inputElement.value;
4585  }
4586
4587  the.getMenu = function () {
4588    return the.menuObject;
4589  }
4590
4591  the.getFormElement = function () {
4592    return the.formElement;
4593  }
4594
4595  the.getInputElement = function () {
4596    return the.inputElement;
4597  }
4598
4599  the.getContentElement = function () {
4600    return the.contentElement;
4601  }
4602
4603  the.getElement = function () {
4604    return the.element;
4605  }
4606
4607  the.destroy = function () {
4608    return _destroy();
4609  }
4610
4611  // Event API
4612  the.on = function (name, handler) {
4613    return KTEventHandler.on(the.element, name, handler);
4614  }
4615
4616  the.one = function (name, handler) {
4617    return KTEventHandler.one(the.element, name, handler);
4618  }
4619
4620  the.off = function (name, handlerId) {
4621    return KTEventHandler.off(the.element, name, handlerId);
4622  }
4623};
4624
4625// Static methods
4626KTSearch.getInstance = function (element) {
4627  if (element !== null && KTUtil.data(element).has('search')) {
4628    return KTUtil.data(element).get('search');
4629  } else {
4630    return null;
4631  }
4632}
4633
4634// Webpack support
4635if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
4636  module.exports = KTSearch;
4637}
4638
4639"use strict";
4640
4641// Class definition
4642var KTStepper = function (element, options) {
4643  //////////////////////////////
4644  // ** Private variables  ** //
4645  //////////////////////////////
4646  var the = this;
4647
4648  if (typeof element === "undefined" || element === null) {
4649    return;
4650  }
4651
4652  // Default Options
4653  var defaultOptions = {
4654    startIndex: 1,
4655    animation: false,
4656    animationSpeed: '0.3s',
4657    animationNextClass: 'animate__animated animate__slideInRight animate__fast',
4658    animationPreviousClass: 'animate__animated animate__slideInLeft animate__fast'
4659  };
4660
4661  ////////////////////////////
4662  // ** Private methods  ** //
4663  ////////////////////////////
4664
4665  var _construct = function () {
4666    if (KTUtil.data(element).has('stepper') === true) {
4667      the = KTUtil.data(element).get('stepper');
4668    } else {
4669      _init();
4670    }
4671  }
4672
4673  var _init = function () {
4674    the.options = KTUtil.deepExtend({}, defaultOptions, options);
4675    the.uid = KTUtil.getUniqueId('stepper');
4676
4677    the.element = element;
4678
4679    // Set initialized
4680    the.element.setAttribute('data-kt-stepper', 'true');
4681
4682    // Elements
4683    the.steps = KTUtil.findAll(the.element, '[data-kt-stepper-element="nav"]');
4684    the.btnNext = KTUtil.find(the.element, '[data-kt-stepper-action="next"]');
4685    the.btnPrevious = KTUtil.find(the.element, '[data-kt-stepper-action="previous"]');
4686    the.btnSubmit = KTUtil.find(the.element, '[data-kt-stepper-action="submit"]');
4687
4688    // Variables
4689    the.totalStepsNumber = the.steps.length;
4690    the.passedStepIndex = 0;
4691    the.currentStepIndex = 1;
4692    the.clickedStepIndex = 0;
4693
4694    // Set Current Step
4695    if (the.options.startIndex > 1) {
4696      _goTo(the.options.startIndex);
4697    }
4698
4699    // Event listeners
4700    the.nextListener = function (e) {
4701      e.preventDefault();
4702
4703      KTEventHandler.trigger(the.element, 'kt.stepper.next', the);
4704    };
4705
4706    the.previousListener = function (e) {
4707      e.preventDefault();
4708
4709      KTEventHandler.trigger(the.element, 'kt.stepper.previous', the);
4710    };
4711
4712    if (the.element.getAttribute("data-kt-stepper-submit") === "true") {
4713      the.submitListener = function (e) {
4714        e.preventDefault();
4715
4716        KTEventHandler.trigger(the.element, 'kt.stepper.submit', the);
4717      };
4718    }
4719
4720    the.stepListener = function (e) {
4721      e.preventDefault();
4722
4723      if (the.steps && the.steps.length > 0) {
4724        for (var i = 0, len = the.steps.length; i < len; i++) {
4725          if (the.steps[i] === this) {
4726            the.clickedStepIndex = i + 1;
4727
4728            KTEventHandler.trigger(the.element, 'kt.stepper.click', the);
4729
4730            return;
4731          }
4732        }
4733      }
4734    };
4735
4736    // Event Handlers
4737    KTUtil.addEvent(the.btnNext, 'click', the.nextListener);
4738
4739    KTUtil.addEvent(the.btnPrevious, 'click', the.previousListener);
4740
4741    KTUtil.addEvent(the.btnSubmit, 'click', the.submitListener);
4742
4743    the.stepListenerId = KTUtil.on(the.element, '[data-kt-stepper-action="step"]', 'click', the.stepListener);
4744
4745    // Bind Instance
4746    KTUtil.data(the.element).set('stepper', the);
4747  }
4748
4749  var _goTo = function (index) {
4750    // Trigger "change" event
4751    KTEventHandler.trigger(the.element, 'kt.stepper.change', the);
4752
4753    // Skip if this step is already shown
4754    if (index === the.currentStepIndex || index > the.totalStepsNumber || index < 0) {
4755      return;
4756    }
4757
4758    // Validate step number
4759    index = parseInt(index);
4760
4761    // Set current step
4762    the.passedStepIndex = the.currentStepIndex;
4763    the.currentStepIndex = index;
4764
4765    // Refresh elements
4766    _refreshUI();
4767
4768    // Trigger "changed" event
4769    KTEventHandler.trigger(the.element, 'kt.stepper.changed', the);
4770
4771    return the;
4772  }
4773
4774  var _goNext = function () {
4775    return _goTo(_getNextStepIndex());
4776  }
4777
4778  var _goPrevious = function () {
4779    return _goTo(_getPreviousStepIndex());
4780  }
4781
4782  var _goLast = function () {
4783    return _goTo(_getLastStepIndex());
4784  }
4785
4786  var _goFirst = function () {
4787    return _goTo(_getFirstStepIndex());
4788  }
4789
4790  var _refreshUI = function () {
4791    var state = '';
4792
4793    if (_isLastStep()) {
4794      state = 'last';
4795    } else if (_isFirstStep()) {
4796      state = 'first';
4797    } else {
4798      state = 'between';
4799    }
4800
4801    // Set state class
4802    KTUtil.removeClass(the.element, 'last');
4803    KTUtil.removeClass(the.element, 'first');
4804    KTUtil.removeClass(the.element, 'between');
4805
4806    KTUtil.addClass(the.element, state);
4807
4808    // Step Items
4809    var elements = KTUtil.findAll(the.element, '[data-kt-stepper-element="nav"], [data-kt-stepper-element="content"], [data-kt-stepper-element="info"]');
4810
4811    if (elements && elements.length > 0) {
4812      for (var i = 0, len = elements.length; i < len; i++) {
4813        var element = elements[i];
4814        var index = KTUtil.index(element) + 1;
4815
4816        KTUtil.removeClass(element, 'current');
4817        KTUtil.removeClass(element, 'completed');
4818        KTUtil.removeClass(element, 'pending');
4819
4820        if (index == the.currentStepIndex) {
4821          KTUtil.addClass(element, 'current');
4822
4823          if (the.options.animation !== false && element.getAttribute('data-kt-stepper-element') == 'content') {
4824            KTUtil.css(element, 'animationDuration', the.options.animationSpeed);
4825
4826            var animation = _getStepDirection(the.passedStepIndex) === 'previous' ? the.options.animationPreviousClass : the.options.animationNextClass;
4827            KTUtil.animateClass(element, animation);
4828          }
4829        } else {
4830          if (index < the.currentStepIndex) {
4831            KTUtil.addClass(element, 'completed');
4832          } else {
4833            KTUtil.addClass(element, 'pending');
4834          }
4835        }
4836      }
4837    }
4838  }
4839
4840  var _isLastStep = function () {
4841    return the.currentStepIndex === the.totalStepsNumber;
4842  }
4843
4844  var _isFirstStep = function () {
4845    return the.currentStepIndex === 1;
4846  }
4847
4848  var _isBetweenStep = function () {
4849    return _isLastStep() === false && _isFirstStep() === false;
4850  }
4851
4852  var _getNextStepIndex = function () {
4853    if (the.totalStepsNumber >= (the.currentStepIndex + 1)) {
4854      return the.currentStepIndex + 1;
4855    } else {
4856      return the.totalStepsNumber;
4857    }
4858  }
4859
4860  var _getPreviousStepIndex = function () {
4861    if ((the.currentStepIndex - 1) > 1) {
4862      return the.currentStepIndex - 1;
4863    } else {
4864      return 1;
4865    }
4866  }
4867
4868  var _getFirstStepIndex = function () {
4869    return 1;
4870  }
4871
4872  var _getLastStepIndex = function () {
4873    return the.totalStepsNumber;
4874  }
4875
4876  var _getTotalStepsNumber = function () {
4877    return the.totalStepsNumber;
4878  }
4879
4880  var _getStepDirection = function (index) {
4881    if (index > the.currentStepIndex) {
4882      return 'next';
4883    } else {
4884      return 'previous';
4885    }
4886  }
4887
4888  var _getStepContent = function (index) {
4889    var content = KTUtil.findAll(the.element, '[data-kt-stepper-element="content"]');
4890
4891    if (content[index - 1]) {
4892      return content[index - 1];
4893    } else {
4894      return false;
4895    }
4896  }
4897
4898  var _destroy = function () {
4899    // Event Handlers
4900    KTUtil.removeEvent(the.btnNext, 'click', the.nextListener);
4901
4902    KTUtil.removeEvent(the.btnPrevious, 'click', the.previousListener);
4903
4904    KTUtil.off(the.element, 'click', the.stepListenerId);
4905
4906    KTUtil.data(the.element).remove('stepper');
4907  }
4908
4909  // Construct Class
4910  _construct();
4911
4912  ///////////////////////
4913  // ** Public API  ** //
4914  ///////////////////////
4915
4916  // Plugin API
4917  the.getElement = function (index) {
4918    return the.element;
4919  }
4920
4921  the.goTo = function (index) {
4922    return _goTo(index);
4923  }
4924
4925  the.goPrevious = function () {
4926    return _goPrevious();
4927  }
4928
4929  the.goNext = function () {
4930    return _goNext();
4931  }
4932
4933  the.goFirst = function () {
4934    return _goFirst();
4935  }
4936
4937  the.goLast = function () {
4938    return _goLast();
4939  }
4940
4941  the.getCurrentStepIndex = function () {
4942    return the.currentStepIndex;
4943  }
4944
4945  the.getNextStepIndex = function () {
4946    return _getNextStepIndex();
4947  }
4948
4949  the.getPassedStepIndex = function () {
4950    return the.passedStepIndex;
4951  }
4952
4953  the.getClickedStepIndex = function () {
4954    return the.clickedStepIndex;
4955  }
4956
4957  the.getPreviousStepIndex = function () {
4958    return _getPreviousStepIndex();
4959  }
4960
4961  the.destroy = function () {
4962    return _destroy();
4963  }
4964
4965  // Event API
4966  the.on = function (name, handler) {
4967    return KTEventHandler.on(the.element, name, handler);
4968  }
4969
4970  the.one = function (name, handler) {
4971    return KTEventHandler.one(the.element, name, handler);
4972  }
4973
4974  the.off = function (name, handlerId) {
4975    return KTEventHandler.off(the.element, name, handlerId);
4976  }
4977
4978  the.trigger = function (name, event) {
4979    return KTEventHandler.trigger(the.element, name, event, the, event);
4980  }
4981};
4982
4983// Static methods
4984KTStepper.getInstance = function (element) {
4985  if (element !== null && KTUtil.data(element).has('stepper')) {
4986    return KTUtil.data(element).get('stepper');
4987  } else {
4988    return null;
4989  }
4990}
4991
4992// Webpack support
4993if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
4994  module.exports = KTStepper;
4995}
4996
4997"use strict";
4998
4999var KTStickyHandlersInitialized = false;
5000
5001// Class definition
5002var KTSticky = function (element, options) {
5003  ////////////////////////////
5004  // ** Private Variables  ** //
5005  ////////////////////////////
5006  var the = this;
5007
5008  if (typeof element === "undefined" || element === null) {
5009    return;
5010  }
5011
5012  // Default Options
5013  var defaultOptions = {
5014    offset: 200,
5015    reverse: false,
5016    release: null,
5017    animation: true,
5018    animationSpeed: '0.3s',
5019    animationClass: 'animation-slide-in-down'
5020  };
5021  ////////////////////////////
5022  // ** Private Methods  ** //
5023  ////////////////////////////
5024
5025  var _construct = function () {
5026    if (KTUtil.data(element).has('sticky') === true) {
5027      the = KTUtil.data(element).get('sticky');
5028    } else {
5029      _init();
5030    }
5031  }
5032
5033  var _init = function () {
5034    the.element = element;
5035    the.options = KTUtil.deepExtend({}, defaultOptions, options);
5036    the.uid = KTUtil.getUniqueId('sticky');
5037    the.name = the.element.getAttribute('data-kt-sticky-name');
5038    the.attributeName = 'data-kt-sticky-' + the.name;
5039    the.attributeName2 = 'data-kt-' + the.name;
5040    the.eventTriggerState = true;
5041    the.lastScrollTop = 0;
5042    the.scrollHandler;
5043
5044    // Set initialized
5045    the.element.setAttribute('data-kt-sticky', 'true');
5046
5047    // Event Handlers
5048    window.addEventListener('scroll', _scroll);
5049
5050    // Initial Launch
5051    _scroll();
5052
5053    // Bind Instance
5054    KTUtil.data(the.element).set('sticky', the);
5055  }
5056
5057  var _scroll = function (e) {
5058    var offset = _getOption('offset');
5059    var release = _getOption('release');
5060    var reverse = _getOption('reverse');
5061    var st;
5062    var attrName;
5063    var diff;
5064
5065    // Exit if false
5066    if (offset === false) {
5067      _disable();
5068      return;
5069    }
5070
5071    offset = parseInt(offset);
5072    release = release ? document.querySelector(release) : null;
5073
5074    st = KTUtil.getScrollTop();
5075    diff = document.documentElement.scrollHeight - window.innerHeight - KTUtil.getScrollTop();
5076
5077    var proceed = (!release || (release.offsetTop - release.clientHeight) > st);
5078
5079    if (reverse === true) {  // Release on reverse scroll mode
5080      if (st > offset && proceed) {
5081        if (document.body.hasAttribute(the.attributeName) === false) {
5082
5083          if (_enable() === false) {
5084            return;
5085          }
5086
5087          document.body.setAttribute(the.attributeName, 'on');
5088          document.body.setAttribute(the.attributeName2, 'on');
5089          the.element.setAttribute("data-kt-sticky-enabled", "true");
5090        }
5091
5092        if (the.eventTriggerState === true) {
5093          KTEventHandler.trigger(the.element, 'kt.sticky.on', the);
5094          KTEventHandler.trigger(the.element, 'kt.sticky.change', the);
5095
5096          the.eventTriggerState = false;
5097        }
5098      } else { // Back scroll mode
5099        if (document.body.hasAttribute(the.attributeName) === true) {
5100          _disable();
5101          document.body.removeAttribute(the.attributeName);
5102          document.body.removeAttribute(the.attributeName2);
5103          the.element.removeAttribute("data-kt-sticky-enabled");
5104        }
5105
5106        if (the.eventTriggerState === false) {
5107          KTEventHandler.trigger(the.element, 'kt.sticky.off', the);
5108          KTEventHandler.trigger(the.element, 'kt.sticky.change', the);
5109          the.eventTriggerState = true;
5110        }
5111      }
5112
5113      the.lastScrollTop = st;
5114    } else { // Classic scroll mode
5115      if (st > offset && proceed) {
5116        if (document.body.hasAttribute(the.attributeName) === false) {
5117
5118          if (_enable() === false) {
5119            return;
5120          }
5121
5122          document.body.setAttribute(the.attributeName, 'on');
5123          document.body.setAttribute(the.attributeName2, 'on');
5124          the.element.setAttribute("data-kt-sticky-enabled", "true");
5125        }
5126
5127        if (the.eventTriggerState === true) {
5128          KTEventHandler.trigger(the.element, 'kt.sticky.on', the);
5129          KTEventHandler.trigger(the.element, 'kt.sticky.change', the);
5130          the.eventTriggerState = false;
5131        }
5132      } else { // back scroll mode
5133        if (document.body.hasAttribute(the.attributeName) === true) {
5134          _disable();
5135          document.body.removeAttribute(the.attributeName);
5136          document.body.removeAttribute(the.attributeName2);
5137          the.element.removeAttribute("data-kt-sticky-enabled");
5138        }
5139
5140        if (the.eventTriggerState === false) {
5141          KTEventHandler.trigger(the.element, 'kt.sticky.off', the);
5142          KTEventHandler.trigger(the.element, 'kt.sticky.change', the);
5143          the.eventTriggerState = true;
5144        }
5145      }
5146    }
5147
5148    if (release) {
5149      if (release.offsetTop - release.clientHeight > st) {
5150        the.element.setAttribute('data-kt-sticky-released', 'true');
5151      } else {
5152        the.element.removeAttribute('data-kt-sticky-released');
5153      }
5154    }
5155  }
5156
5157  var _enable = function (update) {
5158    var top = _getOption('top');
5159    top = top ? parseInt(top) : 0;
5160
5161    var left = _getOption('left');
5162    var right = _getOption('right');
5163    var width = _getOption('width');
5164    var zindex = _getOption('zindex');
5165    var dependencies = _getOption('dependencies');
5166    var classes = _getOption('class');
5167
5168    var height = _calculateHeight();
5169    var heightOffset = _getOption('height-offset');
5170    heightOffset = heightOffset ? parseInt(heightOffset) : 0;
5171
5172    if (height + heightOffset + top > KTUtil.getViewPort().height) {
5173      return false;
5174    }
5175
5176    if (update !== true && _getOption('animation') === true) {
5177      KTUtil.css(the.element, 'animationDuration', _getOption('animationSpeed'));
5178      KTUtil.animateClass(the.element, 'animation ' + _getOption('animationClass'));
5179    }
5180
5181    if (classes !== null) {
5182      KTUtil.addClass(the.element, classes);
5183    }
5184
5185    if (zindex !== null) {
5186      KTUtil.css(the.element, 'z-index', zindex);
5187      KTUtil.css(the.element, 'position', 'fixed');
5188    }
5189
5190    if (top >= 0) {
5191      KTUtil.css(the.element, 'top', String(top) + 'px');
5192    }
5193
5194    if (width !== null) {
5195      if (width['target']) {
5196        var targetElement = document.querySelector(width['target']);
5197        if (targetElement) {
5198          width = KTUtil.css(targetElement, 'width');
5199        }
5200      }
5201
5202      KTUtil.css(the.element, 'width', width);
5203    }
5204
5205    if (left !== null) {
5206      if (String(left).toLowerCase() === 'auto') {
5207        var offsetLeft = KTUtil.offset(the.element).left;
5208
5209        if (offsetLeft >= 0) {
5210          KTUtil.css(the.element, 'left', String(offsetLeft) + 'px');
5211        }
5212      } else {
5213        KTUtil.css(the.element, 'left', left);
5214      }
5215    }
5216
5217    if (right !== null) {
5218      KTUtil.css(the.element, 'right', right);
5219    }
5220
5221    // Height dependencies
5222    if (dependencies !== null) {
5223      var dependencyElements = document.querySelectorAll(dependencies);
5224
5225      if (dependencyElements && dependencyElements.length > 0) {
5226        for (var i = 0, len = dependencyElements.length; i < len; i++) {
5227          KTUtil.css(dependencyElements[i], 'padding-top', String(height) + 'px');
5228        }
5229      }
5230    }
5231  }
5232
5233  var _disable = function () {
5234    KTUtil.css(the.element, 'top', '');
5235    KTUtil.css(the.element, 'width', '');
5236    KTUtil.css(the.element, 'left', '');
5237    KTUtil.css(the.element, 'right', '');
5238    KTUtil.css(the.element, 'z-index', '');
5239    KTUtil.css(the.element, 'position', '');
5240
5241    var dependencies = _getOption('dependencies');
5242    var classes = _getOption('class');
5243
5244    if (classes !== null) {
5245      KTUtil.removeClass(the.element, classes);
5246    }
5247
5248    // Height dependencies
5249    if (dependencies !== null) {
5250      var dependencyElements = document.querySelectorAll(dependencies);
5251
5252      if (dependencyElements && dependencyElements.length > 0) {
5253        for (var i = 0, len = dependencyElements.length; i < len; i++) {
5254          KTUtil.css(dependencyElements[i], 'padding-top', '');
5255        }
5256      }
5257    }
5258  }
5259
5260  var _check = function () {
5261
5262  }
5263
5264  var _calculateHeight = function () {
5265    var height = parseFloat(KTUtil.css(the.element, 'height'));
5266
5267    height = height + parseFloat(KTUtil.css(the.element, 'margin-top'));
5268    height = height + parseFloat(KTUtil.css(the.element, 'margin-bottom'));
5269
5270    if (KTUtil.css(element, 'border-top')) {
5271      height = height + parseFloat(KTUtil.css(the.element, 'border-top'));
5272    }
5273
5274    if (KTUtil.css(element, 'border-bottom')) {
5275      height = height + parseFloat(KTUtil.css(the.element, 'border-bottom'));
5276    }
5277
5278    return height;
5279  }
5280
5281  var _getOption = function (name) {
5282    if (the.element.hasAttribute('data-kt-sticky-' + name) === true) {
5283      var attr = the.element.getAttribute('data-kt-sticky-' + name);
5284      var value = KTUtil.getResponsiveValue(attr);
5285
5286      if (value !== null && String(value) === 'true') {
5287        value = true;
5288      } else if (value !== null && String(value) === 'false') {
5289        value = false;
5290      }
5291
5292      return value;
5293    } else {
5294      var optionName = KTUtil.snakeToCamel(name);
5295
5296      if (the.options[optionName]) {
5297        return KTUtil.getResponsiveValue(the.options[optionName]);
5298      } else {
5299        return null;
5300      }
5301    }
5302  }
5303
5304  var _destroy = function () {
5305    window.removeEventListener('scroll', _scroll);
5306    KTUtil.data(the.element).remove('sticky');
5307  }
5308
5309  // Construct Class
5310  _construct();
5311
5312  ///////////////////////
5313  // ** Public API  ** //
5314  ///////////////////////
5315
5316  // Methods
5317  the.update = function () {
5318    if (document.body.hasAttribute(the.attributeName) === true) {
5319      _disable();
5320      document.body.removeAttribute(the.attributeName);
5321      document.body.removeAttribute(the.attributeName2);
5322      _enable(true);
5323      document.body.setAttribute(the.attributeName, 'on');
5324      document.body.setAttribute(the.attributeName2, 'on');
5325    }
5326  }
5327
5328  the.destroy = function () {
5329    return _destroy();
5330  }
5331
5332  // Event API
5333  the.on = function (name, handler) {
5334    return KTEventHandler.on(the.element, name, handler);
5335  }
5336
5337  the.one = function (name, handler) {
5338    return KTEventHandler.one(the.element, name, handler);
5339  }
5340
5341  the.off = function (name, handlerId) {
5342    return KTEventHandler.off(the.element, name, handlerId);
5343  }
5344
5345  the.trigger = function (name, event) {
5346    return KTEventHandler.trigger(the.element, name, event, the, event);
5347  }
5348};
5349
5350// Static methods
5351KTSticky.getInstance = function (element) {
5352  if (element !== null && KTUtil.data(element).has('sticky')) {
5353    return KTUtil.data(element).get('sticky');
5354  } else {
5355    return null;
5356  }
5357}
5358
5359// Create instances
5360KTSticky.createInstances = function (selector = '[data-kt-sticky="true"]') {
5361  // Initialize Menus
5362  var elements = document.body.querySelectorAll(selector);
5363  var sticky;
5364
5365  if (elements && elements.length > 0) {
5366    for (var i = 0, len = elements.length; i < len; i++) {
5367      sticky = new KTSticky(elements[i]);
5368    }
5369  }
5370}
5371
5372// Window resize handler
5373KTSticky.handleResize = function () {
5374  window.addEventListener('resize', function () {
5375    var timer;
5376
5377    KTUtil.throttle(timer, function () {
5378      // Locate and update Offcanvas instances on window resize
5379      var elements = document.body.querySelectorAll('[data-kt-sticky="true"]');
5380
5381      if (elements && elements.length > 0) {
5382        for (var i = 0, len = elements.length; i < len; i++) {
5383          var sticky = KTSticky.getInstance(elements[i]);
5384          if (sticky) {
5385            sticky.update();
5386          }
5387        }
5388      }
5389    }, 200);
5390  });
5391}
5392
5393// Global initialization
5394KTSticky.init = function () {
5395  KTSticky.createInstances();
5396
5397  if (KTStickyHandlersInitialized === false) {
5398    KTSticky.handleResize();
5399    KTStickyHandlersInitialized = true;
5400  }
5401};
5402
5403// Webpack support
5404if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
5405  module.exports = KTSticky;
5406}
5407
5408"use strict";
5409
5410var KTSwapperHandlersInitialized = false;
5411
5412// Class definition
5413var KTSwapper = function (element, options) {
5414  ////////////////////////////
5415  // ** Private Variables  ** //
5416  ////////////////////////////
5417  var the = this;
5418
5419  if (typeof element === "undefined" || element === null) {
5420    return;
5421  }
5422
5423  // Default Options
5424  var defaultOptions = {
5425    mode: 'append'
5426  };
5427
5428  ////////////////////////////
5429  // ** Private Methods  ** //
5430  ////////////////////////////
5431
5432  var _construct = function () {
5433    if (KTUtil.data(element).has('swapper') === true) {
5434      the = KTUtil.data(element).get('swapper');
5435    } else {
5436      _init();
5437    }
5438  }
5439
5440  var _init = function () {
5441    the.element = element;
5442    the.options = KTUtil.deepExtend({}, defaultOptions, options);
5443
5444    // Set initialized
5445    the.element.setAttribute('data-kt-swapper', 'true');
5446
5447    // Initial update
5448    _update();
5449
5450    // Bind Instance
5451    KTUtil.data(the.element).set('swapper', the);
5452  }
5453
5454  var _update = function (e) {
5455    var parentSelector = _getOption('parent');
5456
5457    var mode = _getOption('mode');
5458    var parentElement = parentSelector ? document.querySelector(parentSelector) : null;
5459
5460
5461    if (parentElement && element.parentNode !== parentElement) {
5462      if (mode === 'prepend') {
5463        parentElement.prepend(element);
5464      } else if (mode === 'append') {
5465        parentElement.append(element);
5466      }
5467    }
5468  }
5469
5470  var _getOption = function (name) {
5471    if (the.element.hasAttribute('data-kt-swapper-' + name) === true) {
5472      var attr = the.element.getAttribute('data-kt-swapper-' + name);
5473      var value = KTUtil.getResponsiveValue(attr);
5474
5475      if (value !== null && String(value) === 'true') {
5476        value = true;
5477      } else if (value !== null && String(value) === 'false') {
5478        value = false;
5479      }
5480
5481      return value;
5482    } else {
5483      var optionName = KTUtil.snakeToCamel(name);
5484
5485      if (the.options[optionName]) {
5486        return KTUtil.getResponsiveValue(the.options[optionName]);
5487      } else {
5488        return null;
5489      }
5490    }
5491  }
5492
5493  var _destroy = function () {
5494    KTUtil.data(the.element).remove('swapper');
5495  }
5496
5497  // Construct Class
5498  _construct();
5499
5500  ///////////////////////
5501  // ** Public API  ** //
5502  ///////////////////////
5503
5504  // Methods
5505  the.update = function () {
5506    _update();
5507  }
5508
5509  the.destroy = function () {
5510    return _destroy();
5511  }
5512
5513  // Event API
5514  the.on = function (name, handler) {
5515    return KTEventHandler.on(the.element, name, handler);
5516  }
5517
5518  the.one = function (name, handler) {
5519    return KTEventHandler.one(the.element, name, handler);
5520  }
5521
5522  the.off = function (name, handlerId) {
5523    return KTEventHandler.off(the.element, name, handlerId);
5524  }
5525
5526  the.trigger = function (name, event) {
5527    return KTEventHandler.trigger(the.element, name, event, the, event);
5528  }
5529};
5530
5531// Static methods
5532KTSwapper.getInstance = function (element) {
5533  if (element !== null && KTUtil.data(element).has('swapper')) {
5534    return KTUtil.data(element).get('swapper');
5535  } else {
5536    return null;
5537  }
5538}
5539
5540// Create instances
5541KTSwapper.createInstances = function (selector = '[data-kt-swapper="true"]') {
5542  // Initialize Menus
5543  var elements = document.querySelectorAll(selector);
5544  var swapper;
5545
5546  if (elements && elements.length > 0) {
5547    for (var i = 0, len = elements.length; i < len; i++) {
5548      swapper = new KTSwapper(elements[i]);
5549    }
5550  }
5551}
5552
5553// Window resize handler
5554KTSwapper.handleResize = function () {
5555  window.addEventListener('resize', function () {
5556    var timer;
5557
5558    KTUtil.throttle(timer, function () {
5559      // Locate and update Offcanvas instances on window resize
5560      var elements = document.querySelectorAll('[data-kt-swapper="true"]');
5561
5562      if (elements && elements.length > 0) {
5563        for (var i = 0, len = elements.length; i < len; i++) {
5564          var swapper = KTSwapper.getInstance(elements[i]);
5565          if (swapper) {
5566            swapper.update();
5567          }
5568        }
5569      }
5570    }, 200);
5571  });
5572};
5573
5574// Global initialization
5575KTSwapper.init = function () {
5576  KTSwapper.createInstances();
5577
5578  if (KTSwapperHandlersInitialized === false) {
5579    KTSwapper.handleResize();
5580    KTSwapperHandlersInitialized = true;
5581  }
5582};
5583
5584// Webpack support
5585if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
5586  module.exports = KTSwapper;
5587}
5588
5589"use strict";
5590
5591// Class definition
5592var KTToggle = function (element, options) {
5593  ////////////////////////////
5594  // ** Private variables  ** //
5595  ////////////////////////////
5596  var the = this;
5597
5598  if (!element) {
5599    return;
5600  }
5601
5602  // Default Options
5603  var defaultOptions = {
5604    saveState: true
5605  };
5606
5607  ////////////////////////////
5608  // ** Private methods  ** //
5609  ////////////////////////////
5610
5611  var _construct = function () {
5612    if (KTUtil.data(element).has('toggle') === true) {
5613      the = KTUtil.data(element).get('toggle');
5614    } else {
5615      _init();
5616    }
5617  }
5618
5619  var _init = function () {
5620    // Variables
5621    the.options = KTUtil.deepExtend({}, defaultOptions, options);
5622    the.uid = KTUtil.getUniqueId('toggle');
5623
5624    // Elements
5625    the.element = element;
5626
5627    the.target = document.querySelector(the.element.getAttribute('data-kt-toggle-target')) ? document.querySelector(the.element.getAttribute('data-kt-toggle-target')) : the.element;
5628    the.state = the.element.hasAttribute('data-kt-toggle-state') ? the.element.getAttribute('data-kt-toggle-state') : '';
5629    the.mode = the.element.hasAttribute('data-kt-toggle-mode') ? the.element.getAttribute('data-kt-toggle-mode') : '';
5630    the.attribute = 'data-kt-' + the.element.getAttribute('data-kt-toggle-name');
5631
5632    // Event Handlers
5633    _handlers();
5634
5635    // Bind Instance
5636    KTUtil.data(the.element).set('toggle', the);
5637  }
5638
5639  var _handlers = function () {
5640    KTUtil.addEvent(the.element, 'click', function (e) {
5641      e.preventDefault();
5642
5643      if (the.mode !== '') {
5644        if (the.mode === 'off' && _isEnabled() === false) {
5645          _toggle();
5646        } else if (the.mode === 'on' && _isEnabled() === true) {
5647          _toggle();
5648        }
5649      } else {
5650        _toggle();
5651      }
5652    });
5653  }
5654
5655  // Event handlers
5656  var _toggle = function () {
5657    // Trigger "after.toggle" event
5658    KTEventHandler.trigger(the.element, 'kt.toggle.change', the);
5659
5660    if (_isEnabled()) {
5661      _disable();
5662    } else {
5663      _enable();
5664    }
5665
5666    // Trigger "before.toggle" event
5667    KTEventHandler.trigger(the.element, 'kt.toggle.changed', the);
5668
5669    return the;
5670  }
5671
5672  var _enable = function () {
5673    if (_isEnabled() === true) {
5674      return;
5675    }
5676
5677    KTEventHandler.trigger(the.element, 'kt.toggle.enable', the);
5678
5679    the.target.setAttribute(the.attribute, 'on');
5680
5681    if (the.state.length > 0) {
5682      the.element.classList.add(the.state);
5683    }
5684
5685    if (typeof KTCookie !== 'undefined' && the.options.saveState === true) {
5686      KTCookie.set(the.attribute, 'on');
5687    }
5688
5689    KTEventHandler.trigger(the.element, 'kt.toggle.enabled', the);
5690
5691    return the;
5692  }
5693
5694  var _disable = function () {
5695    if (_isEnabled() === false) {
5696      return;
5697    }
5698
5699    KTEventHandler.trigger(the.element, 'kt.toggle.disable', the);
5700
5701    the.target.removeAttribute(the.attribute);
5702
5703    if (the.state.length > 0) {
5704      the.element.classList.remove(the.state);
5705    }
5706
5707    if (typeof KTCookie !== 'undefined' && the.options.saveState === true) {
5708      KTCookie.remove(the.attribute);
5709    }
5710
5711    KTEventHandler.trigger(the.element, 'kt.toggle.disabled', the);
5712
5713    return the;
5714  }
5715
5716  var _isEnabled = function () {
5717    return (String(the.target.getAttribute(the.attribute)).toLowerCase() === 'on');
5718  }
5719
5720  var _destroy = function () {
5721    KTUtil.data(the.element).remove('toggle');
5722  }
5723
5724  // Construct class
5725  _construct();
5726
5727  ///////////////////////
5728  // ** Public API  ** //
5729  ///////////////////////
5730
5731  // Plugin API
5732  the.toggle = function () {
5733    return _toggle();
5734  }
5735
5736  the.enable = function () {
5737    return _enable();
5738  }
5739
5740  the.disable = function () {
5741    return _disable();
5742  }
5743
5744  the.isEnabled = function () {
5745    return _isEnabled();
5746  }
5747
5748  the.goElement = function () {
5749    return the.element;
5750  }
5751
5752  the.destroy = function () {
5753    return _destroy();
5754  }
5755
5756  // Event API
5757  the.on = function (name, handler) {
5758    return KTEventHandler.on(the.element, name, handler);
5759  }
5760
5761  the.one = function (name, handler) {
5762    return KTEventHandler.one(the.element, name, handler);
5763  }
5764
5765  the.off = function (name, handlerId) {
5766    return KTEventHandler.off(the.element, name, handlerId);
5767  }
5768
5769  the.trigger = function (name, event) {
5770    return KTEventHandler.trigger(the.element, name, event, the, event);
5771  }
5772};
5773
5774// Static methods
5775KTToggle.getInstance = function (element) {
5776  if (element !== null && KTUtil.data(element).has('toggle')) {
5777    return KTUtil.data(element).get('toggle');
5778  } else {
5779    return null;
5780  }
5781}
5782
5783// Create instances
5784KTToggle.createInstances = function (selector = '[data-kt-toggle]') {
5785  // Get instances
5786  var elements = document.body.querySelectorAll(selector);
5787
5788  if (elements && elements.length > 0) {
5789    for (var i = 0, len = elements.length; i < len; i++) {
5790      // Initialize instances
5791      new KTToggle(elements[i]);
5792    }
5793  }
5794}
5795
5796// Global initialization
5797KTToggle.init = function () {
5798  KTToggle.createInstances();
5799};
5800
5801// Webpack support
5802if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
5803  module.exports = KTToggle;
5804}
5805"use strict";
5806
5807/**
5808 * @class KTUtil  base utilize class that privides helper functions
5809 */
5810
5811// Polyfills
5812
5813// Element.matches() polyfill
5814if (!Element.prototype.matches) {
5815  Element.prototype.matches = function (s) {
5816    var matches = (this.document || this.ownerDocument).querySelectorAll(s),
5817      i = matches.length;
5818    while (--i >= 0 && matches.item(i) !== this) { }
5819    return i > -1;
5820  };
5821}
5822
5823/**
5824 * Element.closest() polyfill
5825 * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
5826 */
5827if (!Element.prototype.closest) {
5828  Element.prototype.closest = function (s) {
5829    var el = this;
5830    var ancestor = this;
5831    if (!document.documentElement.contains(el)) return null;
5832    do {
5833      if (ancestor.matches(s)) return ancestor;
5834      ancestor = ancestor.parentElement;
5835    } while (ancestor !== null);
5836    return null;
5837  };
5838}
5839
5840/**
5841 * ChildNode.remove() polyfill
5842 * https://gomakethings.com/removing-an-element-from-the-dom-the-es6-way/
5843 * @author Chris Ferdinandi
5844 * @license MIT
5845 */
5846(function (elem) {
5847  for (var i = 0; i < elem.length; i++) {
5848    if (!window[elem[i]] || 'remove' in window[elem[i]].prototype) continue;
5849    window[elem[i]].prototype.remove = function () {
5850      this.parentNode.removeChild(this);
5851    };
5852  }
5853})(['Element', 'CharacterData', 'DocumentType']);
5854
5855
5856//
5857// requestAnimationFrame polyfill by Erik Möller.
5858//  With fixes from Paul Irish and Tino Zijdel
5859//
5860//  http://paulirish.com/2011/requestanimationframe-for-smart-animating/
5861//  http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
5862//
5863//  MIT license
5864//
5865(function () {
5866  var lastTime = 0;
5867  var vendors = ['webkit', 'moz'];
5868  for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
5869    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
5870    window.cancelAnimationFrame =
5871      window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
5872  }
5873
5874  if (!window.requestAnimationFrame)
5875    window.requestAnimationFrame = function (callback) {
5876      var currTime = new Date().getTime();
5877      var timeToCall = Math.max(0, 16 - (currTime - lastTime));
5878      var id = window.setTimeout(function () {
5879        callback(currTime + timeToCall);
5880      }, timeToCall);
5881      lastTime = currTime + timeToCall;
5882      return id;
5883    };
5884
5885  if (!window.cancelAnimationFrame)
5886    window.cancelAnimationFrame = function (id) {
5887      clearTimeout(id);
5888    };
5889}());
5890
5891// Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/prepend()/prepend().md
5892(function (arr) {
5893  arr.forEach(function (item) {
5894    if (item.hasOwnProperty('prepend')) {
5895      return;
5896    }
5897    Object.defineProperty(item, 'prepend', {
5898      configurable: true,
5899      enumerable: true,
5900      writable: true,
5901      value: function prepend() {
5902        var argArr = Array.prototype.slice.call(arguments),
5903          docFrag = document.createDocumentFragment();
5904
5905        argArr.forEach(function (argItem) {
5906          var isNode = argItem instanceof Node;
5907          docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem)));
5908        });
5909
5910        this.insertBefore(docFrag, this.firstChild);
5911      }
5912    });
5913  });
5914})([Element.prototype, Document.prototype, DocumentFragment.prototype]);
5915
5916// getAttributeNames
5917if (Element.prototype.getAttributeNames == undefined) {
5918  Element.prototype.getAttributeNames = function () {
5919    var attributes = this.attributes;
5920    var length = attributes.length;
5921    var result = new Array(length);
5922    for (var i = 0; i < length; i++) {
5923      result[i] = attributes[i].name;
5924    }
5925    return result;
5926  };
5927}
5928
5929// Global variables
5930window.KTUtilElementDataStore = {};
5931window.KTUtilElementDataStoreID = 0;
5932window.KTUtilDelegatedEventHandlers = {};
5933
5934var KTUtil = function () {
5935  var resizeHandlers = [];
5936
5937  /**
5938   * Handle window resize event with some
5939   * delay to attach event handlers upon resize complete
5940   */
5941  var _windowResizeHandler = function () {
5942    var _runResizeHandlers = function () {
5943      // reinitialize other subscribed elements
5944      for (var i = 0; i < resizeHandlers.length; i++) {
5945        var each = resizeHandlers[i];
5946        each.call();
5947      }
5948    };
5949
5950    var timer;
5951
5952    window.addEventListener('resize', function () {
5953      KTUtil.throttle(timer, function () {
5954        _runResizeHandlers();
5955      }, 200);
5956    });
5957  };
5958
5959  return {
5960    /**
5961     * Class main initializer.
5962     * @param {object} settings.
5963     * @returns null
5964     */
5965    //main function to initiate the theme
5966    init: function (settings) {
5967      _windowResizeHandler();
5968    },
5969
5970    /**
5971     * Adds window resize event handler.
5972     * @param {function} callback function.
5973     */
5974    addResizeHandler: function (callback) {
5975      resizeHandlers.push(callback);
5976    },
5977
5978    /**
5979     * Removes window resize event handler.
5980     * @param {function} callback function.
5981     */
5982    removeResizeHandler: function (callback) {
5983      for (var i = 0; i < resizeHandlers.length; i++) {
5984        if (callback === resizeHandlers[i]) {
5985          delete resizeHandlers[i];
5986        }
5987      }
5988    },
5989
5990    /**
5991     * Trigger window resize handlers.
5992     */
5993    runResizeHandlers: function () {
5994      _runResizeHandlers();
5995    },
5996
5997    resize: function () {
5998      if (typeof (Event) === 'function') {
5999        // modern browsers
6000        window.dispatchEvent(new Event('resize'));
6001      } else {
6002        // for IE and other old browsers
6003        // causes deprecation warning on modern browsers
6004        var evt = window.document.createEvent('UIEvents');
6005        evt.initUIEvent('resize', true, false, window, 0);
6006        window.dispatchEvent(evt);
6007      }
6008    },
6009
6010    /**
6011     * Get GET parameter value from URL.
6012     * @param {string} paramName Parameter name.
6013     * @returns {string}
6014     */
6015    getURLParam: function (paramName) {
6016      var searchString = window.location.search.substring(1),
6017        i, val, params = searchString.split("&");
6018
6019      for (i = 0; i < params.length; i++) {
6020        val = params[i].split("=");
6021        if (val[0] == paramName) {
6022          return unescape(val[1]);
6023        }
6024      }
6025
6026      return null;
6027    },
6028
6029    /**
6030     * Checks whether current device is mobile touch.
6031     * @returns {boolean}
6032     */
6033    isMobileDevice: function () {
6034      var test = (this.getViewPort().width < this.getBreakpoint('lg') ? true : false);
6035
6036      if (test === false) {
6037        // For use within normal web clients
6038        test = navigator.userAgent.match(/iPad/i) != null;
6039      }
6040
6041      return test;
6042    },
6043
6044    /**
6045     * Checks whether current device is desktop.
6046     * @returns {boolean}
6047     */
6048    isDesktopDevice: function () {
6049      return KTUtil.isMobileDevice() ? false : true;
6050    },
6051
6052    /**
6053     * Gets browser window viewport size. Ref:
6054     * http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/
6055     * @returns {object}
6056     */
6057    getViewPort: function () {
6058      var e = window,
6059        a = 'inner';
6060      if (!('innerWidth' in window)) {
6061        a = 'client';
6062        e = document.documentElement || document.body;
6063      }
6064
6065      return {
6066        width: e[a + 'Width'],
6067        height: e[a + 'Height']
6068      };
6069    },
6070
6071    /**
6072         * Checks whether given device mode is currently activated.
6073         * @param {string} mode Responsive mode name(e.g: desktop,
6074         *     desktop-and-tablet, tablet, tablet-and-mobile, mobile)
6075         * @returns {boolean}
6076         */
6077    isBreakpointUp: function (mode) {
6078      var width = this.getViewPort().width;
6079      var breakpoint = this.getBreakpoint(mode);
6080
6081      return (width >= breakpoint);
6082    },
6083
6084    isBreakpointDown: function (mode) {
6085      var width = this.getViewPort().width;
6086      var breakpoint = this.getBreakpoint(mode);
6087
6088      return (width < breakpoint);
6089    },
6090
6091    getViewportWidth: function () {
6092      return this.getViewPort().width;
6093    },
6094
6095    /**
6096     * Generates unique ID for give prefix.
6097     * @param {string} prefix Prefix for generated ID
6098     * @returns {boolean}
6099     */
6100    getUniqueId: function (prefix) {
6101      return prefix + Math.floor(Math.random() * (new Date()).getTime());
6102    },
6103
6104    /**
6105     * Gets window width for give breakpoint mode.
6106     * @param {string} mode Responsive mode name(e.g: xl, lg, md, sm)
6107     * @returns {number}
6108     */
6109    getBreakpoint: function (breakpoint) {
6110      var value = this.getCssVariableValue('--bs-' + breakpoint);
6111
6112      if (value) {
6113        value = parseInt(value.trim());
6114      }
6115
6116      return value;
6117    },
6118
6119    /**
6120     * Checks whether object has property matchs given key path.
6121     * @param {object} obj Object contains values paired with given key path
6122     * @param {string} keys Keys path seperated with dots
6123     * @returns {object}
6124     */
6125    isset: function (obj, keys) {
6126      var stone;
6127
6128      keys = keys || '';
6129
6130      if (keys.indexOf('[') !== -1) {
6131        throw new Error('Unsupported object path notation.');
6132      }
6133
6134      keys = keys.split('.');
6135
6136      do {
6137        if (obj === undefined) {
6138          return false;
6139        }
6140
6141        stone = keys.shift();
6142
6143        if (!obj.hasOwnProperty(stone)) {
6144          return false;
6145        }
6146
6147        obj = obj[stone];
6148
6149      } while (keys.length);
6150
6151      return true;
6152    },
6153
6154    /**
6155     * Gets highest z-index of the given element parents
6156     * @param {object} el jQuery element object
6157     * @returns {number}
6158     */
6159    getHighestZindex: function (el) {
6160      var position, value;
6161
6162      while (el && el !== document) {
6163        // Ignore z-index if position is set to a value where z-index is ignored by the browser
6164        // This makes behavior of this function consistent across browsers
6165        // WebKit always returns auto if the element is positioned
6166        position = KTUtil.css(el, 'position');
6167
6168        if (position === "absolute" || position === "relative" || position === "fixed") {
6169          // IE returns 0 when zIndex is not specified
6170          // other browsers return a string
6171          // we ignore the case of nested elements with an explicit value of 0
6172          // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
6173          value = parseInt(KTUtil.css(el, 'z-index'));
6174
6175          if (!isNaN(value) && value !== 0) {
6176            return value;
6177          }
6178        }
6179
6180        el = el.parentNode;
6181      }
6182
6183      return 1;
6184    },
6185
6186    /**
6187     * Checks whether the element has any parent with fixed positionfreg
6188     * @param {object} el jQuery element object
6189     * @returns {boolean}
6190     */
6191    hasFixedPositionedParent: function (el) {
6192      var position;
6193
6194      while (el && el !== document) {
6195        position = KTUtil.css(el, 'position');
6196
6197        if (position === "fixed") {
6198          return true;
6199        }
6200
6201        el = el.parentNode;
6202      }
6203
6204      return false;
6205    },
6206
6207    /**
6208     * Simulates delay
6209     */
6210    sleep: function (milliseconds) {
6211      var start = new Date().getTime();
6212      for (var i = 0; i < 1e7; i++) {
6213        if ((new Date().getTime() - start) > milliseconds) {
6214          break;
6215        }
6216      }
6217    },
6218
6219    /**
6220     * Gets randomly generated integer value within given min and max range
6221     * @param {number} min Range start value
6222     * @param {number} max Range end value
6223     * @returns {number}
6224     */
6225    getRandomInt: function (min, max) {
6226      return Math.floor(Math.random() * (max - min + 1)) + min;
6227    },
6228
6229    /**
6230     * Checks whether Angular library is included
6231     * @returns {boolean}
6232     */
6233    isAngularVersion: function () {
6234      return window.Zone !== undefined ? true : false;
6235    },
6236
6237    // Deep extend:  $.extend(true, {}, objA, objB);
6238    deepExtend: function (out) {
6239      out = out || {};
6240
6241      for (var i = 1; i < arguments.length; i++) {
6242        var obj = arguments[i];
6243        if (!obj) continue;
6244
6245        for (var key in obj) {
6246          if (!obj.hasOwnProperty(key)) {
6247            continue;
6248          }
6249
6250          // based on https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
6251          if (Object.prototype.toString.call(obj[key]) === '[object Object]') {
6252            out[key] = KTUtil.deepExtend(out[key], obj[key]);
6253            continue;
6254          }
6255
6256          out[key] = obj[key];
6257        }
6258      }
6259
6260      return out;
6261    },
6262
6263    // extend:  $.extend({}, objA, objB);
6264    extend: function (out) {
6265      out = out || {};
6266
6267      for (var i = 1; i < arguments.length; i++) {
6268        if (!arguments[i])
6269          continue;
6270
6271        for (var key in arguments[i]) {
6272          if (arguments[i].hasOwnProperty(key))
6273            out[key] = arguments[i][key];
6274        }
6275      }
6276
6277      return out;
6278    },
6279
6280    getBody: function () {
6281      return document.getElementsByTagName('body')[0];
6282    },
6283
6284    /**
6285     * Checks whether the element has given classes
6286     * @param {object} el jQuery element object
6287     * @param {string} Classes string
6288     * @returns {boolean}
6289     */
6290    hasClasses: function (el, classes) {
6291      if (!el) {
6292        return;
6293      }
6294
6295      var classesArr = classes.split(" ");
6296
6297      for (var i = 0; i < classesArr.length; i++) {
6298        if (KTUtil.hasClass(el, KTUtil.trim(classesArr[i])) == false) {
6299          return false;
6300        }
6301      }
6302
6303      return true;
6304    },
6305
6306    hasClass: function (el, className) {
6307      if (!el) {
6308        return;
6309      }
6310
6311      return el.classList ? el.classList.contains(className) : new RegExp('\\b' + className + '\\b').test(el.className);
6312    },
6313
6314    addClass: function (el, className) {
6315      if (!el || typeof className === 'undefined') {
6316        return;
6317      }
6318
6319      var classNames = className.split(' ');
6320
6321      if (el.classList) {
6322        for (var i = 0; i < classNames.length; i++) {
6323          if (classNames[i] && classNames[i].length > 0) {
6324            el.classList.add(KTUtil.trim(classNames[i]));
6325          }
6326        }
6327      } else if (!KTUtil.hasClass(el, className)) {
6328        for (var x = 0; x < classNames.length; x++) {
6329          el.className += ' ' + KTUtil.trim(classNames[x]);
6330        }
6331      }
6332    },
6333
6334    removeClass: function (el, className) {
6335      if (!el || typeof className === 'undefined') {
6336        return;
6337      }
6338
6339      var classNames = className.split(' ');
6340
6341      if (el.classList) {
6342        for (var i = 0; i < classNames.length; i++) {
6343          el.classList.remove(KTUtil.trim(classNames[i]));
6344        }
6345      } else if (KTUtil.hasClass(el, className)) {
6346        for (var x = 0; x < classNames.length; x++) {
6347          el.className = el.className.replace(new RegExp('\\b' + KTUtil.trim(classNames[x]) + '\\b', 'g'), '');
6348        }
6349      }
6350    },
6351
6352    triggerCustomEvent: function (el, eventName, data) {
6353      var event;
6354      if (window.CustomEvent) {
6355        event = new CustomEvent(eventName, {
6356          detail: data
6357        });
6358      } else {
6359        event = document.createEvent('CustomEvent');
6360        event.initCustomEvent(eventName, true, true, data);
6361      }
6362
6363      el.dispatchEvent(event);
6364    },
6365
6366    triggerEvent: function (node, eventName) {
6367      // Make sure we use the ownerDocument from the provided node to avoid cross-window problems
6368      var doc;
6369
6370      if (node.ownerDocument) {
6371        doc = node.ownerDocument;
6372      } else if (node.nodeType == 9) {
6373        // the node may be the document itself, nodeType 9 = DOCUMENT_NODE
6374        doc = node;
6375      } else {
6376        throw new Error("Invalid node passed to fireEvent: " + node.id);
6377      }
6378
6379      if (node.dispatchEvent) {
6380        // Gecko-style approach (now the standard) takes more work
6381        var eventClass = "";
6382
6383        // Different events have different event classes.
6384        // If this switch statement can't map an eventName to an eventClass,
6385        // the event firing is going to fail.
6386        switch (eventName) {
6387          case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead.
6388          case "mouseenter":
6389          case "mouseleave":
6390          case "mousedown":
6391          case "mouseup":
6392            eventClass = "MouseEvents";
6393            break;
6394
6395          case "focus":
6396          case "change":
6397          case "blur":
6398          case "select":
6399            eventClass = "HTMLEvents";
6400            break;
6401
6402          default:
6403            throw "fireEvent: Couldn't find an event class for event '" + eventName + "'.";
6404            break;
6405        }
6406        var event = doc.createEvent(eventClass);
6407
6408        var bubbles = eventName == "change" ? false : true;
6409        event.initEvent(eventName, bubbles, true); // All events created as bubbling and cancelable.
6410
6411        event.synthetic = true; // allow detection of synthetic events
6412        // The second parameter says go ahead with the default action
6413        node.dispatchEvent(event, true);
6414      } else if (node.fireEvent) {
6415        // IE-old school style
6416        var event = doc.createEventObject();
6417        event.synthetic = true; // allow detection of synthetic events
6418        node.fireEvent("on" + eventName, event);
6419      }
6420    },
6421
6422    index: function (el) {
6423      var c = el.parentNode.children, i = 0;
6424      for (; i < c.length; i++)
6425        if (c[i] == el) return i;
6426    },
6427
6428    trim: function (string) {
6429      return string.trim();
6430    },
6431
6432    eventTriggered: function (e) {
6433      if (e.currentTarget.dataset.triggered) {
6434        return true;
6435      } else {
6436        e.currentTarget.dataset.triggered = true;
6437
6438        return false;
6439      }
6440    },
6441
6442    remove: function (el) {
6443      if (el && el.parentNode) {
6444        el.parentNode.removeChild(el);
6445      }
6446    },
6447
6448    find: function (parent, query) {
6449      if (parent !== null) {
6450        return parent.querySelector(query);
6451      } else {
6452        return null;
6453      }
6454    },
6455
6456    findAll: function (parent, query) {
6457      if (parent !== null) {
6458        return parent.querySelectorAll(query);
6459      } else {
6460        return null;
6461      }
6462    },
6463
6464    insertAfter: function (el, referenceNode) {
6465      return referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling);
6466    },
6467
6468    parents: function (elem, selector) {
6469      // Set up a parent array
6470      var parents = [];
6471
6472      // Push each parent element to the array
6473      for (; elem && elem !== document; elem = elem.parentNode) {
6474        if (selector) {
6475          if (elem.matches(selector)) {
6476            parents.push(elem);
6477          }
6478          continue;
6479        }
6480        parents.push(elem);
6481      }
6482
6483      // Return our parent array
6484      return parents;
6485    },
6486
6487    children: function (el, selector, log) {
6488      if (!el || !el.childNodes) {
6489        return null;
6490      }
6491
6492      var result = [],
6493        i = 0,
6494        l = el.childNodes.length;
6495
6496      for (var i; i < l; ++i) {
6497        if (el.childNodes[i].nodeType == 1 && KTUtil.matches(el.childNodes[i], selector, log)) {
6498          result.push(el.childNodes[i]);
6499        }
6500      }
6501
6502      return result;
6503    },
6504
6505    child: function (el, selector, log) {
6506      var children = KTUtil.children(el, selector, log);
6507
6508      return children ? children[0] : null;
6509    },
6510
6511    matches: function (el, selector, log) {
6512      var p = Element.prototype;
6513      var f = p.matches || p.webkitMatchesSelector || p.mozMatchesSelector || p.msMatchesSelector || function (s) {
6514        return [].indexOf.call(document.querySelectorAll(s), this) !== -1;
6515      };
6516
6517      if (el && el.tagName) {
6518        return f.call(el, selector);
6519      } else {
6520        return false;
6521      }
6522    },
6523
6524    data: function (el) {
6525      return {
6526        set: function (name, data) {
6527          if (!el) {
6528            return;
6529          }
6530
6531          if (el.customDataTag === undefined) {
6532            window.KTUtilElementDataStoreID++;
6533            el.customDataTag = window.KTUtilElementDataStoreID;
6534          }
6535
6536          if (window.KTUtilElementDataStore[el.customDataTag] === undefined) {
6537            window.KTUtilElementDataStore[el.customDataTag] = {};
6538          }
6539
6540          window.KTUtilElementDataStore[el.customDataTag][name] = data;
6541        },
6542
6543        get: function (name) {
6544          if (!el) {
6545            return;
6546          }
6547
6548          if (el.customDataTag === undefined) {
6549            return null;
6550          }
6551
6552          return this.has(name) ? window.KTUtilElementDataStore[el.customDataTag][name] : null;
6553        },
6554
6555        has: function (name) {
6556          if (!el) {
6557            return false;
6558          }
6559
6560          if (el.customDataTag === undefined) {
6561            return false;
6562          }
6563
6564          return (window.KTUtilElementDataStore[el.customDataTag] && window.KTUtilElementDataStore[el.customDataTag][name]) ? true : false;
6565        },
6566
6567        remove: function (name) {
6568          if (el && this.has(name)) {
6569            delete window.KTUtilElementDataStore[el.customDataTag][name];
6570          }
6571        }
6572      };
6573    },
6574
6575    outerWidth: function (el, margin) {
6576      var width;
6577
6578      if (margin === true) {
6579        width = parseFloat(el.offsetWidth);
6580        width += parseFloat(KTUtil.css(el, 'margin-left')) + parseFloat(KTUtil.css(el, 'margin-right'));
6581
6582        return parseFloat(width);
6583      } else {
6584        width = parseFloat(el.offsetWidth);
6585
6586        return width;
6587      }
6588    },
6589
6590    offset: function (el) {
6591      var rect, win;
6592
6593      if (!el) {
6594        return;
6595      }
6596
6597      // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
6598      // Support: IE <=11 only
6599      // Running getBoundingClientRect on a
6600      // disconnected node in IE throws an error
6601
6602      if (!el.getClientRects().length) {
6603        return { top: 0, left: 0 };
6604      }
6605
6606      // Get document-relative position by adding viewport scroll to viewport-relative gBCR
6607      rect = el.getBoundingClientRect();
6608      win = el.ownerDocument.defaultView;
6609
6610      return {
6611        top: rect.top + win.pageYOffset,
6612        left: rect.left + win.pageXOffset,
6613        right: window.innerWidth - (el.offsetLeft + el.offsetWidth)
6614      };
6615    },
6616
6617    height: function (el) {
6618      return KTUtil.css(el, 'height');
6619    },
6620
6621    outerHeight: function (el, withMargin) {
6622      var height = el.offsetHeight;
6623      var style;
6624
6625      if (typeof withMargin !== 'undefined' && withMargin === true) {
6626        style = getComputedStyle(el);
6627        height += parseInt(style.marginTop) + parseInt(style.marginBottom);
6628
6629        return height;
6630      } else {
6631        return height;
6632      }
6633    },
6634
6635    visible: function (el) {
6636      return !(el.offsetWidth === 0 && el.offsetHeight === 0);
6637    },
6638
6639    isVisibleInContainer: function (el, container, offset = 0) {
6640      const eleTop = el.offsetTop;
6641      const eleBottom = eleTop + el.clientHeight + offset;
6642      const containerTop = container.scrollTop;
6643      const containerBottom = containerTop + container.clientHeight;
6644
6645      // The element is fully visible in the container
6646      return (
6647        (eleTop >= containerTop && eleBottom <= containerBottom)
6648      );
6649    },
6650
6651    getRelativeTopPosition: function (el, container) {
6652      return el.offsetTop - container.offsetTop;
6653    },
6654
6655    attr: function (el, name, value) {
6656      if (el == undefined) {
6657        return;
6658      }
6659
6660      if (value !== undefined) {
6661        el.setAttribute(name, value);
6662      } else {
6663        return el.getAttribute(name);
6664      }
6665    },
6666
6667    hasAttr: function (el, name) {
6668      if (el == undefined) {
6669        return;
6670      }
6671
6672      return el.getAttribute(name) ? true : false;
6673    },
6674
6675    removeAttr: function (el, name) {
6676      if (el == undefined) {
6677        return;
6678      }
6679
6680      el.removeAttribute(name);
6681    },
6682
6683    animate: function (from, to, duration, update, easing, done) {
6684      /**
6685       * TinyAnimate.easings
6686       *  Adapted from jQuery Easing
6687       */
6688      var easings = {};
6689      var easing;
6690
6691      easings.linear = function (t, b, c, d) {
6692        return c * t / d + b;
6693      };
6694
6695      easing = easings.linear;
6696
6697      // Early bail out if called incorrectly
6698      if (typeof from !== 'number' ||
6699        typeof to !== 'number' ||
6700        typeof duration !== 'number' ||
6701        typeof update !== 'function') {
6702        return;
6703      }
6704
6705      // Create mock done() function if necessary
6706      if (typeof done !== 'function') {
6707        done = function () { };
6708      }
6709
6710      // Pick implementation (requestAnimationFrame | setTimeout)
6711      var rAF = window.requestAnimationFrame || function (callback) {
6712        window.setTimeout(callback, 1000 / 50);
6713      };
6714
6715      // Animation loop
6716      var canceled = false;
6717      var change = to - from;
6718
6719      function loop(timestamp) {
6720        var time = (timestamp || +new Date()) - start;
6721
6722        if (time >= 0) {
6723          update(easing(time, from, change, duration));
6724        }
6725        if (time >= 0 && time >= duration) {
6726          update(to);
6727          done();
6728        } else {
6729          rAF(loop);
6730        }
6731      }
6732
6733      update(from);
6734
6735      // Start animation loop
6736      var start = window.performance && window.performance.now ? window.performance.now() : +new Date();
6737
6738      rAF(loop);
6739    },
6740
6741    actualCss: function (el, prop, cache) {
6742      var css = '';
6743
6744      if (el instanceof HTMLElement === false) {
6745        return;
6746      }
6747
6748      if (!el.getAttribute('kt-hidden-' + prop) || cache === false) {
6749        var value;
6750
6751        // the element is hidden so:
6752        // making the el block so we can meassure its height but still be hidden
6753        css = el.style.cssText;
6754        el.style.cssText = 'position: absolute; visibility: hidden; display: block;';
6755
6756        if (prop == 'width') {
6757          value = el.offsetWidth;
6758        } else if (prop == 'height') {
6759          value = el.offsetHeight;
6760        }
6761
6762        el.style.cssText = css;
6763
6764        // store it in cache
6765        el.setAttribute('kt-hidden-' + prop, value);
6766
6767        return parseFloat(value);
6768      } else {
6769        // store it in cache
6770        return parseFloat(el.getAttribute('kt-hidden-' + prop));
6771      }
6772    },
6773
6774    actualHeight: function (el, cache) {
6775      return KTUtil.actualCss(el, 'height', cache);
6776    },
6777
6778    actualWidth: function (el, cache) {
6779      return KTUtil.actualCss(el, 'width', cache);
6780    },
6781
6782    getScroll: function (element, method) {
6783      // The passed in `method` value should be 'Top' or 'Left'
6784      method = 'scroll' + method;
6785      return (element == window || element == document) ? (
6786        self[(method == 'scrollTop') ? 'pageYOffset' : 'pageXOffset'] ||
6787        (browserSupportsBoxModel && document.documentElement[method]) ||
6788        document.body[method]
6789      ) : element[method];
6790    },
6791
6792    css: function (el, styleProp, value, important) {
6793      if (!el) {
6794        return;
6795      }
6796
6797      if (value !== undefined) {
6798        if (important === true) {
6799          el.style.setProperty(styleProp, value, 'important');
6800        } else {
6801          el.style[styleProp] = value;
6802        }
6803      } else {
6804        var defaultView = (el.ownerDocument || document).defaultView;
6805
6806        // W3C standard way:
6807        if (defaultView && defaultView.getComputedStyle) {
6808          // sanitize property name to css notation
6809          // (hyphen separated words eg. font-Size)
6810          styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase();
6811
6812          return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
6813        } else if (el.currentStyle) { // IE
6814          // sanitize property name to camelCase
6815          styleProp = styleProp.replace(/\-(\w)/g, function (str, letter) {
6816            return letter.toUpperCase();
6817          });
6818
6819          value = el.currentStyle[styleProp];
6820
6821          // convert other units to pixels on IE
6822          if (/^\d+(em|pt|%|ex)?$/i.test(value)) {
6823            return (function (value) {
6824              var oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left;
6825
6826              el.runtimeStyle.left = el.currentStyle.left;
6827              el.style.left = value || 0;
6828              value = el.style.pixelLeft + "px";
6829              el.style.left = oldLeft;
6830              el.runtimeStyle.left = oldRsLeft;
6831
6832              return value;
6833            })(value);
6834          }
6835
6836          return value;
6837        }
6838      }
6839    },
6840
6841    slide: function (el, dir, speed, callback, recalcMaxHeight) {
6842      if (!el || (dir == 'up' && KTUtil.visible(el) === false) || (dir == 'down' && KTUtil.visible(el) === true)) {
6843        return;
6844      }
6845
6846      speed = (speed ? speed : 600);
6847      var calcHeight = KTUtil.actualHeight(el);
6848      var calcPaddingTop = false;
6849      var calcPaddingBottom = false;
6850
6851      if (KTUtil.css(el, 'padding-top') && KTUtil.data(el).has('slide-padding-top') !== true) {
6852        KTUtil.data(el).set('slide-padding-top', KTUtil.css(el, 'padding-top'));
6853      }
6854
6855      if (KTUtil.css(el, 'padding-bottom') && KTUtil.data(el).has('slide-padding-bottom') !== true) {
6856        KTUtil.data(el).set('slide-padding-bottom', KTUtil.css(el, 'padding-bottom'));
6857      }
6858
6859      if (KTUtil.data(el).has('slide-padding-top')) {
6860        calcPaddingTop = parseInt(KTUtil.data(el).get('slide-padding-top'));
6861      }
6862
6863      if (KTUtil.data(el).has('slide-padding-bottom')) {
6864        calcPaddingBottom = parseInt(KTUtil.data(el).get('slide-padding-bottom'));
6865      }
6866
6867      if (dir == 'up') { // up
6868        el.style.cssText = 'display: block; overflow: hidden;';
6869
6870        if (calcPaddingTop) {
6871          KTUtil.animate(0, calcPaddingTop, speed, function (value) {
6872            el.style.paddingTop = (calcPaddingTop - value) + 'px';
6873          }, 'linear');
6874        }
6875
6876        if (calcPaddingBottom) {
6877          KTUtil.animate(0, calcPaddingBottom, speed, function (value) {
6878            el.style.paddingBottom = (calcPaddingBottom - value) + 'px';
6879          }, 'linear');
6880        }
6881
6882        KTUtil.animate(0, calcHeight, speed, function (value) {
6883          el.style.height = (calcHeight - value) + 'px';
6884        }, 'linear', function () {
6885          el.style.height = '';
6886          el.style.display = 'none';
6887
6888          if (typeof callback === 'function') {
6889            callback();
6890          }
6891        });
6892
6893
6894      } else if (dir == 'down') { // down
6895        el.style.cssText = 'display: block; overflow: hidden;';
6896
6897        if (calcPaddingTop) {
6898          KTUtil.animate(0, calcPaddingTop, speed, function (value) {//
6899            el.style.paddingTop = value + 'px';
6900          }, 'linear', function () {
6901            el.style.paddingTop = '';
6902          });
6903        }
6904
6905        if (calcPaddingBottom) {
6906          KTUtil.animate(0, calcPaddingBottom, speed, function (value) {
6907            el.style.paddingBottom = value + 'px';
6908          }, 'linear', function () {
6909            el.style.paddingBottom = '';
6910          });
6911        }
6912
6913        KTUtil.animate(0, calcHeight, speed, function (value) {
6914          el.style.height = value + 'px';
6915        }, 'linear', function () {
6916          el.style.height = '';
6917          el.style.display = '';
6918          el.style.overflow = '';
6919
6920          if (typeof callback === 'function') {
6921            callback();
6922          }
6923        });
6924      }
6925    },
6926
6927    slideUp: function (el, speed, callback) {
6928      KTUtil.slide(el, 'up', speed, callback);
6929    },
6930
6931    slideDown: function (el, speed, callback) {
6932      KTUtil.slide(el, 'down', speed, callback);
6933    },
6934
6935    show: function (el, display) {
6936      if (typeof el !== 'undefined') {
6937        el.style.display = (display ? display : 'block');
6938      }
6939    },
6940
6941    hide: function (el) {
6942      if (typeof el !== 'undefined') {
6943        el.style.display = 'none';
6944      }
6945    },
6946
6947    addEvent: function (el, type, handler, one) {
6948      if (typeof el !== 'undefined' && el !== null) {
6949        el.addEventListener(type, handler);
6950      }
6951    },
6952
6953    removeEvent: function (el, type, handler) {
6954      if (el !== null) {
6955        el.removeEventListener(type, handler);
6956      }
6957    },
6958
6959    on: function (element, selector, event, handler) {
6960      if (element === null) {
6961        return;
6962      }
6963
6964      var eventId = KTUtil.getUniqueId('event');
6965
6966      window.KTUtilDelegatedEventHandlers[eventId] = function (e) {
6967        var targets = element.querySelectorAll(selector);
6968        var target = e.target;
6969
6970        while (target && target !== element) {
6971          for (var i = 0, j = targets.length; i < j; i++) {
6972            if (target === targets[i]) {
6973              handler.call(target, e);
6974            }
6975          }
6976
6977          target = target.parentNode;
6978        }
6979      }
6980
6981      KTUtil.addEvent(element, event, window.KTUtilDelegatedEventHandlers[eventId]);
6982
6983      return eventId;
6984    },
6985
6986    off: function (element, event, eventId) {
6987      if (!element || !window.KTUtilDelegatedEventHandlers[eventId]) {
6988        return;
6989      }
6990
6991      KTUtil.removeEvent(element, event, window.KTUtilDelegatedEventHandlers[eventId]);
6992
6993      delete window.KTUtilDelegatedEventHandlers[eventId];
6994    },
6995
6996    one: function onetime(el, type, callback) {
6997      el.addEventListener(type, function callee(e) {
6998        // remove event
6999        if (e.target && e.target.removeEventListener) {
7000          e.target.removeEventListener(e.type, callee);
7001        }
7002
7003        // need to verify from https://themeforest.net/author_dashboard#comment_23615588
7004        if (el && el.removeEventListener) {
7005          e.currentTarget.removeEventListener(e.type, callee);
7006        }
7007
7008        // call handler
7009        return callback(e);
7010      });
7011    },
7012
7013    hash: function (str) {
7014      var hash = 0,
7015        i, chr;
7016
7017      if (str.length === 0) return hash;
7018      for (i = 0; i < str.length; i++) {
7019        chr = str.charCodeAt(i);
7020        hash = ((hash << 5) - hash) + chr;
7021        hash |= 0; // Convert to 32bit integer
7022      }
7023
7024      return hash;
7025    },
7026
7027    animateClass: function (el, animationName, callback) {
7028      var animation;
7029      var animations = {
7030        animation: 'animationend',
7031        OAnimation: 'oAnimationEnd',
7032        MozAnimation: 'mozAnimationEnd',
7033        WebkitAnimation: 'webkitAnimationEnd',
7034        msAnimation: 'msAnimationEnd',
7035      };
7036
7037      for (var t in animations) {
7038        if (el.style[t] !== undefined) {
7039          animation = animations[t];
7040        }
7041      }
7042
7043      KTUtil.addClass(el, animationName);
7044
7045      KTUtil.one(el, animation, function () {
7046        KTUtil.removeClass(el, animationName);
7047      });
7048
7049      if (callback) {
7050        KTUtil.one(el, animation, callback);
7051      }
7052    },
7053
7054    transitionEnd: function (el, callback) {
7055      var transition;
7056      var transitions = {
7057        transition: 'transitionend',
7058        OTransition: 'oTransitionEnd',
7059        MozTransition: 'mozTransitionEnd',
7060        WebkitTransition: 'webkitTransitionEnd',
7061        msTransition: 'msTransitionEnd'
7062      };
7063
7064      for (var t in transitions) {
7065        if (el.style[t] !== undefined) {
7066          transition = transitions[t];
7067        }
7068      }
7069
7070      KTUtil.one(el, transition, callback);
7071    },
7072
7073    animationEnd: function (el, callback) {
7074      var animation;
7075      var animations = {
7076        animation: 'animationend',
7077        OAnimation: 'oAnimationEnd',
7078        MozAnimation: 'mozAnimationEnd',
7079        WebkitAnimation: 'webkitAnimationEnd',
7080        msAnimation: 'msAnimationEnd'
7081      };
7082
7083      for (var t in animations) {
7084        if (el.style[t] !== undefined) {
7085          animation = animations[t];
7086        }
7087      }
7088
7089      KTUtil.one(el, animation, callback);
7090    },
7091
7092    animateDelay: function (el, value) {
7093      var vendors = ['webkit-', 'moz-', 'ms-', 'o-', ''];
7094      for (var i = 0; i < vendors.length; i++) {
7095        KTUtil.css(el, vendors[i] + 'animation-delay', value);
7096      }
7097    },
7098
7099    animateDuration: function (el, value) {
7100      var vendors = ['webkit-', 'moz-', 'ms-', 'o-', ''];
7101      for (var i = 0; i < vendors.length; i++) {
7102        KTUtil.css(el, vendors[i] + 'animation-duration', value);
7103      }
7104    },
7105
7106    scrollTo: function (target, offset, duration) {
7107      var duration = duration ? duration : 500;
7108      var targetPos = target ? KTUtil.offset(target).top : 0;
7109      var scrollPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
7110      var from, to;
7111
7112      if (offset) {
7113        targetPos = targetPos - offset;
7114      }
7115
7116      from = scrollPos;
7117      to = targetPos;
7118
7119      KTUtil.animate(from, to, duration, function (value) {
7120        document.documentElement.scrollTop = value;
7121        document.body.parentNode.scrollTop = value;
7122        document.body.scrollTop = value;
7123      }); //, easing, done
7124    },
7125
7126    scrollTop: function (offset, duration) {
7127      KTUtil.scrollTo(null, offset, duration);
7128    },
7129
7130    isArray: function (obj) {
7131      return obj && Array.isArray(obj);
7132    },
7133
7134    isEmpty: function (obj) {
7135      for (var prop in obj) {
7136        if (obj.hasOwnProperty(prop)) {
7137          return false;
7138        }
7139      }
7140
7141      return true;
7142    },
7143
7144    numberString: function (nStr) {
7145      nStr += '';
7146      var x = nStr.split('.');
7147      var x1 = x[0];
7148      var x2 = x.length > 1 ? '.' + x[1] : '';
7149      var rgx = /(\d+)(\d{3})/;
7150      while (rgx.test(x1)) {
7151        x1 = x1.replace(rgx, '$1' + ',' + '$2');
7152      }
7153      return x1 + x2;
7154    },
7155
7156    isRTL: function () {
7157      return (document.querySelector('html').getAttribute("direction") === 'rtl');
7158    },
7159
7160    snakeToCamel: function (s) {
7161      return s.replace(/(\-\w)/g, function (m) { return m[1].toUpperCase(); });
7162    },
7163
7164    filterBoolean: function (val) {
7165      // Convert string boolean
7166      if (val === true || val === 'true') {
7167        return true;
7168      }
7169
7170      if (val === false || val === 'false') {
7171        return false;
7172      }
7173
7174      return val;
7175    },
7176
7177    setHTML: function (el, html) {
7178      el.innerHTML = html;
7179    },
7180
7181    getHTML: function (el) {
7182      if (el) {
7183        return el.innerHTML;
7184      }
7185    },
7186
7187    getDocumentHeight: function () {
7188      var body = document.body;
7189      var html = document.documentElement;
7190
7191      return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
7192    },
7193
7194    getScrollTop: function () {
7195      return (document.scrollingElement || document.documentElement).scrollTop;
7196    },
7197
7198    colorLighten: function (color, amount) {
7199      const addLight = function (color, amount) {
7200        let cc = parseInt(color, 16) + amount;
7201        let c = (cc > 255) ? 255 : (cc);
7202        c = (c.toString(16).length > 1) ? c.toString(16) : `0${c.toString(16)}`;
7203        return c;
7204      }
7205
7206      color = (color.indexOf("#") >= 0) ? color.substring(1, color.length) : color;
7207      amount = parseInt((255 * amount) / 100);
7208
7209      return color = `#${addLight(color.substring(0, 2), amount)}${addLight(color.substring(2, 4), amount)}${addLight(color.substring(4, 6), amount)}`;
7210    },
7211
7212    colorDarken: function (color, amount) {
7213      const subtractLight = function (color, amount) {
7214        let cc = parseInt(color, 16) - amount;
7215        let c = (cc < 0) ? 0 : (cc);
7216        c = (c.toString(16).length > 1) ? c.toString(16) : `0${c.toString(16)}`;
7217
7218        return c;
7219      }
7220
7221      color = (color.indexOf("#") >= 0) ? color.substring(1, color.length) : color;
7222      amount = parseInt((255 * amount) / 100);
7223
7224      return color = `#${subtractLight(color.substring(0, 2), amount)}${subtractLight(color.substring(2, 4), amount)}${subtractLight(color.substring(4, 6), amount)}`;
7225    },
7226
7227    // Throttle function: Input as function which needs to be throttled and delay is the time interval in milliseconds
7228    throttle: function (timer, func, delay) {
7229      // If setTimeout is already scheduled, no need to do anything
7230      if (timer) {
7231        return;
7232      }
7233
7234      // Schedule a setTimeout after delay seconds
7235      timer = setTimeout(function () {
7236        func();
7237
7238        // Once setTimeout function execution is finished, timerId = undefined so that in <br>
7239        // the next scroll event function execution can be scheduled by the setTimeout
7240        timer = undefined;
7241      }, delay);
7242    },
7243
7244    // Debounce function: Input as function which needs to be debounced and delay is the debounced time in milliseconds
7245    debounce: function (timer, func, delay) {
7246      // Cancels the setTimeout method execution
7247      clearTimeout(timer)
7248
7249      // Executes the func after delay time.
7250      timer = setTimeout(func, delay);
7251    },
7252
7253    parseJson: function (value) {
7254      if (typeof value === 'string') {
7255        value = value.replace(/'/g, "\"");
7256
7257        var jsonStr = value.replace(/(\w+:)|(\w+ :)/g, function (matched) {
7258          return '"' + matched.substring(0, matched.length - 1) + '":';
7259        });
7260
7261        try {
7262          value = JSON.parse(jsonStr);
7263        } catch (e) { }
7264      }
7265
7266      return value;
7267    },
7268
7269    getResponsiveValue: function (value, defaultValue) {
7270      var width = this.getViewPort().width;
7271      var result = null;
7272
7273      value = KTUtil.parseJson(value);
7274
7275      if (typeof value === 'object') {
7276        var resultKey;
7277        var resultBreakpoint = -1;
7278        var breakpoint;
7279
7280        for (var key in value) {
7281          if (key === 'default') {
7282            breakpoint = 0;
7283          } else {
7284            breakpoint = this.getBreakpoint(key) ? this.getBreakpoint(key) : parseInt(key);
7285          }
7286
7287          if (breakpoint <= width && breakpoint > resultBreakpoint) {
7288            resultKey = key;
7289            resultBreakpoint = breakpoint;
7290          }
7291        }
7292
7293        if (resultKey) {
7294          result = value[resultKey];
7295        } else {
7296          result = value;
7297        }
7298      } else {
7299        result = value;
7300      }
7301
7302      return result;
7303    },
7304
7305    each: function (array, callback) {
7306      return [].slice.call(array).map(callback);
7307    },
7308
7309    getSelectorMatchValue: function (value) {
7310      var result = null;
7311      value = KTUtil.parseJson(value);
7312
7313      if (typeof value === 'object') {
7314        // Match condition
7315        if (value['match'] !== undefined) {
7316          var selector = Object.keys(value['match'])[0];
7317          value = Object.values(value['match'])[0];
7318
7319          if (document.querySelector(selector) !== null) {
7320            result = value;
7321          }
7322        }
7323      } else {
7324        result = value;
7325      }
7326
7327      return result;
7328    },
7329
7330    getConditionalValue: function (value) {
7331      var value = KTUtil.parseJson(value);
7332      var result = KTUtil.getResponsiveValue(value);
7333
7334      if (result !== null && result['match'] !== undefined) {
7335        result = KTUtil.getSelectorMatchValue(result);
7336      }
7337
7338      if (result === null && value !== null && value['default'] !== undefined) {
7339        result = value['default'];
7340      }
7341
7342      return result;
7343    },
7344
7345    getCssVariableValue: function (variableName) {
7346      var hex = getComputedStyle(document.documentElement).getPropertyValue(variableName);
7347      if (hex && hex.length > 0) {
7348        hex = hex.trim();
7349      }
7350
7351      return hex;
7352    },
7353
7354    isInViewport: function (element) {
7355      var rect = element.getBoundingClientRect();
7356
7357      return (
7358        rect.top >= 0 &&
7359        rect.left >= 0 &&
7360        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
7361        rect.right <= (window.innerWidth || document.documentElement.clientWidth)
7362      );
7363    },
7364
7365    isPartiallyInViewport: function (element) {
7366      let x = element.getBoundingClientRect().left;
7367      let y = element.getBoundingClientRect().top;
7368      let ww = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
7369      let hw = Math.max(document.documentElement.clientHeight, window.innerHeight || 0
7369);
7370      let w = element.clientWidth;
7371      let h = element.clientHeight;
7372
7373      return (
7374        (y < hw &&
7375          y + h > 0) &&
7376        (x < ww &&
7377          x + w > 0)
7378      );
7379    },
7380
7381    onDOMContentLoaded: function (callback) {
7382      if (document.readyState === 'loading') {
7383        document.addEventListener('DOMContentLoaded', callback);
7384        document.addEventListener('livewire:navigated', callback);
7385      } else {
7386        callback();
7387      }
7388    },
7389
7390    inIframe: function () {
7391      try {
7392        return window.self !== window.top;
7393      } catch (e) {
7394        return true;
7395      }
7396    },
7397
7398    isHexColor(code) {
7399      return /^#[0-9A-F]{6}$/i.test(code);
7400    }
7401  }
7402}();
7403
7404// Webpack support
7405if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
7406  module.exports = KTUtil;
7407}
7408"use strict";
7409
7410// Class definition
7411var KTAppLayoutBuilder = function () {
7412  var form;
7413  var actionInput;
7414  var url;
7415  var previewButton;
7416  var exportButton;
7417  var resetButton;
7418
7419  var engage;
7420  var engageToggleOff;
7421  var engageToggleOn;
7422  var engagePrebuiltsModal;
7423
7424  var handleEngagePrebuilts = function () {
7425    if (engagePrebuiltsModal === null) {
7426      return;
7427    }
7428
7429    if (KTCookie.get("app_engage_prebuilts_modal_displayed") !== "1") {
7430      setTimeout(function () {
7431        const modal = new bootstrap.Modal(engagePrebuiltsModal);
7432        modal.show();
7433
7434        const date = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); // 30 days from now
7435        KTCookie.set("app_engage_prebuilts_modal_displayed", "1", { expires: date });
7436      }, 3000);
7437    }
7438  }
7439
7440  var handleEngagePrebuiltsViewMenu = function () {
7441    const selected = engagePrebuiltsModal.querySelector('[data-kt-element="selected"]');
7442    const selectedTitle = engagePrebuiltsModal.querySelector('[data-kt-element="title"]');
7443    const menu = engagePrebuiltsModal.querySelector('[data-kt-menu="true"]');
7444
7445    // Toggle Handler
7446    KTUtil.on(engagePrebuiltsModal, '[data-kt-mode]', 'click', function (e) {
7447      const title = this.innerText;
7448      const mode = this.getAttribute("data-kt-mode");
7449      const selectedLink = menu.querySelector('.menu-link.active');
7450      const viewImage = document.querySelector('#kt_app_engage_prebuilts_view_image');
7451      const viewText = document.querySelector('#kt_app_engage_prebuilts_view_text');
7452      selectedTitle.innerText = title;
7453
7454      if (selectedLink) {
7455        selectedLink.classList.remove('active');
7456      }
7457
7458      this.classList.add('active');
7459
7460      if (mode === "image") {
7461        viewImage.classList.remove("d-none");
7462        viewImage.classList.add("d-block");
7463        viewText.classList.remove("d-block");
7464        viewText.classList.add("d-none");
7465      } else {
7466        viewText.classList.remove("d-none");
7467        viewText.classList.add("d-block");
7468        viewImage.classList.remove("d-block");
7469        viewImage.classList.add("d-none");
7470      }
7471    });
7472  }
7473
7474  var handleEngageToggle = function () {
7475    engageToggleOff.addEventListener("click", function (e) {
7476      e.preventDefault();
7477
7478      const date = new Date(Date.now() + 1 * 24 * 60 * 60 * 1000); // 1 days from now
7479      KTCookie.set("app_engage_hide", "1", { expires: date });
7480      engage.classList.add('app-engage-hide');
7481    });
7482
7483    engageToggleOn.addEventListener("click", function (e) {
7484      e.preventDefault();
7485
7486      KTCookie.remove("app_engage_hide");
7487      engage.classList.remove('app-engage-hide');
7488    });
7489  }
7490
7491  var handlePreview = function () {
7492    previewButton.addEventListener("click", function (e) {
7493      e.preventDefault();
7494
7495      // Set form action value
7496      actionInput.value = "preview";
7497
7498      // Show progress
7499      previewButton.setAttribute("data-kt-indicator", "on");
7500
7501      // Prepare form data
7502      var data = $(form).serialize();
7503
7504      // Submit
7505      $.ajax({
7506        type: "POST",
7507        dataType: "html",
7508        url: url,
7509        data: data,
7510        success: function (response, status, xhr) {
7511          if (history.scrollRestoration) {
7512            history.scrollRestoration = 'manual';
7513          }
7514          location.reload();
7515          return;
7516
7517          toastr.success(
7518            "Preview has been updated with current configured layout.",
7519            "Preview updated!",
7520            { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 }
7521          );
7522
7523          setTimeout(function () {
7524            location.reload(); // reload page
7525          }, 1500);
7526        },
7527        error: function (response) {
7528          toastr.error(
7529            "Please try it again later.",
7530            "Something went wrong!",
7531            { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 }
7532          );
7533        },
7534        complete: function () {
7535          previewButton.removeAttribute("data-kt-indicator");
7536        }
7537      });
7538    });
7539  };
7540
7541  var handleExport = function () {
7542    exportButton.addEventListener("click", function (e) {
7543      e.preventDefault();
7544
7545      toastr.success(
7546        "Process has been started and it may take a while.",
7547        "Generating HTML!",
7548        { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 }
7549      );
7550
7551      // Show progress
7552      exportButton.setAttribute("data-kt-indicator", "on");
7553
7554      // Set form action value
7555      actionInput.value = "export";
7556
7557      // Prepare form data
7558      var data = $(form).serialize();
7559
7560      $.ajax({
7561        type: "POST",
7562        dataType: "html",
7563        url: url,
7564        data: data,
7565        success: function (response, status, xhr) {
7566          var timer = setInterval(function () {
7567            $("<iframe/>").attr({
7568              src: url + "?layout-builder[action]=export&download=1&output=" + response,
7569              style: "visibility:hidden;display:none",
7570            }).ready(function () {
7571              // Stop the timer
7572              clearInterval(timer);
7573
7574              exportButton.removeAttribute("data-kt-indicator");
7575            }).appendTo("body");
7576          }, 3000);
7577        },
7578        error: function (response) {
7579          toastr.error(
7580            "Please try it again later.",
7581            "Something went wrong!",
7582            { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 }
7583          );
7584
7585          exportButton.removeAttribute("data-kt-indicator");
7586        },
7587      });
7588    });
7589  };
7590
7591  var handleReset = function () {
7592    resetButton.addEventListener("click", function (e) {
7593      e.preventDefault();
7594
7595      // Show progress
7596      resetButton.setAttribute("data-kt-indicator", "on");
7597
7598      // Set form action value
7599      actionInput.value = "reset";
7600
7601      // Prepare form data
7602      var data = $(form).serialize();
7603
7604      $.ajax({
7605        type: "POST",
7606        dataType: "html",
7607        url: url,
7608        data: data,
7609        success: function (response, status, xhr) {
7610          if (history.scrollRestoration) {
7611            history.scrollRestoration = 'manual';
7612          }
7613
7614          location.reload();
7615          return;
7616
7617          toastr.success(
7618            "Preview has been successfully reset and the page will be reloaded.",
7619            "Reset Preview!",
7620            { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 }
7621          );
7622
7623          setTimeout(function () {
7624            location.reload(); // reload page
7625          }, 1500);
7626        },
7627        error: function (response) {
7628          toastr.error(
7629            "Please try it again later.",
7630            "Something went wrong!",
7631            { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 }
7632          );
7633        },
7634        complete: function () {
7635          resetButton.removeAttribute("data-kt-indicator");
7636        },
7637      });
7638    });
7639  };
7640
7641  var handleThemeMode = function () {
7642    var checkLight = document.querySelector('#kt_layout_builder_theme_mode_light');
7643    var checkDark = document.querySelector('#kt_layout_builder_theme_mode_dark');
7644    var check = document.querySelector('#kt_layout_builder_theme_mode_' + KTThemeMode.getMode());
7645
7646    if (checkLight) {
7647      checkLight.addEventListener("click", function () {
7648        this.checked = true;
7649        this.closest('[data-kt-buttons="true"]').querySelector('.form-check-image.active').classList.remove('active');
7650        this.closest('.form-check-image').classList.add('active');
7651        KTThemeMode.setMode('light');
7652      });
7653    }
7654
7655    if (checkDark) {
7656      checkDark.addEventListener("click", function () {
7657        this.checked = true;
7658        this.closest('[data-kt-buttons="true"]').querySelector('.form-check-image.active').classList.remove('active');
7659        this.closest('.form-check-image').classList.add('active');
7660        KTThemeMode.setMode('dark');
7661      });
7662    }
7663
7664    if (check) {
7665      check.closest('.form-check-image').classList.add('active');
7666      check.checked = true;
7667    }
7668  }
7669
7670  return {
7671    // Public functions
7672    init: function () {
7673      engage = document.querySelector('#kt_app_engage');
7674      engageToggleOn = document.querySelector('#kt_app_engage_toggle_on');
7675      engageToggleOff = document.querySelector('#kt_app_engage_toggle_off');
7676      engagePrebuiltsModal = document.querySelector('#kt_app_engage_prebuilts_modal');
7677
7678      if (engage && engagePrebuiltsModal) {
7679        handleEngagePrebuilts();
7680        handleEngagePrebuiltsViewMenu();
7681      }
7682
7683      if (engage && engageToggleOn && engageToggleOff) {
7684        handleEngageToggle();
7685      }
7686
7687      form = document.querySelector("#kt_app_layout_builder_form");
7688
7689      if (!form) {
7690        return;
7691      }
7692
7693      url = form.getAttribute("action");
7694      actionInput = document.querySelector("#kt_app_layout_builder_action");
7695      previewButton = document.querySelector("#kt_app_layout_builder_preview");
7696      exportButton = document.querySelector("#kt_app_layout_builder_export");
7697      resetButton = document.querySelector("#kt_app_layout_builder_reset");
7698
7699      if (previewButton) {
7700        handlePreview();
7701      }
7702
7703      if (exportButton) {
7704        handleExport();
7705      }
7706
7707      if (resetButton) {
7708        handleReset();
7709      }
7710
7711      handleThemeMode();
7712    }
7713  };
7714}();
7715
7716// On document ready
7717KTUtil.onDOMContentLoaded(function () {
7718  KTAppLayoutBuilder.init();
7719});
7720"use strict";
7721
7722// Class definition
7723var KTLayoutSearch = function () {
7724  // Private variables
7725  var element;
7726  var formElement;
7727  var mainElement;
7728  var resultsElement;
7729  var wrapperElement;
7730  var emptyElement;
7731
7732  var preferencesElement;
7733  var preferencesShowElement;
7734  var preferencesDismissElement;
7735
7736  var advancedOptionsFormElement;
7737  var advancedOptionsFormShowElement;
7738  var advancedOptionsFormCancelElement;
7739  var advancedOptionsFormSearchElement;
7740
7741  var searchObject;
7742
7743  // Private functions
7744  var processs = function (search) {
7745    var timeout = setTimeout(function () {
7746      var number = KTUtil.getRandomInt(1, 3);
7747
7748      // Hide recently viewed
7749      mainElement.classList.add('d-none');
7750
7751      if (number === 3) {
7752        // Hide results
7753        resultsElement.classList.add('d-none');
7754        // Show empty message 
7755        emptyElement.classList.remove('d-none');
7756      } else {
7757        // Show results
7758        resultsElement.classList.remove('d-none');
7759        // Hide empty message 
7760        emptyElement.classList.add('d-none');
7761      }
7762
7763      // Complete search
7764      search.complete();
7765    }, 1500);
7766  }
7767
7768  var processsAjax = function (search) {
7769    // Hide recently viewed
7770    mainElement.classList.add('d-none');
7771
7772    // Learn more: https://axios-http.com/docs/intro
7773    axios.post('/search.php', {
7774      query: searchObject.getQuery()
7775    })
7776      .then(function (response) {
7777        // Populate results
7778        resultsElement.innerHTML = response;
7779        // Show results
7780        resultsElement.classList.remove('d-none');
7781        // Hide empty message 
7782        emptyElement.classList.add('d-none');
7783
7784        // Complete search
7785        search.complete();
7786      })
7787      .catch(function (error) {
7788        // Hide results
7789        resultsElement.classList.add('d-none');
7790        // Show empty message 
7791        emptyElement.classList.remove('d-none');
7792
7793        // Complete search
7794        search.complete();
7795      });
7796  }
7797
7798  var clear = function (search) {
7799    // Show recently viewed
7800    mainElement.classList.remove('d-none');
7801    // Hide results
7802    resultsElement.classList.add('d-none');
7803    // Hide empty message 
7804    emptyElement.classList.add('d-none');
7805  }
7806
7807  var handlePreferences = function () {
7808    // Preference show handler
7809    if (preferencesShowElement) {
7810      preferencesShowElement.addEventListener('click', function () {
7811        wrapperElement.classList.add('d-none');
7812        preferencesElement.classList.remove('d-none');
7813      });
7814    }
7815
7816    // Preference dismiss handler
7817    if (preferencesDismissElement) {
7818      preferencesDismissElement.addEventListener('click', function () {
7819        wrapperElement.classList.remove('d-none');
7820        preferencesElement.classList.add('d-none');
7821      });
7822    }
7823  }
7824
7825  var handleAdvancedOptionsForm = function () {
7826    // Show
7827    if (advancedOptionsFormShowElement) {
7828      advancedOptionsFormShowElement.addEventListener('click', function () {
7829        wrapperElement.classList.add('d-none');
7830        advancedOptionsFormElement.classList.remove('d-none');
7831      });
7832    }
7833
7834    // Cancel
7835    if (advancedOptionsFormCancelElement) {
7836      advancedOptionsFormCancelElement.addEventListener('click', function () {
7837        wrapperElement.classList.remove('d-none');
7838        advancedOptionsFormElement.classList.add('d-none');
7839      });
7840    }
7841  }
7842
7843  // Public methods
7844  return {
7845    init: function () {
7846      // Elements
7847      element = document.querySelector('#kt_header_search');
7848
7849      if (!element) {
7850        return;
7851      }
7852
7853      wrapperElement = element.querySelector('[data-kt-search-element="wrapper"]');
7854      formElement = element.querySelector('[data-kt-search-element="form"]');
7855      mainElement = element.querySelector('[data-kt-search-element="main"]');
7856      resultsElement = element.querySelector('[data-kt-search-element="results"]');
7857      emptyElement = element.querySelector('[data-kt-search-element="empty"]');
7858
7859      preferencesElement = element.querySelector('[data-kt-search-element="preferences"]');
7860      preferencesShowElement = element.querySelector('[data-kt-search-element="preferences-show"]');
7861      preferencesDismissElement = element.querySelector('[data-kt-search-element="preferences-dismiss"]');
7862
7863      advancedOptionsFormElement = element.querySelector('[data-kt-search-element="advanced-options-form"]');
7864      advancedOptionsFormShowElement = element.querySelector('[data-kt-search-element="advanced-options-form-show"]');
7865      advancedOptionsFormCancelElement = element.querySelector('[data-kt-search-element="advanced-options-form-cancel"]');
7866      advancedOptionsFormSearchElement = element.querySelector('[data-kt-search-element="advanced-options-form-search"]');
7867
7868      // Initialize search handler
7869      searchObject = new KTSearch(element);
7870
7871      // Demo search handler
7872      searchObject.on('kt.search.process', processs);
7873
7874      // Ajax search handler
7875      //searchObject.on('kt.search.process', processsAjax);
7876
7877      // Clear handler
7878      searchObject.on('kt.search.clear', clear);
7879
7880      // Custom handlers
7881      if (preferencesElement) {
7882        handlePreferences();
7883      }
7884
7885      if (advancedOptionsFormElement) {
7886        handleAdvancedOptionsForm();
7887      }
7888    }
7889  };
7890}();
7891
7892// On document ready
7893KTUtil.onDOMContentLoaded(function () {
7894  KTLayoutSearch.init();
7895});
7896"use strict";
7897
7898// Class definition
7899var KTThemeModeUser = function () {
7900
7901  var handleSubmit = function () {
7902    // Update chart on theme mode change
7903    KTThemeMode.on("kt.thememode.change", function () {
7904      var menuMode = KTThemeMode.getMenuMode();
7905      var mode = KTThemeMode.getMode();
7906      console.log("user selected theme mode:" + menuMode);
7907      console.log("theme mode:" + mode);
7908
7909      // Submit selected theme mode menu option via ajax and 
7910      // store it in user profile and set the user opted theme mode via HTML attribute
7911      // <html data-theme-mode="light"> .... </html>
7912    });
7913  }
7914
7915  return {
7916    init: function () {
7917      handleSubmit();
7918    }
7919  };
7920}();
7921
7922// Initialize app on document ready
7923KTUtil.onDOMContentLoaded(function () {
7924  KTThemeModeUser.init();
7925});
7926
7927// Declare KTThemeModeUser for Webpack support
7928if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
7929  module.exports = KTThemeModeUser;
7930}
7931"use strict";
7932
7933// Class definition
7934var KTThemeMode = function () {
7935  var menu;
7936  var callbacks = [];
7937  var the = this;
7938
7939  var getMode = function () {
7940    var mode;
7941
7942    if (document.documentElement.hasAttribute("data-bs-theme")) {
7943      return document.documentElement.getAttribute("data-bs-theme");
7944    } else if (localStorage.getItem("data-bs-theme") !== null) {
7945      return localStorage.getItem("data-bs-theme");
7946    } else if (getMenuMode() === "system") {
7947      return getSystemMode();
7948    }
7949
7950    return "light";
7951  }
7952
7953  var setMode = function (mode, menuMode) {
7954    var currentMode = getMode();
7955
7956    // Reset mode if system mode was changed
7957    if (menuMode === 'system') {
7958      if (getSystemMode() !== mode) {
7959        mode = getSystemMode();
7960      }
7961    } else if (mode !== menuMode) {
7962      menuMode = mode;
7963    }
7964
7965    // Read active menu mode value
7966    var activeMenuItem = menu ? menu.querySelector('[data-kt-element="mode"][data-kt-value="' + menuMode + '"]') : null;
7967
7968    // Enable switching state
7969    document.documentElement.setAttribute("data-kt-theme-mode-switching", "true");
7970
7971    // Set mode to the target document.documentElement
7972    document.documentElement.setA
7972ttribute("data-bs-theme", mode);
7973
7974    // Disable switching state
7975    setTimeout(function () {
7976      document.documentElement.removeAttribute("data-kt-theme-mode-switching");
7977    }, 300);
7978
7979    // Store mode value in storage
7980    localStorage.setItem("data-bs-theme", mode);
7981
7982    // Set active menu item
7983    if (activeMenuItem) {
7984      localStorage.setItem("data-bs-theme-mode", menuMode);
7985      setActiveMenuItem(activeMenuItem);
7986    }
7987
7988    if (mode !== currentMode) {
7989      KTEventHandler.trigger(document.documentElement, 'kt.thememode.change', the);
7990    }
7991  }
7992
7993  var getMenuMode = function () {
7994    if (!menu) {
7995      return null;
7996    }
7997
7998    var menuItem = menu ? menu.querySelector('.active[data-kt-element="mode"]') : null;
7999
8000    if (menuItem && menuItem.getAttribute('data-kt-value')) {
8001      return menuItem.getAttribute('data-kt-value');
8002    } else if (document.documentElement.hasAttribute("data-bs-theme-mode")) {
8003      return document.documentElement.getAttribute("data-bs-theme-mode")
8004    } else if (localStorage.getItem("data-bs-theme-mode") !== null) {
8005      return localStorage.getItem("data-bs-theme-mode");
8006    } else {
8007      return typeof defaultThemeMode !== "undefined" ? defaultThemeMode : "light";
8008    }
8009  }
8010
8011  var getSystemMode = function () {
8012    return window.matchMedia('(prefers-color-scheme: dark)').matches ? "dark" : "light";
8013  }
8014
8015  var initMode = function () {
8016    setMode(getMode(), getMenuMode());
8017    KTEventHandler.trigger(document.documentElement, 'kt.thememode.init', the);
8018  }
8019
8020  var getActiveMenuItem = function () {
8021    return menu.querySelector('[data-kt-element="mode"][data-kt-value="' + getMenuMode() + '"]');
8022  }
8023
8024  var setActiveMenuItem = function (item) {
8025    var menuMode = item.getAttribute("data-kt-value");
8026
8027    var activeItem = menu.querySelector('.active[data-kt-element="mode"]');
8028
8029    if (activeItem) {
8030      activeItem.classList.remove("active");
8031    }
8032
8033    item.classList.add("active");
8034    localStorage.setItem("data-bs-theme-mode", menuMode);
8035  }
8036
8037  var handleMenu = function () {
8038    var items = [].slice.call(menu.querySelectorAll('[data-kt-element="mode"]'));
8039
8040    items.map(function (item) {
8041      item.addEventListener("click", function (e) {
8042        e.preventDefault();
8043
8044        var menuMode = item.getAttribute("data-kt-value");
8045        var mode = menuMode;
8046
8047        if (menuMode === "system") {
8048          mode = getSystemMode();
8049        }
8050
8051        setMode(mode, menuMode);
8052      });
8053    });
8054  }
8055
8056  return {
8057    init: function () {
8058      menu = document.querySelector('[data-kt-element="theme-mode-menu"]');
8059
8060      initMode();
8061
8062      if (menu) {
8063        handleMenu();
8064      }
8065    },
8066
8067    getMode: function () {
8068      return getMode();
8069    },
8070
8071    getMenuMode: function () {
8072      return getMenuMode();
8073    },
8074
8075    getSystemMode: function () {
8076      return getSystemMode();
8077    },
8078
8079    setMode: function (mode) {
8080      return setMode(mode)
8081    },
8082
8083    on: function (name, handler) {
8084      return KTEventHandler.on(document.documentElement, name, handler);
8085    },
8086
8087    off: function (name, handlerId) {
8088      return KTEventHandler.off(document.documentElement, name, handlerId);
8089    }
8090  };
8091}();
8092
8093// Initialize app on document ready
8094KTUtil.onDOMContentLoaded(function () {
8095  KTThemeMode.init();
8096});
8097
8098// Declare KTThemeMode for Webpack support
8099if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
8100  module.exports = KTThemeMode;
8101}
8102"use strict";
8103
8104// Class definition
8105var KTAppSidebar = function () {
8106  // Private variables
8107  var toggle;
8108  var sidebar;
8109  var headerMenu;
8110  var menuDashboardsCollapse;
8111  var menuScroll;
8112  var toggle;
8113
8114  // Private functions
8115  // Handle sidebar minimize mode toggle
8116  var handleToggle = function () {
8117    var toggleObj = KTToggle.getInstance(toggle);
8118    var headerMenuObj = KTMenu.getInstance(headerMenu);
8119
8120    if (toggleObj === null) {
8121      return;
8122    }
8123
8124    // Add a class to prevent sidebar hover effect after toggle click
8125    toggleObj.on('kt.toggle.change', function () {
8126      // Set animation state
8127      sidebar.classList.add('animating');
8128
8129      // Wait till animation finishes
8130      setTimeout(function () {
8131        // Remove animation state
8132        sidebar.classList.remove('animating');
8133      }, 300);
8134
8135      // Prevent header menu dropdown display on hover
8136      if (headerMenuObj) {
8137        headerMenuObj.disable();
8138
8139        // Timeout to enable header menu 
8140        setTimeout(function () {
8141          headerMenuObj.enable();
8142        }, 1000);
8143      }
8144    });
8145
8146    // Store sidebar minimize state in cookie
8147    toggleObj.on('kt.toggle.changed', function () {
8148      // In server side check sidebar_minimize_state cookie 
8149      // value and add data-kt-app-sidebar-minimize="on" 
8150      // attribute to Body tag and "active" class to the toggle button
8151      var date = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); // 30 days from now
8152
8153      KTCookie.set("sidebar_minimize_state", toggleObj.isEnabled() ? "on" : "off", { expires: date });
8154    });
8155  }
8156
8157  // Handle dashboards menu items collapse mode
8158  var handleShowMore = function () {
8159    menuDashboardsCollapse.addEventListener('hide.bs.collapse', event => {
8160      menuScroll.scrollTo({
8161        top: 0,
8162        behavior: 'instant'
8163      });
8164    });
8165  }
8166
8167  var handleMenuScroll = function () {
8168    var menuActiveItem = menuScroll.querySelector(".menu-link.active");
8169
8170    if (!menuActiveItem) {
8171      return;
8172    }
8173
8174    if (KTUtil.isVisibleInContainer(menuActiveItem, menuScroll) === true) {
8175      return;
8176    }
8177
8178    menuScroll.scroll({
8179      top: KTUtil.getRelativeTopPosition(menuActiveItem, menuScroll),
8180      behavior: 'smooth'
8181    });
8182  }
8183
8184  // Public methods
8185  return {
8186    init: function () {
8187      // Elements
8188      sidebar = document.querySelector('#kt_app_sidebar');
8189      toggle = document.querySelector('#kt_app_sidebar_toggle');
8190      headerMenu = document.querySelector('#kt_app_header_menu');
8191      menuDashboardsCollapse = document.querySelector('#kt_app_sidebar_menu_dashboards_collapse');
8192      menuScroll = document.querySelector('#kt_app_sidebar_menu_scroll');
8193
8194      if (sidebar === null) {
8195        return;
8196      }
8197
8198      if (toggle) {
8199        handleToggle();
8200      }
8201
8202      if (menuScroll) {
8203        handleMenuScroll();
8204      }
8205
8206      if (menuDashboardsCollapse) {
8207        handleShowMore();
8208      }
8209    }
8210  };
8211}();
8212
8213// On document ready
8214KTUtil.onDOMContentLoaded(function () {
8215  KTAppSidebar.init();
8216});
8217"use strict";
8218
8219// Class definition
8220var KTLayoutToolbar = function () {
8221  // Private variables
8222  var toolbar;
8223
8224  // Private functions
8225  var initForm = function () {
8226    var rangeSlider = document.querySelector("#kt_app_toolbar_slider");
8227    var rangeSliderValueElement = document.querySelector("#kt_app_toolbar_slider_value");
8228
8229    if (!rangeSlider) {
8230      return;
8231    }
8232
8233    noUiSlider.create(rangeSlider, {
8234      start: [5],
8235      connect: [true, false],
8236      step: 1,
8237      format: wNumb({
8238        decimals: 1
8239      }),
8240      range: {
8241        min: [1],
8242        max: [10]
8243      }
8244    });
8245
8246    rangeSlider.noUiSlider.on("update", function (values, handle) {
8247      rangeSliderValueElement.innerHTML = values[handle];
8248    });
8249
8250    var handle = rangeSlider.querySelector(".noUi-handle");
8251
8252    handle.setAttribute("tabindex", 0);
8253
8254    handle.addEventListener("click", function () {
8255      this.focus();
8256    });
8257
8258    handle.addEventListener("keydown", function (event) {
8259      var value = Number(rangeSlider.noUiSlider.get());
8260
8261      switch (event.which) {
8262        case 37:
8263          rangeSlider.noUiSlider.set(value - 1);
8264          break;
8265        case 39:
8266          rangeSlider.noUiSlider.set(value + 1);
8267          break;
8268      }
8269    });
8270  }
8271
8272  // Public methods
8273  return {
8274    init: function () {
8275      // Elements
8276      toolbar = document.querySelector('#kt_app_toolbar');
8277
8278      if (!toolbar) {
8279        return;
8280      }
8281
8282      initForm();
8283    }
8284  };
8285}();
8286
8287// On document ready
8288KTUtil.onDOMContentLoaded(function () {
8289  KTLayoutToolbar.init();
8290});
8291

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.