PageSourceSearch

https://klettwl.ca/store/modules/ets_abandonedcart/views/js/abancart.js

js klettwl.ca collected 2026-10-06 19:39:04 UTC 51,834 bytes, 1,161 lines download raw bytes

1/**
2 * 2007-2022 ETS-Soft
3 *
4 * NOTICE OF LICENSE
5 *
6 * This file is not open source! Each license that you purchased is only available for 1 wesite only.
7 * If you want to use this file on more websites (or projects), you need to purchase additional licenses.
8 * You are not allowed to redistribute, resell, lease, license, sub-license or offer our resources to any third party.
9 *
10 * DISCLAIMER
11 *
12 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
13 * versions in the future. If you wish to customize PrestaShop for your
14 * needs please contact us for extra customization service at an affordable price
15 *
16 *  @author ETS-Soft <[email protected]>
17 *  @copyright  2007-2022 ETS-Soft
18 *  @license    Valid for 1 website (or project) for each purchase of license
19 *  International Registered Trademark & Property of ETS-Soft
20 */
21var ETS_ABANCART_HAS_BROWSER = parseInt(ETS_ABANCART_HAS_BROWSER) || 0;
22if (ETS_ABANCART_HAS_BROWSER) {
23    document.addEventListener('DOMContentLoaded', function () {
24        if (!("Notification" in window)) {
25            //alert("This browser does not support desktop notification 1");
26        } else if (Notification.permission !== "granted") {
27            Notification.requestPermission();
28        }
29    });
30}
31var ETS_ABANCART_CAMPAIGNS = ETS_ABANCART_CAMPAIGNS || [],
32    ETS_ABANCART_COOKIE_CAMPAIGNS = ETS_ABANCART_COOKIE_CAMPAIGNS || [],
33    ETS_ABANCART_LINK_AJAX = ETS_ABANCART_LINK_AJAX || '',
34    ETS_ABANCART_LINK_SHOPPING_CART = ETS_ABANCART_LINK_SHOPPING_CART || '',
35    ETS_ABANCART_TEXT_COLOR = ETS_ABANCART_TEXT_COLOR || '#ffffff',
36    ETS_ABANCART_BACKGROUND_COLOR = ETS_ABANCART_BACKGROUND_COLOR || '#ff0000',
37    ets_abancart_timeout = false,
38    ets_abancart_delay = 0,
39    ets_abancart_disable_keydown = false,
40    ETS_ABANCART_COPIED_MESSAGE = ETS_ABANCART_COPIED_MESSAGE || 'Copied',
41    ETS_ABANCART_CLOSE_TITLE = ETS_ABANCART_CLOSE_TITLE || 'Close',
42    ETS_ABANCART_QUEUE = {},
43    ETS_ABANCART_LEAVE_DISPLAY = 1,
44    ETS_ABANCART_REQUEST = {}
45;
46
47if (typeof ETS_ABANCART_LIFE_TIME == "undefined") ETS_ABANCART_LIFE_TIME = -1;
48
49/*----------LEAVE WEBSITE----------*/
50
51//document.documentElement.addEventListener('mouseleave', ets_abancart_mouseleave);
52document.documentElement.addEventListener('mouseenter', ets_abancart_mouseenter);
53document.documentElement.addEventListener('keydown', ets_abancart_keydown);
54
55function ets_abancart_leavewebsite() {
56    var _overload = $('.ets_abancart_leave_website_overload:not(.disabled)');
57    if (ETS_ABANCART_LEAVE_DISPLAY && ETS_ABANCART_LINK_AJAX && _overload.length > 0 && _overload.find('.ets_abancart_wrapper').length && !_overload.hasClass('active') && !_overload.hasClass('loading')) {
58
59        _overload.addClass('loading');
60        $.ajax({
61            type: 'POST',
62            dataType: 'JSON',
63            url: ETS_ABANCART_LINK_AJAX,
64            data: 'leave&ajax=1',
65            success: function (json) {
66                _overload.removeClass('loading');
67                if (json) {
68                    if (typeof json.redisplay !== "undefined" && parseInt(json.redisplay) < 0) {
69                        ETS_ABANCART_LEAVE_DISPLAY = 0
70                        return;
71                    }
72                    if (json.errors) {
73                        _overload
74                            .removeClass('active')
75                            .addClass('disabled');
76                        ets_abancart_mouseenter();
77                    } else {
78                        var _wrapper = _overload.find('.ets_abancart_wrapper').clone(true),
79                            _html = _wrapper.length ? _wrapper.html() : '';
80                        $.each(json, function (p, item) {
81                            var pattern = p.replace(/([\[\]])/g, '\\$1'),
82                                regExp = new RegExp(pattern, 'g');
83                            _html = _html.replace(regExp, item);
84                        });
85                        _overload.find('.ets_abancart_wrapper').addClass('form-original').after(
86                            _wrapper
87                                .html(_html)
88                                .addClass('active')
89                        );
90                        _overload.addClass('active');
91                        _overload.find('.ets_abancart_wrapper.form-original').remove();
92                        ets_ab_fn.countdown();
93                        ets_ab_fn.countdown2();
94                        if ($('.ets_ac_datepicker').length) {
95                            $('.ets_ac_datepicker').removeClass('hasDatepicker');
96                            $('.ets_ac_datepicker').datepicker({dateFormat: 'yy-mm-dd'});
97                        }
98                        if ($('.ets_ac_datetimepicker').length) {
99                            $('.ets_ac_datetimepicker').removeClass('hasDatepicker');
100                            $('.ets_ac_datetimepicker').datetimepicker({
101                                prevText: '',
102                                nextText: '',
103                                dateFormat: 'yy-mm-dd',
104                                currentText: 'Now',
105                                closeText: 'Done',
106                                ampm: false,
107                                amNames: ['AM', 'A'],
108                                pmNames: ['PM', 'P'],
109                                timeFormat: 'hh:mm:ss tt',
110                                formatTime: 'hh:mm:ss tt',
111                                timeSuffix: '',
112                                timeOnlyTitle: 'Choose Time',
113                                timeText: 'Time',
114                                hourText: 'Hour',
115                                minuteText: 'Minute',
116                            });
117                        }
118
119                        if (json.background_color) {
120                            $('.ets_abancart_leave_website_overload  .ets_abancart_container').css('background-color', json.background_color);
121                        }
122                        if (json.popup_width) {
123                            $('.ets_abancart_leave_website_overload  .ets_abancart_container').css('width', json.popup_width + 'px');
124                        }
125                        if (json.popup_height) {
126                            $('.ets_abancart_leave_website_overload  .ets_abancart_container').css('height', json.popup_height + 'px');
127                        }
128                        if (json.border_radius) {
129                            $('.ets_abancart_leave_website_overload  .ets_abancart_container').css({
130                                'border-radius': json.border_radius + 'px',
131                                'overflow': 'hidden'
132                            });
133                        }
134                        if (json.border_width) {
135                            $('.ets_abancart_leave_website_overload  .ets_abancart_container').css({
136                                'border-width': json.border_width + 'px',
137                                'border-style': 'solid'
138                            });
139                        }
140                        if (json.border_color) {
141                            $('.ets_abancart_leave_website_overload  .ets_abancart_container').css('border-color', json.border_color);
142                        }
143                        if (json.padding) {
144                            $('.ets_abancart_leave_website_overload  .ets_abancart_container').css('border-color', json.padding + 'px');
145                        }
146                        if (json.close_btn_color) {
147                            $('.ets_abancart_leave_website_overload  .ets_abancart_container .ets_abancart_close').find('style').remove();
148                            $('.ets_abancart_leave_website_overload  .ets_abancart_container .ets_abancart_close').append('<style rel="stylesheet">.ets_abancart_leave_website_overload  .ets_abancart_container .ets_abancart_close:after,.ets_abancart_leave_website_overload  .ets_abancart_container .ets_abancart_close:before{background-color: ' + json.close_btn_color + ';}</style>');
149                        }
150                        if (json.font_size) {
151                            $('.ets_abancart_leave_website_overload  .ets_abancart_wrapper div,.ets_abancart_leave_website_overload  .ets_abancart_wrapper p,.ets_abancart_leave_website_overload  .ets_abancart_wrapper a').css('font-size', json.font_size + 'px');
152                        }
153                        if (json.vertical_align) {
154                            $('.ets_abancart_leave_website_overload  .ets_abancart_wrapper p,.ets_abancart_leave_website_overload  .ets_abancart_wrapper a,.ets_abancart_leave_website_overload  .ets_abancart_wrapper div:not(.ets_abancart_product_list_table)').css('text-align', 'inherit');
155                            $('.ets_abancart_leave_website_overload  .ets_abancart_wrapper').css('text-align', json.vertical_align);
156                        }
157                        if (json.overlay_bg) {
158                            var color = json.overlay_bg;
159                            if (json.overlay_bg_opacity) {
160                                var colorRgb = etsAcHexToRgb(json.overlay_bg);
161                                if (colorRgb) {
162                                    color = 'rgba(' + colorRgb.r + ',' + colorRgb.g + ',' + colorRgb.b + ',' + json.overlay_bg_opacity + ')';
163                                }
164                            }
165                            $('.ets_abancart_leave_website_overload').css('background-color', color);
166                        }
167                        etsAcCheckHasCaptcha(_overload.find('.ets_abancart_wrapper'));
168                        etsAcOnLoadRecaptcha();
169
170                    }
171                }
172            },
173            error: function () {
174                _overload.removeClass('loading');
175            }
176        });
177    }
178}
179
180function etsAcCheckHasCaptcha(el) {
181    if (el.find('input[name="captcha_type"]').length) {
182        if (el.find('input[name="captcha_type"]').first().val() == 'v2') {
183            el.prepend('
vendor: 75 bytes, line 183
183<script src="https://www.google.com/recaptcha/api.js" async defer></script>
183');
184        } else if (el.find('input[name="captcha_type"]').first().val() == 'v3') {
185            var captchaKey = el.find('input[name="captcha_site_key"]').first().val();
186            el.prepend('
vendor: 101 bytes, line 186
186<script src="https://www.google.com/recaptcha/api.js?render=' + captchaKey + '" async defer></script>
186');
187        }
188    }
189}
190
191function isIE() {
192    ua = navigator.userAgent;
193    /* MSIE used to detect old browsers and Trident used to newer ones*/
194    var is_ie = ua.indexOf("MSIE ") > -1 || ua.indexOf("Trident/") > -1;
195
196    return is_ie;
197}
198
199function ets_abancart_mouseleave(event) {
200    var y, _ie = isIE();
201    if (_ie) {
202        y = event.clientY || event.screenY || event.pageY;
203    } else {
204        y = event.clientY;
205    }
206    if ((y > -5 && !_ie) || (_ie && y > 5)) {
207        return;
208    }
209    ets_abancart_timeout = setTimeout(ets_abancart_leavewebsite, 0);
210}
211
212function ets_abancart_mouseenter() {
213    if (ets_abancart_timeout) {
214        clearTimeout(ets_abancart_timeout);
215        ets_abancart_timeout = null;
216    }
217}
218
219function ets_abancart_keydown(e) {
220    if (ets_abancart_disable_keydown || !e.metaKey || e.keyCode !== 76) {
221        return;
222    }
223    ets_abancart_disable_keydown = true;
224    ets_abancart_timeout = setTimeout(ets_abancart_leavewebsite, ets_abancart_delay);
225}
226
227//display a success/error/notice message
228function showSuccessMessage(msg) {
229    $.growl.notice({title: "", message: msg});
230}
231
232function showErrorMessage(msg) {
233    $.growl.error({title: "", message: msg});
234}
235
236/*----------END LEAVE WEBSITE----------*/
237
238var ets_ab_fn = {
239    init: function () {
240        if (typeof ETSFavico !== "undefined") {
241            window.favicon = new ETSFavico({
242                animation: 'popFade',
243                bgColor: ETS_ABANCART_BACKGROUND_COLOR,
244                textColor: ETS_ABANCART_TEXT_COLOR,
245            });
246            ets_ab_fn.loadAjax(true);
247        }
248        ets_ab_fn.initCampaign();
249        ets_ab_fn.saveCart();
250    },
251    initCampaign: function () {
252        if (ETS_ABANCART_CAMPAIGNS) {
253            ETS_ABANCART_CAMPAIGNS.forEach(function (item) {
254                ets_ab_fn.setCampaign(item);
255            });
256        }
257        if (ETS_ABANCART_COOKIE_CAMPAIGNS) {
258            ETS_ABANCART_COOKIE_CAMPAIGNS.forEach(function (item) {
259                ets_ab_fn.setCampaignCookie(item);
260            });
261        }
262    },
263    clearTimeout: function (id, isRemove) {
264        if (typeof ETS_ABANCART_QUEUE[id] !== "undefined") {
265            clearTimeout(ETS_ABANCART_QUEUE[id]);
266            if (isRemove)
267                delete ETS_ABANCART_QUEUE[id];
268        }
269    },
270    setCampaign: function (item) {
271        ets_ab_fn.clearTimeout(item.id_ets_abancart_reminder);
272        ETS_ABANCART_QUEUE[item.id_ets_abancart_reminder] = setTimeout(
273            function () {
274                ets_ab_fn.request(parseInt(item.id_ets_abancart_reminder), item.campaign_type);
275            }
276            , parseInt((parseFloat(item.lifetime) > 0 ? parseFloat(item.lifetime) * 1000 : 0))
277        );
278    },
279    setCampaignCookie: function (item) {
280        ets_ab_fn.clearTimeout(item.id_ets_abancart_reminder);
281        var timeOut = 0;
282        if (typeof item.lifetime !== "undefined" || parseFloat(item.redisplay) >= 0) {
283            if (typeof item.lifetime !== "undefined") {
284                timeOut = item.lifetime * 1000;
285            } else {
286                timeOut = parseFloat(item.redisplay) > 0 ? parseFloat(item.redisplay) * 1000 : 0;
287            }
288            ETS_ABANCART_QUEUE[item.id_ets_abancart_reminder] = setTimeout(
289                function () {
290                    ets_ab_fn.request(parseInt(item.id_ets_abancart_reminder), item.type);
291                }
292                , timeOut
293            );
294        }
295    },
296    mergeCampaign: function (reminder, campaigns, action, isCookie) {
297        var flag = 0;
298        if (campaigns.length > 0) {
299            campaigns.forEach(function (item) {
300                if (isCookie) {
301                    if (item.length > 0) {
302                        item.forEach(function (rem) {
303                            if (parseInt(rem.id_ets_abancart_reminder) === parseInt(reminder.id_ets_abancart_reminder)) {
304                                flag = 1;
305                                return true;
306                            }
307                        });
308                    }
309                } else {
310                    if (parseInt(item.id_ets_abancart_reminder) === parseInt(reminder.id_ets_abancart_reminder)) {
311                        flag = 1;
312                    }
313                }
314                if (flag > 0)
315                    return true;
316            });
317        }
318        if (flag < 1) {
319            switch (action) {
320                case 'add':
321                    if (isCookie)
322                        ets_ab_fn.setCampaignCookie(reminder);
323                    else
324                        ets_ab_fn.setCampaign(reminder);
325                    break;
326                case 'delete':
327                    ets_ab_fn.removeCampaign(reminder);
328                    break;
329            }
330        }
331    },
332    restCampaigns: function (campaigns) {
333        if (ETS_ABANCART_CAMPAIGNS.length > 0) {
334            ETS_ABANCART_CAMPAIGNS.forEach(function (item) {
335                ets_ab_fn.mergeCampaign(item, campaigns, 'delete');
336            })
337        }
338        if (campaigns.length > 0) {
339            campaigns.forEach(function (item) {
340                ets_ab_fn.mergeCampaign(item, ETS_ABANCART_CAMPAIGNS, 'add');
341            });
342        }
343    },
344    restCookieCampaigns: function (campaigns) {
345        if (ETS_ABANCART_COOKIE_CAMPAIGNS.length > 0) {
346            ETS_ABANCART_COOKIE_CAMPAIGNS.forEach(function (item) {
347                ets_ab_fn.mergeCampaign(item, campaigns, 'delete', true);
348            });
349        }
350        if (campaigns.length > 0) {
351            campaigns.forEach(function (item) {
352                if (item.length > 0) {
353                    item.forEach(function (rem) {
354                        ets_ab_fn.mergeCampaign(rem, ETS_ABANCART_COOKIE_CAMPAIGNS, 'add');
355                    });
356                }
357            });
358        }
359    },
360    removeCampaign: function (id) {
361        ets_ab_fn.clearTimeout(id, true);
362        delete ETS_ABANCART_REQUEST[id];
363    },
364    ajaxState: function () {
365        var flag = 0,
366            first = 0,
367            requestQueue = Object.keys(ETS_ABANCART_REQUEST);
368        if (requestQueue.length > 0) {
369            requestQueue.forEach(function (key) {
370                if (parseInt(first) <= 0)
371                    first = ETS_ABANCART_REQUEST[key].id;
372                if (ETS_ABANCART_REQUEST[key].state > 0) {
373                    flag = 1;
374                    return true;
375                }
376            });
377        }
378        return flag <= 0 ? first : 0;
379    },
380    request: function (id, campaign_type) {
381        if (ETS_ABANCART_LINK_AJAX && parseInt(id) > 0) {
382            ETS_ABANCART_REQUEST[id] = {
383                type: 'post',
384                url: ETS_ABANCART_LINK_AJAX,
385                dataType: 'json',
386                data: 'renderDisplay&id_ets_abancart_reminder=' + id + '&campaign_type=' + campaign_type,
387                state: 0,
388                id: id
389            };
390            var nextId = ets_ab_fn.ajaxState();
391            if (parseInt(nextId) > 0)
392                ets_ab_fn.doRequestAjax(id);
393        }
394    },
395    doRequestAjax: function (id) {
396        var request = ETS_ABANCART_REQUEST[id];
397        request.state = 1;
398        request.success = function (json) {
399            delete ETS_ABANCART_REQUEST[id];
400            if (json) {
401                if (json.campaigns)
402                    ets_ab_fn.restCampaigns(json.campaigns);
403                if (json.cookies)
404                    ets_ab_fn.restCookieCampaigns(json.cookies);
405                if (json.redisplay < 0 && json.id_ets_abancart_reminder > 0) {
406                    ets_ab_fn.removeCampaign(json.id_ets_abancart_reminder);
407                } else {
408                    switch (json.type) {
409                        case 'popup':
410                            ets_ab_fn.popup(json, id);
411                            break;
412                        case 'bar':
413                            ets_ab_fn.bar(json, id);
414                            break;
415                        case 'browser':
416                            ets_ab_fn.browser(json, id);
417                            break;
418                    }
419                }
420            }
421        }
422        $.ajax(request);
423    },
424    views: function (id, json, group_class) {
425        if (id && json) {
426            // FIRST:
427            var overloadEl = '.ets_abancart_' + json.type + '_overload';
428            if ($('.ets_abancart_' + json.type + '_overload').length <= 0) {
429                $('body').prepend('<div class="ets_abancart_' + json.type + '_overload ' + group_class + ' ets_abancart_overload" data-id="' + id + '" data-type="' + json.type + '" ' + (json.type !== 'popup' ? 'style="background-color: ' + json.background_color + '; color: ' + json.text_color + '"' : '') + '><div class="ets_abancart_width"><div class="ets_table"><div class="ets_tablecell"><div class="ets_abancart_container"><div class="ets_abancart_close" title="' + ETS_ABANCART_CLOSE_TITLE + '"></div><div class="ets_abancart_wrapper"></div></div></div></div></div></div>');
430            }
431            // NEXT:
432            var _container = $('body .ets_abancart_' + json.type + '_overload');
433            _container
434                .attr({'data-id': id, 'data-type': json.type})
435                .addClass('active')
436                .find('.ets_abancart_wrapper')
437                .html('<div class="ets-ac-popup-body" style="' + (json.type === 'popup' && json.popup_body_bg ? 'background-color: ' + json.popup_body_bg + ';' : '') + '">' + json.html + '</div>')
438                .prepend((json.type === 'popup' ? '<h4 class="ets_abancart_title" style="' + (json.header_bg ? 'background-color: ' + json.header_bg + ';' : '') + (json.header_text_color ? 'color: ' + json.header_text_color + ';' : '') + (json.header_height ? 'height: ' + json.header_height + 'px;' : '') + (json.header_font_size ? 'font-size: ' + json.header_font_size + 'px;' : '') + '">' + json.title + '</h4>' : ''))
439            ;
440            /*---HIGHLIGHT BAR---*/
441            if (json.type !== 'popup') {
442                _container.attr('style', 'background-color: ' + json.background_color + '; color: ' + json.text_color);
443            }
444            var selectorContainer = _container.find('.ets_abancart_container');
445            if (json.type === 'bar') {
446                selectorContainer = _container.find('.ets_abancart_width');
447            }
448            selectorContainer.css('margin', '0 auto');
449            if (json.popup_width)
450                selectorContainer.css('width', json.popup_width + 'px');
451            if (json.popup_height) {
452                selectorContainer.css('height', json.popup_height + 'px');
453                selectorContainer.css('min-height', json.popup_height + 'px');
454            }
455            if (json.border_radius)
456                selectorContainer.css('border-radius', json.border_radius + 'px');
457            if (json.border_width) {
458                selectorContainer.css('border-width', json.border_width + 'px');
459                selectorContainer.css('border-style', 'solid');
460            }
461            if (json.border_color)
462                selectorContainer.css('border-color', json.border_color);
463            if (json.close_btn_color) {
464                _container.find('.ets_abancart_close').find('style').remove();
465                _container.find('.ets_abancart_close').append('<style>' + overloadEl + ' .ets_abancart_close:before,' + overloadEl + ' .ets_abancart_close:after{background-color: ' + json.close_btn_color + ';}</style>');
466            }
467            if (json.vertical_align) {
468                $(overloadEl + ' .ets-ac-popup-body p, ' + overloadEl + ' .ets-ac-popup-body a,' + overloadEl + ' .ets-ac-popup-body div:not(.ets_abancart_product_list_table)').css('text-align', 'inherit');
469                $(overloadEl + ' .ets-ac-popup-body').css('text-align', json.vertical_align);
470            }
471            if (json.font_size) {
472                $('' + overloadEl + ' .ets-ac-popup-body,' + overloadEl + ' .ets-ac-popup-body p, ' + overloadEl + ' .ets-ac-popup-body a,' + overloadEl + ' .ets-ac-popup-body div').css('font-size', json.font_size + 'px');
473            }
474            if (json.padding) {
475                if (json.popup_width) {
476                    if (json.type === 'bar') {
477                        selectorContainer.css('padding', json.padding + 'px');
478                    } else
479                        $('' + overloadEl + ' .ets-ac-popup-body').css('padding', json.padding + 'px');
480                }
481
482            }
483            if (json.overlay_bg) {
484                var color = json.overlay_bg;
485                if (json.overlay_bg_opacity) {
486                    var rgbColor = etsAcHexToRgb(json.overlay_bg);
487                    color = 'rgba(' + rgbColor.r + ',' + rgbColor.g + ',' + rgbColor.b + ',' + json.overlay_bg_opacity + ')';
488                }
489                $('.ets_abancart_popup_overload').css('background-color', color);
490            }
491
492            ets_ab_fn.countdown();
493            ets_ab_fn.countdown2();
494            if ($('.ets_ac_datepicker').length) {
495                $('.ets_ac_datepicker').removeClass('hasDatepicker');
496                $('.ets_ac_datepicker').datepicker({dateFormat: 'yy-mm-dd'});
497            }
498            if ($('.ets_ac_datetimepicker').length) {
499                $('.ets_ac_datetimepicker').removeClass('hasDatepicker');
500                $('.ets_ac_datetimepicker').datetimepicker({
501                    prevText: '',
502                    nextText: '',
503                    dateFormat: 'yy-mm-dd',
504                    currentText: 'Now',
505                    closeText: 'Done',
506                    ampm: false,
507                    amNames: ['AM', 'A'],
508                    pmNames: ['PM', 'P'],
509                    timeFormat: 'hh:mm:ss tt',
510                    formatTime: 'hh:mm:ss tt',
511                    timeSuffix: '',
512                    timeOnlyTitle: 'Choose Time',
513                    timeText: 'Time',
514                    hourText: 'Hour',
515                    minuteText: 'Minute',
516                });
517            }
518            etsAcOnLoadRecaptcha();
519        }
520
521    },
522    popup: function (json, id) {
523        ets_ab_fn.views(id, json, 'ets_abancart_popup');
524    },
525    bar: function (json, id) {
526        ets_ab_fn.views(id, json, '');
527    },
528    browser: function (json, id) {
529
530        if (json && id) {
531            var notification;
532            if (!("Notification" in window)) {
533                //alert("This browser does not support desktop notification 1");
534            } else if (Notification.permission === "granted") {
535                ets_ab_fn.setNotification(notification, json, id);
536            } else if (Notification.permission !== "denied" && ETS_ABANCART_HAS_BROWSER) {
537                Notification.requestPermission().then(function (permission) {
538                    if (permission === "granted") {
539                        ets_ab_fn.setNotification(notification, json, id);
540                    }
541                });
542            }
543        }
544    },
545    setNotification: function (notification, json, id) {
546
547        // New notification.
548        notification = new Notification(json.title, {icon: json.icon, body: json.html});
549
550        // Event click.
551        notification.onclick = function () {
552            if (typeof json.code !== "undefined" && json.code) {
553                $.ajax({
554                    type: 'post',
555                    url: ETS_ABANCART_LINK_AJAX,
556                    dataType: 'json',
557                    data: 'add_cart_rule&discount_code=' + json.code,
558                    success: function (json) {
559                        if (json) {
560                            if (json.errors) {
561                                showErrorMessage(json.errors)
562                            } else {
563                                window.location.href = json.link_checkout;
564                            }
565                        }
566                    },
567                });
568            }
569        };
570
571        // Event close.
572        notification.onclose = function () {
573            if (id) {
574                $.ajax({
575                    type: 'post',
576                    url: ETS_ABANCART_LINK_AJAX,
577                    dataType: 'json',
578                    data: 'type=browser&redisplay=1&id=' + id,
579                });
580            }
581        };
582    },
583    close: function (type, json) {
584        $('body .ets_abancart_' + type + '_overload.active').remove();
585        if (parseFloat(json.redisplay) > 0) {
586            ETS_ABANCART_QUEUE[json.id_ets_abancart_reminder] = setTimeout(function () {
587                ets_ab_fn.request(json.id_ets_abancart_reminder, type);
588            }, parseFloat(json.redisplay) * 1000);
589        }
590    },
591    countdown: function () {
592        var clock = $('.ets_abancart_count_down_clock');
593        var style = clock.attr('data-style') || '';
594        if (clock.length > 0) {
595            clock.countdown(parseInt(clock.data('date')) * 1000).on('update.countdown', function (event) {
596                $(this).html(event.strftime(''
597                    + (event.offset.weeks > 0 ? '<span class="ets_abancart_countdown weeks" style="' + style + '"><span>%-w</span> week%!w </span>' : '')
598                    + (event.offset.days > 0 ? '<span class="ets_abancart_countdown days" style="' + style + '"><span>%-d</span> day%!d </span>' : '')
599                    + '<span class="ets_abancart_countdown hours" style="' + style + '"><span>%H</span> hr </span>'
600                    + '<span class="ets_abancart_countdown minutes" style="' + style + '"><span>%M</span> min </span>'
601                    + '<span class="ets_abancart_countdown seconds" style="' + style + '"><span>%S</span> sec </span>'));
602            });
603        }
604    },
605    countdown2: function () {
606        var clock = $('.ets_ac_evt_countdown2');
607        var style = clock.attr('data-style') || '';
608        if (clock.length > 0) {
609            clock.countdown(parseInt(clock.data('date')) * 1000).on('update.countdown', function (event) {
610                $(this).html(event.strftime(''
611                    + (event.offset.weeks > 0 ? '<span class="ets_ac_countdown2 weeks" style="' + style + '"><span>%-w</span> week%!w </span>' : '')
612                    + (event.offset.days > 0 ? '<span class="ets_ac_countdown2 days" style="' + style + '"><span>%-d</span> day%!d </span>' : '')
613                    + '<span class="ets_ac_countdown2 hours" style="' + style + '"><span>%H</span> hr </span>'
614                    + '<span class="ets_ac_countdown2 minutes" style="' + style + '"><span>%M</span> min </span>'
615                    + '<span class="ets_ac_countdown2 seconds" style="' + style + '"><span>%S</span> sec </span>'));
616            });
617        }
618    },
619    saveCart: function () {
620        if ((ETS_ABANCART_LIFE_TIME >= 0 || $('#ets_abancart_cart_save.active').length > 0) && ETS_ABANCART_LINK_SHOPPING_CART) {
621            setTimeout(function () {
622                $.ajax({
623                    type: 'POST',
624                    dataType: 'json',
625                    url: ETS_ABANCART_LINK_SHOPPING_CART,
626                    data: 'init',
627                    success: function (json) {
628                        $('#ets_abancart_cart_save.active').removeClass('active');
629                        if (json) {
630                            if ($('body .ets_abancart_shopping_cart_overload').length <= 0) {
631                                $('body').prepend('<div class="ets_abancart_shopping_cart_overload ets_abancart_overload"><div class="ets_abancart_wrapper"></div></div>');
632                            }
633                            if (json.html)
634                                $('body .ets_abancart_shopping_cart_overload').addClass('active').find('.ets_abancart_wrapper').html(json.html);
635                        }
636                    },
637                    error: function () {
638                        $('#ets_abancart_cart_save.active').removeClass('active');
639                    }
640                });
641            }, $('#ets_abancart_cart_save.active').length > 0 ? 0 : ETS_ABANCART_LIFE_TIME * 1000);
642        }
643    },
644    exitPopupSaveCart: function (notReDisplay) {
645
646        var notReDisplay = notReDisplay || true;
647
648        $('.ets_abancart_shopping_cart_overload.active').removeClass('active');
649        if (notReDisplay && ETS_ABANCART_LINK_SHOPPING_CART) {
650            $('#save_cart_form .bootstrap').remove();
651            $.ajax({
652                type: 'post',
653                url: ETS_ABANCART_LINK_SHOPPING_CART,
654                dataType: 'json',
655                data: 'ajax=1&offCart',
656                success: function () {
657
658                },
659                error: function () {
660
661                }
662            });
663        }
664    },
665    exitPopupCart: function () {
666        $('.ets_abancart_display_shopping_cart_overload.active').removeClass('active');
667    },
668    loadAjax: function (initialized) {
669        if (typeof ETS_ABANCART_BROWSER_TAB_ENABLED === "undefined" || !ETS_ABANCART_BROWSER_TAB_ENABLED)
670            return;
671        if (initialized) {
672            favicon.badge(parseInt(ETS_ABANCART_PRODUCT_TOTAL));
673        } else if (ETS_ABANCART_LINK_AJAX && typeof favicon !== "undefined") {
674            $.ajax({
675                type: 'POST',
676                dataType: 'JSON',
677                url: ETS_ABANCART_LINK_AJAX,
678                data: 'favicon&ajax=1',
679                success: function (json) {
680                    if (json) {
681                        favicon.badge(parseInt(json.product_total));
682                    }
683                }
684            });
685        }
686    },
687    exitPopupLeave: function () {
688        $('.ets_abancart_leave_website_overload.active').removeClass('active');
689        $('.ets_abancart_leave_website_overload .ets_abancart_wrapper.active').remove();
690    },
691    copyToClipboard: function (el) {
692        var $temp = $("<input>");
693        $("body").append($temp);
694        $temp.val(el.text().trim()).select();
695        document.execCommand("copy");
696        $temp.remove();
697        showSuccessMessage(ETS_ABANCART_COPIED_MESSAGE);
698        setTimeout(function () {
699            el.removeClass('copy');
700        }, 300);
701    },
702};
703
704$(document).ready(function () {
705
706    if ($('.ets_ac_datepicker').length) {
707        $('.ets_ac_datepicker').datepicker({dateFormat: 'yy-mm-dd'});
708    }
709    if ($('.ets_ac_datetimepicker').length) {
710        $('.ets_ac_datetimepicker').datetimepicker({
711            prevText: '',
712            nextText: '',
713            dateFormat: 'yy-mm-dd',
714            currentText: 'Now',
715            closeText: 'Done',
716            ampm: false,
717            amNames: ['AM', 'A'],
718            pmNames: ['PM', 'P'],
719            timeFormat: 'hh:mm:ss tt',
720            formatTime: 'hh:mm:ss tt',
721            timeSuffix: '',
722            timeOnlyTitle: 'Choose Time',
723            timeText: 'Time',
724            hourText: 'Hour',
725            minuteText: 'Minute',
726        });
727    }
728
729    if ($('.ets_speed_dynamic_hook').length < 1) {
730        ets_ab_fn.init();
731    }
732    $(document).on("hooksLoaded", function () {
733        Object.keys(ETS_ABANCART_QUEUE).forEach(function (i) {
734            clearTimeout(ETS_ABANCART_QUEUE[i]);
735            delete ETS_ABANCART_QUEUE[i];
736        });
737        ets_ab_fn.init();
738    });
739
740    /*---favicon---*/
741    $(document).ajaxComplete(function (event, xhr, settings) {
742        if (typeof settings.data !== "undefined" && (settings.data.toString().match(/(qty=\d+)/i) && settings.data.toString().match(/(add=\d+)/i) || settings.url.match(/(id_product=\d+)/i) && settings.url.match(/(update=\d+)/i) || settings.url.match(/(id_product=\d+)/i) && settings.url.match(/(delete=\d+)/i))) {
743            ets_ab_fn.loadAjax(false);
744        }
745        var nextId = ets_ab_fn.ajaxState();
746        if (parseInt(nextId) > 0)
747            ets_ab_fn.doRequestAjax(nextId);
748    });
749    /*---end favicon---*/
750
751    $(document).on('click', '.ets_abancart_box .ets_abancart_box_discount', function (ev) {
752        ev.preventDefault();
753        ets_ab_fn.copyToClipboard($(this));
754    });
755
756    $(document).on('click', '.ets_abancart_leave_website_overload .ets_abancart_close', function (ev) {
757        ev.preventDefault();
758        ets_ab_fn.exitPopupLeave();
759        var btn = $(this);
760        if (!btn.hasClass('active') && ETS_ABANCART_LINK_AJAX) {
761            $.ajax({
762                type: 'post',
763                url: ETS_ABANCART_LINK_AJAX,
764                dataType: 'json',
765                data: 'leave_closed',
766                success: function (json) {
767                    btn.removeClass('active');
768                },
769            });
770        }
771    });
772
773
774    $(document).on('click', '.ets_abancart_shopping_cart_overload .ets_abancart_create_account', function (ev) {
775        ev.preventDefault();
776        if ($('#id_customer').length > 0 && parseInt($('#id_customer').val()) <= 0) {
777            $('.ets_abancart_form_login').fadeOut();
778            $('.ets_abancart_form_create').fadeIn();
779        }
780    });
781
782    $(document).on('click', '.ets_abancart_view_shopping_cart', function (ev) {
783        ev.preventDefault();
784        var btn = $(this);
785        if (!btn.hasClass('active') && btn.attr('href') != '') {
786            btn.addClass('active');
787            $.ajax({
788                type: 'POST',
789                url: btn.attr('href'),
790                dataType: 'json',
791                data: 'ajax=1',
792                success: function (json) {
793                    btn.removeClass('active');
794                    if (json) {
795                        if ($('body .ets_abancart_display_shopping_cart_overload').length <= 0) {
796                            $('body').prepend('<div class="ets_abancart_display_shopping_cart_overload ets_abancart_popup ets_abancart_overload"><div class="ets_table"><div class="ets_tablecell"><div class="ets_abancart_container"><div class="ets_abancart_close" title="' + ETS_ABANCART_CLOSE_TITLE + '"></div><div class="ets_abancart_wrapper"></div></div></div></div></div>');
797                        }
798                        $('body .ets_abancart_display_shopping_cart_overload').addClass('active').find('.ets_abancart_wrapper').html(json.html);
799                    }
800                },
801                error: function () {
802                    btn.removeClass('active');
803                }
804            });
805        }
806    });
807
808    $(document).on('click', '.ets_abancart_display_shopping_cart_overload .ets_abancart_close, .ets_abancart_display_shopping_cart_overload .ets_abancart_cancel', function (ev) {
809        ev.preventDefault();
810        ets_ab_fn.exitPopupCart();
811    });
812
813    $(document).on('click', '.ets_abancart_load_this_cart', function (ev) {
814        ev.preventDefault();
815        var btn = $(this);
816        if (!btn.hasClass('active') && btn.attr('href') != '') {
817            btn.addClass('active');
818            $.ajax({
819                type: 'POST',
820                url: btn.attr('href'),
821                dataType: 'json',
822                data: 'ajax=1',
823                success: function (json) {
824                    btn.removeClass('active');
825                    if (json) {
826                        if (json.errors)
827                            $('body .ets_abancart_display_shopping_cart_overload').prepend(json.errors);
828                        else
829                            window.location.href = json.link_checkout;
830                    }
831                },
832                error: function () {
833                    btn.removeClass('active');
834                }
835            });
836        }
837    });
838
839    $(document).on('click', '.ets_abancart_shopping_cart_overload .ets_abancart_close', function (ev) {
840        ev.preventDefault();
841        ets_ab_fn.exitPopupSaveCart();
842    });
843
844    $(document).on('click', '.ets_abancart_shopping_cart_overload button[id=submit_cart]', function (ev) {
845        ev.preventDefault();
846
847        var btn = $(this), form = $('#save_cart_form');
848        btn.parents('form#save_cart_form').find('input.cart_name').removeClass('error');
849        if (!btn.hasClass('active') && form.attr('action')) {
850            btn.addClass('active');
851            var formData = new FormData(form.get(0));
852            formData.append('ajax', 1);
853            $('#save_cart_form .bootstrap').remove();
854            $.ajax({
855                type: 'post',
856                url: form.attr('action'),
857                dataType: 'json',
858                data: formData,
859                processData: false,
860                contentType: false,
861                success: function (json) {
862                    btn.removeClass('active');
863                    if (json) {
864                        if (json.not_logged && parseInt($('#id_customer').val()) <= 0) {
865                            $('.ets_abancart_form_login').fadeIn();
866                            $('.ets_abancart_form_save_cart').fadeOut();
867                        } else if (json.errors) {
868                            form.prepend(json.errors);
869                            btn.parents('form#save_cart_form').find('input#cart_name').addClass('error').focus();
870                        } else {
871                            if (json.msg)
872                                showSuccessMessage(json.msg);
873                            $('#ets_abancart_cart_save').remove();
874                            ets_ab_fn.exitPopupSaveCart(false);
875                        }
876                    }
877                },
878                error: function () {
879                    btn.removeClass('active');
880                }
881            });
882        }
883    });
884    $(document).on('change', 'input#cart_name', function (e) {
885        if ($(this).val() != '') {
886            $(this).removeClass('error');
887        } else {
888            $(this).addClass('error');
889        }
890    });
891    $(document).on('click', '.ets_abancart_shopping_cart_overload button[name=submitLogin]', function (ev) {
892        ev.preventDefault();
893        var btn = $(this), form = $('#login_form');
894        if (!btn.hasClass('active') && form.attr('action')) {
895            btn.addClass('active');
896            var formData = new FormData(form.get(0));
897            formData.append('cart_name', $('#cart_name').val());
898            formData.append('ajax', 1);
899            $('#login_form .bootstrap').remove();
900            $.ajax({
901                type: 'post',
902                url: form.attr('action'),
903                dataType: 'json',
904                data: formData,
905                processData: false,
906                contentType: false,
907                success: function (json) {
908                    btn.removeClass('active');
909                    if (json) {
910                        if (json.errors)
911                            form.prepend(json.errors);
912                        else
913                            window.location.reload();
914                    }
915                },
916                error: function () {
917                    btn.removeClass('active');
918                }
919            });
920        }
921    });
922
923    $(document).on('click', '.ets_abancart_shopping_cart_overload button[name=submitCreate]', function (ev) {
924        ev.preventDefault();
925        var btn = $(this), form = $('#create_form');
926        if (!btn.hasClass('active') && form.attr('action')) {
927            btn.addClass('active');
928            var formData = new FormData(form.get(0));
929            formData.append('cart_name', $('#cart_name').val());
930            formData.append('ajax', 1);
931            $('#login_form .bootstrap').remove();
932            $.ajax({
933                type: 'post',
934                url: form.attr('action'),
935                dataType: 'json',
936                data: formData,
937                processData: false,
938                contentType: false,
939                success: function (json) {
940                    btn.removeClass('active');
941                    if (json) {
942                        if (json.errors)
943                            form.prepend(json.errors);
944                        else
945                            window.location.reload();
946                    }
947                },
948                error: function () {
949                    btn.removeClass('active');
950                    window.location.reload();
951                }
952            });
953        }
954    });
955
956    $(document).on('click', '#ets_abancart_cart_save', function (ev) {
957        ev.preventDefault();
958        if (!$(this).hasClass('active')) {
959            $(this).addClass('active');
960            ets_ab_fn.saveCart();
961        }
962
963    });
964
965    $(document).on('click', '.ets_abancart_close:not(.leave), .ets_abancart_no_thanks', function (ev) {
966        ev.preventDefault();
967        var btn = $(this),
968            overload = btn.parents('.ets_abancart_overload'),
969            id = overload.attr('data-id'),
970            type = overload.attr('data-type');
971        $('body .ets_abancart_' + type + '_overload.active').remove();
972        if (!btn.hasClass('active') && ETS_ABANCART_LINK_AJAX && id) {
973            $.ajax({
974                type: 'post',
975                url: ETS_ABANCART_LINK_AJAX,
976                dataType: 'json',
977                data: 'type=' + type + '&redisplay=1&id=' + id + (btn.hasClass('ets_abancart_no_thanks') ? '&closed=1' : ''),
978                success: function (json) {
979                    if (json) {
980                        ets_ab_fn.close(type, json);
981                    }
982                }
983            });
984        }
985    });
986
987    $(document).on('click', '.ets_abancart_leave_website_overload .ets_abancart_no_thanks', function (ev) {
988        ev.preventDefault();
989        var btn = $(this),
990            overload = btn.parents('.ets_abancart_overload');
991        overload.remove();
992        if (!btn.hasClass('active') && ETS_ABANCART_LINK_AJAX) {
993            btn.addClass('active');
994            $.ajax({
995                type: 'post',
996                url: ETS_ABANCART_LINK_AJAX,
997                dataType: 'json',
998                data: 'offLeave',
999                success: function (json) {
1000                    btn.removeClass('active');
1001                    if (json) {
1002                    }
1003                },
1004                error: function () {
1005                    btn.removeClass('active');
1006                }
1007            });
1008        }
1009    });
1010
1011    $(document).on('click', '.ets_abancart_overload .ets_abancart_add_discount', function (ev) {
1012        ev.preventDefault();
1013        var btn = $(this),
1014            overload = btn.parents('.ets_abancart_overload'),
1015            discount_code = btn.data('code');
1016        if (!btn.hasClass('active') && ETS_ABANCART_LINK_AJAX) {
1017            $.ajax({
1018                type: 'post',
1019                url: ETS_ABANCART_LINK_AJAX,
1020                dataType: 'json',
1021                data: 'add_cart_rule&discount_code=' + discount_code,
1022                success: function (json) {
1023                    if (json) {
1024                        if (json.errors) {
1025                            //overload.prepend(json.errors);
1026                            showErrorMessage(json.errors);
1027                        } else
1028                            window.location.href = json.link_checkout;
1029                    }
1030                }
1031            });
1032        }
1033    });
1034
1035    $(document).keyup(function (e) {
1036        if (e.keyCode === 27) {
1037            ets_ab_fn.exitPopupCart();
1038            ets_ab_fn.exitPopupSaveCart();
1039        }
1040    });
1041
1042    $(document).mouseup(function (e) {
1043
1044        var displayShoppingCart = $('.ets_abancart_display_shopping_cart_overload.active .ets_abancart_container'),
1045            displayCartSave = $('.ets_abancart_shopping_cart_overload.active .ets_abancart_shopping_cart');
1046
1047        if (displayShoppingCart.length > 0 && !displayShoppingCart.is(e.target) && displayShoppingCart.has(e.target).length === 0) {
1048            ets_ab_fn.exitPopupCart();
1049        }
1050        if (displayCartSave.length > 0 && !displayCartSave.is(e.target) && displayCartSave.has(e.target).length === 0) {
1051            ets_ab_fn.exitPopupSaveCart();
1052        }
1053    });
1054
1055    $(document).on('click', '.ets_abancart_delete_cart, .ets_abancart_delete', function (ev) {
1056        var btn = $(this);
1057        if (!confirm(btn.data('confirm'))) {
1058            ev.preventDefault();
1059        }
1060    });
1061
1062    $(document).on('click', '.js-ets-ac-btn-submit-lead-form', function (e) {
1063        var $this = $(this);
1064        if ($this.hasClass('loading')) {
1065            return false;
1066        }
1067        if ($this.closest('form').find('.ets_ac_captchav2').length && typeof grecaptcha !== 'undefined') {
1068            if (!grecaptcha.getResponse()) {
1069                $this.closest('.ets-ac-lead-form-field-shortcode').find('.form-errors').html('<div class="alert alert-danger"><ul>' + ETS_AC_TRANS.captchv2_invalid + '</ul></div>');
1070                return false;
1071            }
1072        }
1073        var formData = new FormData();
1074        var inputDatas = $this.closest('form').serializeArray();
1075
1076        $.each(inputDatas, function (i, el) {
1077            if ($this.closest('form').find('[name="' + el.name + '"]').attr('type') == 'file') {
1078                var fileItem = $this.closest('form').find('[name=' + el.name + ']')[0].files;
1079                if (fileItem.length) {
1080                    formData.append(el.name, fileItem[0]);
1081                }
1082            } else {
1083                formData.append(el.name, el.value);
1084            }
1085        });
1086        $this.closest('form').find('input[type=file]').each(function () {
1087            var fileItem = $(this)[0].files;
1088            if (fileItem.length) {
1089                formData.append($(this).attr('name'), fileItem[0]);
1090            }
1091        });
1092
1093        formData.append('submitEtsAcLeadForm', 1);
1094        $.ajax({
1095            url: ETS_AC_LINK_SUBMIT_LEAD_FORM + (ETS_AC_LINK_SUBMIT_LEAD_FORM.indexOf('?') !== -1 ? '&ajax=1' : '?ajax=1'),
1096            type: 'POST',
1097            dataType: 'json',
1098            data: formData,
1099            processData: false,
1100            contentType: false,
1101            dataType: 'json',
1102            beforeSend: function () {
1103                $this.addClass('loading');
1104                $this.prop('disabled', true);
1105            },
1106            success: function (res) {
1107                if (res.success) {
1108                    if (res.display_thankyou_page) {
1109                        $this.closest('.ets_abancart_wrapper').html(res.thankyou);
1110                        if ($('.ets_abancart_popup_overload .ets_abancart_close').length) {
1111                            $('.ets_abancart_popup_overload .ets_abancart_close').addClass('thankyou-page');
1112                        }
1113                    } else {
1114                        $this.closest('.ets-ac-lead-form-field-shortcode').html('<div class="alert alert-success">' + res.message + '</div>');
1115                    }
1116                } else {
1117                    var msg = '';
1118                    $.each(res.message, function (i, el) {
1119                        msg += '<li>' + el + '</li>';
1120                    });
1121                    $this.closest('.ets-ac-lead-form-field-shortcode').find('.form-errors').html('<div class="alert alert-danger"><ul>' + msg + '</ul></div>');
1122                }
1123            },
1124            complete: function () {
1125                $this.removeClass('loading');
1126                $this.prop('disabled', false);
1127            }
1128        });
1129        return false;
1130    });
1131
1132    $(document).on('click', '.ets-ac-btn-submit-lead-form ', function () {
1133        var $this = $(this);
1134        if ($this.closest('form').find('.ets_ac_captchav2').length && typeof grecaptcha !== 'undefined') {
1135            if (!grecaptcha.getResponse()) {
1136                $this.closest('form').find('.ets_ac_captchav2').parent().find('.form-error-item').remove();
1137                $this.closest('form').find('.ets_ac_captchav2').after('<p class="form-error-item">' + ETS_AC_TRANS.captchv2_invalid + '</p>');
1138                return false;
1139            }
1140        }
1141    });
1142    $(document).mouseleave(function () {
1143        setTimeout(ets_abancart_leavewebsite, 0)
1144    });
1145
1146});
1147
1148function etsAcHexToRgb(hex) {
1149    // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
1150    var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
1151    hex = hex.replace(shorthandRegex, function (m, r, g, b) {
1152        return r + r + g + g + b + b;
1153    });
1154
1155    var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
1156    return result ? {
1157        r: parseInt(result[1], 16),
1158        g: parseInt(result[2], 16),
1159        b: parseInt(result[3], 16)
1160    } : null;
1161}

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.