PageSourceSearch

https://store251.com/public/assets/js/aiz-core.js?v=9350

js store251.com collected 2026-10-02 00:33:41 UTC 147,589 bytes, 3,699 lines download raw bytes

1//custom jquery method for toggle attr
2$.fn.toggleAttr = function (attr, attr1, attr2) {
3    return this.each(function () {
4        var self = $(this);
5        if (self.attr(attr) == attr1) self.attr(attr, attr2);
6        else self.attr(attr, attr1);
7    });
8};
9(function ($) {
10    // USE STRICT
11    "use strict";
12
13    AIZ.data = {
14        csrf: $('meta[name="csrf-token"]').attr("content"),
15        appUrl: $('meta[name="app-url"]').attr("content"),
16        fileBaseUrl: $('meta[name="file-base-url"]').attr("content"),
17    };
18    AIZ.uploader = {
19        data: {
20            selectedFiles: [],
21            selectedFilesObject: [],
22            clickedForDelete: null,
23            allFiles: [],
24            multiple: false,
25            type: "all",
26            next_page_url: null,
27            prev_page_url: null,
28        },
29        removeInputValue: function (id, array, elem) {
30            var selected = array.filter(function (item) {
31                return item !== id;
32            });
33            if (selected.length > 0) {
34                $(elem)
35                    .find(".file-amount")
36                    .html(AIZ.uploader.updateFileHtml(selected));
37            } else {
38                elem.find(".file-amount").html(AIZ.local.choose_file);
39            }
40            $(elem).find(".selected-files").val(selected);
41        },
42        removeAttachment: function () {
43            $(document).on("click", ".remove-attachment", function () {
44                var value = $(this).closest(".file-preview-item").data("id");
45                var selected = $(this)
46                    .closest(".file-preview")
47                    .prev('[data-toggle="aizuploader"]')
48                    .find(".selected-files")
49                    .val()
50                    .split(",")
51                    .map(Number);
52
53                AIZ.uploader.removeInputValue(
54                    value,
55                    selected,
56                    $(this)
57                        .closest(".file-preview")
58                        .prev('[data-toggle="aizuploader"]')
59                );
60                $(this).closest(".file-preview-item").remove();
61            });
62        },
63        deleteUploaderFile: function () {
64            $(".aiz-uploader-delete").each(function () {
65                $(this).on("click", function (e) {
66                    e.preventDefault();
67                    var id = $(this).data("id");
68                    AIZ.uploader.data.clickedForDelete = id;
69                    $("#aizUploaderDelete").modal("show");
70
71                    $(".aiz-uploader-confirmed-delete").on(
72                        "click",
73                        function (e) {
74                            e.preventDefault();
75                            if (e.detail === 1) {
76                                var clickedForDeleteObject =
77                                    AIZ.uploader.data.allFiles[
78                                        AIZ.uploader.data.allFiles.findIndex(
79                                            (x) =>
80                                                x.id ===
81                                                AIZ.uploader.data
82                                                    .clickedForDelete
83                                        )
84                                    ];
85                                $.ajax({
86                                    url:
87                                        AIZ.data.appUrl +
88                                        "/aiz-uploader/destroy/" +
89                                        AIZ.uploader.data.clickedForDelete,
90                                    type: "DELETE",
91                                    dataType: "JSON",
92                                    data: {
93                                        id: AIZ.uploader.data.clickedForDelete,
94                                        _method: "DELETE",
95                                        _token: AIZ.data.csrf,
96                                    },
97                                    success: function () {
98                                        AIZ.uploader.data.selectedFiles =
99                                            AIZ.uploader.data.selectedFiles.filter(
100                                                function (item) {
101                                                    return (
102                                                        item !==
103                                                        AIZ.uploader.data
104                                                            .clickedForDelete
105                                                    );
106                                                }
107                                            );
108                                        AIZ.uploader.data.selectedFilesObject =
109                                            AIZ.uploader.data.selectedFilesObject.filter(
110                                                function (item) {
111                                                    return (
112                                                        item !==
113                                                        clickedForDeleteObject
114                                                    );
115                                                }
116                                            );
117                                        AIZ.uploader.updateUploaderSelected();
118                                        AIZ.uploader.getAllUploads(
119                                            AIZ.data.appUrl +
120                                                "/aiz-uploader/get-uploaded-files"
121                                        );
122                                        AIZ.uploader.data.clickedForDelete =
123                                            null;
124                                        $("#aizUploaderDelete").modal("hide");
125                                    },
126                                });
127                            }
128                        }
129                    );
130                });
131            });
132        },
133        uploadSelect: function () {
134            $(".aiz-uploader-select").each(function () {
135                var elem = $(this);
136                elem.on("click", function (e) {
137                    var value = $(this).data("value");
138                    var valueObject =
139                        AIZ.uploader.data.allFiles[
140                            AIZ.uploader.data.allFiles.findIndex(
141                                (x) => x.id === value
142                            )
143                        ];
144                    // console.log(valueObject);
145
146                    elem.closest(".aiz-file-box-wrap").toggleAttr(
147                        "data-selected",
148                        "true",
149                        "false"
150                    );
151                    if (!AIZ.uploader.data.multiple) {
152                        elem.closest(".aiz-file-box-wrap")
153                            .siblings()
154                            .attr("data-selected", "false");
155                    }
156                    if (!AIZ.uploader.data.selectedFiles.includes(value)) {
157                        if (!AIZ.uploader.data.multiple) {
158                            AIZ.uploader.data.selectedFiles = [];
159                            AIZ.uploader.data.selectedFilesObject = [];
160                        }
161                        AIZ.uploader.data.selectedFiles.push(value);
162                        AIZ.uploader.data.selectedFilesObject.push(valueObject);
163                    } else {
164                        AIZ.uploader.data.selectedFiles =
165                            AIZ.uploader.data.selectedFiles.filter(function (
166                                item
167                            ) {
168                                return item !== value;
169                            });
170                        AIZ.uploader.data.selectedFilesObject =
171                            AIZ.uploader.data.selectedFilesObject.filter(
172                                function (item) {
173                                    return item !== valueObject;
174                                }
175                            );
176                    }
177                    AIZ.uploader.addSelectedValue();
178                    AIZ.uploader.updateUploaderSelected();
179                });
180            });
181        },
182        updateFileHtml: function (array) {
183            var fileText = "";
184            if (array.length > 1) {
185                var fileText = AIZ.local.files_selected;
186            } else {
187                var fileText = AIZ.local.file_selected;
188            }
189            return array.length + " " + fileText;
190        },
191        updateUploaderSelected: function () {
192            $(".aiz-uploader-selected").html(
193                AIZ.uploader.updateFileHtml(AIZ.uploader.data.selectedFiles)
194            );
195        },
196        clearUploaderSelected: function () {
197            $(".aiz-uploader-selected-clear").on("click", function () {
198                AIZ.uploader.data.selectedFiles = [];
199                AIZ.uploader.addSelectedValue();
200                AIZ.uploader.addHiddenValue();
201                AIZ.uploader.resetFilter();
202                AIZ.uploader.updateUploaderSelected();
203                AIZ.uploader.updateUploaderFiles();
204            });
205        },
206        resetFilter: function () {
207            $('[name="aiz-uploader-search"]').val("");
208            $('[name="aiz-show-selected"]').prop("checked", false);
209            $('[name="aiz-uploader-sort"] option[value=newest]').prop(
210                "selected",
211                true
212            );
213        },
214        getAllUploads: function (url, search_key = null, sort_key = null) {
215            $(".aiz-uploader-all").html(
216                '<div class="align-items-center d-flex h-100 justify-content-center w-100"><div class="spinner-border" role="status"></div></div>'
217            );
218            var params = {};
219            if (search_key != null && search_key.length > 0) {
220                params["search"] = search_key;
221            }
222            if (sort_key != null && sort_key.length > 0) {
223                params["sort"] = sort_key;
224            } else {
225                params["sort"] = "newest";
226            }
227            $.get(url, params, function (data, status) {
228                //console.log(data);
229                if (typeof data == "string") {
230                    data = JSON.parse(data);
231                }
232                AIZ.uploader.data.allFiles = data.data;
233                AIZ.uploader.allowedFileType();
234                AIZ.uploader.addSelectedValue();
235                AIZ.uploader.addHiddenValue();
236                //AIZ.uploader.resetFilter();
237                AIZ.uploader.updateUploaderFiles();
238                if (data.next_page_url != null) {
239                    AIZ.uploader.data.next_page_url = data.next_page_url;
240                    $("#uploader_next_btn").removeAttr("disabled");
241                } else {
242                    $("#uploader_next_btn").attr("disabled", true);
243                }
244                if (data.prev_page_url != null) {
245                    AIZ.uploader.data.prev_page_url = data.prev_page_url;
246                    $("#uploader_prev_btn").removeAttr("disabled");
247                } else {
248                    $("#uploader_prev_btn").attr("disabled", true);
249                }
250            });
251        },
252        showSelectedFiles: function () {
253            $('[name="aiz-show-selected"]').on("change", function () {
254                if ($(this).is(":checked")) {
255                    // for (
256                    //     var i = 0;
257                    //     i < AIZ.uploader.data.allFiles.length;
258                    //     i++
259                    // ) {
260                    //     if (AIZ.uploader.data.allFiles[i].selected) {
261                    //         AIZ.uploader.data.allFiles[
262                    //             i
263                    //         ].aria_hidden = false;
264                    //     } else {
265                    //         AIZ.uploader.data.allFiles[
266                    //             i
267                    //         ].aria_hidden = true;
268                    //     }
269                    // }
270                    AIZ.uploader.data.allFiles =
271                        AIZ.uploader.data.selectedFilesObject;
272                } else {
273                    // for (
274                    //     var i = 0;
275                    //     i < AIZ.uploader.data.allFiles.length;
276                    //     i++
277                    // ) {
278                    //     AIZ.uploader.data.allFiles[
279                    //         i
280                    //     ].aria_hidden = false;
281                    // }
282                    AIZ.uploader.getAllUploads(
283                        AIZ.data.appUrl + "/aiz-uploader/get-uploaded-files"
284                    );
285                }
286                AIZ.uploader.updateUploaderFiles();
287            });
288        },
289        searchUploaderFiles: function () {
290            $('[name="aiz-uploader-search"]').on("keyup", function () {
291                var value = $(this).val();
292                AIZ.uploader.getAllUploads(
293                    AIZ.data.appUrl + "/aiz-uploader/get-uploaded-files",
294                    value,
295                    $('[name="aiz-uploader-sort"]').val()
296                );
297                // if (AIZ.uploader.data.allFiles.length > 0) {
298                //     for (
299                //         var i = 0;
300                //         i < AIZ.uploader.data.allFiles.length;
301                //         i++
302                //     ) {
303                //         if (
304                //             AIZ.uploader.data.allFiles[
305                //                 i
306                //             ].file_original_name
307                //                 .toUpperCase()
308                //                 .indexOf(value) > -1
309                //         ) {
310                //             AIZ.uploader.data.allFiles[
311                //                 i
312                //             ].aria_hidden = false;
313                //         } else {
314                //             AIZ.uploader.data.allFiles[
315                //                 i
316                //             ].aria_hidden = true;
317                //         }
318                //     }
319                // }
320                //AIZ.uploader.updateUploaderFiles();
321            });
322        },
323        sortUploaderFiles: function () {
324            $('[name="aiz-uploader-sort"]').on("change", function () {
325                var value = $(this).val();
326                AIZ.uploader.getAllUploads(
327                    AIZ.data.appUrl + "/aiz-uploader/get-uploaded-files",
328                    $('[name="aiz-uploader-search"]').val(),
329                    value
330                );
331
332                // if (value === "oldest") {
333                //     AIZ.uploader.data.allFiles = AIZ.uploader.data.allFiles.sort(
334                //         function(a, b) {
335                //             return (
336                //                 new Date(a.created_at) - new Date(b.created_at)
337                //             );
338                //         }
339                //     );
340                // } else if (value === "smallest") {
341                //     AIZ.uploader.data.allFiles = AIZ.uploader.data.allFiles.sort(
342                //         function(a, b) {
343                //             return a.file_size - b.file_size;
344                //         }
345                //     );
346                // } else if (value === "largest") {
347                //     AIZ.uploader.data.allFiles = AIZ.uploader.data.allFiles.sort(
348                //         function(a, b) {
349                //             return b.file_size - a.file_size;
350                //         }
351                //     );
352                // } else {
353                //     AIZ.uploader.data.allFiles = AIZ.uploader.data.allFiles.sort(
354                //         function(a, b) {
355                //             a = new Date(a.created_at);
356                //             b = new Date(b.created_at);
357                //             return a > b ? -1 : a < b ? 1 : 0;
358                //         }
359                //     );
360                // }
361                //AIZ.uploader.updateUploaderFiles();
362            });
363        },
364        addSelectedValue: function () {
365            for (var i = 0; i < AIZ.uploader.data.allFiles.length; i++) {
366                if (
367                    !AIZ.uploader.data.selectedFiles.includes(
368                        AIZ.uploader.data.allFiles[i].id
369                    )
370                ) {
371                    AIZ.uploader.data.allFiles[i].selected = false;
372                } else {
373                    AIZ.uploader.data.allFiles[i].selected = true;
374                }
375            }
376        },
377        addHiddenValue: function () {
378            for (var i = 0; i < AIZ.uploader.data.allFiles.length; i++) {
379                AIZ.uploader.data.allFiles[i].aria_hidden = false;
380            }
381        },
382        allowedFileType: function () {
383            if (AIZ.uploader.data.type !== "all") {
384                let type = AIZ.uploader.data.type.split(",");
385                AIZ.uploader.data.allFiles = AIZ.uploader.data.allFiles.filter(
386                    function (item) {
387                        return type.includes(item.type);
388                    }
389                );
390            }
391        },
392        updateUploaderFiles: function () {
393            $(".aiz-uploader-all").html(
394                '<div class="align-items-center d-flex h-100 justify-content-center w-100"><div class="spinner-border" role="status"></div></div>'
395            );
396
397            var data = AIZ.uploader.data.allFiles;
398
399            setTimeout(function () {
400                $(".aiz-uploader-all").html(null);
401
402                if (data.length > 0) {
403                    for (var i = 0; i < data.length; i++) {
404                        var thumb = "";
405                        var hidden = "";
406                        if (data[i].type === "image") {
407                            thumb =
408                                '<img src="' +
409                                AIZ.data.fileBaseUrl +
410                                data[i].file_name +
411                                '" class="img-fit">';
412                        } else if(data[i].type === 'video') {
413                            thumb = '<video width="100%" height="100%" controls><source src="'+AIZ.data.fileBaseUrl +  data[i].file_name +'" type="video/mp4">Your browser does not support the video tag.</video>'
414                        } else {
415                            thumb = '<i class="la la-file-text"></i>';
416                        }
417                        var html =
418                            '<div class="aiz-file-box-wrap" aria-hidden="' +
419                            data[i].aria_hidden +
420                            '" data-selected="' +
421                            data[i].selected +
422                            '">' +
423                            '<div class="aiz-file-box">' +
424                            // '<div class="dropdown-file">' +
425                            // '<a class="dropdown-link" data-toggle="dropdown">' +
426                            // '<i class="la la-ellipsis-v"></i>' +
427                            // "</a>" +
428                            // '<div class="dropdown-menu dropdown-menu-right">' +
429                            // '<a href="' +
430                            // AIZ.data.fileBaseUrl +
431                            // data[i].file_name +
432                            // '" target="_blank" download="' +
433                            // data[i].file_original_name +
434                            // "." +
435                            // data[i].extension +
436                            // '" class="dropdown-item"><i class="la la-download mr-2"></i>Download</a>' +
437                            // '<a href="#" class="dropdown-item aiz-uploader-delete" data-id="' +
438                            // data[i].id +
439                            // '"><i class="la la-trash mr-2"></i>Delete</a>' +
440                            // "</div>" +
441                            // "</div>" +
442                            '<div class="card card-file aiz-uploader-select" title="' +
443                            data[i].file_original_name +
444                            "." +
445                            data[i].extension +
446                            '" data-value="' +
447                            data[i].id +
448                            '">' +
449                            '<div class="card-file-thumb">' +
450                            thumb +
451                            "</div>" +
452                            '<div class="card-body ">' +
453                            '<h6 class="d-flex">' +
454                            '<span class="text-truncate title">' +
455                            data[i].file_original_name +
456                            "</span>" +
457                            '<span class="ext flex-shrink-0">.' +
458                            data[i].extension +
459                            "</span>" +
460                            "</h6>" +
461                            "<p>" +
462                            AIZ.extra.bytesToSize(data[i].file_size) +
463                            "</p>" +
464                            "</div>" +
465                            "</div>" +
466                            "</div>" +
467                            "</div>";
468
469                        $(".aiz-uploader-all").append(html);
470                    }
471                } else {
472                    $(".aiz-uploader-all").html(
473                        '<div class="align-items-center d-flex h-100 justify-content-center w-100 nav-tabs"><div class="text-center"><h3>No files found</h3></div></div>'
474                    );
475                }
476                AIZ.uploader.uploadSelect();
477                AIZ.uploader.deleteUploaderFile();
478            }, 300);
479        },
480        inputSelectPreviewGenerate: function (elem) {
481            elem.find(".selected-files").val(AIZ.uploader.data.selectedFiles);
482            elem.next(".file-preview").html(null);
483
484            if (AIZ.uploader.data.selectedFiles.length > 0) {
485                $.post(
486                    AIZ.data.appUrl + "/aiz-uploader/get_file_by_ids",
487                    {
488                        _token: AIZ.data.csrf,
489                        ids: AIZ.uploader.data.selectedFiles.toString(),
490                    },
491                    function (data) {
492                        elem.next(".file-preview").html(null);
493
494                        if (data.length > 0) {
495                            elem.find(".file-amount").html(
496                                AIZ.uploader.updateFileHtml(data)
497                            );
498                            for (var i = 0; i < data.length; i++) {
499                                var thumb = "";
500                                if (data[i].type === "image") {
501                                    thumb =
502                                        '<img src="' +
503                                        data[i].file_name +
504                                        '" class="img-fit">';
505                                }else if(data[i].type === 'video') {
506                                    thumb = '<video width="320" height="240" controls><source src="'+ data[i].file_name +'" type="video/mp4">Your browser does not support the video tag.</video>'
507                                } else {
508                                    thumb = '<i class="la la-file-text"></i>';
509                                }
510                                var html =
511                                    '<div class="d-flex justify-content-between align-items-center mt-2 file-preview-item" data-id="' +
512                                    data[i].id +
513                                    '" title="' +
514                                    data[i].file_original_name +
515                                    "." +
516                                    data[i].extension +
517                                    '">' +
518                                    '<div class="align-items-center align-self-stretch d-flex justify-content-center thumb">' +
519                                    thumb +
520                                    "</div>" +
521                                    '<div class="col body">' +
522                                    '<h6 class="d-flex">' +
523                                    '<span class=" text-truncate " >' +
524                                    data[i].file_original_name +
525                                    "</span>" +
526                                    '<span class="flex-shrink-0 ext">.' +
527                                    data[i].extension +
528                                    "</span>" +
529                                    "</h6>" +
530                                    "<p>" +
531                                    AIZ.extra.bytesToSize(data[i].file_size) +
532                                    "</p>" +
533                                    "</div>" +
534                                    '<div class="remove">' +
535                                    '<button class="btn btn-sm btn-link remove-attachment" type="button">' +
536                                    '<i class="la la-close"></i>' +
537                                    "</button>" +
538                                    "</div>" +
539                                    "</div>";
540
541                                elem.next(".file-preview").append(html);
542                            }
543                        } else {
544                            elem.find(".file-amount").html(
545                                AIZ.local.choose_file
546                            );
547                        }
548                    }
549                );
550            } else {
551                elem.find(".file-amount").html(AIZ.local.choose_file);
552            }
553
554            // if (AIZ.uploader.data.selectedFiles.length > 0) {
555            //     elem.find(".file-amount").html(
556            //         AIZ.uploader.updateFileHtml(AIZ.uploader.data.selectedFiles)
557            //     );
558            //     for (
559            //         var i = 0;
560            //         i < AIZ.uploader.data.selectedFiles.length;
561            //         i++
562            //     ) {
563            //         var index = AIZ.uploader.data.allFiles.findIndex(
564            //             (x) => x.id === AIZ.uploader.data.selectedFiles[i]
565            //         );
566            //         var thumb = "";
567            //         if (AIZ.uploader.data.allFiles[index].type == "image") {
568            //             thumb =
569            //                 '<img src="' +
570            //                 AIZ.data.appUrl +
571            //                 "/public/" +
572            //                 AIZ.uploader.data.allFiles[index].file_name +
573            //                 '" class="img-fit">';
574            //         } else {
575            //             thumb = '<i class="la la-file-text"></i>';
576            //         }
577            //         var html =
578            //             '<div class="d-flex justify-content-between align-items-center mt-2 file-preview-item" data-id="' +
579            //             AIZ.uploader.data.allFiles[index].id +
580            //             '" title="' +
581            //             AIZ.uploader.data.allFiles[index].file_original_name +
582            //             "." +
583            //             AIZ.uploader.data.allFiles[index].extension +
584            //             '">' +
585            //             '<div class="align-items-center align-self-stretch d-flex justify-content-center thumb">' +
586            //             thumb +
587            //             "</div>" +
588            //             '<div class="col body">' +
589            //             '<h6 class="d-flex">' +
590            //             '<span class="text-truncate title">' +
591            //             AIZ.uploader.data.allFiles[index].file_original_name +
592            //             "</span>" +
593            //             '<span class="ext">.' +
594            //             AIZ.uploader.data.allFiles[index].extension +
595            //             "</span>" +
596            //             "</h6>" +
597            //             "<p>" +
598            //             AIZ.extra.bytesToSize(
599            //                 AIZ.uploader.data.allFiles[index].file_size
600            //             ) +
601            //             "</p>" +
602            //             "</div>" +
603            //             '<div class="remove">' +
604            //             '<button class="btn btn-sm btn-link remove-attachment" type="button">' +
605            //             '<i class="la la-close"></i>' +
606            //             "</button>" +
607            //             "</div>" +
608            //             "</div>";
609
610            //         elem.next(".file-preview").append(html);
611            //     }
612            // } else {
613            //     elem.find(".file-amount").html("Choose File");
614            // }
615        },
616        editorImageGenerate: function (elem) {
617            if (AIZ.uploader.data.selectedFiles.length > 0) {
618                for (
619                    var i = 0;
620                    i < AIZ.uploader.data.selectedFiles.length;
621                    i++
622                ) {
623                    var index = AIZ.uploader.data.allFiles.findIndex(
624                        (x) => x.id === AIZ.uploader.data.selectedFiles[i]
625                    );
626                    var thumb = "";
627                    if (AIZ.uploader.data.allFiles[index].type === "image") {
628                        thumb =
629                            '<img src="' +
630                            AIZ.data.fileBaseUrl +
631                            AIZ.uploader.data.allFiles[index].file_name +
632                            '">';
633                        elem[0].insertHTML(thumb);
634                        // console.log(elem);
635                    }
636                }
637            }
638        },
639        dismissUploader: function () {
640            $("#aizUploaderModal").on("hidden.bs.modal", function () {
641                $(".aiz-uploader-backdrop").remove();
642                $("#aizUploaderModal").remove();
643            });
644        },
645        trigger: function (
646            elem = null,
647            from = "",
648            type = "all",
649            selectd = "",
650            multiple = false,
651            callback = null
652        ) {
653            // $("body").append('<div class="aiz-uploader-backdrop"></div>');
654
655            var elem = $(elem);
656            var multiple = multiple;
657            var type = type;
658            var oldSelectedFiles = selectd;
659            if (oldSelectedFiles !== "") {
660                AIZ.uploader.data.selectedFiles = oldSelectedFiles
661                    .split(",")
662                    .map(Number);
663            } else {
664                AIZ.uploader.data.selectedFiles = [];
665            }
666            if ("undefined" !== typeof type && type.length > 0) {
667                AIZ.uploader.data.type = type;
668            }
669
670            if (multiple) {
671                AIZ.uploader.data.multiple = true;
672            } else {
673                AIZ.uploader.data.multiple = false;
674            }
675
676            // setTimeout(function() {
677            $.post(
678                AIZ.data.appUrl + "/aiz-uploader",
679                { _token: AIZ.data.csrf },
680                function (data) {
681                    $("body").append(data);
682                    $("#aizUploaderModal").modal("show");
683                    AIZ.plugins.aizUppy();
684                    AIZ.uploader.getAllUploads(
685                        AIZ.data.appUrl + "/aiz-uploader/get-uploaded-files",
686                        null,
687                        $('[name="aiz-uploader-sort"]').val()
688                    );
689                    AIZ.uploader.updateUploaderSelected();
690                    AIZ.uploader.clearUploaderSelected();
691                    AIZ.uploader.sortUploaderFiles();
692                    AIZ.uploader.searchUploaderFiles();
693                    AIZ.uploader.showSelectedFiles();
694                    AIZ.uploader.dismissUploader();
695
696                    $("#uploader_next_btn").on("click", function () {
697                        if (AIZ.uploader.data.next_page_url != null) {
698                            $('[name="aiz-show-selected"]').prop(
699                                "checked",
700                                false
701                            );
702                            AIZ.uploader.getAllUploads(
703                                AIZ.uploader.data.next_page_url
704                            );
705                        }
706                    });
707
708                    $("#uploader_prev_btn").on("click", function () {
709                        if (AIZ.uploader.data.prev_page_url != null) {
710                            $('[name="aiz-show-selected"]').prop(
711                                "checked",
712                                false
713                            );
714                            AIZ.uploader.getAllUploads(
715                                AIZ.uploader.data.prev_page_url
716                            );
717                        }
718                    });
719
720                    $(".aiz-uploader-search i").on("click", function () {
721                        $(this).parent().toggleClass("open");
722                    });
723
724                    $('[data-toggle="aizUploaderAddSelected"]').on(
725                        "click",
726                        function () {
727                            if (from === "input") {
728                                AIZ.uploader.inputSelectPreviewGenerate(elem);
729                            } else if (from === "direct") {
730                                callback(AIZ.uploader.data.selectedFiles);
731                            }
732                            $("#aizUploaderModal").modal("hide");
733                        }
734                    );
735                }
736            );
737            // }, 50);
738        },
739        initForInput: function () {
740            $(document).on(
741                "click",
742                '[data-toggle="aizuploader"]',
743                function (e) {
744                    if (e.detail === 1) {
745                        var elem = $(this);
746                        var multiple = elem.data("multiple");
747                        var type = elem.data("type");
748                        var oldSelectedFiles = elem
749                            .find(".selected-files")
750                            .val();
751
752                        multiple = !multiple ? "" : multiple;
753                        type = !type ? "" : type;
754                        oldSelectedFiles = !oldSelectedFiles
755                            ? ""
756                            : oldSelectedFiles;
757
758                        AIZ.uploader.trigger(
759                            this,
760                            "input",
761                            type,
762                            oldSelectedFiles,
763                            multiple
764                        );
765                    }
766                }
767            );
768        },
769        previewGenerate: function () {
770            $('[data-toggle="aizuploader"]').each(function () {
771                var $this = $(this);
772                var files = $this.find(".selected-files").val();
773                if (files != "") {
774                    $.post(
775                        AIZ.data.appUrl + "/aiz-uploader/get_file_by_ids",
776                        { _token: AIZ.data.csrf, ids: files },
777                        function (data) {
778                            $this.next(".file-preview").html(null);
779
780                            if (data.length > 0) {
781                                $this
782                                    .find(".file-amount")
783                                    .html(AIZ.uploader.updateFileHtml(data));
784                                for (var i = 0; i < data.length; i++) {
785                                    var thumb = "";
786                                    if (data[i].type === "image") {
787                                        thumb =
788                                            '<img src="' +
789                                            data[i].file_name +
790                                            '" class="img-fit">';
791                                    } else if(data[i].type === 'video') {
792                                        thumb = '<video width="320" height="240" controls><source src="'+ data[i].file_name +'" type="video/mp4">Your browser does not support the video tag.</video>'
793                                    } else {
794                                        thumb = '<i class="la la-file-text"></i>';
795                                    }
796                                    var html =
797                                        '<div class="d-flex justify-content-between align-items-center mt-2 file-preview-item" data-id="' +
798                                        data[i].id +
799                                        '" title="' +
800                                        data[i].file_original_name +
801                                        "." +
802                                        data[i].extension +
803                                        '">' +
804                                        '<div class="align-items-center align-self-stretch d-flex justify-content-center thumb">' +
805                                        thumb +
806                                        "</div>" +
807                                        '<div class="col body">' +
808                                        '<h6 class="d-flex">' +
809                                        '<span class="text-truncate title">' +
810                                        data[i].file_original_name +
811                                        "</span>" +
812                                        '<span class="ext flex-shrink-0">.' +
813                                        data[i].extension +
814                                        "</span>" +
815                                        "</h6>" +
816                                        "<p>" +
817                                        AIZ.extra.bytesToSize(
818                                            data[i].file_size
819                                        ) +
820                                        "</p>" +
821                                        "</div>" +
822                                        '<div class="remove">' +
823                                        '<button class="btn btn-sm btn-link remove-attachment" type="button">' +
824                                        '<i class="la la-close"></i>' +
825                                        "</button>" +
826                                        "</div>" +
827                                        "</div>";
828
829                                    $this.next(".file-preview").append(html);
830                                }
831                            } else {
832                                $this
833                                    .find(".file-amount")
834                                    .html(AIZ.local.choose_file);
835                            }
836                        }
837                    );
838                }
839            });
840        },
841    };
842    AIZ.plugins = {
843        metismenu: function () {
844            $('[data-toggle="aiz-side-menu"]').metisMenu();
845        },
846        bootstrapSelect: function (refresh = "") {
847            $(".aiz-selectpicker").each(function (el) {
848                var $this = $(this);
849                if (!$this.parent().hasClass("bootstrap-select")) {
850                    var selected = $this.data("selected");
851                    if (typeof selected !== "undefined") {
852                        $this.val(selected);
853                    }
854                    $this.selectpicker({
855                        size: 5,
856                        noneSelectedText: AIZ.local.nothing_selected,
857                        virtualScroll: false,
858                    });
859                }
860                if (refresh === "refresh") {
861                    $this.selectpicker("refresh");
862                }
863                if (refresh === "destroy") {
864                    $this.selectpicker("destroy");
865                }
866            });
867        },
868        tagify: function () {
869            $(".aiz-tag-input")
870                .not(".tagify")
871                .each(function () {
872                    var $this = $(this);
873
874                    var maxTags = $this.data("max-tags");
875                    var whitelist = $this.data("whitelist");
876                    var onchange = $this.data("on-change");
877
878                    maxTags = !maxTags ? Infinity : maxTags;
879                    whitelist = !whitelist ? [] : whitelist;
880
881                    $this.tagify({
882                        maxTags: maxTags,
883                        whitelist: whitelist,
884                        dropdown: {
885                            enabled: 1,
886                        },
887                    });
888                    try {
889                        callback = eval(onchange);
890                    } catch (e) {
891                        var callback = "";
892                    }
893                    if (typeof callback == "function") {
894                        $this.on("removeTag", function () {
895                            callback();
896                        });
897                        $this.on("add", function () {
898                            callback();
899                        });
900                    }
901                });
902        },
903        textEditor: function () {
904            $(".aiz-text-editor").each(function (el) {
905                var $this = $(this);
906                var buttons = $this.data("buttons");
907                var minHeight = $this.data("min-height");
908                var placeholder = $this.attr("placeholder");
909                var format = $this.data("format");
910                $.extend($.summernote.options, {
911                    buttons: {
912                        clearText: function (context) {
913                            var ui = $.summernote.ui;
914                            var button = ui.button({
915                                contents: '<i class="fa fa-trash"></i> Clear',
916                                tooltip: 'Clear all content',
917                                click: function () {
918                                    context.invoke('code', '');
919                                }
920                            });
921                            return button.render();
922                        }
923                    }
924                });
925
926                buttons = !buttons
927                    ? [
928                        ["font", ["bold", "underline", "italic", "clear"]],
929                        ["para", ["ul", "ol", "paragraph"]],
930                        ["style", ["style"]],
931                        ["color", ["color"]],
932                        ["table", ["table"]],
933                        ["insert", ["link", "picture", "video"]],
934                        ["view", ["fullscreen", "undo", "redo"]],
935                        ["custom", ["clearText"]],
936                    ]
937                    : buttons;
938                placeholder = !placeholder ? "" : placeholder;
939                minHeight = !minHeight ? 200 : minHeight;
940                format = typeof format == "undefined" ? false : format;
941
942                $this.summernote({
943                    toolbar: buttons,
944                    placeholder: placeholder,
945                    disableDragAndDrop: true,
946                    height: minHeight,
947                    callbacks: {
948                        onImageUpload: function (data) {
949                            data.pop();
950                        },
951                        onPaste: function (e) {
952                            if (format) {
953                                var bufferText = (
954                                    (e.originalEvent || e).clipboardData ||
955                                    window.clipboardData
956                                ).getData("Text");
957                                e.preventDefault();
958                                document.execCommand(
959                                    "insertText",
960                                    false,
961                                    bufferText
962                                );
963                            }
964                        },
965                    },
966                });
967
968                var nativeHtmlBuilderFunc = $this.summernote(
969                    "module",
970                    "videoDialog"
971                ).createVideoNode;
972
973                $this.summernote("module", "videoDialog").createVideoNode =
974                    function (url) {
975                        var wrap = $(
976                            '<div class="embed-responsive embed-responsive-16by9"></div>'
977                        );
978                        var html = nativeHtmlBuilderFunc(url);
979                        html = $(html).addClass("embed-responsive-item");
980                        return wrap.append(html)[0];
981                    };
982            });
983        },
984        dateRange: function () {
985            $(".aiz-date-range").each(function () {
986                var $this = $(this);
987                var today = moment().startOf("day");
988                var value = $this.val();
989                var startDate = false;
990                var minDate = false;
991                var maxDate = false;
992                var advncdRange = false;
993                var ranges = {
994                    Today: [moment(), moment()],
995                    Yesterday: [
996                        moment().subtract(1, "days"),
997                        moment().subtract(1, "days"),
998                    ],
999                    "Last 7 Days": [moment().subtract(6, "days"), moment()],
1000                    "Last 30 Days": [moment().subtract(29, "days"), moment()],
1001                    "This Month": [
1002                        moment().startOf("month"),
1003                        moment().endOf("month"),
1004                    ],
1005                    "Last Month": [
1006                        moment().subtract(1, "month").startOf("month"),
1007                        moment().subtract(1, "month").endOf("month"),
1008                    ],
1009                };
1010
1011                var single = $this.data("single");
1012                var monthYearDrop = $this.data("show-dropdown");
1013                var format = $this.data("format");
1014                var separator = $this.data("separator");
1015                var pastDisable = $this.data("past-disable");
1016                var futureDisable = $this.data("future-disable");
1017                var timePicker = $this.data("time-picker");
1018                var timePickerIncrement = $this.data("time-gap");
1019                var advncdRange = $this.data("advanced-range");
1020
1021                single = !single ? false : single;
1022                monthYearDrop = !monthYearDrop ? false : monthYearDrop;
1023                format = !format ? "YYYY-MM-DD" : format;
1024                separator = !separator ? " / " : separator;
1025                minDate = !pastDisable ? minDate : today;
1026                maxDate = !futureDisable ? maxDate : today;
1027                timePicker = !timePicker ? false : timePicker;
1028                timePickerIncrement = !timePickerIncrement
1029                    ? 1
1030                    : timePickerIncrement;
1031                ranges = !advncdRange ? "" : ranges;
1032
1033                $this.daterangepicker({
1034                    singleDatePicker: single,
1035                    showDropdowns: monthYearDrop,
1036                    minDate: minDate,
1037                    maxDate: maxDate,
1038                    timePickerIncrement: timePickerIncrement,
1039                    autoUpdateInput: false,
1040                    ranges: ranges,
1041                    locale: {
1042                        format: format,
1043                        separator: separator,
1044                        applyLabel: "Select",
1045                        cancelLabel: "Clear",
1046                    },
1047                });
1048                if (single) {
1049                    $this.on("apply.daterangepicker", function (ev, picker) {
1050                        $this.val(picker.startDate.format(format));
1051                    });
1052                } else {
1053                    $this.on("apply.daterangepicker", function (ev, picker) {
1054                        $this.val(
1055                            picker.startDate.format(format) +
1056                                separator +
1057                                picker.endDate.format(format)
1058                        );
1059                    });
1060                }
1061
1062                $this.on("cancel.daterangepicker", function (ev, picker) {
1063                    $this.val("");
1064                });
1065            });
1066        },
1067        timePicker: function () {
1068            $(".aiz-time-picker").each(function () {
1069                var $this = $(this);
1070
1071                var minuteStep = $this.data("minute-step");
1072                var defaultTime = $this.data("default");
1073
1074                minuteStep = !minuteStep ? 10 : minuteStep;
1075                defaultTime = !defaultTime ? "00:00" : defaultTime;
1076
1077                $this.timepicker({
1078                    template: "dropdown",
1079                    minuteStep: minuteStep,
1080                    defaultTime: defaultTime,
1081                    icons: {
1082                        up: "las la-angle-up",
1083                        down: "las la-angle-down",
1084                    },
1085                    showInputs: false,
1086                });
1087            });
1088        },
1089        colorPicker: function () {
1090            $(".aiz-color-picker").on("change", function () {
1091                var $this = $(this);
1092                let value = $this.val();
1093                $this.parent().parent().siblings(".aiz-color-input").val(value);
1094            });
1095            $(".aiz-color-input").on("change", function () {
1096                var $this = $(this);
1097                let value = $this.val();
1098                $(this)
1099                    .siblings(".input-group-append")
1100                    .children(".input-group-text")
1101                    .children(".aiz-color-picker")
1102                    .val(value);
1103            });
1104        },
1105        fooTable: function () {
1106            $(".aiz-table").each(function () {
1107                var $this = $(this);
1108
1109                var empty = $this.data("empty");
1110                empty = !empty ? AIZ.local.nothing_found : empty;
1111
1112                $this.footable({
1113                    breakpoints: {
1114                        xs: 576,
1115                        sm: 768,
1116                        md: 992,
1117                        lg: 1200,
1118                        xl: 1400,
1119                    },
1120                    cascade: true,
1121                    on: {
1122                        "ready.ft.table": function (e, ft) {
1123                            AIZ.extra.deleteConfirm();
1124                            AIZ.plugins.bootstrapSelect("refresh");
1125                        },
1126                    },
1127                    empty: empty,
1128                });
1129            });
1130        },
1131        sectionFooTable: function (section) {
1132            var $this = $(section+" .aiz-table");
1133
1134            var empty = $this.data("empty");
1135            empty = !empty ? AIZ.local.nothing_found : empty;
1136
1137            $this.footable({
1138                breakpoints: {
1139                    xs: 576,
1140                    sm: 768,
1141                    md: 992,
1142                    lg: 1200,
1143                    xl: 1400,
1144                },
1145                cascade: true,
1146                on: {
1147                    "ready.ft.table": function (e, ft) {
1148                        AIZ.extra.deleteConfirm();
1149                        AIZ.plugins.bootstrapSelect("refresh");
1150                    },
1151                },
1152                empty: empty,
1153            });
1154        },
1155        notify: function (type = "dark", message = "") {
1156            $.notify(
1157                {
1158                    // options
1159                    message: message,
1160                },
1161                {
1162                    // settings
1163                    showProgressbar: true,
1164                    delay: 2500,
1165                    mouse_over: "pause",
1166                    placement: {
1167                        from: "bottom",
1168                        align: "left",
1169                    },
1170                    animate: {
1171                        enter: "animated fadeInUp",
1172                        exit: "animated fadeOutDown",
1173                    },
1174                    type: type,
1175                    template:
1176                        '<div data-notify="container" class="aiz-notify alert alert-{0}" role="alert">
1176' +
1177                        '<button type="button" aria-hidden="true" data-notify="dismiss" class="close"><i class="las la-times"></i></button>' +
1178                        '<span data-notify="message">{2}</span>' +
1179                        '<div class="progress" data-notify="progressbar">' +
1180                        '<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div>' +
1181                        "</div>" +
1182                        "</div>",
1183                }
1184            );
1185        },
1186        aizUppy: function () {
1187            if ($("#aiz-upload-files").length > 0) {
1188                var uppy = Uppy.Core({
1189                    autoProceed: true,
1190                });
1191                uppy.use(Uppy.Dashboard, {
1192                    target: "#aiz-upload-files",
1193                    inline: true,
1194                    showLinkToFileUploadResult: false,
1195                    showProgressDetails: true,
1196                    hideCancelButton: true,
1197                    hidePauseResumeButton: true,
1198                    hideUploadButton: true,
1199                    proudlyDisplayPoweredByUppy: false,
1200                    locale: {
1201                        strings: {
1202                            addMoreFiles: AIZ.local.add_more_files,
1203                            addingMoreFiles: AIZ.local.adding_more_files,
1204                            dropPaste:
1205                                AIZ.local.drop_files_here_paste_or +
1206                                " %{browse}",
1207                            browse: AIZ.local.browse,
1208                            uploadComplete: AIZ.local.upload_complete,
1209                            uploadPaused: AIZ.local.upload_paused,
1210                            resumeUpload: AIZ.local.resume_upload,
1211                            pauseUpload: AIZ.local.pause_upload,
1212                            retryUpload: AIZ.local.retry_upload,
1213                            cancelUpload: AIZ.local.cancel_upload,
1214                            xFilesSelected: {
1215                                0: "%{smart_count} " + AIZ.local.file_selected,
1216                                1: "%{smart_count} " + AIZ.local.files_selected,
1217                            },
1218                            uploadingXFiles: {
1219                                0:
1220                                    AIZ.local.uploading +
1221                                    " %{smart_count} " +
1222                                    AIZ.local.file,
1223                                1:
1224                                    AIZ.local.uploading +
1225                                    " %{smart_count} " +
1226                                    AIZ.local.files,
1227                            },
1228                            processingXFiles: {
1229                                0:
1230                                    AIZ.local.processing +
1231                                    " %{smart_count} " +
1232                                    AIZ.local.file,
1233                                1:
1234                                    AIZ.local.processing +
1235                                    " %{smart_count} " +
1236                                    AIZ.local.files,
1237                            },
1238                            uploading: AIZ.local.uploading,
1239                            complete: AIZ.local.complete,
1240                        },
1241                    },
1242                });
1243                uppy.use(Uppy.XHRUpload, {
1244                    endpoint: AIZ.data.appUrl + "/aiz-uploader/upload",
1245                    fieldName: "aiz_file",
1246                    formData: true,
1247                    headers: {
1248                        "X-CSRF-TOKEN": AIZ.data.csrf,
1249                    },
1250                });
1251                uppy.on("upload-success", function () {
1252                    AIZ.uploader.getAllUploads(
1253                        AIZ.data.appUrl + "/aiz-uploader/get-uploaded-files"
1254                    );
1255                });
1256            }
1257        },
1258        tooltip: function () {
1259            $("body")
1260                .tooltip({ selector: '[data-toggle="tooltip"]' })
1261                .click(function () {
1262                    $('[data-toggle="tooltip"]').tooltip("hide");
1263                });
1264        },
1265        countDown: function () {
1266            if ($(".aiz-count-down").length > 0) {
1267                $(".aiz-count-down").each(function () {
1268                    var $this = $(this);
1269                    var date = $this.data("date");
1270                    // console.log(date)
1271
1272                    $this
1273                        .countdown(date)
1274                        .on("update.countdown", function (event) {
1275                            var $this = $(this).html(
1276                                event.strftime(
1277                                    "" +
1278                                        '<div class="countdown-item"><span class="countdown-digit">%-D</span></div><span class="countdown-separator">:</span>' +
1279                                        '<div class="countdown-item"><span class="countdown-digit">%H</span></div><span class="countdown-separator">:</span>' +
1280                                        '<div class="countdown-item"><span class="countdown-digit">%M</span></div><span class="countdown-separator">:</span>' +
1281                                        '<div class="countdown-item"><span class="countdown-digit">%S</span></div>'
1282                                )
1283                            );
1284                        });
1285                });
1286            }
1287        },
1288        countDownBox: function () {
1289            if ($(".aiz-count-down-box").length > 0) {
1290                $(".aiz-count-down-box").each(function () {
1291                    var $this = $(this);
1292                    var date = $this.data("date");
1293                    // console.log(date)
1294
1295                    $this
1296                        .countdown(date)
1297                        .on("update.countdown", function (event) {
1298                            var $this = $(this).html(
1299                                event.strftime(
1300                                    "" +
1301                                        '<div class="countdown-item"><span class="countdown-digit">%-D</span><span class="countdown-name">DAY</span></div><span class="countdown-separator">:</span>' +
1302                                        '<div class="countdown-item"><span class="countdown-digit">%H</span><span class="countdown-name">HRS</span></div><span class="countdown-separator">:</span>' +
1303                                        '<div class="countdown-item"><span class="countdown-digit">%M</span><span class="countdown-name">MIN</span></div><span class="countdown-separator">:</span>' +
1304                                        '<div class="countdown-item"><span class="countdown-digit">%S</span><span class="countdown-name">SEC</span></div>'
1305                                )
1306                            );
1307                        });
1308                });
1309            }
1310        },
1311        countDownCircle: function () {
1312
1313            // default values
1314            let cx = 30, cy = 30, r = 30, stroke_length=190;
1315
1316            let homepage = $("#selected_homepage").val();
1317
1318            if (homepage && homepage == "thecore") {
1319                cx = cy = r = 23;
1320                stroke_length=138;
1321            }
1322
1323            let html =
1324                '<div id="time">' +
1325                    '<div class="circle"><svg><circle cx="'+cx+'" cy="'+cy+'" r="'+r+'"></circle><circle cx="'+cx+'" cy="'+cy+'" r="'+r+'" id="dd"></circle></svg><div id="days" class="mb-2">00 <br><span>Day</span></div></div>' +
1326                    '<div class="circle"><svg><circle cx="'+cx+'" cy="'+cy+'" r="'+r+'"></circle><circle cx="'+cx+'" cy="'+cy+'" r="'+r+'" id="hh"></circle></svg><div id="hours" class="mb-2">00 <br><span>Hrs</span></div></div>' +
1327                    '<div class="circle"><svg><circle cx="'+cx+'" cy="'+cy+'" r="'+r+'"></circle><circle cx="'+cx+'" cy="'+cy+'" r="'+r+'" id="mm"></circle></svg><div id="minutes" class="mb-2">00 <br><span>Min</span></div></div>' +
1328                    '<div class="circle"><svg><circle cx="'+cx+'" cy="'+cy+'" r="'+r+'"></circle><circle cx="'+cx+'" cy="'+cy+'" r="'+r+'" id="ss"></circle></svg><div id="seconds" class="mb-2">00 <br><span>Sec</span></div></div>' +
1329                '</div>';
1330
1331            if ($(".aiz-count-down-circle").length > 0) {
1332                $(".aiz-count-down-circle").each(function () {
1333                    var $this = $(this);
1334                    $this.html(html);
1335
1336                    let days = $this.find("#days");
1337                    let hours = $this.find("#hours");
1338                    let minutes = $this.find("#minutes");
1339                    let seconds = $this.find("#seconds");
1340
1341                    let dd = $this.find("#dd");
1342                    let hh = $this.find("#hh");
1343                    let mm = $this.find("#mm");
1344                    let ss = $this.find("#ss");
1345
1346                    // Date Format mm/dd/yyyy
1347                    var endDate = $this.attr("end-date");
1348                    let now = new Date(endDate).getTime();
1349                    let x = setInterval(function () {
1350                        let CountDown = new Date().getTime();
1351                        let distance = now - CountDown;
1352                        if (distance > 0) {
1353                            // Time calculation for days, hours, minutes & seconds
1354                            let d = Math.floor(
1355                                distance / (1000 * 60 * 60 * 24)
1356                            );
1357                            let h = Math.floor(
1358                                (distance % (1000 * 60 * 60 * 24)) /
1359                                    (1000 * 60 * 60)
1360                            );
1361                            let m = Math.floor(
1362                                (distance % (1000 * 60 * 60)) / (1000 * 60)
1363                            );
1364                            let s = Math.floor((distance % (1000 * 60)) / 1000);
1365
1366                            // Output the results in elements with id
1367                            days.html(d + "<br><span>Day</span>");
1368                            hours.html(h + "<br><span>Hrs</span>");
1369                            minutes.html(m + "<br><span>Min</span>");
1370                            seconds.html(s + "<br><span>Sec</span>");
1371
1372                            // Animate stroke
1373                            dd.css("strokeDashoffset", stroke_length - (stroke_length * d) / 365); // 365 days in a year
1374                            hh.css("strokeDashoffset", stroke_length - (stroke_length * h) / 24); // 24 hours in a day
1375                            mm.css("strokeDashoffset", stroke_length - (stroke_length * m) / 60); // 60 minutes in an hour
1376                            ss.css("strokeDashoffset", stroke_length - (stroke_length * s) / 60);
1376 // 60 seconds in a minute
1377                        } else {
1378                            // If Countdown is over
1379                            clearInterval(x);
1380                        }
1381                    });
1382                });
1383            }
1384        },
1385       slickCarousel: function () {
1386            // Initialize category section slider on mobile
1387            $(document).ready(function () {
1388                function initCategorySlider() {
1389                    if (window.innerWidth <= 576) {
1390                        // Destroy existing slider if any
1391                        if ($('.mobile-category-slider').hasClass('slick-initialized')) {
1392                            $('.mobile-category-slider').slick('unslick');
1393                        }
1394                        // Initialize new slider
1395                        $('.mobile-category-slider').slick({
1396                            slidesToShow: 1.5,
1397                            slidesToScroll: 1,
1398                            arrows: false,
1399                            dots: false,
1400                            infinite: false,
1401                            variableWidth: false,
1402                            centerMode: false,
1403                            adaptiveHeight: false,
1404                            autoplay: true,
1405                            utoplaySpeed: 3000 // 3 seconds
1406                        });
1407                        // Equalize heights after initialization
1408                        setTimeout(equalizeSlideHeights, 100);
1409                    } else {
1410                        // Destroy slider on larger screens
1411                        if ($('.mobile-category-slider').hasClass('slick-initialized')) {
1412                            $('.mobile-category-slider').slick('unslick');
1413                        }
1414                    }
1415                }
1416                function equalizeSlideHeights() {
1417                    let maxHeight = 0;
1418                    $('.category-slide').each(function () {
1419                        $(this).css('height', 'auto');
1420                        const slideHeight = $(this).outerHeight();
1421                        if (slideHeight > maxHeight) {
1422                            maxHeight = slideHeight;
1423                        }
1424                    });
1425                    $('.category-slide').css('height', maxHeight + 'px');
1426                    $('.mobile-category-slider').slick('setPosition');
1427                }
1428                // Initialize on load
1429                initCategorySlider();
1430
1431                // Reinitialize on resize
1432                $(window).on('resize', function () {
1433                    initCategorySlider();
1434                });
1435            });
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445            $(".aiz-carousel")
1446                .not(".slick-initialized")
1447                   .each(function () {
1448                    var $this = $(this);
1449
1450                    var slidesPerViewXs = $this.data("xs-items");
1451                    var slidesPerViewSm = $this.data("sm-items");
1452                    var slidesPerViewMd = $this.data("md-items");
1453                    var slidesPerViewLg = $this.data("lg-items");
1454                    var slidesPerViewXl = $this.data("xl-items");
1455                    var slidesPerViewXXl = $this.data("xxl-items");
1456                    var slidesPerViewFullHd = $this.data("full-hd-items");
1457                    var slidesPerView = $this.data("items");
1458
1459                    var slidesCenterMode = $this.data("center");
1460                    var slidesArrows = $this.data("arrows");
1461                    var slidesDots = $this.data("dots");
1462                    var slidesRows = $this.data("rows");
1463                    var slidesAutoplay = $this.data("autoplay");
1464                    var slidesAutoplaySpeed = $this.data("autoplay-speed");
1465                    var slidesFade = $this.data("fade");
1466                    var asNavFor = $this.data("nav-for");
1467                    var infinite = $this.data("infinite");
1468                    var focusOnSelect = $this.data("focus-select");
1469                    var adaptiveHeight = $this.data("auto-height");
1470                    var variableWidth = $this.data("variableWidth");
1471
1472                    var vertical = $this.data("vertical");
1473                    var verticalXs = $this.data("vertical-xs");
1474                    var verticalSm = $this.data("vertical-sm");
1475                    var verticalMd = $this.data("vertical-md");
1476                    var verticalLg = $this.data("vertical-lg");
1477                    var verticalXl = $this.data("vertical-xl");
1478                    var verticalXXl = $this.data("vertical-xxl");
1479                    var verticalFullHd = $this.data("vertical-full-hd");
1480
1481                    slidesPerView = !slidesPerView ? 1 : slidesPerView;
1482                    slidesPerViewFullHd = !slidesPerViewFullHd 
1483                        ? slidesPerView 
1484                        : slidesPerViewFullHd;
1485                    slidesPerViewXXl = !slidesPerViewXXl 
1486                        ? slidesPerViewFullHd 
1487                        : slidesPerViewXXl;
1488                    slidesPerViewXl = !slidesPerViewXl
1489                        ? slidesPerView
1490                        : slidesPerViewXl;
1491                    slidesPerViewLg = !slidesPerViewLg
1492                        ? slidesPerViewXl
1493                        : slidesPerViewLg;
1494                    slidesPerViewMd = !slidesPerViewMd
1495                        ? slidesPerViewLg
1496                        : slidesPerViewMd;
1497                    slidesPerViewSm = !slidesPerViewSm
1498                        ? slidesPerViewMd
1499                        : slidesPerViewSm;
1500                    slidesPerViewXs = !slidesPerViewXs
1501                        ? slidesPerViewSm
1502                        : slidesPerViewXs;
1503
1504                    vertical = !vertical ? false : vertical;
1505
1506                    verticalFullHd = 
1507                    typeof verticalFullHd == "undefined" 
1508                        ? vertical 
1509                        : verticalFullHd;
1510                        
1511                    verticalXXl = 
1512                    typeof verticalXXl == "undefined" 
1513                        ? verticalFullHd 
1514                        : verticalXXl;
1515
1516                    verticalXl =
1517                        typeof verticalXl == "undefined"
1518                            ? vertical
1519                            : verticalXl;
1520                    verticalLg =
1521                        typeof verticalLg == "undefined"
1522                            ? verticalXl
1523                            : verticalLg;
1524                    verticalMd =
1525                        typeof verticalMd == "undefined"
1526                            ? verticalLg
1527                            : verticalMd;
1528                    verticalSm =
1529                        typeof verticalSm == "undefined"
1530                            ? verticalMd
1531                            : verticalSm;
1532                    verticalXs =
1533                        typeof verticalXs == "undefined"
1534                            ? verticalSm
1535                            : verticalXs;
1536
1537                    slidesCenterMode = !slidesCenterMode
1538                        ? false
1539                        : slidesCenterMode;
1540                    slidesArrows = !slidesArrows ? false : slidesArrows;
1541                    slidesDots = !slidesDots ? false : slidesDots;
1542                    slidesRows = !slidesRows ? 1 : slidesRows;
1543                    slidesAutoplay = !slidesAutoplay ? false : slidesAutoplay;
1544                    slidesAutoplaySpeed = !slidesAutoplaySpeed
1545                        ? "5000"
1546                        : slidesAutoplaySpeed;
1547                    slidesFade = !slidesFade ? false : slidesFade;
1548                    asNavFor = !asNavFor ? null : asNavFor;
1549                    infinite = !infinite ? false : infinite;
1550                    focusOnSelect = !focusOnSelect ? false : focusOnSelect;
1551                    adaptiveHeight = !adaptiveHeight ? false : adaptiveHeight;
1552                    variableWidth = !variableWidth ? false : variableWidth;
1553
1554                    var slidesRtl =
1555                        $("html").attr("dir") === "rtl" && !vertical
1556                            ? true
1557                            : false;
1558
1559                    var slidesRtlFullHd = 
1560                        $("html").attr("dir") === "rtl" && !verticalFullHd 
1561                            ? true 
1562                            : false;
1563
1564                    var slidesRtlXXl = 
1565                        $("html").attr("dir") === "rtl" && !verticalXXl 
1566                            ? true 
1567                            : false;
1568
1569                    var slidesRtlXL =
1570                        $("html").attr("dir") === "rtl" && !verticalXl
1571                            ? true
1572                            : false;
1573                    var slidesRtlLg =
1574                        $("html").attr("dir") === "rtl" && !verticalLg
1575                            ? true
1576                            : false;
1577                    var slidesRtlMd =
1578                        $("html").attr("dir") === "rtl" && !verticalMd
1579                            ? true
1580                            : false;
1581                    var slidesRtlSm =
1582                        $("html").attr("dir") === "rtl" && !verticalSm
1583                            ? true
1584                            : false;
1585                    var slidesRtlXs =
1586                        $("html").attr("dir") === "rtl" && !verticalXs
1587                            ? true
1588                            : false;
1589
1590                    $this.slick({
1591                        slidesToShow: slidesPerView,
1592                        autoplay: slidesAutoplay,
1593                        autoplaySpeed: slidesAutoplaySpeed,
1594                        dots: slidesDots,
1595                        arrows: slidesArrows,
1596                        infinite: infinite,
1597                        vertical: vertical,
1598                        rtl: slidesRtl,
1599                        rows: slidesRows,
1600                        centerPadding: "0px",
1601                        centerMode: slidesCenterMode,
1602                        fade: slidesFade,
1603                        asNavFor: asNavFor,
1604                        focusOnSelect: focusOnSelect,
1605                        adaptiveHeight: adaptiveHeight,
1606                        slidesToScroll: 1,
1607                        variableWidth: variableWidth,
1608                        prevArrow:
1609                            '<button type="button" class="slick-prev"><i class="las la-angle-left"></i></button>',
1610                        nextArrow:
1611                            '<button type="button" class="slick-next"><i class="las la-angle-right"></i></button>',
1612                        responsive: [
1613                            {
1614                                breakpoint: 2601, 
1615                                settings: {
1616                                    slidesToShow: slidesPerViewFullHd, 
1617                                    vertical: verticalFullHd,
1618                                    rtl: slidesRtlFullHd
1619                                },
1620                            },
1621                            {
1622                                breakpoint: 1951, 
1623                                settings: {
1624                                    slidesToShow: slidesPerViewXXl,
1625                                    vertical: verticalXXl,
1626                                    rtl: slidesRtlXXl
1627                                },
1628                            },
1629                            {
1630                                breakpoint: 1500,
1631                                settings: {
1632                                    slidesToShow: slidesPerViewXl,
1633                                    vertical: verticalXl,
1634                                    rtl: slidesRtlXL,
1635                                },
1636                            },
1637                            {
1638                                breakpoint: 1200,
1639                                settings: {
1640                                    slidesToShow: slidesPerViewLg,
1641                                    vertical: verticalLg,
1642                                    rtl: slidesRtlLg,
1643                                },
1644                            },
1645                            {
1646                                breakpoint: 992,
1647                                settings: {
1648                                    slidesToShow: slidesPerViewMd,
1649                                    vertical: verticalMd,
1650                                    rtl: slidesRtlMd,
1651                                },
1652                            },
1653                            {
1654                                breakpoint: 768,
1655                                settings: {
1656                                    slidesToShow: slidesPerViewSm,
1657                                    vertical: verticalSm,
1658                                    rtl: slidesRtlSm,
1659                                },
1660                            },
1661                            {
1662                                breakpoint: 576,
1663                                settings: {
1664                                    slidesToShow: slidesPerViewXs,
1665                                    vertical: verticalXs,
1666                                    rtl: slidesRtlXs,
1667                                },
1668                            },
1669                        ],
1670                    });
1671                });
1672        },
1673        chart: function (selector, config) {
1674            if (!$(selector).length) return;
1675
1676            $(selector).each(function () {
1677                var $this = $(this);
1678
1679                var aizChart = new Chart($this, config);
1680            });
1681        },
1682        noUiSlider: function () {
1683            if ($(".aiz-range-slider")[0]) {
1684                $(".aiz-range-slider").each(function () {
1685                    var c = document.getElementById("input-slider-range"),
1686                        d = document.getElementById("input-slider-range-value-low"),
1687                        e = document.getElementById("input-slider-range-value-high"),
1688                        f = [d, e];
1689
1690                    noUiSlider.create(c, {
1691                        start: [
1692                            parseInt(d.getAttribute("data-range-value-low")),
1693                            parseInt(e.getAttribute("data-range-value-high")),
1694                        ],
1695                        connect: true,
1696                        range: {
1697                            min: parseInt(c.getAttribute("data-range-value-min")),
1698                            max: parseInt(c.getAttribute("data-range-value-max")),
1699                        },
1700                    });
1701
1702                
1703                    const handles = c.querySelectorAll(".noUi-handle");
1704
1705                    handles.forEach((handle, index) => {
1706                        const touchArea = handle.querySelector(".noUi-touch-area");
1707
1708                        
1709                        const valueText = document.createElement("span");
1710                        valueText.classList.add("slider-value-text");
1711                        valueText.textContent = f[index].textContent || 0;
1712                        touchArea.appendChild(valueText);
1713
1714                        valueText.style.position = "absolute";
1715                        valueText.style.top = "-30px"; 
1716                        valueText.style.left = "50%";
1717                        valueText.style.transform = "translateX(-50%)";
1718                        valueText.style.fontSize = "14px";
1719                        valueText.style.color = "#fff"; 
1720                        valueText.style.background = "rgba(0, 0, 0, 0.4)"; 
1721                        valueText.style.padding = "4px 8px"; 
1722                        valueText.style.borderRadius = "4px"; 
1723                        valueText.style.whiteSpace = "nowrap";
1724                        valueText.style.pointerEvents = "none"; 
1725                        valueText.style.transition = "opacity 0.3s ease";
1726
1727
1728                    });
1729
1730                
1731                    c.noUiSlider.on("update", function (a, b) {
1732                        f[b].textContent = a[b]; // existing element
1733                        const handle = c.querySelectorAll(".noUi-handle")[b];
1734                        const label = handle.querySelector(".slider-value-text");
1735                        let value = Math.round(a[b]);
1736                        if (label) label.textContent = value.toLocaleString();
1737                        d.textContent = "0";
1738                        e.textContent = parseInt(c.getAttribute("data-range-value-max")).toLocaleString();
1739                        // label.style.display = "none";
1740                    });
1741
1742                
1743                    c.noUiSlider.on("change", function (a, b) {
1744                        rangefilter(a);
1745                    });
1746                });
1747            }
1748        },
1749
1750        zoom: function () {
1751            if ($(".img-zoom")[0]) {
1752                $(".img-zoom").zoom({
1753                    magnify: 1.5,
1754                });
1755                if (
1756                    "ontouchstart" in window ||
1757                    navigator.maxTouchPoints > 0 ||
1758                    navigator.msMaxTouchPoints > 0
1759                ) {
1760                    $(".img-zoom").trigger("zoom.destroy");
1761                }
1762            }
1763        },
1764        jsSocials: function () {
1765            if ($(".aiz-share")[0]) {
1766                $(".aiz-share").jsSocials({
1767                    showLabel: false,
1768                    showCount: false,
1769                    shares: [
1770                        {
1771                            share: "email",
1772                            logo: "lar la-envelope",
1773                        },
1774                        {
1775                            share: "twitter",
1776                            logo: "aiz-custom-x-logo",
1777                        },
1778                        {
1779                            share: "facebook",
1780                            logo: "lab la-facebook-f",
1781                        },
1782                        {
1783                            share: "linkedin",
1784                            logo: "lab la-linkedin-in",
1785                        },
1786                        {
1787                            share: "whatsapp",
1788                            logo: "lab la-whatsapp",
1789                        },
1790                    ],
1791                });
1792            }
1793        },
1794        particles: function () {
1795            particlesJS(
1796                "particles-js",
1797
1798                {
1799                    particles: {
1800                        number: {
1801                            value: 80,
1802                            density: {
1803                                enable: true,
1804                                value_area: 800,
1805                            },
1806                        },
1807                        color: {
1808                            value: "#dfdfe6",
1809                        },
1810                        shape: {
1811                            type: "circle",
1812                            stroke: {
1813                                width: 0,
1814                                color: "#000000",
1815                            },
1816                            polygon: {
1817                                nb_sides: 5,
1818                            },
1819                            image: {
1820                                src: "img/github.svg",
1821                                width: 100,
1822                                height: 100,
1823                            },
1824                        },
1825                        opacity: {
1826                            value: 0.5,
1827                            random: false,
1828                            anim: {
1829                                enable: false,
1830                                speed: 1,
1831                                opacity_min: 0.1,
1832                                sync: false,
1833                            },
1834                        },
1835                        size: {
1836                            value: 5,
1837                            random: true,
1838                            anim: {
1839                                enable: false,
1840                                speed: 40,
1841                                size_min: 0.1,
1842                                sync: false,
1843                            },
1844                        },
1845                        line_linked: {
1846                            enable: true,
1847                            distance: 150,
1848                            color: "#dfdfe6",
1849                            opacity: 0.4,
1850                            width: 1,
1851                        },
1852                        move: {
1853                            enable: true,
1854                            speed: 6,
1855                            direction: "none",
1856                            random: false,
1857                            straight: false,
1858                            out_mode: "out",
1859                            attract: {
1860                                enable: false,
1861                                rotateX: 600,
1862                                rotateY: 1200,
1863                            },
1864                        },
1865                    },
1866                    interactivity: {
1867                        detect_on: "canvas",
1868                        events: {
1869                            onhover: {
1870                                enable: true,
1871                                mode: "repulse",
1872                            },
1873                            onclick: {
1874                                enable: true,
1875                                mode: "push",
1876                            },
1877                            resize: true,
1878                        },
1879                        modes: {
1880                            grab: {
1881                                distance: 400,
1882                                line_linked: {
1883                                    opacity: 1,
1884                                },
1885                            },
1886                            bubble: {
1887                                distance: 400,
1888                                size: 40,
1889                                duration: 2,
1890                                opacity: 8,
1891                                speed: 3,
1892                            },
1893                            repulse: {
1894                                distance: 200,
1895                            },
1896                            push: {
1897                                particles_nb: 4,
1898                            },
1899                            remove: {
1900                                particles_nb: 2,
1901                            },
1902                        },
1903                    },
1904                    retina_detect: true,
1905                    config_demo: {
1906                        hide_card: false,
1907                        background_color: "#b61924",
1908                        background_image: "",
1909                        background_position: "50% 50%",
1910                        background_repeat: "no-repeat",
1911                        background_size: "cover",
1912                    },
1913                }
1914            );
1915        },
1916    };
1917    AIZ.extra = {
1918        refreshToken: function () {
1919            $.get(AIZ.data.appUrl + "/refresh-csrf").done(function (data) {
1920                AIZ.data.csrf = data;
1921            });
1922            // console.log(AIZ.data.csrf);
1923        },
1924        mobileNavToggle: function () {
1925            if (window.matchMedia("(max-width: 1200px)").matches) {
1926                $("body").addClass("side-menu-closed");
1927            }
1928            $('[data-toggle="aiz-mobile-nav"]').on("click", function () {
1929                if ($("body").hasClass("side-menu-open")) {
1930                    $("body")
1931                        .addClass("side-menu-closed")
1932                        .removeClass("side-menu-open");
1933                } else if ($("body").hasClass("side-menu-closed")) {
1934                    $("body")
1935                        .removeClass("side-menu-closed")
1936                        .addClass("side-menu-open");
1937                } else {
1938                    $("body")
1939                        .removeClass("side-menu-open")
1940                        .addClass("side-menu-closed");
1941                }
1942            });
1943            $(".aiz-sidebar-overlay").on("click", function () {
1944                $("body")
1945                    .removeClass("side-menu-open")
1946                    .addClass("side-menu-closed");
1947            });
1948        },
1949        initActiveMenu: function () {
1950            $('[data-toggle="aiz-side-menu"] a').each(function () {
1951                var pageUrl = window.location.href.split(/[?#]/)[0];
1952                if (this.href == pageUrl || $(this).hasClass("active")) {
1953                    $(this).addClass("active");
1954                    $(this).closest(".aiz-side-nav-item").addClass("mm-active");
1955                    $(this)
1956                        .closest(".level-2")
1957                        .siblings("a")
1958                        .addClass("level-2-active");
1959                    $(this)
1960                        .closest(".level-3")
1961                        .siblings("a")
1962                        .addClass("level-3-active");
1963                }
1964            });
1965        },
1966        deleteConfirm: function () {
1967            $(".confirm-delete").click(function (e) {
1968                e.preventDefault();
1969                var url = $(this).data("href");
1970                $("#delete-modal").modal("show");
1971                $("#delete-link").attr("href", url);
1972            });
1973
1974            $(".confirm-cancel").click(function (e) {
1975                e.preventDefault();
1976                var url = $(this).data("href");
1977                $("#cancel-modal").modal("show");
1978                $("#cancel-link").attr("href", url);
1979            });
1980
1981            $(".confirm-complete").click(function (e) {
1982                e.preventDefault();
1983                var url = $(this).data("href");
1984                $("#complete-modal").modal("show");
1985                $("#comfirm-link").attr("href", url);
1986            });
1987
1988            $(".confirm-alert").click(function (e) {
1989                e.preventDefault();
1990                var url = $(this).data("href");
1991                var target = $(this).data("target");
1992                $(target).modal("show");
1993                $(target).find(".comfirm-link").attr("href", url);
1994                $("#comfirm-link").attr("href", url);
1995            });
1996        },
1997        bytesToSize: function (bytes) {
1998            var sizes = ["Bytes", "KB", "MB", "GB", "TB"];
1999            if (bytes == 0) return "0 Byte";
2000            var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
2001            return Math.round(bytes / Math.pow(1024, i), 2) + " " + sizes[i];
2002        },
2003        multiModal: function () {
2004            $(document).on("show.bs.modal", ".modal", function (event) {
2005                var zIndex = 1040 + 10 * $(".modal:visible").length;
2006                $(this).css("z-index", zIndex);
2007                setTimeout(function () {
2008                    $(".modal-backdrop")
2009                        .not(".modal-stack")
2010                        .css("z-index", zIndex - 1)
2011                        .addClass("modal-stack");
2012                }, 0);
2013            });
2014            $(document).on("hidden.bs.modal", function () {
2015                if ($(".modal.show").length > 0) {
2016                    $("body").addClass("modal-open");
2017                }
2018            });
2019        },
2020        bsCustomFile: function () {
2021            $(".custom-file input").change(function (e) {
2022                var files = [];
2023                for (var i = 0; i < $(this)[0].files.length; i++) {
2024                    files.push($(this)[0].files[i].name);
2025                }
2026                if (files.length === 1) {
2027                    $(this).next(".custom-file-name").html(files[0]);
2028                } else if (files.length > 1) {
2029                    $(this)
2030                        .next(".custom-file-name")
2031                        .html(files.length + " " + AIZ.local.files_selected);
2032                } else {
2033                    $(this)
2034                        .next(".custom-file-name")
2035                        .html(AIZ.local.choose_file);
2036                }
2037            });
2038        },
2039        stopPropagation: function () {
2040            $(document).on("click", ".stop-propagation", function (e) {
2041                e.stopPropagation();
2042            });
2043        },
2044        outsideClickHide: function () {
2045            $(document).on("click", function (e) {
2046                $(".document-click-d-none").addClass("d-none");
2047            });
2048        },
2049        inputRating: function () {
2050            $(".rating-input").each(function () {
2051                $(this)
2052                    .find("label")
2053                    .on({
2054                        mouseover: function (event) {
2055                            $(this).find("i").addClass("hover");
2056                            $(this).prevAll().find("i").addClass("hover");
2057                        },
2058                        mouseleave: function (event) {
2059                            $(this).find("i").removeClass("hover");
2060                            $(this).prevAll().find("i").removeClass("hover");
2061                        },
2062                        click: function (event) {
2063                            $(this).siblings().find("i").removeClass("active");
2064                            $(this).find("i").addClass("active");
2065                            $(this).prevAll().find("i").addClass("active");
2066                        },
2067                    });
2068                if ($(this).find("input").is(":checked")) {
2069                    $(this)
2070                        .find("label")
2071                        .siblings()
2072                        .find("i")
2073                        .removeClass("active");
2074                    $(this)
2075                        .find("input:checked")
2076                        .closest("label")
2077                        .find("i")
2078                        .addClass("active");
2079                    $(this)
2080                        .find("input:checked")
2081                        .closest("label")
2082                        .prevAll()
2083                        .find("i")
2084                        .addClass("active");
2085                }
2086            });
2087        },
2088        scrollToBottom: function () {
2089            $(".scroll-to-btm").each(function (i, el) {
2090                el.scrollTop = el.scrollHeight;
2091            });
2092        },
2093        classToggle: function () {
2094            $(document).on(
2095                "click",
2096                '[data-toggle="class-toggle"]',
2097                function () {
2098                    var $this = $(this);
2099                    var target = $this.data("target");
2100                    var sameTriggers = $this.data("same");
2101                    var backdrop = $(this).data("backdrop");
2102
2103                    if ($(target).hasClass("active")) {
2104                        $(target).removeClass("active");
2105                        $(sameTriggers).removeClass("active");
2106                        $this.removeClass("active");
2107                        $("body").removeClass("overflow-hidden");
2108                    } else {
2109                        $(target).addClass("active");
2110                        $this.addClass("active");
2111                        if (backdrop == "static") {
2112                            $("body").addClass("overflow-hidden");
2113                        }
2114                    }
2115                }
2116            );
2117        },
2118        collapseSidebar: function () {
2119            $(document).on(
2120                "click",
2121                '[data-toggle="collapse-sidebar"]',
2122                function (i, el) {
2123                    var $this = $(this);
2124                    var target = $(this).data("target");
2125                    var sameTriggers = $(this).data("siblings");
2126
2127                    // var showOverlay = $this.data('overlay');
2128                    // var overlayMarkup = '<div class="overlay overlay-fixed dark c-pointer" data-toggle="collapse-sidebar" data-target="'+target+'"></div>';
2129
2130                    // showOverlay = !showOverlay ? true : showOverlay;
2131
2132                    // if (showOverlay && $(target).siblings('.overlay').length !== 1) {
2133                    //     $(target).after(overlayMarkup);
2134                    // }
2135
2136                    e.preventDefault();
2137                    if ($(target).hasClass("opened")) {
2138                        $(target).removeClass("opened");
2139                        $(sameTriggers).removeClass("opened");
2140                        $($this).removeClass("opened");
2141                    } else {
2142                        $(target).addClass("opened");
2143                        $($this).addClass("opened");
2144                    }
2145                }
2146            );
2147        },
2148        autoScroll: function () {
2149            if ($(".aiz-auto-scroll").length > 0) {
2150                $(".aiz-auto-scroll").each(function () {
2151                    var options = $(this).data("options");
2152
2153                    options = !options
2154                        ? '{"delay" : 2000 ,"amount" : 70 }'
2155                        : options;
2156
2157                    options = JSON.parse(options);
2158
2159                    this.delay = parseInt(options["delay"]) || 2000;
2160                    this.amount = parseInt(options["amount"]) || 70;
2161                    this.autoScroll = $(this);
2162                    this.iScrollHeight = this.autoScroll.prop("scrollHeight");
2163                    this.iScrollTop = this.autoScroll.prop("scrollTop");
2164                    this.iHeight = this.autoScroll.height();
2165
2166                    var self = this;
2167                    this.timerId = setInterval(function () {
2168                        if (
2169                            self.iScrollTop + self.iHeight <
2170                            self.iScrollHeight
2171                        ) {
2172                            self.iScrollTop = self.autoScroll.prop("scrollTop");
2173                            self.iScrollTop += self.amount;
2174                            self.autoScroll.animate(
2175                                { scrollTop: self.iScrollTop },
2176                                "slow",
2177                                "linear"
2178                            );
2179                        } else {
2180                            self.iScrollTop -= self.iScrollTop;
2181                            self.autoScroll.animate(
2182                                { scrollTop: "0px" },
2183                                "fast",
2184                                "swing"
2185                            );
2186                        }
2187                    }, self.delay);
2188                });
2189            }
2190        },
2191        addMore: function () {
2192            $('[data-toggle="add-more"]').each(function () {
2193                var $this = $(this);
2194                var content = $this.data("content");
2195                var target = $this.data("target");
2196
2197                $this.on("click", function (e) {
2198                    e.preventDefault();
2199                    $(target).append(content);
2200                    AIZ.plugins.bootstrapSelect();
2201                });
2202            });
2203        },
2204        removeParent: function () {
2205            $(document).on(
2206                "click",
2207                '[data-toggle="remove-parent"]',
2208                function () {
2209                    var $this = $(this);
2210                    var parent = $this.data("parent");
2211                    $this.closest(parent).remove();
2212                }
2213            );
2214        },
2215        selectHideShow: function () {
2216            $('[data-show="selectShow"]').each(function () {
2217                var target = $(this).data("target");
2218                $(this).on("change", function () {
2219                    var value = $(this).val();
2220                    // console.log(value);
2221                    $(target)
2222                        .children()
2223                        .not("." + value)
2224                        .addClass("d-none");
2225                    $(target)
2226                        .find("." + value)
2227                        .removeClass("d-none");
2228                });
2229            });
2230        },
2231        plusMinus: function () {
2232            $(".aiz-plus-minus input").each(function () {
2233                var $this = $(this);
2234                var min = parseInt($(this).attr("min"));
2235                var max = parseInt($(this).attr("max"));
2236                var value = parseInt($(this).val());
2237                if (value <= min) {
2238                    $this
2239                        .siblings('[data-type="minus"]')
2240                        .attr("disabled", true);
2241                } else if (
2242                    $this.siblings('[data-type="minus"]').attr("disabled")
2243                ) {
2244                    $this
2245                        .siblings('[data-type="minus"]')
2246                        .removeAttr("disabled");
2247                }
2248                if (value >= max) {
2249                    $this.siblings('[data-type="plus"]').attr("disabled", true);
2250                } else if (
2251                    $this.siblings('[data-type="plus"]').attr("disabled")
2252                ) {
2253                    $this.siblings('[data-type="plus"]').removeAttr("disabled");
2254                }
2255            });
2256            $(".aiz-plus-minus button")
2257                .off("click")
2258                .on("click", function (e) {
2259                    e.preventDefault();
2260
2261                    var fieldName = $(this).attr("data-field");
2262                    var type = $(this).attr("data-type");
2263                    var input = $("input[name='" + fieldName + "']");
2264                    var currentVal = parseInt(input.val());
2265
2266                    if (!isNaN(currentVal)) {
2267                        if (type == "minus") {
2268                            if (currentVal > input.attr("min")) {
2269                                input.val(currentVal - 1).change();
2270                            }
2271                            if (parseInt(input.val()) == input.attr("min")) {
2272                                $(this).attr("disabled", true);
2273                            }
2274                        } else if (type == "plus") {
2275                            if (currentVal < input.attr("max")) {
2276                                input.val(currentVal + 1).change();
2277                            }
2278                            if (parseInt(input.val()) == input.attr("max")) {
2279                                $(this).attr("disabled", true);
2280                            }
2281                        }
2282                    } else {
2283                        input.val(0);
2284                    }
2285                });
2286            $(".aiz-plus-minus input")
2287                .off("change")
2288                .on("change", function () {
2289                    var minValue = parseInt($(this).attr("min"));
2290                    var maxValue = parseInt($(this).attr("max"));
2291                    var valueCurrent = parseInt($(this).val());
2292
2293                    name = $(this).attr("name");
2294                    if (valueCurrent >= minValue) {
2295                        $(this)
2296                            .siblings("[data-type='minus']")
2297                            .removeAttr("disabled");
2298                    } else {
2299                        alert(
2300                            translate(
2301                                "Sorry, the minimum limit has been reached"
2302                            )
2303                        );
2304                        $(this).val(minValue);
2305                    }
2306                    if (valueCurrent <= maxValue) {
2307                        $(this)
2308                            .siblings("[data-type='plus']")
2309                            .removeAttr("disabled");
2310                    } else {
2311                        alert(
2312                            translate(
2313                                "Sorry, the maximum limit has been reached"
2314                            )
2315                        );
2316                        $(this).val(maxValue);
2317                    }
2318
2319                    if (typeof getVariantPrice === "function") {
2320                        getVariantPrice();
2321                    }
2322                });
2323        },
2324        hovCategoryMenu: function () {
2325            $("#category-menu-icon, #category-sidebar")
2326                .on("mouseover", function (event) {
2327                    $("#hover-category-menu")
2328                        .addClass("active")
2329                        .removeClass("d-none");
2330                })
2331                .on("mouseout", function (event) {
2332                    $("#hover-category-menu")
2333                        .addClass("d-none")
2334                        .removeClass("active");
2335                });
2336        },
2337        clickCategoryMenu: function () {
2338            var menu = $("#click-category-menu");
2339            menu.hide();
2340            menu.removeClass("d-none");
2341            $("#category-menu-bar").on("click", function (event) {
2342                if (event.target.closest('.categoriesAll')) {
2343                    event.stopPropagation();
2344                }else{
2345                    menu.slideToggle(500);
2346                    if ($("#category-menu-bar-icon").hasClass("show")) {
2347                        $("#category-menu-bar-icon").removeClass("show");
2348                    } else {
2349                        $("#category-menu-bar-icon").addClass("show");
2350                    }
2351                }
2352
2353            });
2354        },
2355        hovUserTopMenu: function () {
2356            $("#nav-user-info")
2357                .on("mouseover", function (event) {
2358                    $(".hover-user-top-menu").addClass("active");
2359                })
2360                .on("mouseout", function (event) {
2361                    $(".hover-user-top-menu").removeClass("active");
2362                });
2363        },
2364        trimAppUrl: function () {
2365            if (AIZ.data.appUrl.slice(-1) == "/") {
2366                AIZ.data.appUrl = AIZ.data.appUrl.slice(
2367                    0,
2368                    AIZ.data.appUrl.length - 1
2369                );
2370                // console.log(AIZ.data.appUrl);
2371            }
2372        },
2373        setCookie: function (cname, cvalue, exdays) {
2374            var d = new Date();
2375            d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);
2376            var expires = "expires=" + d.toUTCString();
2377            document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
2378        },
2379        getCookie: function (cname) {
2380            var name = cname + "=";
2381            var decodedCookie = decodeURIComponent(document.cookie);
2382            var ca = decodedCookie.split(";");
2383            for (var i = 0; i < ca.length; i++) {
2384                var c = ca[i];
2385                while (c.charAt(0) === " ") {
2386                    c = c.substring(1);
2387                }
2388                if (c.indexOf(name) === 0) {
2389                    return c.substring(name.length, c.length);
2390                }
2391            }
2392            return "";
2393        },
2394        
2395        acceptCookie: function () {
2396            if (!AIZ.extra.getCookie("acceptCookies")) {
2397                $(".aiz-cookie-alert:not(.club-point-alert)").addClass("show");
2398            }
2399            if (!AIZ.extra.getCookie("acceptClubPointAlert")) {
2400                $(".club-point-alert").addClass("show");
2401            }
2402
2403            $(".aiz-cookie-accept").on("click", function () {
2404                AIZ.extra.setCookie("acceptCookies", true, 60);
2405                $(".aiz-cookie-alert:not(.club-point-alert)").fadeOut(600, function() {
2406                    $(this).removeClass("show");
2407                });
2408            });
2409
2410            $(".aiz-cookie-accept-club-point").on("click", function () {
2411                AIZ.extra.setCookie("acceptClubPointAlert", true, 60);
2412                $(".aiz-cookie-alert").fadeOut(600, function() {
2413                    $(this).removeClass("show");
2414                });
2415          });
2416        },
2417        setSession: function () {
2418            $(".set-session").each(function () {
2419                var $this = $(this);
2420                var key = $this.data("key");
2421                var value = $this.data("value");
2422
2423                const now = new Date();
2424                const item = {
2425                    value: value,
2426                    expiry: now.getTime() + 3600000,
2427                };
2428
2429                $this.on("click", function () {
2430                    localStorage.setItem(key, JSON.stringify(item));
2431                });
2432            });
2433        },
2434        showSessionPopup: function () {
2435            $(".removable-session").each(function () {
2436                var $this = $(this);
2437                var key = $this.data("key");
2438                var value = $this.data("value");
2439                var item = {};
2440                if (localStorage.getItem(key)) {
2441                    item = localStorage.getItem(key);
2442                    item = JSON.parse(item);
2443                }
2444                const now = new Date();
2445                if (
2446                    typeof item.expiry == "undefined" ||
2447                    now.getTime() > item.expiry
2448                ) {
2449                    $this.removeClass("d-none");
2450                }
2451            });
2452        },
2453    };
2454
2455    setInterval(function () {
2456        AIZ.extra.refreshToken();
2457    }, 3600000);
2458
2459    // init aiz plugins, extra options
2460    AIZ.extra.initActiveMenu();
2461    AIZ.extra.mobileNavToggle();
2462    AIZ.extra.deleteConfirm();
2463    AIZ.extra.multiModal();
2464    AIZ.extra.inputRating();
2465    AIZ.extra.bsCustomFile();
2466    AIZ.extra.stopPropagation();
2467    AIZ.extra.outsideClickHide();
2468    AIZ.extra.scrollToBottom();
2469    AIZ.extra.classToggle();
2470    AIZ.extra.collapseSidebar();
2471    AIZ.extra.autoScroll();
2472    AIZ.extra.addMore();
2473    AIZ.extra.removeParent();
2474    AIZ.extra.selectHideShow();
2475    AIZ.extra.plusMinus();
2476    AIZ.extra.hovCategoryMenu();
2477    AIZ.extra.clickCategoryMenu();
2478    AIZ.extra.hovUserTopMenu();
2479    AIZ.extra.trimAppUrl();
2480    AIZ.extra.acceptCookie();
2481    AIZ.extra.setSession();
2482    AIZ.extra.showSessionPopup();
2483
2484    AIZ.plugins.metismenu();
2485    AIZ.plugins.bootstrapSelect();
2486    //AIZ.plugins.tagify();
2487    AIZ.plugins.textEditor();
2488    AIZ.plugins.tooltip();
2489    AIZ.plugins.countDown();
2490    AIZ.plugins.countDownBox();
2491    AIZ.plugins.countDownCircle();
2492    AIZ.plugins.dateRange();
2493    AIZ.plugins.timePicker();
2494    AIZ.plugins.colorPicker();
2495    AIZ.plugins.fooTable();
2496    AIZ.plugins.slickCarousel();
2497    AIZ.plugins.noUiSlider();
2498    AIZ.plugins.zoom();
2499    AIZ.plugins.jsSocials();
2500
2501    // initialization of aiz uploader
2502    AIZ.uploader.initForInput();
2503    AIZ.uploader.removeAttachment();
2504    AIZ.uploader.previewGenerate();
2505
2506    // $(document).ajaxComplete(function(){
2507    //     AIZ.plugins.bootstrapSelect('refresh');
2508    // });
2509})(jQuery);
2510
2511
2512 // Footer description expand
2513    const toggleButton = document.getElementById("toggle-btn");
2514    const textParagraph = document.querySelector(".footer-text-control");
2515
2516    if (toggleButton && textParagraph) {
2517    toggleButton.addEventListener("click", () => {
2518        const isExpanded =
2519        textParagraph.style.maxHeight &&
2520        textParagraph.style.maxHeight !== "80px";
2521
2522        // Toggle between expanded and collapsed state
2523        textParagraph.style.maxHeight = isExpanded
2524        ? "80px"
2525        : `${textParagraph.scrollHeight}px`;
2526
2527        toggleButton.textContent = isExpanded ? "Read More" : "Show Less";
2528    });
2529    }
2530
2531
2532
2533document.querySelectorAll('.video-container').forEach(container => {
2534    const video = container.querySelector('.upload_video');
2535    const playBtn = container.querySelector('.playButton');
2536    const playPauseBtn = container.querySelector('.playPauseBtn');
2537    const muteBtn = container.querySelector('.muteBtn');
2538    const progress = container.querySelector('.progress');
2539    const currentTimeText = container.querySelector('.currentTime');
2540    const durationText = container.querySelector('.duration');
2541    const openPopupBtn = container.querySelector('.openPopupBtn'); 
2542    const popupVideo = document.getElementById('popupVideo');      
2543    const videoModal = document.getElementById('videoModal');      
2544    const closeModalBtn = document.getElementById('closeModalBtn');
2545
2546    // Format time (mm:ss)
2547    function formatTime(time) {
2548        const minutes = Math.floor(time / 60);
2549        const seconds = Math.floor(time % 60);
2550        return `${minutes}:${seconds.toString().padStart(2, '0')}`;
2551    }
2552
2553    // Initial metadata load
2554    video.addEventListener('loadedmetadata', () => {
2555        durationText.innerText = formatTime(video.duration);
2556    });
2557
2558    // Play button
2559    playBtn.addEventListener('click', () => {
2560        video.play();
2561        playBtn.classList.add('hidden');
2562        playPauseBtn.innerText = '⏸';
2563    });
2564
2565    // Toggle play/pause on video click
2566    video.addEventListener('click', () => {
2567        if (video.paused) {
2568            video.play();
2569            playBtn.classList.add('hidden');
2570            playPauseBtn.innerText = '⏸';
2571        } else {
2572            video.pause();
2573            playBtn.classList.remove('hidden');
2574            playPauseBtn.innerText = '▶';
2575        }
2576    });
2577
2578    // Play/Pause Button
2579    playPauseBtn.addEventListener('click', () => {
2580        if (video.paused) {
2581            video.play();
2582            playBtn.classList.add('hidden');
2583            playPauseBtn.innerText = '⏸';
2584        } else {
2585            video.pause();
2586            playBtn.classList.remove('hidden');
2587            playPauseBtn.innerText = '▶';
2588        }
2589    });
2590
2591    // Mute / Unmute
2592    muteBtn.addEventListener('click', () => {
2593        video.muted = !video.muted;
2594        muteBtn.innerText = video.muted ? '🔈' : '🔊';
2595    });
2596
2597    // Video ended
2598    video.addEventListener('ended', () => {
2599        playBtn.classList.remove('hidden');
2600        playPauseBtn.innerText = '▶';
2601    });
2602
2603    // Update progress and time
2604    video.addEventListener('timeupdate', () => {
2605        if (!isNaN(video.duration)) {
2606            progress.value = (video.currentTime / video.duration) * 100;
2607            currentTimeText.innerText = formatTime(video.currentTime);
2608        }
2609    });
2610
2611    // Seek video
2612    progress.addEventListener('input', () => {
2613        const seekTime = (progress.value / 100) * video.duration;
2614        video.currentTime = seekTime;
2615    });
2616
2617    // Open modal popup
2618if (openPopupBtn) {
2619    openPopupBtn.addEventListener('click', () => {
2620        popupVideo.innerHTML = '';
2621        Array.from(video.getElementsByTagName('source')).forEach(source => {
2622            const cloned = document.createElement('source');
2623            cloned.src = source.src;
2624            cloned.type = source.type;
2625            popupVideo.appendChild(cloned);
2626        });
2627
2628     
2629        popupVideo.muted = false;
2630
2631        popupVideo.load();
2632        popupVideo.currentTime = video.currentTime;
2633        popupVideo.play();
2634        videoModal.classList.add('active');
2635    });
2636}
2637
2638// Close modal popup
2639if (closeModalBtn) {
2640    closeModalBtn.addEventListener('click', () => {
2641        popupVideo.pause();
2642        popupVideo.currentTime = 0;
2643        videoModal.classList.remove('active');
2644    });
2645}
2646
2647
2648
2649});
2650        
2651
2652
2653// header 5 js
2654
2655document.addEventListener('DOMContentLoaded', function () {
2656    const gearToggle = document.querySelector('.gear-toggle');
2657    const topBarContent = document.querySelector('.top-bar-content');
2658
2659    if (gearToggle && topBarContent) {
2660        gearToggle.addEventListener('click', function () {
2661            this.classList.toggle('active');
2662            topBarContent.classList.toggle('show');
2663        });
2664    }
2665});
2666
2667document.addEventListener('DOMContentLoaded', function () {
2668    const searchIconDesktop = document.querySelector('.search-icon-desktop');
2669    const searchIconMobile = document.querySelector('.search-icon-mobile');
2670    const searchContainer = document.querySelector('.desktop-search-container');
2671    const searchClose = document.querySelector('.search-close-desktop');
2672    const headerMenus = document.querySelector('.header-menus-container');
2673    const searchInput = document.getElementById('search');
2674
2675    function openSearch() {
2676        if (searchContainer) {
2677            searchContainer.classList.remove('d-none');
2678            setTimeout(() => {
2679                searchContainer.classList.add('expanded');
2680                $('.search-icon-mobile-hide').addClass('d-none');
2681                if (headerMenus) headerMenus.classList.add('hidden');
2682            }, 10);
2683            if (searchInput) searchInput.focus();
2684        }
2685    }
2686
2687    function closeSearch() {
2688        if (searchContainer) {
2689            searchContainer.classList.remove('expanded');
2690            setTimeout(() => {
2691                $('.search-icon-mobile-hide').removeClass('d-none');
2692                searchContainer.classList.add('d-none');
2693                if (headerMenus) headerMenus.classList.remove('hidden');
2694            }, 300);
2695        }
2696    }
2697
2698    [searchIconDesktop, searchIconMobile].forEach(icon => {
2699        if (icon) {
2700            icon.addEventListener('click', function (e) {
2701                e.preventDefault();
2702                openSearch();
2703            });
2704        }
2705    });
2706
2707    if (searchClose && searchInput) {
2708        searchClose.addEventListener('click', function (e) {
2709            e.preventDefault();
2710            if (searchInput.value.trim() !== '') {
2711                searchInput.value = '';
2712                searchInput.focus();
2713            } else {
2714                closeSearch();
2715            }
2716        });
2717    }
2718
2719    document.addEventListener('keydown', function (e) {
2720        if (e.key === 'Escape' && !searchContainer.classList.contains('d-none')) {
2721            closeSearch();
2722        }
2723    });
2724
2725    document.addEventListener('click', function (e) {
2726    if (
2727        (!searchContainer || !searchContainer.contains(e.target)) &&
2728        (!searchIconDesktop || !searchIconDesktop.contains(e.target)) &&
2729        (!searchIconMobile || !searchIconMobile.contains(e.target))
2730    ) {
2731        if (searchContainer && !searchContainer.classList.contains('d-none')) {
2732            closeSearch();
2733        }
2734    }
2735});
2736
2737
2738    if (searchInput && searchClose) {
2739    searchInput.addEventListener('input', function () {
2740        const icon = searchClose.querySelector('i');
2741        if (!icon) return; 
2742
2743        if (this.value.trim()) {
2744            icon.classList.remove('la-search');
2745            icon.classList.add('la-times');
2746        } else {
2747            icon.classList.remove('la-times');
2748            icon.classList.add('la-search');
2749        }
2750    });
2751}
2752});
2753
2754
2755
2756function toggleChildDropdown(el, event) {
2757    if (event) event.stopPropagation();
2758
2759    let $submenu = $(el).next('.child-dropdown');
2760    if ($submenu.hasClass('show')) {
2761        $submenu.removeClass('show');
2762    } else {
2763        $('.child-dropdown').removeClass('show');
2764        $submenu.addClass('show');
2765    }
2766}
2767
2768
2769
2770$('#category-menu-bar').on('click', function () {
2771    $(this).find('.menu-icon').toggleClass('rotated');
2772});
2773
2774
2775//product details gallery
2776$('.product-gallery-carousel').on('beforeChange', function(event, slick, currentSlide, nextSlide){
2777    $(slick.$slides[currentSlide]).find('iframe').each(function(){
2778        let src = $(this).attr('src');
2779        $(this).attr('src', src);
2780    });
2781});
2782
2783//destroy zoom when mouse on expand btn 
2784// Only run hover zoom disable on non-touch devices
2785if (!("ontouchstart" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0)) {
2786    $(document).on("mouseenter", ".wd-show-product-gallery-wrap a", function(e){
2787        $(".img-zoom").trigger("zoom.destroy");
2788    }).on("mouseleave", ".wd-show-product-gallery-wrap a", function(e){
2789        $(".img-zoom").zoom({ magnify: 1.5 });
2790    });
2791}
2792
2793
2794//for custom x logo
2795document.addEventListener("DOMContentLoaded", function () {
2796    const xLogo = `
2797      <svg viewBox="0 0 1200 1227" xmlns="http://www.w3.org/2000/svg">
2798        <path d="M714.2 529.5 1160 0H1050.9L666.4 
2799          450.9 357.2 0H0l468.9 681.4L0 1226.9h109.1l409-493.3 
2800          330.2 493.3H1200L714.2 529.5zm-144.5 
2801          170.9-47.4-68.1L160 79.8h154.6l304.9 
2802          438.8 47.4 68.1 395.2 568.5H907.5L569.7 
2803          700.4z" />
2804      </svg>
2805    `;
2806    
2807    document.querySelectorAll('.aiz-custom-x-logo').forEach(el => {
2808      el.outerHTML = xLogo.replace('<svg', '<svg class="aiz-custom-x-logo"');
2809    });
2810});
2811
2812$(".jssocials-share-twitter .jssocials-share-link")
2813  .css("background-color", "#332f2fff") 
2814  .hover(
2815    function() {
2816      $(this).css("background-color", "#000"); 
2817    },
2818    function() {
2819      $(this).css("background-color", "#332f2fff");
2820    }
2821);
2822
2823/* top-banner-scroll-text */
2824function initTopBarScroll() {
2825    const inners = document.querySelectorAll(".top-banner-scroll-inner");
2826    const speed = 80; 
2827
2828    inners.forEach(inner => {
2829        const parentWidth = inner.parentElement.offsetWidth;
2830        const textWidth = inner.scrollWidth;
2831
2832        inner.style.animation = "none";
2833        inner.style.transform = "translateX(0)";
2834        inner.style.animationPlayState = "running";
2835
2836        if (textWidth > parentWidth) {
2837            if (!inner.dataset.cloned) {
2838                const clone = inner.innerHTML;
2839                inner.innerHTML += clone;
2840                inner.dataset.cloned = true;
2841            }
2842
2843            const totalWidth = inner.scrollWidth;
2844            const duration = totalWidth / speed; 
2845
2846            inner.style.animation = `top-banner-scroll-left ${duration}s linear infinite`;
2847            inner.style.animationPlayState = "running"; 
2848        } else {
2849            inner.style.display = "flex";
2850            inner.style.justifyContent = "center";
2851        }
2852    });
2853}
2854
2855document.addEventListener("DOMContentLoaded", () => {
2856    const inners = document.querySelectorAll(".top-banner-scroll-inner");
2857
2858    inners.forEach(inner => {
2859        inner.addEventListener("mouseenter", () => {
2860            inner.style.animationPlayState = "paused";
2861        });
2862
2863        inner.addEventListener("mouseleave", () => {
2864            inner.style.animationPlayState = "running";
2865        });
2866    });
2867});
2868
2869document.addEventListener("DOMContentLoaded", initTopBarScroll);
2870window.addEventListener("resize", initTopBarScroll);
2871
2872
2873
2874// Gallery Image vIEWER 
2875
2876document.addEventListener("DOMContentLoaded", function() {
2877    const modal = document.getElementById("lightboxModal");
2878    const modalImg = document.getElementById("lightboxImage");
2879    const closeBtn = document.querySelector(".lightbox-close");
2880    const zoomInBtn = document.getElementById("zoomInBtn");
2881    const zoomOutBtn = document.getElementById("zoomOutBtn");
2882    const fullscreenBtn = document.getElementById("fullscreenBtn");
2883    const copyLinkBtn = document.getElementById("copyLinkBtn");
2884    const downloadBtn = document.getElementById("downloadBtn");
2885    const prevBtn = document.getElementById("prevBtn");
2886    const nextBtn = document.getElementById("nextBtn");
2887    const imageCounter = document.getElementById("imageCounter");
2888
2889    const galleryImgs = document.querySelectorAll(".lightbox-item img.lightbox-source");
2890
2891    let currentIndex = 0;
2892    let scale = 1;
2893
2894    function openModal(index, direction = 0) {
2895        if (!modal || !modalImg) return;
2896
2897        currentIndex = index;
2898        modal.style.display = "block";
2899
2900        // Slide animation
2901        modalImg.style.transition = "transform 0.3s ease, opacity 0.3s ease";
2902        modalImg.style.transform = `translate(calc(-50% + ${direction * 100}%), -50%) scale(${scale})`;
2903        modalImg.style.opacity = 0;
2904
2905        setTimeout(() => {
2906            modalImg.src = galleryImgs[index].dataset.src || galleryImgs[index].src;
2907            scale = 1; // reset zoom
2908            modalImg.style.transform = `translate(-50%, -50%) scale(${scale})`;
2909            modalImg.style.opacity = 1;
2910            $('.lightbox-content').css('cursor', 'zoom-in');
2911            updateCounter();
2912        }, 200);
2913    }
2914
2915    function updateCounter() {
2916        if (imageCounter) {
2917            imageCounter.textContent = `${currentIndex + 1} / ${galleryImgs.length}`;
2918        }
2919    }
2920
2921    // Gallery buttons
2922    document.querySelectorAll(".woodmart-show-product-gallery").forEach((btn, i) => {
2923        btn.addEventListener("click", function(e) {
2924            e.preventDefault();
2925            openModal(i);
2926        });
2927    });
2928
2929    // Double click to zoom
2930    if (modalImg) {
2931        modalImg.addEventListener("dblclick", () => {
2932            scale = scale === 1 ? 2 : 1;
2933            modalImg.style.transform = `translate(-50%, -50%) scale(${scale})`;
2934            $('.lightbox-content').css('cursor', scale === 1 ? 'zoom-in' : 'zoom-out');
2935        });
2936    }
2937
2938    // Close modal
2939    if (closeBtn && modal) {
2940        closeBtn.onclick = () => modal.style.display = "none";
2941    }
2942
2943    // Previous image
2944    if (prevBtn) {
2945        prevBtn.onclick = () => {
2946            currentIndex = (currentIndex - 1 + galleryImgs.length) % galleryImgs.length;
2947            openModal(currentIndex, 0);
2948        };
2949    }
2950
2951    // Next image
2952    if (nextBtn) {
2953        nextBtn.onclick = () => {
2954            currentIndex = (currentIndex + 1) % galleryImgs.length;
2955            openModal(currentIndex, 0);
2956        };
2957    }
2958
2959    // Zoom in
2960    if (zoomInBtn && modalImg) {
2961        zoomInBtn.onclick = () => {
2962            scale += 0.2;
2963            modalImg.style.transform = `translate(-50%, -50%) scale(${scale})`;
2964            $('.lightbox-content').css('cursor', 'zoom-out');
2965        };
2966    }
2967
2968    // Zoom out
2969    if (zoomOutBtn && modalImg) {
2970        zoomOutBtn.onclick = () => {
2971            scale = Math.max(0.2, scale - 0.2);
2972            modalImg.style.transform = `translate(-50%, -50%) scale(${scale})`;
2973            $('.lightbox-content').css('cursor', 'zoom-in');
2974        };
2975    }
2976
2977    // Fullscreen toggle
2978    if (fullscreenBtn && modal) {
2979        fullscreenBtn.onclick = () => {
2980            if (!document.fullscreenElement) {
2981                modal.requestFullscreen();
2982            } else {
2983                document.exitFullscreen();
2984            }
2985        };
2986    }
2987
2988    // Copy link
2989    if (copyLinkBtn && modalImg) {
2990        copyLinkBtn.onclick = () => {
2991            navigator.clipboard.writeText(modalImg.src)
2992                .then(() => AIZ.plugins.notify('success', 'Link copied to clipboard'));
2993        };
2994    }
2995
2996    // Download
2997    if (downloadBtn && modalImg) {
2998        downloadBtn.onclick = () => {
2999            const link = document.createElement('a');
3000            link.href = modalImg.src;
3001            link.download = 'image';
3002            link.click();
3003        };
3004    }
3005
3006    // Close modal on outside click
3007    if (modal) {
3008        modal.addEventListener("click", function(e) {
3009            if (e.target === modal) modal.style.display = "none";
3010        });
3011    }
3012
3013    // Arrow keys navigation
3014    document.addEventListener("keydown", function(e) {
3015        if (!modal || modal.style.display !== "block") return;
3016        if (e.key === "ArrowRight" && nextBtn) nextBtn.click();
3017        if (e.key === "ArrowLeft" && prevBtn) prevBtn.click();
3018        if (e.key === "Escape") modal.style.display = "none";
3019    });
3020});
3021
3022// smart bar 
3023document.addEventListener("DOMContentLoaded", function () {
3024
3025    const smartBar = document.getElementById('smart-bar');
3026    const trigger = document.getElementById('smart-bar-trigger');
3027
3028    if (!smartBar || !trigger) return;
3029
3030    smartBar.classList.remove('visible');
3031    smartBar.classList.add('hidden');
3032
3033    const showSmartBar = () => {
3034        smartBar.classList.remove('hidden');
3035        smartBar.classList.add('visible');
3036    };
3037
3038    const hideSmartBar = () => {
3039        smartBar.classList.remove('visible');
3040        smartBar.classList.add('hidden');
3041    };
3042
3043    const observer = new IntersectionObserver(
3044        (entries) => {
3045            entries.forEach(entry => {
3046
3047                if (entry.isIntersecting && entry.boundingClientRect.top >= 0) {
3048                    showSmartBar();
3049                }
3050                else if (entry.boundingClientRect.top > 0) {
3051                    hideSmartBar();
3052                }
3053                else {
3054                    showSmartBar();
3055                }
3056
3057            });
3058        },
3059        {
3060            root: null,
3061            threshold: 0
3062        }
3063    );
3064
3065    observer.observe(trigger);
3066
3067    const triggerPosition = trigger.getBoundingClientRect();
3068    if (triggerPosition.top <= window.innerHeight) {
3069        showSmartBar();
3070    } else {
3071        hideSmartBar();
3072    }
3073
3074});
3075
3076
3077function closeSmartBar() {
3078    const bar = document.getElementById('smart-bar');
3079    if (!bar) return;
3080
3081    bar.classList.add('closing');
3082
3083    bar.addEventListener('transitionend', function handler() {
3084        bar.removeEventListener('transitionend', handler);
3085        bar.remove();
3086    });
3087}
3088
3089function scrollToTopSection() {
3090    const topSection = document.querySelector('.product-details > .container');
3091
3092    if(topSection) {
3093        topSection.scrollIntoView({
3094            behavior: 'smooth',
3095            block: 'start'     
3096        });
3097    }
3098}
3099
3100
3101
3102//for header-6 gear icon show-hide
3103function hideOptions() {
3104    document.querySelector('.silder-toggle').classList.add('d-none');
3105}
3106
3107function showOptions() {
3108    document.querySelector('.silder-toggle').classList.remove('d-none');
3109}
3110
3111
3112
3113// Product Clone
3114
3115function duplicateProduct(productId = null, type = null) {
3116    let selectedProductId;
3117
3118    if (productId === null) {
3119        var selectedProduct = $('input[name="selected_product_id"]:checked');
3120        selectedProductId = selectedProduct.val();
3121
3122        if (!selectedProductId) {
3123            AIZ.plugins.notify('warning', 'Please select a product');
3124            return;
3125        }
3126
3127        $('#products_select_modal').modal('hide');
3128    } else {
3129        selectedProductId = productId;
3130    }
3131
3132    $('#loading-modal').modal('show', { backdrop: 'static' });
3133
3134    $.ajax({
3135        url: duplicateProductUrl.replace(':id', selectedProductId) + (type ? '?type=' + type : ''),
3136        method: 'GET',
3137        success: function(response) {
3138            $('#loading-modal').modal('hide');
3139           if (response.success) {
3140                AIZ.plugins.notify('success', response.message);
3141            } else {
3142                AIZ.plugins.notify('danger', response.message);
3143                return; 
3144            }
3145
3146
3147            if (response.redirect) {
3148                setTimeout(function() {
3149                    window.location.href = response.redirect;
3150                }, 1000);
3151            } else {
3152                setTimeout(function() {
3153                    location.reload();
3154                }, 1000);
3155            }
3156        },
3157        error: function(xhr) {
3158            $('#loading-modal').modal('hide');
3159            AIZ.plugins.notify('danger', 'Something went wrong');
3160        }
3161    });
3162}
3163
3164
3165
3166// Open Bulk Action Modal
3167
3168function showBulkActionModal(){
3169
3170    $('#bulk-action-modal').modal('show');
3171}
3172
3173//Hide BulkActionModal
3174function hideBulkActionModal(){
3175    $('#bulk-action-modal').modal('hide');
3176}
3177
3178function initFooTable() {
3179    generateDetails();
3180    initToggles();
3181    handleResize();
3182    updateToggleVisibility(); // Initial check
3183}
3184
3185/* Build details rows for hidden columns */
3186function generateDetails() {
3187    // Remove old details rows
3188    document.querySelectorAll(".details-row").forEach(el => el.remove());
3189
3190    document.querySelectorAll(".data-row").forEach(row => {
3191        const details = document.createElement("tr");
3192        details.className = "details-row";
3193
3194        // Mark this details row as belonging to its data row
3195        details.dataset.parentId = row.dataset.rowId || row.getAttribute("id") || [...document.querySelectorAll(".data-row")].indexOf(row);
3196
3197        const td = document.createElement("td");
3198        td.colSpan = row.children.length;
3199
3200        let html = "";
3201
3202        [...row.children].forEach(cell => {
3203            if (cell.querySelector(".toggle-plus-minus-btn")) return;
3204
3205            if (window.getComputedStyle(cell).display === "none") {
3206                const label = cell.dataset.label || "";
3207                html += `
3208                    <div class="detail-item py-10px">
3209                        <span class="detail-label d-block text-uppercase fs-12 fw-700 text-secondary mb-2">
3210                            ${label}:
3211                        </span>
3212                        <span class="detail-value d-block">${cell.innerHTML}</span>
3213                    </div>
3214                `;
3215            }
3216        });
3217
3218        td.innerHTML = html;
3219        details.appendChild(td);
3220
3221        row.insertAdjacentElement("afterend", details);
3222
3223        // check if it was open before rebuild
3224        const toggleBtn = row.querySelector(".toggle-plus-minus-btn");
3225        if (toggleBtn && toggleBtn.textContent === "-") {
3226            details.style.display = "table-row";
3227            toggleBtn.textContent = "-"; // keep minus
3228        } else {
3229            details.style.display = "none";
3230            if (toggleBtn) toggleBtn.textContent = "+";
3231        }
3232    });
3233}
3234
3235/* Toggle button handler */
3236function initToggles() {
3237    document.querySelectorAll(".toggle-plus-minus-btn").forEach(btn => {
3238        btn.onclick = () => {
3239            const row = btn.closest("tr");
3240            const details = row.nextElementSibling;
3241            const isOpen = details.style.display === "table-row";
3242
3243            details.style.display = isOpen ? "none" : "table-row";
3244            btn.textContent = isOpen ? "+" : "-";
3245        };
3246    });
3247}
3248
3249/* Show toggle only if there are hidden columns */
3250function updateToggleVisibility() {
3251    document.querySelectorAll(".data-row").forEach(row => {
3252        const toggleBtn = row.querySelector(".toggle-plus-minus-btn");
3253        if (!toggleBtn) return;
3254
3255        const hasHidden = [...row.children].some(cell =>
3256            cell !== toggleBtn.parentElement && window.getComputedStyle(cell).display === "none"
3257        );
3258
3259        toggleBtn.style.display = hasHidden ? "inline-block" : "none";
3260
3261        // Reset to + if no hidden columns (safety)
3262        if (!hasHidden) {
3263            const details = row.nextElementSibling;
3264            if (details && details.classList.contains("details-row")) {
3265                details.style.display = "none";
3266            }
3267            toggleBtn.textContent = "+";
3268        }
3269    });
3270}
3271
3272function handleResize() {
3273    const openStates = new Map();
3274    document.querySelectorAll(".data-row").forEach(row => {
3275        const btn = row.querySelector(".toggle-plus-minus-btn");
3276        const key = row.dataset.rowId || [...document.querySelectorAll(".data-row")].indexOf(row);
3277        if (btn) {
3278            openStates.set(key, btn.textContent === "-");
3279        }
3280    });
3281
3282    generateDetails();
3283    document.querySelectorAll(".data-row").forEach(row => {
3284        const btn = row.querySelector(".toggle-plus-minus-btn");
3285        if (!btn) return;
3286
3287        const key = row.dataset.rowId || [...document.querySelectorAll(".data-row")].indexOf(row);
3288        if (openStates.get(key)) {
3289            const details = row.nextElementSibling;
3290            if (details && details.classList.contains("details-row")) {
3291                details.style.display = "table-row";
3292            }
3293            btn.textContent = "-";
3294        }
3295    });
3296
3297    // Step 4: Update toggle visibility (in case breakpoints changed)
3298    updateToggleVisibility();
3299}
3300
3301// Throttle resize for performance
3302let resizeTimeout;
3303window.addEventListener("resize", () => {
3304    clearTimeout(resizeTimeout);
3305    resizeTimeout = setTimeout(handleResize, 100);
3306});
3307//behabiour for Table Nav Tabs Scroll 
3308document.addEventListener('DOMContentLoaded', () => {
3309    const tableTabsContainer = document.querySelector('.table-tabs-container');
3310    // If element not found — break
3311    if (!tableTabsContainer) return;
3312    const tableTabs = tableTabsContainer.querySelectorAll('.nav-link');
3313    tableTabs.forEach(tab => {
3314        tab.addEventListener('click', () => {
3315            const offset =
3316                tab.offsetLeft - tableTabsContainer.clientWidth / 2 + tab.clientWidth / 2;
3317
3318            tableTabsContainer.scrollTo({
3319                left: offset,
3320                behavior: "smooth"
3321            });
3322        });
3323    });
3324});
3325
3326
3327
3328function startTimer() {
3329    if (currentIdx >= cardIds.length) return;
3330
3331    let activeId = cardIds[currentIdx];
3332    let $card = $('#' + activeId);
3333    let $bar = $('#fill-' + activeId);
3334    let width = 0;
3335
3336    // show close button
3337    $card.find('.btn-close-stack').removeClass('d-none');
3338
3339    clearInterval(timer);
3340
3341    // dynamic duration (seconds)
3342    let durationSeconds = window.POPUP_DURATION || 5;
3343
3344    // 100 steps progress bar
3345    let intervalTime = (durationSeconds * 1000) / 100;
3346
3347    timer = setInterval(() => {
3348        width += 1;
3349        $bar.css('width', width + '%');
3350
3351        if (width >= 100) {
3352            clearInterval(timer);
3353            removeTopCard(activeId, true);
3354        }
3355    }, intervalTime);
3356}
3357
3358function removeTopCard(id, auto = false) {
3359
3360    if (id !== cardIds[currentIdx]) return;
3361
3362    let $card = $('#' + id);
3363
3364    // store session removal state
3365    let key = $card.closest('.removable-session').data('key');
3366    if (key) {
3367        const item = {
3368            value: "removed",
3369            expiry: Date.now()+(3600000),
3370        };
3371        localStorage.setItem(key, JSON.stringify(item));
3372    }
3373
3374    $card.addClass('exit-now');
3375
3376    setTimeout(() => {
3377        $card.hide();
3378        currentIdx++;
3379        realignStack();
3380
3381        if (currentIdx >= cardIds.length) {
3382            $('#stack-popup-main-wrapper').fadeOut(200);
3383            $('body').removeClass('modal-open');
3384            $('.absolute-full').fadeOut(200);
3385            return;
3386        }
3387
3388        startTimer();
3389    }, 500);
3390}
3391
3392function realignStack() {
3393    $('.card-wrapper:visible').each(function (i) {
3394        $(this).removeClass(function (index, className) {
3395            return (className.match(/(^|\s)card-pos-\S+/g) || []).join(' ');
3396        });
3397        $(this).addClass('card-pos-' + i);
3398    });
3399}
3400
3401function smoothlyRemoveElement($element) {
3402    if (!$element || $element.length === 0) return;
3403    $element.addClass('removing');
3404
3405    setTimeout(() => {
3406        try {
3407            var sessionKey = $element.data('key') || $element.closest('.removable-session').data('key');
3408            if (sessionKey) {
3409                const now = new Date();
3410                const item = {
3411                    value: 'removed',
3412                    expiry: now.getTime() + 3600000
3413                };
3414                localStorage.setItem(sessionKey, JSON.stringify(item));
3415            }
3416        } catch (err) {
3417            console.error('safely storing alert-dismissal key failed', err);
3418        }
3419
3420        $element.remove();
3421        $(document).trigger('alertRemoved', [$element]);
3422    }, 600);
3423}
3424
3425// new image Uploader 
3426
3427$(document).ready(function() {
3428
3429    $(document).on('click', '.direct-uploader', function(e) {
3430        if (!$(e.target).is('input')) {
3431            $(this).find('input[type="file"]')[0].click();
3432        }
3433    });
3434
3435    $(document).on('change', '.direct-uploader input', function(e) {
3436        let input = this;
3437        let files = Array.from(input.files);
3438        let wrapper = $(this).closest('.form-group');
3439        let previewBox = wrapper.find('.direct-preview');
3440        let errorBox = wrapper.find('.upload-error');
3441        let isMultiple = $(this).prop('multiple');
3442
3443        errorBox.text('');
3444        const allowedExts = ['jpg', 'jpeg', 'png', 'webp'];
3445        let invalidFiles = files.filter(f => {
3446            const ext = f.name.split('.').pop().toLowerCase();
3447            return !allowedExts.includes(ext);
3448        });
3449
3450        if (invalidFiles.length > 0) {
3451            errorBox.text('Only JPG, JPEG, PNG, and WEBP images are allowed.');
3452            input.value = '';
3453            return;
3454        }
3455
3456        let existingCount = previewBox.find('.direct-file-preview-item').length;
3457        let totalCount = existingCount + files.length;
3458
3459        if (isMultiple && totalCount > 6) {
3460            errorBox.text('Maximum 6 files are allowed.');
3461            input.value = '';
3462            return;
3463        }
3464
3465        if (!isMultiple) {
3466            previewBox.html('');
3467        } else {
3468            let dt = new DataTransfer();
3469
3470            if (input._storedFiles) {
3471                input._storedFiles.forEach(f => dt.items.add(f));
3472            }
3473
3474            files.forEach(f => dt.items.add(f));
3475
3476            input.files = dt.files;
3477            input._storedFiles = Array.from(dt.files);
3478        }
3479
3480        files.forEach((file) => {
3481
3482            if (!file.type.startsWith('image/') && !file.type.startsWith('video/')) return;
3483
3484            let reader = new FileReader();
3485
3486            reader.onload = function(e) {
3487
3488                if (file.type.startsWith('image/')) {
3489                    let img = new Image();
3490                    img.src = e.target.result;
3491                    img.onload = function() {
3492                        EXIF.getData(img, function() {
3493                            let orientation = EXIF.getTag(this, "Orientation") || 1;
3494                            let canvas = document.createElement('canvas');
3495                            let ctx = canvas.getContext('2d');
3496
3497                            let width = img.width;
3498                            let height = img.height;
3499
3500                            let maxSize = 800;
3501
3502                            if (width > maxSize || height > maxSize) {
3503                                let scale = Math.min(maxSize / width, maxSize / height);
3504                                width = Math.round(width * scale);
3505                                height = Math.round(height * scale);
3506                            }
3507
3508                            switch (orientation) {
3509
3510                                case 2: 
3511                                    canvas.width = width;
3512                                    canvas.height = height;
3513                                    ctx.translate(width, 0);
3514                                    ctx.scale(-1, 1);
3515                                    break;
3516
3517                                case 3: 
3518                                    canvas.width = width;
3519                                    canvas.height = height;
3520                                    ctx.translate(width, height);
3521                                    ctx.rotate(Math.PI);
3522                                    break;
3523
3524                                case 4: 
3525                                    canvas.width = width;
3526                                    canvas.height = height;
3527                                    ctx.translate(0, height);
3528                                    ctx.scale(1, -1);
3529                                    break;
3530
3531                                case 5:
3532                                    canvas.width = height;
3533                                    canvas.height = width;
3534                                    ctx.rotate(0.5 * Math.PI);
3535                                    ctx.scale(1, -1);
3536                                    break;
3537
3538                                case 6: 
3539                                    canvas.width = height;
3540                                    canvas.height = width;
3541                                    ctx.rotate(0.5 * Math.PI);
3542                                    ctx.translate(0, -height);
3543                                    break;
3544
3545                                case 7:
3546                                    canvas.width = height;
3547                                    canvas.height = width;
3548                                    ctx.rotate(0.5 * Math.PI);
3549                                    ctx.translate(width, -height);
3550                                    ctx.scale(-1, 1);
3551                                    break;
3552
3553                                case 8: 
3554                                    canvas.width = height;
3555                                    canvas.height = width;
3556                                    ctx.rotate(-0.5 * Math.PI);
3557                                    ctx.translate(-width, 0);
3558                                    break;
3559
3560                                default: 
3561                                    canvas.width = width;
3562                                    canvas.height = height;
3563                            }
3564
3565                            ctx.drawImage(img, 0, 0, width, height);
3566
3567                            let resizedDataUrl = canvas.toDataURL(file.type, 0.8);
3568
3569                            let thumbHTML = `<img src="${resizedDataUrl}" class="img-fit">`;
3570
3571                            appendPreview(wrapper, file, thumbHTML);
3572
3573                        });
3574
3575                    };
3576
3577                } else if (file.type.startsWith('video/')) {
3578                    let thumbHTML = `
3579                        <video width="100%" height="100%" controls>
3580                            <source src="${e.target.result}" type="${file.type}">
3581                        </video>`;
3582
3583                    appendPreview(wrapper, file, thumbHTML);
3584                }
3585            };
3586
3587            reader.readAsDataURL(file);
3588        });
3589    });
3590
3591    function appendPreview(wrapper, file, thumbHTML) {
3592        let previewBox = wrapper.find('.direct-preview');
3593
3594        let html = `
3595            <div class="direct-file-preview-item" title="${file.name}">
3596                <div class="thumb d-flex justify-content-center align-items-center">
3597                    ${thumbHTML}
3598                </div>
3599                <div class="col body">
3600                    <h6 class="d-flex">
3601                        <span class="text-truncate title">${file.name}</span>
3602                    </h6>
3603                    <p>${(file.size/1024).toFixed(1)} KB</p>
3604                </div>
3605                <div class="remove">
3606                    <button class="btn btn-sm btn-link remove-btn" type="button">
3607                        <i class="la la-close"></i>
3608                    </button>
3609                </div>
3610            </div>
3611        `;
3612
3613        previewBox.append(html);
3614
3615        let totalItems = previewBox.find('.direct-file-preview-item').length;
3616        if (totalItems >= 6) {
3617            wrapper.find('.direct-uploader').hide();
3618        }
3619    }
3620
3621    $(document).on('click', '.direct-preview .remove-btn', function() {
3622        let parent = $(this).closest('.direct-file-preview-item');
3623        let wrapper = $(this).closest('.form-group');
3624        let input = wrapper.find('input[type="file"]')[0];
3625        let fileName = parent.attr('title');
3626
3627        if (input._storedFiles) {
3628            input._storedFiles = input._storedFiles.filter(f => f.name !== fileName);
3629
3630            let dt = new DataTransfer();
3631            input._storedFiles.forEach(f => dt.items.add(f));
3632            input.files = dt.files;
3633        }
3634
3635        parent.remove();
3636
3637        if (input._storedFiles && input._storedFiles.length > 0) {
3638            const allowedExts = ['jpg', 'jpeg', 'png', 'webp'];
3639            let hasInvalid = input._storedFiles.some(f => {
3640                const ext = f.name.split('.').pop().toLowerCase();
3641                return !allowedExts.includes(ext);
3642            });
3643            wrapper.find('.upload-error').text(hasInvalid ? 'Only JPG, JPEG, PNG, and WEBP images are allowed.' : '');
3644        } else {
3645            wrapper.find('.upload-error').text('');
3646        }
3647
3648        let totalItems = wrapper.find('.direct-file-preview-item').length;
3649        if (totalItems < 6) {
3650            wrapper.find('.direct-uploader').show();
3651        }
3652
3653        if (!$(input).prop('multiple')) {
3654            input.value = '';
3655        }
3656    });
3657
3658});
3659
3660document.addEventListener("DOMContentLoaded", function () {
3661    $(document).on('click', '.custom-submenu-toggle', function (e) {
3662        e.stopPropagation();
3663        e.preventDefault();
3664        var $toggle = $(this);
3665        var $subMenu = $toggle.closest('.custom-dropdown-submenu').find('.custom-submenu-nested');
3666        var $parentDropdown = $toggle.closest('.dropdown-menu');
3667        var isOpen = $subMenu.hasClass('show');
3668        $parentDropdown.find('.custom-submenu-nested').not($subMenu).removeClass('show flip-right');
3669        $parentDropdown.find('.custom-submenu-toggle').not($toggle).removeClass('open').attr('aria-expanded', 'false');
3670        if (isOpen) {
3671            $subMenu.removeClass('show flip-right');
3672            $toggle.removeClass('open').attr('aria-expanded', 'false');
3673        } else {
3674            $subMenu.addClass('show');
3675            $toggle.addClass('open').attr('aria-expanded', 'true');
3676            if (window.innerWidth > 767) {
3677                var rect = $subMenu[0].getBoundingClientRect();
3678                if (rect.left < 0) {
3679                    $subMenu.addClass('flip-right');
3680                }
3681            }
3682        }
3683    });
3684
3685    $(document).on('hidden.bs.dropdown', '.dropdown', function () {
3686        $(this).find('.custom-submenu-nested').removeClass('show flip-right');
3687        $(this).find('.custom-submenu-toggle').removeClass('open').attr('aria-expanded', 'false');
3688    });
3689    
3690    $(document).on('click', function (event) {
3691        var $trigger = $("[data-toggle='collapse'][href='#collapseQuickMenu'], [data-toggle='collapse'][data-target='#collapseQuickMenu']");
3692        var $collapseMenu = $("#collapseQuickMenu");
3693        if (!$collapseMenu.is(event.target) && $collapseMenu.has(event.target).length === 0 && !$trigger.is(event.target) && $trigger.has(event.target).length === 0) {
3694            if ($collapseMenu.hasClass('show')) {
3695                $collapseMenu.collapse('hide');
3696            }
3697        }
3698    });
3699});

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.