PageSourceSearch

https://www.h7o.cz/js/custom.1.js

js h7o.cz collected 2026-10-02 10:30:16 UTC 18,877 bytes, 586 lines download raw bytes

1$(document).ready(function () {
2
3    $.nette.ext({
4        init: function () {
5            header();
6            hamburgerMenu();
7            initFilters(true);
8
9            initCountPrice();
10            initChooseConfirm();
11            initSignsControls();
12            countPrice();
13            initToggles();
14
15            initTotalPriceBar();
16
17            initISICOverlay();
18            initModalPanel();
19            initPagination();
20            initImageSource();
21            initIFramesRatio();
22        },
23        complete: function (payload) {
24            header();
25            hamburgerMenu();
26            initFilters(false);
27
28            initCountPrice();
29            initChooseConfirm();
30            initSignsControls();
31            countPrice();
32            initToggles();
33
34            initSlideTo(payload);
35            initTotalPriceBar();
36
37            initISICOverlay();
38            initModalPanel();
39            initPagination();
40            initImageSource();
41            initIFramesRatio();
42        }
43    });
44
45    var giftsHidden = null;
46    var magazinesPage = 0;
47
48    function initToggles()
49    {
50        var $magazinesTable = $('.products-table.magazines');
51        var $nextMagazines = $('.next-magazines');
52        var $giftsTable = $('.products-table.gifts');
53        var $nextGifts = $('.next-gifts');
54
55        function firstStep() {
56            var magazinesCount = $magazinesTable.find('.product').length;
57            var $magazinesFirstPage = $magazinesTable.find('.first-page');
58            $magazinesFirstPage.removeClass('hidden');
59            $nextMagazines.find('.counter').text(magazinesCount - $magazinesFirstPage.length);
60        }
61        function secondStep() {
62            $magazinesTable.find('.product').removeClass('hidden');
63            $nextMagazines.remove();
64        }
65
66        /* po nacteni */
67
68        if (giftsHidden !== null) {
69            $giftsTable.toggleClass('hidden', giftsHidden);
70
71            if (!giftsHidden) {
72                $nextGifts.remove();
73            }
74        }
75
76        if (magazinesPage !== 0) {
77            $magazinesTable.removeClass('hidden');
78            if (magazinesPage === 1) { firstStep(); }
79            if (magazinesPage === 2) { secondStep(); }
80        }
81
82        /* po kliknuti */
83
84        $nextMagazines.unbind('click.next-magazines').bind('click.next-magazines', function (e) {
85            e.preventDefault();
86            $magazinesTable.removeClass('hidden');
87            if (magazinesPage === 0) { firstStep(); }
88            if (magazinesPage === 1) { secondStep(); }
89            magazinesPage++;
90        });
91
92        $nextGifts.unbind('click.next-gifts').bind('click.next-gifts', function (e) {
93            e.preventDefault();
94            $giftsTable.removeClass('hidden');
95            giftsHidden = false;
96            $(this).remove();
97        });
98    }
99
100
101    function initChooseConfirm()
102    {
103        $('.first-step').on('click', function () {
104            $('.choose-confirm').prop('checked', true);
105        })
106    }
107
108    function initSignsControls()
109    {
110        $('.plus, .minus').unbind('click.plus-minus').bind('click.plus-minus', function (e) {
111            e.preventDefault();
112            var $btn =  $(this);
113            var $input =  $btn.closest('.amount-wrapper').find('input');
114            var curValue = $input.val();
115            var newValue;
116            var minValue = Number($input.attr('min'));
117            var maxValue = Number($input.attr('max'));
118
119            if ($btn.hasClass('plus')) {
120                newValue = curValue < maxValue ? parseFloat(curValue) + 1 : maxValue;
121            }
122            if ($btn.hasClass('minus')) {
123                newValue = curValue > minValue ? parseFloat(curValue) - 1 : minValue;
124            }
125
126            $input.val(newValue).blur().trigger('input');
127        });
128    }
129
130    function initCountPrice()
131    {
132        $('.has-price').unbind('input.initCountPrice').bind('input.initCountPrice', function() {
133            countPrice();
134        });
135    }
136
137    // TODO dopilovat
138    function countPrice()
139    {
140        var sum = 0;
141        var hasPhysicalOrders = Nette.validators.AppFrontModuleComponentsCustomOrderValidator_hasPhysicalOrders();
142
143        $('.row-anchor').not('.summary-table-header').remove();
144
145        $('.has-price').each(function () {
146            var $input = $(this);
147            var inputType = $input.attr('type');
148            var price = $input.data('price');
149            var label = $input.data('short-label');
150            var amount = 0;
151
152            if (hasPhysicalOrders && $input.hasClass('electronic-only') || !hasPhysicalOrders && $input.hasClass('physical-only')) {
153                return true;
154            }
155            if (inputType === "radio" && $input.is(':checked')) {
156                amount = 1;
157                sum += price;
158            }
159            if (inputType === "number") {
160                var value = Math.max(Number($input.val()), 0);
161                amount = value;
162                sum += value*price;
163                setSelected($input);
164            }
165
166            if (amount * price) {
167                $('.row-anchor').last().after(
168                    '<tr class="row-anchor"><td><span class="amount">' + amount + 'x</span> ' + label + '</td><td>' + amount + '</td><td>' + amount*price + ' Kč</td></tr>'
169                )
170            }
171        });
172
173        $('.total-price').find('.sum').text(sum);
174        $('.summary-table-total').find('.sum').text(sum);
175        togglePrintInputs(hasPhysicalOrders);
176    }
177
178    function setSelected($input)
179    {
180        var $product = $input.closest('.product');
181        var $inputs = $product.find('input');
182        var filled = 0;
183
184        $inputs.each(function() {
185            var value = Number($(this).val());
186            filled += value;
187            $(this).closest('.counter-wrapper').toggleClass('filled', !!value);
188        });
189
190        $product.toggleClass('selected', !!filled);
191    }
192
193    function togglePrintInputs(hasPhysicalOrders)
194    {
195        $("#postage-wrapper").toggle(!!hasPhysicalOrders);
196        $("#contact-next-button1").toggle(!!hasPhysicalOrders);
197        $("#contact-next-button2").toggle(!hasPhysicalOrders);
198        $("#payment-methods1").toggle(!!hasPhysicalOrders);
199        $("#payment-methods2").toggle(!hasPhysicalOrders);
200    }
201
202    function initTotalPriceBar()
203    {
204        var $stepWrapper = $('.step-wrapper.step5');
205        if ($stepWrapper.length !== 0 && !$stepWrapper.hasClass('hidden')) {
206            var $totalPriceBar = $('.total-price');
207
208            $(window).on('load scroll resize orientationchange ajaxComplete', function() {
209                var wrapperTop = $('.step-wrapper.step5')[0].offsetTop;
210                var barBottom = $(this).scrollTop() + $(this).height();
211                $totalPriceBar.toggleClass('hide', wrapperTop < barBottom);
212            });
213        }
214    }
215
216    function initSlideTo(payload)
217    {
218        if (typeof payload.step !== "undefined" && payload.step) {
219            let headerOffset = $('.header')[0].getBoundingClientRect().bottom;
220
221            $('html, body').animate({
222                scrollTop: $('.step' + payload.step).offset().top - headerOffset
223            }, 700);
224        }
225    }
226
227    function initModalPanel()
228    {
229        $(".more-info-modal").unbind("click.mim").bind("click.mim", function(e) {
230            e.stopPropagation();
231        });
232    }
233
234    function initISICOverlay()
235    {
236        var input1 = $('#frm-subscriptionForm-form-payment-isicNumber').get(0);
237        var input2 = $('#frm-subscriptionForm-form-payment-isicHolderName').get(0);
238
239        $(".isic-check").unbind('click.isic-check').bind("click.isic-check", function() {
240            var $this = $(this);
241            var $btnWrapper = $this.parent();
242            var $ajaxOverlay = getAjaxOverlay("");
243
244            if (isInputValid(input1) && isInputValid(input2)) {
245                $ajaxOverlay
246                    .appendTo($btnWrapper)
247                    .addClass("btn-spinner")
248                    .addClass("active");
249            }
250        });
251    }
252
253    function isInputValid(input)
254    {
255        return Nette.validateControl(input, null, true);
256    }
257
258    /**
259     * @return {boolean}
260     */
261    Nette.validators.AppFrontModuleComponentsCustomOrderValidator_hasOrders = function(elem, args, val) {
262        var sum = 0;
263        var $inputs = $('.products-table').find('input');
264
265        $inputs.each(function() {
266            sum += Number($(this).val());
267        });
268
269        return sum !== 0;
270    };
271
272    /**
273     * @return {boolean}
274     */
275    Nette.validators.AppFrontModuleComponentsCustomOrderValidator_hasPhysicalOrders = function(elem, args, val) {
276        var count = 0;
277        var $inputs = $('.product-type-print').add('.product-type-gift');
278
279        $inputs.each(function() {
280            if ($(this).val() > 0) {
281                count++;
282            }
283        });
284
285        return count !== 0;
286    };
287
288
289    function hamburgerMenu()
290    {
291        const $header = $('.header');
292        const $navigation = $("#navigation");
293
294        $(".hamburger-menu").off().on("click", function(event) {
295            event.preventDefault();
296
297            $header.toggleClass("hamburger-active");
298            $navigation.toggleClass("active");
299            $(this).toggleClass("active");
300            $('body').toggleClass("scroll-disabled");
301        });
302    }
303
304    // zmena menu panelu pri scrollovani
305    function header()
306    {
307        const $header = $('.header');
308
309        if ($header.length !== 0) {
310            const $headerContainer = $header.find('.header__container');
311            const paddingTop = parseInt($headerContainer.css('padding-top') );
312            const headerTop = $headerContainer[0].getBoundingClientRect().top + paddingTop + window.scrollY;
313
314            initHeader();
315            $(window).on('scroll resize orientationchange ajaxComplete', initHeader);
316
317            function initHeader(){
318                $header.toggleClass('active', $(window).scrollTop() > headerTop);
319            }
320        }
321    }
322
323
324    $('.slide-to').off().on('click', function(e) {
325        e.preventDefault();
326        let hash = this.hash;
327        let $ele = $(hash);
328
329        slideTo($ele);
330        window.location.hash = hash;
331    });
332
333    $.easing.jswing = $.easing.swing;
334    $.extend($.easing, {
335        def: 'easeOutQuad',
336        swing: function (x, t, b, c, d) {
337            //alert($.easing.default);
338            return $.easing[$.easing.def](x, t, b, c, d);
339        },
340        easeOutQuad: function (x, t, b, c, d) {
341            return -c *(t/=d)*(t-2) + b;
342        },
343        easeInOutCubic: function (x, t, b, c, d) {
344            if ((t/=d/2) < 1) return c/2*t*t*t + b;
345            return c/2*((t-=2)*t*t + 2) + b;
346        }
347    });
348
349    function slideTo($ele)
350    {
351        let $header = $('.header');
352        let headerOffset = $header[0].getBoundingClientRect().bottom;
353        let scrollTop = $ele.offset().top - headerOffset;
354
355        // rychlost animace zavisla na vzdalenosti mezi aktualni pozici okna a cilovym elementem
356        let height = Math.abs($(window).scrollTop() - scrollTop),
357            msPerHeight = 1, //How much ms per height
358            minRange = 700, //Minimal animation time
359            maxRange = 1500, //Maximal animation time
360            time = height * msPerHeight;
361
362        time = Math.min(time, maxRange);
363        time = Math.max(time, minRange);
364
365        if (height > 1) {
366            $('html, body').animate({
367                scrollTop: scrollTop
368            }, time, 'easeInOutCubic');
369        }
370    }
371
372    $('.shop-switcher').find('input').on('click', function() {
373        var val = $(this).val();
374
375        if(val == 1) {
376            $('.magazines-wrapper').show();
377            $('.gifts-wrapper').show();
378        }
379        if(val == 2) {
380            $('.magazines-wrapper').show();
381            $('.gifts-wrapper').hide();
382        }
383        if(val == 3) {
384            $('.magazines-wrapper').hide();
385            $('.gifts-wrapper').show();
386        }
387    });
388
389
390    function initFilters(isInit)
391    {
392        var $wrappers = $('.options-outer-wrapper');
393
394        if ($wrappers.length === 0) {
395            return;
396        }
397
398        $('body').unbind('click.filter-body').bind('click.filter-body', function(){
399            $('.options-outer-wrapper').removeClass('active');
400        });
401
402        $wrappers.each(function() {
403            var $wrapper = $(this);
404            var $form = $wrapper.closest('.filter-form');
405            var $submit = $form.find('.submit-btn');
406            var $checkedOptions = $('.checked-options.' + $(this).data('binded'));
407            var $label = $wrapper.find('.label');
408            var $inputs = $wrapper.find('input');
409
410            $wrapper.unbind('click.filter-wrapper').bind('click.filter-wrapper', function(e){
411                e.stopPropagation();
412            });
413
414            $label.unbind('click.filter-label').bind('click.filter-label', function(e) {
415                e.preventDefault();
416                $wrapper.toggleClass('active')
417            });
418
419            $inputs.each(function () {
420                var $input = $(this);
421
422                if (isInit) {
423                    initCheckedOptions($input, $checkedOptions);
424                }
425
426                $input.unbind('click.filter-input').bind('click.filter-input', function() {
427                    inputsClick($input, $checkedOptions);
428                    $submit.click();
429                    initOverlay($form.data('filter-id'));
430                });
431            });
432        });
433    }
434
435    function initCheckedOptions($input, $checkedOptions)
436    {
437        var isChecked = $input.is(':checked');
438        var $id = $input.attr('id');
439        var label = $input.data('label');
440
441        if (isChecked) {
442            var $newEle = $("<a href='#' class='filtered-value " + $id + "'>" + label + "</a>");
443            $checkedOptions.append($newEle);
444            $newEle.on('click', function(e) {
445                e.preventDefault();
446                $input.click();
447            });
448        }
449    }
450
451    function inputsClick($input, $checkedOptions)
452    {
453        var $id = $input.attr('id');
454        var label = $input.data('label');
455        var isChecked = $input.is(':checked');
456        var $ele = $('.' + $id);
457
458        if (isChecked && $ele.length === 0) {
459            var $newEle = $("<a href='#' class='filtered-value " + $id + "'>" + label + "</a>");
460            $checkedOptions.append($newEle);
461            $newEle.on('click', function(e) {
462                e.preventDefault();
463                $input.click();
464            });
465        } else {
466            $ele.remove();
467        }
468    }
469
470    function initOverlay($filterId)
471    {
472        var $wrapper = $('#filtered-content-' + $filterId);
473        var extName = 'removeAjaxOverlay' + $filterId;
474        var $ajaxOverlay = $wrapper.find('.ajax-overlay');
475        $ajaxOverlay =  $ajaxOverlay.length !== 0 ? $ajaxOverlay : getAjaxOverlay("Probíhá filtrování");
476
477        $ajaxOverlay.appendTo($wrapper).addClass("active");
478
479        // https://github.com/vojtech-dobes/nette.ajax.js/
480        $.nette.ext(extName, {
481            complete: function () {
482                $ajaxOverlay.removeClass("active");
483                $.nette.ext(extName, false);
484            }
485        });
486    }
487
488    function getAjaxOverlay(text)
489    {
490        var $ajaxOverlay;
491
492        $ajaxOverlay =
493            $("<div/>")
494                .addClass("ajax-overlay")
495                .append(
496                    $("<div/>")
497                        .addClass("center")
498                        .append(
499                            $("<div/>")
500                                .addClass("lds-rolling")
501                                .append($("<div/>"))
502                                .append(text ? $("<p/>").html(text) : "")
503                        )
504                );
505
506        return $ajaxOverlay;
507    }
508
509    var $banner = $('#banner');
510
511    if (window.localStorage.getItem('bannerClosed-18-01-21') === null) {
512        $banner.removeClass('hidden');
513        $banner.find('.cross').on('click', function(e) {
514            e.preventDefault();
515            $banner.fadeOut(300);
516            window.localStorage.setItem('bannerClosed-18-01-21', true);
517        });
518    }
519
520
521    initOpener();
522    function initOpener()
523    {
524        const $categories = $('.categories');
525
526        $('.categories__opener').unbind('click.coc').bind('click.coc', function (e) {
527            e.preventDefault();
528            $categories.toggleClass('opened');
529        });
530
531        $(document).unbind('click.cClose').bind('click.cClose', function(e) {
532            let $target = $(e.target);
533
534            if (!$target.closest('.categories').length && $categories.hasClass('opened')) {
535                $categories.removeClass('opened');
536            }
537        });
538    }
539
540
541    function initPagination()
542    {
543        $('.pagination__action').unbind('click.pa').bind('click.pa', function (e) {
544            slideTo($('.main-wrapper').children(":first"));
545        });
546    }
547
548
549    function initImageSource()
550    {
551        $('.image-wrapper').each(function () {
552            const $img = $(this).find('img');
553            const $imgInfo = $(this).find('.img-info');
554            const alt = $img.attr('alt');
555
556            if (alt && !$imgInfo.length) {
557                const $imgInfo = $('<div></div>').addClass('img-info');
558                const $imgInfoIco = $('<div>i</div>').addClass('img-info__ico');
559                const $imgInfoText = $('<div></div>').addClass('img-info__text').text('Foto: ' + alt);
560                $imgInfo.append($imgInfoIco);
561                $imgInfo.append($imgInfoText);
562                $(this).append($imgInfo);
563            }
564        });
565    }
566
567
568    function initIFramesRatio()
569    {
570        $('.iframe-wrapper').each(function () {
571            let $wrapper = $(this);
572            let $iframe = $wrapper.find('iframe');
573
574            if (/youtube\.com/i.test($iframe.attr('src'))) {
575                $wrapper
576                    .css({
577                        'padding-top': ($iframe.attr('height')/$iframe.attr('width') * 100) + '%'
578                    })
579                    .addClass('youtube');
580            }
581            if (/facebook\.com/i.test($iframe.attr('src'))) {
582                $iframe.addClass('facebook');
583            }
584        });
585    }
586});

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.