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">▾</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ésultats de la recherche",it:"Risultati della ricerca"},I={en:"Selected Options",de:"Ausgewählte Optionen", 50es:"Opciones seleccionadas",fr:"Options sélectionnées",it:"Opzioni selezionate"},ia={en:"Clear All",de:"Alles löschen",es:"Borrar todo",fr:"Tout effacer",it:"Elimina"},ja={en:"Searching...",de:"wird gesucht…",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ésultats trouvés",it:"0 risultati trovati"},Z={en:"Page ",de:"Seite ",es:"Página ",fr:"Page ",it:"Pagina "},S={en:" of ",de:" von ",es:" de ",fr:" sur ",it:" di "},ma={en:" for ",de:" fü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 è 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+" € - "+r.max+" €)")});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()+" € - "+v.val()+' €<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+" € - "+B.max+" €)");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 à 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 à 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ás bajo a má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öchsten Preis",es:"Ordenar por precio: de más alto a más bajo",fr:"Trier par prix dé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)+"€")}}}
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+" €</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(".",",")+" €</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(".",",")+" €</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(".",",")+" €</span> fü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(".",",")+" €</span> pour béné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(".",",")+" €</span> para el envío gratuito.*",it:'Ti mancano € <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">¡Te lo enviamos gratis!</div>',it:'<div class="dynamic_cart-cart-ship-note">La spedizione è 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ículos"}[e.currentLang]:{en:"Item",de:"Artikel",fr:"article",it:"prodotti",es:"artículo"}[e.currentLang])+' - <span class="dynamic_cart-subtotal">Subtotal: <span class="dynamic_cart-subtotal-amt">'+s.toFixed(2).replace(".",",")+" €</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(".",",")+" €</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(".",",")+" €</span> fü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(".",",")+" €</span> pour béné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(".",",")+" €</span> para el envío gratuito.*",it:'Ti mancano € <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">¡Te lo enviamos gratis!</div>',it:'<div class="dynamic_cart-cart-ship-note">La spedizione è 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":"")+' - <span class="dynamic_cart-subtotal">Subtotal: <span class="dynamic_cart-subtotal-amt">'+e.cartSubtotal.toFixed(2).replace(".",",")+" €</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é 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ügen",fr:"Ajouter "+t.name,es:"Añ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ügen",fr:"Ajouter",es:"Añ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(".",",")+" €</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ügen",fr:"Ajouter "+t.name,es:"Añ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ügen",fr:"Ajouter",es:"Añ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?" € - "+t.priceHigh.replace(".",",")+" €":" €</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ügen",fr:"Ajouter "+t.name,es:"Añ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ügen",fr:"Ajouter",es:"Añ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?" € - "+t.priceHigh.replace(".",",")+" €":" €</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ück zur Bestellung",fr:"Revenir à 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élection",es:"Selecció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é 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)+" €")}}),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ür dieses Produkt",fr:"Produits complé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ägung ziehen",fr:"Vous aimerez sûrement aussi",es:"Tambié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ür Tennisfans",fr:"Ajoutez un peu de fantaisie à votre panier",es:"¡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ügt!",fr:"Ajouté au panier !",es:"¡Se ha añadido el artículo!",it:"Il prodotto è 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á vacía",it:"Il carrello è 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 à votre panier.",es:"Continúa tus compras añ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é 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ß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évr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","dé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ü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égé par reCAPTCHA. Les <a class="text-link" href="https://policies.google.com/privacy">règles de confidentialité</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 è 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á protegida por reCAPTCHA y se aplican los <a class="text-link" href="https://policies.google.com/terms">Términos y Condiciones</a> y la <a class="text-link" href="https://policies.google.com/privacy">Polí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ß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é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ügbarkeits-Alarm!', 889 fr: 'Alerte disponibilité', 890 es: 'Aviso de disponibilidad', 891 it: 'Notifica disponibilità' 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é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° Ansicht', 985 fr: 'Vue à 360°', 986 es: 'Vista 360 °', 987 it: 'Vista a 360°' 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('.', ',') + "€"; 1336 } 1337 else 1338 { 1339 list_text = min_list.toFixed(2).replace('.', ',') + "€ - " + max_list.toFixed(2).replace('.', ',') + "€"; 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 é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 économisez : jusqu’à ", 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('.', ',') + " €"; 1448 } 1449 else 1450 { 1451 list_text = data.min_list_price.toFixed(2).replace('.', ',') + " € - " + data.max_list_price.toFixed(2).replace('.', ',') + " €"; 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('.', ',') + ' € </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('.', ',') + ' € </span>'; 1467 } 1468 else 1469 { 1470 markup_string += '<span class="is-sale">' + saveText[utilities.pageLang().getLang()] + data.min_savings.toFixed(2).replace('.', ',') + ' € - ' + data.max_savings.toFixed(2).replace('.', ',') + ' €</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ás", fr : "Lire plus", it : "Scopri di più" }; 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í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ña', 1653 it: 'Password' 1654 }; 1655 var forgotText = { 1656 en: 'Forgot Password?', 1657 de: 'Passwort vergessen?', 1658 fr: 'Mot de passe oublié ?', 1659 es: '¿Has olvidado tu contraseñ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ó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: '¿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ährend des Bestellvorgangs oder bei deiner nächsten Bestellung ein Konto erstellen.', 1686 fr: 'Vouz pourrez cré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ó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é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 à 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éconnecter', 1959 it: 'Clicca qui per uscire', 1960 es: 'Haz clic aquí para desconectarte.' 1961 }; 1962 var modalTitleText = { 1963 en: 'Account Logout', 1964 de: 'Konto-Logout', 1965 fr: 'Déconnexion', 1966 it: 'Esci dall\'account', 1967 es: 'Iniciar sesió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á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 êtes abonné(e) à la newsletter', 2034 it: 'Ti sei iscritto alla newsletter', 2035 es: 'Lista en la que estás registrado' 2036 }; 2037 var listsJoinedText = { 2038 en: 'Lists Joined', 2039 de: 'Den Listen beigetreten', 2040 fr: 'Vous êtes abonné(e) aux newsletters', 2041 it: 'Ti sei iscritto alle newsletter', 2042 es: 'Listas en las que está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ück zu Total Pickleball', 2062 fr: 'Retour à 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ème est survenu.', 2070 it: 'Ops! Si è 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ürs Anmelden!', 2076 fr: 'Merci pour votre abonnement !', 2077 it: 'Ti ringraziamo per esserti iscritto!', 2078 es: '¡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ügt.', 2083 fr: 'Votre adresse e-mail a bien été ajoutée à notre liste.', 2084 it: 'Il tuo indirizzo email è
2084 stato aggiunto al nostro sistema.', 2085 es: 'Hemos añadido tu direcció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: '¡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îchir la page et de réessayer.', 2098 it: 'Siamo spiacenti. Si è 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á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 êtes actuellement abonné aux newsletters suivantes. Veuillez sélectionner celles que vous souhaitez ne plus recevoir et cliquer sur "se désabonner" pour ne plus recevoir ces newsletters.", 2156 de: "Du bist derzeit für die folgenden Newsletter angemeldet. Bitte wähle die Newsletter aus, die du nicht mehr erhalten möchtest und klicke auf "Abmelden", 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á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ß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é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'êtes actuellement abonné à 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á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á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ème est survenu.', 2307 it: 'Ops! Si è 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 été désinscrit(e) avec succès.', 2314 it: 'Hai annullato la tua iscrizione.', 2315 es: 'Has eliminado tu suscripció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îchir la page et de réessayer.', 2321 it: 'Siamo spiacenti. Si è 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á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ücksetzen', 2371 fr: 'Mot de passe réinitialisé', 2372 it: 'Reimposta la Password', 2373 es: 'Restablecimiento de contraseñ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üpfte E-Mail-Adresse ein und ein temporäres Passwort wird an deinen Posteingang gesendet.', 2378 fr: 'Entrez l\'adresse e-mail associée à votre compte et un mot de passe temporaire vous sera envoyé par e-mail.', 2379 it: 'Inserisci l\'indirizzo email associato al tuo account e ti sarà inviata una password temporanea per email.', 2380 es: 'Escribe la dirección de correo electrónico asociada a tu cuenta y te mandaremos una contraseñ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ünglichen Verkaufspreis. Es ist jedoch mö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é ('PPC') ou le prix de vente d'origine. Toutefois, il est possible que le ou les articles n'ait/n'aient pas été proposé(s) à 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 è possibile che non sia stato applicato uno sconto.", 2447 es: "Las comparaciones de precios se basan en el Precio Recomendado de Venta al Pú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é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öchtest du diese Wunschliste wirklich löschen? Dies kann nicht rückgängig gemacht werden.', 2668 fr: 'Êtes-vous sûr(e) de vouloir supprimer cette liste ? Cette action est irréversible.', 2669 it: 'Sei sicuro/a di voler eliminare questa lista? Questa azione è irreversibile.', 2670 es: '¿Seguro que quieres eliminar esta lista? Esta acció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ätigen', 2682 fr: 'Confirmer', 2683 it: 'Confermo', 2684 es: 'Confirmar' 2685 }; 2686 var modalTitleText = { 2687 en: 'Confirm Delete', 2688 de: 'Löschvorgang bestä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ügen', 2913 fr: 'Ajouter une note', 2914 it: 'Aggiungi una nota', 2915 es: 'Añadir nota' 2916 }; 2917 var deleteText = { 2918 en: 'Delete', 2919 de: 'Lö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ß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ß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ügen', 3014 fr: 'Ajouter l\'article à ma liste de souhaits', 3015 it: 'Aggiungi questo prodotto alla lista dei desideri', 3016 es: 'Añadir artículo a la lista' 3017 }; 3018 var addToListText = { 3019 en: 'Add to List', 3020 de: 'Zur Liste hinzufügen', 3021 fr: 'Ajouter à la liste', 3022 it: 'Aggiungi alla lista', 3023 es: 'Añ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ß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ä
3277llt 36 Stunden nach der Erstellung.', 3278 fr: 'Remarque : ce lien expirera 36 heures après sa cré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ó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ème est survenu.', 3444 it: 'Ops! Si è 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ß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ú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édiger un titre', 3532 it: 'Inserire un titolo', 3533 es: 'Escribe un tí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édiger votre avis', 3539 it: 'Inserire la recensione', 3540 es: 'Escribe tu reseña' 3541 }; 3542 var stateErrorText = { 3543 en: 'Please enter a valid city/province in the box above', 3544 de: 'Bitte gebe eine gültige Stadt/Provinz ein', 3545 fr: 'Veuillez saisir une ville/province valide', 3546 it: 'Ti preghiamo di inserire una città/provincia valida', 3547 es: 'Por favor, introduce una abreviatura válida del paí
3547s/provincia arriba. ' 3548 }; 3549 var closeText = { 3550 en: 'Close', 3551 de: 'Schließ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ó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ß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élection', 3754 it: 'Selezioni', 3755 es: 'Selecció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çais</option><option value="de">Deutsch</option><option value="it">Italiano</option><option value="es">Españ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 & 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ür den angegebenen Standort wurden keine Versandoptionen gefunden. Bitte überprüfe die eingegebenen Daten und versuche es erneut.', 4077 fr: 'Nous sommes désolés. Aucune option d\'envoi n\'a été trouvée pour le lieu renseigné. Merci de vérifier les données renseignées et de ré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í
4079o para la localidad seleccionada. Por favor, comprueba que todo es correcto e inténtalo otra vez.' 4080 }; 4081 var rows = $(contents).find(".list-group-item").length; 4082 if(rows !== 0){ 4083 contents = contents.split("0,00€").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ésolés. Votre demande n\'a pu être traitée. Merci de réessayer dans quelques instants.', 4094 it: 'Siamo spiacenti. La tua richiesta non è andato a buon fine. Ti preghiamo di riprovare più tardi.', 4095 es: 'No hemos podido procesar tu solicitud. Por favor, inténtalo de nuevo má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ín", fr : "Min", it : "Min" }; 5117 var max_text = { en : "Max", de : "Max", es : "Má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 ] + " € - " + ui.values[ 1 ] + " €<\/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] + " € - " + ui.values[1] + " €"); 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 + " € - " + initialmax + " €<\/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á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 + "€ - " + options.max + "€)"); 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ías", fr : "Caté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('.', ',') + '€' : ''); 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ü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ó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í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î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ó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ä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ä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ähle eines unserer empfohlenen Besaitungs-Sets aus.", 6611 "fr": "Vous n'êtes pas sûr de ce dont vous avez besoin? Choisissez l'un nos cordages recommandés.", 6612 "es": "¿No estás seguro/a de qué 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ä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ähle die Längs- und Quersaiten aus. Für mehr Balance, Power, Spin oder Kontrolle.", 6634 "fr": "Choisissez le cordage pour les montants puis celui pour les travers. Vous procure davantage d'équilibre, de puissance, d'effets ou de contrô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ÄNGSAITE AUSWÄ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Ä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ählen", 6658 "fr": "Sélectionner la chaîne", 6659 "es": "Seleccionar cadena", 6660 "it": "Seleziona le corde" 6661 }; 6662 const selectOverGripText = { 6663 "en": "Select Overgrip", 6664 "de": "Overgrip auswä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äger mit aufgebrachtem Overgrip können nicht zurückgegeben werden. Geöffnete Overgrip-Packungen können nicht zurückgegeben werden.", 6681 "fr": "Les raquettes avec surgrip posé ne peuvent pas être renvoyées. Les emballages de grips ouverts ne peuvent pas être retournés.", 6682 "es": "Las raquetas con overgrip añ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ñ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’apposition de logo", 6705 "es": "Servicio de personalizació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öffnet und auf den Schläger aufgebracht", 6712 "fr": "Ouverture et pose du grip sur la raquette", 6713 "es": "El grip se abrirá para colocarlo en la raqueta", 6714 "it": "L'overgrip verrà aperto e applicato alla racchetta." 6715 }; 6716 6717 const strungText = { 6718 "en": "Strung", 6719 "fr": "Cordée", 6720 "de": "Besaitet", 6721 "es": "Encordada", 6722 "it": "Incordata" 6723 }; 6724 6725 const unstrungText = { 6726 "en": "Unstrung", 6727 "fr": "Non cordé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é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Ó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 élé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é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) + "€"; 7574 if (myArray[0] !== myArray[lastIndex]) { 7575 returnStr += " - " + myArray[lastIndex].toFixed(2) + "€"; 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('.', ',') + " €"); 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ärung zu</a>.', 7768 fr: 'Nous utilisons les cookies afin de vous assurer la meilleure expérience d\'achat possible. En utilisant notre site web, vous acceptez notre <a href="https://www.tenniswarehouse-europe.com/privacy.html">politique de confidentialité</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í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ärung zustimmen', 7782 fr: 'J\'accepte la politique de confidentialitÂŽ', 7783 it: 'Accetta l\'Informativa sulla Privacy', 7784 es: 'Acepto la polí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.