PageSourceSearch

https://static.tenniswarehouse-europe.com/js/default.js?ver=23

js tenniswarehouse-europe.com collected 2026-10-02 10:02:33 UTC 380,931 bytes, 8,598 lines download raw bytes

1'use strict';
2
3/*-----------------------------------------------
4
5Open/Save using character encoding ISO Latin 1
6
7-------------------------------------------------*/
8
9/*! Selectric
vendor: 14,532 bytes, lines 9-10
9 v1.13.0 (2017-08-22) - git.io/tjl9sQ - Copyright (c) 2017 Leonardo Santos - MIT License */
10!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,s){return void 0===s&&(s="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(s),s}:e(jQuery)}(function(e){"use strict";var t=e(document),s=e(window),l=["a","e","i","o","u","n","c","y"],i=[/[\xE0-\xE5]/g,/[\xE8-\xEB]/g,/[\xEC-\xEF]/g,/[\xF2-\xF6]/g,/[\xF9-\xFC]/g,/[\xF1]/g,/[\xE7]/g,/[\xFD-\xFF]/g],n=function(t,s){var l=this;l.element=t,l.$element=e(t),l.state={multiple:!!l.$element.attr("multiple"),enabled:!1,opened:!1,currValue:-1,selectedIdx:-1,highlightedIdx:-1},l.eventTriggers={open:l.open,close:l.close,destroy:l.destroy,refresh:l.refresh,init:l.init},l.init(s)};n.prototype={utils:{isMobile:function(){return/android|ip(hone|od|ad)/i.test(navigator.userAgent)},escapeRegExp:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},replaceDiacritics:function(e){for(var t=i.length;t--;)e=e.toLowerCase().replace(i[t],l[t]);return e},format:function(e){var t=arguments;return(""+e).replace(/\{(?:(\d+)|(\w+))\}/g,function(e,s,l){return l&&t[1]?t[1][l]:t[s]})},nextEnabledItem:function(e,t){for(;e[t=(t+1)%e.length].disabled;);return t},previousEnabledItem:function(e,t){for(;e[t=(t>0?t:e.length)-1].disabled;);return t},toDash:function(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()},triggerCallback:function(t,s){var l=s.element,i=s.options["on"+t],n=[l].concat([].slice.call(arguments).slice(1));e.isFunction(i)&&i.apply(l,n),e(l).trigger("selectric-"+this.toDash(t),n)},arrayToClassname:function(t){var s=e.grep(t,function(e){return!!e});return e.trim(s.join(" "))}},init:function(t){var s=this;if(s.options=e.extend(!0,{},e.fn.selectric.defaults,s.options,t),s.utils.triggerCallback("BeforeInit",s),s.destroy(!0),s.options.disableOnMobile&&s.utils.isMobile())return void(s.disableOnMobile=!0);s.classes=s.getClassNames();var l=e("<input/>",{class:s.classes.input,readonly:s.utils.isMobile()}),i=e("<div/>",{class:s.classes.items,tabindex:-1}),n=e("<div/>",{class:s.classes.scroll}),a=e("<div/>",{class:s.classes.prefix,html:s.options.arrowButtonMarkup}),o=e("<span/>",{class:"label"}),r=s.$element.wrap("<div/>").parent().append(a.prepend(o),i,l),u=e("<div/>",{class:s.classes.hideselect});s.elements={input:l,items:i,itemsScroll:n,wrapper:a,label:o,outerWrapper:r},s.options.nativeOnMobile&&s.utils.isMobile()&&(s.elements.input=void 0,u.addClass(s.classes.prefix+"-is-native"),s.$element.on("change",function(){s.refresh()})),s.$element.on(s.eventTriggers).wrap(u),s.originalTabindex=s.$element.prop("tabindex"),s.$element.prop("tabindex",-1),s.populate(),s.activate(),s.utils.triggerCallback("Init",s)},activate:function(){var e=this,t=e.elements.items.closest(":visible").children(":hidden").addClass(e.classes.tempshow),s=e.$element.width();t.removeClass(e.classes.tempshow),e.utils.triggerCallback("BeforeActivate",e),e.elements.outerWrapper.prop("class",e.utils.arrayToClassname([e.classes.wrapper,e.$element.prop("class").replace(/\S+/g,e.classes.prefix+"-$&"),e.options.responsive?e.classes.responsive:""])),e.options.inheritOriginalWidth&&s>0&&e.elements.outerWrapper.width(s),e.unbindEvents(),e.$element.prop("disabled")?(e.elements.outerWrapper.addClass(e.classes.disabled),e.elements.input&&e.elements.input.prop("disabled",!0)):(e.state.enabled=!0,e.elements.outerWrapper.removeClass(e.classes.disabled),e.$li=e.elements.items.removeAttr("style").find("li"),e.bindEvents()),e.utils.triggerCallback("Activate",e)},getClassNames:function(){var t=this,s=t.options.customClass,l={};return e.each("Input Items Open Disabled TempShow HideSelect Wrapper Focus Hover Responsive Above Below Scroll Group GroupLabel".split(" "),function(e,i){var n=s.prefix+i;l[i.toLowerCase()]=s.camelCase?n:t.utils.toDash(n)}),l.prefix=s.prefix,l},setLabel:function(){var t=this,s=t.options.labelBuilder;if(t.state.multiple){var l=e.isArray(t.state.currValue)?t.state.currValue:[t.state.currValue];l=0===l.length?[0]:l;var i=e.map(l,function(s){return e.grep(t.lookupItems,function(e){return e.index===s})[0]});i=e.grep(i,function(t){return i.length>1||0===i.length?""!==e.trim(t.value):t}),i=e.map(i,function(l){return e.isFunction(s)?s(l):t.utils.format(s,l)}),t.options.multiple.maxLabelEntries&&(i.length>=t.options.multiple.maxLabelEntries+1?(i=i.slice(0,t.options.multiple.maxLabelEntries),i.push(e.isFunction(s)?s({text:"..."}):t.utils.format(s,{text:"..."}))):i.slice(i.length-1)),t.elements.label.html(i.join(t.options.multiple.separator))}else{var n=t.lookupItems[t.state.currValue];t.elements.label.html(e.isFunction(s)?s(n):t.utils.format(s,n))}},populate:function(){var t=this,s=t.$element.children(),l=t.$element.find("option"),i=l.filter(":selected"),n=l.index(i),a=0,o=t.state.multiple?[]:0;i.length>1&&t.state.multiple&&(n=[],i.each(function(){n.push(e(this).index())})),t.state.currValue=~n?n:o,t.state.selectedIdx=t.state.currValue,t.state.highlightedIdx=t.state.currValue,t.items=[],t.lookupItems=[],s.length&&(s.each(function(s){var l=e(this);if(l.is("optgroup")){var i={element:l,label:l.prop("label"),groupDisabled:l.prop("disabled"),items:[]};l.children().each(function(s){var l=e(this);i.items[s]=t.getItemData(a,l,i.groupDisabled||l.prop("disabled")),t.lookupItems[a]=i.items[s],a++}),t.items[s]=i}else t.items[s]=t.getItemData(a,l,l.prop("disabled")),t.lookupItems[a]=t.items[s],a++}),t.setLabel(),t.elements.items.append(t.elements.itemsScroll.html(t.getItemsMarkup(t.items))))},getItemData:function(t,s,l){var i=this;return{index:t,element:s,value:s.val(),className:s.prop("class"),text:s.html(),slug:e.trim(i.utils.replaceDiacritics(s.html())),alt:s.attr("data-alt"),selected:s.prop("selected"),disabled:l}},getItemsMarkup:function(t){var s=this,l="<ul>";return e.isFunction(s.options.listBuilder)&&s.options.listBuilder&&(t=s.options.listBuilder(t)),e.each(t,function(t,i){void 0!==i.label?(l+=s.utils.format('<ul class="{1}"><li class="{2}">{3}</li>',s.utils.arrayToClassname([s.classes.group,i.groupDisabled?"disabled":"",i.element.prop("class")]),s.classes.grouplabel,i.element.prop("label")),e.each(i.items,function(e,t){l+=s.getItemMarkup(t.index,t)}),l+="</ul>"):l+=s.getItemMarkup(i.index,i)}),l+"</ul>"},getItemMarkup:function(t,s){var l=this,i=l.options.optionsItemBuilder,n={value:s.value,text:s.text,slug:s.slug,index:s.index};return l.utils.format('<li data-index="{1}" class="{2}">{3}</li>',t,l.utils.arrayToClassname([s.className,t===l.items.length-1?"last":"",s.disabled?"disabled":"",s.selected?"selected":""]),e.isFunction(i)?l.utils.format(i(s,this.$element,t),s):l.utils.format(i,n))},unbindEvents:function(){var e=this;e.elements.wrapper.add(e.$element).add(e.elements.outerWrapper).add(e.elements.input).off(".sl")},bindEvents:function(){var t=this;t.elements.outerWrapper.on("mouseenter.sl mouseleave.sl",function(s){e(this).toggleClass(t.classes.hover,"mouseenter"===s.type),t.options.openOnHover&&(clearTimeout(t.closeTimer),"mouseleave"===s.type?t.closeTimer=setTimeout(e.proxy(t.close,t),t.options.hoverIntentTimeout):t.open())}),t.elements.wrapper.on("click.sl",function(e){t.state.opened?t.close():t.open(e)}),t.options.nativeOnMobile&&t.utils.isMobile()||(t.$element.on("focus.sl",function(){t.elements.input.focus()}),t.elements.input.prop({tabindex:t.originalTabindex,disabled:!1}).on("keydown.sl",e.proxy(t.handleKeys,t)).on("focusin.sl",function(e){t.elements.outerWrapper.addClass(t.classes.focus),t.elements.input.one("blur",function(){t.elements.input.blur()}),t.options.openOnFocus&&!t.state.opened&&t.open(e)}).on("focusout.sl",function(){t.elements.outerWrapper.removeClass(t.classes.focus)}).on("input propertychange",function(){var s=t.elements.input.val(),l=new RegExp("^"+t.utils.escapeRegExp(s),"i");clearTimeout(t.resetStr),t.resetStr=setTimeout(function(){t.elements.input.val("")},t.options.keySearchTimeout),s.length&&e.each(t.items,function(e,s){if(!s.disabled){if(l.test(s.text)||l.test(s.slug))return void t.highlight(e);if(s.alt)for(var i=s.alt.split("|"),n=0;n<i.length&&i[n];n++)if(l.test(i[n].trim()))return void t.highlight(e)}})})),t.$li.on({mousedown:function(e){e.preventDefault(),e.stopPropagation()},click:function(){return t.select(e(this).data("index")),!1}})},handleKeys:function(t){var s=this,l=t.which,i=s.options.keys,n=e.inArray(l,i.previous)>-1,a=e.inArray(l,i.next)>-1,o=e.inArray(l,i.select)>-1,r=e.inArray(l,i.open)>-1,u=s.state.highlightedIdx,p=n&&0===u||a&&u+1===s.items.length,c=0;if(13!==l&&32!==l||t.preventDefault(),n||a){if(!s.options.allowWrap&&p)return;n&&(c=s.utils.previousEnabledItem(s.lookupItems,u)),a&&(c=s.utils.nextEnabledItem(s.lookupItems,u)),s.highlight(c)}if(o&&s.state.opened)return s.select(u),void(s.state.multiple&&s.options.multiple.keepMenuOpen||s.close());r&&!s.state.opened&&s.open()},refresh:function(){var e=this;e.populate(),e.activate(),e.utils.triggerCallback("Refresh",e)},setOptionsDimensions:function(){var e=this,t=e.elements.items.closest(":visible").children(":hidden").addClass(e.classes.tempshow),s=e.options.maxHeight,l=e.elements.items.outerWidth(),i=e.elements.wrapper.outerWidth()-(l-e.elements.items.width());!e.options.expandToItemText||i>l?e.finalWidth=i:(e.elements.items.css("overflow","scroll"),e.elements.outerWrapper.width(9e4),e.finalWidth=e.elements.items.width(),e.elements.items.css("overflow",""),e.elements.outerWrapper.width("")),e.elements.items.width(e.finalWidth).height()>s&&e.elements.items.height(s),t.removeClass(e.classes.tempshow)},isInViewport:function(){var e=this;if(!0===e.options.forceRenderAbove)e.elements.outerWrapper.addClass(e.classes.above);else if(!0===e.options.forceRenderBelow)e.elements.outerWrapper.addClass(e.classes.below);else{var t=s.scrollTop(),l=s.height(),i=e.elements.outerWrapper.offset().top,n=e.elements.outerWrapper.outerHeight(),a=i+n+e.itemsHeight<=t+l,o=i-e.itemsHeight>t,r=!a&&o,u=!r;e.elements.outerWrapper.toggleClass(e.classes.above,r),e.elements.outerWrapper.toggleClass(e.classes.below,u)}},detectItemVisibility:function(t){var s=this,l=s.$li.filter("[data-index]");s.state.multiple&&(t=e.isArray(t)&&0===t.length?0:t,t=e.isArray(t)?Math.min.apply(Math,t):t);var i=l.eq(t).outerHeight(),n=l[t].offsetTop,a=s.elements.itemsScroll.scrollTop(),o=n+2*i;s.elements.itemsScroll.scrollTop(o>a+s.itemsHeight?o-s.itemsHeight:n-i<a?n-i:a)},open:function(s){var l=this;if(l.options.nativeOnMobile&&l.utils.isMobile())return!1;l.utils.triggerCallback("BeforeOpen",l),s&&(s.preventDefault(),l.options.stopPropagation&&s.stopPropagation()),l.state.enabled&&(l.setOptionsDimensions(),e("."+l.classes.hideselect,"."+l.classes.open).children().selectric("close"),l.state.opened=!0,l.itemsHeight=l.elements.items.outerHeight(),l.itemsInnerHeight=l.elements.items.height(),l.elements.outerWrapper.addClass(l.classes.open),l.elements.input.val(""),s&&"focusin"!==s.type&&l.elements.input.focus(),setTimeout(function(){t.on("click.sl",e.proxy(l.close,l)).on("scroll.sl",e.proxy(l.isInViewport,l))},1),l.isInViewport(),l.options.preventWindowScroll&&t.on("mousewheel.sl DOMMouseScroll.sl","."+l.classes.scroll,function(t){var s=t.originalEvent,i=e(this).scrollTop(),n=0;"detail"in s&&(n=-1*s.detail),"wheelDelta"in s&&(n=s.wheelDelta),"wheelDeltaY"in s&&(n=s.wheelDeltaY),"deltaY"in s&&(n=-1*s.deltaY),(i===this.scrollHeight-l.itemsInnerHeight&&n<0||0===i&&n>0)&&t.preventDefault()}),l.detectItemVisibility(l.state.selectedIdx),l.highlight(l.state.multiple?-1:l.state.selectedIdx),l.utils.triggerCallback("Open",l))},close:function(){var e=this;e.utils.triggerCallback("BeforeClose",e),t.off(".sl"),e.elements.outerWrapper.removeClass(e.classes.open),e.state.opened=!1,e.utils.triggerCallback("Close",e)},change:function(){var t=this;t.utils.triggerCallback("BeforeChange",t),t.state.multiple?(e.each(t.lookupItems,function(e){t.lookupItems[e].selected=!1,t.$element.find("option").prop("selected",!1)}),e.each(t.state.selectedIdx,function(e,s){t.lookupItems[s].selected=!0,t.$element.find("option").eq(s).prop("selected",!0)}),t.state.currValue=t.state.selectedIdx,t.setLabel(),t.utils.triggerCallback("Change",t)):t.state.currValue!==t.state.selectedIdx&&(t.$element.prop("selectedIndex",t.state.currValue=t.state.selectedIdx).data("value",t.lookupItems[t.state.selectedIdx].text),t.setLabel(),t.utils.triggerCallback("Change",t))},highlight:function(e){var t=this,s=t.$li.filter("[data-index]").removeClass("highlighted");t.utils.triggerCallback("BeforeHighlight",t),void 0===e||-1===e||t.lookupItems[e].disabled||(s.eq(t.state.highlightedIdx=e).addClass("highlighted"),t.detectItemVisibility(e),t.utils.triggerCallback("Highlight",t))},select:function(t){var s=this,l=s.$li.filter("[data-index]");if(s.utils.triggerCallback("BeforeSelect",s,t),void 0!==t&&-1!==t&&!s.lookupItems[t].disabled){if(s.state.multiple){s.state.selectedIdx=e.isArray(s.state.selectedIdx)?s.state.selectedIdx:[s.state.selectedIdx];var i=e.inArray(t,s.state.selectedIdx);-1!==i?s.state.selectedIdx.splice(i,1):s.state.selectedIdx.push(t),l.removeClass("selected").filter(function(t){return-1!==e.inArray(t,s.state.selectedIdx)}).addClass("selected")}else l.removeClass("selected").eq(s.state.selectedIdx=t).addClass("selected");s.state.multiple&&s.options.multiple.keepMenuOpen||s.close(),s.change(),s.utils.triggerCallback("Select",s,t)}},destroy:function(e){var t=this;t.state&&t.state.enabled&&(t.elements.items.add(t.elements.wrapper).add(t.elements.input).remove(),e||t.$element.removeData("selectric").removeData("value"),t.$element.prop("tabindex",t.originalTabindex).off(".sl").off(t.eventTriggers).unwrap().unwrap(),t.state.enabled=!1)}},e.fn.selectric=function(t){return this.each(function(){var s=e.data(this,"selectric");s&&!s.disableOnMobile?"string"==typeof t&&s[t]?s[t]():s.init(t):e.data(this,"selectric",new n(this,t))})},e.fn.selectric.defaults={onChange:function(t){e(t).change()},maxHeight:300,keySearchTimeout:500,arrowButtonMarkup:'<b class="button">&#x25be;</b>',disableOnMobile:!1,nativeOnMobile:!0,openOnFocus:!0,openOnHover:!1,hoverIntentTimeout:500,expandToItemText:!1,responsive:!1,preventWindowScroll:!0,inheritOriginalWidth:!1,allowWrap:!0,forceRenderAbove:!1,forceRenderBelow:!1,stopPropagation:!0,optionsItemBuilder:"{text}",labelBuilder:"{text}",listBuilder:!1,keys:{previous:[37,38],next:[39,40],select:[9,13,27],open:[13,32,37,38,39,40],close:[9,27]},customClass:{prefix:"selectric",camelCase:!1},multiple:{separator:", ",keepMenuOpen:!0,maxLabelEntries:!1}}});
vendor: 3,301 bytes, lines 10-14
10
11
12/* Lazy image loader */
13/*! jQuery & Zepto Lazy v1.7.6 - http://jquery.eisbehr.de/lazy - MIT&GPL-2.0 license - Copyright 2012-2017 Daniel 'Eisbehr' Kern */
14!function(t,e){"use strict";function r(r,a,i,u,l){function f(){L=t.devicePixelRatio>1,i=c(i),a.delay>=0&&setTimeout(function(){s(!0)},a.delay),(a.delay<0||a.combined)&&(u.e=v(a.throttle,function(t){"resize"===t.type&&(w=B=-1),s(t.all)}),u.a=function(t){t=c(t),i.push.apply(i,t)},u.g=function(){return i=n(i).filter(function(){return!n(this).data(a.loadedName)})},u.f=function(t){for(var e=0;e<t.length;e++){var r=i.filter(function(){return this===t[e]});r.length&&s(!1,r)}},s(),n(a.appendScroll).on("scroll."+l+" resize."+l,u.e))}function c(t){var i=a.defaultImage,o=a.placeholder,u=a.imageBase,l=a.srcsetAttribute,f=a.loaderAttribute,c=a._f||{};t=n(t).filter(function(){var t=n(this),r=m(this);return!t.data(a.handledName)&&(t.attr(a.attribute)||t.attr(l)||t.attr(f)||c[r]!==e)}).data("plugin_"+a.name,r);for(var s=0,d=t.length;s<d;s++){var A=n(t[s]),g=m(t[s]),h=A.attr(a.imageBaseAttribute)||u;g===N&&h&&A.attr(l)&&A.attr(l,b(A.attr(l),h)),c[g]===e||A.attr(f)||A.attr(f,c[g]),g===N&&i&&!A.attr(E)?A.attr(E,i):g===N||!o||A.css(O)&&"none"!==A.css(O)||A.css(O,"url('"+o+"')")}return t}function s(t,e){if(!i.length)return void(a.autoDestroy&&r.destroy());for(var o=e||i,u=!1,l=a.imageBase||"",f=a.srcsetAttribute,c=a.handledName,s=0;s<o.length;s++)if(t||e||A(o[s])){var g=n(o[s]),h=m(o[s]),b=g.attr(a.attribute),v=g.attr(a.imageBaseAttribute)||l,p=g.attr(a.loaderAttribute);g.data(c)||a.visibleOnly&&!g.is(":visible")||!((b||g.attr(f))&&(h===N&&(v+b!==g.attr(E)||g.attr(f)!==g.attr(F))||h!==N&&v+b!==g.css(O))||p)||(u=!0,g.data(c,!0),d(g,h,v,p))}u&&(i=n(i).filter(function(){return!n(this).data(c)}))}function d(t,e,r,i){++z;var o=function(){y("onError",t),p(),o=n.noop};y("beforeLoad",t);var u=a.attribute,l=a.srcsetAttribute,f=a.sizesAttribute,c=a.retinaAttribute,s=a.removeAttribute,d=a.loadedName,A=t.attr(c);if(i){var g=function(){s&&t.removeAttr(a.loaderAttribute),t.data(d,!0),y(T,t),setTimeout(p,1),g=n.noop};t.off(I).one(I,o).one(D,g),y(i,t,function(e){e?(t.off(D),g()):(t.off(I),o())})||t.trigger(I)}else{var h=n(new Image);h.one(I,o).one(D,function(){t.hide(),e===N?t.attr(C,h.attr(C)).attr(F,h.attr(F)).attr(E,h.attr(E)):t.css(O,"url('"+h.attr(E)+"')"),t[a.effect](a.effectTime),s&&(t.removeAttr(u+" "+l+" "+c+" "+a.imageBaseAttribute),f!==C&&t.removeAttr(f)),t.data(d,!0),y(T,t),h.remove(),p()});var m=(L&&A?A:t.attr(u))||"";h.attr(C,t.attr(f)).attr(F,t.attr(l)).attr(E,m?r+m:null),h.complete&&h.trigger(D)}}function A(t){var e=t.getBoundingClientRect(),r=a.scrollDirection,n=a.threshold,i=h()+n>e.top&&-n<e.bottom,o=g()+n>e.left&&-n<e.right;return"vertical"===r?i:"horizontal"===r?o:i&&o}function g(){return w>=0?w:w=n(t).width()}function h(){return B>=0?B:B=n(t).height()}function m(t){return t.tagName.toLowerCase()}function b(t,e){if(e){var r=t.split(",");t="";for(var a=0,n=r.length;a<n;a++)t+=e+r[a].trim()+(a!==n-1?",":"")}return t}function v(t,e){var n,i=0;return function(o,u){function l(){i=+new Date,e.call(r,o)}var f=+new Date-i;n&&clearTimeout(n),f>t||!a.enableThrottle||u?l():n=setTimeout(l,t-f)}}function p(){--z,i.length||z||y("onFinishedAll")}function y(t,e,n){return!!(t=a[t])&&(t.apply(r,[].slice.call(arguments,1
14)),!0)}var z=0,w=-1,B=-1,L=!1,T="afterLoad",D="load",I="error",N="img",E="src",F="srcset",C="sizes",O="background-image";"event"===a.bind||o?f():n(t).on(D+"."+l,f)}function a(a,o){var u=this,l=n.extend({},u.config,o),f={},c=l.name+"-"+ ++i;return u.config=function(t,r){return r===e?l[t]:(l[t]=r,u)},u.addItems=function(t){return f.a&&f.a("string"===n.type(t)?n(t):t),u},u.getItems=function(){return f.g?f.g():{}},u.update=function(t){return f.e&&f.e({},!t),u},u.force=function(t){return f.f&&f.f("string"===n.type(t)?n(t):t),u},u.loadAll=function(){return f.e&&f.e({all:!0},!0),u},u.destroy=function(){return n(l.appendScroll).off("."+c,f.e),n(t).off("."+c),f={},e},r(u,l,a,f,c),l.chainable?a:u}var n=t.jQuery||t.Zepto,i=0,o=!1;n.fn.Lazy=n.fn.lazy=function(t){return new a(this,t)},n.Lazy=n.lazy=function(t,r,i){if(n.isFunction(r)&&(i=r,r=[]),n.isFunction(i)){t=n.isArray(t)?t:[t],r=n.isArray(r)?r:[r];for(var o=a.prototype.config,u=o._f||(o._f={}),l=0,f=t.length;l<f;l++)(o[t[l]]===e||n.isFunction(o[t[l]]))&&(o[t[l]]=i);for(var c=0,s=r.length;c<s;c++)u[r[c]]=t[0]}},a.prototype.config={name:"lazy",chainable:!0,autoDestroy:!0,bind:"load",threshold:500,visibleOnly:!1,appendScroll:t,scrollDirection:"both",imageBase:null,defaultImage:"data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",placeholder:null,delay:-1,combined:!1,attribute:"data-src",srcsetAttribute:"data-srcset",sizesAttribute:"data-sizes",retinaAttribute:"data-retina",loaderAttribute:"data-loader",imageBaseAttribute:"data-imagebase",removeAttribute:!0,handledName:"handled",loadedName:"loaded",effect:"show",effectTime:0,enableThrottle:!0,throttle:250,beforeLoad:e,afterLoad:e,onError:e,onFinishedAll:e},n(t).on("load",function(){o=!0})}(window);
15/*! jQuery & Zepto Lazy - Picture Plugin v1.2 - http://jquery.eisbehr.de/lazy - MIT&GPL-2.0 license - Copyright 2012-2017 Daniel 'Eisbehr' Kern */
16!function(t){function e(e,a,n){var o=e.prop("attributes"),c=t("<"+a+">");return t.each(o,function(t,e){"srcset"!==e.name&&e.name!==i||(e.value=r(e.value,n)),c.attr(e.name,e.value)}),e.replaceWith(c),c}function a(e,a,r){var i=t("<img>").one("load",function(){r(!0)}).one("error",function(){r(!1)}).appendTo(e).attr("src",a);i.complete&&i.load()}function r(t,e){if(e){var a=t.split(",");t="";for(var r=0,i=a.length;r<i;r++)t+=e+a[r].trim()+(r!==i-1?",":"")}return t}var i="data-src";t.lazy(["pic","picture"],["picture"],function(n,o){if("picture"===n[0].tagName.toLowerCase()){var c=n.find(i),s=n.find("data-img"),u=this.config("imageBase");c.length?(c.each(function(){e(t(this),"source",u)}),1===s.length?(s=e(s,"img",u),s.on("load",function(){o(!0)}).on("error",function(){o(!1)}),s.attr("src",s.attr(i)),this.config("removeAttribute")&&s.removeAttr(i)):n.attr(i)?(a(n,u+n.attr(i),o),this.config("removeAttribute")&&n.removeAttr(i)):o(!1)):n.attr("data-srcset")?(t("<source>").attr({media:n.attr("data-media"),sizes:n.attr("data-sizes"),type:n.attr("data-type"),srcset:r(n.attr("data-srcset"),u)}).appendTo(n),a(n,u+n.attr(i),o),this.config("removeAttribute")&&n.removeAttr(i+" data-srcset data-media data-sizes data-type")):o(!1)}else o(!1)})}(window.jQuery||window.Zepto);
17
18/* Lazy image loader */
19/* Lazyframe.js */
20/* Uncompressed Version: /js/lazyframe.js 12/28/21
21*/
22!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lazyframe=e()}(this,function(){"use strict";function t(){return(t=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}return function(){var e,n=[],i={vendor:void 0,id:void 0,src:void 0,thumbnail:void 0,title:void 0,initialized:!1,y:void 0,debounce:250,lazyload:!0,autoplay:!0,initinview:!1,onLoad:function(t){},onAppend:function(t){},onThumbnailLoad:function(t){}},o={regex:{youtube_nocookie:/(?:youtube-nocookie\.com\/\S*(?:(?:\/e(?:mbed))?\/|watch\?(?:\S*?&?v\=)))([a-zA-Z0-9_-]{6,11})/,youtube:/(?:youtube\.com\/\S*(?:(?:\/e(?:mbed))?\/|watch\?(?:\S*?&?v\=))|youtu\.be\/)([a-zA-Z0-9_-]{6,11})/,vimeo:/vimeo\.com\/(?:video\/)?([0-9]*)(?:\?|)/},condition:{youtube:function(t){return!(!t||11!=t[1].length)&&t[1]},youtube_nocookie:function(t){return!(!t||11!=t[1].length)&&t[1]},vimeo:function(t){return!!(t&&9===t[1].length||8===t[1].length)&&t[1]}},src:{youtube:function(t){return"https://www.youtube.com/embed/".concat(t.id,"/?auto
22play=").concat(t.autoplay?"1":"0","&").concat(t.query)},youtube_nocookie:function(t){return"https://www.youtube-nocookie.com/embed/".concat(t.id,"/?autoplay=").concat(t.autoplay?"1":"0","&").concat(t.query)},vimeo:function(t){return"https://player.vimeo.com/video/".concat(t.id,"/?autoplay=").concat(t.autoplay?"1":"0","&").concat(t.query)}},endpoint:function(t){return"https://noembed.com/embed?url=".concat(t.src)},response:{title:function(t){return t.title},thumbnail:function(t){return t.thumbnail_url}}};function a(t){var n=this;if(t instanceof HTMLElement!=0&&!t.classList.contains("lazyframe--loaded")){var i={el:t,settings:r(t)};i.el.addEventListener("click",function(){i.el.appendChild(i.iframe);var e=t.querySelectorAll("iframe");i.settings.onAppend.call(n,e[0])}),e.lazyload?c(i):l(i,i.settings.thumbnail)}}function r(n){var i,a,r=Array.prototype.slice.apply(n.attributes).filter(function(t){return""!==t.value}).reduce(function(t,e){return t[0===e.name.indexOf("data-")?e.name.split("data-")[1]:e.name]=e.value,t},{}),l=t({},e,r,{y:n.offsetTop,originalSrc:r.src,query:(i=r.src,a=i.split("?"),a[1]?a[1]:null)});if(l.vendor){var u=l.src.match(o.regex[l.vendor]);l.id=o.condition[l.vendor](u)}return l}function l(t){var e=this;!function(t){return!(!t.vendor||t.title&&t.thumbnail)}(t.settings)?c(t,!0):function(t,e){var n=o.endpoint(t.settings),i=new XMLHttpRequest;i.open("GET",n,!0),i.onload=function(){if(i.status>=200&&i.status<400){var n=JSON.parse(i.responseText);e(null,[n,t])}else e(!0)},i.onerror=function(){e(!0)},i.send()}(t,function(n,i){if(!n){var a=i[0],r=i[1];if(r.settings.title||(r.settings.title=o.response.title(a)),!r.settings.thumbnail){var l=o.response.thumbnail(a);r.settings.thumbnail=l,t.settings.onThumbnailLoad.call(e,l)}c(r,!0)}})}function u(){var t=this,i=window.innerHeight,o=n.length,a=function(e,n){e.settings.initialized=!0,e.el.classList.add("lazyframe--loaded"),o--,l(e),e.settings.initinview&&e.el.click(),e.settings.onLoad.call(t,e)};n.filter(function(t){return t.settings.y<i}).forEach(a);var r,u,c,s=(r=function(){f=d<window.pageYOffset,d=window.pageYOffset,f&&n.filter(function(t){return t.settings.y<i+d&&!1===t.settings.initialized}).forEach(a),0===o&&window.removeEventListener("scroll",s,!1)},u=e.debounce,function(){var t=this,e=arguments;clearTimeout(c),c=setTimeout(function(){c=null,r.apply(t,e)},u)}),d=0,f=!1;window.addEventListener("scroll",s,!1)}function c(t,i){if(t.iframe=function(t){var e=document.createDocumentFragment(),n=document.createElement("iframe");return t.vendor&&(t.src=o.src[t.vendor](t)),n.setAttribute("id","lazyframe-".concat(t.id)),n.setAttribute("src",t.src),n.setAttribute("frameborder",0),n.setAttribute("allowfullscreen",""),t.autoplay&&(n.allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"),e.appendChild(n),e}(t.settings),t.settings.thumbnail&&i&&(t.el.style.backgroundImage="url(".concat(t.settings.thumbnail,")")),t.settings.title&&0===t.el.children.length){var a=document.createDocumentFragment(),r=document.createElement("span");r.className="lazyframe__title",r.innerHTML=t.settings.title,a.appendChild(r),t.el.appendChild(a)}e.lazyload||(t.el.classList.add("lazyframe--loaded"),t.settings.onLoad.call(this,t),n.push(t)),t.settings.initialized||n.push(t)}return function(n){if(e=t({},i,arguments.length<=1?void 0:arguments[1]),"string"==typeof n)for(var o=document.querySelectorAll(n),r=0;r<o.length;r++)a(o[r]);else if(void 0===n.length)a(n);else for(var l=0;l<n.length;l++)a(n[l]);e.lazyload&&u()}}()});
23
24
25/*====================================
26	LIST CAROUSEL
27======================================*/
28
29/* 	Uncompressed Version: /js/listcarousel.js 01/07/22  */
30
31$.widget("sw.listcarousel",{options:{per_page:4,index:0,slider:null,cellwidth:null,carousel:null,cell_count:null,large_cells:!0},_create:function(){var a=this,b=this.options,c=parseInt(a.element.data("cells_per_page")),d=parseInt(a.element.data("threshold")),e=a.element.children();b.cell_count=e.length;isNaN(c)||(b.per_page=c);isNaN(d)&&(d=b.per_page);b.per_page<b.cell_count&&d<b.cell_count?(b.carousel=a.element.wrap('<div class="sw-listcarousel"><div class="sw-listcarousel-inner-wrap"><div class="sw-listcarousel-inner clearfix"></div></div></div>').closest(".sw-listcarousel"),
32b.large_cells&&1448<=$(window).width()&&($(".promo_carousel").length||b.carousel.parent().addClass("has-lgcells")),this.sliderWidth(),c=utilities.debounce(function(){$(".promo_carousel").length||b.large_cells&&(1448<=$(this).width()?b.carousel.parent().hasClass("has-lgcells")||b.carousel.parent().addClass("has-lgcells"):b.carousel.parent().hasClass("has-lgcells")&&b.carousel.parent().removeClass("has-lgcells"));975<=$(this).width()&&a.sliderWidth()},250),$(window).on("resize",c),$("<span class='sw-listcarousel-arrow-box sw-listcarousel-left-arrow'><span class='sw-listcarousel-arrow-icon'></span></span>").appendTo(b.carousel).on("click",
33function(f){a.prev()}),$("<span class='sw-listcarousel-arrow-box sw-listcarousel-right-arrow'><span class='sw-listcarousel-arrow-icon'></span></span>").appendTo(b.carousel).on("click",function(f){a.next()})):(this.element.parent().addClass("no-carousel"),b.large_cells&&(1448<=$(window).width()&&($(".promo_carousel").length||this.element.parent().addClass("has-lgcells")),c=utilities.debounce(function(){$(".promo_carousel").length||(1448<=$(this).width()?a.element.parent().hasClass("has-lgcells")||
34a.element.parent().addClass("has-lgcells"):a.element.parent().hasClass("has-lgcells")&&a.element.parent().removeClass("has-lgcells"))},250),$(window).on("resize",c)))},_destroy:function(){var a=this.options;var b=parseInt(this.element.data("threshold"));isNaN(b)&&(b=a.per_page);if(a.per_page<a.cell_count&&b<a.cell_count){b=a.carousel.find(".sw-listcarousel-left-arrow");var c=a.carousel.find(".sw-listcarousel-right-arrow");var d=a.carousel.find(".sw-listcarousel-inner");var e=a.carousel.find(".sw-listcarousel-inner-wrap");
35c.remove();b.remove();d.contents().unwrap();e.contents().unwrap();a.carousel.contents().unwrap()}},sliderWidth:function(){var a=this.options,b=this.element.children();a.cellwidth=b.eq(0).outerWidth();a.slider=a.carousel.find(".sw-listcarousel-inner").width(a.cell_count*a.cellwidth);a.slider.css({left:a.index*a.cellwidth*-1+"px"})},getwrapper:function(){return this.options.carousel},index:function(a,b){var c=this.options;void 0!==a&&(c.index!==a?(c.index=a,c.slider.stop(),"function"===typeof b?c.slider.animate({left:c.index*
36c.cellwidth*-1+"px"},400,b):c.slider.animate({left:c.index*c.cellwidth*-1+"px"},400)):"function"===typeof b&&b());return c.index},next:function(){var a=this.options;if(!a.slider.is(":animated"))if(a.index+a.per_page>=a.cell_count){var b=a.cell_count-a.index;a.index=a.cell_count;a.slider.animate({left:a.index*a.cellwidth*-1+"px"},100*b,function(){a.index=0;a.slider.animate({left:a.per_page*a.cellwidth+"px"},0,function(){a.slider.animate({left:a.index*a.cellwidth*-1+"px"})})})}else a.index+=a.per_page,
37a.slider.animate({left:a.index*a.cellwidth*-1+"px"},400)},prev:function(){var a=this.options;if(!a.slider.is(":animated"))if(0>a.index-a.per_page){var b=a.cell_count%a.per_page;0==b&&(b=a.per_page);a.index=a.cell_count-b;a.slider.animate({left:a.cellwidth*a.per_page+"px"},400,function(){a.slider.animate({left:-1*a.cellwidth*a.cell_count+"px"},0,function(){a.slider.animate({left:-1*a.index*a.cellwidth+"px"},100*b)})})}else a.index-=a.per_page,a.slider.animate({left:a.index*a.cellwidth*-1+"px"},400)},
38destroy:function(){$.Widget.prototype.destroy.call(this)}});
39
40/* End List Carousel */
41
42
43/*====================================
44	AJAX PRODUCT SEARCH
45======================================*/
46
47/* 	Uncompressed Version: /js/ajaxproductsearch.js 07/13/22  */
48
49var AjaxProductSearchModule=function(){return function(){function fa(a,b,c){this.name=a;this.price=parseFloat(b);
49this.code=c}var C,D,O=null,t,m=1,y="",E,F,G,z,f,U,V="/search/searchresults.html?",W="/search/searchtable.html?sort=no&lazy_load=no&",n=[],q="alphaAtoZ",p=20,K=!1,H=!1,P="No Event Label Defined",Q=!1,R=!1,X=!1,u=0,g="en",ha={en:"Search Results",de:"Suchergebnisse",es:"Buscar resultados",fr:"R&eacute;sultats de la recherche",it:"Risultati della ricerca"},I={en:"Selected Options",de:"Ausgew&auml;hlte Optionen",
50es:"Opciones seleccionadas",fr:"Options s&eacute;lectionn&eacute;es",it:"Opzioni selezionate"},ia={en:"Clear All",de:"Alles l&ouml;schen",es:"Borrar todo",fr:"Tout effacer",it:"Elimina"},ja={en:"Searching...",de:"wird gesucht&hellip;",es:"Buscando",fr:"Recherche...",it:"Attendere..."},Y={en:"Search All",de:"Suchen",es:"Buscar",fr:"Tout rechercher",it:"Cerca"},L={en:"Remove",de:"Entfernen",es:"Eliminar",fr:"Effacer",it:"Rimuovi"},ka={en:"Showing ",de:"Zeigt ",es:"Viendo ",fr:"Montrer ",it:"Showing "},
51la={en:"0 Results Found",de:"0 Ergebnisse gefunden",es:"0 resultados",fr:"0 r&eacute;sultats trouv&eacute;s",it:"0 risultati trovati"},Z={en:"Page ",de:"Seite ",es:"P&aacute;gina ",fr:"Page ",it:"Pagina "},S={en:" of ",de:" von ",es:" de ",fr:" sur ",it:" di "},ma={en:" for ",de:" f&uuml;r ",es:" relacionados con ",fr:" pour ",it:" per "},na={en:"An Error Occurred",de:"Ein Fehler ist aufgetreten",es:"Ha habido un error",fr:"Une erreur est survenue",it:"Si &egrave; verificato un errore"},aa=function(){var a=
52localStorage.getItem("sm.ajaxProductSearch.sort");var b=localStorage.getItem("sm.ajaxProductSearch.resultsPerPage");null!=a&&(q=a);null!=b&&(p=b)},pa=function(){if("undefined"!==typeof f){for(var a=y.split("&"),b=0;b<a.length;b++){var c=a[b];a[b]=[c.split("=")[0],c.split("=")[1]]}for(b=0;b<a.length;b++)"opt_page"==a[b][0]&&(c=parseInt(a[b][1]),isNaN(c)||(m=c)),"opt_perpage"==a[b][0]&&(c=parseInt(a[b][1]),isNaN(c)||(p=c)),"opt_sort"==a[b][0]&&(q=a[b][1]);f.find("select").each(function(){for(var d=
53$(this).attr("name"),h=null,e=0;e<a.length;e++)a[e][0]!=d||""==a[e][1]&&"null"==a[e][1]||(h=a[e][1]);null==h?0!=$(this).prop("selectedIndex")&&$(this).attr("selectedIndex",0).change():$(this).val()!=h&&$(this).val(h).change()});f.find('input[type="radio"]').each(function(){for(var d=$(this).attr("name"),h=!1,e=0;e<a.length;e++)a[e][0]!=d||""==a[e][1]&&"null"==a[e][1]||a[e][1]!=$(this).val()||(h=!0);$(this).prop("checked")!=h&&$(this).prop("checked",h).change()});f.find('input[type="checkbox"]').each(function(){for(var d=
54$(this).attr("name"),h=!1,e=0;e<a.length;e++)a[e][0]!=d||""==a[e][1]&&"null"==a[e][1]||a[e][1]!=$(this).val()||(h=!0);$(this).prop("checked")!=h&&$(this).prop("checked",h)});"undefined"!==typeof F&&F.empty().append(oa());f.trigger("finderupdate",{search_module:T})}},qa=function(){var a="",b=!0;f.find(".keepinquery").each(function(){$(this).is("input.cat_filter")||(a+=(b?"?":"&")+$(this).attr("name")+"="+$(this).val(),b=!1)});var c="";f.find(".default_all").each(function(){""==$(this).val()||"null"==
55$(this).val()?$(this).find("input").each(function(){""!=$(this).val()&&"null"!=$(this).val()&&(c+="cat_all="+$(this).val()+"&")}):$(this).hasClass("default_as_basecat")&&(c+="cat_all="+$(this).val()+"&")});var d="";f.find("input.cat_filter").length&&null!=f.find("input.cat_filter").data("base")&&(d="cat="+f.find("input.cat_filter").data("base")+"&");return f.attr("action")+a+"#"+d+c+f.find(":not(.cat_filter)").serialize()+M(1)},oa=function(){u=0;if("undefined"!==typeof f){var a=$('<div class="resetlinks">'),
56b=$('<div class="filter_form-section resetlinks-section list-group list-group-flush list-group-standard no-outer"></div>'),c=!0,d=f.find("input.cat_filter"),h=null,e=$('<a class="resetlinks-all" href="#&pagetype=finder">'+ia[g]+"</a>");e.on("click",function(l){l.preventDefault();f.find("select").each(function(){0!=$(this).prop("selectedIndex")&&$(this).prop("selectedIndex",0).change()});f.find('input[type="checkbox"]').each(function(){1==$(this).prop("checked")&&$(this).prop("checked",!1).change()});
57f.find('input[type="radio"]').each(function(){"null"==$(this).val()&&$(this).prop("checked",!0)});f.find(".price_range_slider").length&&f.find(".price_range").each(function(){var k=$(this).find(".price_range_slider"),r=$(this).find(".ui-slider-range"),N=$(this).find(".ui-slider-handle"),A=$(this).find(".pricewrap .text-center"),v=$(this).find(".slidermax").attr("data-max");$(this).find(".priceinputs input").each(function(){$(this).hasClass("price_min")&&0<$(this).val()&&($(this).val(0),N.first().css({left:"0"}));
58$(this).hasClass("slidermax")&&($(this).val(v),N.last().css({left:"100%"}))});r.css({left:"0",width:"100%"});r=k.slider("option");k.slider("values",[r.min,r.max]);A.html("("+r.min+" &euro; - "+r.max+" &euro;)")});f.submit()});d.length&&(d=d.data("catname"),d="undefined"!=typeof d?""!=d?d.replace(/_/g," "):Y[g]:Y[g],O=h=$('<a class="list-group-item" href="'+qa()+'">'+d+'<span class="icon icon-x is-xs">'+L[g]+"</span></a>"),c&&(a.append($('<div class="section_label filter_form-labels">'+I[g]+"</div>").append(e)).append(b),
59b.append(h),c=!1));f.find("select").each(function(){if(0!=$(this).prop("selectedIndex")){c&&(a.append($('<div class="section_label filter_form-labels">'+I[g]+"</div>").append(e)).append(b),c=!1);var l=$(this);b.append($('<a class="list-group-item" href="#">'+$(this).find("option").eq($(this).prop("selectedIndex")).html()+'<span class="icon icon-x is-xs">'+L[g]+"</span></a>").bind("click",function(k){k.preventDefault();l.prop("selectedIndex",0).change();f.submit()}));u++}});f.find('input[type="radio"]').each(function(){if(1==
60$(this).prop("checked")&&"null"!==$(this).val()){c&&(a.append($('<div class="section_label filter_form-labels">'+I[g]+"</div>").append(e)).append(b),c=!1);var l=$(this);b.append($('<a class="list-group-item" href="#">'+$("label[for='"+$(this).attr("id")+"']").text()+'<span class="icon icon-x is-xs">'+L[g]+"</span></a>").bind("click",function(k){k.preventDefault();k=l.attr("name");$("[name="+k+"][value=null]").prop("checked",!0).change();f.submit()}));u++}});f.find('input[type="checkbox"]').each(function(){if(1==
61$(this).prop("checked")){c&&(a.append($('<div class="section_label filter_form-labels">'+I[g]+"</div>").append(e)).append(b),c=!1);var l=$(this);b.append($('<a class="list-group-item" href="#">'+$("label[for='"+$(this).attr("id")+"']").text()+'<span class="icon icon-x is-xs">'+L[g]+"</span></a>").bind("click",function(k){k.preventDefault();l.prop("checked",!1).change();f.submit()}));u++}});$(".price_range").length&&f.find(".priceslider").each(function(){var l=$(this).find(".price_range_slider"),k=
62$(this).find(".ui-slider-range"),r=$(this).find(".priceinputs"),N=$(this).find(".pricewrap .text-center"),A=r.find(".price_min"),v=r.find(".price_max"),ba=v.attr("data-max");!(0<A.val()||v.val()<ba)||""===A.val()&&""===v.val()||(c&&(a.append($('<div class="section_label filter_form-labels">'+I[g]+"</div>").append(e)).append(b),c=!1),b.append($('<a class="list-group-item" href="#">'+A.val()+" &euro; - "+v.val()+' &euro;<span class="icon icon-x is-xs">Remove</span></a>').bind("click",function(B){B.preventDefault();
63A.val(0);v.val(ba);k.css({left:"0",width:"100%"});B=l.slider("option");l.slider("values",[B.min,B.max]);N.html("("+B.min+" &euro; - "+B.max+" &euro;)");f.submit()})),u++)});return a}return null},x=function(a){var b=E;b.length&&$(window).scrollTop()>b.offset().top&&$(window).scrollTop()>b.offset().top&&$(window).scrollTop(b.offset().top);b=ha[g];"undefined"!==typeof D&&(t=t.replace(/[\u00A0-\u9999<>"',;%\^=\(\)\*\-\|\+&\/\\]/gim,function(e){return"&#"+e.charCodeAt(0)+";"}),b+=ma[g]+'"'+t+'"');if(0==
64n.length){reportEventTracking("Finder","Text Search: No Results",t);if(Q||R)var c="";else{var d={en:"Filter",de:"Filter",es:"Filtro",fr:"Filtre",it:"Filtro"};c=$('<div class="catnav-flex"><button type="button" class="btn catnav-filter category-navigation-filter no-icon canvas_return-js" data-toggle="offcanvas" data-target="#filterPanel" aria-controls="filterPanel" aria-expanded="false" aria-label="Toggle Filter"><span class="badge badge-pill badge-primary">'+u+"</span> "+d[g]+"</button></div>");c.find(".category-navigation-filter").on("click",
65function(e){e.preventDefault();e=$(this);var l=$(this).data("target");$(l).hasClass("open")?(closeCanvas(),c.focus()):(openCanvas(e),$(window).on("resize",resizeCheck))})}G.empty().append($('<h1 class="searchheader h2"></h1>').append("<span>"+b+"</span>"));z.removeClass("loading").empty().append($('<div id="searchoptionsnew" class="catnav category-navigation sticky-top px-xl-3">').append(ca()).append(c)).append($('<div id="producttarget"><p class="text-center mt-4">'+la[g]+".</p></div>"))}else{d=
66Math.ceil(n.length/p);null==a&&(a=1);m=a;y=w();H||(window.location.hash="#"+y);reportVirtualPageview(location.pathname+location.search+location.hash);m>d&&(m=d);var h=ka[g]+((m-1)*p+1)+" - ";h=n.length>m*p?h+m*p:h+n.length;h+=S[g]+n.length;Q||R?c="":(d={en:"Filter",de:"Filter",es:"Filtro",fr:"Filtre",it:"Filtro"},c=$('<div class="catnav-flex"><button type="button" class="btn catnav-filter category-navigation-filter no-icon canvas_return-js" data-toggle="offcanvas" data-target="#filterPanel" aria-controls="filterPanel" aria-expanded="false" aria-label="Toggle Filter"><span class="badge badge-pill badge-primary">'+
67u+"</span> "+d[g]+"</button></div>"),c.find(".category-navigation-filter").on("click",function(e){e.preventDefault();var l=$(this),k=$(this).data("target");e=$("<div />");e.addClass("offcanvas-backdrop");e.on("click",function(){$("body").removeClass("is-fixed");$(".offcanvas-backdrop").remove();$(k).toggleClass("open");$(k).find(".is-shown").removeClass("is-shown");
67$(k).find(".is-hidden").removeClass("is-hidden");l.hasClass("is-open")&&(l.removeClass("is-open"),l.focus())});f.on("submit",function(){$("body").removeClass("is-fixed");
68$(".offcanvas-backdrop").remove();$(k).removeClass("open");$(k).find(".is-shown").removeClass("is-shown");$(k).find(".is-hidden").removeClass("is-hidden");l.hasClass("is-open")&&l.removeClass("is-open")});l.hasClass("btn-menu")&&l.toggleClass("is-open");$(k).toggleClass("open");$(k).hasClass("open")||setTimeout(function(){$(k).find(".is-shown").removeClass("is-shown");$(k).find(".is-hidden").removeClass("is-hidden")},400);$("body").hasClass("is-fixed")?($("body").removeClass("is-fixed"),$(".offcanvas-backdrop").remove()):
69($("body").addClass("is-fixed"),$(k).after(e),setTimeout(function(){$(k).focus();trapFocus($(k))},300))}));G.empty().append($('<h1 class="searchheader h2"></h1>').append("<span>"+b+"</span>")).append($('<p class="search_total">'+h+"</p>"));d=a*p;d>n.length&&(d=n.length);b=W;for(a=(a-1)*p;a<d;a++)b=X?b+("productlist="+n[a].code.slice(0,-1)+"&"):b+("productlist="+n[a].code+"&");a=$('<div id="producttarget"></div>');z.removeClass("loading").empty().append($('<div id="searchoptionsnew" class="catnav category-navigation sticky-top px-xl-3">').append(ca()).append(c)).append(a);
70E.find("select").each(function(){});a.addClass("loading");"undefined"!==typeof C&&(b+="type="+C+"&");a.load(b,function(e,l,k){if("error"==l)$(this).html("<p>"+na[g]+".</p>");else{$(this).removeClass("loading").after(ra());if($(".video_popup").length)$(".video_popup").on("click",function(r){r.preventDefault();reportEventTracking("Video","Product Video",$("#video").data("popurl"));generateVideoModal($(this))});$(this).submit(function(){CartHandler.order($(this).serialize());this.reset();return!1})}z.trigger("loadcontent",
71{search_module:T})})}},sa=function(a,b){return a.price-b.price},ta=function(a,b){return b.price-a.price},da=function(a,b){return a.name.localeCompare(b.name)},ua=function(a,b){return b.name.localeCompare(a.name)},ea=function(a,b){"undefined"===typeof b&&(b=1);switch(a){case "priceAcc":q=a;n.sort(sa);x(b);break;case "priceDec":q=a;n.sort(ta);x(b);break;case "alphaZtoA":q=a;n.sort(ua);x(b);break;case "alphaAtoZ":q=a;n.sort(da);x(b);break;default:q="alphaAtoZ",n.sort(da),x(b)}},ra=function(){var a=$('<ul class="search_nav pagination justify-content-center">'),
72b=Math.ceil(n.length/p),c=$('<select class="select_page custom-select"></select>');c.on("change",function(){var h=parseInt($(this).find(":selected").val());x(h)});if(1==b)return null;1!=m?a.append(J(m-1,'<span class="search_nav-arrow icon icon-arrow icon-arrow-left"><<</<span>',"prev")):a.append(J(m,'<span class="search_nav-arrow icon icon-arrow icon-arrow-left"><<</<span>',"prev"));a.append($('<li class="page-item w-100 text-center"></li>').append(c));for(var d=1;d<=b;d++)c.append(J(d));m!=b?a.append(J(m+
731,'<span class="search_nav-arrow icon icon-arrow icon-arrow-right">>></<span>',"next")):a.append(J(m,'<span class="search_nav-arrow icon icon-arrow icon-arrow-right">>></<span>',"next"));return a.wrap('<div class="search_nav-wrap"></div>').parent()},ca=function(){var a=$('<div class="category-navigation-catselection dropdown"><a href="#" class="category-navigation-catselection-nav" role="button" id="dropDownSort" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">'+{en:"Sort",de:"Sortieren",
74es:"Ordenar",fr:"Trier",it:"Ordina"}[g]+"</a></div>"),b=[{val:"alphaAtoZ",text:{en:"Sort A-Z",de:"Sortiert von A bis Z",es:"Ordenar de la A a la Z",fr:"Trier de A &agrave; Z",it:"Ordina dalla A alla Z"}[g]},{val:"alphaZtoA",text:{en:"Sort Z-A",de:"Sortiert von Z bis A",es:"Ordenar de la Z a la A",fr:"Trier de Z &agrave; A",it:"Ordina dalla Z alla A"}[g]},{val:"priceAcc",text:{en:"Sort By Lowest Price",de:"Ausgehend vom niedrigsten Preis",es:"Ordenar por precio: de m&aacute;s bajo a m&aacute;s alto",
75fr:"Trier par prix croissant",it:"Ordina per prezzo crescente"}[g]},{val:"priceDec",text:{en:"Sort By Highest Price",de:"Ausgehend vom h&ouml;chsten Preis",es:"Ordenar por precio: de m&aacute;s alto a m&aacute;s bajo",fr:"Trier par prix d&eacute;croissant",it:"Ordina per prezzo decrescente"}[g]}];a.append($('<div class="dropdown-menu" aria-labelledby="dropDownSort"></div>'));for(var c=0;c<b.length;c++){var d=$('<a href="#" class="dropdown-item'+(q==b[c].val?" active":"")+'" data-value="'+b[c].val+
76'">'+b[c].text+"</a>");d.on("click",function(h){h.preventDefault();ea($(this).data("value"));localStorage.setItem("sm.ajaxProductSearch.sort",q);localStorage.setItem("sm.ajaxProductSearch.resultsPerPage",p)});a.find(".dropdown-menu").append(d)}return a},va=function(a){n.length=0;$($(a).find(".searchlinks").eq(0).html());var b=$(a).find(".filter_catname").eq(0).text();b.length&&null!=O&&O.text(b);$(a).find(".catcell_style").length?C="styleapparel":$(a).find(".catcell_nostyle").length&&(C="nostyleapparel");
77$(a).find(".result").each(function(){n.push(new fa($(this).find(".name").text(),$(this).find(".price").text(),$(this).find(".code").text()))});pa();ea(q,m)},J=function(a,b,c){var d=null,h=Math.ceil(n.length/p);var e="undefined"!=typeof b?b:a;"undefined"!=typeof b?0<a&&(a==m?(d=$('<span class="current page-link">'+e+"</span></li>").wrap('<li class="page-item"></li>'),d.parent().addClass("disabled")):d=$('<a href="#" class="page-link">'+e+"</a>").click(function(l){l.preventDefault();x(a)}).wrap('<li class="page-item"></li>')):
780<a&&(d=a==m?$('<option value="'+a+'" selected>'+Z[g]+e+S[g]+h+"</option>"):$('<option value="'+a+'">'+Z[g]+e+S[g]+h+"</option>"));"undefined"!=typeof c&&d.addClass(c);return"undefined"!=typeof b?d.parent():d},M=function(a){return"undefined"!==typeof a?"&opt_page="+a+"&opt_sort="+q+"&opt_perpage="+p:"&opt_page="+m+"&opt_sort="+q+"&opt_perpage="+p},w=function(){if("undefined"!==typeof f){var a="";f.find("input.cat_filter").length||f.find(".default_all").each(function(){""==$(this).val()||"null"==$(this).val()?
79$(this).find("input").each(function(){""!=$(this).val()&&"null"!=$(this).val()&&(a+="cat_all="+$(this).val()+"&")}):$(this).hasClass("default_as_basecat")&&(a+="cat_all="+$(this).val()+"&")});return a+f.serialize()+M()}if("undefined"!==typeof D){var b=U.find(".textsearchtype");b=b.length?"&type="+b.val():"";return"search=products"+b+"&searchtext="+encodeURI(t)+M()}},wa=function(){var a=!0;f.find("select").each(function(){a=!1});a&&f.find('input[type="checkbox"]').each(function(){a=!1});a&&f.find('input[type="radio"]').each(function(){a=
80!1});R=a},T={resetOptions:function(){m=1;aa()},resetPaging:function(){m=1},serializeOptions:function(){return M()},setproducttype:function(a){C=a},loadPrefs:function(){aa()},settarget:function(a){E=a;F=$('<div class="resettarget">');G=$('<div id="searchnavbar" class="clearfix">');z=$('<div class="results">').append(E.html());E.empty().append(G).append(z);$(".filter_form-options").prepend(F)},assigntextfield:function(a){D=a},setproductsearchurl:function(a){V=a}
80,setsearchtableurl:function(a){W=a},setLang:function(a){g=
81a},runSearch:function(a){if(!K&&""!=a&&y!==a){y=a;H||(window.location.hash=a);for(var b=y.split("&"),c=0;c<b.length;c++){var d=b[c];b[c]=[d.split("=")[0],d.split("=")[1]]}for(c=0;c<b.length;c++)"opt_page"==b[c][0]&&(d=parseInt(b[c][1]),isNaN(d)||(m=d)),"opt_perpage"==b[c][0]&&(d=parseInt(b[c][1]),isNaN(d)||(p=d)),"opt_sort"==b[c][0]&&(q=b[c][1]);b=a.split("searchtext=")[1];"undefined"!==typeof b&&(b=b.split("&")[0],"undefined"==typeof b&&(b=""),t=decodeURIComponent(b).replace(/\+/g," "),D.val(t));
82F.empty();G.empty().append('<h1 class="searchheader h2">'+ja[g]+"</h1>");z.empty().addClass("loading");$.get(V+"&"+a,function(h){va(h)})}},setTextSearch:function(){Q=!0},assigntextform:function(a){U=a;P="Text Search"},assignfinder:function(a){f=a;a=f.data("xmlsearchurl");var b=f.data("eventlabel");wa();a&&""!=a&&this.setproductsearchurl(a);b&&""!=b&&(P=b)},runTextSearch:function(){t=D.val();this.trackTextSearch(t);H?(w(),this.runSearch(w())):window.location.hash="#"+w()},runFinderSearch:function(){H?
83(w(),this.runSearch(w())):window.location.hash="#"+w()},trackTextSearch:function(a){"undefined"!==typeof dataLayer&&dataLayer.push({event:"gaEvent",gaEventData:{category:"Finder",action:"Text Search",label:a}})},trackInteraction:function(a){"undefined"!==typeof dataLayer&&dataLayer.push({event:"gaEvent",gaEventData:{category:"Finder",action:P,label:a}})},pauseSearch:function(){K=!0},unpauseSearch:function(){K=!1},isPaused:function(){return K},hasDemoProds:function(){X=!0},disableHashListening:function(){H=
84!0},setSearchTitle:function(a){}};return T}()};
85
86/* End Ajax Product Search */
87
88
89/*====================================
90	PRODUCT IMAGE VIEWER
91======================================*/
92
93/* 	Uncompressed Version: /js/productimageviewer.js 03/09/26  */
94
95var ProductImageViewerModule=function(e){return i=$.extend({},{imagecarousel:!0,buttons:!1,multiview:!0,initdots:!0,thumbnails:!1,expandedView:!1,largeview:!0,largeviewButton:null,largeview_state_change:!1,largeview_header:!1,setSwipe:!0,styleVids:!1,classNames:{carousel:"prod_view-carousel",carouselWrap:"prod_view-carousel-wrap",carouselInner:"prod_view-carousel-wrap-inner",carouselCell:"prod_view-carousel-wrap-cell",mainImage:""}},e||{}),a={mainwrap:null,mainimage:null,imagewrap:null,carousel:{},carouselWrap:null,carouselInner:null,leftbutton:null,rightbutton:null,imagecounter:null,multiview:null,mainloader:null,styleName:null,prodVideo:null},t={imageurl:"",imagesrcset:"",imageSizes:"",isloading:!1,videoLink:null,imagecount:0,currentimage:1,stylecode:null,styleList:null,imgPat:/(.*)-([\d]+)?\.(jpg|gif|png)(.*)/i,stylePat:/(https?:\/\/img.tenniswarehouse-europe.com\/watermark\/rs.php\?path=)([\w]+)(-[\w]+)?(-[\d]{1,2})\.(jpg|gif|png)(&nw=)?([\d]+)?/i,productName:null,productCode:null,arrowWrap:!0,classNames:{}},s=function(e){var i=$('<video class="main_image" preload="auto" loop muted playsinline><source type="video/mp4" src="'+t.videoLink+'"></video>');i.hide(),a.prodVideo=i,a.imagewrap.append(i)},n=function(){var e;t.isloading=!0,setTimeout((function(){t.isloading&&(null==a.mainloader&&(a.mainloader=$('<div class="loader">loading</div>'),a.imagewrap.append(a.mainloader)),a.imagewrap.addClass("is-loading"))}),300),e=$('<img class="'+t.classNames.mainImage+'" />').hide(),t.productName&&e.attr("alt",t.productName),e.bind("load",(function(){e.attr("src")==t.imageurl?(a.mainimage.attr("style")&&e.attr("style",a.mainimage.attr("style")),e.width(),e.height(),a.mainimage.replaceWith(e.show()),a.mainimage=e):e.detach(),t.videoLink&&b(),t.isloading=!1,a.imagewrap.removeClass("is-loading")})),$("body").append(e),e.attr({srcset:t.imagesrcset,src:t.imageurl})},o=function(){a.carousel.main=$("<div/>").addClass(i.classNames.carousel),a.carousel.wrap=$("<div/>").addClass(i.classNames.carouselWrap),a.carousel.inner=$("<div/>").addClass(i.classNames.carouselInner),a.carousel.images=[];var e=t.stylePat,s=null;t.stylecode&&t.stylecode.indexOf("-")>=0&&(e=/(https?:\/\/img.tenniswarehouse-europe.com\/watermark\/rs.php\?path=)([\w]+)-([^-]+-[^-]+)?(-[\d]{1,2})\.(jpg|gif|png)(&nw=)?([\d]+)?/i),void 0!==t.imagesrcset&&(s=t.imagesrcset.split(","));for(var n=0;n<t.imagecount;n++)if(t.videoLink&&n===t.imagecount-1){var o=$('<video class="main_image" preload="auto" loop muted playsinline><source type="video/mp4" src="'+t.videoLink+'"></video>');a.carousel.inner.append($('<div class="'+t.classNames.carouselCell+'"></div>').append(o)),a.prodVideo=o}else{var r=$('<img class="'+t.classNames.mainImage+'" itemprop="image" />');if(t.stylecode)var l=t.imageurl.replace(e,"$1$2-"+t.stylecode+"-"+(n+1)+".$5$6$7");else l=t.imageurl.replace(e,"$1$2-$3"+(n+1)+".$5$6$7");if(t.imageSizes&&r.attr("sizes",t.imageSizes),s){for(var d=0;d<s.length;d++)t.stylecode?s[d]=s[d].replace(e,"$1$2-"+t.stylecode+"-"+(n+1)+".$5$6$7"):s[d]=s[d].replace(e,"$1$2-$3"+(n+1)+".$5$6$7");r.attr("srcset",s.join(","))}r.attr("src",l),t.productName&&r.attr("alt",t.productName),a.carousel.inner.append($('<div class="'+t.classNames.carouselCell+'"></div>').append(r)),a.carousel.images.push(r)}a.mainimage.detach(),a.imagewrap.append(a.carousel.main.append(a.carousel.wrap.append(a.carousel.inner))),$(window).resize((function(){i.expandedView?window.innerWidth<1200&&u("0"):u("
950")}))},r=function(){t.imageurl=a.mainimage.attr("src"),t.imagesrcset=a.mainimage.attr("srcset"),t.imageSizes=a.mainimage.attr("sizes"),t.classNames.mainImage=a.mainimage.attr("class"),a.mainimage.attr("alt")&&(t.productName=a.mainimage.attr("alt"));var e=t.stylePat,i=t.imageurl.match(e);null!=i&&void 0!==i[3]&&(i=i[3].split("-"),t.stylecode=i[1])},l=function(){a.imagewrap=a.mainimage.parent()},d=function(){var e={threshold:50},i=null,t=!1;function s(n){if(t){var o=n.touches[0].pageX,r=i-o;Math.abs(r)>=e.threshold&&(a.imagewrap.off("touchmove",s),i=null,t=!1,r>0?y():L())}}"ontouchstart"in a.imagewrap[0]&&a.imagewrap.on("touchstart",(function(e){1==e.touches.length&&(i=e.touches[0].pageX,t=!0,a.imagewrap.on("touchmove",s))}))},c=function(){t.imagecount=a.multiview.find("ul").children().length},u=function(e){t.imageurl=t.imageurl.replace(t.imgPat,"$1-"+t.currentimage+".$3$4");var s=null;if(void 0!==t.imagesrcset&&(s=t.imagesrcset.split(",")),s){for(var o=0;o<s.length;o++)s[o]=s[o].replace(t.imgPat,"$1-"+t.currentimage+".$3$4");t.imagesrcset=s.join(",")}if(i.imagecarousel||null!=t.videoLink&&t.currentimage===t.imagecount||n(),i.imagecarousel){null==e&&(e=300);var r=a.imagewrap.width()*(t.currentimage-1);a.carousel.inner.css({transition:"left "+e+"ms ease 0s",left:"-"+r+"px"}),null!=t.videoLink&&t.currentimage===t.imagecount?a.prodVideo.get(0).play():null!=t.videoLink&&a.prodVideo.get(0).pause()}},m=function(){i.multiview&&a.multiview.find("li").removeClass("is-active").eq(t.currentimage-1).addClass("is-active")},p=function(){var e=document.activeElement,a=ProductImageViewerModule({imagecarousel:!1,largeview:!1,setSwipe:!1}),s=t.currentimage,n=(t.stylecode,null),o="$1$2$3-"+s+".$5";if(t.styleList&&t.styleList.length&&t.stylecode){for(var r=0;r<t.styleList.length;r++)t.styleList[r].code==t.stylecode&&(n=t.styleList[r]);n||(n=t.styleList[0])}var l,d=t.imageurl;d=t.stylecode&&t.stylecode.indexOf("-")>=0?d.replace(/(https?:\/\/img.tenniswarehouse-europe.com\/watermark\/rs.php\?path=)([\w]+)(-[^-]+)?(-[\d]{1,2})\.(jpg|gif|png)(&nw=)?([\d]+)?/i,"$1$2$3-"+s+".$5"):d.replace(/(https?:\/\/img.tenniswarehouse-europe.com\/watermark\/rs.php\?path=)([\w]+)(-[\w]+)?(-[\d]{1,2})\.(jpg|gif|png)(&nw=)([\d]+)?/i,o),l=$('<img class="'+t.classNames.mainImage+'"/>').hide();var c=$('<div class="largeimagepop modal" tabindex="-1" role="dialog"><div class="modal-dialog modal-dialog-centered modal-descpage" role="document"><div class="modal-content"></div></div></div>'),p=c.find(".modal-content"),g=$('<div class="modal-header"><h2 class="modal-title"></h2></div>'),v=$('<div class="modal-body"></div>'),w=$('<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span class="icon icon-x icon-x-large" aria-hidden="true">Close</span></button>'),h=$('<div class="button_wrap"></div>'),f=$('<div class="column_wrap cf"></div>'),y=$('<div class="style_column"></div>'),L=($('<div class="image_column"></div>'),$('<div class="large_image_wrap"></div>')),b=$('<div class="carousels_wrap"></div>');c.on("hidden.bs.modal",(function(i){e&&e.focus()})),(t.productName||n)&&(t.productName&&g.find(".modal-title").text(t.productName),n&&(g.find(".modal-title").text(n.name),a.setstyleout(style_out_element))),p.append(v.append(h.append(L)).append(b)),i.largeview_header?p.prepend(g.append(w)):v.prepend(w);var k=0;if(t.imagecount>0&&(k+=79),t.styleList&&t.styleList.length,t.imagecount>0){var _=$('<div class="prod_slider"></div>'),x=$('<ul class="large_image-multiview prod_slider-inner clearfix"></ul>');for(r=0;r<t.imagecount;r++){if(null!=t.videoLink&&t.imagecount===r+1)var V="https://img.tenniswarehouse-europe.com/watermark/rs.php?path="+t.productCode+(t.stylecode?"-"+t.stylecode:"")+"-3.jpg",C=$('<li class="large_image-multiview-video"><button class="large_image-multiview-tab"><img srcset="'+V+"&nw=32 32w, "+V+'&nw=64 64w" src="'+V+'&nw=32" /><span class="large_image-multiview-play"><i class="icon icon-play"></i></span></button></li>');else V="https://img.tenniswarehouse-europe.com/watermark/rs.php?path="+t.productCode+(t.stylecode?"-"+t.stylecode:"")+"-"+(r+1)+".jpg",C=$('<li><button class="large_image-multiview-tab"><img srcset="'+V+"&nw=32 32w, "+V+'&nw=64 64w" src="'+V+'&nw=32" /></button></li>');x.append(C)}b.append(_.append(x))}if(t.styleList&&t.styleList.length>1){f.append(y.css("width","230px")),f.addClass("with_style"),tot_pad_horz+=230;var N=70;t.productName&&(N+=35),n&&(N+=40);var P=$('<ul class="large_image-styleview"></ul>').css("padding-top",N+"px"),j=[];for(r=0;r<style_list.length;r++){V="https://img.tenniswarehouse-europe.com/watermark/rs.php?path="+t.productC
95ode+"-"+t.styleList[r].code+"-1.jpg";var I=$('<li><button type="button"><img src="'+V+'&nw=50" /><div class="text_wrap"><div>'+t.styleList[r].name+"</div></div></button></li>");j.push(I),I.on("click",{stylecode:t.styleList[r].code},(function(e){$(this).addClass("current").siblings().removeClass("current"),a.setstyle(e.data.stylecode)})),t.styleList[r].code==t.stylecode&&I.addClass("current"),P.append(I)}y.append(P)}l.bind("load",(function(){var e,n,o,r;if(e=$(this).height(),n=$(this).width(),o=window.innerHeight-161-k,r=window.innerWidth-70,e>n?e>o?$(this).css({"max-height":o+"px"}):n>r&&$(this).css({"max-width":r+"px",width:"100%"}):n>r?$(this).css({"max-width":r+"px",width:"100%"}):e>o&&$(this).css({"max-height":o+"px"}),L.append($(this).show()),a.setmainimage($(this)),null!=t.videoLink&&a.enableVideo(t.videoLink),x&&a.setmultiview(_,{noHover:!0,forLargeView:!0}),a.setViewer(v),null!=t.videoLink){var l=c.find("video.main_image");e>n?e>o?l.css({"max-height":o+"px"}):n>r&&l.css({"max-width":r+"px"}):n>r?l.css({"max-width":r+"px"}):e>o&&l.css({"max-height":o+"px"})}a.setcurrent(s),c.modal(),c.on("hidden.bs.modal",(function(){i.largeview_state_change&&(t.currentimage=a.getCurrent(),u("0"),m())})),c.on("hidden.bs.modal",(function(){$(this).remove()})),$(this).unbind("load")})),$("body").append(l),l.attr("src",d),setTimeout((function(){trapFocus($(".modal.show .modal-content"))}),100)},g=function(){window.innerWidth>=1200?a.imagewrap.hasClass("is-open")||v():a.imagewrap.hasClass("is-open")&&w()},v=function(){a.imagewrap.addClass("is-open"),a.carousel.inner.removeAttr("style"),a.multiview.hide(),null!=t.videoLink&&h(),i.setSwipe&&(a.imagewrap.off("touchstart"),a.imagewrap.off("touchmove"))},w=function(){a.imagewrap.removeClass("is-open"),a.multiview.show(),null!=t.videoLink&&(f(),a.prodVideo.get(0).pause()),i.setSwipe&&d()},h=function(){a.prodVideo.get(0).pause();var e=$('<a class="model_overlay" tabindex="0" title="Play Model Video" />');e.append($('<span class="model_overlay-icon_wrap" />').append('<i class="icon icon-play is-lg">Play Model Video</i>')),e.on("click keydown",(function(e){13!==e.keyCode&&"click"!==e.type||(e.preventDefault(),$(this).hide(),a.prodVideo.attr("tabindex","0"),a.prodVideo.get(0).play(),a.prodVideo.focus())})),a.prodVideo.on("ended pause",(function(){e.show(),a.prodVideo.attr("tabindex",""),e.focus()})),a.prodVideo.on("click keydown",(function(e){13!==e.keyCode&&"click"!==e.type||$(this).get(0).pause()})),a.prodVideo.after(e)},f=function(){a.prodVideo.off("click keydown"),a.prodVideo.siblings(".model_overlay").remove()},y=function(){if(t.currentimage+1>t.imagecount){if(!t.arrowWrap)return!1;t.currentimage=1}else t.currentimage++;return u(),m(),!0},L=function(){if(t.currentimage-1<=0){if(!t.arrowWrap)return!1;t.currentimage=t.imagecount}else t.currentimage--;return u(),m(),!0},b=function(){a.prodVideo.get(0).pause(),a.prodVideo.hide(),a.mainimage.show()},k=function(){t.classNames=i.classNames},{setcurrent:function(e){return t.currentimage!=e&&(e>t.imagecount?t.currentimage=t.imagecount:t.currentimage=e<=0?1:e,t.videoLink&&!i.imagecarousel&&t.currentimage===t.imagecount?(a.mainimage.hide(),a.prodVideo.show(),a.prodVideo.get(0).play()):u(),m(),!0)},getCurrent:function(){return t.currentimage},setmultiview:function(e,i){var t=$.extend({},{noHover:!1,forLargeView:!1},i||{}),s="click";!0!==t.noHover&&(s+=" mouseenter");var n=this,o=$('<button type="button" class="prod_view-multiview-left"><i class="icon icon-arrow icon-arrow-left is-xl">Previous Image</i></button>'),r=$('<button type="button" class="prod_view-multiview-right"><i class="icon icon-arrow icon-arrow-right is-xl">Next Image</i></button>');a.multiview=e,t.forLargeView||a.multiview.find("ul").before(o).after(r),a.multiview.find(".large_image-multiview-tab").each((function(e){$(this).on(s,(function(i){i.preventDefault(),n.setcurrent(e+1)}))})),a.multiview.find("a").each((function(e){$(this).on(s,(function(i){i.preventDefault(),n.setcurrent(e+1)}))})),o.on(s,(function(e){e.preventDefault(),L()})),r.on(s,(function(e){e.preventDefault(),y()})),m()},setProductName:function(e){t.productName=e}
95,setProductCode:function(e){t.productCode=e},setstyle:function(e){void 0===e&&t.styleList&&t.styleList.length&&(e=t.styleList[0].code),t.stylecode!=e&&(t.stylecode=e,function(){var e=t.stylePat;t.stylecode&&t.stylecode.indexOf("-")>=0&&(e=/(https?:\/\/img.tenniswarehouse-europe.com\/watermark\/rs.php\?path=)([\w]+)-([^-]+-[^-]+)?(-[\d]{1,2})\.(jpg|gif|png)(&nw=)?([\d]+)?/i),t.imageurl=t.imageurl.replace(e,"$1$2-"+t.stylecode+"-"+t.currentimage+".$5$6$7");var s=null;if(void 0!==t.imagesrcset&&(s=t.imagesrcset.split(",")),s){for(var o=0;o<s.length;o++)s[o]=s[o].replace(e,"$1$2-"+t.stylecode+"-"+t.currentimage+".$5$6$7");t.imagesrcset=s.join(",")}if(i.imagecarousel||a.mainimage&&(null!=t.videoLink&&t.currentimage===t.imagecount||n()),a.carousel){var r=null;for(void 0!==t.imagesrcset&&(r=t.imagesrcset.split(",")),o=0;o<t.imagecount;o++)if(t.videoLink&&o===t.imagecount-1)i.styleVids&&(t.videoLink=t.videoLink.replace(/(https?:\/\/img\.tenniswarehouse-europe\.com\/vidApparel\/)([\w]+)-([^-]+)?\.(mp4)/i,"$1$2-"+t.stylecode+".$4"),a.prodVideo.find("source").attr("src",t.videoLink),a.prodVideo[0].load());else{var l=a.carousel.images[o].attr("src");if(r){for(var d=0;d<r.length;d++)r[d]=r[d].replace(e,"$1$2-"+t.stylecode+"-"+(o+1)+".$5$6$7");a.carousel.images[o].attr("srcset",r.join(","))}l=l.replace(e,"$1$2-"+t.stylecode+"-"+(o+1)+".$5$6$7"),a.carousel.images[o].attr("src",l)}}if(i.multiview&&a.multiview.find("img").each((function(i){var a=$(this).attr("src");a=a.replace(e,"$1$2-"+stylecode+"-"+(i+1)+".$5$6$7"),$(this).attr("src",a)})),a.styleName&&t.styleList&&t.styleList.length&&t.stylecode)for(o=0;o<t.styleList.length;o++)if(t.styleList[o].code==t.stylecode){style_name_display.html(t.styleList[o].name);break}}(),m())},setmainimage:function(e){a.mainimage=e,this.setProductName(a.mainimage.attr("alt")),this.setProductCode(a.mainimage.attr("data-code"))},setViewer:function(e){a.mainwrap=e,function(){if(k(),r(),l(),null===a.multiview?i.multiview=!1:c(),i.imagecarousel&&t.imagecount>1&&o(),i.imagecarousel||null==t.videoLink||s(),i.largeview&&(a.imagewrap.find("img").on("click tap",(function(){t.currentimage=a.imagewrap.find("img").index($(this))+1,p()})),null!==i.largeviewButton&&i.largeviewButton.on("click",(function(e){e.preventDefault(),p()}))),i.setSwipe&&d(),i.expandedView){g();var e=utilities.throttle(g,50);$(window).on("resize",e)}}()},enableVideo:function(e){t.videoLink=e}};var i,a,t,s,n,o,r,l,d,c,u,m,p,g,v,w,h,f,y,L,b,k};
96
97/* End Product Image Viewer */
98
99
100/*====================================
101	STYLE ORDERING
102======================================*/
103
104/* 	Uncompressed Version: /js/styleordering.js 08/24/26  */
105
106var UsedStyleOrderingModule=function(e){return t=$.extend({},{orderingStyle:"boxes",displayImages:!0,priceRange:!1,styleHover:!1,panelOrder:!1,dynamic:!0,usedProduct:!1,rentalProduct:!1,classNames:{orderAlert:"style_ordering-alert",orderBox:"style_ordering-box",orderLabel:"style_ordering-label",orderLabelSelected:"style_ordering-label-selected",orderRow:"style_ordering-style_row",orderCell:"style_ordering-style_row-cell",orderModal:"style_ordering-modal",orderModalBtn:"style_ordering-box-modal_btn",orderImgWrap:"style_ordering-image_wrap",orderDrop:"style_ordering-drop",orderDropRow:"style_ordering-drop_row",orderSubmit:"style_ordering-submits"}},e||{}),r={module:null,styleOrdering:null,orderForm:null,orderReplace:null,orderTable:null,orderQty:null,sorting:null,submitSect:null,submitButton:null,wishButton:null,sizingSelector:null,stockNotify:null,imageViewer:null,colorName:null,stockNum:null,pricing:null,errorsContainer:null,orderingArea:null},s={styles:[],productInfo:[],styleSort:null,styleOrderingBox:null,selectedColor:"",selectedColorCode:"",selectedColorStock:"",shownColorCode:"",stock_text:"In Stock",noSelectText:"Select Options Above",makeSelectText:"Make Selection",unavailableText:"Unavailable",onAddCallback:null,defaultPricing:null},i=function(){r.orderForm=r.styleOrdering.find(".style_ordering-form"),r.orderReplace=r.styleOrdering.find(".style_ordering-replace, .used_ordering-replace"),r.orderTable=r.styleOrdering.find("table"),r.orderQty=r.styleOrdering.find(".qty_button_wrap"),r.submitSect=r.styleOrdering.find("."+t.classNames.orderSubmit),r.submitButton=r.
106styleOrdering.find(".style_ordering-add_cart"),r.wishButton=r.styleOrdering.find(".wishlist_poplink"),r.customizeButton=r.styleOrdering.find(".customize_btn"),r.errorsContainer=r.styleOrdering.find(".js-ordering-errors-container"),r.orderingArea=r.styleOrdering.find(".ordering_area")},n=function(){r.orderTable.find(".subproduct").each(function(){var e=[],t=$(this).find("input").length>0;$(this).find(".stylelist li").each(function(){var t,r,s,i,n,l,o,a,d,c;a=$(this).find(".style"),d=$(this).find(".styleitem"),c=$(this).find(".stocknum"),t=a.text(),r=a.data("styleref"),l=a.attr("data-styleabbrev"),s=d.text(),i=d.attr("data-scode"),n=d.attr("data-styleref"),o=d.data("stylethumb"),c=c.length?c.text():null,void 0!==o?e.push(new m(t,r,s,i,n,l,o,c)):e.push(new m(t,r,s,i,n,l,null,c))}),o($(this).data("code"),$(this).find(".name").text(),$(this).find(".available").text(),e,t,$(this).find(".available").hasClass("stock_notify"),$(this).find(".price").text(),$(this).find(".available").hasClass("drop_shipped"),$(this).hasClass("no_backorders"))}),C()},l=function(e,t,r,s,i,n,l,o,a){this.code=e,this.name=t,this.orderable=i,this.stocknotify=n,this.stockstatus="",this.price=l,this.dropship=o,this.nobackorder=a;var d=utilities.parseDate(r,{month_style:"short"});/^([\d]{1,2})\s(Days)/.test(r)?(this.available=r,this.stockstatus="backorder"):null!=d?(this.available=d,this.stockstatus="backorder"):"Out"==r?(this.available="Out of Stock",this.stockstatus="out_of_stock"):"Sold Out"===r?(this.available=r,this.stockstatus="out_of_stock"):(this.available=r,this.stockstatus="in_stock"),this.productstyles=s},o=function(e,t,r,i,n,o,a,d,c){for(var u=[],f=0;f<i.length;f++)null==s.styles[f]?(s.styles[f]=new g(i[f].ref,i[f].itemabbrev,i[f].title),s.styles[f].additem(i[f].itemname,i[f].itemcode,i[f].itemref,i[f].itemabbrev,i[f].thumb,i[f].stockNum)):s.styles[f].styleref===i[f].ref&&(s.styles[f].hasItem(i[f].itemref)||s.styles[f].additem(i[f].itemname,i[f].itemcode,i[f].itemref,i[f].itemabbrev,i[f].thumb,i[f].stockNum)),u.push(i[f].itemref);s.productInfo.push(new l(e,t,r,u,n,o,a,d,c))},a=function(e){e=void 0===e||e;for(var t=0;t<s.styles.length;t++)1==s.styles[t].styleitems.length&&f(s.styles[t].styleitems[0].ref);if(e){var i="";if(window.location.search.length&&(i=(i=window.location.search.split("color=")).length>1&&(i=i[1].split("&")).length>0?i[0]:""),s.styles[0].styleitems[0].thumb)if(""!==i){var n="";for(t=0;t<s.styles[0].styleitems.length;t++)s.styles[0].styleitems[t].code==i&&(n=s.styles[0].styleitems[t].ref);""!==n?(f(n),null!==r.imageViewer&&r.imageViewer.setstyle(i)):f(s.styles[0].styleitems[0].ref)}else f(s.styles[0].styleitems[0].ref)}},d=function(){if("true"===r.orderingArea.attr("data-customization-disable-submit"))r.submitButton.text("Add To Cart");else{var e=Number(r.orderingArea.attr("data-js-ordering-price"));if(!isNaN(e)){var t=r.orderingArea.attr("data-js-customization-price"),s=Number(e);isNaN(t)||(s+=Number(t)),r.submitButton.text("Add To Cart - "+s.toFixed(2)+"&euro;")}}}
106,c=function(){var e=$('<div class="used_select" />');s.styles.forEach(function(t){t.styleitems.forEach(function(t){var i=$('<div class="used_select-style" />'),n=$('<div class="used_select-style-heading" />'),l=s.productInfo.filter(function(e){return e.productstyles[0]===t.ref});n.text(t.name+" - "+{A:"Excellent",B:"Great",C:"Good",D:"OK",F:"Poor"}[t.name]),n.append('<span class="used_select-style-heading-price">'+l[0].price+" &euro;</span>"),i.append(n),i.append(function(e){var t=$('<ul class="used_select-style-list" />');return e.forEach(function(e){var s=$('<li class="used_select-style-list-product" />'),i=$("<label />"),n=$('<input class="order_input" type="radio" name="pcode" value="'+e.code+'" />');n.attr("data-price",e.price);var l=$('<div class="used_select-style-list-product-name" />');i.on("change",function(t){u(),r.orderingArea.attr("data-js-ordering-price",e.price),d(),r.orderReplace[0].dispatchEvent(new CustomEvent("ordering:selectionUpdate",{detail:{matches:[{code:e.code}]}}))}),l.text(e.name),i.append(n).append(l),s.append(i),t.append(s)}),t}(l)),e.append(i)})});var i=e.find(".order_input").first();return i.attr("checked",!0),r.orderReplace[0].dispatchEvent(new CustomEvent("ordering:selectionUpdate",{detail:{matches:[{code:i.val()}]}})),r.orderingArea.attr("data-js-ordering-price",i.attr("data-price")),d(),u(),r.orderForm.on("submit",function(e){if(r.orderForm.find(".order_input:checked").val(),t.dynamic){if(r.submitButton.hasClass("disabled"))return e.preventDefault(),function(e=!1){var t=JSON.parse(r.errorsContainer.attr("data-js-customization-errors")||"[]"),s=JSON.parse(r.errorsContainer.attr("data-js-ordering-errors")||"[]");if((t.length||s.length)&&(e||r.errorsContainer?.children().length)){var i=$('<div class="alert alert-danger order-error-js style_ordering-error-list-wrap" tabindex="-1" role="alert"></div>'),n=$('<ol class="style_ordering-error-list"/>');s.forEach(e=>{n.append($('<li><a href="#'+e.elementDataId+'" class="style_ordering-error-link">'+e.message+"</a></li>"))}),t.forEach(e=>{n.append($('<li><a href="#'+e.elementDataId+'" class="style_ordering-error-link">'+e.message+"</a></li>"))}),i.append($('<p class="style_ordering-error-instruction">Please fix the following errors:</p>')).append(n),i.find("a").each(function(e,t){$(t).on("click",function(e){e.preventDefault();let t=$(this).attr("href").slice(1),r=$('[data-id="'+t+'"]'),s=r;r.hasClass("js-input-container")&&(s=r.find("input[type=radio]"));var i=window.matchMedia("(prefers-reduced-motion: no-preference)").matches?"smooth":"instant";s[0].scrollIntoView({block:"center",behavior:i,container:"nearest"}),s[0].focus()})}),r.errorsContainer.html(i),e&&i.focus()}else r.errorsContainer.html("")}(!0),!1;if($(this).hasClass("ajax-enabled")&&!$(this).is(".cart_disable form"))return e.preventDefault(),$(this).trigger("addtocart",{ordering_module:w}),null!=s.onAddCallback&&onAddCallback(),!1}}),e},u=function(){r.submitButton.hasClass("btn-tworange")&&r.submitButton.text("Add To Cart").removeClass("btn-tworange").addClass("btn-ordergreen"),t.usedProduct&&k()},f=function(e){if(h()){for(var t=0;t<s.productInfo.length;t++)for(var r=0;r<s.productInfo[t].productstyles.length;r++)if(s.productInfo[t].productstyles[r]==e)for(var i=0;i<s.productInfo[t].productstyles.length;i++)s.styles[i].selectionindex=s.styles[i].itemIndex(s.productInfo[t].productstyles[i])}else for(t=0;t<s.styles.length;t++){var n=s.styles[t].itemIndex(e);if(n>=0){s.styles[t].selectionindex=n;break}}},h=function(){var e=!0;if("undefined"!=typeof DIAGONAL_DISABLED&&!0===DIAGONAL_DISABLED)return!1;for(var t=0;t<s.styles.length;t++)for(var r=0;r<s.styles[t].styleitems.length;r++){for(var i=0,n=0;n<s.productInfo.length;n++)s.productInfo[n].productstyles[t]==s.styles[t].styleitems[r].ref&&i++;1!==i&&(e=!1)}return e},m=function(e,t,r,s,i,n,l,o){this.title=e,this.ref=t,this.itemname=r,this.itemcode=s,this.itemref=i,this.itemabbrev=n,this.thumb=""==l?null:l,this.stockNum=o},y=function(e){for(var t=-1,r=0;r<this.styleitems.length;r++)if(this.styleitems[r].ref===e){t=r;break}return t},p=function(e){return this.itemIndex(e)>=0},g=function(e,t,r){this.styleref=e,this.stylename=r,this.styleabbrev=t,this.styleitems=[],this.additem=b,this.itemIndex=y,this.hasItem=p,this.selectionindex=-1,this.isstatic=!1,this.isover=!1},b=function(e,t,r,s,i,n){this.styleitems.push(new v(e,t,r,s,i,n))}
106,v=function(e,t,r,s,i,n){this.ref=r,this.name=e,this.code=t,this.abbrev=s,this.thumb=""==i?null:i,this.stockNum=n},_=function(){r.orderTable.data("json_style_sort")&&(r.sorting=r.orderTable.data("json_style_sort"))},C=function(){if(null!=r.sorting)for(var e=0;e<s.styles.length;e++)r.sorting["style_"+s.styles[e].styleref]&&(s.styles[e].styleitems,s.styles[e].styleitems.sort(function(e){return function(t,r){return $.inArray(t.ref,e)-$.inArray(r.ref,e)}}(r.sorting["style_"+s.styles[e].styleref])))},k=function(e){e&&s.styleOrderingBox.find(".order_input").val(e),null!=r.wishButton&&r.wishButton.removeClass("disabled"),function(e){if(r.customizeButton.length){var t=r.customizeButton.attr("href").split("=");r.customizeButton.attr("href",t[0]+"="+e),r.customizeButton.removeClass("disabled")}}(e),null!=r.submitButton&&r.submitButton.removeClass("disabled")},w={clearData:function(){styles=[],productinfo=[],submitSelector=null,wishSelector=null,formSelector=null,sizingSelector=null,notifySelector=null,alertSelector=null,selectedColor="",selectedColorCode="",shownColorCode="",onAddCallback=null},onAddToCart:function(e){"function"==typeof e&&(s.onAddCallback=e)},setSizingElement:function(e){r.sizingSelector=e},setImageViewer:function(e){r.imageViewer=e},setOrdering:function(e){r.styleOrdering=e,r.module=this,i(),r.orderForm.hasClass("has_pricerange")&&enablePrice(),_(),n(),a(),r.orderReplace.hide(),t.usedProduct&&r.orderReplace.after(c())},setPricing:function(e){r.pricing=e,s.defaultPricing=e.html()}};var t,r,s,i,n,l,o,a,d,c,u,f,h,m,y,p,g,b,v,_,C,k,w};
107/* End Style Ordering */
108
109
110/*====================================
111	DYNAMIC CART
112======================================*/
113
114/* 	Uncompressed Version: /js/dynamiccart_v2_NEW_VERSION.js 09/14/26  */
115var CartHandler=function(){var t={cartPanel:null,cartBackdrop:null,cartLink:null,shippingInfo:null,cartValues:null,returnFocusOnCloseElement:null},e={orderingURL:"/ajax/cartordering.xml",freeShip:null,cartSubtotal:null,cartTotal:null,cartLoaded:!1,cartItems:[],relatedItems:[],extraItems:[],addOnItems:[],itemsAdded:[],itemCount:0,lastScroll:0,currentLang:"en"};function a(t,e){this.code=t,this.qty=e,this.name=null,this.imagestyle=null,this.image=null,this.image2x=null,this.price=null,this.link=null,this.gtm_category=null,this.gtm_brand=null,this.gtm_code=null,this.gtm_name=null,this.gtm_variant=null,this.gtm_stocknumber=null,this.gtm_season=null}function i(t,e){this.key=t,this.value=e}var n=function(e){t.cartLink.find(".cart-qty").text(e)},r=function(){$("body").css("top","").removeClass("is-fixed").addClass("sticky-ignore-next-scroll"),window.scrollTo(0,e.lastScroll),t.cartBackdrop.detach(),t.cartPanel.removeClass("open"),t.returnFocusOnCloseElement&&t.returnFocusOnCloseElement.focus(),t.cartPanel.find(".dynamic_order").length&&setTimeout(function(){t.cartPanel.find(".dynamic_order").remove()},300)},s=function(t){if("undefined"!=typeof dataLayer){var a={event:"add_to_cart",ecommerce:{items_sold:e.itemCount,currency:"EUR",value:e.cartTotal,items:generate_ecommerce_object(t,"items")}};console.log(a),dataLayer.push(a)}},d=function(a){var i={en:"Remove "+a.name,de:a.name+" entfernen",fr:"Supprimer "+a.name,es:"Eliminar "+a.name,it:"Rimuovi "+a.name},r=$('<div class="dynamic_cart-item dynamic_cart-cart-item" />'),s=$('<img class="'+a.imagestyle+'" src="'+a.image2x+'" srcset="'+a.image+" 64w,"+a.image2x+' 128w" alt="'+a.name+'" />'),d=$('<div class="dynamic_cart-cart-item-img" />'),c=$('<div class="dynamic_cart-cart-item-info" />'),o=$('<div class="dynamic_cart-cart-item-price" />'),l=$('<button type="button" class="dynamic_cart-cart-item-trash" title="'+i[e.currentLang]+a.name+'"><i class="icon icon-trash">'+i[e.currentLang]+a.name+"</i></button>");return null!=a.image?(s.attr("src",a.image).attr("srcset",a.image).attr("alt",a.name),d.append(s)):(s.attr("src","https://img.tenniswarehouse-europe.com/graphics-resizer/custom_thumbnails/cart-coupon.svg").attr("srcset","https://img.tenniswarehouse-europe.com/graphics-resizer/custom_thumbnails/cart-coupon.svg").attr("alt",a.name),d.append(s)),"true"===a.hasComponent&&null==a.image&&d.append('<i class="icon icon-custom is-xl"></i>'),null!=a.note?c.append('<h3 class="dynamic_cart-cart-item-name">'+a.name+'</h3><div class="dynamic_cart-cart-item-note">'+a.note+"</div>"):c.append('<h3 class="dynamic_cart-cart-item-name">'+a.name+'</h3><div class="dynamic_cart-cart-item-qty">
115Qty: '+a.qty+"</div>").append(l),o.append('<span class="item-price">'+a.price.replace(".",",")+" &euro;</span>"),l.on("click",function(i){trapFocus($("#dynamicCart")),i.preventDefault(),$.ajax({timeout:8e3,type:"GET",url:e.orderingURL+"?"+a.code+"=0",dataType:"xml",success:function(i){if(!$(i).find('item[pcode="'+a.code+'"]').length){var r=$(i).find("item, credit"),s=parseFloat($(i).find("subtotal").text().replace(",",".")),d=parseFloat($(i).find("total").text().replace(",",".")),c=0,o=l.closest(".dynamic_cart-cart-item-group");if(o.length?o.remove():l.closest(".dynamic_cart-cart-item").remove(),r.each(function(){c+=parseInt($(this).find("qty").text())}),t.shippingInfo.html(""),null!==e.freeShip){var m={en:'<div class="dynamic_cart-cart-ship-note">Add <span class="dynamic_cart-free-shipping-amt">'+(e.freeShip-s).toFixed(2).replace(".",",")+" &euro;</span> for free ground shipping!*",de:'<div class="dynamic_cart-cart-ship-note"><span class="dynamic_cart-free-shipping-amt">'+(e.freeShip-s).toFixed(2).replace(".",",")+" &euro;</span> f&uuml;r kostenlosen Versand!*",fr:'<div class="dynamic_cart-cart-ship-note">Plus que <span class="dynamic_cart-free-shipping-amt">'+(e.freeShip-s).toFixed(2).replace(".",",")+" &euro;</span> pour b&eacute;n&eacute;ficier de la livraison gratuite !*",es:'<div class="dynamic_cart-cart-ship-note"><span class="dynamic_cart-free-shipping-amt">'+(e.freeShip-s).toFixed(2).replace(".",",")+" &euro;</span> para el env&iacute;o gratuito.*",it:'Ti mancano &euro; <span class="dynamic_cart-free-shipping-amt">'+(e.freeShip-s).toFixed(2).replace(".",",")+"</span> per la spedizione gratuita"};s<e.freeShip?(t.shippingInfo.append(m[e.currentLang]),t.shippingInfo.append('<div class="dynamic_cart-cart-ship-bar"><div style="width: '+(s/e.freeShip*100).toFixed(2)+'%;"></div></div>')):(t.shippingInfo.append({en:'<div class="dynamic_cart-cart-ship-note">You have free ground shipping!*</div>',de:'<div class="dynamic_cart-cart-ship-note">Der Versand ist kostenlos!*</div>',fr:'<div class="dynamic_cart-cart-ship-note">La livraison est gratuite !*</div>',es:'<div class="dynamic_cart-cart-ship-note">&iexcl;Te lo enviamos gratis!</div>',it:'<div class="dynamic_cart-cart-ship-note">La spedizione &egrave; gratuita!</div>'}[e.currentLang]),t.shippingInfo.append('<div class="dynamic_cart-cart-ship-bar"><div style="width: 100%;"></div></div>'))}t.cartValues.html(""),t.cartValues.append('<div class="dynamic_cart-cart-total-text">'+c+" "+(1!=c?{en:"Items",de:"Artikel",fr:"articles",it:"prodotti",es:"art&iacute;culos"}[e.currentLang]:{en:"Item",de:"Artikel",fr:"article",it:"prodotti",es:"art&iacute;culo"}[e.currentLang])+'&nbsp;-&nbsp;<span class="dynamic_cart-subtotal">Subtotal: <span class="dynamic_cart-subtotal-amt">'+s.toFixed(2).replace(".",",")+" &euro;</span></span></div>"),t.cartValues.append('<a href="/workingorder.html" class="btn button-cart btn-block">'+{en:"View Cart & Checkout",de:"Warenkorb & Kasse ansehen",fr:"Mon panier",es:"Ver cesta y pagar",it:"Visualizza il carrello"}[e.currentLang]+"</a>"),e.cartSubtotal=s,e.cartTotal=d,e.itemCount=c,n(c)}},error:function(){console.log("Error Remove Item"),g()}})}),r.append(d),r.append(c).append(o),r},c=function(){var a=$('<div class="dynamic_cart-cart-wrap" />'),i=$('<div class="dynamic_cart-cart-ship" />'),n=$('<div class="dynamic_cart-cart-total" />');if($(".ship-text-js").length){var r=Number($(".ship-text-js").text().match(/-?\d+(\.\d+)?/g)[0]);isNaN(r)||(e.freeShip=r)}if(null!==e.freeShip){var s={en:'<div class="dynamic_cart-cart-ship-note">Add <span class="dynamic_cart-free-shipping-amt">'+(e.freeShip-e.cartSubtotal).toFixed(2).replace(".",",")+" &euro;</span> for free ground shipping!*",de:'<div class="dynamic_cart-cart-ship-note"><span class="dynamic_cart-free-shipping-amt">'+(e.freeShip-e.cartSubtotal).toFixed(2).replace(".",",")+" &euro;</span> f&uuml;r kostenlosen Versand!*",fr:'<div class="dynamic_cart-cart-ship-note">Plus que <span class="dynamic_cart-free-shipping-amt">'+(e.freeShip-e.cartSubtotal).toFixed(2).replace(".",",")+" &euro;</span> pour b&eacute;n&eacute;ficier de la livraison gratuite !*",es:'<div class="dynamic_cart-cart-ship-note"><span class="dynamic_cart-free-shipping-amt">
115'+(e.freeShip-e.cartSubtotal).toFixed(2).replace(".",",")+" &euro;</span> para el env&iacute;o gratuito.*",it:'Ti mancano &euro; <span class="dynamic_cart-free-shipping-amt">'+(e.freeShip-e.cartSubtotal).toFixed(2).replace(".",",")+"</span> per la spedizione gratuita"};e.cartSubtotal<e.freeShip?(i.append(s[e.currentLang]),i.append('<div class="dynamic_cart-cart-ship-bar"><div style="width: '+(e.cartSubtotal/e.freeShip*100).toFixed(2)+'%;"></div></div>')):(i.append({en:'<div class="dynamic_cart-cart-ship-note">You have free ground shipping!*</div>',de:'<div class="dynamic_cart-cart-ship-note">Der Versand ist kostenlos!*</div>',fr:'<div class="dynamic_cart-cart-ship-note">La livraison est gratuite !*</div>',es:'<div class="dynamic_cart-cart-ship-note">&iexcl;Te lo enviamos gratis!</div>',it:'<div class="dynamic_cart-cart-ship-note">La spedizione &egrave; gratuita!</div>'}[e.currentLang]),i.append('<div class="dynamic_cart-cart-ship-bar"><div style="width: 100%;"></div></div>'))}return n.append('<div class="dynamic_cart-cart-total-text">'+e.itemCount+" Item"+(1!=e.itemCount?"s":"")+'&nbsp;-&nbsp;<span class="dynamic_cart-subtotal">Subtotal: <span class="dynamic_cart-subtotal-amt">'+e.cartSubtotal.toFixed(2).replace(".",",")+" &euro;</span></span></div>"),n.append('<a href="/workingorder.html" class="btn button-cart btn-block">'+{en:"View Cart & Checkout",de:"Warenkorb & Kasse ansehen",fr:"Mon panier",es:"Ver cesta y pagar",it:"Visualizza il carrello"}[e.currentLang]+"</a>"),t.shippingInfo=i,t.cartValues=n,t.cartPanel.find(".dynamic_cart-header h3").text({en:"In Your Cart",de:"In den Warenkorb",fr:"Ajout&eacute; au panier",es:"En la cesta",it:"Nel carrello"}[e.currentLang]),t.cartPanel.find(".dynamic_cart-cart").html(i).append(n),a.html(i).append(n),e.cartItems.length&&a.append(function(){for(var t=e.cartItems,a=$('<div class="dynamic_cart-cart-list" />'),i=0;i<t.length;i++){var n=$('<div class="dynamic_cart-cart-item-group" role="group" aria-label="cart item" />');n.append(d(t[i])),a.append(n)}return a}()),a},o=function(t){var e=$('<div class="dynamic_cart-item dynamic_cart-added-item" />');return e.append('<div class="dynamic_cart-added-image-wrap"><img class="'+t.imagestyle+'" src="'+t.image2x+'" srcset="'+t.image+" 64w,"+t.image2x+' 128w" alt="'+t.name+'" /></div>').append('<div class="dynamic_cart-added-item-name">'+t.name+"</div>"),e},l=function(t){var a={en:"Add "+t.name,de:t.name+" hinzuf&uuml;gen",fr:"Ajouter "+t.name,es:"A&ntilde;adir "+t.name,it:"Aggiungi "+t.name},i=$('<div class="dynamic_cart-item dynamic_cart-addon-item" />'),n=$('<div class="dynamic_cart-addon-image-wrap" />'),r=$('<img class="'+t.imagestyle+'" src="'+t.image2x+'" srcset="'+t.image+" 64w,"+t.image2x+' 128w" alt="'+t.name+'" />'),s=$('<div class="dynamic_cart-addon-item-info" />'),d=$('<button type="button" class="btn button-ghost button-ghost__small" title="'+a[e.currentLang]+'">'+{en:"Add",de:"Hinzuf&uuml;gen",fr:"Ajouter",es:"A&ntilde;adir",it:"Aggiungi"}[e.currentLang]+"</button>");return n.append(r),s.append('<div class="dynamic_cart-addon-item-name">'+t.name+"</div>"),t.colors.length&&s.append('<div class="dynamic_cart-addon-item-note">'+t.colors+"</div>"),s.append('<div class="dynamic_cart-addon-item-price">'+t.price.replace(".",",")+" &euro;</div>").append('<div class="dynamic_cart-addon-item-note">'+t.note+"</div>").append(d),i.on("click",function(e){e.preventDefault(),p(t,d,!0),setTimeout(function(){trapFocus($(".dynamic_order"))},300)}),t.sale.length&&s.find(".dynamic_cart-addon-item-price").addClass(" sale"),i.append(n).append(s),i},m=function(t){var a={en:"Add "+t.name,de:t.name+" hinzuf&uuml;gen",fr:"Ajouter "+t.name,es:"A&ntilde;adir "+t.name,it:"Aggiungi "+t.name},i=$('<div class="dynamic_cart-item dynamic_cart-related-item" />'),n=$('<div class="dynamic_cart-related-image-wrap" />'),r=$('<img class="'+t.imagestyle+'" src="'+t.image2x+'" srcset="'+t.image+" 64w,"+t.image2x+' 128w" alt="'+t.name+'" />'),s=$('<div class="dynamic_cart-related-item-info" />'),d=($("<div />"),$('<button type="button" class="btn button-ghost button-ghost__small" title="'+a[e.currentLang]+'">'+{en:"Add",de:"Hinzuf&uuml;gen",fr:"Ajouter",es:"A&ntilde;adir",it:"Aggiungi"}[e.currentLang]+"</button>"));return s.append('<div class="related-product-name">
115'+t.name+'</div><div class="related-product-price">'+t.priceLow.replace(".",",")+(t.priceHigh.length?" &euro; - "+t.priceHigh.replace(".",",")+" &euro;":" &euro;</div>")),t.sale.length&&s.find(".related-product-price").addClass(" sale"),i.on("click",function(e){e.preventDefault(),p(t,d),setTimeout(function(){trapFocus($(".dynamic_order"))},300)}),n.append(r),s.append(d),i.append(n).append(s),i},u=function(t){var a={en:"Add "+t.name,de:t.name+" hinzuf&uuml;gen",fr:"Ajouter "+t.name,es:"A&ntilde;adir "+t.name,it:"Aggiungi "+t.name},i=$('<div class="dynamic_cart-item dynamic_cart-related-item" />'),n=$('<div class="dynamic_cart-related-image-wrap" />'),r=$('<img class="'+t.imagestyle+'" src="'+t.image2x+'" srcset="'+t.image+" 64w,"+t.image2x+' 128w" alt="'+t.name+'" />'),s=$('<div class="dynamic_cart-related-item-info" />'),d=($("<div />"),$('<button type="button" class="btn button-ghost button-ghost__small" title="'+a[e.currentLang]+'">'+{en:"Add",de:"Hinzuf&uuml;gen",fr:"Ajouter",es:"A&ntilde;adir",it:"Aggiungi"}[e.currentLang]+"</button>"));return s.append('<div class="related-product-name">'+t.name+'</div><div class="related-product-price">'+t.priceLow.replace(".",",")+(t.priceHigh.length?" &euro; - "+t.priceHigh.replace(".",",")+" &euro;":" &euro;</div>")),t.sale.length&&s.find(".related-product-price").addClass(" sale"),i.on("click",function(e){e.preventDefault(),p(t,d),setTimeout(function(){trapFocus($(".dynamic_order"))},300)}),n.append(r),s.append(d),i.append(n).append(s),i},p=function(a,i,r){var d={en:"Back to Order",de:"Zur&uuml;ck zur Bestellung",fr:"Revenir &agrave; la commande",es:"Volver al pedido",it:"Torna all'ordine"},c=$('<div class="dynamic_order" />'),o=$('<button type="button" class="dynamic_order-back" title="'+d[e.currentLang]+'"><i class="icon icon-arrow icon-arrow-left is-lg">'+d[e.currentLang]+"</i></button>"),l=document.activeElement;o.on("click",function(t){c.removeClass("is-shown"),l&&l.focus(),setTimeout(function(){c.remove()},300)}),c.append($('<div class="dynamic_cart-header sticky-top" />').append(o).append("<h3>"+{en:"Selections",de:"Auswahl",fr:"S&eacute;lection",es:"Selecci&oacute;n",it:"Selezioni"}[e.currentLang]+"</h3>")),$.ajax({timeout:8e3,type:"GET",url:"/ajax/quickview.html?cart_order=true&pcode="+a.code+"&ccode="+a.catcode+(a.textInput?"&commentItem="+e.itemsAdded[0].code:"")+(r?"&addOn_item=true":"")+(a.creditItem?"&credit_item="+a.creditItem:"")+(a.maxQty?"&max_qty="+a.maxQty:"")+(a.noWebOrdering?"&no_web_ordering=true":""),dataType:"html",success:function(r){var d={type:"Standard",onAdd:function(t,a){$(this).find("#prod_comment").length&&$(this).find("#prod_comment").val($(this).find("#prod_comment").val().toUpperCase());var r=$(this).serialize();$.ajax({timeout:8e3,type:"GET",url:e.orderingURL+"?"+r,dataType:"xml",success:function(t){for(var a=$(t).find("item, credit, commentItem"),d=f(r),o=[],l=0,m=0;m<d.length;m++)d[m].comment?a.filter('[pcode="'+d[m].comment+'"]').each(function(){o.push(d[m])}):a.filter('[pcode="'+d[m].code+'"]').each(function(){d[m].name=$(this).find("name").text(),d[m].imagestyle=$(this).find("imagestyle").text(),d[m].image=$(this).find("image").text(),d[m].image2x=$(this).find("image2x").text(),d[m].price=$(this).find("itemprice").text().replace(",","."),d[m].link=$(this).find("link").text(),$(this).find("gtm_category").length&&(d[m].gtm_category=$(this).find("gtm_category").text()),$(this).find("gtm_brand").length&&(d[m].gtm_brand=$(this).find("gtm_brand").text()),$(this).find("gtm_code").length&&(d[m].gtm_code=$(this).find("gtm_code").text()),$(this).find("gtm_name").length&&(d[m].gtm_name=$(this).find("gtm_name").text()),$(this).find("gtm_variant").length&&(d[m].gtm_variant=$(this).find("gtm_variant").text()),$(this).find("gtm_productcode").length&&(d[m].gtm_productcode=$(this).find("gtm_productcode").text()),$(this).find("gtm_ownercode").length&&(d[m].gtm_ownercode=$(this).find("gtm_ownercode").text()),$(this).find("gtm_stocknumber").length&&(d[m].gtm_stocknumber=$(this).find("gtm_stocknumber").text()),$(this).find("gtm_season").length&&(d[m].gtm_season=$(this).find("gtm_season").text()),o.push(d[m])});if(o.length){s(o),o[0].comment||(a.each(function(){l+=parseInt($(this).find("qty").text())}
115),e.itemCount=l,n(l));let t=$('<div class="item-added" tabindex="-1"><span class="item-added-button"><i class="icon icon-check is-sm"></i></span>'+{en:"In Cart",de:"In den Warenkorb",fr:"Ajout&eacute; au panier",es:"En la cesta",it:"Nel carrello"}[e.currentLang]+"</div>");i.replaceWith(t),c.removeClass("is-shown"),t[0].focus(),setTimeout(function(){c.remove()},300)}},error:function(){console.log("Error Add to Cart"),g()}})}};c.append($('<div class="dynamic_order-wrap" />').append(r));var l=c.find(".style_ordering-form");c.find(".js-ordering-module").length?(c.find(".js-ordering-module").each(function(){var t,e,i=$(this).attr("data-ordering-replace-id"),n=[],r={products:[]},s=[];if(i&&(n=c.find("#"+i)),n.length)if((s=n.find(".js-ordering-table")).length){if(t=s.attr("data-json-style-sort"))try{r.style_sort_order=JSON.parse(t)}catch(t){console.error(t)}if(e=s.attr("data-json-style-sort-pop"),t)try{r.style_sort_order_pop=JSON.parse(e)}catch(t){console.error(t)}if(s.attr("data-srcset-widths"))try{r.srcset_widths=JSON.parse(s.attr("data-srcset-widths"))}catch(t){console.error(t)}if(s.attr("data-size-breakpoints"))try{r.size_breakpoints=JSON.parse(s.attr("data-size-breakpoints"))}catch(t){console.error(t)}r.resize_url=s.attr("data-resize-url"),r.default_width=s.attr("data-default-width"),r.style_images="true"===s.attr("data-style-images"),r.owner_code=s.attr("data-owner-code"),r.hide_low_stock_icons=s[0].hasAttribute("data-hide-low-stock"),r.hide_descreased_price_icons=s[0].hasAttribute("data-hide-decreased-price-icons"),s.find(".js-ordering-subproduct").each(function(){var t=function(t){var e={};t.attr("data-code")&&(e.code=t.attr("data-code")),e.name=t.find(".js-ordering-name").text(),e.web_ordering=t[0].hasAttribute("data-webordering"),e.stock_notify=t[0].hasAttribute("data-stock-notify"),e.no_backorders=t[0].hasAttribute("data-no-backorders"),e.drop_shipped=t[0].hasAttribute("data-drop-shipped"),e.web_stock=t[0].hasAttribute("data-web-stock"),e.preorder=t[0].hasAttribute("data-preorder"),e.best_seller=t[0].hasAttribute("data-best-seller"),e.new_item=t[0].hasAttribute("data-new-item");var a=parseFloat(t.find(".js-ordering-price").text());
115if(isNaN(a)||(e.price=a),t.attr("data-list-price")){var i=parseFloat(t.attr("data-list-price"));isNaN(i)||(e.list_price=i)}var n=t.find(".js-ordering-available").text(),r=utilities.parseDate(n,{month_style:"short"}),s=/^([\d]{1,3})\s(Days)/.test(n);return e.backordered=s||null!=r,e.backordered?(e.in_stock=!1,e.available_text=s?n:r):(e.in_stock="Out"!==n&&"Sold Out"!==n,e.available_text="Out"==n?"Out of Stock":n),e}($(this));t.styles=[],$(this).find(".js-ordering-stylelist .js-ordering-style").each(function(){t.styles.push(function(t){var e={};t.attr("data-styleref")&&(e.style_ref=t.attr("data-styleref")),t.attr("data-styleabbrev")&&(e.style_abbrev=t.attr("data-styleabbrev")),t.attr("data-styleitemcode")&&(e.style_item_code=t.attr("data-styleitemcode")),t.attr("data-styleitemref")&&(e.style_item_ref=t.attr("data-styleitemref"));var a=t.find(".js-ordering-style-name").text();return a.match(/color/i)&&(a="Color"),e.style_name=a,e.style_item_name=t.find(".js-ordering-style-item-name").text(),e.style_item_model=t.find(".js-ordering-stocknum").text(),e}($(this)))}),r.products.push(t)}),$(this).attr("data-product-json",JSON.stringify(r)),n.hide(),$(this).on("ordering:colorSelected",function(t){console.log(t.detail),t.detail}),$(this).on("ordering:bulkAddToCart",function(t){if(console.log(t.detail),t.detail.length){var e="pcode=",a="";for(let i=0;i<t.detail.length;++i)a=(a=0==i?a+e+t.detail[i].code:a+"&"+e+t.detail[i].code)+"&incrementqty="+t.detail[i].quantity;CartHandler.order(a)}});var d={styleOrdering:null,styleOrderingBox:null,orderingArea:null,orderQty:null,submitButton:null,orderAlert:null};d.styleOrdering=$(".descpage").find("#dynamicCart"),d.styleOrderingBox=d.styleOrdering.find(".style_ordering-box"),d.orderingArea=d.styleOrdering.find(".ordering_area"),d.orderQty=d.styleOrdering.find(".ordering_qty"),d.priceText=d.styleOrdering.find(".afterpay-full_price"),d.submitButton=d.orderingArea.find(".style_ordering-add_cart");var o=!1;$(this).on("ordering:selectionUpdate",function(t){console.log(t.detail),null!=d.submitButton&&$(document).find("#dynamicCart").find(".style_ordering-add_cart").addClass("disabled"),o=!0;var e=$(document).find("#dynamicCart").find(".ordering_area"),i=e.find(".style_ordering-inventory .col-12"),n=e.find(".order_input");e.find(".style_ordering-submits").find(".style_ordering-add_cart");if(e.length){var r=t.detail.all_selected;if($(".alert-wrap").length&&$(".alert-wrap").remove(),r&&t.detail.matches.length){var s=t.detail.matches[0].available_text,c=(t.detail.matches[0].backordered,t.detail.matches[0].code),l=(t.detail.matches[0].name,t.detail.matches[0].drop_shipped),u=t.detail.matches[0].in_stock,p=t.detail.matches[0].no_backorders,h=t.detail.matches[0].preorder,g=(t.detail.matches[0].price,t.detail.matches[0].stock_notify,t.detail.matches[0].web_ordering),f=t.detail.matches[0].web_stock;a.noWebOrdering&&(g=!0,f=!0),g&&(l?u?m():p||(m(),-1===s.indexOf("Days")&&h&&d.submitButton.text("Pre-Order")):u?f&&m():p||(m(),-1===s.indexOf("Days")&&h&&d.submitButton.text("Pre-Order"))),n.length?n.val(c):i.prepend("<input type='hidden' class='order_input' name='pcode' value='"+c+"' /> ")}}}),$(this).on("ordering:stockNotify",function(t){var e="/notifystock.html?pcode="+t.detail;generateNotifyModal(e,"Stock Alert")}),l.length&&c.find(".qty_section").each(function(){utilities.enhance_qty($(this))}),$(".ordering_qty").on("change",function(t){if(null!=itemPrice&&0==o){var e=$(".ordering_qty").val()*itemPrice;d.submitButton.html("Add To Cart - "+e.toFixed(2)+"  &euro;")}}),initializeOrderingApp(this)}else console.error(".js-ordering-table not found");else console.error("Invalid data-ordering-replace-id");function m(){null!=d.submitButton&&$(document).find("#dynamicCart").find(".style_ordering-add_cart").removeClass("disabled"),o=!1}}),l.on("submit",function(t){t.preventDefault(),c.find(".match_qty").length&&c.find(".match_qty").val(c.find(".ordering_qty").val()),$(this).trigger("addtocart")}).on("addtocart",function(t,e){var a=$(this);d.onAdd.call(a,t,e)}),a.maxQty&&parseInt(a.maxQty)>1&&c.find(".qty_section").each(function(){utilities.enhance_qty($(this))})):l.length&&(c.find(".qty_section").each(function(){utilities.enhance_qty($(this))}),l.on("submit",function(t){t.preventDefault(),c.find(".match_qty").length&&c.find(".match_qty").val(c.find(".ordering_qty").val()),$(this).trigger("addtocart")}).on("addtocart",function(t,e){var a=$(this);d.onAdd.call(a,t,e)})),c.find(".form-group").enhanceInput(),t.cartPanel.find(".dynamic_cart").after(c),setTimeout(function(){c.addClass("is-shown"),setTimeout(function(){o.focus()},300)},50)},error:function(){console.log("Error Quick View"),g()}})},h=function(a,i){i=void 0!==i?i:"";var d,p,h=$(a).find("item, credit"),g=$(a).find("relatedItem"),y=$(a).find("extraItem"),_=$(a).find("addonItem"),v=parseFloat($(a).find("subtotal").text().replace(",",".")),x=parseFloat($(a).find("total").text().replace(",",".")),b=[],k=[],C=[],w=[],A=[],I=0,L=null,S=null;if(i){S=f(i);for(var O=0;O<S.length;O++)h.filter('[pcode="'+S[O].code+'"]').each(function(){S[O].name=$(this).find("name").text(),$(this).find("imagestyle").length&&(S[O].imagestyle=$(this).find("imagestyle").text()),$(this).find("image").length&&(S[O].image=$(this).find("image").text()),$(this).find("image2x").length&&(S[O].image2x=$(this).find("image2x").text()),$(this).find("itemprice").length&&(S[O].price=$(this).find("itemprice").text().replace(",",".")),$(this).find("link").length&&(S[O].link=$(this).find("link").text()),$(this).find("gtm_category").length&&(S[O].gtm_category=$(this).find("gtm_category").text()),$(this).find("gtm_brand").length&&(S[O].gtm_brand=$(this).find("gtm_brand").text()),$(this).find("gtm_code").length&&(S[O].gtm_code=$(this).find("gtm_code").text()),$(this).find("gtm_name").length&&(S[O].gtm_name=$(this).find("gtm_name").text()),$(this).find("gtm_variant").length&&(S[O].gtm_variant=$(this).find("gtm_variant").text()),$(this).find("gtm_productcode").length&&(S[O].gtm_productcode=$(this).find("gtm_productcode").text()),$(this).find("gtm_ownercode").length&&(S[O].gtm_ownercode=$(this).find("gtm_ownercode").text()),$(this).find("gtm_stocknumber").length&&(S[O].gtm_stocknumber=$(this).find("gtm_stocknumber").text()),$(this).find("gtm_season").length&&(S[O].gtm_season=$(this).find("gtm_season").text()),b.pu
115sh(S[O])});h.each(function(){I+=parseInt($(this).find("qty").text())}),g.length&&(g.each(function(){var t={};t.code=$(this).find("code").text(),t.name=$(this).find("name").text(),t.imagestyle=$(this).find("imagestyle").text(),t.image=$(this).find("image").text(),t.image2x=$(this).find("image2x").text(),t.priceLow=$(this).find("priceLow").text().replace(",","."),t.priceHigh=$(this).find("priceHigh").text().replace(",","."),t.link=$(this).find("link").text(),t.sale=$(this).find("sale").text(),k.push(t)}),e.relatedItems=k),y.length&&(y.each(function(){var t={};t.code=$(this).find("code").text(),t.name=$(this).find("name").text(),t.image=$(this).find("image").text(),t.image2x=$(this).find("image2x").text(),t.priceLow=$(this).find("priceLow").text().replace(",","."),t.priceHigh=$(this).find("priceHigh").text().replace(",","."),t.link=$(this).find("link").text(),t.sale=$(this).find("sale").text(),C.push(t)}),e.extraItems=C),_.length&&(_.each(function(){var t={};if(t.code=$(this).find("code").text(),t.name=$(this).find("name").text(),t.catcode=$(this).find("catcode").text(),t.imagestyle=$(this).find("imagestyle").text(),t.image=$(this).find("image").text(),t.image2x=$(this).find("image2x").text(),t.price=$(this).find("price").text().replace(",","."),t.link=$(this).find("link").text(),t.colors=$(this).find("colors").text(),t.sale=$(this).find("sale").text(),t.note=$(this).find("note").text(),t.textInput=$(this).find("textInput").text(),t.creditItem=$(this).find("creditItem").text(),t.minTotal=$(this).find("minTotal").text(),t.maxQty=$(this).find("maxQty").text(),t.maxQty){var e=$(this).find("qualifyingAdded").text(),a=parseInt(e),i=parseInt(t.maxQty);isNaN(i)||isNaN(a)||a<i&&(t.maxQty=e)}t.noWebOrdering=$(this).find("noWebOrdering").text(),t.minTotal?v>=t.minTotal&&w.push(t):w.push(t)}),e.addOnItems=w),e.cartTotal=x,e.itemsAdded=b,e.itemCount=I,b.length>0&&s(b),n(I),L=function(){for(var a={en:"View Cart & Checkout",de:"Warenkorb & Kasse ansehen",fr:"Mon panier",es:"Ver cesta y pagar",it:"Visualizza il carrello"},i=$("<div />"),n=$('<div class="dynamic_cart-added-item-buttons" />'),s=$('<button type="button" class="btn button-ghost text-wrap">'+{en:"Continue Shopping",de:"Mit dem Einkauf fortfahren",fr:"Continuer mon shopping",es:"Seguir comprando",it:"Continua gli acquisti"}[e.currentLang]+'</button><a class="btn button-cart text-wrap" href="/workingorder.html">'+a[e.currentLang]+"</a>"),d=($('<a class="btn button-cart text-wrap" href="/workingorder.html">'+a[e.currentLang]+"</a>"),$('<div class="dynamic_cart-added" />')),c=$('<div class="dynamic_cart-addon-list" />'),p=$('<div class="dynamic_cart-related" />'),h=$('<div class="dynamic_cart-related" />'),g=0;g<e.itemsAdded.length;g++)d.append(o(e.itemsAdded[g]));if(e.addOnItems.length){for(c.append("<h3>"+{en:"Add-Ons For This Product",de:"Zusatzartikel f&uuml;r dieses Produkt",fr:"Produits compl&eacute;mentaires",es:"Productos complementarios",it:"Potrebbe piacerti anche"}[e.currentLang]+"</h3>"),g=0;g<e.addOnItems.length;g++)c.append(l(e.addOnItems[g]));d.append(c)}if(s.on("click",r),d.append(n),n.append(s),i.append(d),p.append("<h3>"+{en:"Other Items To Consider",de:"Andere Artikel in Erw&auml;gung ziehen",fr:"Vous aimerez s&ucirc;rement aussi",es:"Tambi&eacute;n puede que te guste",it:"Potrebbe piacerti anche"}[e.currentLang]+"</h3>"),e.relatedItems.length){for(g=0;g<e.relatedItems.length;g++)p.append(m(e.relatedItems[g]));i.append(p)}if(h.append("<h3>"+{en:"Add Something Fun to Your Cart",de:"Einige Geschenkideen f&uuml;r Tennisfans",fr:"Ajoutez un peu de fantaisie &agrave; votre panier",es:"&#161;Dale un toque divertido a tu compra!",it:"Aggiungi un tocco di divertimento al tuo carrello"}[e.currentLang]+"</h3>"),e.extraItems.length){for(g=0;g<e.extraItems.length;g++)h.append(u(e.extraItems[g]));i.append(h)}return t.cartPanel.find(".dynamic_cart-header h3").html({en:"Item Added!",de:"Der Artikel wurde hinzugef&uuml;gt!",fr:"Ajout&eacute; au panier !",es:"&iexcl;Se ha a&ntilde;adido el art&iacute;culo!",it:"Il prodotto &egrave; stato aggiunto! "}[e.currentLang]),i}()}else h.each(function(){var t={};$(this).is("item")&&($(this).find("code").length&&(t.code=$(this).find("code").text()),$(this).find("qty").length&&(t.qty=parseInt($(this).find("qty").text())),$(this).find("name").length&&(t.name=$(this).find("name").text()),$(this).find("imagestyle").length&&(t.imagestyle=$(this).find("imagestyle").text()),$(this).find("image").length&&(t.image=$(this).find("image").text()),$(this).find("image2x").length&&(t.image2x=$(this).find("image2x").text()),$(this).find("itemprice").length&&(t.price=$(this).find("itemprice").text().replace(",",".")),$(this).find("link").length&&(t.link=$(this).find("link").text()),$(this).find("note").length&&(t.note=$(this).find("note").text()),$(this).find("hasComponent").length&&(t.hasComponent=$(this).find("hasComponent").text()),I+=t.qty,A.push(t))}
115),e.cartItems=A,e.cartSubtotal=v,e.cartTotal=x,e.itemCount=I,I?L=c():(d=$('<div class="empty_cart"><i class="icon icon-empty_cart"></i><p class="h2">'+{en:"Your Cart Is Empty",de:"Der Warenkorb ist leer",fr:"Votre panier est vide",es:"Tu cesta est&aacute; vac&iacute;a",it:"Il carrello &egrave; vuoto"}[e.currentLang]+"</p><p>"+{en:"Please continue shopping to add something to your cart.",de:"Weitere Artikel in den Warenkorb legen",fr:"Ajoutez des articles &agrave; votre panier.",es:"Contin&uacute;a tus compras a&ntilde;adiendo algo a la cesta.",it:"Continua gli acquisti per aggiungere qualcosa al carrello."}[e.currentLang]+"</p></div>"),(p=$('<button type="button" class="btn button-ghost">'+{en:"Continue Shopping",de:"Mit dem Einkauf fortfahren",fr:"Continuer mon shopping",es:"Seguir comprando",it:"Continua gli acquisti"}[e.currentLang]+"</button>")).on("click",r),d.append(p),t.cartPanel.find(".dynamic_cart-header h3").text({en:"In Your Cart",de:"In den Warenkorb",fr:"Ajout&eacute; au panier",es:"En la cesta",it:"Nel carrello"}[e.currentLang]),L=d);t.cartPanel.find(".dynamic_cart-cart").html(L)},g=function(){console.log("Order Error")},f=function(t){for(var n=t.split("&"),r=[],s=[],d=/^\d+$/,c=0;c<n.length;c++)n[c].split("=").length>1&&r.push(new i(n[c].split("=")[0].toUpperCase(),n[c].split("=")[1].toUpperCase()));for(var o=0;o<r.length;o++)""!=r[o].value&&(0==r[o].key.indexOf("PCODE")?r.length>o+1&&(0!=r[o+1].key.indexOf("QTY")&&0!=r[o+1].key.indexOf("INCREMENTQTY")||""==r[o+1].value||!d.test(r[o+1].value)||(s.push(new a(r[o].value,r[o+1].value)),o++)):0==r[o].key.indexOf("COMMENT")?s.push({comment:r[o].key,value:r[o].value}):0!=r[o].key.indexOf("PCODE")&&0!=r[o].key.indexOf("QTY")&&0!=r[o].key.indexOf("INCREMENTQTY")&&d.test(r[o].value)&&s.push(new a(r[o].key,r[o].value)));return e.cartItems=s,s},y=function(){var a,i,n,s,d,c,o;a={en:"Close Cart",de:"Warenkorb schlie&szlig;en",fr:"Fermer mon panier",es:"Cerrar la cesta",it:"Chiudi il carrello"},i=$('<div class="offcanvas-collapse is-right" id="dynamicCart" tabindex="-1"><div class="offcanvas-collapse-inner"></div></div>'),n=$('<div class="dynamic_cart" />'),s=$('<div class="dynamic_cart-header sticky-top"><h3></h3></div>'),d=$('<div class="dynamic_cart-cart" />'),c=$('<button type="button" class="icon icon-x dynamic_cart-header-close" title="'+a[e.currentLang]+'">'+a[e.currentLang]+"</button>"),o=$('<div class="offcanvas-backdrop" />'),c.on("click",r),o.on("click",function(){$("body").removeClass("is-fixed"),$(this).detach(),i.removeClass("open"),t.returnFocusOnCloseElement&&t.returnFocusOnCloseElement.focus(),$("body").css("top","").addClass("sticky-ignore-next-scroll"),window.scrollTo(0,e.lastScroll),i.find(".dynamic_order").length&&setTimeout(function(){i.find(".dynamic_order").remove()},300)}),n.append(s.append(c)).append(d),i.find(".offcanvas-collapse-inner").append(n),$("body").append(i),t.cartLink.on("click",function(a){if($(window).width()>=992){t.returnFocusOnCloseElement=t.cartLink[0],a.preventDefault();var n=$(this);$.ajax({timeout:8e3,type:"GET",url:e.orderingURL,dataType:"xml",success:function(t){h(t),0===e.itemCount?n.unbind("click")[0].click():(i.hasClass("open")||(e.lastScroll=window.scrollY,$("body").addClass("sticky-ignore-next-scroll"),$("body").css("top","-"+e.lastScroll+"px"),i.toggleClass("open"),$("body").addClass("is-fixed"),i.after(o)),setTimeout(function(){i.focus(),trapFocus(i)},300))},error:function(){g(),n.unbind("click")[0].click()}})}}),t.cartPanel=i,t.cartBackdrop=o};return{initCart:function(a,i,n){t.cartLink=a,i&&(e.freeShip=i),void 0!==n&&(e.currentLang=n),y()},order:function(a){!function(a){e.cartLoaded=!1,$.ajax({timeout:8e3,type:"GET",url:e.orderingURL+"?"+a,dataType:"xml",success:function(i){t.cartPanel.hasClass("open")||(e.lastScroll=window.scrollY,$("body").addClass("is-fixed sticky-ignore-next-scroll"),$("body").css("top","-"+e.lastScroll+"px"),t.returnFocusOnCloseElement=document.activeElement,t.cartPanel.addClass("open"),t.cartPanel.after(t.cartBackdrop)),h(i,a),setTimeout(function(){t.cartPanel.find(".dynamic_cart-header button").focus(),trapFocus($("#dynamicCart"))},300)},error:function(){console.log("Error Send Order"),g()}})}(a)}}}();$(function(){$(".cart-link")&&CartHandler.initCart($(".cart-link"),50,utilities.pageLang().getLang())});
116/* End Dynamic Cart */
117
118
119// jQuery Plugins
120(function( $ ){
121	$.fn.enhanceInput = function() {
122		/* Shifting Input Labels */
123		this.each(function() {
124			var input_target = $(this).find('input,textarea').not("[type=checkbox]"),
125				input_label = $(this).find('label');
126
127			// On load, remove lifted and zero classes for transition / transform timing events
128			if (input_label.length) {
129				if (input_label.hasClass("is-lifted") && input_target.val().length === 0) {
130					input_label.removeClass('is-lifted');
131				}
132
133				if (input_label.hasClass("zero")) {
134					setTimeout(function () { input_label.removeClass("zero") }, 50);
135				}
136			}
137
138			if (input_target.length) {
139				// On focus, move label into upwards position
140				input_target.on('focus', function() {
141
142					if ( !input_label.hasClass('not-lifted') ) {
143						$(this).addClass('is-active');
144						input_label.addClass('is-lifted');
145					}
146				});
147
148				// On blur, if the field is empty, put the label back into the input
149				input_target.on('blur',function(){
150					if( !$(this).val() ){
151						input_label.removeClass('is-lifted');
152						$(this).removeClass('is-active');
153				// Else leave the label in lifted position
154					} else {
155						$(this).removeClass('is-active');
156						$(this).removeClass('is-required');
157						input_label.removeClass('is-required');
158					}
159				});
160			}
161		});
162
163		return this;
164	},
165
166	$.fn.imgRotator = function(options) {
167		/* Rotating Banners */
168		this.each(function() {
169
170			var isOneSlide = false;
171
172			if ($(this).hasClass('one-slide')) {
173				isOneSlide = true;
174			}
175
176			if (!isOneSlide) {
177
178				var defaults = {
179						indicators: true,
180						interval: 4000
181					},
182					settings = $.extend({},defaults,options),
183
184					objects = {
185						rotator: null,
186						indicatorWrap: null
187					},
188
189					state = {
190						slides: []
191					};
192
193				var applyCarousel = function() {
194					var innerRotate = $('<div class="carousel-inner"><\/div>');
195
196					objects.rotator.addClass("carousel slide").attr('data-ride', 'carousel');
197					objects.rotator.find(".image-rotator__image-wrapper").addClass("carousel-item").first().addClass("active");
198					objects.rotator.wrapInner(innerRotate);
199
200					objects.rotator.carousel({interval: settings.interval});
201
202					if (settings.indicators) {
203						createIndicators();
204					}
205				},
206
207				removeCarousel = function() {
208					objects.rotator.removeClass("carousel slide");
209					objects.rotator.find(".image-rotator__image-wrapper").unwrap().removeClass("carousel-item active");
210
211					if (settings.indicators) {
212						removeIndicators();
213					}
214
215					objects.rotator.carousel("dispose");
216				},
217
218				createIndicators = function() {
219					objects.indicatorWrap = $('<div class="image-rotator__navigation-tabs"><\/div>');
220
221					for (var i = 0; i < state.slides.length; i++) {
222
223						var newText = $('<button class="image-rotator__navigation-tab-title" data-slide="' + state.slides[i].slideNum + '">' + state.slides[i].innerText + '</button>');
224						state.slides[i].text.replaceWith(newText);
225						state.slides[i].text = newText;
226
227						objects.indicatorWrap.append(state.slides[i].text);
228						state.slides[i].text.on("click", function(e) {
229							objects.rotator.carousel($(this).data("slide"));
230						});
231					}
232
233					/* Add the play/pause button to the end of the indicators */
234					objects.indicatorWrap.append('<button id="image-rotator__navigation-control" class="image-rotator__navigation-tab-title play" aria-label="play/pause button"><span></span></button>');
235
236					objects.rotator.after(objects.indicatorWrap);
237
238					/* Play/pause button controls */
239					$('#image-rotator__navigation-control').on("click", function(e) {
240						if($('#image-rotator__navigation-control').hasClass('play')) {
241							$('#image-rotator__navigation-control').removeClass('play');
242							$('#image-rotator__navigation-control').addClass('pause');
243							objects.rotator.carousel("pause");
244						} else if($('#image-rotator__navigation-control').hasClass('pause')) {
245							$('#image-rotator__navigation-control').removeClass('pause');
246							$('#image-rotator__navigation-control').addClass('play');
247							objects.rotator.carousel("next");
248							objects.rotator.carousel("cycle");
249						}
250					});
251
252					tieIndicators();
253				},
254
255				removeIndicators = function() {
256					objects.indicatorWrap.remove();
257				},
258
259				tieIndicators = function() {
260					for (var i = 0; i < state.slides.length; i++) {
261						if (state.slides[i].slide.hasClass("active")) {
262							state.slides[i].text.addClass("is-active");
263						}
264					}
265
266					objects.rotator.on("slid.bs.carousel", function() {
267						for (var i = 0; i < state.slides.length; i++) {
268							if (state.slides[i].text.hasClass("is-active")) {
269								state.slides[i].text.removeClass("is-active");
270							}
271							if (state.slides[i].slide.hasClass("active")) {
272								state.slides[i].text.addClass("is-active");
273							}
274						}
275					});
276				},
277
278				pairImages = function() {
279					// Connects slide container, image, and text
280					objects.rotator.find(".image-rotator__image-wrapper").each(function() {
281						var slideObject = {};
282
283						slideObject.slide = $(this);
284						slideObject.image = $(this).find(".image-rotator__image-container");
285						slideObject.text = $(this).find(".image-rotator__navigation-tab-title");
286						slideObject.innerText = slideObject.text.text();
287						slideObject.slideNum = slideObject.text.data('slide');
288						state.slides.push(slideObject);
289					});
290				}
291
292				objects.rotator = $(this);
293				pairImages();
294
295				if (window.innerWidth >= 768){
296					applyCarousel();
297				}
298
299				$(window).on('resize', function (){
300					if (window.innerWidth >= 768){
301						if (!objects.rotator.hasClass("carousel")) {
302							applyCarousel();
303						}
304					} else {
305						if (objects.rotator.hasClass("carousel")) {
306							removeCarousel();
307						}
308					}
309				});
310			}
311
312		});
313
314		return this;
315	};
316})( jQuery );
317// End jQuery Plugins
318
319var utilities = {
320	parseDate: function(text,options) {
321		var defaults = {
322				month_style: "long", // valid options: "short", "long"
323				date_ordinal: false, // boolean: include ordinal suffix with day. Examples: 1st, 2nd, 23rd.
324				date_first: true, // boolean: date format is date then monthl i.e. unAmerican
325				decode_html_entities: false // needed to pass encoded characters to js modules
326			},
327			settings = $.extend({},defaults,options),
328			date,
329			short_months = {
330				en: ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],
331				fr: ["janv.","f&eacute;vr.","mars","avril","mai","juin","juil.","ao&#251;t","sept.","oct.","nov.","d&eacute;c."],
332				de: ["Jan.","Feb.","Mrz.","Apr.","Mai","Jun.","Jul.","Aug.","Sept.","Okt.","Nov.","Dez."],
333				it: ["gen.","feb.","mar.","apr.","mag.","giu.","lug.","ago.","set.","ott.","nov.","dic."],
334				es: ["enero","feb.","marzo","abr.","mayo","jun.","jul.","agosto","sept.","oct.","nov.","dic."]
335			},
336			long_months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
336November", "December"],
337			date_regex = /^[\d]{1,2}\.[\d]{1,2}$/i,
338			month_int,
339			date_int,
340			result = null;
341
342		if ( date_regex.test(text) ) {
343			date = text.split(".", 2);
344
345			if(settings.date_first) {
346				date_int = parseInt(date[0]);
347				month_int = parseInt(date[1]);
348
349				result = date_int + ((settings.date_ordinal)?utilities.getOrdinal(date_int):"") + " " + ((settings.month_style === "long")?long_months[month_int - 1]:short_months[utilities.pageLang().getLang()][month_int - 1]);
350			} else {
351				month_int = parseInt(date[0]);
352				date_int = parseInt(date[1]);
353
354				result = ((settings.month_style === "long")?long_months[month_int - 1]:short_months[utilities.pageLang().getLang()][month_int - 1]) + " " + date_int + ((settings.date_ordinal)?utilities.getOrdinal(date_int):"");
355			}
356		}
357		
358		if (result && settings.decode_html_entities) {
359			const parser = new DOMParser();
360			const decodedDocument = parser.parseFromString(result, 'text/html');
361			result =  decodedDocument.body.textContent;
362		}
363
364		return result;
365	},
366
367	pageLang: function(){
368		function findPageLang(){
369			lang = $("html").hasClass("lang_de") ? "de" : $("html").hasClass("lang_fr") ? "fr" : $("html").hasClass("lang_it") ? "it" : $("html").hasClass("lang_es") ? "es" : "en";
370			return lang;
371		}
372		var lang = null;
373		return {
374			getLang: function(){
375				var result = !lang ? findPageLang() : lang;
376				return result;
377			}
378		};
379	},
380	
381	getOrdinal: function(n) {
382		var ordinals = ["th","st","nd","rd"],
383			index = 0;
384
385		n = Math.abs(n);
386
387		if (n%10 < 4 && (n%100 < 11 || n%100 > 13)) {
388			index = n%10;
389		}
390
391		return ordinals[index];
392	},
393
394	digitsOnly: function(e) {
395		if (!e) {
396			var e = window.event
397		}
398		var code;
399		if (e.keyCode) {
400			code = e.keyCode;
401		} else if (e.which) {
402			code = e.which;
403		}
404		var character = String.fromCharCode(code);
405		// Allow control keys, but restrict other input
406		if (!e.ctrlKey && code != 8 && code != 9 && code != 13 && code != 35 && code != 36 && code != 37 && (code != 39 || (code == 39 && character == "'"))) {
407			if (character.match(/[0-9]/g)) {
408				return true;
409			} else {
410				return false;
411			}
412		}
413	},
414
415	isValidEmail: function(email){
416		var pattern = new RegExp(/^[A-Za-z0-9._%\-+]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,4}$/);
417		return pattern.test(email);
418	},
419
420	recaptchaRequiredMessage: function(lang, className) {
421		var recaptchaMessage = {
422			en: '<div class="recaptcha-disclaimer ' + (className ? ' ' + className : '') + '">This site is protected by reCAPTCHA and the Google <a class="text-link" href="https://policies.google.com/privacy">Privacy Policy</a> and <a class="text-link" href="https://policies.google.com/terms">Terms of Service</a> apply.</div>',
423			de: '<div class="recaptcha-disclaimer ' + (className ? ' ' + className : '') + '">Diese Website ist durch reCAPTCHA gesch&uuml;tzt. Es gelten die <a class="text-link" href="https://policies.google.com/privacy">Datenschutzbestimmungen</a> und <a class="text-link" href="https://policies.google.com/terms">Nutzungsbedingungen</a> von Google.</div>',
424			fr: '<div class="recaptcha-disclaimer ' + (className ? ' ' + className : '') + '">Ce site est prot&eacute;g&eacute; par reCAPTCHA. Les <a class="text-link" href="https://policies.google.com/privacy">r&egrave;gles de confidentialit&eacute;</a> et les <a class="text-link" href="https://policies.google.com/terms">conditions d\'utilisations</a> de Google s\'appliquent.</div>',
425			it: '<div class="recaptcha-disclaimer ' + (className ? ' ' + className : '') + '">Questo sito &egrave; protetto da reCAPTCHA e viene applicata <a class="text-link" href="https://policies.google.com/privacy">l\'informativa sulla Privacy</a> e i <a class="text-link" href="https://policies.google.com/terms">Termini e Condizioni</a> di Google.</div>',
426			es: '<div class="recaptcha-disclaimer ' + (className ? ' ' + className : '') + '">Esta web est&aacute; protegida por reCAPTCHA y se aplican los <a class="text-link" href="https://policies.google.com/terms">T&eacute;rminos y Condiciones</a> y la <a class="text-link" href="https://policies.google.com/privacy">Pol&iacute;tica de Privacidad</a> de Google.</div>'
427		};
428		return recaptchaMessage[lang];
429	},
430	validateRecaptcha: function(container, actionText) {
431		
432		if (!actionText)
433			actionText = 'submit';
434		grecaptcha.ready(function() {
435			grecaptcha.execute('6LdsTEsfAAAAAKdjlfEVmJTHEVEUwX8NEO_j_l6-', {action: actionText}).then(function(token) {
436				var existing = container.find('input[name=g-recaptcha-response]');
437				if (existing.length)
438					$(existing[0]).val(token);
439				else
440					container.append('<input type="hidden" name="g-recaptcha-response" value="'+token+'" />');
441				container.submit();
442			});
443		});
444	},
445
446	generateModalMarkup: function(options) {
447		var defaults = {
448			hasHeader: true,
449			hasSubline: false,
450			hasFooter: false,
451			headingType: "h2",
452			centerModalY: true,
453			fullModal: true,
454			returnFocusOnCloseElement: null
455		},
456		settings = $.extend({},defaults,options);
457		var closeText = {
458			en: 'Close',
459			de: 'Schlie&szlig;en',
460			fr: 'Fermer',
461			it: 'Chiudi',
462			es: 'Cerrar'
463		};
464
465		// Construct Modal Markup
466		var modal = $('<div class="modal" tabindex="-1" role="dialog" aria-labelledby="" aria-hidden="true"><div class="modal-dialog" role="document"><div class="modal-content"><\/div><\/div><\/div>'),
467			modalDialog = modal.find(".modal-dialog"),
468			modalContent = modal.find(".modal-content"),
469			modalHeader = null,
470			modalBody = $('<div class="modal-body"><\/div>'),
471			modalFooter = null,
472			modalClose = $('<button type="button" class="close" data-dismiss="modal" aria-label="'+ closeText[utilities.pageLang().getLang()] +'"><span class="icon icon-x icon-x-large" aria-hidden="true">'+ closeText[utilities.pageLang().getLang()] +'<\/span><\/button>
472');
473
474		if (settings.hasHeader) {
475			modalHeader = $('<div class="modal-header"><\/div>');
476			if (settings.hasSubline) {
477				modalHeader.append($('<div class="modal-header-wrap"><h1 class="modal-title"><\/h1><div class="modal-subline"><\/div><\/div>')).append(modalClose);
478			} else {
479				modalHeader.append($('<h1 class="modal-title"><\/h1>')).append(modalClose);
480			}
481
482			modalContent.append(modalHeader);
483		} else {
484			modalBody.append(modalClose);
485		}
486
487		modalContent.append(modalBody);
488
489		if (settings.hasFooter) {
490			modalFooter = $('<div class="modal-footer"><\/div>');
491
492			modalContent.append(modalFooter);
493		}
494
495		// Apply modifiers
496		if (settings.centerModalY) {
497			modalDialog.addClass("modal-dialog-centered");
498		}
499
500		if (settings.fullModal) {
501			modalDialog.addClass("modal-full");
502		}
503
504		function setReturnFocusOnCloseElement() {
505			if (document.activeElement) { // can't set focused element if there isn't one in the document
506				if (!modal[0].contains(document.activeElement)) { //if the current focus isnt in the current modal, set returnFocusOnCloseElement
507					settings.returnFocusOnCloseElement = document.activeElement;
508				}
509			}
510		}
511
512		// set return focus element on initialization
513		setReturnFocusOnCloseElement();
514
515		// reset return focus element if modal is reopened
516		modal.on('shown.bs.modal', function(e) {
517			setReturnFocusOnCloseElement()
518		})
519
520		// return focus previous focused element on close
521		modal.on('hidden.bs.modal', function(e) {
522			if (settings.returnFocusOnCloseElement) {
523				settings.returnFocusOnCloseElement.focus();
524			}
525		})
526
527		return modal;
528	},
529
530	enhance_qty: function(qtySection, styleOrdering){
531		if(!qtySection.hasClass("enhanced")){
532			var qty_input = qtySection.find(".ordering_qty"),
533				qty_wrap = qtySection.find(".qty_button_wrap"),
534				plus = $('<button type="button" class="increment btn btn-outline-dark"><span class="icon icon-plus is-sm">Increment Quantity<\/span><\/button>
534'),
535				minus = $('<button type="button" class="decrement btn btn-outline-dark"><span class="icon icon-minus is-sm">Decrement Quantity<\/span><\/button>'),
536				amount = $('<span class="qty_entered"><\/span>'),
537				label = qtySection.find("label");
538				
539			var input_id = qty_input.attr('id');
540			if (input_id) {
541				minus.attr('aria-controls', input_id);
542				plus.attr('aria-controls', input_id);
543			}
544
545			qty_wrap.prepend($('<div class="input-group-prepend"><\/div>').append(minus)).append($('<div class="input-group-append"><\/div>').append(plus)),
546			label.append(amount);
547
548			var initial_qty = parseInt(qty_input.prop("value"));
549			if(!(isNaN(initial_qty) || initial_qty <= 0)) {
550				amount.text(" " + initial_qty);
551			}
552
553			// Are there already two demo rackets in the cart? If so, disable quantity input
554			/*
555			if ($('#demoqty').length) {
556				var num_demos = $('#demoqty').val();
557				console.log(num_demos);
558				if(num_demos >= 2) {
559					minus.prop('disabled',true);
560					qty_input.prop('disabled',true);
561					plus.prop("disabled",true);
562				}
563			}
564			*/
565			if ($('#isdemo').length) {
566				var isdemo = $('#isdemo').val();
567				if(isdemo == true) {
568					minus.prop('disabled',true);
569					qty_input.prop('readonly',true);
570					plus.prop("disabled",true);
571				}
572			}
573
574			minus.click(function(e){
575				e.preventDefault();
576				var qty = parseInt(qty_input.prop("value"));
577				if(isNaN(qty) || qty <= 1) {
578					qty = 1;
579				}
580				else {
581					qty--;
582				}
583				qty_input.prop("value",qty).change();
584			});
585
586			plus.click(function(e){
587				e.preventDefault();
588				var qty = parseInt(qty_input.prop("value"));
589				if(isNaN(qty) || qty < 0) {
590					qty = 1;
591				}
592				else
593				{
594					var max_qty = parseInt(qty_input.data("max_qty"));
595					if(isNaN(max_qty) || qty < max_qty) {
596						qty++;
597					}
598				}
599				qty_input.prop("value",qty).change();
600			});
601
602			qty_input.keydown(function(e) {
603				if(e.which == 38 )
604				{
605					plus.click();
606				}
607				if(e.which == 40 )
608				{
609					minus.click();
610				}
611			});
612
613			qty_input.on("change",function(){
614				var qty = parseInt(qty_input.prop("value"));
615				if(isNaN(qty) || qty <= 0) {
616					qty = 1;
617					qtySection.prop("value",qty).change();
618				}
619				amount.text(" " + qty);
620			});
621
622			qtySection.addClass("enhanced");
623		}
624	},
625
626	initDescPageTop: function(options) {
627		var defaults = {
628			type: "Standard",
629			ignoreDynamic: false,
630			onAdd: function(e,obj){
631				CartHandler.order($(this).serialize());
632			}
633		};
634
635		var settings = $.extend({},defaults,options || {});
636
637		return function() {
638			var pagetop = $(this);
639			var ProductImageViewer = null;
640			var gtm_element;
641
642			if(pagetop.hasClass('gtm_detail'))
643			{
644				gtm_element = pagetop;
645			}
646			else
647			{
648				gtm_element = pagetop.find('.gtm_detail');
649			}
650
651			if(gtm_element.length)
652			{
653				gtm_element = gtm_element.eq(0);
654				var gtm_product_obj = {};
655
656				$.each(['name','id','price','brand','category','season','stock_number','styles'],function(index,key){
657					var attr_value = gtm_element.attr('data-gtm_detail_'+key);
658					if(typeof attr_value !== 'undefined') {
659						if (['name', 'id', 'brand', 'category'].includes(key)) {
660              				gtm_product_obj['item_' + key] = attr_value;
661            			} else {
662               				 gtm_product_obj[key] = attr_value;
663          			  }
664					}
665				});
666
667				if (gtm_product_obj.styles) {
668					var stylesArray = gtm_product_obj.styles.split(',');
669					var category2 = new Set();
670					var category3 = new Set();
671					var category4 = new Set();
672
673					stylesArray.forEach(function (styleSet) {
674						var individualStyles = styleSet.split('/');
675						if (individualStyles[0]) category2.add(individualStyles[0].trim());
676						if (individualStyles[1]) category3.add(individualStyles[1].trim());
677						if (individualStyles[2]) category4.add(individualStyles[2].trim());
678					});
679
680					gtm_product_obj['item_category2'] = Array.from(category2).join(', ');
681					gtm_product_obj['item_category3'] = Array.from(category3).join(', ');
682					gtm_product_obj['item_category4'] = Array.from(category4).join(', ');
683
684					delete gtm_product_obj.styles;
685				}
686
687				if ((typeof gtm_product_obj['item_name'] !== 'undefined' || typeof gtm_product_obj['item_id'] !== 'undefined') && typeof dataLayer !== 'undefined')
688				{
689					var eventToBePushed = {
690						'event': 'view_item',
691						'ecommerce': {
692							'items': [
693								gtm_product_obj
694							]
695						}
696					}
697
698					dataLayer.push({ecommerce: null});
699					dataLayer.push(eventToBePushed);
700				}
701			}
702
703			if (pagetop.find('.main_image').length) {
704				if (settings.type !== 'Standard') {
705					ProductImageViewer = ProductImageViewerModule({largeview: false});
706				} else {
707					var viewerSettings = {};
708					if (pagetop.find('.main_image').hasClass('is-zoomable')) {
709						viewerSettings.largeviewButton = pagetop.find(".prod_view-zoom_icon");
710					} else {
711						viewerSettings.largeview = false;
712					}
713
714					if (pagetop.find('.prod_view').attr('data-imageCount') === "null") {
715						viewerSettings.imagecarousel = false;
716					}
717
718					if (pagetop.hasClass('has-expanded')) {
719						viewerSettings.expandedView = true;
720					}
721
722					if (pagetop.hasClass('has-stylevids')) {
723						viewerSettings.styleVids = true;
724					}
725
726					ProductImageViewer = ProductImageViewerModule(viewerSettings);
727				}
728
729				ProductImageViewer.setmainimage(pagetop.find(".prod_view-wrap .main_image"));
730
731				if (pagetop.find(".prod_view-multiview").length) {
732					ProductImageViewer.setmultiview(pagetop.find(".prod_view-multiview"), {noHover: true});
733
734					if (pagetop.find(".is-app_vid").length) {
735						ProductImageViewer.enableVideo(pagetop.find(".is-app_vid .prod_view-multiview-image").data('vidsrc'));
736					}
737				}
738
739				ProductImageViewer.setViewer(pagetop.find(".prod_view"));
740			}
741			
742			//START - Was missing from Pickle? added to update style/image when different style selected
743			if (ProductImageViewer !== 'undefined') {
744				pagetop.find('.js-ordering-module').on('ordering:colorSelected',function(e){
745					if(typeof e.detail !== "undefined") {
746						var styleCode = e.detail['style_item_code'];
747						ProductImageViewer.setstyle(styleCode);
748					}
749				});
750				pagetop.find('.js-ordering-module').on('ordering:bulkOrderLargeView',function(e){
751					if(typeof e.detail !== "undefined") {
752						var styleCode = e.detail['style_item_code'];
753						ProductImageViewer.showLargeView(styleCode);
754
755					}
756				});
757			}
758			//END - Was missing from Pickle? added to update style/image when different style selected
759
760			if (pagetop.find(".used_ordering-replace .used_subproduct_list .subproduct").length) {
761				var orderSettings = {
762					usedProduct: true
763				};
764
765				var StyleOrdering = UsedStyleOrderingModule(orderSettings);
766
767// 				StyleOrdering.setLang(utilities.pageLang().getLang());
768
769// 				StyleOrdering.setRacOrdering(pagetop.find('.style_ordering-racquet'));
770
771				StyleOrdering.setOrdering(pagetop.find(".style_ordering"));
772
773				//when 'addtocart' event is triggered, run function that adds the item(s) to the cart
774				pagetop.find(".style_ordering-form").on("addtocart", function(e,obj) {
775					var addtocartform = $(this);
776					//function to add item(s) is passed into initialize_descpagetop or pulled from defaults
777					//called using the context of the cart form so it can be serialized for CartHandler
778					//any condition to be checked before adding an item should be included here
779					settings.onAdd.call(addtocartform, e, obj);
780				});
781			} else if (pagetop.find(".style_ordering-replace .styled_subproduct_list .subproduct").length) {
782				var orderSettings = {};
783				if (settings.type !== 'Standard') {
784					orderSettings.panelOrder = true;
785				}
786				if (settings.ignoreDynamic) {
787					orderSettings.dynamic = false;
788				}
789				if (pagetop.find('.styled_subproduct_list').hasClass('region-sizes')) {
790					orderSettings.regionSizes = true;
791				}
792
793				var StyleOrdering = StyleOrderingModule(orderSettings);
794
795				StyleOrdering.setLang(utilities.pageLang().getLang());
796
797				if (ProductImageViewer !== null) {
798					StyleOrdering.setImageViewer(ProductImageViewer);
799				}
800
801				if (pagetop.find('.desc_top-head-price .price').hasClass('has-pricerange')) {
802					StyleOrdering.setPricing(pagetop.find('.desc_top-head-price .price'));
803				}
804
805				if (pagetop.find('.style_ordering-racquet').length) {
806					StyleOrdering.setRacOrdering(pagetop.find('.style_ordering-racquet'));
807				}
808
809				StyleOrdering.setOrdering(pagetop.find(".style_ordering"));
810
811				pagetop.find('.qty_section').each(function() {
812					utilities.enhance_qty($(this), StyleOrdering);
813				});
814
815				//when 'addtocart' event is triggered, run function that adds the item(s) to the cart
816				pagetop.find(".style_ordering-form").on("addtocart", function(e,obj) {
817					var addtocartform = $(this);
818					//function to add item(s) is passed into initialize_descpagetop or pulled from defaults
819					//called using the context of the cart form so it can be serialized for CartHandler
820					//any condition to be checked before adding an item should be included here
821					settings.onAdd.call(addtocartform, e, obj);
822				});
823			} else if (pagetop.find('.string_ordering').length) {
824				var desctop_ordering_form = pagetop.find(".style_ordering-form");
825
826				if (desctop_ordering_form.length) {
827					var orderInputs = desctop_ordering_form.find('input[name=incrementqty]');
828					var orderButton = desctop_ordering_form.find('.style_ordering-add_cart');
829					var orderAvail = false;
830					orderButton.addClass('is-disabled').attr('disabled', true);
831
832					orderInputs.each(function() {
833						if ($(this).val() !== '') {
834							orderAvail = true;
835						}
836						$(this).on('keyup', function() {
837							var filledInputs = orderInputs.filter(function() {
838								return $.trim($(this).val()).length != 0
839							}).length;
840
841							if (filledInputs !== 0) {
842								orderAvail = true;
843								orderButton.removeClass('disabled').attr('disabled', false);
844							} else {
845								orderAvail = false;
846								orderButton.addClass('disabled').attr('disabled', true);
847							}
848						});
849					});
850
851					if (!settings.ignoreDynamic) {
852						desctop_ordering_form.on("submit",function(e){
853							e.preventDefault();
854							$(this).trigger("addtocart");
855						}).on("addtocart",settings.onAdd);
856					}
857				}
858
859				if (pagetop.find('.replace_avail').length) {
860					pagetop.find('.replace_avail').each(function() {
861						var availText = $(this).text();
862						var newAvailText = utilities.parseDate(availText, { month_style: "short" });
863						var outOfStockText = {
864							en: 'Out of Stock',
865							de: 'Nicht auf Lager',
866							fr: 'Momentan&eacute;ment indisponible',
867							es: 'Temporalmente no disponible',
868							it: 'Momentaneamente non disponibile'
869						};
870
871						if (newAvailText !== null) {
872							$(this).text(newAvailText);
873						} else if (availText == "Out") {
874							$(this).text(outOfStockText[utilities.pageLang().getLang()]);
875						}
876					});
877				}
878
879			} else {
880				var desctop_ordering_form = pagetop.find(".style_ordering-form");
881
882				if (desctop_ordering_form.length) {
883					if (pagetop.find('.notify_stock').length) {
884						pagetop.find('.notify_stock').on("click", function(e) {
885							e.preventDefault();
886							var notifyTitleText = {
887								en: 'Stock Alert',
888								de: 'Verf&uuml;gbarkeits-Alarm!',
889								fr: 'Alerte disponibilit&eacute;',
890								es: 'Aviso de disponibilidad',
891								it: 'Notifica disponibilit&agrave;'
892							};
893							reportEventTracking('Email Sign-up', 'Stock Notify', $('#ordering_form').data('prod_name'));
894							generateNotifyModal($(this).attr('href'), notifyTitleText[utilities.pageLang().getLang()]);
895						});
896					}
897
898					pagetop.find('.qty_section').each(function() {
899						utilities.enhance_qty($(this));
900					});
901
902					if (!settings.ignoreDynamic) {
903						desctop_ordering_form.on("submit",function(e){
904							e.preventDefault();
905
906							/* Check for more than two demo rackets */
907							/*
908							if (pagetop.find('#num_demos').length) {
909								var num_demos = $('#num_demos').val();
910								if (num_demos !== null) {
911									if (num_demos >= 2) {
912										alert('We allow a maximum of 2 demo rackets at a time. You currently have ' + num_demos + ' demo rackets in your cart. If you\'d like to add this racket, please remove one from your cart.');
913										return false;
914									}
915								}
916							}
917							*/
918
919							$(this).trigger("addtocart");
920						}).on("addtocart",settings.onAdd);
921					}
922				}
923
924				if (pagetop.find('.replace_avail').length) {
925					pagetop.find('.replace_avail').each(function() {
926						var availText = $(this).text();
927						var newAvailText = utilities.parseDate(availText, { month_style: "short" });
928						var outOfStockText = {
929							en: 'Out of Stock',
930							de: 'Nicht auf Lager',
931							fr: 'Momentan&eacute;ment indisponible',
932							es: 'Temporalmente no disponible',
933							it: 'Momentaneamente non disponibile'
934						};
935
936						if (newAvailText !== null) {
937							$(this).text(newAvailText);
938						} else if (availText == "Out") {
939							$(this).text(outOfStockText[utilities.pageLang().getLang()]);
940						}
941					});
942				}
943			}
944
945			if (settings.type !== 'Standard') {
946				pagetop.find('[data-toggle="collapse"]').not(".ignore-close").each(function(){
947					var collapseBtn = $(this);
948					var target = pagetop.find(collapseBtn.data("target"));
949
950					collapseBtn.addClass("collapsed").attr("aria-expanded", "false");
951					target.removeClass("show");
952				});
953			}
954
955			/* Descpage MSRP PopUps */
956			/*
957			if(pagetop.find('.msrp_info').length) {
958				pagetop.find('.msrp_info').on('click', function(){
959					$(this).popover('toggle');
960				});
961			}
962			*/
963
964			if (pagetop.find(".notify_price").length) {
965				pagetop.find(".notify_price").on("click", function(e) {
966					e.preventDefault();
967					var notifyTitleText = {
968						en: 'Price Alert',
969						de: 'Preisalarm!',
970						fr: 'Alerte prix',
971						es: 'Alerta de precio',
972						it: 'Notifica prezzo'
973					};
974					reportEventTracking('Email Sign-up', 'Price Notify', $('#ordering_form').data('prod_name'));
975					generateNotifyModal($(this).attr('href'), notifyTitleText[utilities.pageLang().getLang()]);
976				});
977			}
978
979			if (pagetop.find(".view_360").length) {
980				pagetop.find(".view_360").on("click", function(e) {
981					e.preventDefault();
982					var modalTitleText = {
983						en: '360 View',
984						de: '360&deg; Ansicht',
985						fr: 'Vue &agrave; 360&deg;',
986						es: 'Vista 360 &deg;',
987						it: 'Vista a 360&deg;'
988					};
989					generateModaliFrame($(this), modalTitleText[utilities.pageLang().getLang()]);
990				});
991			}
992
993			if (pagetop.find(".wishlist_poplink").length) {
994				pagetop.find(".wishlist_poplink").on("click",function(e) {
995					e.preventDefault();
996					var wishProds = [];
997					var prodCheck = false;
998					var listLogin = false;
999
1000					pagetop.find(".order_input").each(function() {
1001						var wProd = {};
1002						var wishCode = $(this).val();
1003						var wishQty = pagetop.find('.ordering_qty').val();
1004
1005						wProd.code = wishCode;
1006						wProd.qty = wishQty;
1007						wishProds.push(wProd);
1008					});
1009
1010					if (pagetop.find('.string_comp').length) {
1011						wishProds[0].comp = pagetop.find('.string_comp').attr('name');
1012					}
1013
1014					if (pagetop.find('.string_comment').length) {
1015						wishProds[0].comment = pagetop.find('.string_comment').val();
1016					}
1017
1018					for(var i = 0; i < wishProds.length; i++){
1019						if (wishProds[i].code !== ""){
1020							prodCheck = true;
1021						}
1022					}
1023
1024					if ($(this).hasClass("is-login")) {
1025						listLogin = true;
1026					}
1027
1028					if(prodCheck) {
1029						utilities.wishListPop(wishProds, listLogin);
1030					} else {
1031						var pleaseSelectText = {
1032							en: 'Please select a Product',
1033							de: 'Bitte ein Produkt auswählen',
1034							fr: 'Veuillez sélectionner un produit',
1035							es: 'Por favor, selecciona un producto',
1036							it: 'Seleziona un prodotto'
1037						};
1038						alert(pleaseSelectText[utilities.pageLang().getLang()]);
1039					}
1040				});
1041			}
1042		};
1043	},
1044
1045	wishListPop: function(wishProds = null, listLogin) {
1046		var wishURL = "/wishlist/wishlist_add.html?wishlist_pop=true";
1047		//var wishURL = "https://www.tenniswarehouse-europe.com/zzz/responsive/wishlist/wishlist_add.html?wishlist_pop=true";
1048
1049		$.get(wishURL, function(data){
1050			var jqData = $(data);
1051
1052			createAddWish(jqData, wishProds, listLogin);
1053		});
1054	},
1055
1056	requiredForm: function(form) {
1057		var requiredFields = form.find("input, select, textarea").filter("[required]:visible");
1058		var requiredButton = form.find("button[type=submit]");
1059		var typedFields = requiredFields.filter("input:not([type=checkbox], [type=radio]), textarea");
1060		var changedFields = requiredFields.filter("input[type=checkbox], input[type=radio], select");
1061
1062		var validation = function(submitted) {
1063			var radioNames = [];
1064			var emptyFields = requiredFields.filter(function() {
1065				if ($(this).is("input[type=checkbox]")) {
1066					return !$(this).is(":checked");
1067				}
1068
1069				if ($(this).is("input[type=radio]")) {
1070					var rname = $(this).attr("name");
1071
1072					if ($.inArray(rname, radioNames) === -1) {
1073						radioNames.push(rname);
1074
1075						if (form.find('input[name="'+rname+'"]:checked').length === 0) {
1076							return true;
1077						} else {
1078							return false;
1079						}
1080					} else {
1081						return false;
1082					}
1083				}
1084
1085				return $(this).val() === '';
1086			});
1087
1088			if (submitted) {
1089				emptyFields.each(function() {
1090					var fieldId = $(this).attr("id");
1091					$(this).addClass("is-required");
1092					form.find("label[for="+fieldId+"]").addClass("is-required");
1093				});
1094			}
1095
1096			return emptyFields;
1097		}
1098
1099		requiredButton.addClass("disabled");
1100
1101		typedFields.each(function() {
1102			$(this).on("keyup", function() {
1103				var errorCheck = validation();
1104
1105				if (errorCheck.length) {
1106					if (!requiredButton.hasClass("disabled")) requiredButton.addClass("disabled");
1107				} else {
1108					if (requiredButton.hasClass("disabled")) requiredButton.removeClass("disabled");
1109				}
1110			});
1111		});
1112
1113		changedFields.each(function() {
1114			$(this).on("change", function() {
1115				var errorCheck = validation();
1116
1117				if (errorCheck.length) {
1118					if (!requiredButton.hasClass("disabled")) requiredButton.addClass("disabled");
1119				} else {
1120					if (requiredButton.hasClass("disabled")) requiredButton.removeClass("disabled");
1121				}
1122			});
1123		});
1124
1125		form.on("submit", function(e) {
1126			var errorCheck = validation(true);
1127
1128			if (errorCheck.length) {
1129				e.preventDefault();
1130			}
1131		});
1132	},
1133
1134	throttle: function(func, time) {
1135		var timerId;
1136		return function () {
1137
1138			if (timerId) {
1139				return;
1140			}
1141
1142			timerId = setTimeout(function () {
1143				func();
1144
1145				timerId = undefined;
1146			}, time);
1147		}
1148	},
1149
1150	debounce: function(func, wait, immediate) {
1151		var timeout;
1152		return function() {
1153			var context = this, args = arguments;
1154			var later = function() {
1155				timeout = null;
1156				if (!immediate) func.apply(context, args);
1157			};
1158			var callNow = immediate && !timeout;
1159			clearTimeout(timeout);
1160			timeout = setTimeout(later, wait);
1161			if (callNow) func.apply(context, args);
1162		};
1163	},
1164
1165	reportEventTracking: function(gtm_promo_name,gtm_promo_id,gtm_promo_creative,gtm_promo_position) {
1166		if(typeof gtm_promo_name !== 'undefined' && typeof gtm_promo_id !== 'undefined')
1167		{
1168			if(typeof gtm_promo_creative !== 'undefined')
1169			{
1170				if(typeof gtm_promo_position !== 'undefined')
1171				{
1172					if(typeof dataLayer !== 'undefined')
1173					{
1174
1175						var eventToBePushed = {
1176							'event': 'select_promotion',
1177							'ecommerce': {
1178								'creative_name': gtm_promo_name,
1179								'promotion_id': gtm_promo_id,
1180								'promotion_name': gtm_promo_creative,
1181								'creative_slot': gtm_promo_position
1182							}
1183						}
1184
1185						dataLayer.push(eventToBePushed);
1186					}
1187				}
1188				else
1189				{
1190					if(typeof dataLayer !== 'undefined')
1191					{
1192						var eventToBePushed = {
1193							'event': 'select_promotion',
1194							'ecommerce': {
1195								'creative_name': gtm_promo_name,
1196								'promotion_id': gtm_promo_id,
1197								'promotion_name': gtm_promo_creative,
1198							}
1199						}
1200
1201						dataLayer.push(eventToBePushed);
1202					}
1203				}
1204			}
1205			else
1206			{
1207				if(typeof dataLayer !== 'undefined')
1208				{
1209					var eventToBePushed = {
1210							'event': 'select_promotion',
1211							'ecommerce': {
1212								'creative_name': gtm_promo_name,
1213								'promotion_id': gtm_promo_id
1214							}
1215						}
1216
1217					dataLayer.push(eventToBePushed);
1218				}
1219			}
1220		}
1221	},
1222	recaptchaCheck: function(serialData, callback) {
1223		$.ajax({
1224			url: "/wishlist/wishlist_create.php",
1225			type: "post",
1226			data: serialData,
1227			success: function(response) {
1228				callback(response);
1229			},
1230			error: function(error) {
1231				console.log(error);
1232			}
1233		});
1234	},
1235
1236	generatePercentSavingsText: function (jquery_element) {
1237		var array_json = jquery_element.attr('data-percent-savings');
1238		var text_format = jquery_element.attr('data-format');
1239		var max_savings = null;
1240		var min_savings = null;
1241		var parsed = null;
1242		if(array_json)
1243		{
1244			try {
1245				var parsed = JSON.parse(array_json);
1246			}
1247			catch (err){
1248			}
1249		}
1250
1251		if(!Array.isArray(parsed))
1252		{
1253			return;
1254		}
1255
1256		for(var i = 0; i < parsed.length; i++)
1257		{
1258			var int_value = parseInt(parsed[i]);
1259			if(!isNaN(int_value))
1260			{
1261				if(max_savings === null || int_value > max_savings)
1262				{
1263					max_savings = int_value;
1264				}
1265
1266				if(min_savings === null || int_value < min_savings)
1267				{
1268					min_savings = int_value;
1269				}
1270			}
1271		}
1272
1273		if(max_savings > 0)
1274		{
1275			if(max_savings === min_savings)
1276			{
1277				jquery_element.text("-" + max_savings + "%");
1278			}
1279			else
1280			{
1281				if(text_format === 'long')
1282				{
1283					jquery_element.text("Up to " + max_savings + "% Off");
1284				}
1285				else
1286				{
1287					jquery_element.text("Up to -" + max_savings + "%");
1288				}
1289			}
1290		}
1291	},
1292
1293	generateListPriceMarkup: function (jquery_element) {
1294		var array_json = jquery_element.attr('data-list-prices');
1295		var format = jquery_element.attr('data-format');
1296		var max_list = null;
1297		var min_list = null;
1298		var parsed = null;
1299		var list_text = '';
1300		if(array_json)
1301		{
1302			try {
1303				var parsed = JSON.parse(array_json);
1304			}
1305			catch (err){
1306			}
1307		}
1308
1309		if(!Array.isArray(parsed))
1310		{
1311			return;
1312		}
1313
1314		for(var i = 0; i < parsed.length; i++)
1315		{
1316			var float_value = parseFloat(parsed[i]);
1317			if(!isNaN(float_value))
1318			{
1319				if(max_list === null || float_value > max_list)
1320				{
1321					max_list = float_value;
1322				}
1323
1324				if(min_list === null || float_value < min_list)
1325				{
1326					min_list = float_value;
1327				}
1328			}
1329		}
1330
1331		if(max_list > 0)
1332		{
1333			if(max_list === min_list)
1334			{
1335				list_text = max_list.toFixed(2).replace('.', ',') + "&euro;";
1336			}
1337			else
1338			{
1339				list_text = min_list.toFixed(2).replace('.', ',') + "&euro; - " + max_list.toFixed(2).replace('.', ',') + "&euro;";
1340			}
1341
1342			if(format === 'category')
1343			{
1344				jquery_element.html('<span class="cattable-wrap-cell-info-price-msrp"><span class="is-crossout">' + list_text + '</span>*</span>');
1345			}
1346			else
1347			{
1348				jquery_element.html('<span class="list_price pb-2"><span class="is-crossout" aria-label="MSRP" title="MSRP"><del>' + list_text + '</del></span><a tabindex="0" class="msrp_info"><span class="icon icon-help"></span></a></span>');
1349			}
1350		}
1351	},
1352
1353	initializeListPriceWithSavingsMarkup: function(jquery_element) {
1354		var array_json = jquery_element.attr('data-prices');
1355		var max_list = null;
1356		var min_list = null;
1357		var max_savings = null;
1358		var min_savings = null;
1359		var parsed = null;
1360		if(array_json)
1361		{
1362			try {
1363				var parsed = JSON.parse(array_json);
1364			}
1365			catch (err){
1366
1367			}
1368		}
1369
1370		if(!Array.isArray(parsed))
1371		{
1372			return;
1373		}
1374
1375		for(var i = 0; i < parsed.length; i++)
1376		{
1377			if(typeof parsed[i].list !== 'undefined')
1378			{
1379				var list_float = parseFloat(parsed[i].list);
1380
1381				if(!isNaN(list_float))
1382				{
1383					if(max_list === null || list_float > max_list)
1384					{
1385						max_list = list_float;
1386					}
1387
1388					if(min_list === null || list_float < min_list)
1389					{
1390						min_list = list_float;
1391					}
1392				}
1393
1394				if(typeof parsed[i].price !== 'undefined')
1395				{
1396					var price_float = parseFloat(parsed[i].price);
1397					if(!isNaN(price_float))
1398					{
1399						var savings = list_float - price_float;
1400						if(max_savings === null || savings > max_savings)
1401						{
1402							max_savings = savings;
1403						}
1404
1405						if(min_savings === null || savings < min_savings)
1406						{
1407							min_savings = savings;
1408						}
1409					}
1410				}
1411			}
1412		}
1413
1414		utilities.generateListPriceWithSavingsMarkup(jquery_element,{
1415			min_list_price: min_list,
1416			max_list_price: max_list,
1417			min_savings: min_savings,
1418			max_savings: max_savings
1419		});
1420	},
1421
1422	generateListPriceWithSavingsMarkup: function (jquery_element,data) {
1423
1424		var list_text = '';
1425		var markup_string = '';
1426		
1427		var saveText = {
1428			en: "You Save: ",
1429			de: "Du sparst: ",
1430			fr: "Vous &eacute;conomisez : ",
1431			it: "Risparmi: ",
1432			es: "Ahorras: "
1433		};
1434		
1435		var saveUpToText = {
1436			en: "You Save: Up to ",
1437			de: "Du sparst: Bis zu ",
1438			fr: "Vous &eacute;conomisez : jusqu&rsquo;&agrave; ",
1439			it: "Risparmi: fino a ",
1440			es: "Ahorras: hasta "
1441		};
1442		
1443		if(data.max_list_price > 0)
1444		{
1445			if(data.max_list_price === data.min_list_price)
1446			{
1447				list_text = data.max_list_price.toFixed(2).replace('.', ',') + " &euro;";
1448			}
1449			else
1450			{
1451				list_text = data.min_list_price.toFixed(2).replace('.', ',') + " &euro; - " + data.max_list_price.toFixed(2).replace('.', ',') + " &euro;";
1452			}
1453
1454			markup_string += '<span class="list_price pb-2"><span class="is-crossout" aria-label="MSRP" title="MSRP"><del>' + list_text + '</del></span>';
1455
1456			if(data.max_savings > 0)
1457			{
1458				if(data.max_savings === data.min_savings)
1459				{
1460					markup_string += '<span class="is-sale">' + saveText[utilities.pageLang().getLang()] + data.max_savings.toFixed(2).replace('.', ',') + ' &euro; </span>';
1461				}
1462				else
1463				{
1464					if(data.min_savings === 0)
1465					{
1466						markup_string += '<span class="is-sale">' + saveUpToText[utilities.pageLang().getLang()]  + data.max_savings.toFixed(2).replace('.', ',') + ' &euro; </span>';
1467					}
1468					else
1469					{
1470						markup_string += '<span class="is-sale">' + saveText[utilities.pageLang().getLang()] + data.min_savings.toFixed(2).replace('.', ',') + ' &euro; - ' + data.max_savings.toFixed(2).replace('.', ',') + ' &euro;</span>';
1471					}
1472				}
1473			}
1474			markup_string += '<a tabindex="0" class="msrp_info"><span class="icon icon-help"></span></a></span>';
1475		}
1476		jquery_element.html(markup_string);
1477		jquery_element.find('.msrp_info').on("click", function(e) {
1478			e.preventDefault();
1479			var discTitle = {
1480				en: "SRP",
1481				de: "UVP",
1482				fr: "PPC",
1483				it: "SRP",
1484				es: "SRP"
1485			};
1486			generateMSRPModal(discTitle[utilities.pageLang().getLang()]);
1487		});
1488	}
1489};
1490
1491$('[data-toggle="collapse"]').not(".ignore-close").each(function(){
1492	var collapseBtn = $(this);
1493	var target = $(collapseBtn.data("target"));
1494
1495	collapseBtn.addClass("collapsed").attr("aria-expanded", "false");
1496	target.removeClass("show");
1497});
1498
1499/* Skip Links Functionality */
1500function focusOnElement($element) {
1501	if (!$element.length) {
1502		return;
1503	}
1504	if (!$element.is(':focusable')) {
1505		// add tabindex to make focusable and remove again
1506		$element.attr('tabindex', -1).on('blur focusout', function () {
1507		$(this).removeAttr('tabindex');
1508	});
1509	}
1510	$element.focus();
1511}
1512
1513// Add skip link option dynamically
1514function skipLink(link, target) {
1515	var skipLink = $(link);
1516	var skipAnchor = $(target);
1517	var skipAnchorOffset = skipAnchor.offset().top;
1518	skipLink.on('click', function(e) {
1519		e.preventDefault();
1520		$(window).scrollTop(skipAnchorOffset);
1521		focusOnElement(skipAnchor);
1522	});
1523}
1524
1525/* Category Video Pop Up Modal */
1526function catVideoModal () {
1527	$('.cat_video_popup').on('click',function(e){
1528		e.preventDefault();
1529		var popurl = $(this).data('popurl');
1530		var modaltarget = $('#catvideo').find('.video-container');
1531		modaltarget.append('<div class="video-container-innerwrap"><div class="video-container-innerwrap-scale_wrap"><iframe src="' + popurl + '" frameborder="0" allow="autoplay" allow="encrypted-media" allowfullscreen=""><\/iframe><\/div><\/div>');
1532		$('#catvideo').on('hide.bs.modal',function(){
1533			$(this).find('.video-container-innerwrap').remove();
1534		});
1535	});
1536}
1537
1538/* Read More Cat Description Buttons */
1539function readMore (readObject, readHeight) {
1540	readObject.each(function(){
1541		var currentlang = utilities.pageLang().getLang();
1542		var readmore_text = { en : "Read More", de : "Weiterlesen", es : "Ver m&aacute;s", fr : "Lire plus", it : "Scopri di pi&ugrave;" };
1543		var readless_text = { en : "Read Less", de : "Weniger anzeigen", es : "Ver menos", fr : "Lire moins", it : "Meno" };
1544		var catDesc = $(this),
1545			descInner = $(this).find('.check_read-inner'),
1546			descHeightInner = descInner.height(),
1547			readMoreBtn = $('<button class="read_more-btn btn btn-link" type="button">' + readmore_text[currentlang] + '</button>');
1548
1549		if ( descHeightInner > readHeight ) {
1550			catDesc.addClass('read_more');
1551			catDesc.css({height: readHeight+"px"});
1552			catDesc.after(readMoreBtn);
1553		}
1554
1555		function readMoreButton (hiddenText) {
1556			if ( hiddenText.next(readMoreBtn).length ){
1557				hiddenText.next(readMoreBtn).on('click', function(){
1558					if ( hiddenText.hasClass('shown') ) {
1559						hiddenText.removeClass('shown')
1560						hiddenText.css({height:readHeight});
1561						$(this).html(readmore_text[currentlang]);
1562					} else {
1563						hiddenText.addClass('shown');
1564						hiddenText.css({height:descHeightInner});
1565						$(this).html(readless_text[currentlang]);
1566					}
1567				});
1568			}
1569		}
1570		readMoreButton(catDesc);
1571
1572		$(window).on('resize', function (){
1573			descHeightInner = descInner.height();
1574
1575			if ( descHeightInner <= readHeight ) {
1576				catDesc.removeClass('read_more');
1577				readMoreBtn.detach();
1578			} else {
1579				if (catDesc.hasClass("shown")) {
1580					catDesc.css({height:descHeightInner+"px"});
1581				} else if (descHeightInner < readHeight) {
1582					catDesc.css({height:descHeightInner+"px"});
1583				}
1584				catDesc.addClass('read_more');
1585				catDesc.after(readMoreBtn);
1586			}
1587		});
1588	});
1589}
1590
1591/* Shipping Banner */
1592(function() {
1593
1594	var shippingCarousel = $("#shippingCarousel");
1595	var pauseButton = shippingCarousel.find($('.pause-button'));
1596
1597	var paused = 0;
1598
1599	$(shippingCarousel).carousel({
1600		interval: 4000,
1601		pause: false,
1602		ride: 'carousel'
1603	})
1604
1605	$(pauseButton).on('click', function(e) {
1606		e.preventDefault();
1607
1608		var state = (paused) ? 'cycle' : 'pause';
1609		var method = (paused) ? 'next' : null;
1610
1611		paused = (paused) ? 0 : 1;
1612		$(shippingCarousel).carousel(state);
1613		$(shippingCarousel).carousel(method);
1614		$(pauseButton).find('i').toggleClass('play pause');
1615		$(pauseButton).find('i').toggleClass('icon-play icon-pause');
1616	});
1617
1618})();
1619
1620/* Shifting Input Labels */
1621$('.form-group').enhanceInput();
1622/* End Shifting Input Labels */
1623
1624/* Modals */
1625function createLoginModal(linkObj) {
1626	var loginModal = utilities.generateModalMarkup({hasFooter: true}),
1627		emailText = linkObj.data("email"),
1628		remembered =  linkObj.data("remembered");
1629
1630	if (typeof(emailText) === undefined) {
1631		emailText = '';
1632	}
1633
1634	var loginTitleText = {
1635		en: 'Sign In',
1636		de: 'Anmelden',
1637		fr: 'Connexion',
1638		es: 'Reg&iacute;strate',
1639		it: 'Accedi '
1640	};
1641	var emailLabelText = {
1642		en: 'Email address',
1643		de: 'E-Mail-Adresse',
1644		fr: 'E-mail',
1645		es: 'E-mail',
1646		it: 'Indirizzo email'
1647	};
1648	var passText = {
1649		en: 'Password',
1650		de: 'Passwort',
1651		fr: 'Mot de passe',
1652		es: 'Contrase&ntilde;a',
1653		it: 'Password'
1654	};
1655	var forgotText = {
1656		en: 'Forgot Password?',
1657		de: 'Passwort vergessen?',
1658		fr: 'Mot de passe oubli&eacute; ?',
1659		es: '&iquest;Has olvidado tu contrase&ntilde;a?',
1660		it: 'Hai dimenticato la password?'
1661	};
1662	var signInText = {
1663		en: 'Sign In',
1664		de: 'Einloggen',
1665		fr: 'Connexion',
1666		es: 'Crear una cuenta',
1667		it: 'Accedi'
1668	};
1669	var modalTitleText = {
1670		en: 'Account Login',
1671		de: 'Konto-Login',
1672		fr: 'Mon compte',
1673		es: 'Iniciar sesi&oacute;n',
1674		it: 'Il mio account'
1675	};
1676	var noAccountText = {
1677		en: 'Don\'t Have An Account?',
1678		de: 'Sie haben noch kein Kundenkonto?',
1679		fr: 'Nouveau client ?',
1680		es: '&iquest;No tienes una cuenta?',
1681		it: 'Non hai un account?'
1682	};
1683	var createAccountText = {
1684		en: 'You can create an account during the checkout process of your next order.',
1685		de: 'Du kannst w&auml;hrend des Bestellvorgangs oder bei deiner n&auml;chsten Bestellung ein Konto erstellen.',
1686		fr: 'Vouz pourrez cr&eacute;er un compte lors de votre prochaine commande, durant le processus de paiement.',
1687		es: 'Puedes crear una cuenta en el momento del pago de tu pr&oacute;ximo pedido.',
1688		it: 'Puoi creare un account durante il processo di pagamento del tuo prossimo ordine.'
1689	};
1690	var rememberText = {
1691		en: 'Remember Me',
1692		de: 'Mich erinnern',
1693		fr: 'Se souvenir de moi',
1694		es: 'Recu&eacute;rdame',
1695		it: 'Ricordami'
1696	};
1697
1698	var loginBody = $('<div><\/div>'),
1699		loginForm = $('<form method="post"><h3 class="display-4">'+ loginTitleText[utilities.pageLang().getLang()] +'<\/h3><\/form>'),
1700		loginEmail = $('<div class="form-group"><input type="email" class="form-control" id="modal-login_email" aria-describedby="emailLogin" name="login" value="'+ emailText +'"><label for="modal-login_email" class="is-lifted zero">'+ emailLabelText[utilities.pageLang().getLang()] +'<\/label><\/div>'),
1701		loginPassword = $('<div class="form-group"><div class="input-group visibility"><input type="password" class="form-control" id="modal-login_pw" name="pass"><div class="input-group-append"><button type="button" class="input-group-text"><span class="icon icon-visibility">Show<\/span><\/button><\/div><\/div><label for="modal-login_pw" class="is-lifted zero">'+ passText[utilities.pageLang().getLang()] +'<\/label><\/div>'),
1702		loginForgot = $('<div class="in_page_modal-small_text"><a href="\/passwordreset.html">'+ forgotText[utilities.pageLang().getLang()] +'<\/a><\/div>'),
1703		loginBottom = $('<div class="row"><\/div>'),
1704		loginRemember = $('<div class="col-12 col-xs-6"><div class="form-group"><div class="checkbox_wrap form-check form-check-inline"><label class="form-check-label" for="modal-remember_me"><input id="modal-remember_me" class="form-check-input" type="checkbox" name="remem" value="Y" '+ ((remembered)?'checked':"") +'>'+ rememberText[utilities.pageLang().getLang()] +'<\/label><\/div><\/div><\/div>'),
1705		loginSubmit = $('<div class="col-12 col-xs-6"><button type="submit" class="btn button-brand btn-block">'+ signInText[utilities.pageLang().getLang()] +'<\/button><\/div>');
1706
1707	loginForgot.find("a").on("click", function(e) {
1708		e.preventDefault();
1709
1710		loginModal.on("hidden.bs.modal", function() {
1711			createForgotModal();
1712		});
1713
1714		loginModal.modal("hide");
1715	});
1716
1717	loginModal.find(".modal-dialog").addClass("modal-login");
1718	loginModal.find(".modal-title").html(modalTitleText[utilities.pageLang().getLang()]);
1719	loginModal.find(".modal-body").append(
1720		loginBody.append(
1721			loginForm.append(loginEmail).append(loginPassword).append(loginForgot).append(
1722				loginBottom.append(loginRemember).append(loginSubmit)
1723			)
1724		)
1725	);
1726	loginModal.find('.modal-footer').addClass("login_footer").append($('<div class="modal-footer-inner"><\/div>').append($('<div class="modal-footer-inner-title">'+ noAccountText[utilities.pageLang().getLang()] +'<\/div><p class="modal-footer-inner-note">'+ createAccountText[utilities.pageLang().getLang()] +'<\/p>')));
1727
1728	loginModal.find(".form-group").enhanceInput();
1729
1730	loginModal.find(".form-control[type='password']").each(function() {
1731		pwShowHide($(this));
1732	});
1733
1734	loginModal.modal();
1735	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
1736	
1737	loginModal.on("hidden.bs.modal", function() {
1738		$(this).remove();
1739	});
1740
1741	if (!linkObj.hasClass("is-static")) {
1742		loginForm.on("submit", function(e) {
1743			e.preventDefault();
1744			if (linkObj.hasClass("wl_controls-save")) {
1745				createLoggedIn(loginModal, '/account.html', $(this).serializeArray(), linkObj);
1746				//createLoggedIn(loginModal, 'https://www.tenniswarehouse-europe.com/zzz/responsive/account.html', $(this).serializeArray(), linkObj);
1747			} else {
1748				createLoggedIn(loginModal, '/account.html', $(this).serializeArray());
1749				//createLoggedIn(loginModal, 'https://www.tenniswarehouse-europe.com/zzz/responsive/account.html', $(this).serializeArray());
1750			}
1751		});
1752	}
1753}
1754
1755function createLoggedIn(loginModal, url, info, linkObj = null) {
1756    var loggedIn = utilities.generateModalMarkup({hasHeader: false});
1757
1758    const countryMap = {
1759        "AUSTRIA": "AT",
1760        "BELGIUM": "BE",
1761        "BULGARIA": "BG",
1762        "CROATIA": "HR",
1763        "CYPRUS": "CY",
1764        "CZECH REPUBLIC": "CZ",
1765        "DENMARK": "DK",
1766        "ESTONIA": "EE",
1767        "FINLAND": "FI",
1768        "FRANCE": "FR",
1769        "FRENCH DOM TOM": "FRD",
1770        "GERMANY": "DE",
1771        "GREECE": "GR",
1772        "HUNGARY": "HU",
1773        "IRELAND": "IE",
1774        "ITALY": "IT",
1775        "LATVIA": "LV",
1776        "LITHUANIA": "LT",
1777        "LUXEMBOURG": "LU",
1778        "MALTA": "MT",
1779        "MONACO": "MC",
1780        "NETHERLANDS": "NL",
1781        "NORWAY": "NO",
1782        "POLAND": "PL",
1783        "PORTUGAL": "PT",
1784        "ROMANIA": "RO",
1785        "SLOVAKIA": "SK",
1786        "SLOVENIA": "SI",
1787        "SPAIN": "ES",
1788        "SPAIN (CANARY ISLANDS)": "ESC",
1789        "SWEDEN": "SE",
1790        "SWITZERLAND": "CH",
1791        "UNITED KINGDOM": "UK",
1792        "OUTSIDE EU": "NEU"
1793    };
1794
1795    loggedIn.find(".modal-dialog").addClass("modal-logged_in");
1796
1797    if (info[2] === undefined) {
1798
1799    }
1800
1801    $.post(url, info, function (data) {
1802        if (linkObj !== null) {
1803            window.location.href = linkObj.attr("href");
1804        } else {
1805            var continueText = {
1806                en: 'Continue Shopping',
1807                de: 'Mit dem Einkauf fortfahren',
1808                fr: 'Continuer mon shopping',
1809                it: 'Continua gli acquisti',
1810                es: 'Seguir comprando'
1811            };
1812            var tryAgainText = {
1813                en: 'Try Again',
1814                de: 'Versuch es noch einmal',
1815                fr: 'Essayer &agrave; nouveau',
1816                it: 'Prova di nuovo',
1817                es: 'Intentarlo otra vez'
1818            };
1819            var accountText = {
1820                en: 'Account',
1821                de: 'Kundenkonto',
1822                fr: 'Compte',
1823                it: 'Account',
1824                es: 'Cuenta'
1825            };
1826
1827            var jqdata = $(data);
1828
1829
1830            var vatCode = null;
1831            var vatInput = jqdata.find('.vat_reload_form input[name="vat"]');
1832
1833            if (vatInput.length) {
1834                var vatValue = $.trim(vatInput.val()).toUpperCase();
1835                if (vatValue && countryMap[vatValue]) {
1836                    vatCode = countryMap[vatValue];
1837                } else if (vatValue) {
1838                    vatCode = vatValue;
1839                }
1840            }
1841
1842            var loggedInBtn = $('<button class="btn btn-outline-dark">' +
1843                continueText[utilities.pageLang().getLang()] +
1844                '<\/button>'
1845            );
1846            var loggedInBody = $('<div class=""><\/div>');
1847            var loggedInName = jqdata.find(".account_nav-js").data('name');
1848
1849            if (loggedInName) {
1850                // Need translation
1851                loggedInBody.append(
1852                    '<div class="modal-logged_in-heading">Welcome, ' +
1853                    loggedInName +
1854                    '!</div>'
1855                );
1856            }
1857
1858            loggedInBody
1859                .append(jqdata.find(".account_nav-js").html())
1860                .append(loggedInBtn.wrap('<div class="modal-logged_in-shop"><\/div>').parent());
1861
1862            loggedInBody.find(".is-active").removeClass("is-active");
1863
1864
1865            if (vatCode) {
1866                function withVatParam(href) {
1867                    var fullUrl = new URL(href, window.location.origin);
1868                    fullUrl.searchParams.set('vat', vatCode);
1869                    return fullUrl.pathname + fullUrl.search + fullUrl.hash;
1870                }
1871
1872                loggedInBody.find('a.icon_nav-tile-link').each(function () {
1873                    var anchor = $(this);
1874                    var href = anchor.attr('href');
1875                    if (!href) return;
1876                    anchor.attr('href', withVatParam(href));
1877                });
1878            }
1879
1880            loggedInBody.find(".account_logout").on("click", function (e) {
1881                e.preventDefault();
1882                loggedIn.modal("hide");
1883                createLogoutModal();
1884            });
1885
1886            if (!loggedInBody.find(".account_nav-row-js").length) {
1887                var retryBtn = $('<button class="btn button-brand btn-block" data-email="' +
1888                    info[0].value +
1889                    '" data-remembered="' +
1890                    ((info[2] === undefined) ? '' : info[2].value) +
1891                    '">' +
1892                    tryAgainText[utilities.pageLang().getLang()] +
1893                    '<\/button>'
1894                );
1895
1896                retryBtn.on("click", function () {
1897                    loggedIn.modal("hide");
1898                    createLoginModal(retryBtn);
1899                });
1900
1901                loggedInBody.html(
1902                    retryBtn.wrap('<div class="modal-btn_wrap"><\/div>').parent()
1903                );
1904            } else {
1905                var headerLogin = $(".l-header-topnav-account");
1906                var menuPanel = $(".offcanvas-menu-account");
1907                headerLogin
1908                    .off("click")
1909                    .removeClass("login_link")
1910                    .addClass("logged-in")
1911                    .attr("href", "/account.html");
1912                headerLogin.find(".icon-account").addClass("is-active");
1913                menuPanel
1914                    .find("a")
1915                    .addClass("logged-in")
1916                    .attr("href", "/account.html")
1917                    .text(accountText[utilities.pageLang().getLang()]);
1918                menuPanel.find(".icon-account").addClass("is-active");
1919            }
1920
1921            loggedIn.find(".modal-body").append(loggedInBody);
1922
1923            if (vatCode) {
1924                loggedIn.find('button').each(function () {
1925                    var $btn = $(this);
1926
1927                    if ($btn.hasClass('account_logout')) {
1928                        return;
1929                    }
1930
1931                    $btn.on('click', function () {
1932                        var currentUrl = new URL(window.location.href);
1933                        currentUrl.searchParams.set('vat', vatCode);
1934                        window.location.replace(currentUrl.toString());
1935                    });
1936                });
1937            } else {
1938                loggedInBtn.on("click", function () {
1939                    loggedIn.modal("hide");
1940                });
1941            }
1942
1943            loginModal.modal("hide");
1944            loggedIn.modal();
1945			setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
1946			
1947            loggedIn.on("hidden.bs.modal", function () {
1948                $(this).remove();
1949            });
1950        }
1951    });
1952}
1953
1954function createLogoutModal() {
1955	var clickLogoutText = {
1956		en: 'Click Here to Log Out',
1957		de: 'Klicke hier, um dich abzumelden',
1958		fr: 'Se d&eacute;connecter',
1959		it: 'Clicca qui per uscire',
1960		es: 'Haz clic aqu&iacute; para desconectarte.'
1961	};
1962	var modalTitleText = {
1963		en: 'Account Logout',
1964		de: 'Konto-Logout',
1965		fr: 'D&eacute;connexion',
1966		it: 'Esci dall\'account',
1967		es: 'Iniciar sesi&oacute;n'
1968	};
1969	var logoutModal = utilities.generateModalMarkup();
1970
1971	var logoutBody = $('<div><\/div>'),
1972		logoutForm = $('<form method="post" action="/"><\/form>');
1973		//logoutForm = $('<form method="post" action="/zzz/responsive/"><\/form>');
1974
1975	logoutBody.append(logoutForm.append($('<input type="hidden" name="pass" value="LGOUT" />')).append($('<button type="submit" class="btn button-brand">'+ clickLogoutText[utilities.pageLang().getLang()] +'</button>')));
1976
1977	logoutModal.find(".modal-dialog").addClass("modal-logout");
1978	logoutModal.find(".modal-title").html(modalTitleText[utilities.pageLang().getLang()]);
1979	logoutModal.find(".modal-body").append(logoutBody);
1980
1981	logoutModal.modal();
1982	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
1983
1984	logoutModal.on("hidden.bs.modal", function() {
1985		$(this).remove();
1986	});
1987}
1988
1989function createMailingModal(subForm) {
1990	var formSubmitURL = subForm.attr('action');
1991	var subEmail = subForm.find('#subscr_email');
1992	var subLists = subForm.find('.ml_check');
1993	var sub16 = subForm.find('.chk_16');
1994	var pattern = new RegExp(/^[A-Za-z0-9._%\-+]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,4}$/);
1995	// Do not encode these, they are used for alerts
1996	var validEmailText = {
1997		en: 'Please enter a valid email address',
1998		de: 'Füge bitte eine gültige E-Mail-Adresse ein',
1999		fr: 'Veuillez enter une adresse e-mail valide',
2000		it: 'Ti preghiamo di inserire un indirizzo email valido ',
2001		es: 'Por favor, introduce un correo v&aacute;lido.'
2002	};
2003	var selectNewsletterText = {
2004		en: 'Please select at least one newsletter',
2005		de: 'Wähle bitte mindestens einen Newsletter aus',
2006		fr: 'Veuillez sélectionner une newsletter au minimum',
2007		it: 'Ti preghiamo di selezionare almeno una newsletter',
2008		es: 'Por favor, selecciona al menos una newsletter'
2009	};
2010	var alert_notsixteen = {
2011		en:"Please confirm that you are over 16.",
2012		de:"Bitte bestätige, dass du über 16 Jahre alt bist.",
2013		es:"Por favor, confirma que eres mayor de 16 años",
2014		fr:"Veuillez confirmer que vous êtes âgé d'au moins 16 ans.",
2015		it:"Per favore, conferma di avere più di 16 ani di età"
2016	};
2017
2018	if (!pattern.test(subEmail.val())) {
2019		alert(validEmailText[utilities.pageLang().getLang()]);
2020		subEmail.val("").focus();
2021	} else if (!subLists.is(":checked")) {
2022		alert(selectNewsletterText[utilities.pageLang().getLang()]);
2023	} else if (!sub16.is(":checked")) {
2024		alert(alert_notsixteen[utilities.pageLang().getLang()]);
2025	} else {
2026		//GA event tracking
2027		var vidLabel = subForm.data("trackaction"),
2028			vidName = [],
2029			listText = '';
2030		var listJoinedText = {
2031			en: 'List Joined',
2032			de: 'Der Liste beigetreten',
2033			fr: 'Vous &ecirc;tes abonn&eacute;(e) &agrave; la newsletter',
2034			it: 'Ti sei iscritto alla newsletter',
2035			es: 'Lista en la que est&aacute;s registrado'
2036		};
2037		var listsJoinedText = {
2038			en: 'Lists Joined',
2039			de: 'Den Listen beigetreten',
2040			fr: 'Vous &ecirc;tes abonn&eacute;(e) aux newsletters',
2041			it: 'Ti sei iscritto alle newsletter',
2042			es: 'Listas en las que est&aacute;s registrado'
2043		};
2044
2045		subForm.find("input[type=checkbox]:checked").each(function() {
2046			if ($(this).attr("id") !== "all_list") {
2047				vidName.push($(this).parent().text());
2048			}
2049		});
2050		if (vidName.length > 1) {
2051			listText = ' '+ listsJoinedText[utilities.pageLang().getLang()];
2052		} else {
2053			listText = ' '+ listJoinedText[utilities.pageLang().getLang()];
2054		}
2055		vidName = vidName.join(", ") + listText;
2056		utilities.reportEventTracking('Email Sign-up', vidLabel, vidName);
2057
2058		$.post(formSubmitURL, subForm.serialize(), function(data) {
2059			var shopPickleText = {
2060				en: 'Shop Total Pickleball',
2061				de: 'Zur&uuml;ck zu Total Pickleball',
2062				fr: 'Retour &agrave; la boutique Total Pickleball',
2063				it: 'Acquista su Total Pickleball',
2064				es: 'Compra en Total Pickleball'
2065			};
2066			var oopsText = {
2067				en: 'Oops, something went wrong!',
2068				de: 'Da lief wohl irgendwas schief!',
2069				fr: 'Oups ! Un probl&egrave;me est survenu.',
2070				it: 'Ops! Si &egrave; verificato un errore.',
2071				es: 'Vaya, algo ha ido mal.'
2072			};
2073			var thankYouText = {
2074				en: 'Thank you for signing up!',
2075				de: 'Danke f&uuml;rs Anmelden!',
2076				fr: 'Merci pour votre abonnement !',
2077				it: 'Ti ringraziamo per esserti iscritto!',
2078				es: '&iexcl;Gracias por suscribirte!'
2079			};
2080			var yourEmailText = {
2081				en: 'Your email has been added to our system.',
2082				de: 'Deine E-Mail wurde unserem System hinzugef&uuml;gt.',
2083				fr: 'Votre adresse e-mail a bien &eacute;t&eacute; ajout&eacute;e &agrave; notre liste.',
2084				it: 'Il tuo indirizzo email &egrave;
2084 stato aggiunto al nostro sistema.',
2085				es: 'Hemos a&ntilde;adido tu direcci&oacute;n a nuestro sistema'
2086			};
2087			var thankYouPickleText = {
2088				en: 'Thank you!<br>Tennis Warehouse Europe',
2089				de: 'Tennis Warehouse Europe sagt Danke!',
2090				fr: 'Tennis Warehouse Europe vous remercie !',
2091				it: 'Grazie! <br>Tennis Warehouse Europe',
2092				es: '&iexcl;Gracias! <br>Tennis Warehouse Europe'
2093			};
2094			var sorryText = {
2095				en: 'We are sorry. Something appears to have gone wrong. Please refresh and try again.',
2096				de: 'Sorry! Etwas scheint schief gelaufen zu sein. Bitte aktualisiere die Seite und versuche es erneut.',
2097				fr: 'Veuillez nous excuser. Une erreur s\'est produite. Merci de rafra&icirc;chir la page et de r&eacute;essayer.',
2098				it: 'Siamo spiacenti. Si &egrave; verificato un errore. Ti preghiamo di ricaricare la pagina e provare di nuovo.',
2099				es: 'Lo sentimos, algo ha salido mal. Por favor, recarga la p‡gina.'
2100			};
2101			var jsonData = JSON.parse(data);
2102			var frameModal = utilities.generateModalMarkup({headingType: "h3", hasFooter: true});
2103			var frameBody = $('<div />');
2104			var frameClose = $('<button type="button" class="btn btn-link mr-auto">Close</button>');
2105			var frameShop = $('<a href="/" class="btn button-brand">'+ shopPickleText[utilities.pageLang().getLang()] +'</a>');
2106			//var frameShop = $('<a href="https://www.tenniswarehouse-europe.com/zzz/responsive/" class="btn btn-primary">'+ shopPickleText[utilities.pageLang().getLang()] +'</a>');
2107			frameModal.find(".modal-dialog").addClass("modal-mail_signup");
2108
2109			frameModal.find(".modal-footer").append(frameClose);
2110			if (jsonData.errors) {
2111				frameModal.find(".modal-title").html(oopsText[utilities.pageLang().getLang()]);
2112				frameBody.append('<p>'+jsonData.errors[0].message+'</p>');
2113			} else if (jsonData.job_id) {
2114				frameModal.find(".modal-title").html(thankYouText[utilities.pageLang().getLang()]);
2115				frameBody.append('<p>'+ yourEmailText[utilities.pageLang().getLang()] +'</p>')
2116					.append('<p>'+ thankYouPickleText[utilities.pageLang().getLang()] +'</p>');
2117
2118				frameModal.find(".modal-footer").append(frameShop);
2119			} else {
2120				frameModal.find(".modal-title").html(oopsText[utilities.pageLang().getLang()]);
2121				frameBody.append('<p>'+ sorryText[utilities.pageLang().getLang()] +'</p>');
2122			}
2123
2124			frameModal.find(".modal-body").append(frameBody);
2125
2126			frameModal.modal();
2127			setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2128
2129			frameModal.on("hidden.bs.modal", function() {
2130				$(this).remove();
2131			});
2132
2133			frameClose.on("click", function(e) {
2134				e.preventDefault();
2135				frameModal.modal("hide");
2136			});
2137		});
2138	}
2139}
2140
2141function createUnsubCheckModal(unsubCheckForm) {
2142	var formSubmitURL = unsubCheckForm.attr('action');
2143	var unsubEmail = unsubCheckForm.find('#unsubscr_email_copy');
2144	var pattern = new RegExp(/^[A-Za-z0-9._%\-+]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,4}$/);
2145
2146	var validEmailText = {
2147		en: 'Please enter a valid email address',
2148		de: 'Füge bitte eine gültige E-Mail-Adresse ein',
2149		fr: 'Veuillez enter une adresse e-mail valide',
2150		it: 'Ti preghiamo di inserire un indirizzo email valido ',
2151		es: 'Por favor, introduce un correo v&aacute;lido.'
2152	};
2153	var currentlySubscribedText = {
2154		en: "You are currently subscribed to the following newsletters. Please select the ones you would like to stop receiving and click unsubscribe to stop receiving newsletters.",
2155		fr: "Vous &ecirc;tes actuellement abonn&eacute; aux newsletters suivantes. Veuillez s&eacute;lectionner celles que vous souhaitez ne plus recevoir et cliquer sur &quot;se d&eacute;sabonner&quot; pour ne plus recevoir ces newsletters.",
2156		de: "Du bist derzeit f&uuml;r die folgenden Newsletter angemeldet. Bitte w&auml;hle die Newsletter aus, die du nicht mehr erhalten m&ouml;chtest und klicke auf &quot;Abmelden&quot;, um diese Newsletter nicht mehr zu erhalten.",
2157		it: "Al momento sei iscritto alla newsletter. Ti invitiamo a selezione quella che vorresti interrompere e clicca su disiscriviti per interromperne definitivemente la ricezione.",
2158		es: "Actualmente est&aacute;s suscrito/a en las siguientes newsletters. Por favor, selecciona las que quieres dejar de recibir y haz click para darte de baja."
2159	};
2160	var closeText = {
2161		en: "Close",
2162		fr: "Fermer",
2163		de: "Schlie&szlig;en",
2164		it: "Chiudi",
2165		es: "Cerrar"
2166	};
2167	var allListsText = {
2168		en: "All Newsletters",
2169		fr: "Toutes les newsletters",
2170		de: "Alle Newsletter",
2171		it: "Tutte le newsletter",
2172		es: "Todas las newsletters"
2173	};
2174	var unsubscribeText = {
2175		en: "Unsubscribe",
2176		fr: "Se d&eacute;sabonner",
2177		de: "Abmelden",
2178		it: "Disiscriviti",
2179		es: "Darse de baja"
2180	};
2181	var notSubscribedText = {
2182		en: "You are not currently subscribed to any newsletters.",
2183		fr: "Vous n'&ecirc;tes actuellement abonn&eacute; &agrave; aucune newsletter.",
2184		de: "Du hast derzeit keinen Newsletter abonniert.",
2185		it: "Al momento non sei iscritto a nessuna newsletter.",
2186		es: "Actualmente no est&aacute;s suscrito a ninguna newsletter."
2187	};
2188	var shopTennisText = {
2189		en: "Shop Tennis Warehouse Europe",
2190		fr: "Accueil Tennis Warehouse Europe",
2191		de: "Shoppe jetzt bei Tennis Warehouse Europe",
2192		it: "Acquista su Tennis Warehouse Europe",
2193		es: "Visita Tennis Warehouse Europe"
2194	};
2195
2196	if (!pattern.test(unsubEmail.val())) {
2197		var decodedText = $("<div/>").html(validEmailText[utilities.pageLang().getLang()]).text(); // Encoded text needs to be decoded to properly show in alert
2198		alert(decodedText);
2199		unsubEmail.val("").focus();
2200		return false;
2201	} else {
2202		$.post(formSubmitURL, unsubCheckForm.serialize(), function(data) {
2203			var unsubCheckModal = utilities.generateModalMarkup();
2204			var unsubCheckBody = $('<div />');
2205			var unsubCheckCustomFooter = $('<div />').css({ 'display': 'flex', 'justify-content': 'space-between', 'align-items': 'center', "margin-top": "1rem" });
2206			unsubCheckModal.find(".modal-dialog").addClass("modal-mail_unsubCheck");
2207			var unsubCheckClose = $('<button type="button" class="btn btn-link">' + closeText[utilities.pageLang().getLang()] + '</button>');
2208			var unsubscribeMessage = $('<p>' + currentlySubscribedText[utilities.pageLang().getLang()] + '</p>');
2209			var unsubscribeAll = $('<label><input class="ml_check_unsub mailer_signup-row-check" type="checkbox" id="all_list_unsub" value="signup">' + allListsText[utilities.pageLang().getLang()] + '</label>');
2210			var emailNotFound = 'list_ids not found for this email.';
2211
2212			unsubscribeAll.find('input').on('change', function() {
2213				var isChecked = $(this).is(':checked');
2214				unsubscribeForm.find('input[type="checkbox"]').not('#all_list_unsub').each(function() {
2215					$(this).prop('checked', isChecked);
2216				});
2217			});
2218
2219			unsubCheckClose.on("click", function(e) {
2220				e.preventDefault();
2221				unsubCheckModal.modal("hide");
2222			});
2223
2224			if (data && data !== emailNotFound) {
2225				var unsubscribeForm = $('<form class="unsubscr_form d-flex flex-column" method="post" action="https://www.tenniswarehouse-europe.com/ajax/mail_unsubscribe.php"><\/form>');
2226				var recaptchaHiddenInput = $('<input>').attr({
2227					type: 'hidden',
2228					name: 'g-recaptcha-response'
2229				});
2230				var unsubscribeEmailInput = $('<input>').attr({
2231					id: 'unsubscr_email',
2232					type: 'email',
2233					name: 'email',
2234					value: unsubEmail.val()
2235				}).addClass('news_email form-control d-none');
2236				var unsubscribeSubmit = $('<button>').attr({
2237					type: 'submit'
2238				}).addClass('btn btn-primary').html(unsubscribeText[utilities.pageLang().getLang()]);
2239
2240				unsubCheckModal.find(".modal-title").html(unsubscribeText[utilities.pageLang().getLang()]);
2241				unsubscribeForm.append(recaptchaHiddenInput);
2242				unsubscribeForm.append(unsubscribeEmailInput);
2243				unsubscribeForm.append(unsubscribeMessage);
2244				unsubscribeForm.append(data);
2245				unsubscribeForm.append(unsubscribeAll);
2246				unsubscribeForm.append($('<br>'));
2247				unsubscribeForm.append(utilities.recaptchaRequiredMessage);
2248				unsubCheckCustomFooter.append(unsubCheckClose);
2249				unsubCheckCustomFooter.append(unsubscribeSubmit);
2250				unsubscribeForm.append(unsubCheckCustomFooter);
2251				unsubCheckBody.append(unsubscribeForm);
2252
2253				unsubscribeForm.on("submit", function(e) {
2254					e.preventDefault();
2255					createUnsubModal(unsubscribeForm);
2256					unsubCheckModal.modal('hide');
2257				});
2258
2259				unsubscribeForm.find('.btn.btn-primary').on("click", function(e) {
2260					e.preventDefault();
2261					utilities.validateRecaptcha(unsubscribeForm, 'mailing_signup');
2262				});
2263			} else {
2264				unsubCheckModal.find(".modal-title").html(unsubscribeText[utilities.pageLang().getLang()]);
2265				unsubCheckBody.append('<p>' + notSubscribedText[utilities.pageLang().getLang()] + '</p>');
2266				unsubCheckBody.append(unsubCheckCustomFooter);
2267				unsubCheckCustomFooter.append(unsubCheckClose);
2268				unsubCheckCustomFooter.append('<a href="/" class="btn btn-primary">' + shopTennisText[utilities.pageLang().getLang()] + '</a>');
2269			}
2270
2271			unsubCheckModal.find(".modal-body").append(unsubCheckBody);
2272			unsubCheckModal.find(".modal-content").addClass("animate-bottom");
2273
2274			unsubCheckModal.modal();
2275			setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2276
2277			unsubCheckModal.on("hidden.bs.modal", function() {
2278				$(this).remove();
2279			});
2280		});
2281	}
2282}
2283
2284function createUnsubModal(unsubform) {
2285	var formSubmitURL = unsubform.attr('action');
2286	var unsubEmail = unsubform.find('#unsubscr_email');
2287	var pattern = new RegExp(/^[A-Za-z0-9._%\-+]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,4}$/);
2288
2289	if (!pattern.test(unsubEmail.val())) {
2290		var validEmailText = {
2291			en: 'Please enter a valid email address',
2292			de: 'Füge bitte eine gültige E-Mail-Adresse ein',
2293			fr: 'Veuillez enter une adresse e-mail valide',
2294			it: 'Ti preghiamo di inserire un indirizzo email valido ',
2295			es: 'Por favor, introduce un correo v&aacute;lido.'
2296		};
2297		var decodedText = $("<div/>").html(validEmailText[utilities.pageLang().getLang()]).text(); // Encoded text needs to be decoded to properly show in alert
2298		alert(decodedText);
2299		unsubEmail.val("").focus();
2300		return false;
2301	} else {
2302		$.post(formSubmitURL, unsubform.serialize(), function(data) {
2303			var oopsText = {
2304				en: 'Oops, something went wrong!',
2305				de: 'Da lief wohl irgendwas schief!',
2306				fr: 'Oups ! Un probl&egrave;me est survenu.',
2307				it: 'Ops! Si &egrave; verificato un errore.',
2308				es: 'Vaya, algo ha ido mal.'
2309			};
2310			var unsubscribedText = {
2311				en: 'You have been unsubscribed.',
2312				de: 'Du wurdest abgemeldet.',
2313				fr: 'Vous avez &eacute;t&eacute; d&eacute;sinscrit(e) avec succ&egrave;s.',
2314				it: 'Hai annullato la tua iscrizione.',
2315				es: 'Has eliminado tu suscripci&oacute;n.'
2316			};
2317			var sorryText = {
2318				en: 'We are sorry. Something appears to have gone wrong. Please refresh and try again.',
2319				de: 'Sorry! Etwas scheint schief gelaufen zu sein. Bitte aktualisiere die Seite und versuche es erneut.',
2320				fr: 'Veuillez nous excuser. Une erreur s\'est produite. Merci de rafra&icirc;chir la page et de r&eacute;essayer.',
2321				it: 'Siamo spiacenti. Si &egrave; verificato un errore. Ti preghiamo di ricaricare la pagina e provare di nuovo.',
2322				es: 'Lo sentimos, algo ha salido mal. Por favor, recarga la p&aacute;gina.'
2323			};
2324			var jsonData = JSON.parse(data);
2325			var unsubModal = utilities.generateModalMarkup();
2326			var unsubBody = $('<div />');
2327			unsubModal.find(".modal-dialog").addClass("modal-mail_unsub");
2328
2329			if (jsonData.errors) {
2330				unsubModal.find(".modal-title").html(oopsText[utilities.pageLang().getLang()]);
2331				unsubBody.append('<p>'+jsonData.errors[0].message+'</p>');
2332			} else if (jsonData.recipient_emails) {
2333				// Needs translations
2334				unsubModal.find(".modal-title").html('Unsubscribe');
2335				unsubBody.append('<p>'+ unsubscribedText[utilities.pageLang().getLang()] +'</p>');
2336			} else {
2337				unsubModal.find(".modal-title").html(oopsText[utilities.pageLang().getLang()]);
2338				unsubBody.append('<p>'+ sorryText[utilities.pageLang().getLang()] +'</p>');
2339			}
2340
2341			unsubModal.find(".modal-body").append(unsubBody);
2342
2343			unsubModal.modal();
2344			setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2345
2346			unsubModal.on("hidden.bs.modal", function() {
2347				$(this).remove();
2348			});
2349		});
2350	}
2351}
2352
2353function createForgotModal() {
2354	var emailText = {
2355		en: 'Email address',
2356		de: 'E-Mail-Adresse',
2357		fr: 'E-mail',
2358		es: 'E-mail',
2359		it: 'Indirizzo email'
2360	};
2361	var submitText = {
2362		en: 'Submit',
2363		de: 'Senden',
2364		fr: 'Envoyer',
2365		it: 'Conferma',
2366		es: 'Enviar'
2367	};
2368	var modalTitleText = {
2369		en: 'Password Reset',
2370		de: 'Passwort zur&uuml;cksetzen',
2371		fr: 'Mot de passe r&eacute;initialis&eacute;',
2372		it: 'Reimposta la Password',
2373		es: 'Restablecimiento de contrase&ntilde;a'
2374	};
2375	var enterEmailText = {
2376		en: 'Enter the email address associated with your account and a temporary password will be sent to your inbox.',
2377		de: 'Gebe die mit deinem Konto verkn&uuml;pfte E-Mail-Adresse ein und ein tempor&auml;res Passwort wird an deinen Posteingang gesendet.',
2378		fr: 'Entrez l\'adresse e-mail associ&eacute;e &agrave; votre compte et un mot de passe temporaire vous sera envoy&eacute; par e-mail.',
2379		it: 'Inserisci l\'indirizzo email associato al tuo account e ti sar&agrave; inviata una password temporanea per email.',
2380		es: 'Escribe la direcci&oacute;n de correo electr&oacute;nico asociada a tu cuenta y te mandaremos una contrase&ntilde;a temporal.'
2381	};
2382	var forgotModal = utilities.generateModalMarkup();
2383
2384	var forgotBody = $('<div><\/div>'),
2385		forgotForm = $('<form method="post" action="/passwordreset.html"><\/form>'),
2386		//forgotForm = $('<form method="post" action="https://www.tenniswarehouse-europe.com/zzz/responsive/passwordreset.html"><\/form>'),
2387		forgotEmail = $('<div class="form-group"><input type="email" class="form-control" id="modal-reset_pw" aria-describedby="Password Reset Email" name="login" value=""><label for="modal-reset_pw" class="is-lifted zero">'+ emailText[utilities.pageLang().getLang()] +'<\/label><input type="hidden" name="pass" value="RESET" \/><\/div>'),
2388		forgotSubmit = $('<button type="submit" class="btn button-brand btn-block btn-constrain">'+ submitText[utilities.pageLang().getLang()] +'<\/button>');
2389
2390	forgotModal.find(".modal-dialog").addClass("modal-pw_reset");
2391	forgotModal.find(".modal-title").html(modalTitleText[utilities.pageLang().getLang()]);
2392	forgotModal.find(".modal-body").append(
2393		forgotBody.append(
2394			forgotForm.append('<p>'+ enterEmailText[utilities.pageLang().getLang()] +'</p>').append(forgotEmail).append(forgotSubmit)
2395		)
2396	);
2397
2398	forgotModal.find(".form-group").enhanceInput();
2399
2400	forgotModal.modal();
2401	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2402
2403	forgotModal.on("hidden.bs.modal", function() {
2404		$(this).remove();
2405	});
2406}
2407
2408/*
2409var wishListCheck = async function(serializedData = '') {
2410	var request;
2411
2412	try {
2413		request = await $.ajax({
2414			url: "/wishlist/wishlist_create.php",
2415			type: "post",
2416			data: serializedData
2417		});
2418
2419		return request;
2420	} catch (error) {
2421		return error;
2422	}
2423}
2424*/
2425
2426var wishListCheck = function(serializedData, cb) {
2427	if (!serializedData)
2428		serializedData = ''
2429
2430	$.ajax({
2431		url: "/wishlist/wishlist_create.php",
2432		type: "post",
2433		data: serializedData,
2434		success: function(data) { cb(data) },
2435		error: function(error) { return error }
2436	});
2437}
2438
2439function generateMSRPModal(textTitle) {
2440	var msrpModal = utilities.generateModalMarkup({hasHeader: true, headingType: "h3", fullModal: false});
2441	var noMSRP = $(".style_ordering-area").find(".nomsrp");
2442	var enterSRPText = {
2443		en: "Price comparisons are based on the Suggested Retail Price ('SRP') or Original Selling Price. Actual sales may not have occurred at this price.",
2444		de: "Der Preisvergleich basiert auf dem empfohlenen Verkaufspreis ('UVP') oder dem urspr&uuml;nglichen Verkaufspreis. Es ist jedoch m&ouml;glich, dass der/die Artikel nicht zu jenem Preis angeboten wurde(n).",
2445		fr: "Les comparatifs de prix se basent sur le prix public conseill&eacute; ('PPC') ou le prix de vente d'origine. Toutefois, il est possible que le ou les articles n'ait/n'aient pas &eacute;t&eacute; propos&eacute;(s) &agrave; ce prix.",
2446		it: "Le differenze di prezzo sono basate sul Prezzo di Vendita Consigliato ('SRP') o sul Prezzo Originale di Vendita. A questo prezzo &egrave; possibile che non sia stato applicato uno sconto.",
2447		es: "Las comparaciones de precios se basan en el Precio Recomendado de Venta al P&uacute;blico ('PRVP') o en el precio original de venta. Es posible que las ventas reales no se hayan realizado a este precio."
2448	};
2449
2450	if (noMSRP.length) {
2451		msrpModal.find(".modal-title").text("Original Selling Price Disclaimer");
2452	} else {
2453		msrpModal.find(".modal-title").text(textTitle);
2454	}
2455
2456	var msrpBody = $('<div class="msrp_container"></div>');
2457	var msrpDetails = $('<div class="msrp_container-details"></div>');
2458	if (noMSRP.length) {
2459		var msrpInfo = enterSRPText[utilities.pageLang().getLang()];
2460	} else {
2461		var msrpInfo = enterSRPText[utilities.pageLang().getLang()];
2462	}
2463
2464	msrpBody.append(msrpDetails)
2465			.append(msrpInfo);
2466
2467	msrpModal.find(".modal-dialog").addClass("modal-msrp");
2468	msrpModal.find(".modal-body").append(msrpBody);
2469	msrpModal.find(".modal-content").addClass("animate-bottom");
2470
2471	msrpModal.modal();
2472	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2473
2474	msrpModal.find(".close").on("click",function(e){
2475		e.preventDefault();
2476		msrpModal.modal("hide");
2477	});
2478}
2479
2480function createWishNew(listLogin) {
2481	var listNameText = {
2482		en: 'List Name',
2483		de: 'Name der Wunschliste',
2484		fr: 'Nom de la liste',
2485		it: 'Nome della lista',
2486		es: 'Nombre de la lista'
2487	};
2488	var cancelText = {
2489		en: 'Cancel',
2490		de: 'Abbrechen',
2491		fr: 'Annuler',
2492		it: 'Annulla',
2493		es: 'Cancelar'
2494	};
2495	var createText = {
2496		en: 'Create List',
2497		de: 'Wunschliste erstellen',
2498		fr: 'Nouvelle liste',
2499		it: 'Crea una lista',
2500		es: 'Crear lista'
2501	};
2502	var modalTitleText = {
2503		en: 'Create New List',
2504		de: 'Neue Wunschliste erstellen',
2505		fr: 'Cr&eacute;er une nouvelle liste',
2506		it: 'Crea una nuova lista',
2507		es: 'Crear nueva lista'
2508	};
2509	var lang = utilities.pageLang().getLang().toUpperCase();
2510	var newModal = utilities.generateModalMarkup({ hasFooter: true, fullModal: false });
2511
2512	var newBody = $('<div><\/div>');
2513	var newForm = $('<form method="post"><input type="hidden" name="order" value="e_l" /><input type="hidden" name="e_l" value="new_wish" /><input type="hidden" name="wish_lang" value="'+lang+'" /><\/form>');
2514	var newListName = $('<div class="form-group"><input type="text" class="form-control" id="modal-list_name" aria-labelledby="modal-list_name-label" name="list_name" value=""><label for="modal-list_name" id="modal-list_name-label" class="is-lifted zero">'+ listNameText[utilities.pageLang().getLang()] +'<\/label><\/div>');
2515	var newListRecaptcha = $('<div id="wish_reCaptcha"><\/div>');
2516	var newCancel = $('<button type="button" class="btn btn-link mr-auto">'+ cancelText[utilities.pageLang().getLang()] +'<\/button>
2516');
2517	var newSubmit = $('<button type="submit" class="btn button-brand">'+ createText[utilities.pageLang().getLang()] +'<\/button>');
2518
2519	newModal.find(".modal-dialog").addClass("modal-list_new");
2520	newModal.find(".modal-title").html(modalTitleText[utilities.pageLang().getLang()]);
2521	newModal.find(".modal-body").append(
2522		newBody.append(
2523			newForm.append(newListName)
2524		).append(utilities.recaptchaRequiredMessage(utilities.pageLang().getLang()))
2525	);
2526	newModal.find(".modal-footer").append(newCancel).append(newSubmit);
2527
2528	newModal.find(".form-group").enhanceInput();
2529
2530	newModal.modal();
2531	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2532
2533	newModal.on("hidden.bs.modal", function() {
2534		$(this).remove();
2535	});
2536
2537	/*
2538	newForm.on("submit", function(e) {
2539		e.preventDefault();
2540
2541		var serializeData = $(this).serialize();
2542
2543		wishListCheck(serializeData).then((data) => {
2544			if (data === "success") {
2545				newForm.unbind("submit");
2546				newForm.submit();
2547			} else {
2548				if (newForm.find(".alert").length) {
2549					newForm.find(".alert").html(data);
2550				} else {
2551					newForm.prepend('<div class="alert alert-danger mb-3" role="alert">'+ data +'</div>');
2552				}
2553			}
2554		});
2555	});
2556	*/
2557
2558	newForm.on("submit", function(e) {
2559		e.preventDefault();
2560
2561		var serializeData = $(this).serialize();
2562
2563		function callbackFnc(data) {
2564			if (data === "success") {
2565				newForm.unbind("submit");
2566				newForm.submit();
2567			} else {
2568				if (newForm.find(".alert").length) {
2569					newForm.find(".alert").html(data);
2570				} else {
2571					newForm.prepend('<div class="alert alert-danger mb-3" role="alert">'+ data +'</div>');
2572				}
2573			}
2574		}
2575
2576		wishListCheck(serializeData, callbackFnc);
2577	});
2578
2579	newCancel.on("click", function(e) {
2580		e.preventDefault();
2581		newModal.modal("hide");
2582	});
2583
2584	newSubmit.on("click", function(e) {
2585		e.preventDefault();
2586		if (!listLogin)
2587			utilities.validateRecaptcha(newForm, 'new_wishlist');
2588		else
2589			newForm.submit();
2590	});
2591
2592	/*
2593	if (!listLogin) {
2594		var wishReCaptcha = function() {
2595			grecaptcha.render('wish_reCaptcha', {
2596				'sitekey' : '6LfJZc0rAAAAANGo8xIOO5z5TRpxgoQY7_laSouW'
2597			});
2598		}
2599
2600		wishReCaptcha();
2601	}
2602	*/
2603}
2604
2605function createWishRename(listCode, listName) {
2606	var listNameText = {
2607		en: 'List Name',
2608		de: 'Name der Wunschliste',
2609		fr: 'Nom de la liste',
2610		it: 'Nome della lista',
2611		es: 'Nombre de la lista'
2612	};
2613	var cancelText = {
2614		en: 'Cancel',
2615		de: 'Abbrechen',
2616		fr: 'Annuler',
2617		it: 'Annulla',
2618		es: 'Cancelar'
2619	};
2620	var renameText = {
2621		en: 'Rename List',
2622		de: 'Wunschliste umbenennen',
2623		fr: 'Renommer ma liste',
2624		it: 'Rinomina la lista',
2625		es: 'Renombrar la lista'
2626	};
2627	var renameModal = utilities.generateModalMarkup({ hasFooter: true, fullModal: false });
2628
2629	var renameBody = $('<div><\/div>');
2630	var renameForm = $('<form method="post"><input type="hidden" name="order" value="e_l" \/><input type="hidden" name="e_l" value="'+ listCode +'" \/><\/form>');
2631	var renameListName = $('<div class="form-group"><input type="text" class="form-control" id="modal-list_name" aria-labelledby="modal-list_name-label" name="list_name" value="'+ listName +'"><label for="modal-list_name" id="modal-list_name-label" class="is-lifted zero">'+ listNameText[utilities.pageLang().getLang()] +'<\/label><\/div>');
2632	var renameCancel = $('<button type="button" class="btn btn-link mr-auto">'+ cancelText[utilities.pageLang().getLang()] +'<\/button>');
2633	var renameSubmit = $('<button type="submit" class="btn button-brand">'+ renameText[utilities.pageLang().getLang()] +'<\/button>');
2634
2635	renameModal.find(".modal-dialog").addClass("modal-list_rename");
2636	renameModal.find(".modal-title").html(renameText[utilities.pageLang().getLang()]);
2637	renameModal.find(".modal-body").append(
2638		renameBody.append(
2639			renameForm.append(renameListName)
2640		)
2641	);
2642	renameModal.find(".modal-footer").append(renameCancel).append(renameSubmit);
2643
2644	renameModal.find(".form-group").enhanceInput();
2645
2646	renameModal.modal();
2647	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2648
2649	renameModal.on("hidden.bs.modal", function() {
2650		$(this).remove();
2651	});
2652
2653	renameCancel.on("click", function(e) {
2654		e.preventDefault();
2655		renameModal.modal("hide");
2656	});
2657
2658	renameSubmit.on("click", function(e) {
2659		e.preventDefault();
2660		renameForm.submit();
2661	});
2662}
2663
2664function createWishDelete(formParent) {
2665	var confirmDeleteText = {
2666		en: 'Are you sure you want to delete this list? This cannot be undone.',
2667		de: 'M&ouml;chtest du diese Wunschliste wirklich l&ouml;schen? Dies kann nicht r&uuml;ckg&auml;ngig gemacht werden.',
2668		fr: '&Ecirc;tes-vous s&ucirc;r(e) de vouloir supprimer cette liste ? Cette action est irr&eacute;versible.',
2669		it: 'Sei sicuro/a di voler eliminare questa lista? Questa azione &egrave; irreversibile.',
2670		es: '&iquest;Seguro que quieres eliminar esta lista? Esta acci&oacute;n es irreversible.'
2671	};
2672	var cancelText = {
2673		en: 'Cancel',
2674		de: 'Abbrechen',
2675		fr: 'Annuler',
2676		it: 'Annulla',
2677		es: 'Cancelar'
2678	};
2679	var confirmText = {
2680		en: 'Confirm',
2681		de: 'Best&auml;tigen',
2682		fr: 'Confirmer',
2683		it: 'Confermo',
2684		es: 'Confirmar'
2685	};
2686	var modalTitleText = {
2687		en: 'Confirm Delete',
2688		de: 'L&ouml;schvorgang best&auml;tigen',
2689		fr: 'Confirmer la suppression',
2690		it: 'Confermo l\'eliminazione ',
2691		es: 'Confirmar para eliminar'
2692	};
2693	var deleteModal = utilities.generateModalMarkup({ hasFooter: true, fullModal: false });
2694
2695	var deleteBody = $('<div><\/div>');
2696	var deleteNote = $('<p>'+ confirmDeleteText[utilities.pageLang().getLang()] +'<\/p>');
2697	var deleteCancel = $('<button type="button" class="btn btn-link mr-auto">'+ cancelText[utilities.pageLang().getLang()] +'<\/button>');
2698	var deleteSubmit = $('<button type="button" class="btn button-brand">'+ confirmText[utilities.pageLang().getLang()] +'<\/button>');
2699
2700	deleteModal.find(".modal-dialog").addClass("modal-list_delete");
2701	deleteModal.find(".modal-title").html(modalTitleText[utilities.pageLang().getLang()]);
2702	deleteModal.find(".modal-body").append(
2703		deleteBody.append(deleteNote)
2704	);
2705	deleteModal.find(".modal-footer").append(deleteCancel).append(deleteSubmit);
2706
2707	deleteModal.modal();
2708	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2709
2710	deleteModal.on("hidden.bs.modal", function() {
2711		$(this).remove();
2712	});
2713
2714	deleteCancel.on("click", function(e) {
2715		e.preventDefault();
2716		deleteModal.modal("hide");
2717	});
2718
2719	deleteSubmit.on("click", function(e) {
2720		e.preventDefault();
2721
2722		formParent.submit();
2723	});
2724}
2725
2726function createWishCopy(listCode, listName, listLogin) {
2727	var listNameText = {
2728		en: 'List Name',
2729		de: 'Name der Wunschliste',
2730		fr: 'Nom de la liste',
2731		it: 'Nome della lista',
2732		es: 'Nombre de la lista'
2733	};
2734	var cancelText = {
2735		en: 'Cancel',
2736		de: 'Abbrechen',
2737		fr: 'Annuler',
2738		it: 'Annulla',
2739		es: 'Cancelar'
2740	};
2741	var wishCopyText = {
2742		en: 'Copy List',
2743		de: 'Wunschliste kopieren',
2744		fr: 'Copier ma liste',
2745		it: 'Copia la lista',
2746		es: 'Copiar lista'
2747	};
2748	var copyModal = utilities.generateModalMarkup({ hasFooter: true, fullModal: false });
2749
2750	var copyBody = $('<div><\/div>');
2751	var copyForm = $('<form method="post" action="/wishlist/"><input type="hidden" name="order" value="e_l" /><input type="hidden" name="e_l" value="'+ listCode +'" /><input type="hidden" name="list_act" value="copy" /><\/form>');
2752	//var copyForm = $('<form method="post" action="https://www.tenniswarehouse-europe.com/zzz/responsive/wishlist/"><input type="hidden" name="order" value="e_l" /><input type="hidden" name="e_l" value="'+ listCode +'" /><input type="hidden" name="list_act" value="copy" /><\/form>');
2753	var copyListName = $('<div class="form-group"><input type="text" class="form-control" id="modal-list_name" aria-labelledby="modal-list_name-label" name="list_name" value="'+ listName +'"><label for="modal-list_name" id="modal-list_name-label" class="is-lifted zero">'+ listNameText[utilities.pageLang().getLang()] +'<\/label><\/div>');
2754	var copyListRecaptcha = $('<div id="wish_reCaptcha"><\/div>');
2755	var copyCancel = $('<button type="button" class="btn btn-link mr-auto">'+ cancelText[utilities.pageLang().getLang()] +'<\/button>');
2756	var copySubmit = $('<button type="submit" class="btn button-brand">'+ wishCopyText[utilities.pageLang().getLang()] +'<\/button>');
2757
2758	copyModal.find(".modal-dialog").addClass("modal-list_copy");
2759	copyModal.find(".modal-title").html(wishCopyText[utilities.pageLang().getLang()]);
2760	copyModal.find(".modal-body").append(
2761		copyBody.append(
2762			copyForm.append(copyListName)
2763		).append(utilities.recaptchaRequiredMessage(utilities.pageLang().getLang()))
2764	);
2765	copyModal.find(".modal-footer").append(copyCancel).append(copySubmit);
2766
2767	copyModal.find(".form-group").enhanceInput();
2768
2769	copyModal.modal();
2770	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2771
2772	copyModal.on("hidden.bs.modal", function() {
2773		$(this).remove();
2774	});
2775
2776	/*
2777	copyForm.on("submit", function(e) {
2778		e.preventDefault();
2779
2780		var serializeData = $(this).serialize();
2781
2782		wishListCheck(serializeData).then((data) => {
2783			if (data === "success") {
2784				copyForm.unbind("submit");
2785				copyForm.submit();
2786			} else {
2787				if (copyForm.find(".alert").length) {
2788					copyForm.find(".alert").html(data);
2789				} else {
2790					copyForm.prepend('<div class="alert alert-danger mb-3" role="alert">'+ data +'</div>');
2791				}
2792			}
2793		});
2794	});
2795	*/
2796
2797	copyForm.on("submit", function(e) {
2798		e.preventDefault();
2799
2800		var serializeData = $(this).serialize();
2801
2802		function callbackFnc(data) {
2803			if (data === "success") {
2804				copyForm.unbind("submit");
2805				copyForm.submit();
2806			} else {
2807				if (copyForm.find(".alert").length) {
2808					copyForm.find(".alert").html(data);
2809				} else {
2810					copyForm.prepend('<div class="alert alert-danger mb-3" role="alert">'+ data +'</div>');
2811				}
2812			}
2813		}
2814		wishListCheck(serializeData, callbackFnc);
2815	});
2816
2817	copyCancel.on("click", function(e) {
2818		e.preventDefault();
2819		copyModal.modal("hide");
2820	});
2821
2822	copySubmit.on("click", function(e) {
2823		e.preventDefault();
2824		if (!listLogin)
2825			utilities.validateRecaptcha(copyForm, 'copy_wishlist');
2826		else
2827			copyForm.submit();
2828	});
2829
2830	/*
2831	if (!listLogin) {
2832		var wishReCaptcha = function() {
2833			grecaptcha.render('wish_reCaptcha', {
2834				'sitekey' : '6LfJZc0rAAAAANGo8xIOO5z5TRpxgoQY7_laSouW'
2835			});
2836		}
2837
2838		wishReCaptcha();
2839	}
2840	*/
2841}
2842
2843function createWishShare(shareLink) {
2844	var cancelText = {
2845		en: 'Cancel',
2846		de: 'Abbrechen',
2847		fr: 'Annuler',
2848		it: 'Annulla',
2849		es: 'Cancelar'
2850	};
2851	var shareCopyText = {
2852		en: 'Copy List',
2853		de: 'Wunschliste kopieren',
2854		fr: 'Copier ma liste',
2855		it: 'Copia la lista',
2856		es: 'Copiar lista'
2857	};
2858	var modalTitleText = {
2859		en: 'Share List',
2860		de: 'Wunschliste teilen',
2861		fr: 'Partager la liste',
2862		it: 'Condividi la lista',
2863		es: 'Comparte la lista'
2864	};
2865	var copyLinkText = {
2866		en: 'Copy this link to share your Wish List:',
2867		de: 'Kopiere diesen Link, um die Wunschliste zu teilen',
2868		fr: 'Copier ce lien pour partager votre liste de souhaits',
2869		it: 'Copia questo link per condividere la lista',
2870		es: 'Copia este enlace para compartir la lista de favoritos'
2871	};
2872	var shareCart = utilities.generateModalMarkup({headingType: "h3", hasFooter: true, fullModal: false });
2873
2874	var shareBody = $('<div><\/div>');
2875	var shareInput = $('<input type="text" id="share_wish" class="form-control modal-share_cart-link" value="'+shareLink+'" \/>');
2876	var shareCancel = $('<button type="button" class="btn btn-link mr-auto">'+ cancelText[utilities.pageLang().getLang()] +'<\/button>');
2877	var shareButton = $('<button class="btn button-brand" data-copytarget="#share_wish">'+ shareCopyText[utilities.pageLang().getLang()] +'<\/button>');
2878
2879	shareButton.on("click", copyText);
2880
2881	shareCart.find(".modal-dialog").addClass("modal-share_wish");
2882	shareCart.find(".modal-title").html(modalTitleText[utilities.pageLang().getLang()]);
2883	shareCart.find(".modal-body").append(
2884		shareBody.append('<p>'+ copyLinkText[utilities.pageLang().getLang()] +'<\/p>')
2885			.append(shareInput.wrap('<div class="form-group"></div>').parent())
2886	);
2887	shareCart.find(".modal-footer").append(shareCancel).append(shareButton);
2888
2889	shareCart.modal();
2890	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2891
2892	shareCart.on("hidden.bs.modal", function() {
2893		$(this).remove();
2894	});
2895
2896	shareCancel.on("click", function(e) {
2897		e.preventDefault();
2898		shareCart.modal("hide");
2899	});
2900}
2901
2902function createWishNote(listCode, wishNote, wishCode) {
2903	var cancelText = {
2904		en: 'Cancel',
2905		de: 'Abbrechen',
2906		fr: 'Annuler',
2907		it: 'Annulla',
2908		es: 'Cancelar'
2909	};
2910	var addNoteText = {
2911		en: 'Add List Note',
2912		de: 'Notiz zur Wunschliste hinzuf&uuml;gen',
2913		fr: 'Ajouter une note',
2914		it: 'Aggiungi una nota',
2915		es: 'A&ntilde;adir nota'
2916	};
2917	var deleteText = {
2918		en: 'Delete',
2919		de: 'L&ouml;schen',
2920		fr: 'Supprimer',
2921		it: 'Elimina',
2922		es: 'Eliminar'
2923	};
2924	var wishModal = utilities.generateModalMarkup({headingType: "h3", hasFooter: true, fullModal: false });
2925
2926	var wishBody = $('<div><\/div>');
2927	var wishForm = $('<form method="post"><input type="hidden" name="order" value="e_l" \/><input type="hidden" name="e_l" value="'+ listCode +'" \/><input type="hidden" name="pcode" value="WISHNOTES" \/><input type="hidden" name="qty" value="1" \/><\/form>');
2928	var wishText = $('<textarea class="form-control" name="comment">'+ wishNote +'<\/textarea>');
2929	var wishCancel = $('<button type="button" class="btn btn-link mr-auto">'+ cancelText[utilities.pageLang().getLang()] +'<\/button>');
2930	var wishSubmit = $('<button type="button" class="btn button-brand">'+ addNoteText[utilities.pageLang().getLang()] +'<\/button>');
2931	var deleteForm = $('<form method="post"><input type="hidden" name="order" value="e_l" /><input type="hidden" name="e_l" value="'+listCode+'" /><input type="hidden" name="WISHNOTES" value="0" /><button type="submit" class="btn btn-dark">'+ deleteText[utilities.pageLang().getLang()] +'</button>');
2932
2933	wishModal.find(".modal-dialog").addClass("modal-wish_note");
2934	wishModal.find(".modal-title").html(addNoteText[utilities.pageLang().getLang()]);
2935	wishModal.find(".modal-body").append(
2936		wishBody.append(
2937			wishForm.append(wishText.wrap('<div class="form-group"><\/div>').parent())
2938		)
2939	);
2940	wishModal.find(".modal-footer").append(wishCancel);
2941	if (wishCode !== '') {
2942		wishModal.find(".modal-footer").append(deleteForm);
2943	}
2944	wishModal.find(".modal-footer").append(wishSubmit);
2945
2946	wishModal.modal();
2947	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2948
2949	wishModal.on("hidden.bs.modal", function() {
2950		$(this).remove();
2951	});
2952
2953	wishCancel.on("click", function(e) {
2954		wishModal.modal("hide");
2955	});
2956
2957	wishSubmit.on("click", function(e) {
2958		e.preventDefault();
2959		wishForm.submit();
2960	});
2961}
2962
2963function createAddSuccess(addData, wishList) {
2964	var closeText = {
2965		en: 'Close',
2966		de: 'Schlie&szlig;en',
2967		fr: 'Fermer',
2968		it: 'Chiudi',
2969		es: 'Cerrar'
2970	};
2971	var viewListText = {
2972		en: 'View Lists',
2973		de: 'Wunschliste ansehen',
2974		fr: 'Voir mes listes de souhaits',
2975		it: 'Visualizza le liste presenti',
2976		es: 'Ver listas'
2977	};
2978	var successModal = utilities.generateModalMarkup({headingType: "h3", hasFooter: true, fullModal: false, hasHeader: false });
2979
2980	var successBody = $('<div class="wl_add_success"><\/div>');
2981	var successCancel = $('<button type="button" class="btn btn-link text-body mr-auto">'+ closeText[utilities.pageLang().getLang()] +'<\/button>
2981');
2982	var successSubmit = $('<a href="/wishlist/" class="btn button-brand">'+ viewListText[utilities.pageLang().getLang()] +'<\/button>');
2983	//var successSubmit = $('<a href="https://www.tenniswarehouse-europe.com/zzz/responsive/wishlist/" class="btn btn-primary">'+ viewListText[utilities.pageLang().getLang()] +'<\/button>');
2984
2985	successModal.find(".modal-dialog").addClass("modal-wish_success");
2986	successModal.find(".modal-body").append(
2987		successBody.append(addData).append($('<p class="wl_add_success-text wl_add_success-name">"'+ wishList +'"</p>'))
2988	);
2989	successModal.find(".modal-footer").append(successCancel).append(successSubmit);
2990
2991	successModal.modal();
2992	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
2993
2994	successModal.on("hidden.bs.modal", function() {
2995		$(this).remove();
2996	});
2997
2998	successCancel.on("click", function(e) {
2999		successModal.modal("hide");
3000	});
3001}
3002
3003function createAddWish(addContent, wishProds, listLogin = false) {
3004	var closeText = {
3005		en: 'Close',
3006		de: 'Schlie&szlig;en',
3007		fr: 'Fermer',
3008		it: 'Chiudi',
3009		es: 'Cerrar'
3010	};
3011	var modalTitleText = {
3012		en: 'Add Item to Wish List',
3013		de: 'Artikel zur Wunschliste hinzuf&uuml;gen',
3014		fr: 'Ajouter l\'article &agrave; ma liste de souhaits',
3015		it: 'Aggiungi questo prodotto alla lista dei desideri',
3016		es: 'A&ntilde;adir art&iacute;culo a la lista'
3017	};
3018	var addToListText = {
3019		en: 'Add to List',
3020		de: 'Zur Liste hinzuf&uuml;gen',
3021		fr: 'Ajouter &agrave; la liste',
3022		it: 'Aggiungi alla lista',
3023		es: 'A&ntilde;adir a la lista'
3024	}
3025	var lang = utilities.pageLang().getLang().toUpperCase();
3026	var addModal = utilities.generateModalMarkup({headingType: "h3", hasFooter: true, fullModal: false });
3027
3028	var addBody = $('<div><\/div>');
3029	var addForm = $('<form method="post"><input type="hidden" name="order" value="e_l" \/><input type="hidden" name="wish_lang" value="'+lang+'" /><\/form>');
3030	var addListRecaptcha = $('<div id="wish_reCaptcha"><\/div>');
3031	var addListName = $('<div class="form-group"><input id="new_list_name" class="form-control" type="text" name="list_name" maxlength="75" value="New List Name"><label for="new_list_name" class="is-lifted zero">List Name</label><\/div>');
3032	var addCancel = $('<button type="button" class="btn btn-link text-body mr-auto">'+ closeText[utilities.pageLang().getLang()] +'<\/button>');
3033	// Needs translations
3034	var addSubmit = $('<button type="button" class="btn button-brand">'+ addToListText[utilities.pageLang().getLang()] +'<\/button>');
3035
3036	addModal.find(".modal-dialog").addClass("modal-wish_add");
3037	addModal.find(".modal-title").html(modalTitleText[utilities.pageLang().getLang()]);
3038	addModal.find(".modal-body").append(
3039		addBody.append(
3040			addForm.append(addContent.wrap('<div class="form-group"><\/div>').parent()).append(addListName)
3041		).append(utilities.recaptchaRequiredMessage(utilities.pageLang().getLang()))
3042	);
3043	for (var i = 0; i < wishProds.length; i++) {
3044		addForm.append('<input type="hidden" name="pcode" value="'+ wishProds[i].code +'" \/><input type="hidden" name="incrementqty" value="'+ wishProds[i].qty +'" \/>')
3045		if (wishProds[i].comp !== undefined) {
3046			addForm.append('<input type="hidden" name="'+ wishProds[i].comp +'" value="1" \/>');
3047		}
3048		if (wishProds[i].comment !== undefined) {
3049			addForm.append('<input type="hidden" name="comment-'+ wishProds[i].code +'" value="'+ wishProds[i].comment +'" \/>');
3050		}
3051	}
3052	addModal.find(".modal-footer").append(addCancel).append(addSubmit);
3053
3054	addModal.find(".form-group").enhanceInput();
3055	if (addContent.val() !== "new_wish") {
3056		addListName.detach();
3057	}
3058	addModal.find('.wishlist_select').on("change", function(){
3059		if($(this).val() === "new_wish") {
3060			addForm.append(addListName);
3061		} else {
3062			addListName.detach();
3063		}
3064	});
3065
3066	addModal.modal();
3067	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3068
3069	addModal.on("hidden.bs.modal", function() {
3070		$(this).remove();
3071	});
3072
3073	/*
3074	addForm.on("submit", function(e) {
3075		e.preventDefault();
3076
3077		var serializeData = $(this).serialize();
3078		var listName = '';
3079		if ($(this).find("#wishlist_addsel option:selected").val() === 'new_wish') {
3080			listName = addListName.find("#new_list_name").val();
3081		} else {
3082			listName = $(this).find("#wishlist_addsel option:selected").text();
3083		}
3084
3085		wishListCheck(serializeData).then((data) => {
3086			if (data === "success") {
3087				reportEventTracking('Wishlists', 'Add to Wish', 'From Descpage');
3088				//get page to add item and display message
3089				$.get("/wishlist/wishlist_add.html?wishlist_pop=true&" + serializeData, function(data){
3090				//$.get("https://www.tenniswarehouse-europe.com/zzz/responsive/wishlist/wishlist_add.html?wishlist_pop=true&" + serializeData, function(data){
3091					var jqdata = $(data);
3092
3093					addModal.modal("hide");
3094					createAddSuccess(jqdata, listName)
3095				});
3096			} else {
3097				if (addForm.find(".alert").length) {
3098					addForm.find(".alert").html(data);
3099				} else {
3100					addForm.prepend('<div class="alert alert-danger mb-3" role="alert">'+ data +'</div>');
3101				}
3102			}
3103		});
3104	});
3105	*/
3106
3107	addForm.on("submit", function(e) {
3108		e.preventDefault();
3109
3110		var serializeData = $(this).serialize();
3111		var listName = '';
3112		if ($(this).find("#wishlist_addsel option:selected").val() === 'new_wish') {
3113			listName = addListName.find("#new_list_name").val();
3114		} else {
3115			listName = $(this).find("#wishlist_addsel option:selected").text();
3116		}
3117
3118		function callbackFnc(data) {
3119			if (data === "success") {
3120				if(typeof _gaq !== 'undefined') {
3121					_gaq.push(["_trackEvent", "Wishlists", "Add to Wish", "From Descpage"]);
3122				}
3123
3124				//get page to add item and display message
3125				$.get("/wishlist/wishlist_add.html?wishlist_pop=true&" + serializeData, function(data){
3126					var jqdata = $(data);
3127
3128					addModal.modal("hide");
3129					createAddSuccess(jqdata, listName)
3130				});
3131			} else {
3132				if (addForm.find(".alert").length) {
3133					addForm.find(".alert").html(data);
3134				} else {
3135					addForm.prepend('<div class="alert alert-danger mb-3" role="alert">'+ data +'</div>');
3136				}
3137			}
3138		}
3139
3140		wishListCheck(serializeData, callbackFnc);
3141	});
3142
3143	addCancel.on("click", function(e) {
3144		addModal.modal("hide");
3145	});
3146
3147	addSubmit.on("click", function(e) {
3148		e.preventDefault();
3149		if (!listLogin)
3150			utilities.validateRecaptcha(addForm, 'new_wishlist');
3151		else
3152			addForm.submit();
3153	});
3154
3155	/*
3156	if (!listLogin) {
3157		var wishReCaptcha = function() {
3158			grecaptcha.render('wish_reCaptcha', {
3159				'sitekey' : '6LfJZc0rAAAAANGo8xIOO5z5TRpxgoQY7_laSouW'
3160			});
3161		}
3162
3163		wishReCaptcha();
3164	}
3165	*/
3166}
3167
3168function generateModaliFrame(frameLink, frameTitle) {
3169	var url = frameLink.attr("href"),
3170		hasString = false;
3171
3172	if (url.indexOf('?') !== -1) {
3173		hasString = true;
3174	}
3175
3176	var frameModal = utilities.generateModalMarkup({headingType: "h3"}),
3177		frameURL = url + ((hasString) ? "&" : "?") + '?view_inpage=yes',
3178		frameBody = $('<div><\/div>');
3179
3180	var height = parseInt(frameLink.data("popheight"));
3181
3182	var iframe = $('<iframe class="modal-frame-iframe"'+ ((isNaN(height)) ? '' : (' style="height: ' + height + 'px;"')) +' src="' + frameURL + '" scrolling="no" frameborder="0" allowfullscreen><\/iframe>').on("load", function() {
3183		var	old_height = $(this).height();
3184		var frame_height = $(this.contentWindow.document).height();
3185
3186		if (frame_height > old_height) {
3187			$(this).css("height",frame_height + "px");
3188		}
3189	});
3190
3191	frameModal.find(".modal-dialog").addClass("modal-frame");
3192	frameModal.find(".modal-title").text(frameTitle);
3193	frameModal.find(".modal-body").append(frameBody.append(iframe));
3194
3195	frameModal.modal();
3196	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3197
3198	frameModal.on("hidden.bs.modal", function() {
3199		$(this).remove();
3200	});
3201}
3202
3203function generateVideoModal(frameLink) {
3204	var url = frameLink.attr("href"),
3205		hasString = false;
3206
3207	if (url.indexOf('?') !== -1) {
3208		hasString = true;
3209	}
3210
3211	var frameModal = utilities.generateModalMarkup({hasHeader: false}),
3212		frameURL = url + ((hasString) ? "&" : "?") + 'view_inpage=yes',
3213		frameBody = $('<div class="video-container-innerwrap"><\/div>');
3214
3215	var height = parseInt(frameLink.data("popheight"));
3216
3217	var iframe = $('<div class="video-container-innerwrap-scale_wrap"><iframe class="modal-frame-iframe"'+ ((isNaN(height)) ? '' : (' style="height: ' + height + 'px;"')) +' src="' + frameURL + '" scrolling="no" frameborder="0" allowfullscreen><\/iframe><\/div>').on("load", function() {
3218		var	old_height = $(this).height();
3219		var frame_height = $(this.contentWindow.document).height();
3220
3221		if (frame_height > old_height) {
3222			$(this).css("height",frame_height + "px");
3223		}
3224	});
3225
3226	frameModal.find(".modal-dialog").addClass("video-container");
3227	frameModal.find(".modal-body").append(frameBody.append(iframe));
3228
3229	frameModal.modal();
3230	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3231
3232	frameModal.on("hidden.bs.modal", function() {
3233		$(this).remove();
3234	});
3235}
3236
3237function generateProdinfoModal(frameLink) {
3238	var info = frameLink.data("info");
3239
3240	var infoModal = utilities.generateModalMarkup({hasHeader: false});
3241	var infoBody = $('<div />');
3242
3243	infoModal.find(".modal-body").append(infoBody.append(info));
3244
3245	infoModal.modal();
3246	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3247
3248	infoModal.on("hidden.bs.modal", function() {
3249		$(this).remove();
3250	});
3251}
3252
3253function generateShareCart(shareLink) {
3254	var closeText = {
3255		en: 'Close',
3256		de: 'Schlie&szlig;en',
3257		fr: 'Fermer',
3258		it: 'Chiudi',
3259		es: 'Cerrar'
3260	};
3261	var shareText = {
3262		en: 'Share Cart',
3263		de: 'Den Warenkorb teilen',
3264		fr: 'Partager mon panier',
3265		it: 'Condividi il carrello',
3266		es: 'Compartir tu cesta'
3267	};
3268	var copyLinkText = {
3269		en: 'Copy this link to share your cart:',
3270		de: 'Bitte diesen Link kopieren, um den Warenkorb zu teilen:',
3271		fr: 'Copiez ce lien pour partager votre panier :',
3272		it: 'Copia questo link per condividere il carrello:',
3273		es: 'Copia este enlace para compartir tu cesta:'
3274	};
3275	var cartNoteText = {
3276		en: 'Note: Cart links will expire 36 hours after being created.',
3277		de: 'Hinweis: Der Warenkorb-Link verf&auml;
3277llt 36 Stunden nach der Erstellung.',
3278		fr: 'Remarque : ce lien expirera 36 heures apr&egrave;s sa cr&eacute;ation.',
3279		it: 'N.B.: il seguente link ha una durata di 36 ore dalla creazione ',
3280		es: 'Nota: Este tipo de enlaces tienen una validez de 36 horas desde su creaci&oacute;n.'
3281	};
3282	var shareCopyText = {
3283		en: 'Copy',
3284		de: 'Kopieren',
3285		fr: 'Copier',
3286		it: 'Copia',
3287		es: 'Copiar'
3288	};
3289
3290	var shareCart = utilities.generateModalMarkup({headingType: "h3", hasFooter: true});
3291
3292	var shareBody = $('<div />');
3293	var shareInput = $('<input type="text" id="share_cart" class="form-control modal-share_cart-link" value="'+shareLink+'" />');
3294	var shareCancel = $('<button type="button" class="btn btn-link text-body">'+ closeText[utilities.pageLang().getLang()] +'</button>');
3295	var shareButton = $('<button class="btn button-brand ml-auto" data-copytarget="#share_cart">' + shareCopyText[utilities.pageLang().getLang()] + '</button>');
3296
3297	shareButton.on("click", copyText);
3298
3299	shareCart.find(".modal-dialog").addClass("modal-share_cart");
3300	shareCart.find(".modal-title").html(shareText[utilities.pageLang().getLang()]);
3301	shareCart.find(".modal-body").append(
3302		shareBody.append('<p>'+ copyLinkText[utilities.pageLang().getLang()] +'</p>')
3303			.append(shareInput.wrap('<div class="form-group"></div>').parent())
3304			.append('<p class="modal-note mb-0">'+ cartNoteText[utilities.pageLang().getLang()] +'</p>')
3305	);
3306	shareCart.find(".modal-footer").append(shareCancel).append(shareButton);
3307
3308	shareCart.modal();
3309	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3310
3311	shareCancel.on("click", function(e) {
3312		e.preventDefault();
3313		shareCart.modal("hide");
3314	});
3315
3316	shareCart.on("hidden.bs.modal", function() {
3317		$(this).remove();
3318	});
3319}
3320
3321function generateNotifyModal(link, title, subline) {
3322	if (subline === null || typeof subline === 'undefined' || subline === '') {
3323		var priceNotify = utilities.generateModalMarkup({headingType: "h3", hasFooter: true, fullModal: false});
3324	} else {
3325		var priceNotify = utilities.generateModalMarkup({headingType: "h3", hasSubline: true, hasFooter: true, fullModal: false});
3326	}
3327
3328	var notifyBody = $('<div />');
3329	var notifyCancel = $('<button type="button" class="btn btn-link text-body">Close</button>');
3330	var notifyButton = $('<button type="button" class="btn button-brand ml-auto">Sign Up</button>');
3331	
3332	var validEmail = false;
3333	var checkboxIsChecked = false; 
3334
3335	notifyCancel.on("click", function(e) {
3336		priceNotify.modal("hide");
3337	});
3338
3339	priceNotify.find(".modal-dialog").addClass("modal-notify");
3340	priceNotify.find(".modal-title").text(title);
3341	priceNotify.find(".modal-subline").text(subline);
3342
3343	$.ajax({
3344		timeout: 8000,
3345		type: "GET",
3346		url: link,
3347		dataType: "html",
3348		success: function(data) {
3349			var jqdata = $(data);
3350			var notifyForm = $(jqdata.find('form'));
3351			var postURL = notifyForm.attr('action');
3352
3353			notifyForm.append(utilities.recaptchaRequiredMessage());
3354
3355			notifyForm.on('submit', function(e) {
3356				e.preventDefault();
3357				$.post(postURL, notifyForm.serialize(), function(data) {
3358					priceNotify.modal('hide');
3359
3360					var priceNotifyResponse = utilities.generateModalMarkup({headingType: "h3", hasSubline: true, hasFooter: true, fullModal: false});
3361					var priceNotifyCancel = $('<button type="button" class="btn button-brand">Close</button>');
3362					var jqdata = $(data);
3363
3364					priceNotifyCancel.on('click', function(e) {
3365						priceNotifyResponse.modal('hide');
3366					})
3367					priceNotifyResponse.on("hidden.bs.modal", function() {
3368						$(this).remove();
3369					});
3370
3371					priceNotifyResponse.find(".modal-dialog").addClass("modal-notify");
3372					priceNotifyResponse.find(".modal-title").text(title);
3373					priceNotifyResponse.find(".modal-subline").text(subline);
3374					priceNotifyResponse.find(".modal-body").append(jqdata);
3375					priceNotifyResponse.find(".modal-footer").append(priceNotifyCancel);
3376
3377					priceNotifyResponse.modal();
3378					setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3379				});
3380			})
3381			
3382			
3383			priceNotify.find(".modal-body").append(jqdata);
3384			priceNotify.find(".modal-footer").append(notifyCancel).append(notifyButton);
3385			priceNotify.find(".form-group").enhanceInput();
3386			priceNotify.find(".modal-content").addClass("animate-bottom");
3387			
3388			$(notifyForm).on("change", "input[name='ageverify']", function () {
3389				if (this.checked) {
3390					checkboxIsChecked = true;
3391				} else {
3392					checkboxIsChecked = false;
3393				}
3394			});
3395			
3396			$(notifyForm).on("keyup", ".notify-add", function () {
3397				if (utilities.isValidEmail($('.notify-add').val())) {
3398					validEmail = true;
3399				} else {
3400					validEmail = false;
3401				}
3402			});
3403			
3404			notifyButton.on('click', function(e) {
3405				e.preventDefault();
3406				if ($('.required-checkbox').length){
3407					if(validEmail) {
3408						$('#pricenotify_wrap').removeClass('notify_error-email');
3409					} else {
3410						$('#pricenotify_wrap').addClass('notify_error-email');
3411					};
3412					
3413					if (checkboxIsChecked) {
3414						$('#pricenotify_wrap').removeClass('notify_error-checkbox');
3415						$('.checkbox_error-sub').addClass('d-none');
3416					} else {
3417						$('#pricenotify_wrap').addClass('notify_error-checkbox');
3418						$('.checkbox_error-sub').removeClass('d-none');
3419					};
3420					
3421					if (checkboxIsChecked && validEmail) {
3422						utilities.validateRecaptcha(notifyForm, 'notify_price');
3423					} else {
3424						$('#notify-alert').addClass('d-flex');
3425					}
3426				} else {
3427					utilities.validateRecaptcha(notifyForm, 'notify_price');
3428				};
3429			});
3430
3431			priceNotify.modal();
3432			setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3433
3434			priceNotify.on("hidden.bs.modal", function() {
3435				$(this).remove();
3436			});
3437		},
3438
3439		error: function() {
3440			var oopsText = {
3441				en: 'Oops, something went wrong!',
3442				de: 'Da lief wohl irgendwas schief!',
3443				fr: 'Oups ! Un probl&egrave;me est survenu.',
3444				it: 'Ops! Si &egrave; verificato un errore.',
3445				es: 'Vaya, algo ha ido mal.'
3446			};
3447			//failed to load notify price
3448			priceNotify.find(".modal-body").append('<p>'+ oopsText[utilities.pageLang().getLang()] +'</p>');
3449			priceNotify.find(".modal-footer").append(notifyCancel)
3450
3451			priceNotify.modal();
3452			setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3453
3454			priceNotify.on("hidden.bs.modal", function() {
3455				$(this).remove();
3456			});
3457		}
3458	});
3459}
3460
3461function createAddReviewSuccess(response) {
3462	var closeText = {
3463		en: 'Close',
3464		de: 'Schlie&szlig;en',
3465		fr: 'Fermer',
3466		it: 'Chiudi',
3467		es: 'Cerrar'
3468	};
3469	var successModal = utilities.generateModalMarkup({headingType: "h3", hasFooter: true, fullModal: false, hasHeader: false });
3470
3471	var successBody = $('<div class="wl_add_success"><\/div>');
3472	var successCancel = $('<button type="button" class="btn btn-link text-body mr-auto">' + closeText[utilities.pageLang().getLang()] + '<\/button>');
3473	var successSubmit = $('<button class="btn btn-primary">Continue Shopping<\/button>');
3474
3475	successModal.find(".modal-dialog").addClass("modal-wish_success");
3476	successModal.find(".modal-body").append(
3477		successBody.append(response));
3478	successModal.find(".modal-footer").append(successCancel).append(successSubmit);
3479
3480	successModal.modal();
3481	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3482
3483	successModal.on("hidden.bs.modal", function() {
3484		$(this).remove();
3485	});
3486
3487	successSubmit.on("click", function(e) {
3488		successModal.modal("hide");
3489	});
3490
3491	successCancel.on("click", function(e) {
3492		successModal.modal("hide");
3493	});
3494}
3495
3496function validateFeedbackForm(frame, reviewSubmit, submitFunction) {
3497	var frame_content = $(frame.contents())
3498	var feedback_form = $(frame_content.find("#feedback"));
3499
3500	var show_form = function () {
3501		frame_content.find('.spinner_border-wrap').removeClass('d-flex').addClass('d-none');
3502		frame_content.find('.form_main-container').css('display', 'block');
3503	}
3504	var hide_form = function () {
3505		frame_content.find('.spinner_border-wrap').removeClass('d-none').addClass('d-flex');
3506		frame_content.find('.form_main-container').css('display', 'none');
3507	}
3508	var recalculateHeight = function() {
3509		var newIFrame = frame;
3510		var newWindow = $(newIFrame.get(0).contentWindow)
3511		if (newWindow.get(0)) {
3512			var frame_height = newWindow.get(0).document.body.scrollHeight;
3513			if (frame_height < 500) {
3514				frame_height = 500;
3515			}
3516			newIFrame.css("height",frame_height + "px");
3517		}
3518	}
3519	var recalculateHeightThrottle = utilities.throttle(recalculateHeight, 200)
3520	var parseError = function(response) {
3521		var ratingErrorText = {
3522			en: 'Please enter a number between 1 and 5',
3523			de: 'Bitte gebe eine Zahl zwischen 1 und 5 ein',
3524			fr: 'Veuillez entrer un chiffre entre 1 et 5',
3525			it: 'Inserire un numero tra 1 e 5',
3526			es: 'Por favor, introduce un n&uacute;mero del 1 al 5'
3527		};
3528		var titleErrorText = {
3529			en: 'Please enter a title in the box above',
3530			de: 'Bitte gebe einen Titel ein',
3531			fr: 'Veuillez r&eacute;diger un titre',
3532			it: 'Inserire un titolo',
3533			es: 'Escribe un t&iacute;tulo'
3534		};
3535		var reviewErrorText = {
3536			en: 'Please enter your review in the box above',
3537			de: 'Bitte gebe deine Bewertung ein',
3538			fr: 'Veuillez r&eacute;diger votre avis',
3539			it: 'Inserire la recensione',
3540			es: 'Escribe tu rese&ntilde;a'
3541		};
3542		var stateErrorText = {
3543			en: 'Please enter a valid city/province in the box above',
3544			de: 'Bitte gebe eine g&uuml;ltige Stadt/Provinz ein',
3545			fr: 'Veuillez saisir une ville/province valide',
3546			it: 'Ti preghiamo di inserire una citt&agrave;/provincia valida',
3547			es: 'Por favor, introduce una abreviatura v&aacute;lida del pa&iacute;
3547s/provincia arriba. '
3548		};
3549		var closeText = {
3550			en: 'Close',
3551			de: 'Schlie&szlig;en',
3552			fr: 'Fermer',
3553			it: 'Chiudi',
3554			es: 'Cerrar'
3555		};
3556		feedback_form.find('small:not(:last)').remove();
3557		if (response.includes('<span class=')) {
3558			var failureModal = utilities.generateModalMarkup({headingType: "h3", hasFooter: true, fullModal: false, hasHeader: false });
3559
3560			var failureBody = $('<div class="wl_add_failure"><\/div>');
3561			var failureCancel = $('<button type="button" class="btn btn-link text-body mr-auto">' + closeText[utilities.pageLang().getLang()] + '<\/button>');
3562
3563			failureModal.find(".modal-dialog").addClass("modal-wish_success");
3564			failureModal.find(".modal-body").append(
3565				failureBody.append(response));
3566			failureModal.find(".modal-footer").append(failureCancel);
3567
3568			failureModal.modal();
3569			setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3570
3571			failureModal.on("hidden.bs.modal", function() {
3572				$(this).remove();
3573			});
3574
3575			failureCancel.on("click", function(e) {
3576				failureModal.modal("hide");
3577			});
3578		} else {
3579			var error_fields = response.split(' ')
3580			var message = ''
3581			for (var i = 0; i < error_fields.length; i++) {
3582				var name = error_fields[i].trim()
3583				var find_param = 'input[name='+name+']'
3584				if (name) {
3585					switch (name) {
3586						case 'rating':
3587							message = ratingErrorText[utilities.pageLang().getLang()];
3588							find_param = '.rating-container'
3589							break;
3590						case 'title':
3591							message = titleErrorText[utilities.pageLang().getLang()];
3592							break;
3593						case 'customMessage':
3594							message = reviewErrorText[utilities.pageLang().getLang()];
3595							find_param = 'textarea[name='+name+']';
3596							break;
3597						case 'state':
3598							message = stateErrorText[utilities.pageLang().getLang()];
3599							break;
3600						default:
3601							message = '';
3602					}
3603					$('<small for="'+name+'" class="'+name+'_error error">'+message+'</small>').insertAfter(feedback_form.find(find_param)[0]);
3604				}
3605			}
3606		}
3607		recalculateHeightThrottle();
3608		show_form();
3609		reviewSubmit.removeClass('disabled').prop('disabled', false);
3610	}
3611
3612	show_form();
3613	feedback_form.append(utilities.recaptchaRequiredMessage(utilities.pageLang().getLang()));
3614	recalculateHeightThrottle();
3615
3616	feedback_form = $(frame.contents().find("#feedback"));
3617	feedback_form.find(".form-group").enhanceInput();
3618
3619	feedback_form.on('submit', function(e) {
3620		e.preventDefault()
3621		$.ajax({
3622			url: $(this).prop('action'),
3623			method:  $(this).prop('method'),
3624			data:  $(this).serialize(),
3625			success: function(response) {
3626				if (response.includes('Success!'))
3627					submitFunction(response);
3628				else {
3629					parseError(response);
3630					return false;
3631				}
3632			}
3633		})
3634	});
3635
3636	feedback_form.find("input[name=rating]").on('click', function() {
3637		var value = feedback_form.find("input[name=rating]:checked").attr('value');
3638		feedback_form.find('.rating_error').remove();
3639	});
3640
3641	feedback_form.find("input[name=title]").on('change', function() {
3642		var value = $(this).val();
3643		if (value) {
3644			$(this).parent().find('small.error').remove();
3645		}
3646	});
3647
3648	feedback_form.find("textarea[name=customMessage]").on('change', function() {
3649		var value = $(this).val();
3650		if (value) {
3651			$(this).parent().find('small.error').remove();
3652		}
3653	});
3654
3655	feedback_form.find("input[name=state]").on('change', function() {
3656		var value = $(this).val();
3657		if (value) {
3658			$(this).parent().find('small.error').remove();
3659		}
3660	});
3661
3662	$(window).on('resize', recalculateHeightThrottle);
3663
3664	reviewSubmit.on('click', function(e) {
3665		e.preventDefault();
3666		hide_form();
3667		reviewSubmit.addClass('disabled').prop('disabled', true);
3668		utilities.validateRecaptcha(feedback_form, 'submit_feedback');
3669	})
3670}
3671
3672function generateReviewModal(reviewForm) {
3673	var submitReviewText = {
3674		en: 'Submit Review',
3675		de: 'Bewertung abschicken',
3676		fr: 'Envoyer votre avis',
3677		it: 'Invia la recensione',
3678		es: 'Envia tu opini&oacute;n'
3679	};
3680	var submitTitleText = {
3681		en: 'Submit A Review',
3682		de: 'Eine Bewertung abgeben',
3683		fr: 'Donnez-nous votre avis',
3684		it: 'Invia una recensione',
3685		es: 'Deja tu comentario'
3686	};
3687	var closeText = {
3688		en: 'Close',
3689		de: 'Schlie&szlig;en',
3690		fr: 'Fermer',
3691		it: 'Chiudi',
3692		es: 'Cerrar'
3693	};
3694	var reviewModal = utilities.generateModalMarkup({headingType: "h3", hasFooter: true});
3695	var height = parseInt(500);
3696	var noErrors = false;
3697
3698	if (reviewForm.find('input[name=pcode]').val()) {
3699		reviewForm.attr('target','phplist_overlay');
3700		var reviewBody = $('<div><\/div>'),
3701			reviewiFrame = $('<iframe class="modal-frame-iframe"'+ ((isNaN(height)) ? '' : (' style="height: ' + height + 'px;"')) +' name="phplist_overlay" scrolling="no" frameborder="0" allowfullscreen><\/iframe>');
3702		var reviewCancel = $('<button type="button" class="btn btn-link text-body mr-auto">' + closeText[utilities.pageLang().getLang()] + '<\/button>');
3703		var reviewSubmit = $('<button type="button" class="btn btn-primary">'+ submitReviewText[utilities.pageLang().getLang()] +'<\/button>');
3704		reviewModal.find(".modal-body").addClass("video-container").addClass("no-padding-bottom").append(reviewBody.append(reviewiFrame));
3705		reviewModal.find(".modal-footer").append(reviewCancel).append(reviewSubmit);
3706		reviewModal.find(".modal-body").css("padding-bottom", "0");
3707		noErrors = true;
3708	} else {
3709		var reviewBody = $('<div>There is no product selected to leave a review on. Please select a product and try again.</div>')
3710		var reviewCancel = $('<button type="button" class="btn btn-link text-body mr-auto">' + closeText[utilities.pageLang().getLang()] + '<\/button>');
3711		reviewModal.find(".modal-body").append(reviewBody);
3712		reviewModal.find(".modal-footer").append(reviewCancel);
3713	}
3714	reviewModal.find(".modal-header").css({'padding': '24px 16px 22px 16px'});
3715	reviewModal.find(".modal-dialog").addClass("modal-review");
3716	reviewModal.find(".modal-title").text(submitTitleText[utilities.pageLang().getLang()]);
3717
3718	reviewModal.modal();
3719	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3720
3721	reviewModal.on("hidden.bs.modal", function() {
3722		$(this).remove();
3723	});
3724
3725	reviewCancel.on("click", function(e) {
3726		reviewModal.modal("hide");
3727	});
3728
3729	if (noErrors) {
3730		$(".modal-frame-iframe").on('load', function() {
3731			var submitFunction = function(response) {
3732				reviewModal.modal("hide");
3733				createAddReviewSuccess(response);
3734			}
3735			validateFeedbackForm($(this), reviewSubmit, submitFunction);
3736		})
3737	}
3738
3739	return noErrors;
3740}
3741
3742function generateQuickOrder(bodyData, ignoreDynamic) {
3743	var cancelText = {
3744		en: 'Cancel',
3745		de: 'Abbrechen',
3746		fr: 'Annuler',
3747		it: 'Annulla',
3748		es: 'Cancelar'
3749	};
3750	var modalTitleText = {
3751		en: 'Selections',
3752		de: 'Auswahl',
3753		fr: 'S&eacute;lection',
3754		it: 'Selezioni',
3755		es: 'Selecci&oacute;n'
3756	};
3757	var orderModal = utilities.generateModalMarkup();
3758	var orderBody = $('<div />');
3759	var orderCancel = $('<button type="button" class="style_orderin-cancel btn btn-link mr-auto">'+ cancelText[utilities.pageLang().getLang()] +'</button>');
3760
3761	orderCancel.on('click', function(e) {
3762		e.preventDefault();
3763		orderModal.modal('hide');
3764	});
3765
3766	orderBody.append(bodyData);
3767
3768	orderBody.find('.style_ordering-add_wrap').prepend(orderCancel);
3769
3770	if (ignoreDynamic) {
3771		orderBody.each(utilities.initDescPageTop({type: 'Quickview', ignoreDynamic: true}));
3772	} else {
3773		orderBody.each(utilities.initDescPageTop({type: 'Quickview', onAdd: function(e, obj) {
3774			e.preventDefault();
3775			var newitem;
3776			CartHandler.order($(this).serialize());
3777			orderModal.modal('hide');
3778		}}));
3779	}
3780
3781	orderModal.find(".modal-dialog").addClass("modal-order").addClass('small-view');
3782	orderModal.find(".modal-title").text(modalTitleText[utilities.pageLang().getLang()]);
3783	orderModal.find(".modal-body").append(orderBody);
3784
3785	orderModal.modal();
3786	setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3787
3788	orderModal.on("hidden.bs.modal", function() {
3789		$(this).remove();
3790	});
3791}
3792
3793function generateColorModal(prodCode) {
3794	var colorModal = utilities.generateModalMarkup();
3795
3796	var colorBody = $('<div><\/div>');
3797
3798	colorModal.find(".modal-dialog").addClass("modal-color");
3799	colorModal.find(".modal-body").append(
3800		colorBody
3801	);
3802
3803	$.ajax({
3804		timeout: 8000,
3805		url: '/ajax/colorData.xml?ccode=' + prodCode,
3806		dataType: 'xml',
3807		success: function(data) {
3808			var product = $(data);
3809			var productName = product.find('name').text();
3810
3811			product.find('color').each(function() {
3812				var colorWrap = $('<a href="#" class="color_option"></a>');
3813				var colorImg = $('<div class="color_option-img"></div>');
3814				var colorInfo = $('<div class="color_option-info"></div>');
3815				var colorName = $('<div class="color_option-info-name"></div>');
3816				var colorPrice = $('<div class="color_option-info-price"></div>');
3817				var styleImg = $(this).find('image').text();
3818				var styleImg2x = $(this).find('image2x').text()
3819				var styleName = $(this).find('styleName').text();
3820				var styleSizes = $(this).find('sizes').text();
3821				var styleWidth = $(this).find('widths').text();
3822				var stylePrice = $(this).find('price').text();
3823				var styleLink = $(this).find('link').text();
3824
3825				colorWrap.attr('href', styleLink);
3826
3827				colorImg.append('<img src="'+ styleImg +'" srcset="'+ styleImg2x +' 2x" alt="'+ styleName +'" />');
3828				colorName.append('<p>'+ styleName +'</p>');
3829				if (styleSizes) {
3830					colorName.append('<p class="color_option-info-sub">'+ styleSizes +'</p>');
3831				} else if (styleWidth) {
3832					colorName.append('<p class="color_option-info-sub">'+ styleWidth +'</p>');
3833				}
3834				colorPrice.append('<p>'+ stylePrice +'</p>');
3835
3836				colorWrap.append(colorImg).append(colorInfo.append(colorName).append(colorPrice)).append('<span class="icon icon-arrow icon-arrow-right is-lg"></span>');
3837				colorBody.append(colorWrap);
3838			});
3839
3840			colorModal.find(".modal-title").text((productName !== '' ? productName : 'Color Select'));
3841			colorModal.find(".modal-title").append($('<div class="modal-color_subtitle">'+ product.find('color').length +' Products Available</div>'));
3842
3843			colorModal.modal();
3844			setTimeout(function() {trapFocus($('.modal.show .modal-content'))}, 100);
3845
3846			colorModal.on("hidden.bs.modal", function() {
3847				$(this).remove();
3848			});
3849		}
3850	});
3851}
3852function createLangVatModal(linkObj,send_to_root = false) {
3853	var lvModal = utilities.generateModalMarkup({hasFooter: true, fullModal: false});
3854
3855	var modal_action = send_to_root ? "/" : "";
3856
3857	var lvBody = $('<div><style>.close { display:none; }</style><\/div>'),
3858	
3859		lvForm = $('<form method="post" id="lang_vat_form" class="needs-validation" action="' + modal_action + '" novalidate><p class="lv-modal__description">Please select the following options for accurate pricing and delivery estimates.</p><\/form>'),
3860		
3861		lvLanguageLabel = $('<p class="lv-modal__label">Preferred Language</p>'),
3862		
3863		lvLanguage = $('<div class="form-group"><select id="vat_lang" class="form-control custom-select" name="lang" aria-label="Preferred Language" aria-required="true" required><option value="" aria-disabled="true" aria-selected="false" selected disabled>Preferred Language</option><option value="en">English</option><option value="fr">Fran&ccedil;ais</option><option value="de">Deutsch</option><option value="it">Italiano</option><option value="es">Espa&ntilde;ol</option></select><div class="invalid-feedback">Please select a valid Language</div><\/div>'),
3864		
3865		lvVATLabel = $('<p class="lv-modal__label">Select VAT</p>'),
3866		
3867		lvVAT = $('<div class="form-group"><select id="vat_lang" class="form-control custom-select" name="vat" aria-label="Country VAT" aria-required="true" required><option value="" aria-disabled="true" aria-selected="false" selected disabled>Country VAT</option><option value="AT">Austria</option><option value="BE">Belgium</option><option value="BG">Bulgaria</option><option value="HR">Croatia</option><option value="CY">Cyprus</option><option value="CZ">Czech Republic</option><option value="DK">Denmark</option><option value="EE">Estonia</option><option value="FI">Finland</option><option value="FR">France</option><option value="FRD">French Dom Tom</option><option value="DE">Germany</option><option value="GR">Greece</option><option value="HU">Hungary</option><option value="IE">Ireland</option><option value="IT">Italy</option><option value="LV">Latvia</option><option value="LT">Lithuania</option><option value="LU">Luxembourg</option><option value="MT">Malta</option><option value="MC">Monaco</option><option value="NL">Netherlands</option><option value="NO">Norway</option><option value="PL">Poland</option><option value="PT">Portugal</option><option value="RO">Romania</option><option value="SK">Slovakia</option><option value="SI">Slovenia</option><option value="ES">Spain</option><option value="ESC">Spain (Canary Islands)</option><option value="SE">Sweden</option><option value="CH">Switzerland</option><option value="UK">United Kingdom</option><option value="NEU">Outside EU</option></select><div class="invalid-feedback">Please select a valid Country VAT</div><\/div>'),
3868		
3869		lvBottom = $('<div class="row"><\/div>'),
3870		
3871		lvSubmit = $('<button type="submit" class="btn button-brand lv-modal__button">Set Selections<\/button>');
3872	lvModal.find(".modal-dialog").addClass("lang_vat-modal")	
3873	lvModal.find(".modal-header").addClass("lang_vat-modal");
3874	lvModal.find(".modal-dialog").addClass("modal-login");
3875	lvModal.find(".modal-title").html("Language &amp; VAT");
3876	lvModal.find(".modal-body").addClass("lang_vat-modal");
3877	lvModal.find(".modal-body").append(
3878		lvBody.append(
3879			lvForm.append(lvLanguageLabel).append(lvLanguage).append(lvVATLabel).append(lvVAT)
3880		)
3881	);
3882	lvModal.find('.modal-footer').addClass("langvat_footer").append(lvSubmit);
3883
3884	lvModal.find(".form-group").enhanceInput();
3885
3886	lvModal.modal({backdrop: 'static', keyboard: false});
3887
3888	lvModal.on("hidden.bs.modal", function() {
3889		$(this).remove();
3890	});
3891
3892	lvSubmit.on("click", function(e) {
3893		e.preventDefault();
3894		lvForm.submit();
3895	});
3896
3897	lvForm.on("submit", function(e) {
3898		if ($('#lang_vat_form')[0].checkValidity() === false) {
3899			e.preventDefault();
3900			e.stopPropagation();
3901		}
3902		lvForm.addClass('was-validated');
3903	});
3904}
3905/* End Modals */
3906
3907/* Working Order */
3908function copyText(e) {
3909	var t = e.target,
3910		c = t.dataset.copytarget,
3911		inp = (c ? $(c) : null);
3912
3913	if (inp && inp.select) {
3914		inp.select();
3915
3916		try {
3917			document.execCommand('copy');
3918			inp.blur();
3919			$(t).popover({content: "Copied", placement: "top"}).popover("show");
3920		}
3921
3922		catch (err) {
3923			// Do not encode for alert text
3924			var copyToClipText = {
3925				en: 'Copy to Clipboard Not Supported',
3926				de: 'In die Zwischenablage kopieren ist nicht möglich',
3927				fr: 'Impossible de copier dans le presse-papiers',
3928				it: 'Copia negli appunti non disponibile',
3929				es: 'No es posible copiar del portapapeles.'
3930			};
3931			alert(copyToClipText[utilities.pageLang().getLang()]);
3932		}
3933	}
3934}
3935/* End Working Order */
3936
3937
3938// Updated dynamic Carousel function
3939function dynamicCarousel(carousel, disableLarge) {
3940	var carouselWrap = carousel.find('.prodcarousel_wrap');
3941	var carouselOptions = {};
3942	disableLarge = disableLarge === undefined ? false : disableLarge;
3943
3944	if (disableLarge || carousel.hasClass('is-sm')) {
3945		carouselOptions.large_cells = false;
3946	}
3947
3948	function applyCarousel(options) {
3949		if (!disableLarge && !carousel.hasClass('is-sm')) {
3950			carousel.addClass("is-lg");
3951		}
3952		if (options) {
3953			carouselWrap.listcarousel(options);
3954		} else {
3955			carouselWrap.listcarousel();
3956		}
3957	}
3958
3959	function deleteCarousel() {
3960		if (!disableLarge && !carousel.hasClass('is-sm')) {
3961			carousel.removeClass("is-lg");
3962		}
3963
3964		if (carousel.hasClass("has-lgcells")) {
3965			carousel.removeClass("has-lgcells");
3966		}
3967		carouselWrap.listcarousel('destroy');
3968	}
3969
3970	if (carousel.hasClass('is-sm')) {
3971		if (window.innerWidth >= 1431) {
3972			carouselOptions.per_page = 7;
3973
3974			applyCarousel(carouselOptions);
3975		} else if (window.innerWidth >= 975) {
3976			carouselOptions.per_page = 5;
3977
3978			applyCarousel(carouselOptions);
3979		}
3980	} else {
3981		if (window.innerWidth >= 975) {
3982			if (!carousel.find(".sw-listcarousel").length) {
3983				applyCarousel(carouselOptions);
3984			}
3985		}
3986		//applyCarousel();
3987	}
3988
3989	$(window).on("resize", function () {
3990		if (carousel.hasClass('is-sm')) {
3991			if (window.innerWidth >= 1431) {
3992				if (!carousel.hasClass("has-7")) {
3993					carousel.removeClass('has-5');
3994					carousel.addClass('has-7');
3995					carouselOptions.per_page = 7;
3996					applyCarousel(carouselOptions);
3997				}
3998			} else if (window.innerWidth >= 975) {
3999				if (!carousel.hasClass("has-5")) {
4000					carousel.removeClass('has-7');
4001					carousel.addClass('has-5');
4002					carouselOptions.per_page = 5;
4003					applyCarousel(carouselOptions);
4004				}
4005			} else {
4006				if (carousel.find(".sw-listcarousel").length) {
4007					carousel.removeClass('has-7');
4008					carousel.removeClass('has-5');
4009					deleteCarousel();
4010				}
4011			}
4012		} else {
4013			if (window.innerWidth >= 975) {
4014				if (!carousel.find(".sw-listcarousel").length) {
4015					applyCarousel(carouselOptions);
4016				}
4017			} else {
4018				if (carousel.find(".sw-listcarousel").length) {
4019					deleteCarousel();
4020				}
4021			}
4022		}
4023	});
4024}
4025
4026/* Password Show Hide */
4027function pwShowHide(formPass) {
4028	var passInput = formPass,
4029	showBtn = passInput.next('.input-group-append'),
4030	showBtnIcon = showBtn.find('.icon-visibility'),
4031	btnForm = showBtnIcon.closest('form'),
4032	btnFormSubmit = btnForm.find("button[type='submit']");
4033
4034	if ( passInput.parent().hasClass('visibility') ) {
4035		showBtn.on('click', function(event) {
4036			event.preventDefault();
4037			if ( !showBtnIcon.hasClass('is-visible') ) {
4038				passInput.attr('type','text');
4039				showBtnIcon.addClass('is-visible');
4040				showBtnIcon.text('Hide');
4041			} else {
4042				passInput.attr('type','password');
4043				showBtnIcon.removeClass('is-visible');
4044				showBtnIcon.text('Show');
4045			}
4046		});
4047
4048		btnFormSubmit.on('click',function() {
4049			if ( showBtnIcon.hasClass('is-visible') ) {
4050				passInput.attr('type','password');
4051				showBtnIcon.removeClass('is-visible');
4052				showBtnIcon.text('Show');
4053			}
4054		});
4055	}
4056}
4057
4058/* Shipping Calculator - Load Results */
4059function shipcalc_retrieve(serial, page){
4060	var rates = page.find(".ship_rates").eq(0);
4061	if(rates.length){
4062		rates.html("").addClass("loading");
4063	} else {
4064		rates = $("<div class='ship_rates loading'></div>");
4065		page.find(".shipcalc_content").eq(0).prepend(rates);
4066	}
4067	$.ajax({
4068		timeout: 8000,
4069		type: "GET",
4070		url: "/ajax/shipping_calc_results.html?calc=modal&" + serial,
4071		//url: "https://www.tenniswarehouse-europe.com/zzz/responsive/ajax/shipping_calc_results.html?calc=modal&" + serial,
4072		dataType: "html",
4073		success: function(contents){
4074			var noShipText = {
4075				en: 'We\'re sorry. No shipping options were found for the location provided. Please double check the data entered and try again.<br><br><b>Note:</b> U.S. shipping rates require a zip code.',
4076				de: 'Es tut uns leid. F&uuml;r den angegebenen Standort wurden keine Versandoptionen gefunden. Bitte &uuml;berpr&uuml;fe die eingegebenen Daten und versuche es erneut.',
4077				fr: 'Nous sommes d&eacute;sol&eacute;s. Aucune option d\'envoi n\'a &eacute;t&eacute; trouv&eacute;e pour le lieu renseign&eacute;. Merci de v&eacute;rifier les donn&eacute;es renseign&eacute;es et de r&eacute;essayer.',
4078				it: 'Siamo spiacenti. Non ci sono opzioni di spedizioni per la zona inserita. Ti preghiamo di ricontrollare i dati inseriti e di provare di nuovo.',
4079				es: 'Lo sentimos. No hemos encontrado opciones de env&iacute;
4079o para la localidad seleccionada. Por favor, comprueba que todo es correcto e int&eacute;ntalo otra vez.'
4080			};
4081			var rows = $(contents).find(".list-group-item").length;
4082			if(rows !== 0){
4083				contents = contents.split("0,00&euro;").join("FREE");
4084				rates.replaceWith($(contents));
4085			} else {
4086				rates.removeClass("loading").html("<p class='warning'>" + noShipText[utilities.pageLang().getLang()] + "</p>");
4087			}
4088		},
4089		error: function(){
4090			var errorText = {
4091				en: 'We\'re sorry. Your request could not be processed. Please try again in a few moments.',
4092				de: 'Leider konnte die Anfrage nicht bearbeitet werden. Bitte versuche es in einigen Augenblicken erneut.',
4093				fr: 'Nous sommes d&eacute;sol&eacute;s. Votre demande n\'a pu &ecirc;tre trait&eacute;e. Merci de r&eacute;essayer dans quelques instants.',
4094				it: 'Siamo spiacenti. La tua richiesta non &egrave; andato a buon fine. Ti preghiamo di riprovare pi&ugrave; tardi.',
4095				es: 'No hemos podido procesar tu solicitud. Por favor, int&eacute;ntalo de nuevo m&aacute;s tarde.'
4096			};
4097			rates.removeClass("loading").html("<p>" + errorText[utilities.pageLang().getLang()] + "</p>");
4098		}
4099	});
4100}
4101
4102// Brands Page
4103var alphaListModule = function(options) { return (function() {
4104	var defaults = {
4105		columns: 'variable', // Options: variable, 1, 2, 3
4106		allLink: true,
4107		splitAll: false,
4108		listDirection: 'vertical' // Options: vertical, horizontal
4109	};
4110
4111	var settings = $.extend({}, defaults, options || {});
4112
4113	var objects = {
4114		brandContainer: null,
4115		brandList: null,
4116		navLinks: null,
4117		brandWrapper: null
4118	};
4119
4120	var state = {
4121		listArray: [],
4122		letterArray: [],
4123		letterString: "",
4124		results: [],
4125		listTotal: 0,
4126		hasCollapse: false,
4127		columnNum: null,
4128		withLogos: false
4129	};
4130
4131	var initAlpha = function() {
4132		if (settings.columns === 'variable') {
4133			var colArray = [
4134				{ width: 992, columns: 4 },
4135				{ width: 768, columns: 3 },
4136				{ width: 480, columns: 2 },
4137				{ width: 0, columns: 1 }
4138			];
4139			var windowWidth = $(window).width();
4140			var availCols = colArray.filter(function(col) {
4141				return windowWidth >= col.width;
4142			});
4143
4144			state.columnNum = availCols[0].columns;
4145		} else {
4146			state.columnNum = settings.columns;
4147		}
4148
4149		objects.brandList = objects.brandContainer.find("li, .col");
4150		objects.brandWrapper = $('<div class="tab-content" id="brandTabContent"><\/div>');
4151
4152		generateLetterArray();
4153		generateNavList();
4154		generateBrandList(state.columnNum);
4155
4156		objects.brandContainer.empty().append(objects.navLinks).append(objects.brandWrapper.append(state.results));
4157
4158		if (settings.columns === 'variable') {
4159			function adjustColumnOnResize() {
4160				var currentCol = state.columnNum;
4161				var $window = $(window);
4162				var availCols = colArray.filter(function(col) {
4163					return $window.width() >= col.width;
4164				});
4165
4166				if (state.columnNum !== availCols[0].columns) {
4167					state.columnNum = availCols[0].columns;
4168				}
4169
4170				if (currentCol !== state.columnNum) {
4171					generateBrandList(state.columnNum);
4172					objects.brandWrapper.empty().append(state.results);
4173				}
4174			}
4175
4176			var throttledColumnResize = utilities.throttle(adjustColumnOnResize, 250);
4177
4178			$(window).on('resize', throttledColumnResize);
4179		}
4180	};
4181
4182	var generateLetterArray = function() {
4183		var letterArray = [];
4184		var listArray = [];
4185		var letterList = null;
4186		var letter = 0;
4187
4188		for (letter = 65; letter <= 91; letter++) {
4189			var letterObj = {};
4190
4191			if (letter == 91) {
4192				letterObj.letter = "num";
4193				letterList = objects.brandList.filter(function() {
4194					var charcode = $(this).find(".name").text().charCodeAt(0);
4195
4196					return (!((charcode < 91 && charcode > 64) || (charcode < 123 && charcode > 96)));
4197				});
4198			} else {
4199				letterObj.letter = String.fromCharCode(letter);
4200
4201				letterList = objects.brandList.filter(function() {
4202					var charcode = $(this).find('.name').text().charCodeAt(0);
4203
4204					return (charcode == letter | charcode == letter + 32);
4205				});
4206			}
4207
4208			state.listTotal = letterList.length;
4209
4210			if (state.listTotal > 0) {
4211				letterObj.disabled = false;
4212			} else {
4213				letterObj.disabled = true;
4214			}
4215
4216			letterArray.push(letterObj);
4217			listArray.push(letterList);
4218		}
4219
4220		state.letterArray = letterArray;
4221		state.listArray = listArray;
4222	};
4223
4224	var generateNavList = function() {
4225		var navLinks = $('<ul id="brandTabs" class="nav nav-tabs" role="tablist"><\/ul>');
4226
4227		state.letterArray.forEach(function(letterObj, i) {
4228			var indNavItem = $('<li class="nav-item' + ((letterObj.disabled)?' is-disabled':'') + '"><\/li>');
4229			var indNavLink = $('<a class="nav-link'+ (i === 0 ? ' active' : '') +'"  id="brand' + letterObj.letter + '-tab" data-toggle="tab" href="#brand' + letterObj.letter + '"' + (letterObj.disabled ? " disabled" : '') + ' role="tab" aria-controls="brand' + letterObj.letter + '"'+ (i === 0 ? ' aria-selected="true"' : '') +'>' + (letterObj.letter == "num" ? "#" : letterObj.letter) + '<\/a>');
4230
4231			indNavLink.on("click", function(e) {
4232				var target = $(this.hash);
4233				target = target.length ? target : $('[name='+this.hash.slice(1)+']');
4234			});
4235
4236			navLinks.append(indNavItem.append(indNavLink));
4237		});
4238
4239		if ((!settings.splitAll) && settings.allLink) {
4240			var allNavLink = $('<li class="nav-item"><a class="nav-link" id="brandAll-tab" data-toggle="tab" href="#brandAll" role="tab" aria-controls="brandAll">All<\/a><\/li>');
4241
4242			allNavLink.find("a").on("click", function() {
4243				var target = $(this.hash);
4244				target = target.length ? target : $('[name='+this.hash.slice(1)+']');
4245			});
4246
4247			navLinks.append(allNavLink);
4248		}
4249
4250		objects.navLinks = navLinks;
4251	};
4252
4253	var generateBrandList = function(numOfLists) {
4254		var resultsArray = [];
4255		var allTabsContainer = $('<div id="brandAll" class="tab-pane fade brands-page__sorted-list-container" role="tabpanel" aria-labelledby="#brandAll-tab"><\/div>');
4256		var allTabsListWrap = $('<div id="brandAll-link" class="brand_list"><\/div>');
4257
4258		state.letterArray.forEach(function(letterObj, i) {
4259			var letterContainer = $('<div id="brand' + letterObj.letter + '" class="tab-pane fade brands-page__sorted-list-container" role="tabpanel" aria-labelledby="#brand' + letterObj.letter + '-tab"><\/div>');
4260			var letterIndicator = $('<span class="letter" data-target="#brand' + letterObj.letter + '-link">' + ((letterObj.letter == "num")?"#" : letterObj.letter) + '<\/span>');
4261			var letterListWrap = $('<div id="brand' + letterObj.letter + '-link" class="brand_list"><\/div>');
4262			var letterListTemp = $('<div></div>').append($('<ul class="brands-page__sorted-list-column"><\/ul>').append(state.listArray[i]));
4263
4264			letterContainer.append(letterIndicator);
4265
4266			if (!state.withLogos) {
4267				if (settings.listDirection === 'vertical') {
4268					var spreadList = createitemList(letterListTemp, numOfLists);
4269
4270					letterListWrap.append(spreadList);
4271				} else if (settings.listDirection === 'horizontal') {
4272					letterListTemp.addClass("brands-page__sorted-list-columns brands-page__sorted-list-flex");
4273					letterListWrap.append(letterListTemp);
4274				}
4275
4276				letterContainer.append(letterListWrap);
4277			} else {
4278				letterContainer.addClass("brand-block");
4279				letterListWrap.addClass("row");
4280				letterListWrap.append(state.listArray[i]);
4281
4282				letterContainer.append($('<div class="brands-page__sorted-list-icon-wrap"></div>').append(letterListWrap));
4283			}
4284
4285			if (objects.navLinks !== null && objects.navLinks.find('#brand' + letterObj.letter + '-tab').hasClass('active')) {
4286				letterContainer.addClass('active show');
4287			}
4288
4289			if (settings.allLink && state.listArray[i].length) {
4290				allTabsListWrap.append(letterIndicator.clone())
4291
4292				if (!state.withLogos) {
4293					if (settings.listDirection === 'vertical') {
4294						allTabsListWrap.append(spreadList.clone());
4295					} else if (settings.listDirection === 'horizontal') {
4296						allTabsListWrap.append(letterListTemp.clone());
4297					}
4298
4299					allTabsContainer.append(allTabsListWrap);
4300				} else {
4301					allTabsContainer.addClass("brand-block");
4302					allTabsListWrap.append($('<div class="brands-page__sorted-list-icon-wrap"></div>').append($('<div class="row"></div>').append(state.listArray[i].clone())));
4303
4304					allTabsContainer.append(allTabsListWrap);
4305				}
4306			}
4307
4308			resultsArray.push(letterContainer);
4309		});
4310
4311		if (settings.allLink) {
4312			if (objects.navLinks !== null && objects.navLinks.find('#brandAll-tab').hasClass('active')) {
4313				allTabsContainer.addClass('active show');
4314			}
4315
4316			resultsArray.push(allTabsContainer);
4317		}
4318
4319		state.results = resultsArray;
4320	};
4321
4322	return {
4323		setContainer: function(jqobject) {
4324			objects.brandContainer = jqobject;
4325			if (jqobject.hasClass('has-icons')) state.withLogos = true;
4326			initAlpha();
4327		}
4328	}
4329})();
4330
4331}
4332// End Brands Page
4333
4334// Youtube Embed Generation
4335var descVidArray = [];
4336
4337$(".dynamic_vid").each(function(i, e){
4338	var descVidObject = {};
4339	$(this).attr("id", "desc_vid-"+i);
4340	descVidObject.id = "desc_vid-"+i;
4341	descVidObject.vidCode = $(this).data("code");
4342	descVidObject.vidName = $(this).data("name");
4343	descVidObject.vidStart = isNaN($(this).data("start")) ? 0 : Number($(this).data("start"));
4344	descVidArray.push(descVidObject);
4345});
4346
4347// 2. This code loads the IFrame Player API code asynchronously.
4348
4349var tag = document.createElement('script');
4350tag.src = "https://www.youtube.com/iframe_api";
4351var firstScriptTag = document.getElementsByTagName('script')[0];
4352firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
4353
4354// 3. This function creates an <iframe> (and YouTube player)
4355//    after the API code downloads.
4356function onYouTubeIframeAPIReady() {
4357	if(typeof descVidArray === 'undefined')
4358		return;
4359
4360	for(var i = 0; i < descVidArray.length;i++) {
4361		var curplayer = createPlayer(descVidArray[i]);
4362	}
4363}
4364
4365function createPlayer(playerInfo) {
4366	return new YT.Player(playerInfo.id, {
4367		height: 'inherit',
4368		width: 'inherit',
4369		videoId: playerInfo.vidCode,
4370		playerVars: {
4371			cc_load_policy: 1,
4372			cc_lang_pref: "en",
4373			rel: 0,
4374			start: playerInfo.vidStart,
4375		},
4376		events: {
4377			'onStateChange': onPlayerStateChange
4378		}
4379	});
4380}
4381
4382function onPlayerStateChange(event) {
4383	if (event.data == YT.PlayerState.PLAYING) {
4384		var vidName = $(event['target']['a']).data("name");
4385		var vidLabel = $(event['target']['a']).data("label");
4386
4387		reportEventTracking('Video', vidLabel, vidName);
4388	}
4389}
4390// End Youtube Embed Generation
4391
4392// Panel functions
4393function trapFocus(element) {
4394	var focusableEls = element.find('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])');
4395	var firstFocusableEl = focusableEls[0];
4396	var lastFocusableEl = focusableEls[focusableEls.length - 1];
4397	var KEYCODE_TAB = 9;
4398	console.log('first', firstFocusableEl);
4399	console.log('last', lastFocusableEl);
4400
4401	element.on('keydown', function(e) {
4402		var isTabPressed = (e.key === 'Tab' || e.keyCode === KEYCODE_TAB);
4403
4404		if (!isTabPressed) {
4405			return;
4406		}
4407
4408		if ( e.shiftKey ) /* shift + tab */ {
4409			if (document.activeElement === firstFocusableEl) {
4410				lastFocusableEl.focus();
4411				e.preventDefault();
4412			}
4413		} else /* tab */ {
4414			if (document.activeElement === lastFocusableEl) {
4415				firstFocusableEl.focus();
4416				e.preventDefault();
4417			}
4418		}
4419	});
4420}
4421
4422function trapFocusMenu(element)  {
4423	element.focus()
4424	//Select all tab-able elements in first layer of menu drawer
4425	var focusableNonhiddenMenuEls = element.find($('.active a[href]:not(.offcanvas-menu-hidden *), button:not(.offcanvas-menu-hidden *), input[type="text"]:not(.offcanvas-menu-hidden *)'));
4426	
4427	var firstFocusableMenuEl = focusableNonhiddenMenuEls[0];
4428	var lastFocusableMenuEl = focusableNonhiddenMenuEls[focusableNonhiddenMenuEls.length - 1];
4429	var KEYCODE_TAB = 9;
4430			
4431	element.on('keydown', function(e) {
4432		var isTabPressed = (e.key === 'Tab' || e.keyCode === KEYCODE_TAB);
4433
4434		if (!isTabPressed) {
4435			return;
4436		}
4437
4438		if ( e.shiftKey ) /* shift + tab */ {
4439			if (document.activeElement === firstFocusableMenuEl) {
4440				lastFocusableMenuEl.focus();
4441				e.preventDefault();
4442			}
4443		} else /* tab */ {
4444			if (document.activeElement === lastFocusableMenuEl) {
4445				firstFocusableMenuEl.focus();
4446				e.preventDefault();
4447			}
4448		}
4449	});	
4450}
4451
4452function trapFocusHiddenPanel(element) {
4453	element.focus()
4454	//Select all tab-able elements in a deeper layer of drawer when shown
4455	var focusableHiddenEls = element.find($('.js-focusable a[href]:not([disabled]), button, input[type="text"]'));
4456	
4457	var firstFocusableHiddenEl = focusableHiddenEls[0];
4458	var lastFocusableHiddenEl = focusableHiddenEls[focusableHiddenEls.length - 1];
4459	var KEYCODE_TAB = 9;
4460	
4461	$('.offcanvas-menu-hidden').not('.js-focusable').attr('inert', '');
4462			
4463	element.on('keydown', function(e) {
4464		var isTabPressed = (e.key === 'Tab' || e.keyCode === KEYCODE_TAB);
4465
4466		if (!isTabPressed) {
4467			return;
4468		}
4469
4470		if ( e.shiftKey ) /* shift + tab */ {
4471			if (document.activeElement === firstFocusableHiddenEl) {
4472				lastFocusableHiddenEl.focus();
4473				e.preventDefault();
4474			}
4475		} else /* tab */ {
4476			if (document.activeElement === lastFocusableHiddenEl) {
4477				firstFocusableHiddenEl.focus();
4478				e.preventDefault();
4479			}
4480		}
4481	});	
4482}
4483
4484var openCanvas = function(canvasBtn, headerHeight) {
4485	var canvasTarget = $(canvasBtn.data("target"));
4486	if (document.activeElement) {
4487		if (canvasTarget[0] && !canvasTarget[0].contains(document.activeElement)) {
4488			canvasTarget[0].returnFocusOnCloseElement = document.activeElement;
4489		}
4490	}
4491	var backDrop = $("<div />").addClass("offcanvas-backdrop");
4492	var currentPos = $(document).scrollTop();
4493	var closeBtn = $('body').find('.offcanvas-collapse button.icon-x');
4494	backDrop.on("click", function() {
4495		closeCanvas(currentPos);
4496		window.scrollTo(0, parseInt(currentPos || '0'));
4497		canvasBtn.focus();
4498	});
4499
4500	closeBtn.on("click", function() {
4501		closeCanvas(currentPos);
4502		window.scrollTo(0, parseInt(currentPos || '0'));
4503		canvasBtn.focus();
4504	});
4505
4506	if (canvasBtn.hasClass("header__menu-button") || canvasBtn.hasClass("l-footer-menu_btn")) {
4507		$(".header__menu-button").addClass("is-open");
4508		/*
4509		if (headerHeight != null) {
4510			var menuCSS = {
4511				'height': 'calc(100vh - '+ headerHeight +'px)',
4512				'top': headerHeight + 'px'
4513			};
4514
4515			backDrop.css(menuCSS);
4516			canvasTarget.css(menuCSS);
4517		}
4518		*/
4519	}
4520
4521	canvasTarget.addClass('open');
4522
4523	$("body").addClass("is-fixed").css("top", -currentPos+"px");
4524	canvasTarget.after(backDrop);
4525
4526	setTimeout(function() {
4527		canvasTarget.focus();
4528		if (canvasTarget.hasClass('offcanvas-menu')) {
4529			trapFocusMenu(canvasTarget);
4530		} else {
4531			trapFocus(canvasTarget);
4532		}
4533
4534		// This routine is to force the tab in the menu canvas to activate after deactivating on page scroll
4535		var activeTab = localStorage.getItem('activeTab');
4536		if (activeTab) {
4537			//$('.nav-tabs button[id="' + activeTab + '"]').tab('show');
4538			$('.nav-tabs #' + activeTab).addClass('active');
4539		}
4540
4541	}, 300);
4542}
4543
4544var closeCanvas = function(currentPos) {
4545	$("body").removeClass("is-fixed").attr("style", "");
4546	$(".header__menu-button").removeClass("is-open");
4547
4548	$(".offcanvas-backdrop").remove();
4549
4550	var returnFocusOnCloseElement = $(".offcanvas-collapse.open")[0]?.returnFocusOnCloseElement;
4551
4552	$(".offcanvas-collapse").removeClass('open')
4553	$(".offcanvas-collapse").find(".is-shown").removeClass("is-shown");
4554	$(".offcanvas-collapse").find(".is-hidden").removeClass("is-hidden");
4555
4556	if ($(".header__menu-button").hasClass("is-open")) {
4557		$(".header__menu-button").removeClass("is-open");
4558	}
4559
4560	$("body").removeClass("is-fixed").attr("style", "");
4561	window.scrollTo(0, parseInt(currentPos || '0'));
4562	$(".offcanvas-backdrop").remove();
4563
4564	$(window).off("resize", resizeCheck);
4565
4566	if (returnFocusOnCloseElement) {
4567		returnFocusOnCloseElement.focus();
4568	}
4569}
4570
4571var resizeCheck = function() {
4572	if ($(this).width() > 991) {
4573		closeCanvas();
4574		$(window).off("resize", resizeCheck);
4575	}
4576}
4577
4578/* Toggle Taglines */
4579function toggleTaglines() {
4580
4581	var gridViewBtn = $('#toggle-view-grid'),
4582		taglineViewBtn = $('#toggle-view-tagline'),
4583		categoryWrap = $('#category_wrap'),
4584		cattable = categoryWrap.find('.cattable'),
4585		catcellVideoBtn = cattable.find('.cattable-wrap-cell-video'),
4586		catcellReviewBtn = cattable.find('.cattable-wrap-cell-review');
4587
4588	taglineViewBtn.on('click', function() {
4589		if(!taglineViewBtn.hasClass('is-active')) {
4590			gridViewBtn.removeClass('is-active').attr('aria-disabled', 'false');
4591			taglineViewBtn.addClass('is-active').attr('aria-disabled', 'true');
4592			cattable.addClass('has-taglines');
4593			catcellVideoBtn.removeClass('is-hidden');
4594			catcellReviewBtn.removeClass('is-hidden');
4595		}
4596	});
4597	gridViewBtn.on('click', function() {
4598		if(taglineViewBtn.hasClass('is-active')) {
4599			taglineViewBtn.removeClass('is-active').attr('aria-disabled', 'false');
4600			gridViewBtn.addClass('is-active').attr('aria-disabled', 'true');
4601			cattable.removeClass('has-taglines');
4602			catcellVideoBtn.addClass('is-hidden');
4603			catcellReviewBtn.addClass('is-hidden');
4604		}
4605	});
4606}
4607
4608/* Site-wide Banners */
4609if ($('.sitewide-drawer').length) {
4610	$('.sitewide-drawer').each(function() {
4611		var that = $(this);
4612		var sitewideCollapse = $(this).find('.collapse');
4613		var sitewideBackdrop = $('<div class="sitewide-drawer__page-backdrop" />');
4614		var sitewideTab = $(this).find('.sitewide-drawer__tab');
4615		var sitewideBtn = $(this).find('.sitewide-drawer__tab-link');
4616		var actionHTML = sitewideBtn.html();
4617		var footer = $('body').find('footer');
4618
4619		var applyPadding = function() {
4620			var tabHeight = sitewideTab.outerHeight();
4621			if (tabHeight !== parseInt(footer.css('paddingBottom'))) {
4622				footer.css({paddingBottom: tabHeight+'px'})
4623			}
4624		}
4625		var applyPaddingThrottle = utilities.throttle(applyPadding, 50);
4626
4627		applyPadding();
4628		$(window).on('resize', applyPaddingThrottle);
4629
4630		sitewideBackdrop.on('click', function() {
4631			if (sitewideCollapse.hasClass('show')) {
4632				sitewideBackdrop.detach();
4633				sitewideCollapse.collapse('hide');
4634			}
4635		});
4636
4637		sitewideCollapse.on('show.bs.collapse', function() {
4638			that.before(sitewideBackdrop);
4639			sitewideBtn.html('<span>Close</span><i class="icon icon-x icon-sm icon-sm-black"></i>');
4640			
4641			setTimeout(function() { trapFocus(that) }, 300)
4642			
4643			applyPadding();
4644		});
4645
4646		sitewideCollapse.on('hide.bs.collapse', function() {
4647			sitewideBackdrop.detach();
4648			sitewideBtn.html(actionHTML);
4649			applyPadding();
4650		});
4651	});
4652}
4653/* End Site-wide Banners */
4654
4655/* Sticky Header */
4656var stickyHeader = function() {
4657	var windowWidth = window.innerWidth;
4658
4659	var stickyHeader = document.querySelector(".sticky-header, .sticky_header");
4660	if (!stickyHeader) return;
4661
4662	var searchInput = stickyHeader.querySelector(".header__sticky-header-search, .l-header-search-input");
4663
4664	var mobileContent = $(".l-content");
4665
4666	var originalContainerTabindex = stickyHeader.getAttribute("tabindex");
4667
4668	var focusableSelector =
4669		'a[href], area[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), iframe, [tabindex], [contenteditable="true"]';
4670
4671	var setStickyFocusable = function(isVisible) {
4672		if (isVisible) {
4673			if (originalContainerTabindex === null) stickyHeader.removeAttribute("tabindex");
4674			else stickyHeader.setAttribute("tabindex", originalContainerTabindex);
4675
4676			stickyHeader.removeAttribute("aria-hidden");
4677		} else {
4678			stickyHeader.setAttribute("tabindex", "-1");
4679			stickyHeader.setAttribute("aria-hidden", "true");
4680		}
4681
4682		var focusables;
4683		try {
4684			focusables = stickyHeader.querySelectorAll(focusableSelector);
4685		} catch (e) {
4686			console.error("Sticky header: invalid focusable selector", e);
4687			return;
4688		}
4689
4690		focusables.forEach(function(el) {
4691			if (!isVisible) {
4692				if (!el.hasAttribute("data-prev-tabindex")) {
4693					var prev = el.getAttribute("tabindex");
4694					el.setAttribute("data-prev-tabindex", prev === null ? "" : prev);
4695				}
4696				el.setAttribute("tabindex", "-1");
4697			} else {
4698				if (el.hasAttribute("data-prev-tabindex")) {
4699					var prevTab = el.getAttribute("data-prev-tabindex");
4700					if (prevTab === "" || prevTab === null) el.removeAttribute("tabindex");
4701					else el.setAttribute("tabindex", prevTab);
4702					el.removeAttribute("data-prev-tabindex");
4703				} else {
4704					if (el.getAttribute("tabindex") === "-1") el.removeAttribute("tabindex");
4705				}
4706			}
4707		});
4708	};
4709
4710	var headerTransition = function() {
4711		var stickyCompetition = mobileContent.find(".sticky-top");
4712		var stickCompTop = (stickyCompetition.length)
4713			? stickyCompetition.offset().top - stickyCompetition.outerHeight()
4714			: 0;
4715
4716		var bodyTop = parseInt(document.body.style.top);
4717		var newST = (!isNaN(bodyTop) && bodyTop !== '') ? Math.abs(bodyTop) : window.scrollY;
4718
4719		var switchPoint = stickyHeader.classList.contains("no-shipping") ? 0 : 40;
4720
4721		if (newST > lastScrolltop) {
4722			stickyHeader.style.top = "-" + stickyHeader.offsetHeight + "px";
4723			setStickyFocusable(false);
4724
4725			if (stickyCompetition.length) stickyCompetition.removeClass("active-header");
4726		} else {
4727			if (newST >= 300) {
4728				if (stickyCompetition.length && newST > stickCompTop) {
4729					stickyCompetition.addClass("active-header");
4730				}
4731				stickyHeader.style.top = '';
4732				setStickyFocusable(true);
4733			} else {
4734				stickyHeader.style.top = "-" + stickyHeader.offsetHeight + "px";
4735				setStickyFocusable(false);
4736
4737				if (stickyCompetition.length) stickyCompetition.removeClass("active-header");
4738			}
4739		}
4740
4741		lastScrolltop = newST;
4742	};
4743
4744	var throttledTransition = utilities.throttle(headerTransition, 20);
4745
4746	var lastScrolltop = 0;
4747	window.addEventListener("scroll", throttledTransition);
4748	window.addEventListener("resize", throttledTransition);
4749
4750	if (searchInput) {
4751		searchInput.addEventListener("focus", function() {
4752			this.parentElement.classList.add("group-focused");
4753			var icon = stickyHeader.querySelector(".icon-search");
4754			if (icon) icon.classList.remove("is-white");
4755		});
4756
4757		searchInput.addEventListener("blur", function() {
4758			if (this.value === '') {
4759				this.parentElement.classList.remove("group-focused");
4760				setTimeout(function() {
4761					var icon = stickyHeader.querySelector(".icon-search");
4762					if (icon) icon.classList.add("is-white");
4763				}, 1000);
4764			}
4765		});
4766	}
4767
4768	stickyHeader.style.top = "-" + stickyHeader.offsetHeight + "px";
4769	setStickyFocusable(false);
4770};
4771
4772if ($('.sticky-header, .sticky_header').length) {
4773	stickyHeader();
4774}
4775/* End Sticky Header */
4776
4777/* Language selector */
4778function langSelectChange() {
4779	var newLocation = this.value;
4780
4781	$(window).on('beforeunload', function() {
4782        localStorage.setItem('scrollPos', $(window).scrollTop());
4783    });
4784
4785	if (location.hash !== '') {
4786		newLocation += location.hash;
4787	}
4788
4789	location = newLocation;
4790
4791	//location.reload();
4792
4793}
4794
4795if (localStorage.getItem('scrollPos')) {
4796	$(window).scrollTop(localStorage.getItem('scrollPos'));
4797	localStorage.removeItem('scrollPos');
4798}
4799
4800function langDropChange(e) {
4801	e.preventDefault();
4802	var newLocation = this.href;
4803	if (location.hash !== '') {
4804		newLocation += location.hash;
4805	}
4806
4807	location = newLocation;
4808}
4809
4810/* VAT selector */
4811$(".vat_select_submit").on("change",function(){
4812
4813	if ($(this).val() == "") {
4814
4815		var vatmsg = "";
4816		var lang = PageLang.getLang();
4817
4818		switch(lang) {
4819			case "de":
4820				vatmsg = "Wählen Sie ein Land";
4821				break;
4822			case "fr":
4823				vatmsg = "Choisissez un pays";
4824				break;
4825			case "it":
4826				vatmsg = "Seleziona un paese";
4827				break;
4828			case "es":
4829				vatmsg = "Seleccione un país";
4830				break;
4831			default:
4832				vatmsg = "Please Select a Country";
4833				break;
4834		}
4835
4836		alert(vatmsg);
4837
4838	} else {
4839
4840		$(window).on('beforeunload', function() {
4841			localStorage.setItem('scrollPos', $(window).scrollTop());
4842		});
4843
4844		$(this).closest("form").submit();
4845
4846	}
4847});
4848
4849/*====================================
4850BEGIN Menu Search Initialization
4851====================================*/
4852
4853$('#menu_search').each(function(){
4854	var AjaxProductSearch = AjaxProductSearchModule();
4855
4856	if($(this).hasClass('onresultspage'))
4857	{
4858		AjaxProductSearch.settarget($('#searchresultsarea'));
4859		AjaxProductSearch.setTextSearch();
4860		AjaxProductSearch.assigntextform($(this).find('form'));
4861		AjaxProductSearch.assigntextfield($('#searchtext'));
4862		AjaxProductSearch.setLang(utilities.pageLang().getLang());
4863		AjaxProductSearch.loadPrefs();
4864		if(window.location.hash.length)
4865		{
4866			var hash = window.location.hash.substring(window.location.hash.indexOf('#') + 1);
4867			AjaxProductSearch.runSearch(hash);
4868		}
4869		window.onhashchange = function(){
4870			AjaxProductSearch.runSearch(window.location.hash.substring(window.location.hash.indexOf('#') + 1));
4871		};
4872		$(this).find('form').bind("submit",function (e) {
4873			e.preventDefault();
4874			AjaxProductSearch.resetOptions();
4875			AjaxProductSearch.runTextSearch();
4876		});
4877	}
4878});
4879
4880/*====================================
4881END Menu Search Initialization
4882====================================*/
4883
4884function createitemList(itemList, numOfLists) {
4885	var clonedList = itemList.clone();
4886	var listItems = clonedList.find('li');
4887	var numOfItems = listItems.length;
4888
4889	function spreadItems(listItems, numOfLists) {
4890		var sortedItemLists = $('<div class="brands-page__sorted-list-columns"></div>');
4891		var remainderItems = numOfItems % numOfLists;
4892		var numPerList = Math.floor(numOfItems / numOfLists);
4893
4894		for (var i = 0; numOfLists > i; ++i) {
4895			var newList = $('<ul class="brands-page__sorted-list-column"></ul>');
4896
4897			clonedList.find('li').each(function(j) {
4898				newList.append($(this));
4899
4900				if (remainderItems > 0) {
4901					if ((j + 1) % (numPerList + 1) === 0) return false;
4902				} else {
4903					if ((j + 1) % numPerList === 0) return false;
4904				}
4905			});
4906
4907			if (remainderItems > 0) remainderItems = --remainderItems;
4908			sortedItemLists.append(newList);
4909		}
4910
4911
4912		clonedList.html(sortedItemLists);
4913	}
4914
4915	spreadItems(listItems, numOfLists);
4916
4917	return clonedList;
4918}
4919
4920/*====================================
4921	BEGIN MENU FINDER INITIALIZATION
4922====================================*/
4923
4924$('.menu_finder').each(function() {
4925
4926	$(this).find('.subselection').each(function(){
4927		var parent_div = $(this).closest('.list-group-filter_checkbox');
4928		var parent_row = $(this).closest('.list-group-item');
4929		var parent_value = $(this).data("associated_value");
4930		var listLabel = $(this).attr("label");
4931		var listName = $(this).data("selectname");
4932
4933		if($(this).hasClass('multi')) {
4934			var new_drop = $('<div class="option_drop"><div class="title"><span class="label">' + $(this).attr("label") + ': </span><span class="value"></span><span class="arrow"><span></span></span></div></div>');
4935			var new_options = $('<div class="options"></div>');
4936			new_drop.append(new_options);
4937			var input_name = $(this).data("selectname");
4938			$(this).find('option').each(function(){
4939				var input_value = $(this).attr('value');
4940				var input_label = $(this).text();
4941				new_options.append('<span class="fancy_check"><input id="opt_' + input_value + '" type="checkbox" name="' + input_name + '" value="' + input_value + '"> <label for="opt_' + input_value + '" onclick=""><span></span>' + input_label + '</label></span>');
4942			});
4943
4944			parent_row.after(new_drop);
4945
4946			parent_select.change(function(){
4947				if($(this).val() == parent_value) {
4948					new_drop.show();
4949				} else {
4950					new_drop.find('input').prop('checked',false);
4951					new_drop.hide();
4952				}
4953			});
4954
4955			if(parent_select.val() != parent_value) {
4956				new_drop.find('input').prop('checked',false);
4957				new_drop.hide();
4958			}
4959		} else {
4960			var new_row = $('<div class="list-group-item list-group-collapse option_drop"></div>');
4961			var new_div = $('<div id="'+listLabel+'" class="list-group-filter_checkbox collapse show" aria-labelledby="'+listLabel+'" data-parent="#filter_accordion"><\/div>');
4962
4963			new_div.append('<div class="form-check"><input class="form-check-input" type="radio" name="'+listName+'" id="'+listName+'_null" value="null" checked><label class="form-check-label" for="'+listName+'_null">'+listLabel+'</label></div>');
4964			new_div.append($(this).find('.form-check'));
4965
4966			parent_row.after(new_row.append(new_div));
4967
4968			parent_div.find(".form-check-input").change(function(){
4969				if($(this).is("checked")){
4970					if($(this).val() == parent_value) {
4971						new_row.show();
4972					} else {
4973						if(new_select.prop("selectedIndex") != 0) {
4974							//new_div.prop("selectedIndex",0).change();
4975						}
4976						new_row.hide();
4977					}
4978				}
4979			});
4980
4981			if(parent_select.val() != parent_value) {
4982				if(new_div.prop("selectedIndex") != 0) {
4983					new_div.prop("selectedIndex",0).change();
4984				}
4985				new_row.hide();
4986			}
4987		}
4988		$(this).detach();
4989	});
4990
4991	//Set Up Dynamic Checkboxes, Option Drop Show/Hide
4992	$(this).find('.option_drop').each(function(){
4993		var drop = $(this);
4994		var dyn_checks = $(this).find('.dynamic_checkbox');
4995		if(dyn_checks.length) {
4996			var other_checks = $(this).find('input:not(.dynamic_checkbox)');
4997			dyn_checks.each(function(){
4998				var dyn_check = $(this);
4999				var dyn_check_wrap = $(this).closest('.fancy_check');
5000				var input_name = $(this).data("associated_name");
5001				var input_values = $(this).data("associated_values").split(",");
5002				var input = $(this).closest('.menu_finder').find('[name="' + input_name + '"]');
5003
5004				input.change(function(){
5005					if($.inArray($(this).val(),input_values) >= 0) {
5006						dyn_check.prop('disabled',false);
5007						dyn_check_wrap.show();
5008					} else {
5009						dyn_check.prop('checked',false).change();
5010						dyn_check.prop('disabled',true);
5011						dyn_check_wrap.hide();
5012					}
5013					if(dyn_checks.is(':enabled') || other_checks.length) {
5014						drop.show();
5015					} else {
5016						drop.hide();
5017					}
5018				});
5019				if($.inArray(input.val(),input_values) >= 0) {
5020					dyn_check.prop('disabled',false);
5021					dyn_check_wrap.show();
5022				} else {
5023					dyn_check.prop('checked',false).change();
5024					dyn_check.prop('disabled',true);
5025					dyn_check_wrap.hide();
5026				}
5027				if(dyn_checks.is(':enabled') || other_checks.length) {
5028					drop.show();
5029				} else {
5030					drop.hide();
5031				}
5032			});
5033		}
5034	});
5035
5036	var AjaxProductSearch = AjaxProductSearchModule();
5037
5038	if($(this).hasClass('onresultspage')) {
5039		AjaxProductSearch.settarget($('#searchresultsarea'));
5040		AjaxProductSearch.assignfinder($(this).find('form'));
5041		AjaxProductSearch.loadPrefs();
5042		AjaxProductSearch.setLang(utilities.pageLang().getLang());
5043
5044		if(window.location.hash.length) {
5045			var hash = window.location.hash.substring(window.location.hash.indexOf('#') + 1);
5046			$(".slidermin, .slidermax").each( function() {
5047				var selectedval = hash.split($(this).attr("name") + '=')[1];
5048				if(selectedval) {
5049					if(selectedval.length) {
5050						if(selectedval[0][0] != '&') {
5051							selectedval = selectedval.split('&')[0];
5052							$(this).val(selectedval);
5053						}
5054					}
5055				}
5056			});
5057			AjaxProductSearch.runSearch(hash);
5058		}
5059		window.onhashchange = function(){
5060			AjaxProductSearch.runSearch(decodeURI(window.location.hash.substring(window.location.hash.indexOf('#') + 1)));
5061		};
5062		$(this).find('form').bind("submit",function (e) {
5063			e.preventDefault();
5064			AjaxProductSearch.resetOptions();
5065			AjaxProductSearch.runFinderSearch();
5066		});
5067	} else {
5068		AjaxProductSearch.assignfinder($(this).find('form'));
5069		AjaxProductSearch.loadPrefs();
5070
5071		$(this).find('form').bind("submit",function (e) {
5072			e.preventDefault();
5073			var actionquery = "";
5074			$(this).find('.keepinquery').each(function(i) {
5075				actionquery += ((i == 0)?"?":"&") + $(this).attr("name") + "=" + $(this).val();
5076			});
5077			var allcatstext = "";
5078			if(!($(this).find('input.cat_filter').length)) {
5079				$(this).find('.default_all').each(function (){
5080					if($(this).val() == "" || $(this).val() == "null") {
5081						$(this).find('option').each(function(){
5082							if($(this).val() != "" && $(this).val() != "null" ) {
5083								allcatstext += "cat_all=" + $(this).val() + "&";
5084							}
5085						});
5086					} else {
5087						if($(this).hasClass('default_as_basecat')) {
5088							allcatstext += "cat_all=" + $(this).val() + "&";
5089						}
5090					}
5091				});
5092			}
5093			$(this).find('select.no_blank_value').each(function(){
5094				if($(this).val() == "") {
5095					$(this).attr("name","");
5096				}
5097			});
5098
5099			// console.log($(this).attr("action") + actionquery + '#' + allcatstext + $(this).serialize() +  AjaxProductSearch.serializeOptions());
5100			location.assign($(this).attr("action") + actionquery + '#' + allcatstext + $(this).serialize() +  AjaxProductSearch.serializeOptions());
5101		});
5102	}
5103
5104	$(this).find('.priceslider').each(function() {
5105		var slider = $(this);
5106		var field_min = slider.find(".price_min").eq(0);
5107		var field_max = slider.find(".price_max").eq(0);
5108
5109		var slidemin = 0;
5110		var slidemax = 100;
5111		var slidestep = 1;
5112		var initialmin = parseInt(field_min.val());
5113		var initialmax = parseInt(field_max.val());
5114
5115		var currentlang = utilities.pageLang().getLang();
5116		var min_text = { en : "Min", de : "Min", es : "M&iacute;n", fr : "Min", it : "Min" };
5117		var max_text = { en : "Max", de : "Max", es : "M&aacute;x", fr : "Max", it : "Max" };
5118
5119		if(field_min.data("min") != undefined) {
5120			slidemin = parseInt(field_min.data("min"));
5121			if(isNaN(slidemin)) {
5122				slidemin = 0;
5123			}
5124		}
5125
5126		if(field_max.data("max") != undefined) {
5127			slidemax = parseInt(field_max.data("max"));
5128			if(isNaN(slidemax)) {
5129				slidemax = 100;
5130			}
5131		}
5132
5133		if(slider.data("slidestep") != undefined) {
5134			slidestep = parseInt(slider.data("slidestep"));
5135			if(isNaN(slidestep)) {
5136				slidestep = 1;
5137			}
5138		}
5139
5140		if(slider.data("slidestep") != undefined) {
5141			slidestep = parseInt(slider.data("slidestep"));
5142			if(isNaN(slidestep)) {
5143				slidestep = 1;
5144			}
5145		}
5146
5147		if(isNaN(initialmin) || initialmin == null || initialmin < slidemin) {
5148			initialmin = slidemin;
5149		}
5150
5151		if(isNaN(initialmax)|| initialmax == null || initialmax > slidemax ) {
5152			initialmax = slidemax;
5153		}
5154
5155		slider.find('.priceinputs').hide();
5156
5157		slider.append($('<div class="price_range_slider"><\/div>').slider({
5158			range: true,
5159			min: slidemin,
5160			max: slidemax,
5161			step: slidestep,
5162			values: [ initialmin, initialmax ],
5163			slide: function( event, ui ) {
5164				field_min.val( ui.values[0]);
5165				field_max.val( ui.values[1]);
5166				pricewrap.html("<span class='col'>" + min_text[currentlang] + "<\/span><span class='col text-center'>" + ui.values[ 0 ] + " &euro; - " + ui.values[ 1 ] + " &euro;<\/span><span class='col text-right'>" + max_text[currentlang] + "<\/span>");
5167			},
5168			stop: function(event,ui) {
5169				if(!AjaxProductSearch.isPaused())
5170				{
5171					AjaxProductSearch.trackInteraction("Price: " + ui.values[0] + " &euro; - " + ui.values[1] + " &euro;");
5172					// $(this).closest("form").submit();
5173				}
5174			}
5175		}));
5176		var pricewrap = $('<div class="pricewrap small row"><\/div>').html("<span class='col'>" + min_text[currentlang] + "<\/span><span class='col text-center'>" + initialmin + " &euro; - " + initialmax + " &euro;<\/span><span class='col text-right'>" + max_text[currentlang] + "<\/span>");
5177		slider.find('.price_range_slider').after(pricewrap);
5178	});
5179
5180	$(this).find('select').each(function(){
5181		select_enhance($(this));
5182		var select_label = $(this).find('option').eq(0).html();
5183		$(this).change(function(){
5184			if(!AjaxProductSearch.isPaused()) {
5185				AjaxProductSearch.currentPage = 1;
5186				if($(this).prop('selectedIndex') != 0)
5187				{
5188					AjaxProductSearch.trackInteraction(select_label + ": " + $(this).find('option').eq($(this).prop('selectedIndex')).html());
5189				}
5190				else
5191				{
5192					AjaxProductSearch.trackInteraction(select_label + ": Deselected");
5193				}
5194				// $(this).closest('form').submit();
5195			}
5196		});
5197	});
5198
5199	$(this).find(".option_drop").each(function(){
5200		var thedrop = $(this);
5201		var theoptions = $(this).find('.options');
5202		var thelink = $(this).find('.title');
5203		var labeltext = thelink.find('.label').text();
5204
5205		var isopen = false;
5206
5207		if(thedrop.hasClass("open")) {
5208			isopen = true;
5209		} else {
5210			if(theoptions.find(":checked").length){
5211				if(theoptions.parents('.onresultspage').length) {
5212					isopen = true;
5213				}
5214			}
5215		}
5216		if(isopen) {
5217			thedrop.addClass("open");
5218			theoptions.show()
5219		} else {
5220			thedrop.removeClass("open");
5221			theoptions.hide();
5222		}
5223
5224		var selected = theoptions.find(":checked");
5225
5226		if(selected.length) {
5227			if(selected.length > 1) {
5228				thelink.find(".value").html(selected.length + " selected");
5229			} else {
5230				thelink.find(".value").html(" " + selected.next("label").text());
5231			}
5232		} else {
5233			thelink.find(".value").html("");
5234		}
5235
5236		$(this).find("input").change(function(){
5237			var selected = theoptions.find(":checked");
5238			if(selected.length) {
5239				if(selected.length > 1) {
5240					thelink.find(".value").html(selected.length + " selected");
5241				} else {
5242					thelink.find(".value").html(" " + selected.next("label").text());
5243				}
5244			} else {
5245				thelink.find(".value").html("");
5246			}
5247			if(!AjaxProductSearch.isPaused()) {
5248				AjaxProductSearch.resetPaging();
5249				AjaxProductSearch.trackInteraction(labeltext + " " + $('label[for='+$(this).attr("id")+']').text() + ($(this).is(":checked")?" checked":" unchecked"));
5250				// $(this).closest("form").submit();
5251			}
5252		});
5253
5254		thelink.on("click",function(e){
5255			if(thedrop.hasClass("open")) {
5256				thedrop.removeClass("open");
5257				theoptions.stop().slideUp();
5258			} else {
5259				thedrop.addClass("open");
5260				theoptions.stop().slideDown();
5261			}
5262		});
5263
5264		thelink.find(".infobuttonpopup").on("click",function(e){
5265			e.stopPropagation();
5266			e.preventDefault();
5267		}).find(".infobox a").on("click",function(e){
5268			e.stopPropagation();
5269		});
5270
5271	});
5272
5273	$(this).find("input[type=checkbox], input[type=radio]").not('.option_drop input').change(function(){
5274		if(!AjaxProductSearch.isPaused())
5275		{
5276			if($(this).prop("checked"))
5277			{
5278				AjaxProductSearch.trackInteraction($('label[for='+$(this).attr("id")+']').text() + ": Checked");
5279			}
5280			else
5281			{
5282				AjaxProductSearch.trackInteraction($('label[for='+$(this).attr("id")+']').text() + ": Unchecked");
5283			}
5284			// $(this).closest("form").submit();
5285		}
5286	});
5287
5288	$(this).find(".finder_drop").each(function(){
5289		var moreOptText = {
5290			en: 'More Options',
5291			de: 'Mehr Optionen',
5292			fr: 'Plus d\'options',
5293			it: 'Opzioni aggiuntive',
5294			es: 'M&aacute;s opciones'
5295		};
5296		var hideOptText = {
5297			en: 'Hide Options',
5298			de: 'Optionen ausblenden',
5299			fr: 'Masquer',
5300			it: 'Nascondi',
5301			es: 'Ocultar opciones'
5302		};
5303		var thedrop = $(this);
5304		var theoptions = $(this).find('.collapser');
5305		var thelink = $(this).find('.collapse_link');
5306
5307		var isopen = false;
5308
5309		if(thedrop.hasClass("open")) {
5310			isopen = true;
5311		} else {
5312			if(theoptions.find("input:checked").length){
5313				isopen = true;
5314			} else {
5315				theoptions.find('select').each(function(){
5316					if($(this).prop('selectedIndex') != 0) { isopen = true; }
5317				});
5318				theoptions.find(".priceinputs input").each(function(){
5319					if($(this).val() != "") { isopen = true; }
5320				});
5321			}
5322		}
5323		if(!isopen) {
5324			thelink.find(".text").html(moreOptText[utilities.pageLang().getLang()])
5325			theoptions.hide();
5326		}
5327		thelink.on("click",function(e){
5328			if(thedrop.hasClass("open")) {
5329				thedrop.removeClass("open");
5330				thelink.find(".text").html(moreOptText[utilities.pageLang().getLang()])
5331				theoptions.stop().slideUp();
5332			} else {
5333				thedrop.addClass("open");
5334				thelink.find(".text").html(hideOptText[utilities.pageLang().getLang()])
5335				theoptions.stop().slideDown();
5336			}
5337		});
5338	});
5339
5340	$(this).find(".reset_link").on("click",function(){
5341		AjaxProductSearch.pauseSearch();
5342
5343		var form = $(this).closest("form");
5344
5345		form.find('input[type="checkbox"]').each(function(){
5346			if($(this).prop("checked")) {
5347				$(this).prop("checked",false).change();
5348			}
5349		});
5350
5351		form.find('select').each(function(){
5352			if($(this).prop("selectedIndex") != 0) {
5353				$(this).prop("selectedIndex",0).change();
5354			}
5355		});
5356
5357		form.find(".priceinputs input").each(function(){
5358			$(this).val("");
5359		});
5360
5361		form.find(".priceslider").each(function(){
5362			var pricewrap = $(this).find(".pricewrap");
5363			$(this).find(".priceinputs input").each(function(){
5364				$(this).val("");
5365			});
5366			$(this).find(".ui-slider").each(function(){
5367				var options = $(this).slider("option");
5368				$(this).slider( 'values', [ options.min, options.max ] );
5369				pricewrap.html("(" + options.min + "&euro; - " + options.max + "&euro;)");
5370			});
5371		});
5372
5373		AjaxProductSearch.unpauseSearch();
5374		AjaxProductSearch.trackInteraction("Finder Reset");
5375		$(this).closest("form").submit();
5376	});
5377});
5378
5379/*======================================
5380	END MENU FINDER INITIALIZATION
5381=======================================*/
5382
5383
5384//General Function to generate the data for Google Analytics Ecommerce
5385function generate_ecommerce_object(item_element, ecom_type, type) {
5386	var return_data = {};
5387	var mapping_obj = {
5388		"impression": {
5389			"default": [
5390				{key:'name',attr:'gtm_impression_name'},
5391				{key:'id',attr:'gtm_impression_code'},
5392				{key:'price',attr:'gtm_impression_price'},
5393				{key:'category',attr:'gtm_impression_category'},
5394				{key:'brand',attr:'gtm_impression_brand'}
5395			],
5396			"general": [
5397				{key:'name',attr:'gtm_impression_name'},
5398				{key:'id',attr:'gtm_impression_code'},
5399				{key:'price',attr:'gtm_impression_price'},
5400				{key:'category',attr:'gtm_impression_category'},
5401				{key:'brand',attr:'gtm_impression_brand'}
5402			]
5403		},
5404		"promo": {
5405			"default": [
5406				{key:'creative_name',attr:'gtm_promo_name'},
5407				{key:'promotion_id',attr:'gtm_promo_id'},
5408				{key:'promotion_name',attr:'gtm_promo_creative'},
5409				{key:'creative_slot',attr:'gtm_promo_position'}
5410			],
5411			"general": [
5412				{key:'name',attr:'gtm_promo_name'},
5413				{key:'id',attr:'gtm_promo_id'},
5414				{key:'creative',attr:'gtm_promo_creative'},
5415				{key:'position',attr:'gtm_promo_position'}
5416			]
5417		},
5418		"items": {
5419			"default": [
5420				{key:'item_name',input_key:'gtm_name'},
5421				{key:'item_id',input_key:'gtm_code'},
5422				{key:'price',input_key:'price'},
5423				{key:'item_category',input_key:'gtm_category'},
5424				{key:'quantity',input_key:'qty',type:'int'},
5425				{key:'total_product_value',input_key:'total_product_value'},
5426				{key:'item_brand',input_key:'gtm_brand'},
5427				{key:'item_variant',input_key:'gtm_variant'},
5428				{key:'item_category2',input_key:'gtm_variant', index: 0},
5429                {key:'item_category3',input_key:'gtm_variant', index: 1},
5430                {key:'item_category4',input_key:'gtm_variant', index: 2},
5431                {key:'stock_number',input_key:'gtm_stocknumber'},
5432                {key:'item_subcode',input_key:'gtm_productcode'},
5433                {key:'item_subname',input_key:'name'},
5434                {key:'season',input_key:'gtm_season'}
5435			],
5436			"general": [
5437				{key:'name',input_key:'gtm_name'},
5438				{key:'id',input_key:'gtm_code'},
5439				{key:'product_code',input_key:'gtm_productcode'},
5440				{key:'title_product_code',input_key:'gtm_ownercode'},
5441				{key:'price',input_key:'price'},
5442				{key:'category',input_key:'gtm_category'},
5443				{key:'quantity',input_key:'qty'},
5444				{key:'brand',input_key:'gtm_brand'},
5445				{key:'variant',input_key:'gtm_variant'}
5446			]
5447		}
5448	}
5449	var pull_object_keys = ["items"];
5450	var get_ecommerce_data = function(item_element, ecom_type, type) {
5451		var ecommerce_item = {};
5452
5453		$.each(mapping_obj[ecom_type][type], function(map_index,map_obj) {
5454			var value = undefined;
5455			if (pull_object_keys.includes(ecom_type)) {
5456                if (map_obj.input_key === 'gtm_variant' && typeof map_obj.index !== 'undefined') {
5457                    var variant_parts = (item_element[map_obj.input_key] || "").split('/');
5458                    value = variant_parts[map_obj.index] || "";
5459                } else {
5460                    value = item_element[map_obj.input_key];
5461                }
5462            } else {
5463                value = item_element.attr("data-" + map_obj.attr);
5464            }
5465
5466			if (typeof value !== 'undefined' && value !== "") {
5467				if ((typeof map_obj.type) !== 'undefined') {
5468					switch (map_obj.type) {
5469						case 'int':
5470							var temp_val = parseInt(value);
5471							if(!isNaN(temp_val))
5472								value = temp_val;
5473							else
5474								value = null;
5475							break;
5476					}
5477				}
5478
5479				if(value !== null)
5480					ecommerce_item[map_obj.key] = value;
5481			}
5482		});
5483
5484		// Calculate total_product_value
5485		if (ecom_type === 'items') {
5486			var price = ecommerce_item['price'] || 0;
5487			var quantity = ecommerce_item['quantity'] || 0;
5488			ecommerce_item['total_product_value'] = price * quantity;
5489		}
5490
5491		return ecommerce_item;
5492	}
5493
5494	if (typeof ecom_type === 'undefined')
5495		ecom_type = 'impression';
5496
5497	if (typeof type === 'undefined' || typeof mapping_obj[ecom_type][type] === 'undefined')
5498		type = 'default';
5499
5500	if (item_element) {
5501		if (Array.isArray(item_element)) {
5502			return_data = [];
5503			$.each(item_element, function(i,item){
5504				var temp = get_ecommerce_data(item, ecom_type, type);
5505				return_data.push(temp);
5506			});
5507		} else {
5508			return_data = get_ecommerce_data(item_element, ecom_type, type);
5509		}
5510	}
5511
5512	return return_data;
5513}
5514
5515//Function to generate the array of items on a page for Google Analytics Ecommerce
5516function fire_gtm_impressions(root) {
5517	var impression_elements = null;
5518	var gtm_list = null;
5519
5520	//leave root undefined to fire all impression items on page or provide jquery collection containing impression items if loading content dynamically.
5521	if (typeof root !== undefined)
5522		impression_elements = $('.gtm_impression');
5523	else
5524		impression_elements = root.find('.gtm_impression');
5525
5526	if ($('body').data('gtm_list') !== 'undefined')
5527		gtm_list = $('body').data('gtm_list');
5528
5529	if (impression_elements.length) {
5530		var impression_index = 0;
5531
5532		var impression_data = {
5533			'event': 'impression',
5534			'ecommerce': {
5535				'currencyCode': 'EUR',
5536				'impressions': []
5537			}
5538		};
5539
5540		var general_impression_data = {
5541			'event': 'general_impression',
5542			'impressions': []
5543		};
5544
5545		impression_elements.each(function(){
5546			impression_index++;
5547			var links;
5548			var ecommerce_item_object = generate_ecommerce_object($(this), 'impression');
5549			var general_item_object = generate_ecommerce_object($(this), 'impression', 'general');
5550
5551			ecommerce_item_object.position = impression_index;
5552			general_item_object.position = impression_index;
5553
5554			if(gtm_list !== null) {
5555				ecommerce_item_object.list = gtm_list;
5556				general_item_object.list = gtm_list;
5557			}
5558
5559			impression_data.ecommerce.impressions.push(ecommerce_item_object);
5560			general_impression_data.impressions.push(general_item_object);
5561
5562			if ($(this).is('a'))
5563				links = $(this);
5564			else
5565				links = $(this).find('a');
5566
5567			links.on("click", function() {
5568				var click_data = {
5569					'event': 'productClick',
5570					'ecommerce': {
5571						'click': {
5572							'actionField': {'list': ecommerce_item_object.list },
5573							'products': [ecommerce_item_object]
5574						}
5575					}
5576				};
5577
5578				var general_click_data = {
5579					'event': 'general_product_click',
5580					'products': [general_item_object]
5581				};
5582
5583				if (typeof dataLayer !== "undefined") {
5584					dataLayer.push({ecommerce: null});
5585					dataLayer.push(click_data, general_click_data);
5586				}
5587			});
5588		});
5589
5590		if (typeof dataLayer !== 'undefined') {
5591			dataLayer.push({ecommerce: null});
5592			dataLayer.push(impression_data, general_impression_data);
5593		}
5594	}
5595}
5596
5597function fire_gtm_promos(root) {
5598	var promos_element = null;
5599
5600	//leave root undefined to fire all impression items on page or provide jquery collection containing impression items if loading content dynamically.
5601	if (typeof root !== undefined)
5602		promos_element = $('.gtm_promo');
5603	else
5604		promos_element = root.find('.gtm_promo');
5605
5606	if(promos_element.length) {
5607		var promo_data = {
5608			'event': 'promoView',
5609			'ecommerce': {
5610				'promoView': {
5611					'promotions' : []
5612				}
5613			}
5614		};
5615		var general_promo_data = {
5616			'event': 'general_promo_view',
5617			'promotions': []
5618		};
5619
5620		promos_element.each(function() {
5621			var ecommerce_promo_object = generate_ecommerce_object($(this), 'promo');
5622			var general_promo_object = generate_ecommerce_object($(this), 'promo', 'general');
5623
5624			if (!general_promo_data.promotions.find(data => data.id === general_promo_object.id)) {
5625				promo_data.ecommerce.promoView.promotions.push(ecommerce_promo_object);
5626				general_promo_data.promotions.push(general_promo_object);
5627			}
5628
5629			$(this).on("click",function(){
5630				var click_data = {
5631					'event': 'select_promotion',
5632					'ecommerce': ecommerce_promo_object
5633				};
5634
5635
5636				if(typeof dataLayer !== "undefined")
5637				{
5638					dataLayer.push({ ecommerce: null });
5639					dataLayer.push(click_data);
5640				}
5641			});
5642		});
5643
5644		if(typeof dataLayer !== 'undefined')
5645		{
5646			dataLayer.push({ ecommerce: null });
5647			dataLayer.push(promo_data, general_promo_data);
5648		}
5649	}
5650}
5651
5652// Document Ready
5653$(function() {
5654
5655	// Sets current tab in menu canvas
5656	$('button[data-toggle="tab"]').on('shown.bs.tab', function (e) {
5657		localStorage.setItem('activeTab', $(e.target).attr('id'));
5658	});
5659
5660	//Send Google Analytics data to the dataLayer for Enhanced Ecommerce
5661	fire_gtm_impressions();
5662	fire_gtm_promos();
5663
5664	/* Language selector */
5665	$('.lang-select-js').on('change', langSelectChange);
5666	$('.lang-dropdown-js').find('a').on('click', langDropChange);
5667
5668	$(".msrp_info").on("click", function(e) {
5669		e.preventDefault();
5670		generateMSRPModal('MSRP Disclaimer');
5671	});
5672
5673	$('.js-percent-savings').each(function () {
5674		utilities.generatePercentSavingsText($(this));
5675	});
5676
5677	$('.js-list-price').each(function () {
5678		utilities.generateListPriceMarkup($(this));
5679	});
5680
5681	$('.js-list-price-with-savings').each(function () {
5682		utilities.initializeListPriceWithSavingsMarkup($(this));
5683	});
5684	
5685	//Discipline select on left menu
5686	$('#disciplineSelect').change(function(){
5687		var val = $(this).val();
5688		if (val === 'tennis') {
5689			window.location.href = 'https://www.tenniswarehouse-europe.com/'
5690		}  else if ( val === 'padel' ) {
5691			window.location.href = '/catpage.html?ccode=PADELTAB'
5692		}	else if ( val === 'pickleball' ) {
5693			window.location.href = '/catpage.html?ccode=PICKLEBA'
5694		} 
5695	})
5696
5697	/* Text Search */
5698	$('.search_paging').each(function(){
5699		var start = $(this).data('start');
5700		var perpage = $(this).data('perpage');
5701		var searchtext = $(this).data('searchtext');
5702		var total_results = $(this).data('size');
5703		var pageTotal = Math.ceil(total_results/perpage);
5704		var currentPage = Math.floor(start/perpage) + 1;
5705		var pageSelect = $('<select class="select_page custom-select"><\/select>');
5706
5707		var generateLinkToPage2 = function(num,text,classtext) {
5708
5709			var linktext,
5710				link = null,
5711				url = '',
5712				page_start = perpage * (num - 1);
5713
5714			url = "?sort=no&start="+page_start+"&count="+perpage+"&searchtext="+searchtext;
5715
5716			if(typeof(text) != "undefined") {
5717				linktext = text;
5718			} else {
5719				linktext = num;
5720			}
5721			if(num > 0)
5722			{
5723				if(num == currentPage)
5724				{
5725					link = $('<span class="current">' + linktext + '<\/span>');
5726				}
5727				else
5728				{
5729					link = $('<a href="'+url+'">' + linktext + '<\/a>');
5730				}
5731			}
5732			if(typeof(classtext) != "undefined") {
5733				link.addClass(classtext);
5734			}
5735			return link;
5736
5737		};
5738
5739		var generateLinkToPage = function(num,text) {
5740			var linktext,
5741			link = null,
5742			url = '',
5743			page_start = perpage * (num - 1);
5744
5745			url = "?sort=no&start="+page_start+"&count="+perpage+"&searchtext="+searchtext;
5746
5747			linktext = num;
5748
5749			if (num > 0) {
5750				if(num == currentPage)
5751				{
5752					link = $('<option value="'+num+'" selected>Page ' + linktext + ' of ' + pageTotal + '<\/option>');
5753				} else {
5754					link = $('<option value="'+num+'">Page ' + linktext + ' of ' + pageTotal + '<\/option>');
5755				}
5756			}
5757
5758			link.data('url', url);
5759
5760			return link;
5761		};
5762
5763		pageSelect.on("change", function(){
5764			window.location = $(this).find('option:selected').data('url');
5765		});
5766
5767		if(pageTotal > 1)
5768		{
5769			var answer = $('<div class="searchpagenav">');
5770			$(this).find('.page-select-container').append(pageSelect);
5771
5772			for (var i=1; i <= pageTotal; i++) {
5773				pageSelect.append(generateLinkToPage(i));
5774			}
5775		}
5776	});
5777
5778	if ($(".required_form").length) {
5779		utilities.requiredForm($(".required_form"));
5780	}
5781
5782	/* Tracking */
5783	$(".ga_event").on("click",function(){
5784		var gtm_promo_name = $(this).data("gtm_promo_name");
5785		var gtm_promo_id = $(this).data("gtm_promo_id");
5786		var gtm_promo_creative = $(this).data("gtm_promo_creative");
5787		var gtm_promo_position = $(this).data("gtm_promo_position");
5788		if(gtm_promo_name !== undefined && gtm_promo_id !== undefined && gtm_promo_creative !== undefined){
5789			if(gtm_promo_position !== undefined){
5790				utilities.reportEventTracking(gtm_promo_name,gtm_promo_id,gtm_promo_creative,gtm_promo_position);
5791			} else {
5792				utilities.reportEventTracking(gtm_promo_name,gtm_promo_id,gtm_promo_creative);
5793			}
5794		}
5795	});
5796
5797	$(".image-rotator").imgRotator();
5798
5799	if($('#skip-link').length) {
5800		skipLink('#skip-link', '#main_content');
5801	}
5802	if($('#skip-footer').length) {
5803		skipLink('#skip-footer', '#footer_content');
5804	}
5805	if($('#footer-link').length) {
5806		skipLink('#footer-link', '#footer_content');
5807	}
5808
5809	if($('#toggle-view').length) {
5810		toggleTaglines();
5811	}
5812
5813	if ($('.back-to-top').length) {
5814		var backOffset = 220;
5815		var backDuration = 500;
5816		$(document).on("scroll", function(){
5817			if (($(this).scrollTop() > backOffset) && (!$('.back-to-top').hasClass("active"))) {
5818				$('.back-to-top').addClass("active").stop().animate({bottom:"160px"},400);
5819			} else if (($(this).scrollTop() <= backOffset) && ($('.back-to-top').hasClass("active"))) {
5820				$('.back-to-top').removeClass("active").stop().animate({bottom:"-60px"},400);
5821			}
5822		});
5823
5824		$('.back-to-top').on('click', function(e) {
5825			var target = $(this.hash);
5826
5827			if (target.length) {
5828				e.preventDefault();
5829				$('html, body').animate({
5830					scrollTop: target.offset().top - 199
5831				}, 800, function() {
5832					target[0].focus({ preventScroll: true });
5833				});
5834			}
5835		});
5836	}
5837
5838	/* Expands "Other Sites" accordion automatically on mobile */
5839	$(function () {
5840		$('.footer__other-companies-mobile-list').on('shown.bs.collapse', function (e) {
5841			var offset = $('.footer__other-companies-mobile-container').offset();
5842			if(offset) {
5843				$('html,body').animate({
5844					scrollTop: $('.footer__other-companies-mobile-container').offset().top -20
5845				}, 500);
5846			}
5847		});
5848	});
5849
5850	// Brands Page
5851	var alpha_list = alphaListModule();
5852	alpha_list.setContainer($(".brands-page__sorted-list"));
5853	// End Brands Page
5854
5855	/* lazy loading images config */
5856	$('.lz-img').show().lazy({
5857		scrollDirection: 'vertical',
5858		effect: 'fadeIn',
5859		effectTime: '2000',
5860		visibleOnly: true,
5861		threshold: 600
5862	});
5863
5864	var handleOffCanvasToggleClick = function (e) {
5865		e.preventDefault();
5866		var canvasBtn = $(this);
5867		var canvasTarget = $(this).data("target");
5868
5869		if ($(canvasTarget).hasClass("open")) {
5870			closeCanvas();
5871			if ($(this).parents('.offcanvas-collapse').length) {
5872				var canvasId = $(this).parents('.offcanvas-collapse').attr("id");
5873				$('.canvas_return-js[data-target="#'+canvasId+'"]').focus();
5874			}
5875		} else {
5876			openCanvas(canvasBtn);
5877			if ($(this).hasClass('l-header-menu_btn')) {
5878				$(window).on("resize", resizeCheck);
5879			}
5880		}
5881	};
5882
5883	$('[data-toggle="offcanvas"]').not('.react-toggle-offcanvas').on('click',handleOffCanvasToggleClick);
5884	$('body').on('click', '.react-toggle-offcanvas[data-toggle="offcanvas"]',handleOffCanvasToggleClick);
5885
5886	/* Menu Panel */
5887	if ($(".offcanvas-menu").length) {
5888		$(".offcanvas-menu").each(function() {
5889			var menuPanel = $(this),
5890				menuWrap = menuPanel.find('.offcanvas-menu-wrap'),
5891				subMenuLinks = menuPanel.find('.nav-link.has-sub'),
5892				innerMenuWrap = menuPanel.find(".offcanvas-menu-inner"),
5893				subPanels = $([]);
5894
5895			subMenuLinks.each(function() {
5896				var link = $(this),
5897					subpanel = link.siblings(".offcanvas-menu-hidden"),
5898					parent = link.closest(".offcanvas-menu-hidden, .offcanvas-menu-wrap"),
5899					back = subpanel.find('.go-back').eq(0); //relying on depth first preorder traversal
5900
5901				link.on("click", function(e) {
5902					e.preventDefault();
5903					subPanels.not(subpanel.addClass("is-shown")).removeClass('is-shown');
5904					
5905					//Trap Focus - Hidden Panel Class
5906					$('.js-focusable').removeClass('js-focusable');
5907					
5908					setTimeout(function(){
5909						menuWrap.addClass('is-hidden')
5910						
5911						// Trap Focus
5912						subpanel.addClass('js-focusable').removeAttr('inert');
5913						trapFocusHiddenPanel($('#menuPanel'))
5914					}, 300);
5915				});
5916
5917				back.on("click", function(e) {
5918					e.preventDefault();
5919					subpanel.removeClass("is-shown");
5920					
5921					// Trap Focus
5922					subpanel.removeClass("js-focusable").attr("inert, ''");
5923					
5924					if(parent.is(menuWrap)) {
5925						parent.removeClass('is-hidden');
5926						trapFocusMenu($('#menuPanel'))
5927					} else {
5928						parent.addClass('is-shown').addClass('js-focusable').removeAttr('inert');
5929						trapFocusHiddenPanel($('#menuPanel'))
5930					}
5931				});
5932				menuPanel.append(subpanel);
5933				subPanels.add(subpanel);
5934			});
5935		});
5936	}
5937
5938	$("#menuPanel a:not('.has-sub, .go-back')").on("click", function(e) {
5939		closeCanvas();
5940	});
5941
5942	$(window).on("pageshow", function(event) {
5943		if (event.originalEvent.persisted) {
5944			window.location.reload()
5945		}
5946	});
5947	/* End Menu Panel */
5948
5949	/* Start Brand Menu Panel */
5950	if($("#allbrands-menu").length)
5951	{
5952		var brandlist = $("#allbrands-menu li a").get();
5953		var letter;
5954		var charcode;
5955		var resultstring = "";
5956		var letterarray = new Array();
5957		var letterlength;
5958		var total;
5959		var column1; var column2; var column3;
5960
5961		for(letter = 65; letter < 91; letter++)
5962		{
5963			for(i = 0; i < brandlist.length;i++)
5964			{
5965				charcode = brandlist[i].innerHTML.charCodeAt(0);
5966				if(charcode == letter | charcode == letter + 32)
5967				{
5968					letterarray.push([brandlist[i],brandlist[i].innerHTML]);
5969					brandlist.splice(i,1);
5970					i--;
5971				}
5972			}
5973
5974			letterlength = letterarray.length;
5975			total = letterarray.length;
5976			column1 = Math.ceil(total/4); total -= column1;
5977			column2 = Math.ceil(total/*/3*/); total -= column2;
5978			column3 = Math.ceil(total/*/2*/); total -= column3;
5979			column2 += column1; column3 += column2; column1+= column3;
5980			resultstring += "<div id=\"Brand"+ String.fromCharCode(letter) +"\" class=\"brandtable\" data-role=\"collapsible\"><div class=\"sticky-top menu-subheader sub-section nav-item offcanvas-menu-list-heading is-sub\">"+ String.fromCharCode(letter) +"<\/div><ul class=\"navbar-nav offcanvas-menu-list\" data-role=\"listview\" data-inset=\"false\">";
5981
5982			for(i = 0; i < letterlength; i++)
5983			{
5984				resultstring += "<li class=\"nav-item\"><a class=\"nav-link\" href=\"" + letterarray[i][0] + "\">" + letterarray[i][1] + "<\/a><\/li>";
5985				if(i == column1 | i == column2 | i == column3 )
5986				{
5987					resultstring += "<\/ul><ul class=\"navbar-nav offcanvas-menu-list\" data-role=\"listview\" data-inset=\"false\">";
5988				}
5989			}
5990			resultstring += "<\/ul><\/div>";
5991			letterarray.length = 0;
5992		}
5993		letterlength = brandlist.length;
5994		total = brandlist.length;
5995		column1 = Math.ceil(total/4); total -= column1;
5996		column2 = Math.ceil(total/*/3*/); total -= column2;
5997		column3 = Math.ceil(total/*/2*/); total -= column3;
5998		column2 += column1; column3 += column2; column1+= column3;
5999		resultstring += "<div id=\"Brandnum\" class=\"brandtable\" data-role=\"collapsible\"><div class=\"sticky-top menu-subheader sub-section nav-item offcanvas-menu-list-heading is-sub\">#<\/div><ul class=\"navbar-nav offcanvas-menu-list\" data-role=\"listview\" data-inset=\"false\">";
6000		for(i = 0; i < brandlist.length;i++)
6001		{
6002			resultstring += "<li class=\"nav-item\"><a class=\"nav-link\" href=\"" + brandlist[i] + "\">" + brandlist[i].innerHTML + "<\/a><\/li>";
6003			if(i == column1 | i == column2 | i == column3 )
6004			{
6005				resultstring += "<\/ul><ul class=\"navbar-nav offcanvas-menu-list\" data-role=\"listview\" data-inset=\"false\">";
6006			}
6007		}
6008		resultstring += "<\/ul><\/div>";
6009
6010		$("#allbrands-menu").remove();
6011		$("#sortedbrands-menu").html(resultstring);
6012		/*$("#sortedbrands-menu div.brandtable, #sortedbrands-menu p").hide();
6013		$("#BrandA").show();*/
6014	}
6015	$("#sortedbrands-menu #brandalpha a").not(".viewallbrandslink").click(function(e){
6016		e.preventDefault();
6017		$("#sortedbrands-menu div.brandtable").hide();
6018		$($(this).attr('href').substr($(this).attr('href').indexOf('#'))).show().trigger('expand');
6019	});
6020
6021
6022	$("#sortedbrands-menu #brandalpha a.viewallbrandslink").click(function(e){
6023		e.preventDefault();
6024		$("#sortedbrands-menu div.brandtable").show().trigger('collapse');
6025	});
6026	/* End Brand Menu Panel */
6027
6028	/* Left Menu */
6029	if ($('.left-menu__expand').length) {
6030		$('.left-menu__expand').each(function() {
6031			var collapseBtn = $(this);
6032			var collapseContainer = collapseBtn.siblings('.collapse');
6033			collapseContainer.on("hide.bs.collapse", function(e) {
6034				e.stopPropagation();
6035				collapseBtn.attr("aria-expanded", false);
6036				collapseBtn.removeClass("is-expanded");
6037				collapseBtn.find(".icon").removeClass("icon-minus").addClass("icon-plus");
6038			});
6039			collapseContainer.on("show.bs.collapse", function(e) {
6040				e.stopPropagation();
6041				collapseBtn.attr("aria-expanded", true);
6042				collapseBtn.addClass("is-expanded");
6043				collapseBtn.find(".icon").removeClass("icon-plus").addClass("icon-minus");
6044			});
6045			collapseBtn.on("click", function() {
6046				collapseContainer.collapse('toggle');
6047			});
6048		});
6049	}
6050	/* End Left Menu */
6051
6052	/* Cat page categories dropdown */
6053	if ($('.catnav-dropdown').length) {
6054
6055		var jumpValues = $('.catjump').map(function() {
6056			return {name: $(this).data('name'), id: $(this).attr('id'), position: $(this).offset().top};
6057		}).get();
6058		var select_text = { en : "Categories", de : "Kategorien", es : "Categor&iacute;as", fr : "Cat&eacute;gories", it : "Categorie" };
6059		var currentlang = utilities.pageLang().getLang();
6060
6061		$('body').scrollspy({
6062		   offset: 0
6063		});
6064
6065		$(window).on('activate.bs.scrollspy', function (e, i) {
6066			if (i !== undefined) {
6067				var scrollTarget = i.relatedTarget;
6068				var scrollLink = $('.category-navigation [href="'+scrollTarget+'"]');
6069				var scrollText = scrollLink.eq(0).text();
6070
6071				$('#dropDownCategories').html(scrollText);
6072			}
6073		});
6074
6075		$(window).on('scroll', function() {
6076			if (typeof jumpValues[0] !== 'undefined') {
6077				if ($(window).scrollTop() < jumpValues[0].position) {
6078					$("#dropDownCategories").html(select_text[currentlang]);
6079				}
6080			}
6081		});
6082
6083		$('.catjumplink[href*="#"]').on('click', function(e){
6084			var target = $(this.hash);
6085			target = target.length ? target : $('[name='+this.hash.slice(1)+']');
6086
6087			if (target.length) {
6088				e.preventDefault();
6089				$('html, body').animate({
6090					scrollTop: target.offset().top - 90
6091				}, 500);
6092				focusOnElement(target);
6093			}
6094		});
6095
6096	}
6097	/* END Cat page categories dropdown */
6098
6099	$('.js-catsort-link').on('click', function(e){
6100		e.preventDefault();
6101		var form = $(this).closest('.js-catsort-form');
6102		if(form.length)
6103		{
6104			var sort_val = $(this).attr('data-sort');
6105			var sort_input = form.find('.js-catsort-input');
6106			sort_input.val(sort_val);
6107			form.trigger('submit');
6108		}
6109	});
6110
6111	$('.filter_container').each(function(){
6112        $(this).on('filter:resultsLoad',function(e){
6113            $(e.detail.page).find('.video_popup').on("click", function(e) {
6114                e.preventDefault();
6115                generateVideoModal($(this));
6116            });
6117        }).on('filter:searchFormSubmit',function(e){
6118            closeCanvas();
6119        });
6120        filterizer(this);
6121    });
6122
6123	/* Lazy load videos */
6124	if ($(".lazyframe").length) {
6125		let elements = $(".lazyframe");
6126		lazyframe(elements);
6127	}
6128
6129	/* Descpage */
6130	if ($(".desc_top").length) {
6131		$(".desc_top").each(utilities.initDescPageTop());
6132	}
6133
6134	if ($('.video_popup').length) {
6135		$('.video_popup').on("click", function(e) {
6136			e.preventDefault();
6137			utilities.reportEventTracking('Video', 'Product Video', $('#video').data('popurl'));
6138			generateVideoModal($(this));
6139		});
6140	}
6141
6142	if ($('.prodinfo_pop').length) {
6143		$('.prodinfo_pop').on("click", function(e) {
6144			e.preventDefault();
6145			generateProdinfoModal($(this));
6146		});
6147	}
6148
6149	$(".scroll_to_show").each(function() {
6150		var hiddenElement = $(this),
6151			distance = hiddenElement.offset().top,
6152			$window = $(window);
6153
6154		var showHideFunc = function() {
6155			if ($window.scrollTop() >= distance) {
6156				if (hiddenElement.hasClass("is-invisible")) {
6157					hiddenElement.removeClass('is-invisible');
6158				}
6159			} else {
6160				if (!hiddenElement.hasClass("is-invisible")) {
6161					hiddenElement.addClass('is-invisible');
6162				}
6163			}
6164		}
6165
6166		var showHideThrottle = utilities.throttle(showHideFunc, 50);
6167
6168		if (hiddenElement.parents('.sticky-top').length) {
6169			distance = hiddenElement.parents('.sticky-top').parent().offset().top;
6170		}
6171
6172		if ($window.scrollTop() < distance) {
6173			hiddenElement.addClass('is-invisible');
6174		}
6175
6176		$window.on("scroll", showHideThrottle);
6177	});
6178
6179	$(".filter_toggle").each(function() {
6180
6181		var hiddenElement = $(this),
6182			distance = hiddenElement.offset().top,
6183			$window = $(window);
6184
6185		var showHideFunc = function() {
6186
6187			if ($(window).width() < 576) {
6188
6189				if ($window.scrollTop()-70 >= distance) {
6190					if (hiddenElement.css('display') == 'none') {
6191						hiddenElement.css("display", "flex");
6192					}
6193				} else {
6194					if (hiddenElement.css('display') == 'flex') {
6195						hiddenElement.css("display", "none");
6196					}
6197				}
6198
6199			} else {
6200
6201				hiddenElement.css("display", "flex");
6202
6203			}
6204		}
6205
6206		var showHideThrottle = utilities.throttle(showHideFunc, 50);
6207
6208		if (hiddenElement.parents('.sticky-top').length) {
6209			distance = hiddenElement.parents('.sticky-top').parent().offset().top;
6210		}
6211
6212		if (hiddenElement.parents('.catnav-flex-upper').length) {
6213
6214			/*
6215			if ($window.scrollTop()-70 < distance) {
6216				if ($(window).width() < 576) {
6217					hiddenElement.css("display", "none");
6218				}
6219			}
6220
6221			$window.on("scroll", showHideThrottle);
6222			$window.on("resize", showHideThrottle);
6223			*/
6224
6225		}
6226	});
6227
6228	if ($(".inpage_nav-dropdown").length) {
6229		$(window).on('activate.bs.scrollspy', function (e, i) {
6230			if (i !== undefined) {
6231				var scrollTarget = i.relatedTarget;
6232				var scrollLink = $('.inpage_nav-dropdown [href="'+scrollTarget+'"]');
6233				var scrollText = scrollLink.eq(0).text();
6234
6235				$("#inpage_nav-menu span").text(scrollText);
6236			}
6237		});
6238	}
6239
6240	if ($(".custreview_form").length) {
6241		$(".custreview_form").on("submit", function(e) {
6242			return generateReviewModal($(this));
6243		});
6244	}
6245
6246	readMore($(".product-info__read-more"), 693);
6247
6248	// React Ordering Module Initialization
6249	let options = {
6250		targetNode: $('.js-ordering-module:not(.used_ordering-replace)'),
6251		submitButtonText: 'Add To Cart',
6252		allowColorPreselectFromQuery: true
6253	};
6254	orderingModuleSetUp(options);
6255	
6256	$('.js-customization-module').each(function(){
6257    	const objects = {
6258			styleOrdering: null,
6259			orderingArea: null,
6260			orderQty: null,
6261			submitButton: null
6262		}
6263		objects.moduleContainer = $(this);
6264		objects.styleOrdering = $(this.closest('.style_ordering')).find('.style_ordering-area');
6265		objects.errorsContainer = objects.styleOrdering.find(".js-ordering-errors-container")
6266		objects.orderingArea = objects.styleOrdering.find('.ordering_area');
6267		objects.orderQty = objects.styleOrdering.find(".ordering_qty");
6268		objects.submitButton = objects.styleOrdering.find('.style_ordering-add_cart');
6269		objects.wishButton = objects.styleOrdering.find('.wishlist_poplink');
6270		
6271		var submitButtonText = objects.submitButton?.text() ? objects.submitButton.text() : "Add To Cart";
6272		var isDisabled = false;
6273
6274		function disableOrdering() {
6275			objects.orderingArea.attr('data-customization-disable-submit', 'true');
6276			if (objects.submitButton != null) {
6277				objects.submitButton.addClass("disabled");
6278			}
6279			if (objects.wishButton != null) {
6280				objects.wishButton.addClass("disabled");
6281			}
6282			isDisabled = true;
6283		}
6284
6285		function enableOrdering() {
6286			objects.orderingArea.attr('data-customization-disable-submit', 'false');
6287			objects.errorsContainer.attr('data-js-customization-errors', JSON.stringify([]));
6288			if (objects.orderingArea.attr('data-ordering-disable-submit') !== 'true') {
6289				if (objects.submitButton != null) {
6290					objects.submitButton.removeClass("disabled");
6291				}
6292				if (objects.wishButton != null) {
6293					objects.wishButton.removeClass("disabled");
6294				}
6295				isDisabled = false;
6296			}
6297		}
6298		function updateErrorDisplay() {
6299			var customizationErrors = JSON.parse(objects.errorsContainer.attr('data-js-customization-errors') || '[]');
6300			var orderingErrors = JSON.parse(objects.errorsContainer.attr('data-js-ordering-errors') || '[]')
6301			if ((customizationErrors.length || orderingErrors.length) && (objects.errorsContainer?.children().length)) {
6302				var alertDanger = $('<div class="alert alert-danger order-error-js style_ordering-error-list-wrap" tabindex="-1"></div>');
6303
6304				var errorList = $('<ol class="style_ordering-error-list"/>');
6305				orderingErrors.forEach(error => {
6306					errorList.append($('<li><a href="#'+error.elementDataId+'" class="style_ordering-error-link">'+error.message+'</a></li>'))
6307				})
6308				customizationErrors.forEach(error => {
6309					errorList.append($('<li><a href="#'+error.elementDataId+'" class="style_ordering-error-link">'+error.message+'</a></li>'))
6310				})
6311				
6312				const pleasFixErrorsText = {
6313					en: "Please fix the following errors:",
6314					fr: "Veuillez corriger les erreurs suivantes :",
6315					de: "Bitte beheben Sie die folgenden Fehler:",
6316					es: "Por favor, corrija los siguientes errores:",
6317					it: "Si prega di correggere i seguenti errori:"
6318				};
6319
6320				alertDanger.append($('<p class="style_ordering-error-instruction">'+pleasFixErrorsText[utilities.pageLang().getLang()]+'</p>')).append(errorList);
6321
6322				alertDanger.find('a').each(function(index, anchorTag) {
6323					$(anchorTag).on("click", function (e) {
6324						e.preventDefault();
6325						let dataId = $(this).attr('href').slice(1); // remove '#' from start of href to get data-id
6326						let referencedElement = $('[data-id="'+dataId+'"]');
6327						let scrollToElement = referencedElement;
6328						if (referencedElement.hasClass('js-input-container')) {
6329							scrollToElement = referencedElement.find('input[type=radio]')
6330						}
6331						var scrollBehavior = window.matchMedia('(prefers-reduced-motion: no-preference)').matches ? 'smooth' : 'instant';
6332						scrollToElement[0].scrollIntoView({block: 'center', behavior: scrollBehavior, container: 'nearest'})
6333						scrollToElement[0].focus()
6334					})
6335				})
6336				objects.errorsContainer.html(alertDanger);
6337			} else {
6338				objects.errorsContainer.html('')
6339			}
6340
6341		}
6342
6343		function parseValue(value) {
6344			const trimmedValue = value?.trim();
6345			if (trimmedValue === "true") {
6346				return true;
6347			} else if (trimmedValue === "false") {
6348				return false;
6349			} else if (trimmedValue === "null") {
6350				return null;
6351			} else if (trimmedValue === undefined) {
6352				return "";
6353			} else {
6354				return trimmedValue;
6355			}
6356		}
6357
6358		function elementToObject(element, classPrefix) {
6359			const elementParsableChildren = element.querySelectorAll(":scope > [class^='"+classPrefix+"']");
6360
6361			// if <ul>, return a list of its children
6362			if (element.tagName === "UL") {
6363				const arr = [];
6364				for (const child of elementParsableChildren) {
6365					arr.push(elementToObject(child, classPrefix));
6366				}
6367				return arr;
6368			}
6369
6370
6371
6372			// if the element has no data attributes or children, return its innerText as its value
6373			if (Object.keys(element.dataset).length === 0 && elementParsableChildren.length === 0) {
6374				return 	parseValue(element.innerText);
6375			}
6376
6377			// else: element has data attributes or chilren so its should be a js object
6378			const obj = {};
6379			Object.entries(element.dataset).forEach(([key, value]) => {
6380				obj[key] = parseValue(value);
6381			});
6382			for (const child of elementParsableChildren) {
6383				obj[child.className.slice(classPrefix.length)] = elementToObject(child, classPrefix);
6384			}
6385			return obj;
6386		}
6387
6388		$(this).on("customization:orderabilityUpdate", function(e) {
6389			if (e.detail.disableOrdering) {
6390				objects.orderingArea.removeAttr('data-js-customization-price');
6391				if (e.detail.errors?.length) {
6392					objects.errorsContainer.attr('data-js-customization-errors', JSON.stringify(e.detail.errors))
6393				}
6394				disableOrdering();
6395			} else {
6396				objects.orderingArea.attr('data-js-customization-price', e.detail.price);
6397				enableOrdering();
6398			}
6399			updateErrorDisplay();
6400
6401			if (isDisabled) {
6402				objects.submitButton.text(submitButtonText);
6403			} else {
6404				const customizationPrice = Number(e.detail.price);
6405				const itemPrice = Number(objects.orderingArea.attr('data-js-ordering-price'))
6406				const itemQty = Number(objects.orderQty.val());
6407				if (!isNaN(customizationPrice) && !isNaN(itemPrice) && !isNaN(itemQty)) {
6408					const itemTotal = (itemQty * (itemPrice + customizationPrice));
6409					const submitButtonTextWithPrice = submitButtonText + (itemTotal ? ' - ' + itemTotal.toFixed(2).replace('.', ',') + '&euro;' : '');
6410					objects.submitButton.html(submitButtonTextWithPrice);
6411				} else {
6412					objects.submitButton.text(submitButtonText);
6413				}
6414			}
6415		})
6416
6417		$(this).on("customization:selectSubproduct", function(e) {
6418			e.preventDefault();
6419			var disableButtonPrice = true;
6420
6421			QuickOrderPanel.initPanel();
6422			var panel_header = QuickOrderPanel.getHeader();
6423			var orderingReturn = $('<button type="button" class="dynamic_order-back" title="Back to Order"><i class="icon icon-arrow-left is-lg">Back to Order</i></button>');
6424			orderingReturn.on('click', function(e) {
6425				QuickOrderPanel.close();
6426			});
6427			panel_header.html('');
6428			panel_header.append(orderingReturn).append('<h3>Selections</h3>');
6429			QuickOrderPanel.open();
6430
6431			var serial = '?pcode='+ e.detail.pcode + '&customization_page=true';
6432			var ignoreDynamic = ($(this).hasClass('ignore-dynamic') ? true : false);
6433			$.ajax({
6434				timeout: 8000,
6435				type: "GET",
6436				url: "/ajax/quickview.html" + serial,
6437				dataType: "html",
6438				success: function(data) {
6439					var jqdata = $(data);
6440					var panel_content = QuickOrderPanel.getContent();
6441					panel_content.html(jqdata);
6442
6443					var panelOrderForm = panel_content.find(".style_ordering-form");
6444
6445					panelOrderForm.on("submit", function(e) {
6446						e.preventDefault();
6447						const subproductInfo = panelOrderForm.find('.js-customization-subproduct_selection_info');
6448						const subproductInfoArray = elementToObject(subproductInfo[0], 'js-customization-');
6449						const selectedSubproduct = panelOrderForm.find('.order_input').val();
6450						const selectedSubproductInfo = subproductInfoArray.find(info => info.pcode === selectedSubproduct);
6451						objects.moduleContainer[0].dispatchEvent(
6452							new CustomEvent('customization:subproductSelected', { detail: selectedSubproductInfo })
6453						);
6454						QuickOrderPanel.close();
6455
6456
6457					})
6458					let options = {
6459						targetNode: panel_content.find(".js-ordering-module"),
6460						submitButtonText: 'Add To Build'
6461					};
6462					orderingModuleSetUp(options);
6463
6464					setTimeout(function() {
6465						panel_content.addClass('is-shown')
6466						setTimeout(function() {orderingReturn.focus()}, 300);
6467					}, 50);
6468
6469				},
6470
6471				error: function() {
6472					//failed to load product
6473				}
6474			});
6475
6476		})
6477		
6478		const customizationTable = $(this.closest(':has(.js-customization-info)').querySelector('.js-customization-info'))
6479		const demo = !!customizationTable.data("demo");
6480		const stringInfo = customizationTable.find('.strings');
6481		const stringProducts = stringInfo.find('.products')
6482		const stringPackages = stringInfo.find('.packages')
6483		const overGripProducts = customizationTable.find('.over_grips .products');
6484		const flagLabelsData = customizationTable.find('.flag_labels')
6485		const flagLabels = elementToObject(flagLabelsData[0], 'js-customization-');
6486		const stringServiceProdData = customizationTable.find('.js-customization-string_service_prod');
6487		const stringServiceProd = elementToObject(stringServiceProdData[0], 'js-customization-');
6488		const gripServiceProdData = customizationTable.find('.js-customization-grip_service_prod');
6489		const gripServiceProd = elementToObject(gripServiceProdData[0], 'js-customization-');
6490		const tapeServiceProdData = customizationTable.find('.js-customization-tape_service_prod');
6491		const tapeServiceProd = elementToObject(tapeServiceProdData[0], 'js-customization-');
6492		const logoServiceProdData = customizationTable.find('.js-customization-logo_service_prod');
6493		const logoServiceProd = elementToObject(logoServiceProdData[0], 'js-customization-');
6494		
6495		//const protectionTapeProducts = customizationTable.find('.protection_tape .products');
6496		const optionsInfo = customizationTable.find('.options');
6497		
6498		const lang = utilities.pageLang().getLang();
6499		//need to decode html entities since these strings are getting passed to react and must be in UTF-8, can't store decoded characters in strings bc the js file is in mac os roman and won't work when passed to react
6500		const getTranslation = (textObj) => $('<div>').html(textObj[lang]).text();
6501		
6502		const serviceFeeText = {
6503			"en": "Service Fee",
6504			"fr": "Frais de pose",
6505			"de": "Servicegeb&uuml;hr",
6506			"es": "Precio",
6507			"it": "Costo del servizio"
6508		}
6509		
6510		stringServiceProd.label = getTranslation(serviceFeeText);
6511		gripServiceProd.label = getTranslation(serviceFeeText);
6512		tapeServiceProd.label = getTranslation(serviceFeeText);
6513		logoServiceProd.label = getTranslation(serviceFeeText);
6514		
6515		const recommendationText = {
6516		  "en": "Recommendation:",
6517		  "fr": "Recommandation :",
6518		  "de": "Empfehlung:",
6519		  "es": "Recomendaci&oacute;n:",
6520		  "it": "Consiglio:"
6521		}
6522		
6523		const stringRecommendedTension = stringInfo.find('.recommended_tension').text();
6524		let stringTensionInfo = { value: "", subtext: stringRecommendedTension, min: "", max: ""};
6525		const stringTensionMatch = stringRecommendedTension.match(/[^\d]*(\d{2})?[^\d]*(\d{2})?[^\d]*(\d{2})/)
6526		if (stringTensionMatch) {
6527			stringTensionInfo.value = stringTensionMatch[3];
6528			stringTensionInfo.subtext = getTranslation(recommendationText) + " " + stringTensionMatch[3] + "kg";
6529			
6530			
6531			if (stringTensionMatch[1] && stringTensionMatch[2]) {
6532				stringTensionInfo.min = stringTensionMatch[1];
6533				stringTensionInfo.max = stringTensionMatch[2];
6534			}
6535		} 
6536		let stringArray = elementToObject(stringProducts[0], 'js-customization-');
6537				
6538		let stringSeachProductType;
6539		let stringHybridProductType;
6540		let packageArray = elementToObject(stringPackages[0], 'js-customization-');
6541		
6542		stringSeachProductType = stringArray.find(stringType => stringType.id === "TWEALLSTR")
6543		stringHybridProductType = stringArray.find(stringType => stringType.id === "STRING1")
6544		stringHybridProductType.header = "";
6545		stringArray = stringArray.filter(stringType => stringType.id !== "STRING1" && stringType.id !== "TWEALLSTR")
6546		
6547		const stringArrayIds = stringArray.map(type => type.id);
6548		
6549		const overGripArray = elementToObject(overGripProducts[0], 'js-customization-');
6550		const overGripArrayIds = overGripArray.map(type => type.id);
6551		
6552		const customHybridText = {
6553		  "en": "Custom Hybrid",
6554		  "de": "Individuelle Hybridbesaitung",
6555		  "fr": "Deux demi-sets de cordage (hybride)",
6556		  "es": "H&iacute;brido personalizado",
6557		  "it": "Ibrido personalizzato"
6558		};
6559
6560		const searchAllStringText = {
6561		  "en": "Search All String",
6562		  "de": "Alle Saiten durchsuchen",
6563		  "fr": "Rechercher toutes les cha&icirc;nes",
6564		  "es": "Buscar todas las cadenas",
6565		  "it": "Cerca tutte le stringhe"
6566		};
6567
6568		const stringTensionText = {
6569		  "en": "String Tension",
6570		  "de": "Saitenspannung",
6571		  "fr": "Tension du cordage",
6572		  "es": "Tensi&oacute;n del cordaje",
6573		  "it": "Tensione delle corde"
6574		};
6575
6576		const fullSetText = {
6577		  "en": "Full Set",
6578		  "de": "Komplettset",
6579		  "fr": "Set de cordage complet",
6580		  "es": "Set completo",
6581		  "it": "Set completo"
6582		};
6583
6584		const packagesText = {
6585		  "en": "Packages",
6586		  "de": "Pakete",
6587		  "fr": "Ensembles",
6588		  "es": "Paquetes",
6589		  "it": "Pacchetti"
6590		};
6591
6592		const selectSetText = {
6593		  "en": "Select Set",
6594		  "de": "Set ausw&auml;hlen",
6595		  "fr": "CHOISISSEZ VOTRE CORDAGE",
6596		  "es": "SELECCIONA TU SET",
6597		  "it": "SELEZIONA IL SET"
6598		};
6599
6600		const selectPackageText = {
6601		  "en": "Select A String Package",
6602		  "de": "W&auml;hle ein Saitenpaket aus",
6603		  "fr": "Choisissez votre formule cordage",
6604		  "es": "Elige un cordaje",
6605		  "it": "Seleziona una confezione di corde"
6606		};
6607
6608		const packageSelectText = {
6609		  "en": "Not sure what you need? Select one of our recommended string sets.",
6610		  "de": "Du bist dir nicht sicher, was du brauchst? W&auml;hle eines unserer empfohlenen Besaitungs-Sets aus.",
6611		  "fr": "Vous n'&ecirc;tes pas s&ucirc;r de ce dont vous avez besoin? Choisissez l'un nos cordages recommand&eacute;s.",
6612		  "es": "&iquest;No est&aacute;s seguro/a de qu&eacute; necesitas? Elige uno de nuestros sets de cordaje recomendados.",
6613		  "it": "Non sai quale scegliere? Seleziona uno dei nostri set di corde consigliati."
6614		};
6615
6616		const defaultStringText = {
6617		  "en": "Default String",
6618		  "de": "Standardbesaitung",
6619		  "fr": "Cordage d'origine",
6620		  "es": "Cordaje por defecto",
6621		  "it": "Corde consigliate"
6622		};
6623		const singleSetText = {
6624		  "en": "Select a single set of strings",
6625		  "de": "W&auml;hle ein einzelnes Besaitungs-Set aus",
6626		  "fr": "Choisissez un set de cordage complet",
6627		  "es": "Elige un set individual",
6628		  "it": "Seleziona un set completo di corde"
6629		};
6630
6631		const mainsAndCrossesText = {
6632		  "en": "Select mains and crosses. Offers more balance, power, spin or control.",
6633		  "de": "W&auml;hle die L&auml;ngs- und Quersaiten aus. F&uuml;r mehr Balance, Power, Spin oder Kontrolle.",
6634		  "fr": "Choisissez le cordage pour les montants puis celui pour les travers. Vous procure davantage d'&eacute;quilibre, de puissance, d'effets ou de contr&ocirc;le.",
6635		  "es": "Elige las cuerdas verticales y las horizontales para un mayor equilibrio, potencia, efectos o control.",
6636		  "it": "Seleziona le corde verticali e orizzontali. Il set ibrido offre un migliore equilibrio tra potenza, controllo, spin e comfort."
6637		};
6638
6639		const selectMainsText = {
6640		  "en": "Select Mains",
6641		  "de": "L&Auml;NGSAITE AUSW&Auml;HLEN",
6642		  "fr": "Choisissez les montants",
6643		  "es": "SELECCIONA CUERDAS VERTICALES",
6644		  "it": "SELEZIONA LE CORDE VERTICALI"
6645		};
6646
6647		const selectCrossesText = {
6648		  "en": "Select Crosses",
6649		  "de": "QUERSAITE AUSW&Auml;HLEN",
6650		  "fr": "Choisissez les travers",
6651		  "es": "SELECCIONA CUERDAS HORIZONTALES",
6652		  "it": "SELEZIONA LE CORDE ORIZZONTALI"
6653		};
6654		
6655		const selectStringText = {
6656		  "en": "Select String",
6657		  "de": "Saite ausw&auml;hlen",
6658		  "fr": "S&eacute;lectionner la cha&icirc;ne",
6659		  "es": "Seleccionar cadena",
6660		  "it": "Seleziona le corde"
6661		};
6662		 const selectOverGripText = {
6663		  "en": "Select Overgrip",
6664		  "de": "Overgrip ausw&auml;hlen",
6665		  "fr": "Choisissez votre surgrip",
6666		  "es": "Selecciona overgrip",
6667		  "it": "Seleziona l'overgrip"
6668		};
6669
6670		const searchOverGripText = {
6671		  "en": "Search All Overgrips",
6672		  "de": "Alle Overgrips suchen",
6673		  "fr": "Rechercher tous les surgrips",
6674		  "es": "Buscar todos los sobregrips",
6675		  "it": "Cerca tutti gli overgrip"
6676		};
6677
6678		const overGripReturnText = {
6679		  "en": "Rackets with an applied overgrip cannot be returned. The opened grip packages cannot be returned.",
6680		  "de": "Schl&auml;ger mit aufgebrachtem Overgrip k&ouml;nnen nicht zur&uuml;ckgegeben werden. Ge&ouml;ffnete Overgrip-Packungen k&ouml;nnen nicht zur&uuml;ckgegeben werden.",
6681		  "fr": "Les raquettes avec surgrip pos&eacute; ne peuvent pas &ecirc;tre renvoy&eacute;es. Les emballages de grips ouverts ne peuvent pas &ecirc;tre retourn&eacute;s.",
6682		  "es": "Las raquetas con overgrip a&ntilde;adido NO se pueden devolver. Los paquetes de grip abiertos no se pueden devolver.",
6683		  "it": "Le racchette con l'overgrip applicato non possono essere restituite. Le confezioni di overgrip aperte non possono essere restituite."
6684		};
6685		
6686		const addOverGripText = {
6687		  "en": "Install Overgrip",
6688		  "de": "Overgrip anbringen",
6689		  "fr": "Installation du surgrip",
6690		  "es": "A&ntilde;adir overgrip",
6691		  "it": "Applica l'overgrip"
6692		};
6693		
6694		const addTapeText = {
6695		  "en": "Protection Tape Service",
6696		  "de": "Schutzband-Service",
6697		  "fr": "Service de pose de bande de protection",
6698		  "es": "Servicio de cinta protectora",
6699		  "it": "Servizio di applicazione del nastro protettivo"
6700		};
6701		const addLogoText = {
6702		  "en": "Logo Branding Service",
6703		  "de": "Logo-Branding-Service",
6704		  "fr": "Service d&rsquo;apposition de logo",
6705		  "es": "Servicio de personalizaci&oacute;n con logo",
6706		  "it": "Servizio di applicazione del logo"
6707		};
6708		
6709		const applyGripText = {
6710			"en": "Grip will be opened and applied to the racket",
6711			"de": "Das Griffband wird ge&ouml;ffnet und auf den Schl&auml;ger aufgebracht",
6712			"fr": "Ouverture et pose du grip sur la raquette",
6713			"es": "El grip se abrir&aacute; para colocarlo en la raqueta",
6714			"it": "L'overgrip verr&agrave; aperto e applicato alla racchetta."
6715		};
6716		
6717		const strungText = {
6718			"en": "Strung",
6719			"fr": "Cord&eacute;e",
6720			"de": "Besaitet",
6721			"es": "Encordada",
6722			"it": "Incordata"
6723		};
6724		
6725		const unstrungText = {
6726			"en": "Unstrung",
6727			"fr": "Non cord&eacute;e",
6728			"de": "Unbesaitet",
6729			"es": "Sin encordar",
6730			"it": "Non incordata"
6731		};
6732		
6733		const defaultText = {
6734			"en": "Default",
6735			"de": "Standard",
6736			"fr": "Par d&eacute;faut",
6737			"it": "Predefinito",
6738			"es": "Predeterminado"
6739		};
6740		
6741		
6742		
6743		const customizationText = {
6744			"en": "customization",
6745			"fr": "CUSTOMISATION",
6746			"de": "INDIVIDUELLE ANPASSUNG",
6747			"es": "PERSONALIZACI&Oacute;N",
6748			"it": "PERSONALIZZAZIONE"
6749		};
6750		
6751		const stringingText = {
6752			"en": "Stringing",
6753			"fr": "CORDAGE",
6754			"de": "BESAITUNG",
6755			"es": "ENCORDADO",
6756			"it": "INCORDATURA"
6757		};
6758		
6759		let stringSection = {
6760			id: 'stringing',
6761			header: getTranslation(stringingText),
6762			option_type: 'radio',
6763			tab_group_id: 'stringing',
6764			options: [
6765				{
6766					label: getTranslation(defaultStringText),
6767					id: 'default',
6768					description: getTranslation(packageSelectText),
6769					active: true,
6770					service_fee: stringServiceProd,
6771					show_on_tab_ids: ["strung"],
6772					selections: [
6773						{
6774							label: getTranslation(selectSetText),
6775							id: 'select_package',
6776							active: true,
6777							default_image:
6778								'https://img.tennis-warehouse.com/graphics-resizer/custom_thumbnails/string-regular.svg',
6779							button_text: getTranslation(selectPackageText),
6780							additional_info_inputs: [
6781								{
6782									label: getTranslation(stringTensionText),
6783									id: 'package_tension',
6784									...stringTensionInfo,
6785									input_type: 'number',
6786									required: true,
6787									hidden: true,
6788									comment_text: '${repace_product_name} @ ${replace_input_value}',
6789								},
6790							],
6791							drawer_header: getTranslation(selectPackageText),
6792							tabs_header: 'Packages',
6793							search: {
6794								enabled: false,
6795							},
6796							product_type_ids: ['packages'
6797							],
6798							active_product_type_id: 'packages',
6799							selected_product: null,
6800							required: true,
6801							input_category: 'RACSBYMAKER',
6802						},
6803					],
6804				},
6805				{
6806					label: getTranslation(fullSetText),
6807					id: 'full_set',
6808					description: getTranslation(singleSetText),
6809					active: false,
6810					service_fee: stringServiceProd,
6811					show_on_tab_ids: ["strung"],
6812					selections: [
6813						{
6814							label: getTranslation(selectSetText),
6815							id: 'select_string',
6816							active: false,
6817							default_image:
6818								'https://img.tennis-warehouse.com/graphics-resizer/custom_thumbnails/string-regular.svg',
6819							button_text: getTranslation(selectStringText),
6820							additional_info_inputs: [
6821								{
6822									label: getTranslation(stringTensionText),
6823									id: 'string_tension',
6824									...stringTensionInfo,
6825									input_type: 'number',
6826									required: true,
6827									comment_text: '${repace_product_name} @ ${replace_input_value}',
6828								},
6829							],
6830							drawer_header: getTranslation(selectStringText),
6831							tabs_header: 'Playtester Picks',
6832							search: {
6833								enabled: true,
6834								product_type_ids: [stringSeachProductType.id],
6835								search_placeholder: getTranslation(searchAllStringText)
6836							},
6837							product_type_ids: stringArrayIds,
6838							active_product_type_id: stringArrayIds[0],
6839							selected_product: null,
6840							required: true,
6841							input_category: 'RACSBYMAKER',
6842						},
6843					],
6844				},
6845				{
6846					label: getTranslation(customHybridText),
6847					id: 'custom_hybrid',
6848					description: getTranslation(mainsAndCrossesText),
6849					active: false,
6850					service_fee: stringServiceProd,
6851					show_on_tab_ids: ["strung"],
6852					selections: [
6853						{
6854							label: getTranslation(selectMainsText),
6855							id: 'select_mains',
6856							active: false,
6857							default_image:
6858								'https://img.tennis-warehouse.com/graphics-resizer/custom_thumbnails/string-main.svg',
6859							button_text: getTranslation(selectStringText),
6860							additional_info_inputs: [
6861								{
6862									label: getTranslation(stringTensionText),
6863									id: 'string_mains',
6864									...stringTensionInfo,
6865									input_type: 'number',
6866									required: true,
6867									comment_text: 'M:${repace_product_name} @ ${replace_input_value}',
6868								},
6869							],
6870							drawer_header: getTranslation(selectStringText),
6871							tabs_header: 'Playtester Picks',
6872							search: {
6873								enabled: true,
6874								product_type_ids: [stringHybridProductType.id],
6875								search_placeholder: getTranslation(searchAllStringText)
6876							},
6877							product_type_ids: [stringHybridProductType.id],
6878							active_product_type_id: stringHybridProductType.id,
6879							selected_product: null,
6880							required: true,
6881							input_category: 'STRING1',
6882						},
6883						{
6884							label: getTranslation(selectCrossesText),
6885							id: 'select_crosses',
6886							active: false,
6887							default_image:
6888								'https://img.tennis-warehouse.com/graphics-resizer/custom_thumbnails/string-crosses.svg',
6889							button_text: getTranslation(selectStringText),
6890							additional_info_inputs: [
6891								{
6892									label: getTranslation(stringTensionText),
6893									id: 'string_crosses',
6894									...stringTensionInfo,
6895									input_type: 'number',
6896									required: true,
6897									comment_text: 'C:${repace_product_name} @ ${replace_input_value}',
6898								},
6899							],
6900							drawer_header: getTranslation(selectStringText),
6901							tabs_header: 'Playtester Picks',
6902							search: {
6903								enabled: true,
6904								product_type_ids: [stringHybridProductType.id],
6905								search_placeholder: getTranslation(searchAllStringText)
6906							},
6907							product_type_ids: [stringHybridProductType.id],
6908							active_product_type_id: stringHybridProductType.id,
6909							selected_product: null,
6910							required: true,
6911							input_category: 'STRING2',
6912						},
6913					],
6914				},
6915			],
6916		}
6917		let customization_data;
6918		
6919		if (demo) {
6920			stringSection.options.pop();
6921			stringSection.options = stringSection.options.map(option => {
6922				option.show_on_tab_ids = ["selectString"];
6923				return option;
6924			})
6925			customization_data = {
6926				language: utilities.pageLang().getLang().toUpperCase(),
6927				region: 'EU',
6928				flag_labels: flagLabels,
6929				resize_url: 'https://img.tenniswarehouse-europe.com/watermark/rs.php',
6930				customization_url: '/ajax/customization_data.php',
6931				item_drawer_is_open: false,
6932				search_text: '',
6933				sections: [
6934					stringSection
6935				],
6936				product_types: [
6937					...stringArray,
6938					{
6939						id: 'packages',
6940						tab_text: 'Packages',
6941						header: 'String Packages',
6942						subtext: '',
6943						display_type: 'package',
6944						active: true,
6945						drawer_items: packageArray,
6946					},
6947				],
6948				tab_groups: [
6949					{
6950						id: "stringing",
6951						tabs: [
6952							{
6953								id: 'default',
6954								label: getTranslation(defaultText),
6955								active: true,
6956								hiddenInput: {
6957									component_type: 'comment',
6958									comment_text: "Default String",
6959								},
6960							},
6961							{
6962								id: 'selectString',
6963								label: getTranslation(selectStringText),
6964								active: false,
6965							},
6966						]
6967					}
6968				]
6969			};
6970		} else {
6971			customization_data = {
6972				language: utilities.pageLang().getLang().toUpperCase(),
6973				region: 'EU',
6974				flag_labels: flagLabels,
6975				resize_url: 'https://img.tenniswarehouse-europe.com/watermark/rs.php',
6976				customization_url: '/ajax/customization_data.php',
6977				item_drawer_is_open: false,
6978				search_text: '',
6979				sections: [
6980					stringSection,
6981					{
6982						id: 'general_customization',
6983						type: 'checkbox',
6984						header: getTranslation(customizationText),
6985						option_type: 'checkbox',
6986						options: [
6987							{
6988								label: getTranslation(addOverGripText),
6989								id: 'over_grip',
6990								description: getTranslation(applyGripText),
6991								active: false,
6992								required: false,
6993								service_fee: gripServiceProd,
6994								show_on_tab_ids: ["strung"],
6995								selections: [
6996									{
6997										label: '',
6998										id: 'select_over_grip',
6999										active: false,
7000										default_image:
7001											'https://img.tennis-warehouse.com/graphics-resizer/custom_thumbnails/string-regular.svg',
7002										button_text: getTranslation(selectOverGripText),
7003										drawer_header: getTranslation(selectOverGripText),
7004										search: {
7005											enabled: true,
7006											product_type_ids: overGripArrayIds,
7007											search_placeholder: getTranslation(searchOverGripText)
7008										},
7009										product_type_ids: overGripArrayIds,
7010										active_product_type_id: overGripArrayIds[0],
7011										selected_product: null,
7012										required: true,
7013										input_category: overGripArrayIds[0],
7014										subtext: getTranslation(overGripReturnText),
7015										additional_info_inputs: [
7016											{
7017												label: null,
7018												id: 'over_grip_comment',
7019												value: " ",
7020												input_type: 'string',
7021												hidden: true,
7022												required: true,
7023												comment_text: '${repace_product_name}',
7024											},
7025										],
7026									},
7027								],
7028							},
7029							{
7030								label: getTranslation(addLogoText),
7031								id: 'logo_service',
7032								description: '',
7033								active: false,
7034								required: false,
7035								service_fee: logoServiceProd,
7036								show_on_tab_ids: ["strung"],
7037								hiddenInput: {
7038									component_type: 'comment',
7039									comment_text: "Logo Branding Service",
7040								},
7041								selections: [],
7042							},
7043							{
7044								label: getTranslation(addTapeText),
7045								
7046								id: 'tape_service',
7047								description: '',
7048								active: false,
7049								required: false,
7050								service_fee: tapeServiceProd,
7051								show_on_tab_ids: ["strung"],
7052								hiddenInput: {
7053									component_type: 'comment',
7054									comment_text: "Protection Tape Service",
7055								},
7056								selections: [],
7057							},
7058						],
7059					},
7060				],
7061				product_types: [
7062					...stringArray,
7063					{
7064						id: 'packages',
7065						tab_text: 'Packages',
7066						header: 'String Packages',
7067						subtext: '',
7068						display_type: 'package',
7069						active: true,
7070						drawer_items: packageArray,
7071					},
7072					stringHybridProductType,
7073					stringSeachProductType,
7074					...overGripArray,
7075				],
7076				tab_groups: [
7077					{
7078						id: "stringing",
7079						tabs: [
7080							{
7081								id: 'strung',
7082								label: getTranslation(strungText),
7083								active: true,
7084							},
7085							{
7086								id: 'unstrung',
7087								label: getTranslation(unstrungText),
7088								active: false,
7089								hiddenInput: {
7090									component_type: 'comment',
7091									comment_text: getTranslation(unstrungText),
7092								},
7093								options: []
7094							},
7095						]
7096					}
7097				]
7098			};
7099		}
7100		// console.log(customization_data)
7101    	$(this).attr('data-customization-json',JSON.stringify(customization_data));
7102    	initializeCustomizationApp(this);
7103    });
7104
7105	$('.model-specs-link').on("click", function(e) {
7106
7107		e.preventDefault();
7108
7109		if ($(this).hasClass('valid-link')) {
7110
7111			var ordering_container = document.querySelector(".js-ordering-module");
7112			var productCode = $(this).data('item');
7113
7114			ordering_container.dispatchEvent(new CustomEvent("ordering:triggerOpenSpecsDrawer", {
7115				detail: { code: productCode }
7116			}));
7117
7118		}
7119
7120	});
7121
7122	/*
7123	$('.model-specs-link').on("click", function(e) {
7124
7125		if ($(this).hasClass('valid-link')) {
7126
7127			var isRod = $('.descpage').find('.style_ordering-area.is-rod');
7128			var isReel = $('.descpage').find('.style_ordering-area.is-reel');
7129			var specsTable = $('.descpage').find('.specs-table-panel');
7130			var specsContent = $('.descpage').find('.specs-content');
7131			var itemCode = $(this).attr('data-item');
7132			var itemName = $(this).attr('data-name');
7133
7134			if (isRod.length) {
7135
7136				$.ajax({
7137					type: "GET",
7138					url: "/api/rodinfo.xml?pcode=" + itemCode ,
7139					dataType: "xml",
7140					success: function(xmlData){
7141
7142						var specTaper = $(xmlData).find('taper').text();
7143						var specLineWeight = $(xmlData).find('lineweight').text();
7144						var specLureWeight = $(xmlData).find('lureweight').text();
7145						var specGuides = $(xmlData).find('guides').text();
7146						var specHandleLength = $(xmlData).find('handlelength').text();
7147						var specHandleType = $(xmlData).find('handletype').text();
7148						var specHandleCode = $(xmlData).find('handlecode').text();
7149
7150						var specInfo = '<div class="specs-content"><h2>' + itemName + '</h2><div class="table-responsive"><table class="table"><tbody><tr><td scope="row">Taper</td><td>' + specTaper + '</td></tr><tr><td scope="row">Line Wt.</td><td>' + specLineWeight +'</td></tr><tr><td scope="row">Lure Wt.</td><td>' + specLureWeight + '</td></tr><tr><td scope="row">Guides</td><td>' + specGuides + '</td></tr><tr><td scope="row">Handle Length</td><td>' + specHandleLength + '</td></tr><tr><td scope="row">Handle Type</td><td>' + specHandleType + '</td></tr></tbody></table></div>';
7151
7152						specInfo = specInfo + '<div class="specs-image"><table><tr><td><img class="product-specs-image" src="https://img.tenniswarehouse-europe.com/new_handles/' + specHandleCode + '.jpg" alt="' + specHandleType + '" /></td></tr></table></div></div>';
7153
7154						if ($(specsContent.length)) {
7155							$(specsContent).remove();
7156						}
7157
7158						specsTable.append($(specInfo));
7159
7160					}
7161
7162				});
7163
7164			}
7165
7166			if (isReel.length) {
7167
7168				$.ajax({
7169					type: "GET",
7170					url: "/api/reelinfo.xml?pcode=" + itemCode ,
7171					dataType: "xml",
7172					success: function(xmlData){
7173
7174						var specRetrieve = $(xmlData).find('retrieve').text();
7175						var specWeight = $(xmlData).find('weight').text();
7176						var specGearRatio = $(xmlData).find('gearratio').text();
7177						var specLineCapacity = $(xmlData).find('linecap').text();
7178						var specBearings = $(xmlData).find('bearings').text();
7179
7180						var specInfo = '<div class="specs-content"><h2>' + itemName + '</h2><div class="table-responsive"><table class="table"><tbody><tr><td scope="row">Retrieve</td><td>' + specRetrieve + '</td></tr><tr><td scope="row">Weight</td><td>' + specWeight +'</td></tr><tr><td scope="row">Gear Ratio</td><td>' + specGearRatio + '</td></tr><tr><td scope="row">Line Cap.</td><td>' + specLineCapacity + '</td></tr><tr><td scope="row">Bearings</td><td>' + specBearings + '</td></tr></tbody></table></div></div>';
7181
7182						if ($(specsContent.length)) {
7183							$(specsContent).remove();
7184						}
7185
7186						specsTable.append($(specInfo));
7187
7188					}
7189
7190				});
7191
7192			}
7193
7194		}
7195
7196	});
7197	*/
7198
7199	/* End Descpage */
7200
7201
7202	/* Feedback.html IFrame for Email Reviews */
7203	if($(".cust_feed_form").length) {
7204		$(".feedback_frame").on('load', function() {
7205			var submitFunction = function() {
7206				$(".cust_feed_form").empty().append('<span class="icon ui-success m-auto"><\/span>\n'+
7207					'<h1 class="mt-3 mb-2 text-center">Thank You!<\/h1>\n'+
7208					'<p class="mb-0 text-center">You have successfully submitted your review. It may take up to a few days for your review to post. Thank you for your patience.<\/p>');
7209
7210				window.scrollTo({ top: 0, behavior: 'smooth' }); //Reset scroll position to top of the page
7211			}
7212			validateFeedbackForm($(this), $(".cust_feed_form").find('button[type="submit"]'), submitFunction)
7213		})
7214	}
7215	/* End Feedback.html IFrame for Email Reviews */
7216
7217	/* Support Center More Link Option */
7218	if ($(".support_more").length) {
7219		readMore($(".support_more"), 0);
7220	}
7221
7222	if ($(".breadcrumb").length) {
7223		var breadcrumb = $(".breadcrumb");
7224		var breadcrumbScroll = breadcrumb.get(0).scrollWidth;
7225		var breadcrumbWidth = breadcrumb.get(0).offsetWidth;
7226		var newOffset = breadcrumbScroll - breadcrumbWidth;
7227
7228		breadcrumb.scrollLeft(newOffset);
7229	}
7230
7231	/* Working Order */
7232	/*
7233	if ($(".sharecart_button").length) {
7234		$(".sharecart_button").on("click", function(e) {
7235			e.preventDefault();
7236			generateShareCart($(this).data("url"));
7237		});
7238	}
7239	*/
7240
7241	if ($("#gift_redeem").length) {
7242		$('#gift_num').change(function () {
7243			$('#gift_code').attr('name', function () {
7244				return $('#gift_num').val() + '-CRED-REDEEM';
7245			});
7246		});
7247	}
7248
7249	if ($('.component-show').length) {
7250		$('.component-show').each(function() {
7251			var button = $(this);
7252			var target = button.data('target');
7253
7254			$(target).on('show.bs.collapse', function() {
7255				var hideCompText = {
7256					en: 'Hide Components',
7257					de: 'Komponente ausblenden',
7258					fr: 'Masquer les &eacute;l&eacute;ments',
7259					it: 'Nascondi',
7260					es: 'Ver menos componentes'
7261				};
7262				button.text(hideCompText[utilities.pageLang().getLang()]);
7263			});
7264
7265			$(target).on('hide.bs.collapse', function() {
7266				var hideCompText = {
7267					en: 'Show Components',
7268					de: 'Komponenten anzeigen',
7269					fr: 'Voir les d&eacute;tails',
7270					it: 'Mostra le componenti',
7271					es: 'Ver componentes'
7272				};
7273				button.text(hideCompText[utilities.pageLang().getLang()]);
7274			});
7275		});
7276	}
7277	/* End Working Order */
7278
7279	if ( $('.cat_video_popup').length ) {
7280		 catVideoModal();
7281	}
7282
7283	if ( $('.add_info-link').length ) {
7284		$('.add_info-link').popover();
7285	}
7286
7287	if ( $('.category-navigation-catselection').length ) {
7288		$('.category-navigation-catselection').removeClass('d-none');
7289	}
7290
7291	if ( $(".form-control[type='password']") ) {
7292		$(".form-control[type='password']").each(function(){
7293			pwShowHide($(this));
7294		});
7295	}
7296
7297	$('.smooth_scroll[href*="#"]').on("click", function(e){
7298		var target = $(this.hash);
7299		target = target.length ? target : $('[name='+this.hash.slice(1)+']');
7300
7301		if (target.length) {
7302			e.preventDefault();
7303			$('html, body').animate({
7304				scrollTop: target.offset().top - 199
7305			}, 800);
7306			focusOnElement(target);
7307		}
7308	});
7309
7310	$('body').on("click", '.smooth_scroll[href*="#"]', function(e){
7311		var target = $(this.hash);
7312		target = target.length ? target : $('[name='+this.hash.slice(1)+']');
7313
7314		if (target.length) {
7315			e.preventDefault();
7316			$('html, body').animate({
7317				scrollTop: target.offset().top - 199
7318			}, 800);
7319			focusOnElement(target);
7320		}
7321	});
7322
7323	// Adding listCarousel
7324	if($(".prodcarousel").length){
7325		$(".prodcarousel").each(function() {
7326			dynamicCarousel($(this));
7327		});
7328	}
7329
7330	/* Call Modals */
7331	if ($(".login_link").length) {
7332		if (!$(".login_link").hasClass("logged-in")) {
7333			$(".login_link").on("click", function(e) {
7334				e.preventDefault();
7335				createLoginModal($(this));
7336			});
7337		}
7338	}
7339
7340	if ($(".account_logout").length) {
7341		$(".account_logout").on("click", function(e) {
7342			e.preventDefault();
7343			createLogoutModal();
7344		});
7345	}
7346
7347	if ($(".subscr_form").length) {
7348		var mailing_form = $(".subscr_form");
7349		var recaptchaClass = mailing_form.data('recaptcha_textclass');
7350		if (mailing_form.next()?.hasClass("unsubscr_list_check") && mailing_form.parent()?.hasClass('subscr_form-wrapper')) {
7351			mailing_form.parent().append($(utilities.recaptchaRequiredMessage(recaptchaClass)));
7352		} else {
7353			$(utilities.recaptchaRequiredMessage(recaptchaClass)).insertBefore(mailing_form.find('button[type="submit"]'));
7354		}
7355
7356		mailing_form.on("submit", function(e) {
7357			e.preventDefault();
7358			createMailingModal(mailing_form);
7359		});
7360
7361		mailing_form.find('button[type="submit"]').on("click", function(e) {
7362			e.preventDefault();
7363			let validated = true;
7364			mailing_form.find('.error').removeClass('error')
7365			//Loop through all the inputs in the form and check if they're required and not empty
7366			mailing_form.find('input:not(.ml_check)').each((index, inputField) => {
7367				//If the input field is required and empty, set validated to false
7368				if (inputField.required === true) {
7369				
7370					const $field = $(inputField);
7371                	const type = $field.attr('type');
7372                	
7373					if (($(inputField).attr('type') === 'checkbox' && inputField.checked === false) || ($(inputField).val() == false))  {
7374						validated = false;
7375						$(inputField).addClass("error")
7376					}
7377					
7378					// Coach/team mailinglist: Checks if at least one in the named group is checked
7379					else if (type === 'radio') {
7380						if (!$(`input[name="${$field.attr('name')}"]:checked`).val()) {
7381							validated = false;
7382							$field.addClass("error");
7383						}
7384					} 
7385					
7386				}
7387			});
7388			
7389        	// Checking if coach/team mailinglist was selected
7390			var isCoachChecked = $('#eligible_true').prop('checked');
7391			if (isCoachChecked) {
7392				// Check if at least one team list checkbox is selected in the coach container
7393				if ($('#coach-options-container input[type="checkbox"]:checked').length === 0) {
7394					validated = false;
7395					$('#coach-options-container .mailer_signup-lists').addClass("error");
7396				}
7397			}
7398
7399			//If no mailing lists have been selected, not valid
7400			if (mailing_form.find('input[type=checkbox].ml_check:checked').length === 0) {
7401				validated = false;
7402				mailing_form.find('.mailer_signup-lists:has(input[type=checkbox].ml_check)').addClass("error");
7403			}
7404
7405			//If the form is validated, validate the recaptcha for the form and submit it
7406			if (validated) {
7407				utilities.validateRecaptcha(mailing_form, 'mailing_signup');
7408			} 
7409		});
7410	}
7411
7412	if ($(".unsubscr_list_check").length) {
7413		var unsub_list_check_form = $(".unsubscr_list_check");
7414		var subEmail = $('#subscr_email');
7415		var unsubCheckSubmit = $('.unsubscr_list_check-submit');
7416		var pattern = new RegExp(/^[A-Za-z0-9._%\-+]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,4}$/);
7417	
7418		unsubCheckSubmit.off('click').on('click', function(e) {
7419			e.preventDefault();
7420			if (!pattern.test(subEmail.val())) {
7421				alert("Please enter a valid email address");
7422				subEmail.val("").focus();
7423				return false;
7424			}
7425			
7426			utilities.validateRecaptcha(unsub_list_check_form, 'mailing_signup');
7427
7428			unsub_list_check_form.off("submit").on("submit", function(e) {
7429				e.preventDefault();
7430				createUnsubCheckModal(unsub_list_check_form);
7431			});
7432		});
7433	}
7434
7435	if ($(".unsubscr_form").length) {
7436		var unsub_mailing_form = $(".unsubscr_form");
7437		$(utilities.recaptchaRequiredMessage('mb-3')).insertBefore(unsub_mailing_form.find('.btn.btn-primary'));
7438
7439		unsub_mailing_form.on("submit", function(e) {
7440			e.preventDefault();
7441			createUnsubModal(unsub_mailing_form);
7442		});
7443
7444		unsub_mailing_form.find('button').on("click", function(e) {
7445			e.preventDefault();
7446			utilities.validateRecaptcha(unsub_mailing_form, 'mailing_signup');
7447		});
7448	}
7449
7450	if ($(".forgot_password").length) {
7451		$(".forgot_password").on("click", function(e) {
7452			e.preventDefault();
7453			createForgotModal();
7454		});
7455	}
7456
7457	if ($(".category_follow").length) {
7458		$(".category_follow").on("click", function(e) {
7459			var followCatText = {
7460				en: 'Follow Category',
7461				de: 'Kategorie ansehen',
7462				fr: 'Voir la categorie',
7463				it: 'Segui la categoria',
7464				es: 'Ver categoria'
7465			};
7466			var followCatButton = {
7467				en: 'Sign Up',
7468				de: 'Anmelden',
7469				fr: 'S\'inscrire',
7470				it: 'Iscriviti',
7471				es: 'SuscrÂ’bete'
7472			};
7473			e.preventDefault();
7474			//generateModaliFrame($(this), followCatText[utilities.pageLang().getLang()], followCatButton[utilities.pageLang().getLang()]);
7475			generateNotifyModal($(this).attr('href'), followCatText[utilities.pageLang().getLang()]);
7476		});
7477	}
7478
7479	if ($(".performance_frame-vid").length) {
7480		$(".performance_frame-vid").on("click", function(e) {
7481			e.preventDefault();
7482			generateVideoModal($(this));
7483		});
7484	}
7485
7486	if ($('.quick_order').length) {
7487		//generate empty panel, to be reused for any quick order content
7488		QuickOrderPanel.initPanel();
7489
7490		var panelOrdering = $('<div class="dynamic_order" />');
7491		var orderingReturn = $('<button type="button" class="dynamic_order-back" title="Back to Order"><i class="icon icon-arrow icon-arrow-left is-lg">Back to Order</i></button>');
7492
7493		$('.quick_order').on('click', function(e) {
7494			e.preventDefault();
7495			var serial = '?pcode='+ $(this).data('code');
7496			var ignoreDynamic = ($(this).hasClass('ignore-dynamic') ? true : false);
7497			$.ajax({
7498				timeout: 8000,
7499				type: "GET",
7500				url: "/ajax/quickview.html" + serial,
7501				//url: "https://www.tenniswarehouse-europe.com/zzz/responsive/ajax/quickview.html" + serial,
7502				dataType: "html",
7503				success: function(data) {
7504					var jqdata = $(data);
7505					//generateQuickOrder(jqdata, ignoreDynamic);
7506					var panel_content = QuickOrderPanel.getContent();
7507					panel_content.html(jqdata);
7508					QuickOrderPanel.open();
7509
7510					//panelOrdering.append($('<div class="dynamic_order-wrap" />').append(data));
7511
7512					var panelOrderForm = panel_content.find(".style_ordering-form");
7513
7514					if (panel_content.find(".js-ordering-module").length) {
7515						let options = {
7516							targetNode: panel_content.find('.js-ordering-module'),
7517							containerNode: panel_content,
7518							submitButtonText: 'Add To Cart',
7519							allowColorPreselectFromQuery: false
7520						};
7521						orderingModuleSetUp(options);
7522
7523					} else {
7524
7525						if (panelOrderForm.length) {
7526
7527							panel_content.find('.qty_section').each(function() {
7528								utilities.enhance_qty($(this));
7529							});
7530
7531						}
7532					}
7533
7534					panel_content.find('.form-group').enhanceInput();
7535
7536					//objects.cartPanel.find('.dynamic_cart').after(panelOrdering);
7537
7538					setTimeout(function() {
7539						panel_content.addClass('is-shown')
7540						setTimeout(function() {orderingReturn.focus()}, 300);
7541					}, 50);
7542				},
7543
7544				error: function() {
7545					//failed to load product
7546				}
7547			});
7548		});
7549	}
7550
7551	if ($('#redeem_gift').length) {
7552		$('.redeem_gift-btn').on('click', function(e) {
7553			e.preventDefault();
7554			$('#redeem_gift').find('.active form').submit();
7555		});
7556	}
7557
7558	/* Multiple colors modal */
7559	$('.more-colors-js').on('click', function(e) {
7560		e.preventDefault();
7561		var prodCode = $(this).data('prod');
7562		generateColorModal(prodCode);
7563	});
7564
7565	if ($('.js-calc_pricerange').length) {
7566		$('.js-calc_pricerange').each(function(index, element) {
7567			function compareFnc(a,b) { return a - b };
7568			function getMinMaxString(myArray) {
7569				var returnStr = "";
7570				if (myArray.length) {
7571					var lastIndex = myArray.length - 1;
7572
7573					returnStr = myArray[0].toFixed(2) + "&euro;";
7574					if (myArray[0] !== myArray[lastIndex]) {
7575						returnStr += " - " + myArray[lastIndex].toFixed(2) + "&euro;";
7576					}
7577				}
7578				return returnStr;
7579			}
7580
7581			var calcRangeElement = $(element);
7582			var priceArray = calcRangeElement.data("price_array");
7583			var msrpArray = calcRangeElement.data("msrp_array");
7584
7585			if (priceArray.length && msrpArray.length && Array.isArray(priceArray) && Array.isArray(msrpArray)) {
7586				priceArray.sort(compareFnc);
7587				msrpArray.sort(compareFnc);
7588
7589				let foundElement = calcRangeElement.find('.js-calc_pricerange_price');
7590				let priceMinMaxString = getMinMaxString(priceArray);
7591				if ($(foundElement).length) {
7592					foundElement.append(priceMinMaxString);
7593				}
7594
7595				foundElement = calcRangeElement.find('.js-calc_pricerange_msrp');
7596				let msrpMinMaxString = getMinMaxString(msrpArray);
7597				if ($(foundElement).length && msrpMinMaxString !== priceMinMaxString) {
7598					foundElement.append('<span class="is-crossout">' + msrpMinMaxString + '</span>');
7599				}
7600			}
7601		});
7602	}
7603	/* End Call Modals */
7604
7605	/* Gift Cards */
7606	if ($('#egift_ordering').length) {
7607		var eGiftOrderForm = $('#egift_ordering');
7608		var eGiftQty = eGiftOrderForm.find('#egift_qty');
7609		var eGiftComment = eGiftOrderForm.find('#egift_comment');
7610		var eGiftSubmit = eGiftOrderForm.find('.egift_order-btn');
7611
7612		if ((eGiftQty.val() === '' || eGiftQty.val() < 10) || (eGiftComment.val() === '' || !utilities.isValidEmail(eGiftComment.val()))) {
7613			eGiftSubmit.addClass('disabled').attr('disabled', true);
7614		}
7615
7616		eGiftQty.on('keyup', function() {
7617			if ((eGiftQty.val() === '' || eGiftQty.val() < 10) || (eGiftComment.val() === '' || !utilities.isValidEmail(eGiftComment.val()))) {
7618				if (!eGiftSubmit.hasClass('disabled')) {
7619					eGiftSubmit.addClass('disabled').attr('disabled', true);
7620				}
7621			} else {
7622				if (eGiftSubmit.hasClass('disabled')) {
7623					eGiftSubmit.removeClass('disabled').attr('disabled', false);
7624				}
7625			}
7626		});
7627
7628		eGiftComment.on('keyup', function() {
7629			if ((eGiftQty.val() === '' || eGiftQty.val() < 10) || (eGiftComment.val() === '' || !utilities.isValidEmail(eGiftComment.val()))) {
7630				if (!eGiftSubmit.hasClass('disabled')) {
7631					eGiftSubmit.addClass('disabled').attr('disabled', true);
7632				}
7633			} else {
7634				if (eGiftSubmit.hasClass('disabled')) {
7635					eGiftSubmit.removeClass('disabled').attr('disabled', false);
7636				}
7637			}
7638		});
7639
7640		eGiftOrderForm.on('submit', function() {
7641			var enterEmailText = {
7642				en: 'Please Enter a Valid Email Address',
7643				de: 'Bitte gebe eine gültige E-Mail-Adresse ein',
7644				fr: 'Veuillez renseigner une adresse e-mail valide',
7645				it: 'Ti preghiamo di inserire un indirizzo email valido',
7646				es: 'Por favor, introduce una dirección de correo válida.'
7647			};
7648			if(!utilities.isValidEmail(eGiftComment.val())){
7649				/*alert("Please Enter a Valid Email Address");*/
7650				alert(enterEmailText[utilities.pageLang().getLang()]);
7651				eGiftComment.focus();
7652				return false;
7653			}
7654
7655			var comment = eGiftComment.val() + " - " + $("#egift_comment1").val();
7656			if(comment.length > 71){ comment = comment.substr(0,71); }
7657			eGiftComment.val(comment);
7658		});
7659
7660	}
7661
7662	/*
7663	$("#egift_qty").on("keypress",function(e){
7664		return utilities.digitsOnly(e);
7665	});
7666
7667	$("#egift_ordering").on("submit",function(){
7668		var enterEmailText = {
7669			en: 'Please Enter a Valid Email Address',
7670			de: 'Bitte gebe eine gültige E-Mail-Adresse ein',
7671			fr: 'Veuillez renseigner une adresse e-mail valide',
7672			it: 'Ti preghiamo di inserire un indirizzo email valido',
7673			es: 'Por favor, introduce una dirección de correo válida.'
7674		};
7675		var email = $("#egift_comment");
7676		if(!utilities.isValidEmail(email.val())){
7677			alert(enterEmailText[utilities.pageLang().getLang()]);
7678			email.focus();
7679			return false;
7680		}
7681
7682	});
7683
7684	if ($(".gift_cards").length) {
7685		utilities.enhance_qty($(".qty_section"));
7686	}
7687	*/
7688	/* End Gift Cards */
7689
7690	/* Shipping Calculator */
7691	if($("#ship_calc").length){
7692		$("#ship_calc .sc_form").eq(0).on("submit",function(e){
7693			e.preventDefault();
7694			shipcalc_retrieve($(this).serialize(),$("#ship_calc"));
7695		});
7696	}
7697
7698	/* Mailing List */
7699	$("#all_list").on("change",function(){
7700		if($(this).prop("checked") === true){
7701			$(".ml_check").prop("checked",true);
7702		}
7703	});
7704
7705	$(".ml_check").on("change",function(){
7706		if($(this).prop("checked") === false){
7707			$("#all_list").prop("checked",false);
7708		} else {
7709			if(!$(".ml_check").not(":checked").length){
7710				$("#all_list").prop("checked",true);
7711			}
7712		}
7713	});
7714
7715	$("#all_list_unsub").on("change",function(){
7716		if($(this).prop("checked") === true){
7717			$(".ml_check_unsub").prop("checked",true);
7718		}
7719	});
7720
7721	$(".ml_check_unsub").on("change",function(){
7722		if($(this).prop("checked") === false){
7723			$("#all_list_unsub").prop("checked",false);
7724		} else {
7725			if(!$(".ml_check_unsub").not(":checked").length){
7726				$("#all_list_unsub").prop("checked",true);
7727			}
7728		}
7729	});
7730
7731	$(".js-component-total").each(function(){
7732		var price_array = $(this).data("component-price-array").split('|');
7733		if(Array.isArray(price_array))
7734		{
7735			var total = price_array.reduce(
7736				function(accumulator,value) {
7737					return accumulator + parseFloat(value.replace(',', '.'));
7738				},
7739				0 // initial value
7740			)
7741
7742			$(this).html(total.toFixed(2).replace('.', ',') + " &euro;");
7743		}
7744	});
7745
7746	/* Warranties */
7747	$(".brand_warranties-select").on("change", function() {
7748		var brand = $(this).find(":selected").val();
7749
7750		$(".brand_warranties-info-brand").removeClass("is-visible");
7751		$("#"+brand).addClass("is-visible");
7752	});
7753
7754	/* Warranties */
7755	$(".brand_warranties-select").on("change", function() {
7756		var brand = $(this).find(":selected").val();
7757
7758		$(".brand_warranties-info-brand").removeClass("is-visible");
7759		$("#"+brand).addClass("is-visible");
7760	});
7761
7762	// Cookies Notify Overlay
7763	/*
7764	function privacyMsg(privacyDate){
7765		var cookieText = {
7766			en: 'We use cookies in order to provide you the best shopping experience. By using our website you agree to our <a href="https://www.tenniswarehouse-europe.com/privacy.html">Privacy Policy</a>.',
7767			de: 'Wir verwenden Cookies, um dir das beste Einkaufserlebnis zu bieten. Durch die Nutzung unserer Website stimmst du unserer <a href="https://www.tenniswarehouse-europe.com/privacy.html">Datenschutzerkl&auml;rung zu</a>.',
7768			fr: 'Nous utilisons les cookies afin de vous assurer la meilleure exp&eacute;rience d\'achat possible. En utilisant notre site web, vous acceptez notre <a href="https://www.tenniswarehouse-europe.com/privacy.html">politique de confidentialit&eacute;</a>.',
7769			it: 'Utilizziamo i cookies per offrirti la migliore esperienza di acquisto possibile. Utilizzando il nostro sito, accetti la nostra <a href="https://www.tenniswarehouse-europe.com/privacy.html">Informativa sulla privacy</a>.',
7770			es: 'Utilizamos cookies para mejorar tu experiencia en nuestra web. Seguir navegando implica la aceptaci—n de nuestra <a href="https://www.tenniswarehouse-europe.com/privacy.html">pol&iacute;tica de privacidad</a>.'
7771		};
7772		var agreeText = {
7773			en: 'Agree',
7774			de: 'Zustimmen',
7775			fr: 'J\'accepte',
7776			it: 'Accetta',
7777			es: 'Acepto'
7778		};
7779		var agreePPText = {
7780			en: 'Agree to Privacy Policy',
7781			de: 'Der Datenschutzerkl&auml;rung zustimmen',
7782			fr: 'J\'accepte la politique de confidentialitÂŽ',
7783			it: 'Accetta l\'Informativa sulla Privacy',
7784			es: 'Acepto la pol&iacute;tica de privacidad.'
7785		};
7786		var dataWrap = $('<div class="container-fluid cookie_agree"></div>');
7787		var dataRow = $('<div class="row"></div>');
7788		var dataMsg = $('<div class="col-12 col-xs-8 col-sm-9 col-lg-10">'+ cookieText[utilities.pageLang().getLang()] +'</div>');
7789		var dataClose = $('<div class="col-12 col-xs-4 col-sm-3 col-lg-2"><button class="cookie_agree-btn btn button-brand btn-block" aria-label="'+ agreePPText[utilities.pageLang().getLang()] +'">'+ agreeText[utilities.pageLang().getLang()] +'</button></div>');
7790
7791		dataClose.on("click", function(e){
7792			dataWrap.remove();
7793			setPrivacyCookie("privacy_policy", privacyDate, 30);
7794		});
7795		dataRow.append(dataMsg).append(dataClose);
7796		dataWrap.append(dataRow);
7797		$('body').prepend(dataWrap);
7798	}
7799
7800	function setPrivacyCookie(cname, cvalue, exdays){
7801		var d = new Date();
7802		d.setTime(d.getTime() + (exdays*24*60*60*1000));
7803		var expires = "expires=" + d.toUTCString();
7804
7805		document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
7806	}
7807
7808	function getPrivacyCookie(cname){
7809		var name = cname + "=";
7810		var ca = document.cookie.split(';');
7811
7812		for (var i = 0; i < ca.length; i++){
7813			var c = ca[i];
7814			while (c.charAt(0) == ' '){
7815				c = c.substring(1);
7816			}
7817			if (c.indexOf(name) == 0){
7818				return c.substring(name.length, c.length);
7819			}
7820		}
7821		return "";
7822	}
7823
7824	function checkPrivacyCookie(){
7825		var privacy = getPrivacyCookie("privacy_policy");
7826		var privacyDate = "180604";
7827
7828		if (!(privacy != '' && privacy == privacyDate)){
7829			privacyMsg(privacyDate);
7830		}
7831	}
7832
7833	checkPrivacyCookie();
7834	*/
7835
7836	// Wish Lists
7837	if ($(".wishlist_create").length) {
7838		$(".wishlist_create").on("click", function(e) {
7839			e.preventDefault();
7840			var listLogin = $(this).hasClass("is-login");
7841
7842			createWishNew(listLogin);
7843		});
7844	}
7845
7846	if ($(".wl_controls").length) {
7847		var wishControls = $(".wl_controls");
7848
7849		wishControls.find(".wl_controls-rename").on("click", function(e) {
7850			e.preventDefault();
7851			var listCode = $(this).data("list");
7852			var listName = $(this).data("name");
7853
7854			createWishRename(listCode, listName)
7855		});
7856
7857		wishControls.find(".wl_controls-delete").on("click", function(e) {
7858			e.preventDefault();
7859			var formParent = $(this).parents("form");
7860
7861			createWishDelete(formParent);
7862		});
7863
7864		wishControls.find(".wl_controls-copy").on("click", function(e) {
7865			e.preventDefault();
7866			var listCode = $(this).data("list");
7867			var listName = $(this).data("name");
7868			var listLogin = $(this).hasClass("is-login");
7869
7870			createWishCopy(listCode, listName, listLogin);
7871		});
7872
7873		wishControls.find(".wl_controls-share").on("click", function(e) {
7874			e.preventDefault();
7875			var shareLink = $(this).data("url");
7876
7877			createWishShare(shareLink);
7878		});
7879
7880		$(".wl_note-manage").on("click", function(e) {
7881			e.preventDefault();
7882			var listCode = $(this).data("list");
7883			var listNote = $(this).data("note");
7884			var wishNote = $(this).data("code");
7885
7886			createWishNote(listCode, listNote, wishNote);
7887		});
7888	}
7889	// End Wish Lists
7890
7891	// Footer language and VAT
7892	if($("#footer_lang").length){
7893		$("#footer_lang").removeClass("fallback");
7894		$("#flang_selected").on("click",function(e){
7895			e.preventDefault();
7896			$("#footer_lang").toggleClass("active");
7897		});
7898	}
7899
7900	if ( $('#taxrate_check').length ) {
7901		createLangVatModal($(this),$('body').hasClass('file_not_found'));
7902	}
7903
7904
7905	// For gift cards page
7906	$('#gift_card_popover').popover();
7907
7908	// Used items popover
7909	$('#used_popover').popover();
7910
7911	// Don't show the pricing div if there's no price for the product
7912	var priceDiv = $('.desc_top-head-price').find('.afterpay-full_price').text();
7913	if (priceDiv.length == 0) {
7914		$('.desc_top-head-pricing').css({ 'display':'none' });
7915	}
7916
7917	// Don't show the product subtitle div if empty
7918	var subDiv = $('.desc_top-head').find('.desc_top-head-style').text();
7919	if (subDiv.length == 0) {
7920		$('.desc_top-head-style').css({ 'display':'none' });
7921	}
7922
7923	/******************* START OF Reviews Styling in Desc/DescPageTop/Cat Pages ***********************/
7924	if ($('#previous_comments').length) {
7925		$(this).find('.feedback_info').on('click', function(){
7926			$(this).popover('toggle');
7927		});
7928	}
7929
7930	//If statement to readjust the stars on descpagetop to their proper size
7931	if ($(".desc_top-head-reviews-container").length) {
7932		$(this).find('.stars-container').addClass('is-med')
7933	}
7934
7935	//If statement to trigger only when we are on a descpage
7936	if ($(".cust_reviews-main-container").length) {
7937		var parent_container = $(this).find(".agg-container");
7938		var form_container = $(".custreview_form");
7939		parent_container.append(form_container);
7940
7941		var resizeStars = function () {
7942			if ($(window).width() < 992) {
7943				$(".cust_reviews-comments").find('.stars-container.is-xlarge').removeClass('is-xlarge').addClass('is-large');
7944			} else {
7945				$(".cust_reviews-comments").find('.stars-container.is-large').removeClass('is-large').addClass('is-xlarge');
7946			}
7947		}
7948
7949		resizeStars()
7950
7951		$(window).on('resize', function() {
7952			resizeStars()
7953		})
7954	}
7955
7956	//If statement to trigger only when we are on a descpage AND there are reviews submitted
7957	if ($(".customer_reviews-container.check_read-inner").length) {
7958		var reviewsParent = $(".display-review-container");
7959		var filterByStar = $(this).find(".filter-by-star");
7960		var clearFilters = $(this).find(".clear-filters-button");
7961		var sortReviews = $(this).find("#sort-by");
7962		var filterReviews = $(this).find("#filter-by");
7963		var filterContainer = $(this).find(".show-filter-container");
7964		var showFilterValue = $(filterContainer).find(".filter-content-value");
7965		var fixedIncrement = 5;
7966		var allReviewsText = "All Star Reviews";
7967		var displayReviewCount = fixedIncrement;
7968		var pcode = $('.custreview_form').find('input[name=pcode]').val();
7969		
7970		function convertReviewTitlesToHeadings(context) {
7971			$(context).find('span.review-title').each(function() {
7972				var reviewTitle = $('<h3 />');
7973		
7974				$.each(this.attributes, function() {
7975					reviewTitle.attr(this.name, this.value);
7976				});
7977		
7978				reviewTitle.html($(this).html());
7979				$(this).replaceWith(reviewTitle);
7980			});
7981		}
7982		
7983		function wrapReviewCards() {
7984			reviewsParent.children('.single-review-container').each(function() {
7985				$(this).wrap('<div class="display-review-group" role="group" aria-label="review"></div>');
7986			});
7987		}
7988		
7989		convertReviewTitlesToHeadings(reviewsParent);
7990		wrapReviewCards();
7991		
7992		var reviewsArray = reviewsParent.children().toArray();
7993		var displayArray = reviewsArray;
7994
7995		//Function to replace the current display array with a new one
7996		function replaceChildrenFunction(reviewsParent) {
7997			var showMoreBtn = $(".customer_reviews.read_more-btn");
7998			if (displayReviewCount >= displayArray.length) {
7999				showMoreBtn.css("display", "none");
8000			} else if (showMoreBtn.css("display") === "none") {
8001				showMoreBtn.css("display", "block");
8002			}
8003			reviewsParent.empty();
8004			reviewsParent.append(displayArray.slice(0, displayReviewCount));
8005		}
8006
8007		//Compare function to sort by DESCENDING a given class name found in the review container
8008		function compareArrayFunction(a, b, class_str, objType) {
8009			var valueA = $(a).find(`.${class_str}`).text();
8010			var valueB = $(b).find(`.${class_str}`).text();
8011
8012			switch(objType) {
8013				case 'num':
8014					valueA = Number(valueA);
8015					valueB = Number(valueB);
8016					break;
8017				case 'date':
8018					valueA = new Date(valueA);
8019					valueB = new Date(valueB);
8020					break;
8021			}
8022
8023			if (valueA > valueB) {
8024				return -1;
8025			} else if (valueA < valueB) {
8026				return 1;
8027			} else {
8028				if (objType === 'date') {
8029					return compareArrayFunction(a, b, 'review-owner', '') * -1;	//Multiply by -1 to sort names from ascending order instead of descending
8030				} else if (!objType) {
8031					return 1;
8032				} else {
8033					return compareArrayFunction(a, b, 'date-submitted', 'date');
8034				}
8035			}
8036		}
8037
8038		//Sort by an option and replace the displayed reviews with the newly sorted one
8039		function sortArrayOptions(value) {
8040			switch (value) {
8041				case 'oldestDate':
8042					displayArray.sort(function(a,b) { return compareArrayFunction(a,b, 'date-submitted', 'date')}).reverse();
8043					break
8044				case 'highLowRating':
8045					displayArray.sort(function(a,b) { return compareArrayFunction(a,b, 'single-rating-value', 'num')});
8046					break
8047				case 'lowHighRating':
8048					displayArray.sort(function(a,b) { return compareArrayFunction(a,b, 'single-rating-value', 'num')}).reverse();
8049					break
8050				default:
8051					displayArray.sort(function(a,b) { return compareArrayFunction(a,b, 'date-submitted', 'date')});
8052			}
8053			replaceChildrenFunction(reviewsParent);
8054		}
8055
8056		//Function to filter the main array based on the value given (1 - 5 or empty string) and then sort it based on the sort value
8057		function filterSortArray() {
8058			function filterByHelper(rating) {
8059				if ($(rating).find(".single-rating-value").text() === value) {
8060					return true;
8061				} else {
8062					return false;
8063				}
8064			}
8065
8066			var value = filterReviews.val();
8067
8068			displayArray = value ? reviewsArray.filter(filterByHelper) : reviewsArray;
8069			sortArrayOptions(sortReviews.val());
8070		}
8071
8072		function resetFilters() {
8073			displayArray = reviewsArray;
8074			displayReviewCount = fixedIncrement;
8075			filterReviews.val('');
8076
8077			filterSortArray();
8078
8079			filterContainer.css("display", "none");
8080			showFilterValue.text(allReviewsText);
8081		}
8082
8083		clearFilters.on('click', function(e) {
8084			e.preventDefault();
8085			resetFilters();
8086		})
8087
8088		//Review Filtering by Graph Container
8089		filterByStar.on('click', function() {
8090			var value = $(this).text().trim();
8091			filterReviews.val(value[0]);
8092			filterSortArray();
8093			showFilterValue.text(value + " Reviews");
8094			filterContainer.css("display", "flex");
8095		})
8096
8097		//Review Filtering by Select Element
8098		filterReviews.on('change', function() {
8099			var value = $(this).val();
8100
8101			//Display filter container only if a valid value was selected
8102			if (value) {
8103				filterSortArray();
8104				filterContainer.css("display", "flex");
8105				showFilterValue.text(value + " Star Reviews");
8106			} else {
8107				resetFilters();
8108			}
8109		})
8110
8111		//Sorting by Select Element
8112		sortReviews.on('change', function() {
8113			filterSortArray();
8114		})
8115
8116		/*Read More button click event to do a customized showing of options
8117		 * On first click, there will be a "Show All Reviews" button instead of the standard "Read More"
8118		 * On the second click, it will just display all reviews and hide the button to show more reviews.
8119		*/
8120		$(".customer_reviews.read_more-btn").on('click', function(e) {
8121			e.preventDefault();
8122			const preShowMoreReviewCount = $('.display-review-group').length;	
8123			if ($(this).text() === 'Show All Reviews') {
8124				displayReviewCount = reviewsArray.length;
8125				$(this).css("display", "none");
8126			} else if (displayReviewCount === fixedIncrement) {
8127				if (displayReviewCount + fixedIncrement >= displayArray.length) {
8128					displayReviewCount = displayArray.length;
8129					$(this).css("display", "none");
8130				} else {
8131					displayReviewCount += fixedIncrement;
8132					$(this).text("Show All Reviews");
8133				}
8134			}
8135			filterSortArray();
8136			const showMoreReviewCount = $('.display-review-group').length;
8137			// focuses on the new first review of after "show more" is pressed. (ADA compliance)
8138			if ( preShowMoreReviewCount < showMoreReviewCount ) {
8139				const firstNewReview = $('.display-review-group').eq(preShowMoreReviewCount);
8140				firstNewReview.attr({'tabindex': '-1'});
8141				firstNewReview.focus();
8142			}
8143		})
8144
8145		// Ajax Request to retrieve all remaining reviews from the database for the product
8146		$.get({
8147			url: 'https://static.tenniswarehouse-europe.com/feedback/retrieve_feedback.php?pcode=' + pcode,
8148			success: function(results) {
8149				let jsonData = JSON.parse(results);
8150
8151				if (jsonData[0]) {
8152					reviewsParent.append($(jsonData[0].review_markup));
8153					convertReviewTitlesToHeadings(reviewsParent);
8154					wrapReviewCards();
8155					reviewsArray = reviewsParent.children().toArray();
8156					displayArray = reviewsArray;
8157				}
8158
8159				sortArrayOptions();
8160			}
8161		});
8162	}
8163	/******************* END OF Reviews Styling in Desc/DescPageTop/Cat Pages ***********************/
8164
8165	/** Large Image Video Controls **/
8166	if ($('.pause_vid-js').length) {
8167		$('.pause_vid-js').each(function() {
8168			var vidPauseBtn = $(this);
8169		
8170			var targetSelector = vidPauseBtn.attr('data-target');
8171			var vidEles;
8172	
8173			// If data-target exists (grid component)
8174			if (targetSelector && $(targetSelector).length) {
8175				vidEles = $(targetSelector);
8176			} else {
8177				// Fallback for components without data-target
8178				vidEles = vidPauseBtn.closest('.banner-block__container--single').find('video');
8179				
8180				// for older imageblock components(status: DEPRECATED )
8181				if (!vidEles.length) {
8182					vidEles = vidPauseBtn.prev().find('div video');
8183				}
8184				
8185			};
8186			var pausedByUser = false;
8187
8188			var vidActions = function(e) {
8189				if ((typeof(e.data) !== 'undefined' && e.data !== null) && e.data.fromBtn) {
8190					e.preventDefault();
8191				}
8192
8193				vidEles.each(function() {
8194					if (this.offsetParent === null) {
8195						if (!this.paused) {
8196							this.pause();
8197						}
8198					} else {
8199						if ((typeof(e.data) !== 'undefined' && e.data !== null) && e.data.fromBtn) {
8200							if (this.paused) {
8201								pausedByUser = false;
8202								this.play();
8203							} else {
8204								pausedByUser = true;
8205								this.pause();
8206							}
8207						} else {
8208							if (!pausedByUser) {
8209								this.play();
8210							}
8211						}
8212					}
8213				});
8214			}
8215
8216			var vidActionsThrottled = utilities.throttle(vidActions, 50);
8217
8218			vidEles.each(function() {
8219				this.onplaying = function() {
8220					if (this.offsetParent !== null) {
8221						vidPauseBtn.find('.icon').removeClass('icon-play').addClass('icon-pause');
8222						vidPauseBtn.attr("aria-label", "pause");
8223					}
8224				}
8225
8226				this.onpause = function() {
8227					if (this.offsetParent !== null) {
8228						vidPauseBtn.find('.icon').removeClass('icon-pause').addClass('icon-play');
8229						vidPauseBtn.attr("aria-label", "play");
8230					}
8231				}
8232
8233				if (this.offsetParent !== null) {
8234					this.play();
8235				}
8236			});
8237
8238			vidPauseBtn.on('click', {"fromBtn": true}, vidActions);
8239
8240			$(window).on('resize', vidActionsThrottled);
8241		});
8242	}
8243
8244
8245	/* Normalize product description tables - OLD FUNCTION (CAN REMOVE) - NEW FUNCTION BELOW */
8246	/*
8247	if ($('#product_overview').length) {
8248		if ($('table').length) {
8249			$('table').removeAttr('border width style height cellspacing cellpadding');
8250			$('table td').removeAttr('class align style');
8251			$('table span').removeAttr('class style');
8252			$('table').attr('class', 'table');
8253			$( ".table" ).wrap( "<div class='table-responsive'></div>" );
8254		}
8255	}
8256	*/
8257
8258	/* Normalize product description tables */
8259	$('#product_overview table').each(function(){
8260		var table = $(this);
8261		table.removeAttr('border width style height cellspacing cellpadding');
8262		table.attr('class', 'table');
8263		table.wrap("<div class='table-responsive'></div>");
8264		table.find('td').removeAttr('class align style');
8265		table.find('span').removeAttr('class style');
8266	});
8267
8268	/* Normalize catpage header tables */
8269	$('.header-container__content table').each(function(){
8270		var table = $(this);
8271		table.removeAttr('border width style height cellspacing cellpadding');
8272		table.attr('class', 'table');
8273		table.wrap("<div class='table-responsive'></div>");
8274		table.find('td').removeAttr('class align style');
8275		table.find('span').removeAttr('class style');
8276	});
8277
8278	/*=============================================================================
8279	Swiper Carousel
8280	=============================================================================*/
8281	var i = 1;
8282	var str1 = 'swiper_'
8283	var str2 = '.swiper_';
8284
8285	/* Loop through the carousels on the page */
8286	$('.swiper').each(function (index,value) {
8287
8288		/* Determine what type of carousel it is */
8289		var isPro = false; var isArticle = false; var isVideo = false; var isProfile = false; var isMdCategory = false; var isLgCategory = false;
8290		var isCollection = false; var isPromo = false; var isGearGuides = false; var isRotator = false; var isSitewide = false; var isSingleWide = false;
8291
8292		if ($(this).hasClass('carousel__pros')) {
8293			isPro = true;
8294		}
8295		if ($(this).hasClass('article')) {
8296			isArticle = true;
8297		}
8298		if ($(this).hasClass('video')) {
8299			isVideo = true;
8300		}
8301		if ($(this).hasClass('lg-cards')) {
8302			isLgCategory = true;
8303		}
8304		if ($(this).hasClass('md-cards')) {
8305			isMdCategory = true;
8306		}
8307		if ($(this).hasClass('collection')) {
8308			isCollection = true;
8309		}
8310		if ($(this).hasClass('promo')) {
8311			isPromo = true;
8312		}
8313		if ($(this).hasClass('gear-guides')) {
8314			isGearGuides = true;
8315		}
8316		if ($(this).hasClass('sitewide-drawer__cards')) {
8317			isSitewide = true;
8318		}
8319		if ($(this).hasClass('single-wide')) {
8320			isSingleWide = true;
8321		}
8322
8323		/* Set the carousel identifiers */
8324		var classAdd = str1 + i;
8325		var classCall = str2 + i;
8326		var next_slider = 'slider-next' + i;
8327		var prev_slider = 'slider-prev' + i;
8328		var scrollbar = 'scrollbar' + i;
8329
8330		/* Slides Per View & Slides Per Group for the various breakpoints */
8331
8332		/* Default */
8333		var spv320 = 2;
8334		var spg320 = 2;
8335		var spv480 = 2;
8336		var spg480 = 2;
8337		var spv576 = 2;
8338		var spg576 = 2;
8339		var spv768 = 3;
8340		var spg768 = 3;
8341		var spv992 = 4;
8342		var spg992 = 4;
8343		var spv1200 = 4;
8344		var spg1200 = 4;
8345
8346		/* Pro Carousels */
8347		if (isPro) {
8348			var spv320 = 2;
8349			var spg320 = 2;
8350			var spv480 = 3;
8351			var spg480 = 3;
8352			var spv576 = 3;
8353			var spg576 = 3;
8354			var spv768 = 4;
8355			var spg768 = 4;
8356			var spv992 = 6;
8357			var spg992 = 6;
8358			var spv1200 = 6;
8359			var spg1200 = 6;
8360		}
8361
8362		/* Article Carousels */
8363		if (isArticle) {
8364			var spv320 = 1;
8365			var spg320 = 1;
8366			var spv480 = 2;
8367			var spg480 = 2;
8368			var spv576 = 2;
8369			var spg576 = 2;
8370			var spv768 = 3;
8371			var spg768 = 3;
8372			var spv992 = 3;
8373			var spg992 = 3;
8374			var spv1200 = 3;
8375			var spg1200 = 3;
8376		}
8377
8378		/* Video Carousels */
8379		if (isVideo) {
8380			var spv320 = 1;
8381			var spg320 = 1;
8382			var spv480 = 1;
8383			var spg480 = 1;
8384			var spv576 = 1;
8385			var spg576 = 1;
8386			var spv768 = 2;
8387			var spg768 = 2;
8388			var spv992 = 2;
8389			var spg992 = 2;
8390			var spv1200 = 2;
8391			var spg1200 = 2;
8392		}
8393
8394		/* Large Category Cards & Promo Cards */
8395		if ((isLgCategory) || (isPromo)) {
8396			var spv320 = 1;
8397			var spg320 = 1;
8398			var spv480 = 2;
8399			var spg480 = 2;
8400			var spv576 = 2;
8401			var spg576 = 2;
8402			var spv768 = 3;
8403			var spg768 = 3;
8404			var spv992 = 4;
8405			var spg992 = 4;
8406			var spv1200 = 4;
8407			var spg1200 = 4;
8408		}
8409
8410		/* Medium Category Cards */
8411		if (isMdCategory) {
8412			var spv320 = 2;
8413			var spg320 = 2;
8414			var spv480 = 3;
8415			var spg480 = 3;
8416			var spv576 = 3;
8417			var spg576 = 3;
8418			var spv768 = 4;
8419			var spg768 = 4;
8420			var spv992 = 6;
8421			var spg992 = 6;
8422			var spv1200 = 6;
8423			var spg1200 = 6;
8424		}
8425
8426		/* Collection Cards */
8427		if (isCollection) {
8428			var spv320 = 1;
8429			var spg320 = 1;
8430			var spv480 = 1;
8431			var spg480 = 1;
8432			var spv576 = 2;
8433			var spg576 = 2;
8434			var spv768 = 2;
8435			var spg768 = 2;
8436			var spv992 = 3;
8437			var spg992 = 3;
8438			var spv1200 = 3;
8439			var spg1200 = 3;
8440		}
8441
8442		/* Gear Guides */
8443		if (isGearGuides) {
8444			var spv320 = 2;
8445			var spg320 = 2;
8446			var spv480 = 2;
8447			var spg480 = 2;
8448			var spv576 = 2;
8449			var spg576 = 2;
8450			var spv768 = 3;
8451			var spg768 = 3;
8452			var spv992 = 4;
8453			var spg992 = 4;
8454			var spv1200 = 4;
8455			var spg1200 = 4;
8456		}
8457
8458		/* Sitewide Drawer */
8459		if (isSitewide) {
8460			var spv320 = 2;
8461			var spg320 = 2;
8462			var spv480 = 2;
8463			var spg480 = 2;
8464			var spv576 = 2;
8465			var spg576 = 2;
8466			var spv768 = 3;
8467			var spg768 = 3;
8468			var spv992 = 4;
8469			var spg992 = 4;
8470			var spv1200 = 6;
8471			var spg1200 = 6;
8472		}
8473
8474		/* Single-Wide (Content Builder For Now) */
8475		if (isSingleWide) {
8476			var spv320 = 1;
8477			var spg320 = 1;
8478			var spv480 = 1;
8479			var spg480 = 1;
8480			var spv576 = 1;
8481			var spg576 = 1;
8482			var spv768 = 1;
8483			var spg768 = 1;
8484			var spv992 = 1;
8485			var spg992 = 1;
8486			var spv1200 = 1;
8487			var spg1200 = 1;
8488		}
8489
8490		/* Add carousel control classes */
8491		$(this).addClass(classAdd);
8492		$(this).parent().find(".swiper-button-prev").addClass(prev_slider);
8493		$(this).parent().find(".swiper-button-next").addClass(next_slider);
8494		$(this).parent().find(".swiper-scrollbar").addClass(scrollbar);
8495
8496		/* Initialize each carousel */
8497		if (isSitewide) {
8498		new Swiper(classCall,{
8499			slidesPerView: 'auto',
8500			spaceBetween: 24,
8501			direction: 'horizontal',
8502			centerInsufficientSlides: true,
8503			createElements: true,
8504			navigation: {
8505				nextEl: ('.' + next_slider),
8506				prevEl: ('.' + prev_slider),
8507			},
8508			scrollbar: {
8509				el: ('.' + scrollbar),
8510				hide: false,
8511				draggable: true,
8512				snapOnRelease: true
8513			},
8514			a11y: {
8515				enabled: true,
8516				id: 'Carousel' + i,
8517				containerMessage: 'Slide carousel',
8518			},
8519			on: {
8520				lock: function () {
8521					var navwrap = this.el.querySelectorAll('.s-controls_wrapper');
8522					$(navwrap).css('display', 'none');
8523				},
8524				unlock: function () {
8525					var navwrap = this.el.querySelectorAll('.s-controls_wrapper');
8526					$(navwrap).css('display', 'flex');
8527				}
8528			}
8529		});
8530	} else {
8531		new Swiper(classCall,{
8532			slidesPerView: spv992,
8533			slidesPerGroup: spg992,
8534			spaceBetween: 24,
8535			direction: 'horizontal',
8536			loop: false,
8537			createElements: true,
8538			/*centerInsufficientSlides: true,*/
8539			/*mousewheel: true,*/
8540			navigation: {
8541				nextEl: ('.' + next_slider),
8542				prevEl: ('.' + prev_slider),
8543			},
8544			scrollbar: {
8545				el: ('.' + scrollbar),
8546				hide: false,
8547				draggable: true,
8548				snapOnRelease: true
8549			},
8550			breakpoints: {
8551				320: {
8552					slidesPerView: spv320,
8553					slidesPerGroup: spg320
8554				},
8555				480: {
8556					slidesPerView: spv480,
8557					slidesPerGroup: spg480
8558				},
8559				576: {
8560					slidesPerView: spv576,
8561					slidesPerGroup: spg576
8562				},
8563				768: {
8564					slidesPerView: spv768,
8565					slidesPerGroup: spg768
8566				},
8567				992: {
8568					slidesPerView: spv992,
8569					slidesPerGroup: spg992
8570				},
8571				1200: {
8572					slidesPerView: spv1200,
8573					slidesPerGroup: spg1200
8574				},
8575			},
8576			a11y: {
8577				enabled: true,
8578				id: 'Carousel' + i,
8579				containerMessage: 'Slide carousel',
8580			},
8581			on: {
8582				lock: function () {
8583					var navwrap = this.el.querySelectorAll('.s-controls_wrapper');
8584					$(navwrap).css('display', 'none');
8585				},
8586				unlock: function () {
8587					var navwrap = this.el.querySelectorAll('.s-controls_wrapper');
8588					$(navwrap).css('display', 'flex');
8589				}
8590			}
8591		});
8592	}
8593	i++;
8594
8595	});
8596
8597});
8598// End Document Ready

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.