(function () { // ******************************************** // Various functions used for different modules // ******************************************** /* START 20161121 Increase decrease product amount */ $.fn.btnPlusMinus = function () { return this.each(function () { var wrapper = $(this); wrapper.find('.btn-number').click(function (e) { // console.log(wrapper, $(this)); e.preventDefault(); var fieldName = $(this).data('field'); var type = $(this).data('type'); var input = wrapper.find("input[name='" + fieldName + "']"); var currentVal = parseInt(input.val()); if (!isNaN(currentVal)) { if (type == 'minus') { if (currentVal > input.attr('min')) { input.val(currentVal - 1).change(); } if (parseInt(input.val()) == input.attr('min')) { $(this).attr('disabled', true); } } else if (type == 'plus') { if (currentVal < input.attr('max')) { input.val(currentVal + 1).change(); } if (parseInt(input.val()) == input.attr('max')) { $(this).attr('disabled', true); } } } else { input.val(0); } }); wrapper.find('.input-number').focusin(function () { $(this).data('oldValue', $(this).val()); }); wrapper.find('.input-number').change(function () { var minValue = parseInt($(this).attr('min')); var maxValue = parseInt($(this).attr('max')); var valueCurrent = parseInt($(this).val()); var name = $(this).attr('name'); if (valueCurrent >= minValue) { wrapper.find(".btn-number[data-type='minus'][data-field='" + name + "']").removeAttr('disabled'); } else { $(this).val($(this).data('oldValue')); } if (valueCurrent <= maxValue) { wrapper.find(".btn-number[data-type='plus'][data-field='" + name + "']").removeAttr('disabled'); } else { $(this).val($(this).data('oldValue')); } }); wrapper.find('.input-number').keydown(function (e) { // Allow: backspace, delete, tab, escape, enter and . if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 190]) !== -1 || // Allow: Ctrl+A (e.keyCode == 65 && e.ctrlKey === true) || // Allow: home, end, left, right (e.keyCode >= 35 && e.keyCode <= 39)) { // let it happen, don't do anything return; } // Ensure that it is a number and stop the keypress if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) { e.preventDefault(); } }); }); }; // init plugin $('.product-qty').btnPlusMinus(); /* END 20161121 Increase decrease product amount */ // Bootstrap AJAX modal $('#ajaxModal').on('shown.bs.modal', function (e) { var modalURL = $(e.relatedTarget).data('modal-url'); if (typeof modalURL !== undefined) { var modal = $(e.currentTarget); $.get(modalURL, function (data) { var loadedModal = $(data).find('.modal-dialog'); modal.html(loadedModal); // ajax event handler reinit if ($.fn.btnPlusMinus) { $('.product-qty').btnPlusMinus(); } $('.o-product_comparison').trigger('updateScope:toggle'); }); } }); // Internal Bootstrap modal link $('.modal').on('click', 'a[data-modal-link]', function (event) { event.preventDefault(); var modalURL = $(this).prop('href'); var modal = $('.modal'); if (typeof modalURL !== undefined && modal.length > 0) { $.get(modalURL, function (data) { var loadedModal = $(data).find('.modal-dialog'); modal.html(loadedModal); $('.product-qty').btnPlusMinus(); }); } }); // Show more button (currently only inside a modal!) $('.modal').on('click', '[data-show-more]', function (event) { var showMore = $(this).data('show-more'); var selector = $(this).data('show-more-sel'); var counter = $(this).find('.count-more'); var objs = $(selector + ':hidden:lt(' + showMore + ')'); if (objs.length > 0) { objs.show(); var next_objs = $(selector + ':hidden:lt(' + showMore + ')'); if (next_objs.length > 0) { counter.html('(' + next_objs.length + ')'); } else { counter.html(''); } } }); // Smooth scroll to target $(function () { $('.js-scroll-to[href*="#"]:not([href="#"])').click(function () { var offset = ($(this).data('offset') !== undefined ? $(this).data('offset') : 175); if (location.pathname.replace(/^\//, '') === this.pathname.replace(/^\//, '') && location.hostname === this.hostname) { var target = $(this.hash); target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); if (target.length) { $('html, body').animate({ scrollTop: target.offset().top - offset }, 800); return false; } } }); }); })(jQuery); /* START 20170327, dsp universal asnyc loading e.g.: async link */ (function ($) { $.fn.loadAsync = function (options) { // default settings var settings = $.extend({ dataLink: 'data-la-link', dataTarget: 'data-la-target' }, options); $(this).each(function (index, el) { var link = $(this).attr(settings.dataLink); var target = $(this).attr(settings.dataTarget); $(this).on('click', function (e) { e.preventDefault(); // console.log(link); // console.log(target); $.ajax({ url: link, type: 'GET', dataType: 'html', success: function (data) { $(target).html(data); // reinit afer async complete $('[data-la-link]').loadAsync({}); }, error: function (jqXHR, textStatus, errorThrown) { alert(jqXHR, textStatus, errorThrown); } }); }); }); }; }(jQuery)); /* END 20170327, dsp universal asnyc loading */ /* START: Native select widget for mobile devices */ if ($.fn.selectpicker) { if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) { $('.selectpicker').selectpicker('mobile'); } $('.selectpicker').on('show.bs.select', function(event) { var max_count = 4; var count = $(this).find('option').length; if (count > max_count) { count = max_count; } $(this).prev().height(count * 40); $(this).prev().find('> ul').height(count * 40); }); $('.selectpicker').on('hide.bs.select', function(event) { $(this).prev().height(0); $(this).prev().find('> ul').height(0); }); } /* END */ /* START: Dropdown with checkboxes */ $('.dropdown--form').on('click', '.dropdown-menu', function(e) { e.stopPropagation(); }); /* END */ /* Style input field with reset icon */ $('.inputfield--search__reset').on('click', function(event) { event.preventDefault(); $(this).prev().val(''); }) /* Check if Element is in Viewport */ $.fn.isInViewport = function() { var elementTop = $(this).offset().top; var elementBottom = elementTop + $(this).outerHeight(); var viewportTop = $(window).scrollTop() + 120; var viewportBottom = viewportTop + $(window).height(); return elementBottom > viewportTop && elementTop < viewportBottom; };