PageSourceSearch

https://anakraja77.biz/js/scripts.js

js anakraja77.biz collected 2026-09-28 08:44:29 UTC 83,562 bytes, 2,205 lines download raw bytes

1// Restricts input for the given textbox to the given inputFilter.
2function setInputFilter(textbox, inputFilter) {
3    ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
4        textbox.addEventListener(event, function() {
5            if (inputFilter(this.value)) {
6                this.oldValue = this.value;
7                this.oldSelectionStart = this.selectionStart;
8                this.oldSelectionEnd = this.selectionEnd;
9            } else if (this.hasOwnProperty("oldValue")) {
10                this.value = this.oldValue;
11                this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
12            }
13        });
14    });
15}
16
17function l(d){
18    return console.log(d);
19}
20
21function renderZoneOptions(data, selected){
22    let html = '';
23    let i=0;
24
25    $.each(data, function(key, val) {
26
27        let selectedStr = '';
28        if( selected && selected === val ){
29            selectedStr = 'selected="selected"';
30        }
31
32        html += '<option value="'+val+'" '+ selectedStr +'>'+val+'</option>';
33    });
34    return html;
35}
36
37function renderZoneDistrictOptions(data, selected){
38    let html = '<option value="">Select</option>';
39    let i=0;
40
41    $.each(data, function(key, val) {
42        let selectedStr = '';
43        if( selected && selected === val.district_name ){
44            selectedStr = 'selected="selected"';
45        }
46
47        html += '<option value="'+val.district_name+'" '+ selectedStr +' data-postcode="'+val.district_postcode+'">'+val.district_name+'</option>';
48    });
49    return html;
50}
51
52function renderZonePostcodeOptions(data, selected){
53    let html = '<option value="">Select</option>';
54    let i=0;
55    $.each(data, function(key, val) {
56        let selectedStr = '';
57        if( selected && selected === val ){
58            selectedStr = 'selected="selected"';
59        }
60
61        html += '<option value="'+val+'" '+ selectedStr +' >'+val+'</option>';
62    });
63    return html;
64}
65
66function formatMoney(n, c, d, t) {
67    var c = isNaN(c = Math.abs(c)) ? 0 : c,
68        d = d == undefined ? "," : d,
69        t = t == undefined ? "." : t,
70        s = n < 0 ? "-" : "",
71        i = String(parseInt(n = Math.abs(Number(n) || 0).toFixed(c))),
72        j = (j = i.length) > 3 ? j % 3 : 0;
73
74    return 'Rp ' + s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "")  + ',-';
75};
76
77function getParameterByName(name, url) {
78    if (!url) {
79        url = window.location.href;
80    }
81    name = name.replace(/[\[\]]/g, '\\$&');
82    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
83        results = regex.exec(url);
84    if (!results) return null;
85    if (!results[2]) return '';
86    return decodeURIComponent(results[2].replace(/\+/g, ' '));
87}
88function uuidv4() {
89    return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
90        (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
91    );
92}
93function setCookie(name,value,days) {
94    var expires = "";
95    if (days) {
96        var date = new Date();
97        date.setTime(date.getTime() + (days*24*60*60*1000));
98        expires = "; expires=" + date.toUTCString();
99    }
100    document.cookie = name + "=" + (value || "")  + expires + "; path=/";
101}
102function getCookie(name) {
103    var nameEQ = name + "=";
104    var ca = document.cookie.split(';');
105    for(var i=0;i < ca.length;i++) {
106        var c = ca[i];
107        while (c.charAt(0)==' ') c = c.substring(1,c.length);
108        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
109    }
110    return null;
111}
112function eraseCookie(name) {
113    //document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
114    setCookie(name,"",-1);
115}
116jQuery(function($) {
117
118    var deviceId = getCookie('ss_device_id');
119    if( !deviceId ){
120        let uuid = uuidv4();
121        setCookie('ss_device_id', uuid, 365);
122        deviceId = getCookie('ss_device_id');
123    }
124    //console.log(deviceId);
125    
126    /* var url = getParameterByName('url'); //"https://www.google.com/maps/place/Arctic+Pixel+Digital+Solutions/@63.6741553,-164.9587713,4z/data=!3m1!4b1!4m5!3m4!1s0x5133b2ed09c706b9:0x66deacb5f48c5d57!8m2!3d64.751111!4d-147.3494442";
127     var regex = new RegExp('@(.*),(.*),');
128     var lon_lat_match = url.match(regex);
129     var lat = lon_lat_match[1];
130     var lng = lon_lat_match[2];
131     console.log(lon_lat_match);
132     console.log("Lat:"+lat);
133     console.log("Lng:"+lng);*/
134
135    $.fn.inputFilter = function (inputFilter) {
136        return this.on("input keydown keyup mousedown mouseup select contextmenu drop", function () {
137            if (inputFilter(this.value)) {
138                this.oldValue = this.value;
139                this.oldSelectionStart = this.selectionStart;
140                this.oldSelectionEnd = this.selectionEnd;
141            } else if (this.hasOwnProperty("oldValue")) {
142                this.value = this.oldValue;
143                this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
144            }
145        });
146    };
147
148    // Restrict input to digits by using a regular expression filter.
149    $(".number-only").inputFilter(function (value) {
150        return /^\d*$/.test(value);
151    });
152
153    //var host = config.routes.front_url;
154    var body = $('body');
155
156    if( body.hasClass('loginpopup') ){
157        $('.site-desktop-nav-gateway .js-popup-link').click();
158    }
159
160    body.on('click', '#term-redeem', function (e) {
161        if ($(this).prop('checked')) {
162            $('.confirm-redeem').removeClass('is-disabled')
163        } else {
164            $('.confirm-redeem').addClass('is-disabled')
165        }
166    });
167    
168    $(document).ready(function(){
169        var homePageSlider = $('#home-slider-section');
170        if( homePageSlider ) {
171            $.ajax({
172                method: "get",
173                url: homePageSlider.data('url')
174            })
175                .done(function (resp) {
176                    homePageSlider.html(resp);
177
178                    // risma js slider home
179                    var $jsItem = body.find(".js-items-home").flickity({
180                        prevNextButtons: false,
181                        imagesLoaded: true,
182                        autoPlay: 5000
183                    });
184
185                    var flkty = $jsItem.data("flickity");
186                    var $cellButtonGroup = body.find(".menu-button");
187                    var $cellButtons = $cellButtonGroup.find(".navig");
188
189                    $jsItem.on("select.flickity", function () {
190                        $cellButtons.filter(".is-selected").removeClass("is-selected");
191                        $cellButtons.eq(flkty.selectedIndex).addClass("is-selected");
192                    });
193
194                    $cellButtonGroup.on("click", ".navig", function () {
195                        var index = $(this).index();
196                        $jsItem.flickity("select", index);
197                    });
198                })
199                .fail(function (resp) {
200
201                });
202        }
203
204        var homePageBlog = $('#home-blog-section');
205        if( homePageBlog ) {
206            let isMobile = false;
207            (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) isMobile = true;})(navigator.userAgent||navigator.vendor||window.opera);
208            if ( !isMobile ) {
209                $.ajax({
210                    method: "get",
211                    url: homePageBlog.data('url')
212                })
213                    .done(function (resp) {
214                        homePageBlog.html(resp);
215                        var initOneLazyLoad = function (horizContainerElement) {
216                            fluidvids.init({
217                                selector: [".js-video", "iframe"],
218                                players: ["www.youtube.com"]
219                            });
220                            fluidvids.render();
221                        };
222
223                        window.LL = new LazyLoad({
224                            callback_finish: initOneLazyLoad,
225                        });
226                    })
227                    .fail(function (resp) {
228
229                    });
230            }
231        }
232    });
233
234    body.on('click', '.submit-on-click', function (e) {
235        let form = $(this).closest('form');
236        form.addClass('is-loading');
237        form.submit();
238    });
239
240    body.on('click', '.filter-parent-cat', function (e) {
241        let form = $(this).closest('form');
242        form.find('.filter-sub-cat').prop('checked', false)
243        form.addClass('is-loading');
244        form.submit();
245    });
246
247    
248
249    body.on('change', '.submit-on-change', function (e) {
250        let form = $(this).closest('form');
251        form.addClass('is-loading');
252        form.submit();
253    });
254
255    body.on('change', '.reset-ftr-all', function (e) {
256        window.location = $(this).data('url');
257    });
258
259    body.on('click', '.btn-alert-delete', function (e) {
260        if (confirm("Are you sure?")) {
261            $(this).closest('form').submit();
262        }
263        return false;
264    });
265
266    body.on('click', '.confirm-redeem', function (e) {
267        let containerRedeem = $(this).closest('.items');
268        containerRedeem.addClass('is-loading');
269        if (confirm("Are you sure?")) {
270            body.find('#popup-redeem-content-title').text("Redeem point sedang diproses");
271            containerRedeem.addClass('is-loading');
272            $(this).closest('form').submit();
273        } else {
274            containerRedeem.removeClass('is-loading');
275        }
276
277        return false;
278    });
279
280    body.on('click', '.alert-delete', function (e) {
281        e.preventDefault();
282        if (confirm("Are you sure?")) {
283            window.location = $(this).attr('href');
284        }
285
286        return false;
287    });
288
289    body.on('click', '.alert-info', function (e) {
290        e.preventDefault();
291        alert( $(this).data('alert') );
292        return false;
293    });
294
295    body.find('.shp-method:first').click();
296
297    /* apply checkout coupon */
298    body.on('click', '#apply-voucher', function () {
299
300        let parent = $(this).closest('.checkout-form');
301        let url = $(this).attr('data-url');
302        let voucherNo = $('#checkout-coupon-input').val();
303        parent.addClass('is--ing');
304        body.find('.coupon-message').html('').addClass('is-hidden');
305        $.ajax({
306            method: "post",
307            url: url,
308            data: {
309                voucherNo: voucherNo,
310                _token: config._token
311            }
312        })
313            .done(function (resp) {
314                parent.removeClass('is-loading');
315                if (resp.status) {
316                    triggerCheckoutSummary(resp.summary);
317                } else {
318                    body.find('.coupon-message').html(resp.message).removeClass('is-hidden');
319                }
320
321            })
322            .fail(function (resp) {
323                parent.removeClass('is-loading');
324            });
325
326        //return false;
327    });
328
329    /* remove checkout coupon */
330    body.on('click', '#remove-voucher', function () {
331
332        let parent = $(this).closest('.checkout-form');
333        let url = $(this).attr('data-url');
334        parent.addClass('is-loading');
335
336        $.ajax({
337            method: "post",
338            url: url,
339            data: {
340                _token: config._token
341            }
342        })
343            .done(function (resp) {
344                parent.removeClass('is-loading');
345                if (resp.status) {
346                    triggerCheckoutSummary(resp.summary);
347                }
348            })
349            .fail(function (resp) {
350                parent.removeClass('is-loading');
351            });
352
353        //return false;
354    });
355
356    /* Compare Product */
357    body.on('click', '#compare-product-ajax', function () {
358        let parent  = $(this).closest('.site-content');
359        let url     = $(this).attr('data-url');
360        parent.addClass('is-loading');
361
362        if( $(this).is(":checked") ) {
363
364            $.ajax({
365                method  : "post",
366                url     : url,
367                data    : {
368                    _token      : config._token,
369                    product_id  : $(this).val(),
370                    checked     : 1
371                }
372            })
373                .done(function (resp) {
374                    parent.removeClass('is-loading');
375                    FErenderZoneDiv(resp);
376                })
377                .fail(function (resp) {
378                    parent.removeClass('is-loading');
379                });
380        } else {
381
382            $.ajax({
383                method  : "post",
384                url     : url,
385                data    : {
386                    _token      : config._token,
387                    product_id  : $(this).val(),
388                    checked     : null
389                }
390            })
391                .done(function (resp) {
392                    parent.removeClass('is-loading');
393                    FErenderZoneDiv(resp);
394                })
395                .fail(function (resp) {
396                    parent.removeClass('is-loading');
397                });
398        }
399    });
400
401    function FErenderZoneDiv(resp){
402        let compareText = $('.compare > .text');
403        if( compareText.length > 0 ) {
404            if ( resp.status == true ) {
405                compareText.text('Berhasil ditambahkan ke perbandingan');
406            } else {
407                if (resp.count > 0) {
408                    $("#compare-product-ajax").prop("checked", false);
409                    alert('Anda telah membandingkan 3  product');
410                }
411                compareText.text('Bandingkan');
412            }
413        }
414    }
415
416    let countdown = $(".countdown");
417    if (countdown.length > 0) {
418        countdown.countdown(countdown.data('expired'), function (event) {
419            let hour    = $(this).find('.hour');
420            let minute  = $(this).find('.minute');
421            let second  = $(this).find('.sec');
422
423            let dayC    = parseInt(event.strftime('%D'));
424            let hourC   = event.strftime('%H');
425
426            if (dayC >= 1) {
427                hourC = parseInt(hourC) + parseInt(24 * dayC);
428            }
429            hour.text(hourC);
430            minute.text(event.strftime('%M'));
431            second.text(event.strftime('%S'));
432
433            /*$(this).text(
434                event.strftime('%H:%M:%S')
435            );*/
436        });
437    }
438
439    $('.checkout-payment-option').on('click change', function () {
440        let payMethod = $(this).find('input[name="pay_method"]');
441        let bankCd = payMethod ? payMethod.data('bank') : "";
442        $('#input-payment-bankcd').val(bankCd)
443    })
444
445    /*
446    * My Account
447    * */
448    var userContainer = $('.user-profile-container');
449    if (userContainer.length > 0) {
450        let orderNo = getParameterByName('no');
451        if (orderNo) {
452            $('.show-detail-order[data-no="' + orderNo + '"]').addClass('is-toggled');
453            $('.wrapper-detail-order[data-no="' + orderNo + '"]').addClass('is-toggled').css({
454                height: 'auto',
455                visibility: 'inherit',
456                opacity: 1,
457                overflow: 'visible',
458                display: 'block'
459            })
460
461        }
462    }
463
464    var fbBtn = $('.facebook-share-btn');
465    var twBtn = $('.twitter-share-btn');
466    var waBtn = $('.whatsapp-share-btn');
467    // just load in single blog
468    if (fbBtn.length > 0 || twBtn.length > 0 || waBtn.length > 0) {
469        fbBtn.on('click', function () {
470            var href = $(this).data('url');
471            var image = $(this).data('image');
472            var title = $(this).data('title');
473            var width = 575,
474                height = 400,
475                left = ($(window).width() - width) / 2,
476                top = ($(window).height() - height) / 2,
477                url = 'https://www.facebook.com/sharer/sharer.php?sdk=joey&u=' + href + '&display=popup&ref=plugin&src=share_button',
478                opts = 'status=1' +
479                    ',width=' + width +
480                    ',height=' + height +
481                    ',top=' + top +
482                    ',left=' + left;
483
484            window.open(url, 'facebook', opts);
485        });
486
487        twBtn.on('click', function () {
488            var href = $(this).data('url');
489            var title = $(this).data('title');
490            var width = 575,
491                height = 400,
492                left = ($(window).width() - width) / 2,
493                top = ($(window).height() - height) / 2,
494                url = 'https://twitter.com/intent/tweet?url=' + href + '&text=' + title + '&wrap_links=‌​true',
495                opts = 'status=1' +
496                    ',width=' + width +
497                    ',height=' + height +
498                    ',top=' + top +
499                    ',left=' + left;
500
501            window.open(url, 'twitter', opts);
502        });
503
504        waBtn.on('click', function () {
505            var href    = $(this).data('url');
506            var title   = $(this).data('title');
507            var width   = 575,
508                height  = 400,
509                left    = ($(window).width() - width) / 2,
510                top     = ($(window).height() - height) / 2,
511                /*url     = 'https://twitter.com/intent/tweet?url=' + href + '&text=' + title + '&wrap_links=‌​true',*/
512                url     = 'whatsapp://send?text='+href+ '&wrap_links=‌​true',
513                opts    = 'status=1' +
514                    ',width=' + width +
515                    ',height=' + height +
516                    ',top=' + top +
517                    ',left=' + left;
518
519            window.open(url, 'whatsapp', opts);
520        });
521
522        $('.google-share-btn').on('click', function () {
523            var href = $(this).data('url');
524            var width = 575,
525                height = 400,
526                left = ($(window).width() - width) / 2,
527                top = ($(window).height() - height) / 2,
528                url = 'https://plus.google.com/share?url=' + href,
529                opts = 'status=1' +
530                    ',width=' + width +
531                    ',height=' + height +
532                    ',top=' + top +
533                    ',left=' + left;
534
535            window.open(url, 'google', opts);
536        });
537
538        $('.linkedin-share-btn').on('click', function () {
539            var href = $(this).data('url');
540            var title = $(this).data('title');
541            var width = 575,
542                height = 400,
543                left = ($(window).width() - width) / 2,
544                top = ($(window).height() - height) / 2,
545                url = 'https://www.linkedin.com/shareArticle?mini=true&url=' + href + '&title=' + title,
546                opts = 'status=1' +
547                    ',width=' + width +
548                    ',height=' + height +
549                    ',top=' + top +
550                    ',left=' + left;
551
552            window.open(url, 'linkedin', opts);
553        });
554
555    }
556
557    /* prevent submit when enter */
558    body.on('keydown', '.dont-enter', function (event) {
559        if (event.keyCode == 13) {
560            event.preventDefault();
561            return false;
562        }
563    });
564
565    function validateOrder(form) {
566        return true;
567    }
568
569    body.on('click', '.place-order', function () {
570
571        body.addClass('is-loading');
572
573        let form = $(this).closest('form');
574        let result = validateOrder(form);
575
576        if (result == false) {
577            return false;
578        }
579
580        return true;
581    });
582
583    body.on('submit', '.form-checkout', function () {
584        let form = $(this);
585        let result = validateOrder(form);
586
587        if (result == false) {
588            return false;
589        }
590
591        return true;
592    });
593
594    $('.force-number').keypress(function (evt) {
595        if (evt.which < 48 || evt.which > 57) {
596            evt.preventDefault();
597        }
598    });
599
600    var hasSelect2MultipleAjax = body.find('.select2-multiple-ajax');
601    hasSelect2MultipleAjax.each(function(){
602        var hasSelect2Multiple = $(this);
603        if (hasSelect2Multiple.length > 0) {
604            hasSelect2Multiple.select2({
605                ajax: {
606                    url : hasSelect2Multiple.data('ajax'),
607                    type: 'post',
608                    data: function (params) {
609                        return {
610                            q       : params.term, // search term
611                            _token  : config._token
612                        };
613                    },
614                    dataType: 'json',
615                    delay   : 250,
616                    processResults: function (data) {
617                        return {
618                            results: data
619                        };
620                    },
621                    cache: true
622                },
623                placeholder:  hasSelect2Multiple.data('title'),
624                width: '100%',
625                allowClear: true,
626                multiple:true,
627                tags: true,
628                tokenSeparators: [',',' '],
629            });
630        }
631    })
632
633    $('.tags-option-label').click(function(){
634        var tagName = $(this).attr('data-tag-name');
635        var tagId   = $(this).attr('data-tag-id');
636
637        var newState = new Option(tagName, tagId, true, true);
638        $(".select2-multiple-ajax").append(newState);
639    });
640
641    var isCheckoutPage = $('.page-checkout');
642    var jsZone = $('.js-zone');
643    var checkoutLinkPayment = body.find('.checkout-link-payment');
644    var checkoutSummaryWrapper = body.find('.order-summary');
645    var checkoutSummary = body.find('.order-summary-total');
646    var checkoutSummaryProduct = body.find('.order-summary-product');
647    var checkoutSummaryShipping = body.find('.order-summary-shipping');
648    var shippingOptions = body.find('.shipping-options');
649    if( jsZone.length > 0 ) {
650        var shippingItems       = body.find('.shipping-method-items');
651        var shippingItemEmpty   = shippingItems.find(".empty").html();
652        var hasProvince         = body.find('.province-ajax');
653        var hasRegency          = body.find('.regency-ajax');
654        var hasPostcode          = body.find('.postcode-ajax');
655        var form                = hasProvince.closest('form');
656        var districtPostcode    = $('.district-postcode');
657
658        $(hasProvince).on('change', function () {
659            form.addClass('is-loading');
660            if ( checkoutSummary.length ){
661                checkoutSummary.addClass('is-loading');
662            }
663            let url = $(this).attr('data-url');
664            let val = hasRegency.attr('data-val');
665
666            $.ajax({
667                method  : "get",
668                url     : url,
669                data    : {
670                    isCheckoutPage: isCheckoutPage.length,
671                    province_name: $(this).val()
672                }
673            })
674                .done(function (resp) {
675                    form.removeClass('is-loading');
676                    if ( checkoutSummary.length ) {
677                        checkoutSummary.removeClass('is-loading');
678                        checkoutSummary.html(resp.data.summary);
679                    }
680
681                    if (resp.data.model.length || resp.data.model.length == undefined) {
682                        $(hasRegency).html(renderZoneOptions(resp.data.model, val)).change();
683                    }
684                    shippingItems.html(shippingItemEmpty);
685
686                })
687                .fail(function (data) {
688                    form.removeClass('is-loading');
689                });
690        }).change();
691
692        var hasDistrict = body.find('.district-ajax');
693        var getPostcode = hasDistrict.find(':selected').data('postcode');
694        $(hasRegency).on('change', function () {
695            form.addClass('is-loading');
696            if ( checkoutSummary.length ) {
697                checkoutSummary.addClass('is-loading');
698            }
699
700            let val = hasDistrict.attr('data-val');
701            let url = $(this).attr('data-url');
702
703            $.ajax({
704                method  : "get",
705                url     : url,
706                data    : {
707                    isCheckoutPage:isCheckoutPage.length,
708                    province_name: $(hasProvince).val(),
709                    regency_name: $(this).val()
710                }
711            })
712                .done(function (resp) {
713                    form.removeClass('is-loading');
714                    if ( checkoutSummary.length ) {
715                        checkoutSummary.removeClass('is-loading');
716                        checkoutSummary.html(resp.data.summary);
717                    }
718
719                    if (resp.data.model.length || resp.data.model.length == undefined) {
720                        $(hasDistrict).html(renderZoneDistrictOptions(resp.data.model, val)).change();
721                    }
722
723                    $(hasPostcode).html("<options>Select</options>");
724                    shippingItems.html(shippingItemEmpty);
725                })
726                .fail(function (data) {
727                    form.removeClass('is-loading');
728                });
729        }).change();
730
731        $(hasDistrict).not(".guest-district-checkout").on('change', function () {
732            let $this   = $(this);
733            let url     = $(this).attr('data-url');
734            let val     = $(hasPostcode).attr('data-val');
735
736            if( $this.val() != '' ) {
737                form.addClass('is-loading');
738                $.ajax({
739                    method  : "get",
740                    url     : url,
741                    data    : {
742                        isCheckoutPage:isCheckoutPage.length,
743                        province_name: $(hasProvince).val(),
744                        regency_name: $(hasRegency).val(),
745                        district_name: $this.val()
746                    }
747                })
748                    .done(function (resp) {
749                        form.removeClass('is-loading');
750                        /*var selectedDistrict = $('.district-ajax option:selected');
751                        if (selectedDistrict.data('postcode')) {
752                            districtPostcode.val(selectedDistrict.data('postcode'));
753                        }*/
754
755                        $(hasPostcode).html(renderZonePostcodeOptions(resp.data.postcodes, val)).change();
756                        $('.postcode-ajax-input').val(resp.data.postcodes[0]);
757
758                        if ($this.hasClass('with-shipping')) {
759                            if (resp.data) {
760                                shippingItems.html(resp.data.rates);
761                            }
762                            body.find('.shipping_method:first').click();
763                        }
764                    })
765                    .fail(function (data) {
766                        form.removeClass('is-loading');
767                        shippingItems.html('<p>Maaf, terjadi kesalahan</p>');
768                    });
769            }
770
771        });
772
773        if( isCheckoutPage.length > 0 ) {
774
775            function getShippingRate(email, name, address, phone, postcode, provinceName, regencyName, districtName, note){
776                body.addClass('is-loading');
777                shippingOptions.addClass('is-loading');
778                checkoutSummary.addClass('is-loading');
779                checkoutSummaryShipping.addClass('is-loading');
780                checkoutLinkPayment.addClass('is-disabled');
781
782                /*console.table({
783                    email: email,
784                    name: name,
785                    address: address,
786                    phone: phone,
787                    postcode: postcode,
788                    province_name: provinceName,
789                    regency_name: regencyName,
790                    district_name: districtName
791                });*/
792
793                $.ajax({
794                    method: "get",
795                    url: shippingOptions.data('shipping-url'),
796                    data: {
797                        email: email,
798                        name: name,
799                        address: address,
800                        phone: phone,
801                        postcode: postcode,
802                        province: provinceName,
803                        regency: regencyName,
804                        district: districtName,
805                        note: note
806                    }
807                })
808                    .done(function (resp) {
809                        body.removeClass('is-loading');
810                        shippingOptions.removeClass('is-loading');
811                        checkoutSummary.removeClass('is-loading');
812                        checkoutSummaryShipping.removeClass('is-loading');
813                        shippingOptions.html(resp.data.shipping);
814                        checkoutSummaryProduct.html(resp.data.items);
815                        checkoutSummary.html(resp.data.summaryTotal);
816                        checkoutSummaryShipping.html(resp.data.summaryShipping);
817
818                        loadDatePicker();
819                    })
820                    .fail(function (data) {
821                        body.removeClass('is-loading');
822                        shippingOptions.addClass('is-loading');
823                        checkoutSummary.removeClass('is-loading');
824                        checkoutSummaryShipping.removeClass('is-loading');
825                    });
826            }
827
828            /* logged in */
829            $('.js-address-select').on('change', '.item input[type="radio"]', function () {
830                let name = $(this).data('name');
831                let address = $(this).data('address');
832                let phone = $(this).data('phone');
833                let postcode = $(this).data('postcode');
834                let provinceName = $(this).data('province');
835                let regencyName = $(this).data('regency');
836                let districtName = $(this).data('district');
837                let note = $('textarea[name="note"]').val();
838                getShippingRate("", name, address, phone, postcode, provinceName, regencyName, districtName, note);
839            });
840
841            /* initial trigger change after load */
842            let selectedAddr = $('.js-address-select .item input[type="radio"]:checked');
843            if( selectedAddr.length > 0 ){
844                selectedAddr.change();
845            } else {
846                $('.js-address-select .item:first input[type="radio"]').change();
847            }
848
849            /* guest */
850            body.on('change', '.guest-district-checkout', function () {
851                let email = $('input[name="email"]').val();
852                let name = $('input[name="fullname"]').val();
853                let address = $('textarea[name="address"]').val();
854                let phone = $('input[name="phone"]').val();
855                let postcode = $('input[name="postcode"]').val();
856                let provinceName = $('select[name="province"]').val();
857                let regencyName = $('select[name="regency"]').val();
858                let districtName = $('select[name="district"]').val();
859                let note = $('textarea[name="note"]').val();
860                getShippingRate(email, name, address, phone, postcode, provinceName, regencyName, districtName, note);
861            });
862
863            function updateChosenShipping(wrapper, form, service_code, gateway, provinceName, regencyName, districtName, email, name, address, phone, note, postcode){
864
865                $.ajax({
866                    method: "post",
867                    url: shippingOptions.data('update-rate-url'),
868                    data: {
869                        gateway: gateway,
870                        province_name: provinceName,
871                        regency_name: regencyName,
872                        district_name: districtName,
873                        service_code: service_code,
874                        email: email,
875                        name: name,
876                        address: address,
877                        phone: phone,
878                        postcode: postcode,
879                        note: note,
880                        _token: config._token
881                    }
882                })
883                    .done(function (resp) {
884                        form.removeClass('is-loading');
885                        checkoutSummary.removeClass('is-loading');
886                        checkoutSummaryShipping.removeClass('is-loading');
887                        checkoutSummaryProduct.html(resp.data.items);
888                        checkoutSummary.html(resp.data.summaryTotal);
889                        checkoutSummaryShipping.html(resp.data.summaryShipping);
890                        checkoutLinkPayment.removeClass('is-disabled');
891                    })
892                    .fail(function (data) {
893                        form.removeClass('is-loading');
894                        checkoutSummary.removeClass('is-loading');
895                        checkoutSummaryShipping.removeClass('is-loading');
896                    });
897            }
898
899            body.on('click', '.service-input', function () {
900
901                if( $(this).hasClass('alias_service') ){
902                    return false;
903                }
904
905                form.addClass('is-loading');
906                checkoutSummary.addClass('is-loading');
907                checkoutSummaryShipping.addClass('is-loading');
908
909                let $this = $(this);
910                let wrapper = $this.closest('.shipping-option');
911
912                let service_code = $this.val()
913                let gateway = wrapper.data('gateway');
914                let provinceName, regencyName, districtName, email, name, address, postcode, phone, note;
915
916                note = $('textarea[name="note"]').val();
917
918                if( config._logged_in ) {
919                    let addressPicked = $('.js-address-select .item input[type="radio"]:checked');
920                    if( addressPicked.length ){
921                        provinceName = addressPicked.data('province');
922                        regencyName = addressPicked.data('regency');
923                        districtName = addressPicked.data('district');
924                        email = addressPicked.data('email');
925                        name = addressPicked.data('name');
926                        address = addressPicked.data('address');
927                        postcode = addressPicked.data('postcode');
928                        phone = addressPicked.data('phone');
929                    }
930
931                } else {
932                    provinceName = $(hasProvince).val();
933                    regencyName = $(hasRegency).val();
934                    districtName = $(hasDistrict).val();
935                    email = $('input[name="email"]').val();
936                    name = $('input[name="fullname"]').val();
937                    address = $('textarea[name="address"]').val();
938                    phone = $('input[name="phone"]').val();
939                    postcode = $('input[name="postcode"]').val();
940                }
941
942                updateChosenShipping(wrapper, form, service_code,gateway,provinceName,regencyName,districtName, email, name, address, phone, note, postcode);
943            });
944
945            body.on('click', '.service-input-single', function () {
946
947                body.find('.additional-input').prop('checked',false);
948
949                form.addClass('is-loading');
950                checkoutSummary.addClass('is-loading');
951                checkoutSummaryShipping.addClass('is-loading');
952
953                let $this = $(this);
954                let wrapper = $this.closest('.shipping-option');
955
956                let service_code = $this.val();
957                let gateway = $this.val();
958                let provinceName, regencyName, districtName, email, name, address, postcode, phone, note;
959
960                note = $('textarea[name="note"]').val();
961                //console.log($this.parent().find('.additional-input').data('sg-code'));
962                $this.parent().find('.additional-input').prop('checked',true);
963
964                if( config._logged_in ) {
965                    let addressPicked = $('.js-address-select .item input[type="radio"]:checked');
966                    if( addressPicked.length ){
967                        provinceName = addressPicked.data('province');
968                        regencyName = addressPicked.data('regency');
969                        districtName = addressPicked.data('district');
970                        email = addressPicked.data('email');
971                        name = addressPicked.data('name');
972                        address = addressPicked.data('address');
973                        postcode = addressPicked.data('postcode');
974                        phone = addressPicked.data('phone');
975                    }
976
977                } else {
978                    provinceName = $(hasProvince).val();
979                    regencyName = $(hasRegency).val();
980                    districtName = $(hasDistrict).val();
981                    email = $('input[name="email"]').val();
982                    name = $('input[name="fullname"]').val();
983                    address = $('textarea[name="address"]').val();
984                    phone = $('input[name="phone"]').val();
985                    postcode = $('input[name="postcode"]').val();
986                }
987
988                updateChosenShipping(wrapper, form, service_code,gateway,provinceName,regencyName,districtName,email, name, address, phone, note, postcode );
989            });
990
991            body.on('change', '.additional-input', function () {
992                form.addClass('is-loading');
993                checkoutSummary.addClass('is-loading');
994                shippingOptions.addClass('is-loading');
995                checkoutSummaryShipping.addClass('is-loading');
996
997                let sgCode = $(this).data('sg-code');
998                let checked = $(this).is(':checked');
999
1000                $.ajax({
1001                    method: "get",
1002                    url: shippingOptions.data('shipping-install-url'),
1003                    data: {
1004                        sg_code: sgCode,
1005                        checked: checked
1006                    }
1007                })
1008                    .done(function (resp) {
1009                        form.removeClass('is-loading');
1010                        shippingOptions.removeClass('is-loading');
1011                        checkoutSummary.removeClass('is-loading');
1012                        checkoutSummaryShipping.removeClass('is-loading');
1013                        checkoutSummary.html(resp.data.summaryTotal);
1014                        checkoutSummaryShipping.html(resp.data.summaryShipping);
1015                    })
1016                    .fail(function (data) {
1017                        body.removeClass('is-loading');
1018                        shippingOptions.addClass('is-loading');
1019                        checkoutSummary.removeClass('is-loading');
1020                        checkoutSummaryShipping.removeClass('is-loading');
1021                    });
1022
1023            });
1024
1025            body.on('click', '.shipping-input', function () {
1026                checkoutLinkPayment.removeClass('is-disabled');
1027            });
1028        }
1029
1030    }
1031    if( isCheckoutPage.length > 0 ) {
1032
1033        var paymentOptions = $('.payment-options');
1034        body.on('change', '.payment_method', function () {
1035            checkoutSummary.addClass('is-loading');
1036            paymentOptions.addClass('is-loading');
1037
1038            let payment = $(this).val();
1039            // console.log(payment);
1040
1041            $.ajax({
1042                method: "post",
1043                url: paymentOptions.data('url'),
1044                data: {
1045                    payment: payment,
1046                    _token: config._token
1047                }
1048            })
1049                .done(function (resp) {
1050                    checkoutSummary.html(resp.data.summaryTotal);
1051                    $('#place-order').removeClass('is-disabled');
1052                    checkoutSummary.removeClass('is-loading');
1053                    paymentOptions.removeClass('is-loading');
1054
1055                })
1056                .fail(function (data) {
1057                    checkoutSummary.removeClass('is-loading');
1058                    paymentOptions.removeClass('is-loading');
1059                });
1060        })
1061
1062        /*body.on('click', '.payment-option .label', function () {
1063            console.log($(this).parent().find('.input'));
1064            $(this).parent().find('.input').trigger('change');
1065        })
1066
1067        body.on('click', '.payment-option', function () {
1068            console.log($(this).find('.input'));
1069            $(this).find('.input').trigger('change');
1070        })*/
1071
1072        // update service fee
1073        $('.order-summary-total').on('DOMSubtreeModified', function () {
1074            let $this = $(this);
1075            let $findTotal = $this.find('.total');
1076            let $paymentSelected = $('.payment-options').find('input[type="radio"][name="payment_method"]:checked');
1077
1078            if ($findTotal.length) {
1079                let $total = $findTotal.find('#checkout-total-price').data('value');
1080                if ($paymentSelected.length) {
1081                    let $url = $paymentSelected.closest('.payment-options').data('update-service-fee-url');
1082                    let $paymentDesc = $paymentSelected.closest('.payment-option').find('.desc');
1083                    if ($paymentDesc.find('.ccinstallment').length) {
1084                        $paymentDesc.addClass('is-loading');
1085
1086                        $.ajax({
1087                            method: "post",
1088                            url: $url,
1089                            data: {
1090                                payment_method: $paymentSelected.val(),
1091                                _token: config._token
1092                            }
1093                        })
1094                        .done(function (resp) {
1095                            if (resp.data.desc) {
1096                                $paymentDesc.html(resp.data.desc);
1097                            }
1098                            $paymentDesc.removeClass('is-loading');
1099                        })
1100                        .fail(function (data) {
1101                            $paymentDesc.removeClass('is-loading');
1102                        })
1103                    }
1104                }
1105            }
1106        });
1107
1108    }
1109
1110    var isProductLove = $('.love-ajax');
1111    if( isProductLove.length > 0 ) {
1112        body.on('click', '.love-ajax', function (e) {
1113
1114            e.preventDefault();
1115
1116            var content     = isProductLove.closest('.site-content');
1117            let $this       = $(this);
1118            content.addClass('is-loading');
1119
1120            let url         = $this.attr('data-url');
1121            let userId      = $this.attr('data-user-id');
1122            let productId   = $this.attr('data-product-id');
1123            let account     = $this.attr('data-account');
1124            let isWishlistPage = $('.account-wishlist').length > 0 ? 11 : false;
1125
1126            if( !isWishlistPage && $this.hasClass('is-loved') ){
1127                return window.location = $this.attr('data-user-wishlist');
1128
1129            }
1130
1131            let parent          = $(this).closest('.item-'+productId);
1132            let love            = content.find('.count-ajax-love');
1133            let countLove       = love.text();
1134            let totalLove       = content.find('.count-total-love');
1135            let countTotalLove  = totalLove.text();
1136
1137
1138
1139
1140            $.ajax({
1141                method  : "get",
1142                url     : url,
1143                data    : {
1144                    userId      : userId,
1145                    productId   : productId,
1146                    isWishlistPage: isWishlistPage
1147                }
1148            })
1149                .done(function (resp) {
1150                    content.removeClass('is-loading');
1151
1152                    if (resp.data.model && resp.data.model == 1) {
1153                        $this.addClass('is-loved');
1154
1155                        $this.attr('href', $this.data('user-wishlist'));
1156
1157                    }else{
1158                        //$this.removeClass('is-loved');
1159
1160                        if(account == true){
1161                            if(love.length > 0 && totalLove.length>0){
1162                                love.text(countLove-1);
1163                                totalLove.text(countTotalLove-1);
1164                            }
1165
1166                            parent.hide(900);
1167                        } else {
1168                            $this.attr('href', account)
1169                        }
1170                    }
1171
1172                })
1173                .fail(function (data) {
1174                    content.removeClass('is-loading');
1175                });
1176        });
1177    }
1178
1179    var orderHistoryLoadMore    = $('.order-history-load-more');
1180    if( orderHistoryLoadMore.length > 0 ) {
1181        var orderHistoryPage        = 2;
1182        var orderHistoryLastPage    = orderHistoryLoadMore.attr('data-last-page');
1183
1184        var orderHistoryTimeout   = null;
1185        $(window).on('scroll', function () {
1186            if( orderHistoryPage <= orderHistoryLastPage ) {
1187                if (orderHistoryTimeout) clearTimeout(orderHistoryTimeout);
1188                orderHistoryTimeout = setTimeout(function () {
1189                    if ($(window).scrollTop() >= orderHistoryLoadMore.offset().top + orderHistoryLoadMore.outerHeight() - window.innerHeight) {
1190                        orderHistoryLoadMoreData(orderHistoryPage, orderHistoryLoadMore);
1191                        orderHistoryPage++;
1192                    }
1193                }, 500, parseInt(orderHistoryLoadMore.offset().top));
1194            }
1195        });
1196
1197        function orderHistoryLoadMoreData(orderHistoryPage, orderHistoryLoadMore) {
1198            if (orderHistoryLoadMore.length > 0) {
1199                var parent  = $('.order-history');
1200                parent.addClass('is-loading');
1201
1202                var orderHistoryLastNo      = orderHistoryLoadMore.attr('data-number');
1203
1204                $.ajax(
1205                    {
1206                        url         : orderHistoryLoadMore.data('url'),
1207                        type        : "GET",
1208                        data        : {page: orderHistoryPage, isLoadMore: true, _token: config._token, number:orderHistoryLastNo},
1209                    })
1210                    .done(function (data) {
1211                        if (data !== '') {
1212                            var $grid = $('.order-history');
1213                            $grid.find(".order-history-item:last").after(data);
1214                        }
1215
1216                        var number  = parseInt($grid.find(".order-meta-number:last").html());
1217                        number      = number+1;
1218
1219                        orderHistoryLoadMore.attr('data-number', number);
1220                        parent.removeClass('is-loading');
1221
1222                        body.find('.js-popup-link').magnificPopup({
1223                            type: 'inline',
1224                            mainClass: 'mfp-animation',
1225                            removalDelay: 200
1226                        });
1227                    })
1228                    .fail(function (jqXHR, ajaxOptions, thrownError) {
1229                        parent.removeClass('is-loading');
1230                    });
1231            }
1232        }
1233    }
1234
1235
1236    // form interaction
1237    const formInteraction = function() {
1238        const $formLabel = document.querySelectorAll('.js-form-input');
1239
1240        $formLabel.forEach( element => {
1241            let $input = element.querySelectorAll('.input');
1242
1243            $input.forEach(input => {
1244                input.addEventListener('focus', function() {
1245                    this.parentNode.classList.add('is-filled');
1246                });
1247
1248                input.addEventListener('blur', function() {
1249                    var input = this;
1250                    setTimeout(function() {
1251                        if (input.value === '') input.parentNode.classList.remove('is-filled');
1252                    }, 100);
1253                });
1254
1255                window.addEventListener('load', function() {
1256                    const parent = input.closest('.form-input-field');
1257
1258                    if (parent) {
1259                        parent.classList.add('is-loaded');
1260                        if (input.value) {
1261                            parent.classList.add('is-filled');
1262                        }
1263                    }
1264                });
1265
1266                // show password
1267                const $passwordInput = element.querySelector('.form-input-password .input'),
1268                    $passwordShower = element.querySelector('.form-input-password .action');
1269
1270                function showPassword() {
1271                    if ($passwordInput.type === 'password') {
1272                        $passwordInput.type = 'text';
1273                    } else {
1274                        $passwordInput.type = 'password';
1275                    }
1276                }
1277
1278                if ($passwordShower) {
1279
1280                    $passwordShower.addEventListener('click', function(event) {
1281                        showPassword();
1282                        event.preventDefault();
1283                    });
1284                }
1285
1286                // pikaday support
1287                const $inputDate = element.querySelector('.form-input-date');
1288
1289                if ($inputDate) {
1290                    const $fieldInput = $inputDate.querySelector('.input');
1291                    let $dateFormat = $fieldInput.dataset.dateFormat ? $fieldInput.dataset.dateFormat : "DD[-]MM[-]YYYY";
1292                    let $minDate = $fieldInput.dataset.minDate;
1293                    if( $minDate ){
1294                        new Pikaday({
1295                            field: $fieldInput,
1296                            format: 'DD[-]MM[-]YYYY',
1297                            minDate: new Date($minDate)
1298                        });
1299                    } else {
1300                        new Pikaday({
1301                            field: $fieldInput,
1302                            format: 'DD[-]MM[-]YYYY'
1303                        });
1304                    }
1305
1306                }
1307            });
1308
1309        });
1310    }();
1311
1312    var cartSummary = body.find('.cart-detail');
1313    body.on('click', '.toggle-discount-point', function () {
1314        let $this       = $(this);
1315
1316        cartSummary.addClass('is-loading');
1317
1318        $.ajax({
1319            url: $this.data('url'),
1320            type: "POST",
1321            data: {_token: config._token},
1322        })
1323            .done(function (resp) {
1324                cartSummary.html(resp.data.summary);
1325                cartSummary.removeClass('is-loading');
1326            })
1327            .fail(function (jqXHR, ajaxOptions, thrownError) {
1328                cartSummary.removeClass('is-loading');
1329            });
1330    })
1331
1332    body.on('click', '.toggle-apply-coupon', function () {
1333        let $this       = $(this);
1334
1335        let voucherNo = body.find('#coupon-input').val();
1336
1337        cartSummary.addClass('is-loading');
1338
1339        $.ajax({
1340            url: $this.data('url'),
1341            type: "POST",
1342            data: { no: voucherNo, _token: config._token},
1343        })
1344            .done(function (resp) {
1345                cartSummary.html(resp.data.summary);
1346                cartSummary.removeClass('is-loading');
1347            })
1348            .fail(function (jqXHR, ajaxOptions, thrownError) {
1349                cartSummary.removeClass('is-loading');
1350            });
1351    })
1352
1353    body.on('click', '.cart-coupon-remove', function () {
1354        let $this       = $(this);
1355
1356        cartSummary.addClass('is-loading');
1357
1358        $.ajax({
1359            url: $this.data('url'),
1360            type: "DELETE",
1361            data: { _token: config._token},
1362        })
1363            .done(function (resp) {
1364                cartSummary.html(resp.data.summary);
1365                cartSummary.removeClass('is-loading');
1366            })
1367            .fail(function (jqXHR, ajaxOptions, thrownError) {
1368                cartSummary.removeClass('is-loading');
1369            });
1370    })
1371
1372    var cartContent = $('.page-cart-content');
1373    var cartItems = $('.cart-product-items');
1374    var cartCrossSale = $('.js-slide-single');
1375    body.on('change', '.cart-update-item', function () {
1376        let $this       = $(this);
1377        let cartKeyEl   = $this.closest('.cart-product-item');
1378        let buttonCheckout   = body.find('#cart-to-checkout');
1379        let maxQty      = $this.data('max');
1380        let qty         = $this.val();
1381        cartContent.addClass('is-loading');
1382
1383        if (qty > maxQty) {
1384            $this.val(maxQty);
1385            qty = maxQty;
1386        }
1387
1388        $.ajax({
1389            url: $this.data('url'),
1390            type: "POST",
1391            data: { cartKey: cartKeyEl.data('cart-key'), qty: qty, _token: config._token},
1392        })
1393            .done(function (resp) {
1394
1395                buttonCheckout.attr('data-model', resp.data.itemsPro);
1396
1397                if (resp.data.reload) {
1398                    location.reload();
1399                }
1400                cartSummary.html(resp.data.summary);
1401                cartItems.html(resp.data.items);
1402                cartContent.removeClass('is-loading');
1403
1404                body.find('.product-qty .remove').removeClass('is-hidden');
1405                cartItems.find(".js-popup-link").magnificPopup({
1406                    type: "inline",
1407                    mainClass: "mfp-animation",
1408                    removalDelay: 200
1409                });
1410            })
1411            .fail(function (jqXHR, ajaxOptions, thrownError) {
1412                cartContent.removeClass('is-loading');
1413
1414                body.find('.product-qty .remove').removeClass('is-hidden');
1415            });
1416    });
1417
1418    body.on('change', '.cart-add-item', function(){
1419        let url = '';
1420        let data = {};
1421        if ($(this).prop('checked') == true) {
1422            url = $(this).data('url-add');
1423        } else {
1424            url = $(this).data('url-remove');
1425        }
1426
1427        data['_token'] = config._token;
1428
1429        cartContent.addClass('is-loading');
1430
1431        $.ajax({
1432            type: 'POST',
1433            url: url,
1434            data: data
1435        })
1436            .done(function(resp){
1437                if (resp.data.is_cross_sale) {
1438                    location.reload(); // slide cross sale must be reload.
1439                }
1440                cartSummary.html(resp.data.summary);
1441                cartItems.html(resp.data.items);
1442                cartContent.removeClass('is-loading');
1443            })
1444            .fail(function (jqXHR, ajaxOptions, thrownError) {
1445                cartContent.removeClass('is-loading');
1446            });
1447    })
1448
1449    body.on('click', '.product-qty-input .plus, .product-qty-input .minus', function () {
1450        let parent = $(this).closest('.product-qty-input');
1451        parent.find('.cart-update-item').change();
1452    })
1453
1454    body.on('click', '.cart-remove-item', function () {
1455
1456        if (confirm("Are you sure?")) {
1457
1458            let $this = $(this);
1459            let cartKeyEl = $this.closest('.cart-product-item');
1460            if( $this.hasClass('cart-remove-item-popup') ){
1461                cartKeyEl = body.find('.cart-product-item-'+$this.data('md5key'))
1462                body.find('.compatible-content').addClass('is-loading');
1463            }
1464            body.find('.js-popup-close').click();
1465            let buttonCheckout = body.find('#cart-to-checkout');
1466            cartContent.addClass('is-loading');
1467            body.addClass('is-loading');
1468            
1469            let model = $this.data('model');
1470            dataLayer.push({
1471                'event': 'remove_from_cart',
1472                'ecommerce': {
1473                    'items': [model]
1474                }
1475            });
1476
1477            $.ajax({
1478                url: $this.data('url'),
1479                type: "DELETE",
1480                data: {cartKey: cartKeyEl.data('cart-key'), _token: config._token},
1481            })
1482                .done(function (resp) {
1483
1484                    buttonCheckout.attr('data-model', resp.data.itemsPro);
1485
1486                    if (resp.data.empty) {
1487                        cartContent.html('<div class="cart-product"><p>Empty</p> </div>');
1488                    } else {
1489                        location.reload(); // slide cross sale must be reload.
1490                        cartSummary.html(resp.data.summary);
1491                        cartItems.html(resp.data.items);
1492                    }
1493                    cartContent.removeClass('is-loading');
1494                    if( $this.hasClass('cart-remove-item-popup') ){
1495                        body.find('.compatible-content').removeClass('is-loading');
1496                    }
1497
1498                    body.removeClass('is-loading');
1499                })
1500                .fail(function (jqXHR, ajaxOptions, thrownError) {
1501                    cartContent.removeClass('is-loading');
1502                    if( $this.hasClass('cart-remove-item-popup') ){
1503                        body.find('.compatible-content').removeClass('is-loading');
1504                    }
1505
1506                    body.removeClass('is-loading');
1507                });
1508        }
1509
1510        return false;
1511    });
1512
1513    body.on('click', '.cart-insurance', function () {
1514        let $this       = $(this);
1515        let cartKeyEl   = $this.closest('.item');
1516        checkoutSummaryWrapper.addClass('is-loading');
1517
1518        $.ajax({
1519            url: $this.data('url'),
1520            type: 'POST',
1521            data: { cartKey: cartKeyEl.data('cart-key'), is_checked:$this.is(':checked') ? 1 : 0, _token: config._token},
1522        })
1523            .done(function (resp) {
1524                checkoutSummary.html(resp.data.summary);
1525                checkoutSummaryProduct.html(resp.data.items);
1526                checkoutSummaryWrapper.removeClass('is-loading');
1527            })
1528            .fail(function (jqXHR, ajaxOptions, thrownError) {
1529                checkoutSummaryWrapper.removeClass('is-loading');
1530            });
1531    });
1532    body.on('click', '.cart-insurance-all', function () {
1533        let $this       = $(this);
1534        checkoutSummaryWrapper.addClass('is-loading');
1535
1536        $.ajax({
1537            url: $this.data('url'),
1538            type: 'POST',
1539            data: { is_checked:$this.is(':checked') ? 1 : 0, _token: config._token},
1540        })
1541            .done(function (resp) {
1542                checkoutSummary.html(resp.data.summary);
1543                checkoutSummaryProduct.html(resp.data.items);
1544                checkoutSummaryWrapper.removeClass('is-loading');
1545            })
1546            .fail(function (jqXHR, ajaxOptions, thrownError) {
1547                checkoutSummaryWrapper.removeClass('is-loading');
1548            });
1549    });
1550
1551    body.on('click', '.cart-packing-kayu', function () {
1552        let $this       = $(this);
1553        let cartKeyEl   = $this.closest('.item');
1554        checkoutSummaryWrapper.addClass('is-loading');
1555
1556        $.ajax({
1557            url: $this.data('url'),
1558            type: 'POST',
1559            data: { cartKey: cartKeyEl.data('cart-key'), is_checked:$this.is(':checked') ? 1 : 0, _token: config._token},
1560        })
1561            .done(function (resp) {
1562                checkoutSummary.html(resp.data.summary);
1563                checkoutSummaryProduct.html(resp.data.items);
1564                checkoutSummaryWrapper.removeClass('is-loading');
1565            })
1566            .fail(function (jqXHR, ajaxOptions, thrownError) {
1567                checkoutSummaryWrapper.removeClass('is-loading');
1568            });
1569    });
1570
1571    body.on('click', '.checkout-coupon-remove', function () {
1572        let $this       = $(this);
1573
1574        checkoutSummary.addClass('is-loading');
1575
1576        $.ajax({
1577            url: $this.data('url'),
1578            type: "DELETE",
1579            data: { _token: config._token},
1580        })
1581            .done(function (resp) {
1582                checkoutSummary.html(resp.data.summary);
1583                checkoutSummary.removeClass('is-loading');
1584            })
1585            .fail(function (jqXHR, ajaxOptions, thrownError) {
1586                checkoutSummary.removeClass('is-loading');
1587            });
1588    })
1589
1590    var lmClick = 2;
1591    let featured = $('.item-fc');
1592    body.on('click', '.load-more', function(){
1593        let load = $(this);
1594        let append = load.data('append');
1595        let url = load.data('url');
1596        let next = load.data('next-page');
1597        let count = load.data('count');
1598        let totalPage = load.data('total');
1599        let flashSale = load.data('flash-sale');
1600
1601        $(append).addClass('is-loading');
1602
1603        console.log(lmClick)
1604
1605        $.ajax({
1606            type: 'GET',
1607            url: url,
1608            data: {
1609                page: next,
1610                count: count,
1611                flash_sale: flashSale,
1612                _token: config._token
1613            },
1614        })
1615            .done(function (data) {
1616                $(append).append(data.html);
1617                load.data('next-page', data.next);
1618                load.data('count', data.count);
1619                $('#count').text(data.count + featured.length );
1620
1621                if (lmClick == totalPage) {
1622                    load.remove();
1623                }
1624
1625                $(append).removeClass('is-loading');
1626
1627                $(append).find('.js-popup-link').magnificPopup({
1628                    type: 'inline',
1629                    mainClass: 'mfp-animation',
1630                    removalDelay: 200
1631                });
1632
1633                lmClick++;
1634
1635                window.LL2 = new LazyLoad();
1636            })
1637            .fail(function (jqXHR, ajaxOptions, thrownError) {
1638                $(append).removeClass('is-loading');
1639            });
1640    });
1641
1642    body.on('change', '.js-simulation', function() {
1643        var data = {};
1644        var append = $('.shipping-options');
1645        $('.js-zone select').each(function(){
1646            data[$(this).attr('name')] = $(this).val();
1647        });
1648        data['_token'] = config._token;
1649
1650        if (data.district) {
1651
1652            let proVar = $('#sim-pro-var-id');
1653            let proVarId = proVar.length > 0 ? proVar.val() : 0;
1654
1655            append.addClass('is-loading');
1656
1657            $.ajax({
1658                type: 'GET',
1659                url: append.data('shipping-url'),
1660                data: data,
1661            })
1662                .done(function (resp) {
1663                    append.html(resp.data.shipping);
1664                    append.removeClass('is-loading');
1665
1666                    $('.js-shipping-select').on('click', '.item input[type="radio"]', function () {
1667                        append.addClass('is-loading');
1668                        $.ajax({
1669                            type: 'GET',
1670                            url: $(this).data('url'),
1671                            data: {
1672                                shipping_price: $(this).data('shipping-price'),
1673                                pro_var_id: proVarId,
1674                                _token: config._token
1675                            },
1676                        })
1677                            .done(function(resp){
1678                                $('.simulation-shipping-subtotal').text(resp.data.subtotal);
1679                                $('.simulation-shipping-price').text(resp.data.shipping_price);
1680                                $('.simulation-shipping-total').text(resp.data.total);
1681
1682                                append.removeClass('is-loading');
1683                            })
1684                            .fail(function (jqXHR, ajaxOptions, thrownError) {
1685                                append.removeClass('is-loading');
1686                            });
1687                    });
1688
1689                })
1690                .fail(function (jqXHR, ajaxOptions, thrownError) {
1691                    append.removeClass('is-loading');
1692                    append.html('<p>Maaf, terjadi kesalahan</p>');
1693                });
1694        }
1695    });
1696
1697    body.on('change', '.change-variant', function(){
1698        var variant = [];
1699        var source = $('.troli-varian-page');
1700        var sourceInfo = body.find('.variant-popup-info');
1701        var variantFormPopup = $('.troli-varian form');
1702        var attrDisable = $('#variant-stok-min, #variant-stok-max, #variant-stok, #variant-submit');
1703        var inputQty = $('#variant-stok');
1704        var availableAttrCombinationEl = $('#available-attr-combination');
1705        var availableAttrCombination = availableAttrCombinationEl.length > 0 ? availableAttrCombinationEl.data('list') : null;
1706
1707        if( $(this).hasClass('cr-non-color') ){
1708            $('.troli-varian-color').removeClass('is-disabled');
1709        }
1710        //$('#reset-attribute-var').removeClass('is-hidden');
1711        /*$.each( $('.change-variant:checked'),function () {
1712            variant.push( { attr: $(this).data('attr'), opt: $(this).val() } );
1713        });*/
1714        $.each( $('.change-variant-parent'), function () {
1715            let c = $(this).find('.change-variant:checked');
1716            if( c.length ){
1717                variant.push( { attr: c.data('attr'), opt: c.val() } );
1718            } else {
1719                c = $(this).find('.change-variant:first');
1720                variant.push( { attr: c.data('attr'), opt: null } );
1721            }
1722        });
1723
1724        $('#variant-stok').val(1);
1725        source.addClass('is-loading');
1726        variantFormPopup.attr('disabled', 'disabled');
1727        variantFormPopup.addClass('is-disabled')
1728
1729        let chosenAttribute = $(this).data('attr') +'-'+ $(this).val();
1730        let chosenAttributeId = $(this).data('attr');
1731        //let chosenAttributeOptId = $(this).val();
1732        
1733        $.ajax({
1734            type: 'GET',
1735            url: source.data('url'),
1736            data: {
1737                variant: variant,
1738                product: source.data('product'),
1739                _token: config._token
1740            }
1741        })
1742            .done(function(data){
1743
1744                if (availableAttrCombination && Object.keys(availableAttrCombination).length > 1) {
1745                    body.find('.item-label-attr').each(function () {
1746                        let $option = $(this);
1747                        if( availableAttrCombination[ chosenAttribute ][ $option.data('attr-id')+"-"+$option.data('id') ] ){
1748                            $option.removeClass('is-disabled');
1749                        } else {
1750                            if( $option.data('attr-id') != chosenAttributeId ){
1751                                $option.addClass('is-disabled');
1752                            }
1753                        }
1754                    });
1755                }
1756
1757                source.html(data.html);
1758                sourceInfo.html(data.info)
1759                let maxQty = body.find('.stock-available-var').data('stock-qty');
1760                maxQty = maxQty ? maxQty : 999;
1761
1762                if (data.combination && data.available) {
1763                    attrDisable.removeAttr('disabled');
1764                    attrDisable.removeClass('is-disabled');
1765
1766                } else {
1767                    attrDisable.attr('disabled', 'disabled');
1768                    attrDisable.addClass('is-disabled');;
1769                }
1770
1771                variantFormPopup.removeAttr('disabled');
1772                variantFormPopup.removeClass('is-disabled');
1773
1774                inputQty.attr('max', maxQty);
1775                source.removeClass('is-loading');
1776            })
1777            .fail(function (jqXHR, ajaxOptions, thrownError) {
1778                source.removeClass('is-loading');
1779                attrDisable.removeAttr('disabled');
1780                attrDisable.removeClass('is-disabled');
1781                variantFormPopup.removeAttr('disabled');
1782                variantFormPopup.removeClass('is-disabled');
1783            });
1784    });
1785
1786    function addToCartinitialTrigger(){
1787        let addToCartInitial = $('.popup-variant');
1788        if( addToCartInitial.length ){
1789            $.each( $('.change-variant-parent'), function () {
1790                let c = $(this).find('.change-variant:checked');
1791                if( c.length ){
1792                    c.change();
1793                }
1794            });
1795        }
1796    }
1797
1798    body.on('click', '#reset-attribute-var', function(){
1799        body.find('.item-label-attr').removeClass('is-disabled');
1800        body.find('.change-variant:checked').prop('checked', false);
1801
1802        $('.initial-disabled').addClass('is-disabled')
1803        
1804        $.each( $('.change-variant-parent'), function () {
1805            let children = $(this).find('.item-label-attr').length
1806            if( children == 1 )
1807                $(this).find('.change-variant:first').prop('checked', true).change();
1808        });
1809    });
1810    
1811
1812    body.on('change', '.js-installment', function(){
1813
1814        let data = {};
1815        let $this = $(this);
1816        let type = $this.data('type');
1817
1818        let dpInput = $('.installment-dp-'+type);
1819        let tenorInput = $('.installment-tenor-'+type)
1820
1821        if( $this.hasClass('installment-provider') ) {
1822            dpInput.attr('max-dp', 0);
1823            dpInput.attr('min', 0);
1824            dpInput.val(0);
1825        }
1826
1827        let maxDp = parseInt(dpInput.data('max-dp'));
1828        let dp = parseInt(dpInput.val());
1829        let minDp = parseInt(dpInput.attr('min'));
1830
1831        if (dp > maxDp) {
1832            alert("Maksimal DP "+maxDp);
1833            dpInput.val(maxDp);
1834            dp = maxDp;
1835        }
1836
1837        console.table([dp, minDp]);
1838        if (dp < minDp) {
1839            alert("Minimal DP "+minDp);
1840            dpInput.val(minDp);
1841            dp = minDp;
1842        }
1843
1844        data['_token'] = config._token;
1845        data['ip_id'] = $('.installment-service-'+type).find(':selected').val();
1846        data['dp'] = dp;
1847
1848        $('#tab-'+type).addClass('is-loading');
1849        $('.installment-price-'+type).text('Pilih lama cicilan');
1850
1851        $.ajax({
1852            type: 'GET',
1853            url: $this.data('url'),
1854            data: data
1855        })
1856            .done(function(resp){
1857                if( !$this.hasClass('installment-dp') ){
1858                    dpInput.val(resp.data.min_dp);
1859                    dpInput.attr('min', resp.data.min_dp);
1860                    $this.closest('.selecion-card').find('.min-dp-span').text(resp.data.min_dp);
1861                }
1862
1863                tenorInput.html(resp.data.installment);
1864                tenorInput.change(function(){
1865                    $('.installment-price-'+type).text($(this).val());
1866                });
1867                $('#tab-'+type).removeClass('is-loading');
1868            })
1869            .fail(function (jqXHR, ajaxOptions, thrownError) {
1870                $('#tab-'+type).removeClass('is-loading');
1871            });
1872    });
1873
1874    let insPro = $('.installment-provider');
1875    if( insPro.length > 0 ) {
1876        //$('.installment-provider').change();
1877
1878    }
1879
1880    body.on('change', '.js-add-cross-sale', function(){
1881        let html = '';
1882        let name = $(this).attr('name');
1883
1884        $('.js-add-cross-sale:checkbox:checked').each(function(){
1885            html += '<input type="hidden" name='+'"'+name+'"'+' value='+'"'+$(this).val()+'"'+'>';
1886        });
1887
1888        $('.popup-cross-sale-data').html(html);
1889    });
1890
1891    body.on('change keypress keydown', '.checkout-guest-email input[type=email]', function(event){
1892        let data = {};
1893        let append = $(this).data('class-append');
1894        data['_token'] = config._token;
1895        data['email'] = $(this).val();
1896
1897        if (event.which == 9) {
1898            event.preventDefault();
1899        }
1900
1901        if (data['email'] && (event.which == '13' || event.which == undefined)) {
1902            event.preventDefault();
1903
1904            $('.checkout-guest-email').addClass('is-loading');
1905
1906            $.ajax({
1907                type: 'GET',
1908                url: $(this).data('url'),
1909                data: data
1910            })
1911                .done(function(resp){
1912                    $('.checkout-guest-email').removeClass('is-loading');
1913                    $('.checkout-guest-address .'+append).html(resp.data.message);
1914                    $('.checkout-guest-address').find('.checkout-guest').each(function(){
1915                        if (!resp.data.registered) {
1916                            $(this).removeClass('is-disabled');
1917                        } else {
1918                            $(this).addClass('is-disabled');
1919                        }
1920                    });
1921
1922                    $(".js-popup-link").magnificPopup({
1923                        type: "inline",
1924                        mainClass: "mfp-animation",
1925                        removalDelay: 200
1926                    });
1927                })
1928                .fail(function (jqXHR, ajaxOptions, thrownError) {
1929                    $('.checkout-guest-email').removeClass('is-loading');
1930                });
1931        }
1932    });
1933    function loadDatePicker() {
1934        let datePicker = body.find(".js-datepicker-input");
1935        if (datePicker.length > 0) {
1936            datePicker.each(function (index, value) {
1937                let currItem = datePicker[index];
1938                let dateFormat = currItem.getAttribute("data-format") || "YYYY-MM-DD";
1939                let minDate = currItem.getAttribute("data-min");
1940                let picker = new Pikaday({
1941                    field: currItem,
1942                    minDate: new Date(minDate * 1000),
1943                    toString(date, format) {
1944                        // using moment
1945                        return moment(date).format(dateFormat);
1946                    }
1947                });
1948            });
1949        }
1950
1951        let timePicker = body.find(".js-timepicker-input");
1952        if (timePicker.length > 0) {
1953            if( timePicker.data('min') && timePicker.data('max') ){
1954                //minTime: '10:00am',
1955                //maxTime: '6:00pm',
1956                timePicker.timepicker({
1957                    timeFormat: "HH:mm",
1958                    minTime: timePicker.data('min'),
1959                    maxTime: timePicker.data('max'),
1960                    dropdown: true
1961                });
1962            } else {
1963                timePicker.timepicker({
1964                    timeFormat: "HH:mm",
1965                    dropdown: true
1966                });
1967            }
1968        }
1969    }
1970    loadDatePicker();
1971
1972    var isProductSingle = $('#single-product-content');
1973    if( isProductSingle.length > 0 ) {
1974        $.ajax({
1975            method: "get",
1976            url: isProductSingle.data('url-count-view'),
1977            data: {
1978                slug: isProductSingle.data('slug'),
1979                _token: config._token
1980            }
1981        })
1982            .done(function (resp) {
1983            })
1984            .fail(function (data) {
1985            });
1986    }
1987
1988    $('.js-copy-toggle').click(function(e) {
1989        e.preventDefault();
1990
1991        var $url = $(this).closest('.referral-copy').find('.url');
1992        var elem = document.createElement("textarea");
1993        document.body.appendChild(elem);
1994        elem.value = $url.data('url');
1995        elem.select();
1996        document.execCommand("copy");
1997        document.body.removeChild(elem);
1998
1999        $(this).text("Copied").addClass('copied');
2000    });
2001
2002    $('#search-product').autocomplete({
2003        serviceUrl: $('#search-product').data('url'),
2004        //lookup: countries,
2005        dataType: 'json',
2006        appendTo: '#suggestions-container',
2007        minChars: 3,
2008        transformResult: function(response) {
2009            return {
2010                suggestions: $.map(response, function(dataItem) {
2011                    return { value: dataItem.value, data: dataItem.data, link: dataItem.link };
2012                })
2013            };
2014        },
2015        onSelect: function (suggestion) {
2016            window.location.href = suggestion.link;
2017            // $('#search-form').submit();
2018            //alert('You selected: ' + suggestion.value + ', ' + suggestion.data);
2019        }
2020    });
2021
2022    $('#search-product-mobile').autocomplete({
2023        serviceUrl: $('#search-product-mobile').data('url'),
2024        //lookup: countries,
2025        dataType: 'json',
2026        appendTo: '#suggestions-container-mobile',
2027        minChars: 3,
2028        transformResult: function(response) {
2029            //console.log(response);
2030            return {
2031                suggestions: $.map(response, function(dataItem) {
2032                    return { value: dataItem.value, data: dataItem.data, link: dataItem.link };
2033                })
2034            };
2035        },
2036        onSelect: function (suggestion) {
2037            window.location.href = suggestion.link;
2038            // $('#mobile-search-form').submit();
2039            //alert('You selected: ' + suggestion.value + ', ' + suggestion.data);
2040        }
2041    });
2042
2043    body.on('change', '.find-bicycle-stock-only', function () {
2044
2045        let filter = body.find('.find-bicycle-filter-outlet');
2046        if( $(this).is(':checked') ) {
2047            body.find('.product-display .item').addClass('is-hidden');
2048            if( filter.val() !== "" ){
2049                $('.product-display .item').each(function () {
2050                    if( $(this).data('in-stock') == 1 && $(this).data('outlet').indexOf(filter.val()) !== -1 ){
2051                        $(this).removeClass('is-hidden');
2052                    }
2053                })
2054                //body.find(".product-display .item[data-outlet*='" + $(this).val()  + "']").removeClass('is-hidden');
2055                //body.find(".product-display .item[data-in-stock='1']").removeClass('is-hidden');
2056            } else {
2057                body.find(".product-display .item[data-in-stock='1']").removeClass('is-hidden');
2058            }
2059        } else {
2060            if( filter.val() !== "" ) {
2061                $('.product-display .item').each(function () {
2062                    if ($(this).data('in-stock') == 1 && $(this).data('outlet').indexOf(filter.val()) !== -1) {
2063                        $(this).removeClass('is-hidden');
2064                    }
2065                })
2066            } else {
2067                body.find('.product-display .item').removeClass('is-hidden');
2068            }
2069        }
2070    });
2071
2072    body.on('change', '.find-bicycle-filter-outlet', function () {
2073        let stockOnly = body.find('.find-bicycle-stock-only');
2074
2075        let filterVal = $(this).val();
2076        if( filterVal !== "" ) {
2077            body.find('.product-display .item').addClass('is-hidden');
2078            if( stockOnly.is(':checked') ){
2079                $('.product-display .item').each(function () {
2080                    if( $(this).data('in-stock') == 1 && $(this).data('outlet').indexOf(filterVal) !== -1 ){
2081                        $(this).removeClass('is-hidden');
2082                    }
2083                })
2084                //body.find(".product-display .item[data-outlet*='" + $(this).val()  + "']").removeClass('is-hidden');
2085            } else {
2086                body.find(".product-display .item[data-outlet*='" + filterVal  + "']").removeClass('is-hidden');
2087            }
2088
2089        } else {
2090            if( stockOnly.is(':checked') ){
2091                $('.product-display .item').each(function () {
2092                    if( $(this).data('in-stock') == 1 && $(this).data('outlet').indexOf(filterVal) !== -1 ){
2093                        $(this).removeClass('is-hidden');
2094                    }
2095                })
2096            } else {
2097                body.find('.product-display .item').removeClass('is-hidden');
2098            }
2099
2100        }
2101    });
2102
2103    body.on('keyup', '.find-bicycle-submit', function (event){
2104        if (event.keyCode === 13) {
2105            // Cancel the default action, if needed
2106            event.preventDefault();
2107            body.find('.nav-next').click();
2108        }
2109    })
2110
2111    var promotions = $('.promotion-inner-content');
2112    if( promotions.length > 0 ){
2113        $.each(promotions, function (){
2114            var a = $(this).find("a");
2115            if( a ) {
2116                $.each(a, function () {
2117                    if ( $(this).text().includes("Belanja Sekarang") ) {
2118                        $(this).addClass("link button button-primary promotion-to-detail");
2119                    }
2120                });
2121            }
2122
2123        })
2124    }
2125
2126    addToCartinitialTrigger();
2127    
2128    /*$('.popup-variant').on('click', function (){
2129        $.each( $('.change-variant-parent'), function () {
2130            let c = $(this).find('.change-variant:first');
2131            if( c.length ){
2132                c.change();
2133            }
2134        });
2135    });*/
2136
2137    var counterCompare = $('.counter-compare-desktop');
2138    if( counterCompare.length > 0 ) {
2139        $.ajax({
2140            method: "get",
2141            url: counterCompare.data('url'),
2142            data: {
2143                _token: config._token
2144            }
2145        })
2146            .done(function (resp) {
2147                counterCompare.text(resp.data);
2148                $('.counter-compare-mobile').text(resp.data);
2149            })
2150            .fail(function (data) {
2151                //counterCompare.text(resp.data);
2152            });
2153    }
2154
2155    body.on('click', '.dev-js-popup-close', function(e) {
2156        e.preventDefault();
2157
2158        var magPopup = $.magnificPopup.instance;
2159        magPopup.close();
2160    });
2161
2162    body.on('click', '.select-coupon', function(e) {
2163        e.preventDefault();
2164
2165        var couponInput = body.find('#coupon-input');
2166        couponInput.val($(this).data('code')).focus();
2167    });
2168
2169    body.on('click', '#btn-create-member', function(e) {
2170        $(this).addClass('is-disabled');
2171    });
2172
2173    body.on('click', '.send-review', function(e) {
2174        e.preventDefault();
2175        let form = $(this).closest('form');
2176        let rate = form.find('input[name="pro_rev_rate"]:checked');
2177        let review = form.find('textarea[name="pro_rev_comment"]');
2178        let alertRate = form.find('.rate-err-msg');
2179        let alertReview = form.find('.review-err-msg');
2180        let error = 0;
2181
2182        alertRate.addClass('is-hidden');
2183        alertReview.addClass('is-hidden');
2184
2185        if( rate.length > 0 && rate.val() ){
2186            alertRate.addClass('is-hidden');
2187        } else {
2188            error += 1;
2189            alertRate.removeClass('is-hidden');
2190        }
2191
2192        if( review.length > 0 && review.val() && review.val().length >= 15 ){
2193            alertReview.addClass('is-hidden');
2194        } else {
2195            error += 1;
2196            alertReview.removeClass('is-hidden');
2197        }
2198
2199        if( error == 0 ){
2200            form.submit();
2201        }
2202
2203        return false;
2204    });
2205});

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.