PageSourceSearch

https://www.idemitsu-tm.jp/js/usr/menu_sb.js

js idemitsu-tm.jp collected 2026-10-07 15:43:24 UTC 23,496 bytes, 807 lines download raw bytes

1var ecblib = ecblib || {};
2ecblib.humburger_menu = ecblib.humburger_menu || {};
3
4(function() {
5    'use strict';
6
7    var _humburger_menu = ecblib.humburger_menu;
8
9
10    /************************ メニュー描画 ************************/
11
12    _humburger_menu.condition = 'type=json&charset=utf8';
13
14
15    /**
16     * 「カテゴリから探す」を開いた状態にする
17     */
18    _humburger_menu.OpenDefaultCategory = function(vm) {
19        vm = vm || _humburger_menu.categoryTreeVm;
20
21        if (!vm) {
22            return;
23        }
24
25        var rootKey = '$category$root';
26
27        /*
28         * Vue側の状態を開く
29         */
30        vm.tree[rootKey] = true;
31        vm.slide[rootKey] = true;
32
33        vm.$nextTick(function() {
34            var $container = jQuery(
35                '#search_categorytree_sb'
36            );
37
38            var $rootNavi = $container
39                .children(
40                    '.block-goods-list__navi'
41                )
42                .first();
43
44            var $rootItem = $rootNavi
45                .children('ul.list')
46                .first()
47                .children('li.list-item')
48                .first();
49
50            var $rootTitle = $rootItem
51                .children('.list-item__center')
52                .first();
53
54            var $rootPanel = $rootItem
55                .children(
56                    '.block-goods-list__navi-slideside'
57                )
58                .first();
59
60            /*
61             * SliderBackAllによる閉じるアニメーションを止め、
62             * 「カテゴリから探す」のパネルだけを表示する
63             */
64            $rootPanel
65                .stop(true, true)
66                .addClass('open')
67                .css('display', 'block');
68
69            /*
70             * タイトル側の開いた状態も反映
71             */
72            $rootTitle.addClass('minus');
73        });
74    };
75
76
77    /**
78     * ハンバーガーメニュー開閉時の初期化
79     */
80    _humburger_menu.initToggle = function() {
81        /*
82         * 元からある全メニューリセット処理
83         */
84        if (
85            ecblib.humburger_menu.vue &&
86            typeof ecblib.humburger_menu.vue.SliderBackAll ===
87                'function'
88        ) {
89            ecblib.humburger_menu.vue.SliderBackAll();
90        }
91
92        /*
93         * 全メニューを閉じた後、
94         * 「カテゴリから探す」だけを開き直す
95         */
96        setTimeout(function() {
97            _humburger_menu.OpenDefaultCategory();
98        }, 0);
99    };
100
101
102    /************************ 設定プロパティ ************************/
103
104    _humburger_menu.categoryNaviId =
105        'js-search-form-c';
106
107    _humburger_menu.genreNaviId =
108        'js-search-form-r';
109
110    _humburger_menu.shoproot =
111        ecblib.sys.wwwroot;
112
113    _humburger_menu.categoryUrl =
114        _humburger_menu.shoproot +
115        '/shop/category/categoryapi.aspx';
116
117    _humburger_menu.genreUrl =
118        _humburger_menu.shoproot +
119        '/shop/genre/genreapi.aspx';
120
121    _humburger_menu.GetCategory =
122        FetchCategory;
123
124    _humburger_menu.GetGenre =
125        FetchGenre;
126
127    _humburger_menu.brand =
128        document.body.getAttribute('data-brand');
129
130
131    /************************ 処理 ************************/
132
133    _humburger_menu.Init = function() {
134        _humburger_menu.categoryTreeTemplate =
135            document.getElementById(
136                'search_base_category'
137            );
138
139        _humburger_menu.genreTreeTemplate =
140            document.getElementById(
141                'search_base_genre'
142            );
143
144        _humburger_menu.SearchRender();
145    };
146
147
148    _humburger_menu.SearchRender = function() {
149
150        /*
151         * 元のスライド処理
152         */
153        var sliderMixin = {
154            methods: {
155                SliderForward: function(
156                    elementName,
157                    slide,
158                    tree,
159                    event
160                ) {
161                    var target = (
162                        jQuery(event.target).hasClass(
163                            'list-item--chevron'
164                        )
165                    )
166                        ? jQuery(event.target)
167                        : jQuery(event.target).parent('li');
168
169                    slide[elementName] =
170                        !slide[elementName];
171
172                    tree[elementName] = true;
173
174                    this.$nextTick(function() {
175                        jQuery(target)
176                            .children(
177                                '.block-goods-list__navi-slideside'
178                            )
179                            .slideToggle();
180                    });
181                }
182            }
183        };
184
185
186        /**************** カテゴリメニュー ****************/
187
188        _humburger_menu.categoryTreeVue =
189            Vue.createApp({
190                mixins: [
191                    sliderMixin
192                ],
193
194                data: function() {
195                    return {
196                        categories: [],
197
198                        /*
199                         * 「カテゴリから探す」を
200                         * 初期状態で開く
201                         */
202                        slide: {
203                            '$category$root': true
204                        },
205
206                        /*
207                         * ルートカテゴリを初期描画する
208                         */
209                        tree: {
210                            '$category$root': true
211                        }
212                    };
213                },
214
215                template:
216                    '#' +
217                    _humburger_menu.categoryNaviId,
218
219                mounted: function() {
220                    jQuery('#loading')
221                        .addClass('spinner');
222
223                    jQuery('#loading')
224                        .fadeIn('fast');
225
226                    var queryParams =
227                        _humburger_menu.condition +
228                        '&nest=true';
229
230                    if (_humburger_menu.brand) {
231                        queryParams +=
232                            '&brand=' +
233                            _humburger_menu.brand;
234                    }
235
236                    var $this = this;
237
238                    jQuery.when(
239                        _humburger_menu.GetCategory(
240                            queryParams
241                        )
242                    )
243                    .done(function(categoryList) {
244                        $this.categories =
245                            categoryList;
246
247                        /*
248                         * カテゴリ描画後に
249                         * 「カテゴリから探す」を開く
250                         */
251                        $this.$nextTick(function() {
252                            _humburger_menu
253                                .OpenDefaultCategory(
254                                    $this
255                                );
256                        });
257
258                        jQuery('#loading').fadeOut(
259                            'slow',
260                            function() {
261                                jQuery(this)
262                                    .removeClass(
263                                        'spinner'
264                                    );
265                            }
266                        );
267                    });
268                }
269            });
270
271
272        /*
273         * カテゴリ階層コンポーネント
274         */
275        _humburger_menu.categoryTreeVue.component(
276            'categorytree',
277            {
278                mixins: [
279                    sliderMixin
280                ],
281
282                props: [
283                    'parent',
284                    'slide',
285                    'tree',
286                    'categories',
287                    'level'
288                ],
289
290                data: function() {
291                    return {
292                        levelClass:
293                            'level' + this.level
294                    };
295                },
296
297                methods: {
298                    Redirect: function(category) {
299                        if (_humburger_menu.brand) {
300                            window.location.href =
301                                _humburger_menu.shoproot +
302                                '/shop/c/c' +
303                                category.category +
304                                '?brand=' +
305                                _humburger_menu.brand;
306                        } else {
307                            window.location.href =
308                                _humburger_menu.shoproot +
309                                '/shop/c/c' +
310                                category.category;
311                        }
312                    }
313                },
314
315                template:
316                    _humburger_menu
317                        .categoryTreeTemplate
318            }
319        );
320
321
322        /*
323         * mount()の戻り値を保存
324         */
325        if (
326            document.getElementById(
327                'search_categorytree_sb'
328            )
329        ) {
330            _humburger_menu.categoryTreeVm =
331                _humburger_menu
332                    .categoryTreeVue
333                    .mount(
334                        '#search_categorytree_sb'
335                    );
336        }
337
338
339        /**************** ジャンルメニュー ****************/
340
341        _humburger_menu.genreTreeVue =
342            Vue.createApp({
343                mixins: [
344                    sliderMixin
345                ],
346
347                data: function() {
348                    return {
349                        genres: [],
350                        slide: {},
351                        tree: {}
352                    };
353                },
354
355                template:
356                    '#' +
357                    _humburger_menu.genreNaviId,
358
359                mounted: function() {
360                    jQuery('#loading')
361                        .addClass('spinner');
362
363                    jQuery('#loading')
364                        .fadeIn('fast');
365
366                    var queryParams =
367                        _humburger_menu.condition +
368                        '&nest=true';
369
370                    if (_humburger_menu.brand) {
371                        queryParams +=
372                            '&brand=' +
373                            _humburger_menu.brand;
374                    }
375
376                    var $this = this;
377
378                    jQuery.when(
379                        _humburger_menu.GetGenre(
380                            queryParams
381                        )
382                    )
383                    .done(function(genreList) {
384                        $this.genres = genreList;
385
386                        jQuery('#loading').fadeOut(
387                            'slow',
388                            function() {
389                                jQuery(this)
390                                    .removeClass(
391                                        'spinner'
392                                    );
393                            }
394                        );
395                    });
396                }
397            });
398
399
400        /*
401         * ジャンル階層コンポーネント
402         */
403        _humburger_menu.genreTreeVue.component(
404            'genretree',
405            {
406                mixins: [
407                    sliderMixin
408                ],
409
410                props: [
411                    'parent',
412                    'slide',
413                    'tree',
414                    'genres',
415                    'level'
416                ],
417
418                data: function() {
419                    return {
420                        levelClass:
421                            'level' + this.level
422                    };
423                },
424
425                methods: {
426                    Redirect: function(genre) {
427                        if (_humburger_menu.brand) {
428                            window.location.href =
429                                _humburger_menu.shoproot +
430                                '/shop/r/r' +
431                                genre.genre +
432                                '?brand=' +
433                                _humburger_menu.brand;
434                        } else {
435                            window.location.href =
436                                _humburger_menu.shoproot +
437                                '/shop/r/r' +
438                                genre.genre;
439                        }
440                    }
441                },
442
443                template:
444                    _humburger_menu
445                        .genreTreeTemplate
446            }
447        );
448
449
450        /*
451         * ジャンル用要素が存在する場合のみマウント
452         */
453        if (
454            document.getElementById(
455                'search_genretree_sb'
456            )
457        ) {
458            _humburger_menu.genreTreeVm =
459                _humburger_menu
460                    .genreTreeVue
461                    .mount(
462                        '#search_genretree_sb'
463                    );
464        }
465    };
466
467
468    /************************ データ通信 ************************/
469
470    function FetchCategory(queryParams) {
471        var defer = jQuery.Deferred();
472
473        jQuery.ajax({
474            type: 'GET',
475            url:
476                _humburger_menu.categoryUrl +
477                '?' +
478                queryParams,
479            dataType: 'json'
480        }).then(
481            function(data) {
482                return defer.resolve(data);
483            },
484            function() {
485                return defer.reject([]);
486            }
487        );
488
489        return defer.promise();
490    }
491
492
493    function FetchGenre(queryParams) {
494        var defer = jQuery.Deferred();
495
496        jQuery.ajax({
497            type: 'GET',
498            url:
499                _humburger_menu.genreUrl +
500                '?' +
501                queryParams,
502            dataType: 'json'
503        }).then(
504            function(data) {
505                return defer.resolve(data);
506            },
507            function() {
508                return defer.reject([]);
509            }
510        );
511
512        return defer.promise();
513    }
514
515
516    document.addEventListener(
517        'DOMContentLoaded',
518        _humburger_menu.Init
519    );
520
521})();
522
523
524/************************ 特販店おすすめ商品のSwiper初期化 ************************/
525
526(function() {
527    'use strict';
528
529    function ApplySwiper(
530        target_selector,
531        wrapper_selector,
532        options
533    ) {
534        let target =
535            typeof target_selector === 'string'
536                ? document.querySelector(
537                    target_selector
538                )
539                : target_selector;
540
541        if (!target) {
542            return null;
543        }
544
545        target.classList.add('swiper');
546
547        let child = wrapper_selector
548            ? target.querySelector(
549                wrapper_selector
550            )
551            : target.children[0];
552
553        if (child) {
554            child.classList.add(
555                'swiper-wrapper'
556            );
557
558            Array.from(
559                child.children
560            ).forEach((grandchild) => {
561                grandchild.classList.add(
562                    'swiper-slide'
563                );
564            });
565
566            // ページネーション
567            if (options.pagination) {
568                let pagination =
569                    document.createElement('div');
570
571                pagination.classList.add(
572                    'swiper-pagination'
573                );
574
575                target.appendChild(
576                    pagination
577                );
578
579                options.pagination.el =
580                    '.swiper-pagination';
581            }
582
583            // ナビゲーション
584            if (options.navigation) {
585                let custom_target =
586                    options.navigation._custom_target ||
587                    target.parentElement ||
588                    target;
589
590                if (
591                    options.navigation._custom_target
592                ) {
593                    delete options.navigation
594                        ._custom_target;
595                }
596
597                let navigation_prev =
598                    document.createElement('div');
599
600                let navigation_next =
601                    document.createElement('div');
602
603                navigation_prev.classList.add(
604                    'swiper-button-prev'
605                );
606
607                navigation_next.classList.add(
608                    'swiper-button-next'
609                );
610
611                custom_target.appendChild(
612                    navigation_prev
613                );
614
615                custom_target.appendChild(
616                    navigation_next
617                );
618
619                options.navigation.nextEl =
620                    '.swiper-button-next';
621
622                options.navigation.prevEl =
623                    '.swiper-button-prev';
624            }
625
626            // スクロールバー
627            if (options.scrollbar) {
628                let scrollbar =
629                    document.createElement('div');
630
631                scrollbar.classList.add(
632                    'swiper-scrollbar'
633                );
634
635                target.appendChild(
636                    scrollbar
637                );
638
639                options.scrollbar.el =
640                    '.swiper-scrollbar';
641            }
642        }
643
644        return new Swiper(
645            target_selector,
646            options
647        );
648    }
649
650
651    setTimeout(() => {
652
653        // ランキング形式のSwiper初期化
654        let dealerRecommendBlock =
655            document.querySelector(
656                '#block_of_dealer_recommend'
657            );
658
659        if (dealerRecommendBlock) {
660            let rankingBlock =
661                dealerRecommendBlock.querySelector(
662                    '.block-ranking-r'
663                );
664
665            if (
666                rankingBlock &&
667                rankingBlock.querySelectorAll(
668                    '.block-ranking-r--items > li'
669                ).length > 2
670            ) {
671                ApplySwiper(
672                    rankingBlock,
673                    '.block-ranking-r--items',
674                    {
675                        loop: true,
676
677                        navigation: {
678                            _custom_target:
679                                rankingBlock
680                                    .parentElement
681                        },
682
683                        slidesPerView: 1,
684
685                        breakpoints: {
686                            769: {
687                                slidesPerView: 2
688                            },
689
690                            950: {
691                                slidesPerView: 3
692                            },
693
694                            1200: {
695                                slidesPerView: 4
696                            }
697                        }
698                    }
699                );
700            }
701        }
702
703
704        // サムネイル形式のSwiper初期化
705        // (レスポンシブビューのみ)
706        if (
707            ecblib.sys.isModeResponsiveView()
708        ) {
709            if (dealerRecommendBlock) {
710                let thumbnailBlock =
711                    dealerRecommendBlock
712                        .querySelector(
713                            '.block-thumbnail-t'
714                        );
715
716                if (
717                    thumbnailBlock &&
718                    thumbnailBlock
719                        .querySelectorAll(
720                            '.block-thumbnail-t--items ' +
721                            '.block-thumbnail-t--item'
722                        )
723                        .length > 4
724                ) {
725                    let swiper = null;
726
727                    const createSwiper =
728                        function() {
729                            swiper = ApplySwiper(
730                                thumbnailBlock,
731                                '.block-thumbnail-t--items',
732                                {
733                                    slidesPerView: 2,
734                                    loop: true,
735
736                                    navigation: {
737                                        _custom_target:
738                                            thumbnailBlock
739                                                .parentElement
740                                    },
741
742
743                                    breakpoints: {
744                                        950: {
745                                            slidesPerView: 3
746                                        },
747
748                                        1200: {
749                                            slidesPerView: 4
750                                        }
751                                    }
752                                }
753                            );
754                        };
755
756                    const removeSwiper =
757                        function() {
758                            // Swiper削除
759                            swiper?.destroy();
760
761                            // ナビゲーション削除
762                            thumbnailBlock
763                                .parentElement
764                                ?.querySelectorAll(
765                                    '.swiper-button-prev'
766                                )
767                                ?.forEach(
768                                    (btn) => btn.remove()
769                                );
770
771                            thumbnailBlock
772                                .parentElement
773                                ?.querySelectorAll(
774                                    '.swiper-button-next'
775                                )
776                                ?.forEach(
777                                    (btn) => btn.remove()
778                                );
779                        };
780
781                    const callback =
782                        function(mediaQueryList) {
783                            if (
784                                mediaQueryList.matches
785                            ) {
786                                createSwiper();
787                            } else {
788                                removeSwiper();
789                            }
790                        };
791
792                    ecblib.sys
793                        .addMatchMediaEventListener(
794                            callback
795                        );
796
797                    callback(
798                        ecblib.sys
799                            .getDefaultMatchMedia()
800                    );
801                }
802            }
803        }
804
805    }, 0);
806
807})();

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.