PageSourceSearch

https://www.cribgochoutdoor.com/citr-misc.js?version=2026-10-7-11-18-40

js cribgochoutdoor.com collected 2026-10-09 18:23:20 UTC 618,845 bytes, 10,021 lines download raw bytes

vendor: 31,908 bytes, line 1
1(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}}
vendor: 8,383 bytes, lines 1-2
1,b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
2return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);
vendor: 19,658 bytes, line 2
2if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],
vendor: 4,923 bytes, lines 2-3
2!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
3}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});
vendor: 27,641 bytes, line 3
3var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
vendor: 3,636 bytes, lines 3-6
3
4/*! modernizr 3.6.0 (Custom Build) | MIT *
5 * https://modernizr.com/download/?-cssgrid_cssgridlegacy-flexbox-flexboxlegacy-flexboxtweener-addtest-atrule-domprefixes-hasevent-mq-prefixed-prefixedcss-prefixedcssvalue-prefixes-printshiv-setclasses-testallprops-testprop-teststyles-cssclassprefix: modernizr- !*/
6!function(e,t,n){function r(e,t){return typeof e===t}function o(){var e,t,n,o,i,a,s;for(var l in b)if(b.hasOwnProperty(l)){if(e=[],t=b[l],t.name&&(e.push(t.name.toLowerCase()),t.options&&t.options.aliases&&t.options.aliases.length))for(n=0;n<t.options.aliases.length;n++)e.push(t.options.aliases[n].toLowerCase());for(o=r(t.fn,"function")?t.fn():t.fn,i=0;i<e.length;i++)a=e[i],s=a.split("."),1===s.length?Modernizr[s[0]]=o:(!Modernizr[s[0]]||Modernizr[s[0]]instanceof Boolean||(Modernizr[s[0]]=new Boolean(Modernizr[s[0]])),Modernizr[s[0]][s[1]]=o),x.push((o?"":"no-")+s.join("-"))}}function i(e){var t=_.className,n=Modernizr._config.classPrefix||"";if(w&&(t=t.baseVal),Modernizr._config.enableJSClass){var r=new RegExp("(^|\\s)"+n+"no-js(\\s|$)");t=t.replace(r,"$1"+n+"js$2")}Modernizr._config.enableClasses&&(t+=" "+n+e.join(" "+n),w?_.className.baseVal=t:_.className=t)}function a(e,t){if("object"==typeof e)for(var n in e)j(e,n)&&a(n,e[n]);else{e=e.toLowerCase();var r=e.split("."),o=Modernizr[r[0]];if(2==r.length&&(o=o[r[1]]),"undefined"!=typeof o)return Modernizr;t="function"==typeof t?t():t,1==r.length?Modernizr[r[0]]=t:(!Modernizr[r[0]]||Modernizr[r[0]]instanceof Boolean||(Modernizr[r[0]]=new Boolean(Modernizr[r[0]])),Modernizr[r[0]][r[1]]=t),i([(t&&0!=t?"":"no-")+r.join("-")]),Modernizr._trigger(e,t)}return Modernizr}function s(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):w?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}function l(e){return e.replace(/([a-z])-([a-z])/g,function(e,t,n){return t+n.toUpperCase()}).replace(/^-/,"")}function u(e){return e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLowerCase()}).replace(/^ms-/,"-ms-")}function f(){var e=t.body;return e||(e=s(w?"svg":"body"),e.fake=!0),e}function c(e,n,r,o){var i,a,l,u,c="modernizr",d=s("div"),p=f();if(parseInt(r,10))for(;r--;)l=s("div"),l.id=o?o[r]:c+(r+1),d.appendChild(l);return i=s("style"),i.type="text/css",i.id="s"+c,(p.fake?p:d).appendChild(i),p.appendChild(d),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(t.createTextNode(e)),d.id=c,p.fake&&(p.style.background="",p.style.overflow="hidden",u=_.style.overflow,_.style.overflow="hidden",_.appendChild(p)),a=n(d,e),p.fake?(p.parentNode.removeChild(p),_.style.overflow=u,_.offsetHeight):d.parentNode.removeChild(d),!!a}function d(e,t){return!!~(""+e).indexOf(t)}function p(e,t){return function(){return e.apply(t,arguments)}}function m(e,t,n){var o;for(var i in e)if(e[i]in t)return n===!1?e[i]:(o=t[e[i]],r(o,"function")?p(o,n||t):o);return!1}function h(t,n,r){var o;if("getComputedStyle"in e){o=getComputedStyle.call(e,t,n);var i=e.console;if(null!==o)r&&(o=o.getPropertyValue(r));else if(i){var a=i.error?"error":"log";i[a].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else o=!n&&t.currentStyle&&t.currentStyle[r];return o}function v(t,r){var o=t.length;if("CSS"in e&&"supports"in e.CSS){for(;o--;)if(e.CSS.supports(u(t[o]),r))return!0;return!1}if("CSSSupportsRule"in e){for(var i=[];o--;)i.push("("+u(t[o])+":"+r+")");return i=i.join(" or "),c("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"==h(e,null,"position")})}return n}function g(e,t,o,i){function a(){f&&(delete L.style,delete L.modElem)}
6if(i=r(i,"undefined")?!1:i,!r(o,"undefined")){var u=v(e,o);if(!r(u,"undefined"))return u}for(var f,c,p,m,h,g=["modernizr","tspan","samp"];!L.style&&g.length;)f=!0,L.modElem=s(g.shift()),L.style=L.modElem.style;for(p=e.length,c=0;p>c;c++)if(m=e[c],h=L.style[m],d(m,"-")&&(m=l(m)),L.style[m]!==n){if(i||r(o,"undefined"))return a(),"pfx"==t?m:!0;try{L.style[m]=o}catch(y){}if(L.style[m]!=h)return a(),"pfx"==t?m:!0}return a(),!1}function y(e,t,n,o,i){var a=e.charAt(0).toUpperCase()+e.slice(1),s=(e+" "+P.join(a+" ")+a).split(" ");return r(t,"string")||r(t,"undefined")?g(s,t,o,i):(s=(e+" "+N.join(a+" ")+a).split(" "),m(s,t,n))}function S(e,t,r){return y(e,n,n,t,r)}var x=[],b=[],C={_version:"3.6.0",_config:{classPrefix:" modernizr-",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,t){var n=this;setTimeout(function(){t(n[e])},0)},addTest:function(e,t,n){b.push({name:e,fn:t,options:n})},addAsyncTest:function(e){b.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=C,Modernizr=new Modernizr;var E=C._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];C._prefixes=E;var _=t.documentElement,w="svg"===_.nodeName.toLowerCase();w||!function(e,t){function n(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x<style>"+t+"</style>",r.insertBefore(n.lastChild,r.firstChild)}function r(){var e=_.elements;return"string"==typeof e?e.split(" "):e}function o(e,t){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof e&&(e=e.join(" ")),_.elements=n+" "+e,u(t)}function i(e){var t=E[e[b]];return t||(t={},C++,e[b]=C,E[C]=t),t}function a(e,n,r){if(n||(n=t),v)return n.createElement(e);r||(r=i(n));var o;return o=r.cache[e]?r.cache[e].cloneNode():x.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e),!o.canHaveChildren||S.test(e)||o.tagUrn?o:r.frag.appendChild(o)}function s(e,n){if(e||(e=t),v)return e.createDocumentFragment();n=n||i(e);for(var o=n.frag.cloneNode(),a=0,s=r(),l=s.length;l>a;a++)o.createElement(s[a]);return o}function l(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return _.shivMethods?a(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'})+");return n}")(_,t.frag)}function u(e){e||(e=t);var r=i(e);return!_.shivCSS||h||r.hasCSS||(r.hasCSS=!!n(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),v||l(e,r),e}function f(e){for(var t,n=e.getElementsByTagName("*"),o=n.length,i=RegExp("^(?:"+r().join("|")+")$","i"),a=[];o--;)t=n[o],i.test(t.nodeName)&&a.push(t.applyElement(c(t)));return a}function c(e){for(var t,n=e.attributes,r=n.length,o=e.ownerDocument.createElement(T+":"+e.nodeName);r--;)t=n[r],t.specified&&o.setAttribute(t.nodeName,t.nodeValue);return o.style.cssText=e.style.cssText,o}function d(e){for(var t,n=e.split("{"),o=n.length,i=RegExp("(^|[\\s,>+~])("+r().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),a="$1"+T+"\\:$2";o--;)t=n[o]=n[o].split("}"),t[t.length-1]=t[t.length-1].replace(i,a),n[o]=t.join("}");return n.join("{")}function p(e){for(var t=e.length;t--;)e[t].removeNode()}function m(e){function t(){clearTimeout(a._removeSheetTimer),r&&r.removeNode(!0),r=null}var r,o,a=i(e),s=e.namespaces,l=e.parentWindow;return!N||e.printShived?e:("undefined"==typeof s[T]&&s.add(T),l.attachEvent("onbeforeprint",function(){t();for(var i,a,s,l=e.styleSheets,u=[],c=l.length,p=Array(c);c--;)p[c]=l[c];for(;s=p.pop();)if(!s.disabled&&w.test(s.media)){try{i=s.imports,a=i.length}catch(m){a=0}for(c=0;a>c;c++)p.push(i[c]);try{u.push(s.cssText)}catch(m){}}u=d(u.reverse().join("")),o=f(e),r=n(e,u)}),l.attachEvent("onafterprint",function(){p(o),clearTimeout(a._removeSheetTimer),a._removeSheetTimer=setTimeout(t,500)}),e.printShived=!0,e)}var h,v,g="3.7.3",y=e.html5||{},S=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,x=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,b="_html5shiv",C=0,E={};!function(){try{var e=t.createElement("a");e.innerHTML="<xyz></xyz>",h="hidden"in e,v=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(n){h=!0,v=!0}}();var _={elements:y.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:g,shivCSS:y.shivCSS!==!1,supportsUnknownElements:v,shivMethods:y.shivMethods!==!1,type:"default",shivDocument:u,createElement:a,createDocumentFragment:s,addElements:o};e.html5=_,u(t);var w=/^$|\b(?:all|print)\b/,T="html5shiv",N=!v&&function(){var n=t.documentElement;return!("undefined"==typeof t.namespaces||"undefined"==typeof t.parentWindow||"undefined"==typeof n.applyElement||"undefined"==typeof n.removeNode||"undefined"==typeof e.attachEvent)}();_.type+=" print",_.shivPrint=m,m(t),"object"==typeof module&&module.exports&&(module.exports=_)}("undefined"!=typeof e?e:this,t);var T="Moz O ms Webkit",N=C._config.usePrefixes?T.toLowerCase().split(" "):[];C._domPrefixes=N;var j;!function(){var e={}.hasOwnProperty;j=r(e,"undefined")||r(e.call,"undefined")?function(e,t){return t in e&&r(e.constructor.prototype[t],"undefined")}:function(t,n){return e.call(t,n)}}(),C._l={},C.on=function(e,t){this._l[e]||(this._l[e]=[]),this._l[e].push(t),Modernizr.hasOwnProperty(e)&&setTimeout(function(){Modernizr._trigger(e,Modernizr[e])},0)},C._trigger=function(e,t){if(this._l[e]){var n=this._l[e];setTimeout(function(){var e,r;for(e=0;e<n.length;e++)(r=n[e])(t)},0),delete this._l[e]}},Modernizr._q.push(function(){C.addTest=a});var P=C._config.usePrefixes?T.split(" "):[];C._cssomPrefixes=P;var z=function(t){var r,o=E.length,i=e.CSSRule;if("undefined"==typeof i)return n;if(!t)return!1;if(t=t.replace(/^@/,""),r=t.replace(/-/g,"_").toUpperCase()+"_RULE",r in 
6i)return"@"+t;for(var a=0;o>a;a++){var s=E[a],l=s.toUpperCase()+"_"+r;if(l in i)return"@-"+s.toLowerCase()+"-"+t}return!1};C.atRule=z;var k=function(){function e(e,t){var o;return e?(t&&"string"!=typeof t||(t=s(t||"div")),e="on"+e,o=e in t,!o&&r&&(t.setAttribute||(t=s("div")),t.setAttribute(e,""),o="function"==typeof t[e],t[e]!==n&&(t[e]=n),t.removeAttribute(e)),o):!1}var r=!("onblur"in t.documentElement);return e}();C.hasEvent=k;var A=function(e,t){var n=!1,r=s("div"),o=r.style;if(e in o){var i=N.length;for(o[e]=t,n=o[e];i--&&!n;)o[e]="-"+N[i]+"-"+t,n=o[e]}return""===n&&(n=!1),n};C.prefixedCSSValue=A;var F=function(){var t=e.matchMedia||e.msMatchMedia;return t?function(e){var n=t(e);return n&&n.matches||!1}:function(t){var n=!1;return c("@media "+t+" { #modernizr { position: absolute; } }",function(t){n="absolute"==(e.getComputedStyle?e.getComputedStyle(t,null):t.currentStyle).position}),n}}();C.mq=F;var M=(C.testStyles=c,{elem:s("modernizr")});Modernizr._q.push(function(){delete M.elem});var L={style:M.elem.style};Modernizr._q.unshift(function(){delete L.style});C.testProp=function(e,t,r){return g([e],n,t,r)};C.testAllProps=y;var $=C.prefixed=function(e,t,n){return 0===e.indexOf("@")?z(e):(-1!=e.indexOf("-")&&(e=l(e)),t?y(e,t,n):y(e,"pfx"))};C.prefixedCSS=function(e){var t=$(e);return t&&u(t)};C.testAllProps=S,Modernizr.addTest("cssgridlegacy",S("grid-columns","10px",!0)),Modernizr.addTest("cssgrid",S("grid-template-rows","none",!0)),Modernizr.addTest("flexbox",S("flexBasis","1px",!0)),Modernizr.addTest("flexboxlegacy",S("boxDirection","reverse",!0)),Modernizr.addTest("flexboxtweener",S("flexAlign","end",!0)),o(),i(x),delete C.addTest,delete C.addAsyncTest;for(var D=0;D<Modernizr._q.length;D++)Modernizr._q[D]();e.Modernizr=Modernizr}(window,document);
7var HandlerSiteRan = false;
8function bindHandlerSite() {
9    if (HandlerSiteRan == false) {
10        var ssl = new RegExp("/ssl/");
11        if (ssl.test(window.location.href) && window.location.href.toLowerCase().indexOf('customerrewardslogin.aspx') == -1) {}
12        else {
13            flipImages();
14            navigation();
15            HandlerSiteRan = true;
16            appendSiteNavigationSchema();
17            AddTouchDeviceClass();
18            LoadMiniBasketHeader();
19            showHideCardIcons('#FooterPaymentIcons');
20        }
21    }
22}
23
24/**
25 * Adds "is-touch-device" or "isnot-touch-device" as classes to the body of the document.
26 */ 
27function AddTouchDeviceClass()
28{
29    if ((('ontouchstart' in window) ||
30        (navigator.maxTouchPoints > 0) ||
31        (navigator.msMaxTouchPoints > 0)))
32    {
33        document.body.classList.add('is-touch-device');
34    }
35    else
36    {
37        document.body.classList.add('isnot-touch-device');
38    }
39}
40
41function appendSiteNavigationSchema() {
42  var schema = {
43    "@context": "https://schema.org",
44    "@graph":[]
45  };
46  var prot = window.location.protocol;
47  var hnam = window.location.hostname;
48  $('#navi div[data-nodename]').each(function() {
49    var theurl = prot+'//'+hnam+'/'+$(this).attr('data-url');
50    schema['@graph'].push(
51      {
52        "@context": "https://schema.org",
53        "@type":"SiteNavigationElement",
54        "@id":"Navigation",
55        "name": $(this).attr('data-nodename'),
56        "url": theurl
57      }
58    );
59  });
60  $('head, HEAD').append('<script type="application/ld+json">'+JSON.stringify(schema)+'</script>');
61}
62
63
64function zestyProductAccordion() {
65    $('.courierchart .accordianBox:first-of-type .accordianHeader').addClass('active');
66    $('.courierchart .accordianBox:first-of-type .accordianCtn').addClass('active').attr('style', 'display: block; overflow: hidden;');
67    $('.courierchart .accordianBox:first-of-type .couriercountries .accordianBoxNested:first-of-type .accordianHeader').addClass('active');
68    $('.courierchart .accordianBox:first-of-type .couriercountries .accordianBoxNested:first-of-type .accordianCtn').addClass('active').attr('style', 'display: block; overflow: hidden;');
69}
70
71/**
72 * Dynamic Slider which displays a differing amount of items dependant on device width.
73 * @param div {String} The slider element selector, usually an ID.
74 * @param displayItems767 {Number} Number of items to display for devices of 767 or less.
75 * @param displayItems1023 {Number} Number of items to display for devices greater than 767px but equal to or less than 1023px.
76 * @param displayItems1439 {Number} Number of items to display for devices of greater than 1023px but equal to or less than 1439px.
77 * @param displayItems1903 {Number} Number of items to display for devices of greater than 1439px but equal to or less than 1903px.
78 * @param displayItemsOver1903 {Number} Number of items to display for devices of greater than 1903px.
79 */
80function flexsliderSlider(div, displayItems767, displayItems1023, displayItems1439, displayItems1903, displayItemsOver1903) {
81    $(div).flexslider({
82        animation: "slide",
83        minItems: getGridSize(displayItems767, displayItems1023, displayItems1439, displayItems1903, displayItemsOver1903),
84        maxItems: getGridSize(displayItems767, displayItems1023, displayItems1439, displayItems1903, displayItemsOver1903),
85        itemWidth: 224,
86        animationLoop: false,
87        itemMargin: 16,
88        controlNav: 1,
89        useCSS: true,
90        slideshow: false,
91        move: 0
92    });
93    if ($(".pricingRepeater").length == 0) { } else {
94        $(".pricingRepeater").each(function (index) {
95            var sale = $(this).children().length
96            if (sale > 1) {
97                $(this).addClass("fafSalePR");
98            }
99        });
100    }
101    var flexwTimer;
102    $(window).resize(function () {
103        clearTimeout(flexwTimer);
104        flexwTimer = setTimeout(function () {
105            if (typeof $(div) == "object" && $(div).data('flexslider') == "object") {
106                console.log('data - ', typeof $(div).data('flexslider').vars);
107                $(div).data('flexslider').vars.minItems = getGridSize(displayItems767, displayItems1023, displayItems1439, displayItems1903, displayItemsOver1903);
108                $(div).data('flexslider').vars.maxItems = getGridSize(displayItems767, displayItems1023, displayItems1439, displayItems1903, displayItemsOver1903);
109                var slider = $(div).data('flexslider');
110                slider.resize();
111            }
112        }, 1000);
113    });
114}
115
116/**
117 * Returns one of the function parameters depending on the InnerWidth value of the window.
118 * @param returnFor767 {Number}  Value to return for window.innerWidth of 767px or less.
119 * @param returnFor1023 {Number} Value to return for window.innerWidth greater than 767px but equal to or less than 1023px.
120 * @param returnFor1439 {Number} Value to return for window.innerWidth greater than 1023px but equal to or less than 1439px.
121 * @param returnFor1903 {Number} Value to return for window.innerWidth greater than 1439px but equal to or less than 1903px.
122 * @param returnForGreaterThan1903 {Number}Value to return for window.innerWidth greater than 1903px.
123 */ 
124function getGridSize(returnFor767, returnFor1023, returnFor1439, returnFor1903, returnForGreaterThan1903) {
125    var windowInnerWidth = window.innerWidth;
126    return (windowInnerWidth <= 767) ? returnFor767 : (windowInnerWidth <= 1023) ? returnFor1023 : (windowInnerWidth <= 1439) ? returnFor1439 : (windowInnerWidth <= 1903) ? returnFor1903 : returnForGreaterThan1903;
127}
128
129
130(function () {
131    document.addEventListener("readystatechange", function () {
132        $('iframe[src*="youtube"]').each(function () {
133            var el = $(this);
134            el.replaceWith('<div class="col-1 embed-container">' + el[0].outerHTML + '</div>');
135        });
136    }, false);
137})();
138
139var hideallDefer = $.Deferred();
140document.addEventListener("readystatechange", function () {
141    if (document.readyState === "interactive") {
142        promiseResolution(hideallDefer, hideAllButFirstPara);
143        if (typeof removeAtt != "undefined") {
144            removeAtt();
145        }
146    }
147}, false);
148
149/**
150 * Hide all elements apart from the first paragraph and its parents & descendants
151 */ 
152function hideAllButFirstPara() {
153    if (typeof removeAtt == "undefined") { hideallDefer.resolve(); }
154    var tx = '.hideallbutfirstpara';
155    var $hop = $(tx);
156    $hop.each(function () {
157        var el = $(this);
158        var fp = el.find('p:eq(0)');
159
160        fp.children()
161            .attr('data-firstpara', true)
162            .show();
163        fp.attr('data-firstpara', true)
164            .show();
165        fp.parentsUntil(tx)
166            .attr('data-firstpara', true)
167            .show();
168    });
169}
170
171function addOrUpdateQueryParam(paramName, paramValue) {
172    const url = new URL(window.location);
173    if (paramValue) {
174        url.searchParams.set(paramName, paramValue);
175    }
176    else {
177        url.searchParams.delete(paramName);
178    }
179    
180
181    window.history.pushState({}, '', url);
182}
183
184/**
185 * Get URL Params values by Param Name
186 * @param name {String} The name of the URL param to get the vlaue of.
187 */ 
188function GetURLParameterByName(name) {
189    var urlToSearch = decodeURIComponent(window.location.search),
190        regexS = "[\\?&]" + name + "=([^&#]*)",
191        regex = new RegExp(regexS),
192        results = regex.exec(urlToSearch),
193        valueToReturn = "";
194
195    if (results != null)  {
196        valueToReturn = decodeURIComponent(results[1].replace(/\+/g, " "));
197    }
198
199    return valueToReturn;
200}
201
202function scrollToTopOfPage()
203{
204    window.scrollTo(0, 0);
205}
206
207function getActivePaymentMethodsForCards() {
208    return Object.keys(ecommerceConfig.ActivePaymentMethods)
209        .map(function (paymMethodName) {
210            return paymMethodName.trim().replace(/\s/gmi, '-');
211        })
212        .filter(function (paymMethodName) {
213            return paymMethodName.toLowerCase() !== 'no-payment-required' && !paymMethodName.toLowerCase().endsWith('stripe');
214        });
215}
216
217function showHideCardIcons(parentSelector) {
218    var cardicons = getActivePaymentMethodsForCards();
219
220    waitForElement(parentSelector)
221        .then(() => {
222            const parent = document.querySelector(parentSelector);
223
224            while (parent.firstChild) {
225                parent.removeChild(parent.firstChild);
226            }
227
228            for (let i = 0; i < cardicons.length; i++) {
229                if (!parent.querySelector('img[src*="' + cardicons[i] + '"]')) {
230                    if (cardicons[i] === 'NewDay') {
231                        continue;
232                    }
233
234                    const altTitleText = cardicons[i].replace(/-/gm, " ")
235                        .replace(/([s|S]tripe)/gmi, '')
236                        .split(" ")
237                        .map(function (word) {
238                            return word.charAt(0).toUpperCase() + word.substring(1, word.length);
239                        })
240                        .join(" ");
241                    let getTranslatedPaymentMethod = altTitleText;
242
243                    try {
244                        const fromTranslation = GetTranslation('JavaScriptTranslations', cardicons[i].replace(/-/gm, " "));
245
246                        if (fromTranslation != 'ERROR OCCURRED') {
247                            getTranslatedPaymentMethod = fromTranslation;
248                            if (cardicons[i].toLowerCase().includes('clearpay')) {
249                                cardicons[i] = fromTranslation.replace(/\s/gm, "");
250                            }
251                        }
252                    } catch (_) { /* No catch req, just prevent failure */ }
253
254                    const localisedTitleText = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '01Global-PayByX0PaymentMethod'), getTranslatedPaymentMethod);
255                    const newCardImage = document.createElement('img');
256
257                    newCardImage.src = `/ssl/images/cards/card-${cardicons[i]}.png`;
258                    newCardImage.height = 60;
259
260                    if (cardicons[i] === 'Novuna') {
261                        newCardImage.alt = GetTranslation('JavaScriptTranslations', 'NovunaImageAlt');
262                        newCardImage.title = GetTranslation('JavaScriptTranslations', 'NovunaImageTitle');
263                    } else {
264                        newCardImage.alt = localisedTitleText;
265                        newCardImage.title = localisedTitleText;
266                    }
267
268                    parent.appendChild(newCardImage);
269                }
270            }
271        });
272}
273/*
274 * jQuery FlexSlider v2.2.0
275 * Copyright 2012 WooThemes
276 * Contributing Author: Tyler Smith
277 */(function(e){e.flexslider=function(t,n){var r=e(t);r.vars=e.extend({},e.flexslider.defaults,n);var i=r.vars.namespace,s=window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture,o=("ontouchstart"in window||s||window.DocumentTouch&&document instanceof DocumentTouch)&&r.vars.touch,u="click touchend MSPointerUp",a="",f,l=r.vars.direction==="vertical",c=r.vars.reverse,h=r.vars.itemWidth>0,p=r.vars.animation==="fade",d=r.vars.asNavFor!=="",v={},m=!0;e.data(t,"flexslider",r);v={init:function(){r.animating=!1;r.currentSlide=parseInt(r.vars.startAt?r.vars.startAt:0);isNaN(r.currentSlide)&&(r.currentSlide=0);r.animatingTo=r.currentSlide;r.atEnd=r.currentSlide===0||r.currentSlide===r.last;r.containerSelector=r.vars.selector.substr(0,r.vars.selector.search(" "));r.slides=e(r.vars.selector,r);r.container=e(r.containerSelector,r);r.count=r.slides.length;r.syncExists=e(r.vars.sync).length>0;r.vars.animation==="slide"&&(r.vars.animation="swing");r.prop=l?"top":"marginLeft";r.args={};r.manualPause=!1;r.stopped=!1;r.started=!1;r.startTimeout=null;r.transitions=!r.vars.video&&!p&&r.vars.useCSS&&function(){var e=document.createElement("div"),t=["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"];for(var n in t)if(e.style[t[n]]!==undefined){r.pfx=t[n].replace("Perspective","").toLowerCase();r.prop="-"+r.pfx+"-transform";return!0}return!1}();r.vars.controlsContainer!==""&&(r.controlsContainer=e(r.vars.controlsContainer).length>0&&e(r.vars.controlsContainer));r.vars.manualControls!==""&&(r.manualControls=e(r.vars.manualControls).length>0&&e(r.vars.manualControls));if(r.vars.randomize){r.slides.sort(function(){return Math.round(Math.random())-.5});r.container.empty().append(r.slides)}r.doMath();r.setup("init");r.vars.controlNav&&v.controlNav.setup();r.vars.directionNav&&v.directionNav.setup();r.vars.keyboard&&(e(r.containerSelector).length===1||r.vars.multipleKeyboard)&&e(document).bind("keyup",function(e){var t=e.keyCode;if(!r.animating&&(t===39||t===37)){var n=t===39?r.getTarget("next"):t===37?r.getTarget("prev"):!1;r.flexAnimate(n,r.vars.pauseOnAction)}});r.vars.mousewheel&&r.bind("mousewheel",function(e,t,n,i){e.preventDefault();var s=t<0?r.getTarget("next"):r.getTarget("prev");r.flexAnimate(s,r.vars.pauseOnAction)});r.vars.pausePlay&&v.pausePlay.setup();
277r.vars.slideshow&&r.vars.pauseInvisible&&v.pauseInvisible.init();if(r.vars.slideshow){r.vars.pauseOnHover&&r.hover(function(){!r.manualPlay&&!r.manualPause&&r.pause()},function(){!r.manualPause&&!r.manualPlay&&!r.stopped&&r.play()});if(!r.vars.pauseInvisible||!v.pauseInvisible.isHidden())r.vars.initDelay>0?r.startTimeout=setTimeout(r.play,r.vars.initDelay):r.play()}d&&v.asNav.setup();o&&r.vars.touch&&v.touch();(!p||p&&r.vars.smoothHeight)&&e(window).bind("resize orientationchange focus",v.resize);r.find("img").attr("draggable","false");setTimeout(function(){r.vars.start(r)},200)},asNav:{setup:function(){r.asNav=!0;r.animatingTo=Math.floor(r.currentSlide/r.move);r.currentItem=r.currentSlide;r.slides.removeClass(i+"active-slide").eq(r.currentItem).addClass(i+"active-slide");if(!s)r.slides.click(function(t){t.preventDefault();var n=e(this),s=n.index(),o=n.offset().left-e(r).scrollLeft();if(o<=0&&n.hasClass(i+"active-slide"))r.flexAnimate(r.getTarget("prev"),!0);else if(!e(r.vars.asNavFor).data("flexslider").animating&&!n.hasClass(i+"active-slide")){r.direction=r.currentItem<s?"next":"prev";r.flexAnimate(s,r.vars.pauseOnAction,!1,!0,!0)}});else{t._slider=r;r.slides.each(function(){var t=this;t._gesture=new MSGesture;t._gesture.target=t;t.addEventListener("MSPointerDown",function(e){e.preventDefault();e.currentTarget._gesture&&e.currentTarget._gesture.addPointer(e.pointerId)},!1);t.addEventListener("MSGestureTap",function(t){t.preventDefault();var n=e(this),i=n.index();if(!e(r.vars.asNavFor).data("flexslider").animating&&!n.hasClass("active")){r.direction=r.currentItem<i?"next":"prev";r.flexAnimate(i,r.vars.pauseOnAction,!1,!0,!0)}})})}}},controlNav:{setup:function(){r.manualControls?v.controlNav.setupManual():v.controlNav.setupPaging()},setupPaging:function(){var t=r.vars.controlNav==="thumbnails"?"control-thumbs":"control-paging",n=1,s,o;r.controlNavScaffold=e('<ol class="'+i+"control-nav "+i+t+'"></ol>');if(r.pagingCount>1)for(var f=0;f<r.pagingCount;f++){o=r.slides.eq(f);s=r.vars.controlNav==="thumbnails"?'<img src="'+o.attr("data-thumb")+'"/>':"<a>"+n+"</a>";if("thumbnails"===r.vars.controlNav&&!0===r.vars.thumbCaptions){var l=o.attr("data-thumbcaption");""!=l&&undefined!=l&&(s+='<span class="'+i+'caption">'+l+"</span>")}r.controlNavScaffold.append("<li>"+s+"</li>");n++}r.controlsContainer?e(r.controlsContainer).append(r.controlNavScaffold):r.append(r.controlNavScaffold);v.controlNav.set();v.controlNav.active();r.controlNavScaffold.delegate("a, img",u,function(t){t.preventDefault();if(a===""||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+"active")){r.direction=s>r.currentSlide?"next":"prev";r.flexAnimate(s,r.vars.pauseOnAction)}}a===""&&(a=t.type);v.setToClearWatchedEvent()})},setupManual:function(){r.controlNav=r.manualControls;v.controlNav.active();r.controlNav.bind(u,function(t){t.preventDefault();if(a===""||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+"active")){s>r.currentSlide?r.direction="next":r.direction="prev";r.flexAnimate(s,r.vars.pauseOnAction)}}a===""&&(a=t.type);v.setToClearWatchedEvent()})},set:function(){var t=r.vars.controlNav==="thumbnails"?"img":"a";r.controlNav=e("."+i+"control-nav li "+t,r.controlsContainer?r.controlsContainer:r)},active:function(){r.controlNav.removeClass(i+"active").eq(r.animatingTo).addClass(i+"active")},update:function(t,n){r.pagingCount>1&&t==="add"?r.controlNavScaffold.append(e("<li><a>"+r.count+"</a></li>")):r.pagingCount===1?r.controlNavScaffold.find("li").remove():r.controlNav.eq(n).closest("li").remove();v.controlNav.set();r.pagingCount>1&&r.pagingCount!==r.controlNav.length?r.update(n,t):v.controlNav.active()}},directionNav:{setup:function(){var t=e('<ul class="'+i+'direction-nav"><li><a class="'+i+'prev" href="#">'+r.vars.prevText+'</a></li><li><a class="'+i+'next" href="#">'+r.vars.nextText+"</a></li></ul>");if(r.controlsContainer){e(r.controlsContainer).append(t);r.directionNav=e("."+i+"direction-nav li a",r.controlsContainer)}else{r.append(t);r.directionNav=e("."+i+"direction-nav li a",r)}v.directionNav.update();r.directionNav.bind(u,function(t){t.preventDefault();var n;if(a===""||a===t.type){n=e(this).hasClass(i+"next")?r.getTarget("next"):r.getTarget("prev");r.flexAnimate(n,r.vars.pauseOnAction)}a===""&&(a=t.type);v.setToClearWatchedEvent()})},update:function(){var e=i+"disabled";r.pagingCount===1?r.directionNav.addClass(e).attr("tabindex","-1"):r.vars.animationLoop?r.directionNav.removeClass(e).removeAttr("tabindex"):r.animatingTo===0?r.directionNav.removeClass(e).filter("."+i+"prev").addClass(e).attr("tabindex","-1"):r.animatingTo===r.last?r.directionNav.removeClass(e).filter("."+i+"next").addClass(e).attr("tabindex","-1"):r.directionNav.removeClass(e).removeAttr("tabindex")}},pausePlay:{setup:function(){var t=e('<div class="'+i+'pauseplay"><a></a></div>');if(r.controlsContainer){r.controlsContainer.append(t);r.pausePlay=e("."+i+"pauseplay a",r.controlsContainer)}else{r.append(t);r.pausePlay=e("."+i+"pauseplay a",r)}v.pausePlay.update(r.vars.slideshow?i+"pause":i+"play");r.pausePlay.bind(u,function(t){t.preventDefault();if(a===""||a===t.type)if(e(this).hasClass(i+"pause")){r.manualPause=!0;r.manualPlay=!1;r.pause()}else{r.manualPause=!1;r.manualPlay=!0;r.play()}a===""&&(a=t.type);v.setToClearWatchedEvent()})},update:function(e){e==="play"?r.pausePlay.removeClass(i+"pause").addClass(i+"play").html(r.vars.playText):r.pausePlay.removeClass(i+"play").addClass(i+"pause").html(r.vars.pauseText)}},touch:function(){var e,n,i,o,u,a,f=!1,d=0,v=0,m=0;if(!s){t.addEventListener("touchstart",g,!1);function g(s){if(r.animating)s.preventDefault();else if(window.navigator.msPointerEnabled||s.touches.length===1){r.pause();o=l?r.h:r.w;a=Number(new Date);d=s.touches[0].pageX;v=s.touches[0].pageY;i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o;e=l?v:d;n=l?d:v;t.addEventListener("touchmove",y,!1);t.addEventListener("touchend",b,!1)}}function y(t){d=t.touches[0].pageX;v=t.touches[0].pageY;u=l?e-v:e-d;f=l?Math.abs(u)<Math.abs(d-n):Math.abs(u)<Math.abs(v-n);var s=500;if(!f||Number(new Date)-a>s){t.preventDefault();if(!p&&r.transitions){r.vars.animationLoop||(u/=r.currentSlide===0&&u<0||r.currentSlide===r.last&&u>0?Math.abs(u)/o+2:1);r.setProps(i+u,"setTouch")}}}function b(s){t.removeEventListener("touchmove",y,!1);if(r.animatingTo===r.currentSlide&&!f&&u!==null){var l=c?-u:u,h=l>0?r.getTarget("next"):r.getTarget("prev");r.canAdvance(h)&&(Number(new Date)-a<550&&Math.abs(l)>50||Math.abs(l)>o/2)?r.flexAnimate(h,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}t.removeEventListener("touchend",b,!1);e=null;n=null;u=null;i=null}}else{t.style.msTouchAction="none";t._gesture=new MSGesture;t._gesture.target=t;t.addEventListener("MSPointerDown",w,!1);t._slider=r;t.addEventListener("MSGestureChange",E,!1);t.addEventListener("MSGestureEnd",S,!1);function w(e){e.stopPropagation();if(r.animating)e.preventDefault();else{r.pause();t._gesture.addPointer(e.pointerId);m=0;o=l?r.h:r.w;a=Number(new Date);i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o}}function E(e){e.stopPropagation();var n=e.target._slider;if(!n)return;var r=-e.translationX,s=-e.translationY;m+=l?s:r;u=m;f=l?Math.abs(m)<Math.abs(-r):Math.abs(m)<Math.abs(-s);if(e.detail===e.MSGESTURE_FLAG_INERTIA){setImmediate(function(){t._gesture.stop()});return}if(!f||Number(new Date)-a>500){e.preventDefault();if(!p&&n.transitions){n.vars.animationLoop||(u=m/(n.currentSlide===0&&m<0||n.currentSlide===n.last&&m>0?Math.abs(m)/o+2:1));n.setProps(i+u,"setTouch")}}}function S(t){t.stopPropagation();var r=t.target._slider;if(!r)return;if(r.animatingTo===r.currentSlide&&!f&&u!==null){var s=c?-u:u,l=s>0?r.getTarget("next"):r.getTarget("prev");r.canAdvance(l)&&(Number(new Date)-a<550&&Math.abs(s)>50||Math.abs(s)>o/2)?r.flexAnimate(l,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}e=null;n=null;u=null;i=null;m=0}}},resize:function(){if(!r.animating&&r.is(":visible")){h||r.doMath();if(p)v.smoothHeight();else if(h){r.slides.width(r.computedW);r.update(r.pagingCount);r.setProps()}else if(l){r.viewport.height(r.h);r.setProps(r.h,"setTotal")}else{r.vars.smoothHeight&&v.smoothHeight();r.newSlides.width(r.computedW);r.setProps(r.computedW,"setTotal")}}},smoothHeight:function(e){if(!l||p){var t=p?r:r.viewport;e?t.animate({height:r.slides.eq(r.animatingTo).height()},e):t.height(r.slides.eq(r.animatingTo).height())}},sync:function(t){var n=e(r.vars.sync).data("flexslider"),i=r.animatingTo;switch(t){case"animate":n.flexAnimate(i,r.vars.pauseOnAction,!1,!0);break;case"play":!n.playing&&!n.asNav&&n.play();break;case"pause":n.pause()}},pauseInvisible:{visProp:null,init:function(){var e=["webkit","moz","ms","o"];if("hidden"in document)return"hidden";for(var t=0;t<e.length;t++)e[t]+"Hidden"in document&&(v.pauseInvisible.visProp=e[t]+"Hidden");if(v.pauseInvisible.visProp){var n=v.pauseInvisible.visProp.replace(/[H|h]idden/,"")+"visibilitychange";document.addEventListener(n,function(){v.pauseInvisible.isHidden()?r.startTimeout?clearTimeout(r.startTimeout):r.pause():r.started?r.play():r.vars.initDelay>0?setTimeout(r.play,r.vars.initDelay):r.play()})}},isHidden:function(){return document[v.pauseInvisible.visProp]||!1}},setToClearWatchedEvent:function(){clearTimeout(f);f=setTimeout(function(){a=""},3e3)}};r.flexAnimate=function(t,n,s,u,a){!r.vars.animationLoop&&t!==r.currentSlide&&(r.direction=t>r.currentSlide?"next":"prev");d&&r.pagingCount===1&&(r.direction=r.currentItem<t?"next":"prev");if(!r.animating&&(r.canAdvance(t,a)||s)&&r.is(":visible")){if(d&&u){var f=e(r.vars.asNavFor).data("flexslider");r.atEnd=t===0||t===r.count-1;f.flexAnimate(t,!0,!1,!0,a);r.direction=r.currentItem<t?"next":"prev";f.direction=r.direction;if(Math.ceil((t+1)/r.visible)-1===r.currentSlide||t===0){r.currentItem=t;r.slides.removeClass(i+"active-slide").eq(t).addClass(i+"active-slide");return!1}r.currentItem=t;r.slides.removeClass(i+"active-slide").eq(t).addClass(i+"active-slide");t=Math.floor(t/r.visible)}r.animating=!0;r.animatingTo=t;n&&r.pause();r.vars.before(r);r.syncExists&&!a&&v.sync("animate");r.vars.controlNav&&v.controlNav.active();h||r.slides.removeClass(i+"active-slide").eq(t).addClass(i+"active-slide");r.atEnd=t===0||t===r.last;
277r.vars.directionNav&&v.directionNav.update();if(t===r.last){r.vars.end(r);r.vars.animationLoop||r.pause()}if(!p){var m=l?r.slides.filter(":first").height():r.computedW,g,y,b;if(h){g=r.vars.itemMargin;b=(r.itemW+g)*r.move*r.animatingTo;y=b>r.limit&&r.visible!==1?r.limit:b}else r.currentSlide===0&&t===r.count-1&&r.vars.animationLoop&&r.direction!=="next"?y=c?(r.count+r.cloneOffset)*m:0:r.currentSlide===r.last&&t===0&&r.vars.animationLoop&&r.direction!=="prev"?y=c?0:(r.count+1)*m:y=c?(r.count-1-t+r.cloneOffset)*m:(t+r.cloneOffset)*m;r.setProps(y,"",r.vars.animationSpeed);if(r.transitions){if(!r.vars.animationLoop||!r.atEnd){r.animating=!1;r.currentSlide=r.animatingTo}r.container.unbind("webkitTransitionEnd transitionend");r.container.bind("webkitTransitionEnd transitionend",function(){r.wrapup(m)})}else r.container.animate(r.args,r.vars.animationSpeed,r.vars.easing,function(){r.wrapup(m)})}else if(!o){r.slides.eq(r.currentSlide).css({zIndex:1}).animate({opacity:0},r.vars.animationSpeed,r.vars.easing);r.slides.eq(t).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing,r.wrapup)}else{r.slides.eq(r.currentSlide).css({opacity:0,zIndex:1});r.slides.eq(t).css({opacity:1,zIndex:2});r.wrapup(m)}r.vars.smoothHeight&&v.smoothHeight(r.vars.animationSpeed)}};r.wrapup=function(e){!p&&!h&&(r.currentSlide===0&&r.animatingTo===r.last&&r.vars.animationLoop?r.setProps(e,"jumpEnd"):r.currentSlide===r.last&&r.animatingTo===0&&r.vars.animationLoop&&r.setProps(e,"jumpStart"));r.animating=!1;r.currentSlide=r.animatingTo;r.vars.after(r)};r.animateSlides=function(){!r.animating&&m&&r.flexAnimate(r.getTarget("next"))};r.pause=function(){clearInterval(r.animatedSlides);r.animatedSlides=null;r.playing=!1;r.vars.pausePlay&&v.pausePlay.update("play");r.syncExists&&v.sync("pause")};r.play=function(){r.playing&&clearInterval(r.animatedSlides);r.animatedSlides=r.animatedSlides||setInterval(r.animateSlides,r.vars.slideshowSpeed);r.started=r.playing=!0;r.vars.pausePlay&&v.pausePlay.update("pause");r.syncExists&&v.sync("play")};r.stop=function(){r.pause();r.stopped=!0};r.canAdvance=function(e,t){var n=d?r.pagingCount-1:r.last;return t?!0:d&&r.currentItem===r.count-1&&e===0&&r.direction==="prev"?!0:d&&r.currentItem===0&&e===r.pagingCount-1&&r.direction!=="next"?!1:e===r.currentSlide&&!d?!1:r.vars.animationLoop?!0:r.atEnd&&r.currentSlide===0&&e===n&&r.direction!=="next"?!1:r.atEnd&&r.currentSlide===n&&e===0&&r.direction==="next"?!1:!0};r.getTarget=function(e){r.direction=e;return e==="next"?r.currentSlide===r.last?0:r.currentSlide+1:r.currentSlide===0?r.last:r.currentSlide-1};r.setProps=function(e,t,n){var i=function(){var n=e?e:(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo,i=function(){if(h)return t==="setTouch"?e:c&&r.animatingTo===r.last?0:c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:r.animatingTo===r.last?r.limit:n;switch(t){case"setTotal":return c?(r.count-1-r.currentSlide+r.cloneOffset)*e:(r.currentSlide+r.cloneOffset)*e;case"setTouch":return c?e:e;case"jumpEnd":return c?e:r.count*e;case"jumpStart":return c?r.count*e:e;default:return e}}();return i*-1+"px"}();if(r.transitions){i=l?"translate3d(0,"+i+",0)":"translate3d("+i+",0,0)";n=n!==undefined?n/1e3+"s":"0s";r.container.css("-"+r.pfx+"-transition-duration",n)}r.args[r.prop]=i;(r.transitions||n===undefined)&&r.container.css(r.args)};r.setup=function(t){if(!p){var n,s;if(t==="init"){r.viewport=e('<div class="'+i+'viewport"></div>').css({overflow:"hidden",position:"relative"}).appendTo(r).append(r.container);r.cloneCount=0;r.cloneOffset=0;if(c){s=e.makeArray(r.slides).reverse();r.slides=e(s);r.container.empty().append(r.slides)}}if(r.vars.animationLoop&&!h){r.cloneCount=2;r.cloneOffset=1;t!=="init"&&r.container.find(".clone").remove();r.container.append(r.slides.first().clone().addClass("clone").attr("aria-hidden","true")).prepend(r.slides.last().clone().addClass("clone").attr("aria-hidden","true"))}r.newSlides=e(r.vars.selector,r);n=c?r.count-1-r.currentSlide+r.cloneOffset:r.currentSlide+r.cloneOffset;if(l&&!h){r.container.height((r.count+r.cloneCount)*200+"%").css("position","absolute").width("100%");setTimeout(function(){r.newSlides.css({display:"block"});r.doMath();r.viewport.height(r.h);r.setProps(n*r.h,"init")},t==="init"?100:0)}else{r.container.width((r.count+r.cloneCount)*200+"%");r.setProps(n*r.computedW,"init");setTimeout(function(){r.doMath();r.newSlides.css({width:r.computedW,"float":"left",display:"block"});r.vars.smoothHeight&&v.smoothHeight()},t==="init"?100:0)}}else{r.slides.css({width:"100%","float":"left",marginRight:"-100%",position:"relative"});t==="init"&&(o?r.slides.css({opacity:0,display:"block",webkitTransition:"opacity "+r.vars.animationSpeed/1e3+"s ease",zIndex:1}).eq(r.currentSlide).css({opacity:1,zIndex:2}):r.slides.css({opacity:0,display:"block",zIndex:1}).eq(r.currentSlide).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing));r.vars.smoothHeight&&v.smoothHeight()}h||r.slides.removeClass(i+"active-slide").eq(r.currentSlide).addClass(i+"active-slide")};r.doMath=function(){var e=r.slides.first(),t=r.vars.itemMargin,n=r.vars.minItems,i=r.vars.maxItems;r.w=r.viewport===undefined?r.width():r.viewport.width();r.h=e.height();r.boxPadding=e.outerWidth()-e.width();if(h){r.itemT=r.vars.itemWidth+t;r.minW=n?n*r.itemT:r.w;r.maxW=i?i*r.itemT-t:r.w;r.itemW=r.minW>
277r.w?(r.w-t*(n-1))/n:r.maxW<r.w?(r.w-t*(i-1))/i:r.vars.itemWidth>r.w?r.w:r.vars.itemWidth;r.visible=Math.floor(r.w/r.itemW);r.move=r.vars.move>0&&r.vars.move<r.visible?r.vars.move:r.visible;r.pagingCount=Math.ceil((r.count-r.visible)/r.move+1);r.last=r.pagingCount-1;r.limit=r.pagingCount===1?0:r.vars.itemWidth>r.w?r.itemW*(r.count-1)+t*(r.count-1):(r.itemW+t)*r.count-r.w-t}else{r.itemW=r.w;r.pagingCount=r.count;r.last=r.count-1}r.computedW=r.itemW-r.boxPadding};r.update=function(e,t){r.doMath();if(!h){e<r.currentSlide?r.currentSlide+=1:e<=r.currentSlide&&e!==0&&(r.currentSlide-=1);r.animatingTo=r.currentSlide}if(r.vars.controlNav&&!r.manualControls)if(t==="add"&&!h||r.pagingCount>r.controlNav.length)v.controlNav.update("add");else if(t==="remove"&&!h||r.pagingCount<r.controlNav.length){if(h&&r.currentSlide>r.last){r.currentSlide-=1;r.animatingTo-=1}v.controlNav.update("remove",r.last)}r.vars.directionNav&&v.directionNav.update()};r.addSlide=function(t,n){var i=e(t);r.count+=1;r.last=r.count-1;l&&c?n!==undefined?r.slides.eq(r.count-n).after(i):r.container.prepend(i):n!==undefined?r.slides.eq(n).before(i):r.container.append(i);r.update(n,"add");r.slides=e(r.vars.selector+":not(.clone)",r);r.setup();r.vars.added(r)};r.removeSlide=function(t){var n=isNaN(t)?r.slides.index(e(t)):t;r.count-=1;r.last=r.count-1;isNaN(t)?e(t,r.slides).remove():l&&c?r.slides.eq(r.last).remove():r.slides.eq(t).remove();r.doMath();r.update(n,"remove");r.slides=e(r.vars.selector+":not(.clone)",r);r.setup();r.vars.removed(r)};v.init()};e(window).blur(function(e){focused=!1}).focus(function(e){focused=!0});e.flexslider.defaults={namespace:"flex-",selector:".slides > li",animation:"fade",easing:"swing",direction:"horizontal",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7e3,animationSpeed:600,initDelay:0,randomize:!1,thumbCaptions:!1,pauseOnAction:!0,pauseOnHover:!1,pauseInvisible:!0,useCSS:!0,touch:!0,video:!1,controlNav:!0,directionNav:!0,prevText:"Previous",nextText:"Next",keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:"Pause",playText:"Play",controlsContainer:"",manualControls:"",sync:"",asNavFor:"",itemWidth:0,itemMargin:0,minItems:1,maxItems:0,move:0,allowOneSlide:!0,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){}};e.fn.flexslider=function(t){t===undefined&&(t={});if(typeof t=="object")return this.each(function(){var n=e(this),r=t.selector?t.selector:".slides > li",i=n.find(r);if(i.length===1&&t.allowOneSlide===!0||i.length===0){i.fadeIn(400);t.start&&t.start(n)}else n.data("flexslider")===undefined&&new e.flexslider(this,t)});var n=e(this).data("flexslider");switch(t){case"play":n.play();break;case"pause":n.pause();break;case"stop":n.stop();break;case"next":n.flexAnimate(n.getTarget("next"),!0);break;case"prev":case"previous":n.flexAnimate(n.getTarget("prev"),!0);break;default:typeof t=="number"&&n.flexAnimate(t,!0)}}})(jQuery);// JavaScript Document
278
279var removeElementsFromHTMLString = function (htmlstring, selector) {
280    return $(htmlstring).not(selector);
281};
282
283/**
284 * The force search bar to search and not tab to the next input.
285 */
286var forceAndroidEnterButtonForSearch = function () {
287    $("#txtTerm").keydown(function (event) {
288        var keycode = (event.keyCode ? event.keyCode : event.which);
289        if (keycode == '13') {
290            $('#lnkSearch').click();
291        }
292    });
293};
294
295
296function clearAll() {
297    toggleNavOverlay(false, false);
298    $('.NodeLevel0>a').removeClass('active');
299    $('.NodeLevel0>div').removeClass('active').fadeOut();
300    $('#txtTerm').trigger('blur');
301    $('.tbcnt').removeClass('tbcntOpen');
302    $('.NodeLevel0').show();
303    $('.CSSFacetNavModules').scrollTop(0);
304    $('.navIcons div[class*="icon-"]').each(function () {
305        $(this).removeClass("close");
306    });
307    $('.smiley-loading-anim, .smiley-loading-anim > span, .smiley-loading-anim > span svg #path-3_21_, .smiley-loading-anim > span svg #path-3_10_').removeAttr('style');
308    $('.minibasket-nostarbuymsg, .basketstarbuyouter').remove();
309}
310
311function navigation() {
312    forceAndroidEnterButtonForSearch();
313
314    $("*").on('touchmove', function (e) {
315        if ((!$(this).hasClass('CSSFacetNavModules') && !$(this).hasClass('active'))
316            && $('.NodeLevel0>.CSSFacetNavModules.active').length > 0
317            && $(window).width() <= 425)
318        {
319            $('html, body').scrollTop(0);
320        }
321    });
322
323    $('.navIcons div[class*="icon-"]').click(function () {
324        var $this = $(this);
325        var $target = "#" + $this.attr('data-link');
326
327        $('.NodeLevel0>div').removeClass('active').fadeOut();
328        $('.NodeLevel0>a').removeClass('active');
329        $('.tbcnt:not(' + $target + ')').removeClass('tbcntOpen');
330        if ($($target).hasClass('tbcntOpen')) {
331            clearAll();
332        }
333        else {
334            $($target).addClass('tbcntOpen');
335            $this.addClass('close');
336            toggleNavOverlay(true, true);
337            $('.NodeLevel0>div').removeClass('active').fadeOut();
338        }
339        $('.navIcons div[class*="icon-"]').each(function () {
340            $(this).removeClass("close");
341        });
342        if ($target == "#navi") {
343            toggleNavOverlay(null, true);
344        }
345        if ($target === "#search") {
346            $("#txtTerm").focus();
347        }
348        if ($target === "#basket" && $($target).hasClass('tbcntOpen')) {
349            LoadMiniBasketHeader();
350        }
351
352    });
353
354    $('.minibasket-toggles>div').click(function () {
355        var meL = $(this);
356        var meT = $('div[data-boxcontext="' + meL.attr('data-boxlink') + '"]');
357        $('div[data-boxcontext]').hide();
358        meT.show();
359        $('.minibasket-toggles>div').removeClass('activeminilink');
360        meL.addClass('activeminilink');
361    });
362
363    $('.closeAll, #body-wrapper-overlay').click(clearAll);
364
365    $('.tabsMenu li').click(function ()
366    {
367        event.preventDefault();
368        var tab_id = $(this).attr('data-tab');
369        $('.tabsMenu li').removeClass('current');
370        $('.tabsMenuContent').removeClass('current');
371        $(this).addClass('current');
372        $("#" + tab_id).addClass('current');
373    });
374
375    $('.NodeLevel0 > a').on('click', function (e) {
376        $this = $(this);
377        $target = $this.next();
378        $prt = $this.parent();
379        timeoutvar = 1;
380
381        e.preventDefault();
382
383        if ($(window).width() <= 1024) {
384            if ($target.hasClass('active'))
385            {
386                $('.NodeLevel0').show();
387                $this.removeClass('active');
388                $target.removeClass('active').hide();
389                toggleNavOverlay(false, false);
390            }
391            else
392            {
393                $('.NodeLevel0').hide();
394                $prt.show();
395                $this.addClass('active');
396                $target.addClass('active').show().scrollTop(0);
397                toggleNavOverlay(true, true);
398            }
399        }
400        else {
401            if ($target.hasClass('active')) {
402                $('.NodeLevel0>div').removeClass('active').hide();
403                $this.removeClass('active');
404                if (!$('#navi').hasClass('tbcntOpen'))
405                {
406                    toggleNavOverlay(false, false);
407                }
408                $('#txtTerm').trigger('blur');
409            }
410            else {
411                $('.tbcnt').removeClass('tbcntOpen');
412                $('.NodeLevel0>a').removeClass('active');
413                $this.addClass('active');
414                setTimeout(function () {
415                    $('.NodeLevel0>div').removeClass('active');
416                    $('.NodeLevel0>div').hide();
417                    $target.addClass('active').show();
418                    toggleNavOverlay(true, true);
419                }, timeoutvar);
420            }
421        }
422    });
423
424    window.addEventListener("orientationchange", function () {
425        $('.NodeLevel0').removeAttr('style');
426    });
427
428}
429
430function toggleNavOverlay(showOverlayWrapper, showOverlayHtmlBody)
431{
432    if (showOverlayWrapper !== null)
433    {
434        $("#body-wrapper-overlay").toggleClass("open-slide-menu", showOverlayWrapper);
435    }
436    if (showOverlayHtmlBody !== null)
437    {
438        $("html, body").toggleClass("open-slide-menu", showOverlayHtmlBody);
439    }
440}
441
442/**
443 * Checks if we should load the mini basket when LoadMiniBasketHeader() is called
444 * ---
445 * - The MiniBasket Total element should be present.
446 * - The "item pip" elements should be present.
447 * - The cart message element should be present.
448 * - The cart item element should be present.
449 * - "CitrusStore" should be defined (the webservice is present)
450 */
451function CheckShouldLoadMiniBasketHeader() {
452    var requiredElements = [
453        document.querySelector('#MiniBasketMerchandiseTotal') !== null,
454        document.querySelectorAll('.basketPip, .basketPip2').length > 0,
455        document.querySelector('#CCartFreeMSG > span') !== null,
456        typeof CitrusStore !== "undefined",
457        document.querySelector('#CCart-dev') !== null
458    ];
459
460    /*
461     * Array.every() is supported on all browsers >= IE 9
462     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every#browser_compatibility
463     */
464    return requiredElements.every(function (condition) { return condition === true; });
465}
466
467/**
468 * Loads the "mini basket" content for the header.
469 */
470function LoadMiniBasketHeader() {
471    if (CheckShouldLoadMiniBasketHeader()) {
472        CitrusStore.CitrusStore.wsCitrusStore.GetMiniBasket(
473            function (data)
474            {
475                SucceededMiniBasketCallback(data);
476                
477            },
478            function (err)
479            {
480                onFailedWS(err);
481                OnErrorFromCourierIntegration_GetDeliveryQuoteShowModalMessage(err);
482            });
483    }
484
485    flipImages(true);
486}
487
488function SucceededMiniBasketCallback(result) {
489    $('.basketPip, .basketPip2').text(result.ItemCount).show();
490
491    SetMiniBasketTotals(result);
492    SetMiniBasketDeliveryMessage(result);
493
494    var productHTML = '';
495    var productListToDisplay = CombineProductsAndStarbuyGroups(result.Products, result.StarbuyGroups);
496
497    if (productListToDisplay.length) {
498        var miniBasketItemTemplate = '<a class="col-1 [[PADDINGCLASS]] zflex-s" href="[[PRODUCTURL]]" data-starbuy="[[ISINSTARBUY]]" data-starbuychild="[[ISSTARBUYCHILD]]">' +
499            '<div class="mini-basket-img"><img src="[[IMGURL]]?width=80&height=80&format=webp&bgcolor=ffffff" width="80" height="80" /></div>' +
500            '<div class="col- flex-grow1 zflex-vs ctrPad16-left">' +
501            '<div class="col-1">' +
502            '<span class="col-1 ctrPad4-bottom small boldfont">[[QTY]]x [[NAME]]</span>' +
503            '<span class="col-1 ctrPad4-bottom x-small tt-uppercase coStandard" data-matrix="[[ATTRNAME]]">[[ATTRNAME]]</span>' +
504            '<span class="col- x-small">[[SALEPRICE]]</span>' +
505            '<span class="col- ctrPad16-left [[SALECOLOUR]] x-small" data-saving="[[SAVINGSRAW]]" data-hideme="[[SHOWSAVINGS]]">[[SAVINGS]]</span>' +
506            '</div>' +
507            '</div>' +
508            '</a>';
509
510        var itemIndex = 0,
511            itemCount = productListToDisplay.length;
512
513        for (itemIndex; itemIndex < itemCount; itemIndex++) {
514            productHTML += BuildOutputHtmlForMiniBasketItem(miniBasketItemTemplate, productListToDisplay[itemIndex], itemIndex, itemCount);
515        }
516    }
517    else {
518        productHTML = GetTranslation('JavaScriptTranslations', '02Navigation-EmptyCart');
519    }
520    $("#CCart-dev").html(productHTML);
521}
522
523function SetMiniBasketTotals(result) {
524    document.querySelector('#MiniBasketMerchandiseTotal').innerHTML = `<div class="col-1"><span class="boldfont">${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '02Navigation-ItemsTotalX0Total'), result.MerchandiseTotalFormatted)}</span></div>`;
525}
526
527function SetMiniBasketDeliveryMessage(result) {
528    var $target = document.querySelector('#CCartFreeMSG > span'),
529        hasFreeDeliveryOption = result.AvailableShippingOptions.filter(function (e) { return e.Name != 'Click & Collect' && e.CustomerPrice == GetTranslation('JavaScriptTranslations', 'PriceFree'); }).length > 0,
530        hasClickAndCollectOption = result.AvailableShippingOptions.filter(function (e) { return e.Name == 'Click & Collect'; }).length > 0;
531
532    if (result.MailOrderAvailable) {
533        var deliveryMessage;
534
535        if (hasFreeDeliveryOption && hasClickAndCollectOption) {
536            deliveryMessage = GetTranslation('JavaScriptTranslations', '02Navigation-FreeDeliveryClickAndCollect');
537        }
538        else if (hasFreeDeliveryOption) {
539            deliveryMessage = GetTranslation('JavaScriptTranslations', '02Navigation-FreeDelivery');
540        }
541        else if (hasClickAndCollectOption) {
542            deliveryMessage = GetTranslation('JavaScriptTranslations', '02Navigation-DeliveryClickAndCollect');
543        }
544        else {
545            deliveryMessage = GetTranslation('JavaScriptTranslations', '02Navigation-Delivery');
546        }
547
548        $target.textContent = deliveryMessage;
549    }
550    else if (hasClickAndCollectOption) {
551        $target.textContent = deliveryMessage = GetTranslation('JavaScriptTranslations', '02Navigation-ClickAndCollect');
552    }
553}
554
555function BuildOutputHtmlForMiniBasketItem(template, item, index, totalItems) {
556    const savingsMessage = item.IsStarbuyChild ? GetTranslation('JavaScriptTranslations', '02Navigation-StarBuySavings') : GetTranslation('JavaScriptTranslations', '02Navigation-Savings');
557
558    return template.replace(/\[\[PRODUCTURL\]\]/gm, item.ProductURL)
559        .replace(/\[\[IMGURL\]\]/gm, item.Image)
560        .replace(/\[\[QTY\]\]/gm, item.Quantity)
561        .replace(/\[\[NAME\]\]/gm, item.Name)
562        .replace(/\[\[ATTRNAME\]\]/gm, item.AttributeName)
563        .replace(/\[\[SALEPRICE\]\]/gm, item.SalePriceFormatted)
564        .replace(/\[\[SAVINGS\]\]/gm, ReplacePlaceholders(savingsMessage, item.SavingsFormatted))
565        .replace(/\[\[SHOWSAVINGS\]\]/gm, !item.SavingsVisible)
566        .replace(/\[\[SAVINGSRAW\]\]/gm, item.Savings)
567        .replace(/\[\[ISSTARBUYCHILD\]\]/gm, item.IsStarbuyChild)
568        .replace(/\[\[ISINSTARBUY\]\]/gm, item.IsStarbuyChild || item.IsStarbuyParent)
569        .replace(/\[\[SALECOLOUR\]\]/gm, item.IsStarbuyChild ? 'coStarbuys' : 'coRED')
570        .replace(/\[\[PADDINGCLASS\]\]/gm, index == totalItems - 1 ? '' : 'ctrPad16-bottom');
571}
572
573function CombineProductsAndStarbuyGroups(productsList, starbuyGroups) {
574    starbuyGroups = starbuyGroups || [];
575    var toReturn = productsList || [];
576
577    var itemIndex = 0,
578        itemCount = starbuyGroups.length;
579
580    for (itemIndex; itemIndex < itemCount; itemIndex++) {
581        toReturn.push(starbuyGroups[itemIndex].ChildItem);
582        toReturn.push(starbuyGroups[itemIndex].ParentItem);
583    }
584
585    return toReturn;
586}
587
588/**
589 * Adds any associated starbuys to the mini basket
590 */
591function AddAssociatedStarbuysToMiniBasket(result) {
592    $('.smiley-loading-anim').hide();
593    var starbuyItemContainerSelector = '#starbuy-header-item-container';
594    $(starbuyItemContainerSelector).empty();
595    $(starbuyItemContainerSelector).append(`<div class="col-1 ctrMgr8-bottom minibasket-starbuymsg boldfont small tt-uppercase ls---0-1em">${GetTranslation('JavaScriptTranslations', '02Navigation-StarBuysHeading')}</div>` + result);
596}
597
598/**
599 * Adds the 'no associated starbuy' message to the mini basket
600 */
601function AddNoStarbuysInBasketMessage() {
602    if (!$('.minibasket-nostarbuymsg').length && !$('.minibasket-starbuymsg').length) {
603        $('.smiley-loading-anim').attr('data-status', 'empty');
604
605        $('#starbuy-header-item-container').append(`<div class="col-1 ctrPad16 centralise minibasket-nostarbuymsg" style="margin-bottom:4px;" alt="${GetTranslation('JavaScriptTranslations', '02Navigation-ViewAllOffers')}
605" title="${GetTranslation('JavaScriptTranslations', '02Navigation-ViewAllOffers')}">\
606                        <div class="basketstarbuy-why ctrMgr8-bottom">${GetTranslation('JavaScriptTranslations', '02Navigation-NoStarBuys')}</div>\
607                        <a class="col-1 basketstarbuy-why sbuy-offers-link" href="/pages/starbuys/">${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '02Navigation-StarBuysLinkX0OpeningTagX1ClosingTag'), '<span class="borderi removeborder-top removeborder-left removeborder-right">', '</span>')}</a>\
608                    </div>`);
609    }
610}
611
612/**
613 * Starts a timer to check for the presence of an outstanding starbuy and toggles the mini basket to show it
614 */
615function ToggleStarbuyV2MiniBasketTimer() {
616    if (!$('.minibasket-nostarbuymsg').length && $('.basketstarbuyouter[data-status="outstanding"]').length > 0)
617    {
618        $('.minibasket-toggles > div[data-boxlink="minibasket-starbuys"]').trigger('click');
619    }
620}
621// JavaScript Document
622var runflipinterval;
623function flipImages(now) {
624
625    //What will happen?
626    function runFlip() {
627        const maxFlipWidth = $(window).width();
628        const maxFlipHeight = $(window).height();
629
630        function PixelRatio() {
631            var pixelRatio = 1;
632            if ('deviceXDPI' in screen) {
633                pixelRatio = screen.deviceXDPI / screen.logicalXDPI;
634            } else if (window.hasOwnProperty('devicePixelRatio')) {
635                pixelRatio = window.devicePixelRatio;
636            }
637            return pixelRatio;
638        }
639
640        $('.flipme, .flipmeContain').filter(':visible').each(function () {
641            var $this = $(this);
642            if (($this.visible(true) && !$(this).hasClass("flipmedone")) || $(this).hasClass("bigImg")) {
643                vpwidth = $this.width();
644
645                if (vpwidth > maxFlipWidth) {
646                    vpwidth = maxFlipWidth;
647                }
648
649                var vph = "";
650                if ($(this).hasClass("imgCtrFafDesc") || $this.attr('data-useheight')) {
651                    let heightToSet = $this.height();
652
653                    if (heightToSet > maxFlipHeight) {
654                        heightToSet = maxFlipHeight;
655                    }
656
657                    vph = '&height=' + heightToSet;
658                }
659
660                imgquality = '&quality=70';
661                if ($(this).attr("data-imgquality")) {
662                    imgquality = '&quality=' + $(this).attr("data-imgquality");
663                }
664
665                var modetype = "";
666                if ($this.attr('data-mode')) {
667                    modetype = "&mode=" + $this.attr('data-mode');
668                }
669
670                var format = '';
671                if ($this.attr('data-format')) {
672                    format = '&format=' + $this.attr('data-format');
673                } 
674
675                var bgcolor = '#fff';
676                if ($this.attr('data-bgcolor')) {
677                    bgcolor = $this.attr('data-bgcolor');
678                }
679
680                var styles1 = {
681                    background: 'url("' + $this.attr('data-image') + '?width=' + vpwidth + vph + imgquality + modetype + format + '&scale=both") no-repeat 50% 50% ' + bgcolor,
682                    backgroundSize: $this.attr('data-bgscale') ? $this.attr('data-bgscale') : 'cover',
683                };
684                if ($this.attr('data-image') === "/" || $this.attr('data-image') === "" || $this.attr('data-image') === null || $this.attr('data-image') === undefined) {
685                    $this.addClass('flipmedone bgeb');
686                }
687                else {
688                    $this.css(styles1).addClass('flipmedone');
689                }
690            }
691        });
692
693        $('.flipmeHeight').filter(':visible').each(function () {
694
695            var $this = $(this);
696            if (($this.visible(true) && !$(this).hasClass("flipmedone")) || $(this).hasClass("bigImg")) {
697                vpheight = $this.height() * PixelRatio();
698                imgquality = '&quality=90';
699                var styles1 = {
700                    background: 'url("' + $this.attr('data-image') + '?height=' + vpheight + imgquality + '") no-repeat 50% 50% #fff',
701                    backgroundSize: $this.attr('data-bgscale') ? $this.attr('data-bgscale') : 'cover',
702                };
703                if ($this.attr('data-image') == "/") {
704                    $this.css("background", "url(/platformlayout/noimage.png)");
705                }
706                else {
707                    $this.css(styles1).addClass('flipmedone');
708                }
709            }
710        });
711
712    }
713
714    //runFlip();
715    if (document.readyState != "complete") {
716        document.onreadystatechange = function () {
717            if (document.readyState === "complete") {
718                fiIntFunc();
719            }
720        }
721    } else {
722        fiIntFunc();
723    }
724
725    function fiIntFunc() {
726        runflipinterval = setInterval(function () {
727            if ($('.flipme, .flipmeContain').filter(':visible').length == $(".flipmedone").length) {
728                clearInterval(runflipinterval);
729            }
730            runFlip();
731        }, 1000);
732    }
733
734    if (now) { runFlip(); }
735}
736!function(t,e,n,o){"use strict";function i(t,e){var o,i,a=[],s=0;t&&t.isDefaultPrevented()||(t.preventDefault(),e=t&&t.data?t.data.options:e||{},o=e.$target||n(t.currentTarget),i=o.attr("data-fancybox")||"",i?(a=e.selector?n(e.selector):t.data?t.data.items:[],a=a.length?a.filter('[data-fancybox="'+i+'"]'):n('[data-fancybox="'+i+'"]'),s=a.index(o),s<0&&(s=0)):a=[o],n.fancybox.open(a,e,s))}if(t.console=t.console||{info:function(t){}}
736,n){if(n.fn.fancybox)return void console.info("fancyBox already initialized");var a={loop:!1,gutter:50,keyboard:!0,arrows:!0,infobar:!0,smallBtn:"auto",toolbar:"auto",buttons:["zoom","thumbs","close"],idleTime:3,protect:!1,modal:!1,image:{preload:!1},ajax:{settings:{data:{fancybox:!0}}},iframe:{tpl:'<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen allowtransparency="true" src=""></iframe>',preload:!0,css:{},attr:{scrolling:"auto"}},defaultType:"image",animationEffect:"zoom",animationDuration:366,zoomOpacity:"auto",transitionEffect:"fade",transitionDuration:366,slideClass:"",baseClass:"",baseTpl:'<div class="fancybox-container" role="dialog" tabindex="-1"><div class="fancybox-bg"></div><div class="fancybox-inner"><div class="fancybox-infobar"><span data-fancybox-index></span>&nbsp;/&nbsp;<span data-fancybox-count></span></div><div class="fancybox-toolbar">{{buttons}}</div><div class="fancybox-navigation">{{arrows}}</div><div class="fancybox-stage"></div><div class="fancybox-caption"></div></div></div>',spinnerTpl:'<div class="fancybox-loading"></div>',errorTpl:'<div class="fancybox-error"><p>{{ERROR}}</p></div>',btnTpl:{download:'<a download data-fancybox-download class="fancybox-button fancybox-button--download" title="{{DOWNLOAD}}" href="javascript:;"><svg viewBox="0 0 40 40"><path d="M13,16 L20,23 L27,16 M20,7 L20,23 M10,24 L10,28 L30,28 L30,24" /></svg></a>',zoom:'<button data-fancybox-zoom class="fancybox-button fancybox-button--zoom" title="{{ZOOM}}"><svg viewBox="0 0 40 40"><path d="M18,17 m-8,0 a8,8 0 1,0 16,0 a8,8 0 1,0 -16,0 M24,22 L31,29" /></svg></button>',close:'<button data-fancybox-close class="fancybox-button fancybox-button--close" title="{{CLOSE}}"><svg viewBox="0 0 40 40"><path d="M10,10 L30,30 M30,10 L10,30" /></svg></button>',smallBtn:'<button data-fancybox-close class="fancybox-close-small" title="{{CLOSE}}"><svg viewBox="0 0 32 32"><path d="M10,10 L22,22 M22,10 L10,22"></path></svg></button>',arrowLeft:'<a data-fancybox-prev class="fancybox-button fancybox-button--arrow_left" title="{{PREV}}" href="javascript:;"><svg viewBox="0 0 40 40"><path d="M18,12 L10,20 L18,28 M10,20 L30,20"></path></svg></a>',arrowRight:'<a data-fancybox-next class="fancybox-button fancybox-button--arrow_right" title="{{NEXT}}" href="javascript:;"><svg viewBox="0 0 40 40"><path d="M10,20 L30,20 M22,12 L30,20 L22,28"></path></svg></a>'},parentEl:"body",autoFocus:!1,backFocus:!0,trapFocus:!0,fullScreen:{autoStart:!1},touch:{vertical:!0,momentum:!0},hash:null,media:{},slideShow:{autoStart:!1,speed:4e3},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"},wheel:"auto",onInit:n.noop,beforeLoad:n.noop,afterLoad:n.noop,beforeShow:n.noop,afterShow:n.noop,beforeClose:n.noop,afterClose:n.noop,onActivate:n.noop,onDeactivate:n.noop,clickContent:function(t,e){return"image"===t.type&&"zoom"},clickSlide:"close",clickOutside:"close",dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1,mobile:{idleTime:!1,clickContent:function(t,e){return"image"===t.type&&"toggleControls"},clickSlide:function(t,e){return"image"===t.type?"toggleControls":"close"},dblclickContent:function(t,e){return"image"===t.type&&"zoom"},dblclickSlide:function(t,e){return"image"===t.type&&"zoom"}},lang:"en",i18n:{en:{CLOSE:"Close",NEXT:"Next",PREV:"Previous",ERROR:"The requested content cannot be loaded. <br/> Please try again later.",PLAY_START:"Start slideshow",PLAY_STOP:"Pause slideshow",FULL_SCREEN:"Full screen",THUMBS:"Thumbnails",DOWNLOAD:"Download",SHARE:"Share",ZOOM:"Zoom"},de:{CLOSE:"Schliessen",NEXT:"Weiter",PREV:"Zurück",ERROR:"Die angeforderten Daten konnten nicht geladen werden. <br/> Bitte versuchen Sie es später nochmal.",PLAY_START:"Diaschau starten",PLAY_STOP:"Diaschau beenden",FULL_SCREEN:"Vollbild",THUMBS:"Vorschaubilder",DOWNLOAD:"Herunterladen",SHARE:"Teilen",ZOOM:"Maßstab"}}},s=n(t),r=n(e),c=0,l=function(t){return t&&t.hasOwnProperty&&t instanceof n},d=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),u=function(){var t,n=e.createElement("fakeelement"),i={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(t in i)if(n.style[t]!==o)return i[t];return"transitionend"}(),f=function(t){return t&&t.length&&t[0].offsetHeight},p=function(t,e){var o=n.extend(!0,{},t,e);return n.each(e,function(t,e){n.isArray(e)&&(o[t]=e)}),o},h=function(t,o,i){var a=this;a.opts=p({index:i},n.fancybox.defaults),n.isPlainObject(o)&&(a.opts=p(a.opts,o)),n.fancybox.isMobile&&(a.opts=p(a.opts,a.opts.mobile)),a.id=a.opts.id||++c,a.currIndex=parseInt(a.opts.index,10)||0,a.prevIndex=null,a.prevPos=null,a.currPos=0,a.firstRun=!0,a.group=[],a.slides={},a.addContent(t),a.group.length&&(a.$lastFocus=n(e.activeElement).trigger("blur"),a.init())};n.extend(h.prototype,{init:function(){var i,a,r,c=this,l=c.group[c.currIndex],d=l.opts,u=n.fancybox.scrollbarWidth;"image"===l.type||!/iPad|iPhone|iPod/.test(navigator.userAgent)||t.MSStream||n("body").hasClass("fancybox-iosfix")||n("body").addClass("fancybox-iosfix").css("top",-s.scrollTop()),n.fancybox.getInstance()||(n("body").addClass("fancybox-active"),!n.fancybox.isMobile&&e.body.scrollHeight>
736t.innerHeight&&(u===o&&(i=n('<div style="width:50px;height:50px;overflow:scroll;" />').appendTo("body"),u=n.fancybox.scrollbarWidth=i[0].offsetWidth-i[0].clientWidth,i.remove()),n("head").append('<style id="fancybox-style-noscroll" type="text/css">.compensate-for-scrollbar { margin-right: '+u+"px; }</style>"),n("body").addClass("compensate-for-scrollbar"))),r="",n.each(d.buttons,function(t,e){r+=d.btnTpl[e]||""}),a=n(c.translate(c,d.baseTpl.replace("{{buttons}}",r).replace("{{arrows}}",d.btnTpl.arrowLeft+d.btnTpl.arrowRight))).attr("id","fancybox-container-"+c.id).addClass("fancybox-is-hidden").addClass(d.baseClass).data("FancyBox",c).appendTo(d.parentEl),c.$refs={container:a},["bg","inner","infobar","toolbar","stage","caption","navigation"].forEach(function(t){c.$refs[t]=a.find(".fancybox-"+t)}),c.trigger("onInit"),c.activate(),c.jumpTo(c.currIndex)},translate:function(t,e){var n=t.opts.i18n[t.opts.lang];return e.replace(/\{\{(\w+)\}\}/g,function(t,e){var i=n[e];return i===o?t:i})},addContent:function(t){var e,i=this,a=n.makeArray(t);n.each(a,function(t,e){var a,s,r,c,l,d={},u={};n.isPlainObject(e)?(d=e,u=e.opts||e):"object"===n.type(e)&&n(e).length?(a=n(e),u=a.data()||{},u=n.extend(!0,{},u,u.options),u.$orig=a,d.src=i.opts.src||u.src||a.attr("href"),d.type||d.src||(d.type="inline",d.src=e)):d={type:"html",src:e+""},d.opts=n.extend(!0,{},i.opts,u),n.isArray(u.buttons)&&(d.opts.buttons=u.buttons),s=d.type||d.opts.type,c=d.src||"",!s&&c&&((r=c.match(/\.(mp4|mov|ogv)((\?|#).*)?$/i))?(s="video",d.opts.videoFormat||(d.opts.videoFormat="video/"+("ogv"===r[1]?"ogg":r[1]))):c.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)?s="image":c.match(/\.(pdf)((\?|#).*)?$/i)?s="iframe":"#"===c.charAt(0)&&(s="inline")),s?d.type=s:i.trigger("objectNeedsType",d),d.contentType||(d.contentType=n.inArray(d.type,["html","inline","ajax"])>-1?"html":d.type),d.index=i.group.length,"auto"==d.opts.smallBtn&&(d.opts.smallBtn=n.inArray(d.type,["html","inline","ajax"])>-1),"auto"===d.opts.toolbar&&(d.opts.toolbar=!d.opts.smallBtn),d.opts.$trigger&&d.index===i.opts.index&&(d.opts.$thumb=d.opts.$trigger.find("img:first")),d.opts.$thumb&&d.opts.$thumb.length||!d.opts.$orig||(d.opts.$thumb=d.opts.$orig.find("img:first")),"function"===n.type(d.opts.caption)&&(d.opts.caption=d.opts.caption.apply(e,[i,d])),"function"===n.type(i.opts.caption)&&(d.opts.caption=i.opts.caption.apply(e,[i,d])),d.opts.caption instanceof n||(d.opts.caption=d.opts.caption===o?"":d.opts.caption+""),"ajax"===d.type&&(l=c.split(/\s+/,2),l.length>1&&(d.src=l.shift(),d.opts.filter=l.shift())),d.opts.modal&&(d.opts=n.extend(!0,d.opts,{infobar:0,toolbar:0,smallBtn:0,keyboard:0,slideShow:0,fullScreen:0,thumbs:0,touch:0,clickContent:!1,clickSlide:!1,clickOutside:!1,dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1})),i.group.push(d)}),Object.keys(i.slides).length&&(i.updateControls(),e=i.Thumbs,e&&e.isActive&&(e.create(),e.focus()))},addEvents:function(){var o=this;o.removeEvents(),o.$refs.container.on("click.fb-close","[data-fancybox-close]",function(t){t.stopPropagation(),t.preventDefault(),o.close(t)}).on("touchstart.fb-prev click.fb-prev","[data-fancybox-prev]",function(t){t.stopPropagation(),t.preventDefault(),o.previous()}).on("touchstart.fb-next click.fb-next","[data-fancybox-next]",function(t){t.stopPropagation(),t.preventDefault(),o.next()}).on("click.fb","[data-fancybox-zoom]",function(t){o[o.isScaledDown()?"scaleToActual":"scaleToFit"]()}),s.on("orientationchange.fb resize.fb",function(t){t&&t.originalEvent&&"resize"===t.originalEvent.type?d(function(){o.update()}):(o.$refs.stage.hide(),setTimeout(function(){o.$refs.stage.show(),o.update()},n.fancybox.isMobile?600:250))}),r.on("focusin.fb",function(t){var o=n.fancybox?n.fancybox.getInstance():null;o.isClosing||!o.current||!o.current.opts.trapFocus||n(t.target).hasClass("fancybox-container")||n(t.target).is(e)||o&&"fixed"!==n(t.target).css("position")&&!o.$refs.container.has(t.target).length&&(t.stopPropagation(),o.focus())}),r.on("keydown.fb",function(t){var e=o.current,i=t.keyCode||t.which;if(e&&e.opts.keyboard&&!(t.ctrlKey||t.altKey||t.shiftKey||n(t.target).is("input")||n(t.target).is("textarea")))return 8===i||27===i?(t.preventDefault(),void o.close(t)):37===i||38===i?(t.preventDefault(),void o.previous()):39===i||40===i?(t.preventDefault(),void o.next()):void o.trigger("afterKeydown",t,i)}),o.group[o.currIndex].opts.idleTime&&(o.idleSecondsCounter=0,r.on("mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle",function(t){o.idleSecondsCounter=0,o.isIdle&&o.showControls(),o.isIdle=!1}),o.idleInterval=t.setInterval(function(){o.idleSecondsCounter++,o.idleSecondsCounter>=o.group[o.currIndex].opts.idleTime&&!o.isDragging&&(o.isIdle=!0,o.idleSecondsCounter=0,o.hideControls())},1e3))},removeEvents:function(){var e=this;s.off("orientationchange.fb resize.fb"),r.off("focusin.fb keydown.fb .fb-idle"),this.$refs.container.off(".fb-close .fb-prev .fb-next"),e.idleInterval&&(t.clearInterval(e.idleInterval),e.idleInterval=null)},previous:function(t){return this.jumpTo(this.currPos-1,t)},next:function(t){return this.jumpTo(this.currPos+1,t)},jumpTo:function(t,e){var i,a,s,r,c,l,d,u=this,p=u.group.length;if(!(u.isDragging||u.isClosing||u.isAnimating&&u.firstRun)){if(t=parseInt(t,10),a=u.current?u.current.opts.loop:u.opts.loop,!a&&(t<0||t>=p))return!1;if(i=u.firstRun=!Object.keys(u.slides).length,!(p<2&&!i&&u.isDragging)){if(r=u.current,u.prevIndex=u.currIndex,u.prevPos=u.currPos,s=u.createSlide(t),p>1&&((a||s.index>0)&&u.createSlide(t-1),(a||s.index<p-1)&&u.createSlide(t+1)),u.current=s,u.currIndex=s.index,u.currPos=s.pos,u.trigger("beforeShow",i),u.updateControls(),l=n.fancybox.getTranslate(s.$slide),s.isMoved=(0!==l.left||0!==l.top)&&!s.$slide.hasClass("fancybox-animated"),s.forcedDuration=o,n.isNumeric(e)?s.forcedDuration=e:e=s.opts[i?"animationDuration":"transitionDuration"],e=parseInt(e,10),i)return s.opts.animationEffect&&e&&u.$refs.container.css("transition-duration",e+"ms"),u.$refs.container.removeClass("fancybox-is-hidden"),f(u.$refs.container),u.$refs.container.addClass("fancybox-is-open"),f(u.$refs.container),s.$slide.addClass("fancybox-slide--previous"),u.loadSlide(s),s.$slide.removeClass("fancybox-slide--previous").addClass("fancybox-slide--current"),void u.preload("image");n.each(u.slides,function(t,e){n.fancybox.stop(e.$slide)}),s.$slide.removeClass("fancybox-slide--next fancybox-slide--previous").addClass("fancybox-slide--current"),s.isMoved?(c=Math.round(s.$slide.width()),n.each(u.slides,function(t,o){var i=o.pos-s.pos;n.fancybox.animate(o.$slide,{top:0,left:i*c+i*o.opts.gutter},e,function(){o.$slide.removeAttr("style").removeClass("fancybox-slide--next fancybox-slide--previous"),o.pos===u.currPos&&(s.isMoved=!1,u.complete())})})):u.$refs.stage.children().removeAttr("style"),s.isLoaded?u.revealContent(s):u.loadSlide(s),u.preload("image"),r.pos!==s.pos&&(d="fancybox-slide--"+(r.pos>s.pos?"next":"previous"),r.$slide.removeClass("fancybox-slide--complete fancybox-slide--current fancybox-slide--next fancybox-slide--previous"),r.isComplete=!1,e&&(s.isMoved||s.opts.transitionEffect)&&(s.isMoved?r.$slide.addClass(d):(d="fancybox-animated "+d+" fancybox-fx-"+s.opts.transitionEffect,n.fancybox.animate(r.$slide,d,e,function(){r.$slide.removeClass(d).removeAttr("style")}))))}}},createSlide:function(t){var e,o,i=this;return o=t%i.group.length,o=o<0?i.group.length+o:o,!i.slides[t]&&i.group[o]&&(e=n('<div class="fancybox-slide"></div>').appendTo(i.$refs.stage),i.slides[t]=n.extend(!0,{},i.group[o],{pos:t,$slide:e,isLoaded:!1}),i.updateSlide(i.slides[t])),i.slides[t]}
736,scaleToActual:function(t,e,i){var a,s,r,c,l,d=this,u=d.current,f=u.$content,p=n.fancybox.getTranslate(u.$slide).width,h=n.fancybox.getTranslate(u.$slide).height,g=u.width,b=u.height;!d.isAnimating&&f&&"image"==u.type&&u.isLoaded&&!u.hasError&&(n.fancybox.stop(f),d.isAnimating=!0,t=t===o?.5*p:t,e=e===o?.5*h:e,a=n.fancybox.getTranslate(f),a.top-=n.fancybox.getTranslate(u.$slide).top,a.left-=n.fancybox.getTranslate(u.$slide).left,c=g/a.width,l=b/a.height,s=.5*p-.5*g,r=.5*h-.5*b,g>p&&(s=a.left*c-(t*c-t),s>0&&(s=0),s<p-g&&(s=p-g)),b>h&&(r=a.top*l-(e*l-e),r>0&&(r=0),r<h-b&&(r=h-b)),d.updateCursor(g,b),n.fancybox.animate(f,{top:r,left:s,scaleX:c,scaleY:l},i||330,function(){d.isAnimating=!1}),d.SlideShow&&d.SlideShow.isActive&&d.SlideShow.stop())},scaleToFit:function(t){var e,o=this,i=o.current,a=i.$content;!o.isAnimating&&a&&"image"==i.type&&i.isLoaded&&!i.hasError&&(n.fancybox.stop(a),o.isAnimating=!0,e=o.getFitPos(i),o.updateCursor(e.width,e.height),n.fancybox.animate(a,{top:e.top,left:e.left,scaleX:e.width/a.width(),scaleY:e.height/a.height()},t||330,function(){o.isAnimating=!1}))},getFitPos:function(t){var e,n,o,i,a,s=this,r=t.$content,c=t.width||t.opts.width,l=t.height||t.opts.height,d={};return!!(t.isLoaded&&r&&r.length)&&(i={top:parseInt(t.$slide.css("paddingTop"),10),right:parseInt(t.$slide.css("paddingRight"),10),bottom:parseInt(t.$slide.css("paddingBottom"),10),left:parseInt(t.$slide.css("paddingLeft"),10)},e=parseInt(s.$refs.stage.width(),10)-(i.left+i.right),n=parseInt(s.$refs.stage.height(),10)-(i.top+i.bottom),c&&l||(c=e,l=n),o=Math.min(1,e/c,n/l),c=Math.floor(o*c),l=Math.floor(o*l),"image"===t.type?(d.top=Math.floor(.5*(n-l))+i.top,d.left=Math.floor(.5*(e-c))+i.left):"video"===t.contentType&&(a=t.opts.width&&t.opts.height?c/l:t.opts.ratio||16/9,l>c/a?l=c/a:c>l*a&&(c=l*a)),d.width=c,d.height=l,d)},update:function(){var t=this;n.each(t.slides,function(e,n){t.updateSlide(n)})},updateSlide:function(t,e){var o=this,i=t&&t.$content,a=t.width||t.opts.width,s=t.height||t.opts.height;i&&(a||s||"video"===t.contentType)&&!t.hasError&&(n.fancybox.stop(i),n.fancybox.setTranslate(i,o.getFitPos(t)),t.pos===o.currPos&&(o.isAnimating=!1,o.updateCursor())),t.$slide.trigger("refresh"),o.$refs.toolbar.toggleClass("compensate-for-scrollbar",t.$slide.get(0).scrollHeight>t.$slide.get(0).clientHeight),o.trigger("onUpdate",t)},centerSlide:function(t,e){var i,a,s=this;s.current&&(i=Math.round(t.$slide.width()),a=t.pos-s.current.pos,n.fancybox.animate(t.$slide,{top:0,left:a*i+a*t.opts.gutter,opacity:1},e===o?0:e,null,!1))},updateCursor:function(t,e){var o,i=this,a=i.current,s=i.$refs.container.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-drag fancybox-can-zoomOut");a&&!i.isClosing&&(o=i.isZoomable(),s.toggleClass("fancybox-is-zoomable",o),n("[data-fancybox-zoom]").prop("disabled",!o),o&&("zoom"===a.opts.clickContent||n.isFunction(a.opts.clickContent)&&"zoom"===a.opts.clickContent(a))?i.isScaledDown(t,e)?s.addClass("fancybox-can-zoomIn"):a.opts.touch?s.addClass("fancybox-can-drag"):s.addClass("fancybox-can-zoomOut"):a.opts.touch&&"video"!==a.contentType&&s.addClass("fancybox-can-drag"))},isZoomable:function(){var t,e=this,n=e.current;if(n&&!e.isClosing&&"image"===n.type&&!n.hasError){if(!n.isLoaded)return!0;if(t=e.getFitPos(n),n.width>t.width||n.height>t.height)return!0}return!1},isScaledDown:function(t,e){var i=this,a=!1,s=i.current,r=s.$content;return t!==o&&e!==o?a=t<s.width&&e<s.height:r&&(a=n.fancybox.getTranslate(r),a=a.width<s.width&&a.height<s.height),a},canPan:function(){var t,e=this,n=!1,o=e.current;return"image"===o.type&&(t=o.$content)&&!o.hasError&&(n=e.getFitPos(o),n=Math.abs(t.width()-n.width)>1||Math.abs(t.height()-n.height)>1),n},loadSlide:function(t){var e,o,i,a=this;if(!t.isLoading&&!t.isLoaded){switch(t.isLoading=!0,a.trigger("beforeLoad",t),e=t.type,o=t.$slide,o.off("refresh").trigger("onReset").addClass(t.opts.slideClass),e){case"image":a.setImage(t);break;case"iframe":a.setIframe(t);break;case"html":a.setContent(t,t.src||t.content);break;case"video":a.setContent(t,'<video class="fancybox-video" controls controlsList="nodownload"><source src="'+t.src+'" type="'+t.opts.videoFormat+"\">Your browser doesn't support HTML5 video</video");break;case"inline":n(t.src).length?a.setContent(t,n(t.src)):a.setError(t);break;case"ajax":a.showLoading(t),i=n.ajax(n.extend({},t.opts.ajax.settings,{url:t.src,success:function(e,n){"success"===n&&a.setContent(t,e)},error:function(e,n){e&&"abort"!==n&&a.setError(t)}})),o.one("onReset",function(){i.abort()});break;default:a.setError(t)}return!0}}
736,setImage:function(e){var o,i,a,s,r,c=this,l=e.opts.srcset||e.opts.image.srcset;if(e.timouts=setTimeout(function(){var t=e.$image;!e.isLoading||t&&t[0].complete||e.hasError||c.showLoading(e)},300),l){s=t.devicePixelRatio||1,r=t.innerWidth*s,a=l.split(",").map(function(t){var e={};return t.trim().split(/\s+/).forEach(function(t,n){var o=parseInt(t.substring(0,t.length-1),10);return 0===n?e.url=t:void(o&&(e.value=o,e.postfix=t[t.length-1]))}),e}),a.sort(function(t,e){return t.value-e.value});for(var d=0;d<a.length;d++){var u=a[d];if("w"===u.postfix&&u.value>=r||"x"===u.postfix&&u.value>=s){i=u;break}}!i&&a.length&&(i=a[a.length-1]),i&&(e.src=i.url,e.width&&e.height&&"w"==i.postfix&&(e.height=e.width/e.height*i.value,e.width=i.value),e.opts.srcset=l)}e.$content=n('<div class="fancybox-content"></div>').addClass("fancybox-is-hidden").appendTo(e.$slide.addClass("fancybox-slide--image")),o=e.opts.thumb||!(!e.opts.$thumb||!e.opts.$thumb.length)&&e.opts.$thumb.attr("src"),e.opts.preload!==!1&&e.opts.width&&e.opts.height&&o&&(e.width=e.opts.width,e.height=e.opts.height,e.$ghost=n("<img />").one("error",function(){n(this).remove(),e.$ghost=null}).one("load",function(){c.afterLoad(e)}).addClass("fancybox-image").appendTo(e.$content).attr("src",o)),c.setBigImage(e)},setBigImage:function(t){var e=this,o=n("<img />");t.$image=o.one("error",function(){e.setError(t)}).one("load",function(){var n;t.$ghost||(e.resolveImageSlideSize(t,this.naturalWidth,this.naturalHeight),e.afterLoad(t)),t.timouts&&(clearTimeout(t.timouts),t.timouts=null),e.isClosing||(t.opts.srcset&&(n=t.opts.sizes,n&&"auto"!==n||(n=(t.width/t.height>1&&s.width()/s.height()>1?"100":Math.round(t.width/t.height*100))+"vw"),o.attr("sizes",n).attr("srcset",t.opts.srcset)),t.$ghost&&setTimeout(function(){t.$ghost&&!e.isClosing&&t.$ghost.hide()},Math.min(300,Math.max(1e3,t.height/1600))),e.hideLoading(t))}).addClass("fancybox-image").attr("src",t.src).appendTo(t.$content),(o[0].complete||"complete"==o[0].readyState)&&o[0].naturalWidth&&o[0].naturalHeight?o.trigger("load"):o[0].error&&o.trigger("error")},resolveImageSlideSize:function(t,e,n){var o=parseInt(t.opts.width,10),i=parseInt(t.opts.height,10);t.width=e,t.height=n,o>0&&(t.width=o,t.height=Math.floor(o*n/e)),i>0&&(t.width=Math.floor(i*e/n),t.height=i)},setIframe:function(t){var e,i=this,a=t.opts.iframe,s=t.$slide;t.$content=n('<div class="fancybox-content'+(a.preload?" fancybox-is-hidden":"")+'"></div>').css(a.css).appendTo(s),s.addClass("fancybox-slide--"+t.contentType),t.$iframe=e=n(a.tpl.replace(/\{rnd\}/g,(new Date).getTime())).attr(a.attr).appendTo(t.$content),a.preload?(i.showLoading(t),e.on("load.fb error.fb",function(e){this.isReady=1,t.$slide.trigger("refresh"),i.afterLoad(t)}),s.on("refresh.fb",function(){var n,i,s=t.$content,r=a.css.width,c=a.css.height;if(1===e[0].isReady){try{n=e.contents(),i=n.find("body")}catch(t){}i&&i.length&&i.children().length&&(s.css({width:"",height:""}),r===o&&(r=Math.ceil(Math.max(i[0].clientWidth,i.outerWidth(!0)))),r&&s.width(r),c===o&&(c=Math.ceil(Math.max(i[0].clientHeight,i.outerHeight(!0)))),c&&s.height(c)),s.removeClass("fancybox-is-hidden")}})):this.afterLoad(t),e.attr("src",t.src),s.one("onReset",function(){try{n(this).find("iframe").hide().unbind().attr("src","//about:blank")}catch(t){}n(this).off("refresh.fb").empty(),t.isLoaded=!1})},setContent:function(t,e){var o=this;o.isClosing||(o.hideLoading(t),t.$content&&n.fancybox.stop(t.$content),t.$slide.empty(),l(e)&&e.parent().length?(e.parent().parent(".fancybox-slide--inline").trigger("onReset"),t.$placeholder=n("<div>").hide().insertAfter(e),e.css("display","inline-block")):t.hasError||("string"===n.type(e)&&(e=n("<div>").append(n.trim(e)).contents(),3===e[0].nodeType&&(e=n("<div>").html(e))),t.opts.filter&&(e=n("<div>").html(e).find(t.opts.filter))),t.$slide.one("onReset",function(){n(this).find("video,audio").trigger("pause"),t.$placeholder&&(t.$placeholder.after(e.hide()).remove(),t.$placeholder=null),t.$smallBtn&&(t.$smallBtn.remove(),t.$smallBtn=null),t.hasError||(n(this).empty(),t.isLoaded=!1)}),n(e).appendTo(t.$slide),n(e).is("video,audio")&&(n(e).addClass("fancybox-video"),n(e).wrap("<div></div>"),t.contentType="video",t.opts.width=t.opts.width||n(e).attr("width"),t.opts.height=t.opts.height||n(e).attr("height")),t.$content=t.$slide.children().filter("div,form,main,video,audio").first().addClass("fancybox-content"),t.$slide.addClass("fancybox-slide--"+t.contentType),this.afterLoad(t))},setError:function(t){t.hasError=!0,t.$slide.trigger("onReset").removeClass("fancybox-slide--"+t.contentType).addClass("fancybox-slide--error"),t.contentType="html",this.setContent(t,this.translate(t,t.opts.errorTpl)),t.pos===this.currPos&&(this.isAnimating=!1)},showLoading:function(t){var e=this;t=t||e.current,t&&!t.$spinner&&(t.$spinner=n(e.translate(e,e.opts.spinnerTpl)).appendTo(t.$slide))},hideLoading:function(t){var e=this;t=t||e.current,t&&t.$spinner&&(t.$spinner.remove(),delete t.$spinner)},afterLoad:function(t){var e=this;e.isClosing||(t.isLoading=!1,t.isLoaded=!0,e.trigger("afterLoad",t),e.hideLoading(t),t.pos===e.currPos&&e.updateCursor(
736),!t.opts.smallBtn||t.$smallBtn&&t.$smallBtn.length||(t.$smallBtn=n(e.translate(t,t.opts.btnTpl.smallBtn)).prependTo(t.$content)),t.opts.protect&&t.$content&&!t.hasError&&(t.$content.on("contextmenu.fb",function(t){return 2==t.button&&t.preventDefault(),!0}),"image"===t.type&&n('<div class="fancybox-spaceball"></div>').appendTo(t.$content)),e.revealContent(t))},revealContent:function(t){var e,i,a,s,r=this,c=t.$slide,l=!1,d=!1;return e=t.opts[r.firstRun?"animationEffect":"transitionEffect"],a=t.opts[r.firstRun?"animationDuration":"transitionDuration"],a=parseInt(t.forcedDuration===o?a:t.forcedDuration,10),t.pos===r.currPos&&(t.isComplete?e=!1:r.isAnimating=!0),!t.isMoved&&t.pos===r.currPos&&a||(e=!1),"zoom"===e&&(t.pos===r.currPos&&a&&"image"===t.type&&!t.hasError&&(d=r.getThumbPos(t))?l=r.getFitPos(t):e="fade"),"zoom"===e?(l.scaleX=l.width/d.width,l.scaleY=l.height/d.height,s=t.opts.zoomOpacity,"auto"==s&&(s=Math.abs(t.width/t.height-d.width/d.height)>.1),s&&(d.opacity=.1,l.opacity=1),n.fancybox.setTranslate(t.$content.removeClass("fancybox-is-hidden"),d),f(t.$content),void n.fancybox.animate(t.$content,l,a,function(){r.isAnimating=!1,r.complete()})):(r.updateSlide(t),e?(n.fancybox.stop(c),i="fancybox-animated fancybox-slide--"+(t.pos>=r.prevPos?"next":"previous")+" fancybox-fx-"+e,c.removeAttr("style").removeClass("fancybox-slide--current fancybox-slide--next fancybox-slide--previous").addClass(i),t.$content.removeClass("fancybox-is-hidden"),f(c),void n.fancybox.animate(c,"fancybox-slide--current",a,function(e){c.removeClass(i).removeAttr("style"),t.pos===r.currPos&&r.complete()},!0)):(f(c),t.$content.removeClass("fancybox-is-hidden"),void(t.pos===r.currPos&&r.complete())))},getThumbPos:function(o){var i,a=this,s=!1,r=o.opts.$thumb,c=r?r.offset():0,l=function(e){for(var o,i=e[0],a=i.getBoundingClientRect(),s=[];null!==i.parentElement;)"hidden"!==n(i.parentElement).css("overflow")&&"auto"!==n(i.parentElement).css("overflow")||s.push(i.parentElement.getBoundingClientRect()),i=i.parentElement;return o=s.every(function(t){var e=Math.min(a.right,t.right)-Math.max(a.left,t.left),n=Math.min(a.bottom,t.bottom)-Math.max(a.top,t.top);return e>0&&n>0}),o&&a.bottom>0&&a.right>0&&a.left<n(t).width()&&a.top<n(t).height()};return c&&r[0].ownerDocument===e&&l(r)&&(i=a.$refs.stage.offset(),s={top:c.top-i.top+parseFloat(r.css("border-top-width")||0),left:c.left-i.left+parseFloat(r.css("border-left-width")||0),width:r.width(),height:r.height(),scaleX:1,scaleY:1}),s},complete:function(){var t=this,o=t.current,i={};!o.isMoved&&o.isLoaded&&(o.isComplete||(o.isComplete=!0,o.$slide.siblings().trigger("onReset"),t.preload("inline"),f(o.$slide),o.$slide.addClass("fancybox-slide--complete"),n.each(t.slides,function(e,o){o.pos>=t.currPos-1&&o.pos<=t.currPos+1?i[o.pos]=o:o&&(n.fancybox.stop(o.$slide),o.$slide.off().remove())}),t.slides=i),t.isAnimating=!1,t.updateCursor(),t.trigger("afterShow"),o.$slide.find("video,audio").filter(":visible:first").trigger("play"),(n(e.activeElement).is("[disabled]")||o.opts.autoFocus&&"image"!=o.type&&"iframe"!==o.type)&&t.focu
736s())},preload:function(t){var e=this,n=e.slides[e.currPos+1],o=e.slides[e.currPos-1];n&&n.type===t&&e.loadSlide(n),o&&o.type===t&&e.loadSlide(o)},focus:function(){var t,e=this.current;this.isClosing||e&&e.isComplete&&e.$content&&(t=e.$content.find("input[autofocus]:enabled:visible:first"),t.length||(t=e.$content.find("button,:input,[tabindex],a").filter(":enabled:visible:first")),t=t&&t.length?t:e.$content,t.trigger("focus"))},activate:function(){var t=this;n(".fancybox-container").each(function(){var e=n(this).data("FancyBox");e&&e.id!==t.id&&!e.isClosing&&(e.trigger("onDeactivate"),e.removeEvents(),e.isVisible=!1)}),t.isVisible=!0,(t.current||t.isIdle)&&(t.update(),t.updateControls()),t.trigger("onActivate"),t.addEvents()},close:function(t,e){var o,i,a,s,r,c,l,p=this,h=p.current,g=function(){p.cleanUp(t)};return!p.isClosing&&(p.isClosing=!0,p.trigger("beforeClose",t)===!1?(p.isClosing=!1,d(function(){p.update()}),!1):(p.removeEvents(),h.timouts&&clearTimeout(h.timouts),a=h.$content,o=h.opts.animationEffect,i=n.isNumeric(e)?e:o?h.opts.animationDuration:0,h.$slide.off(u).removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"),h.$slide.siblings().trigger("onReset").remove(),i&&p.$refs.container.removeClass("fancybox-is-open").addClass("fancybox-is-closing"),p.hideLoading(h),p.hideControls(),p.updateCursor(),"zoom"!==o||t!==!0&&a&&i&&"image"===h.type&&!h.hasError&&(l=p.getThumbPos(h))||(o="fade"),"zoom"===o?(n.fancybox.stop(a),s=n.fancybox.getTranslate(a),c={top:s.top,left:s.left,scaleX:s.width/l.width,scaleY:s.height/l.height,width:l.width,height:l.height},r=h.opts.zoomOpacity,"auto"==r&&(r=Math.abs(h.width/h.height-l.width/l.height)>.1),r&&(l.opacity=0),n.fancybox.setTranslate(a,c),f(a),n.fancybox.animate(a,l,i,g),!0):(o&&i?t===!0?setTimeout(g,i):n.fancybox.animate(h.$slide.removeClass("fancybox-slide--current"),"fancybox-animated fancybox-slide--previous fancybox-fx-"+o,i,g):g(),!0)))},cleanUp:function(t){var e,o,i=this,a=n("body");i.current.$slide.trigger("onReset"),i.$refs.container.empty().remove(),i.trigger("afterClose",t),i.$lastFocus&&i.current.opts.backFocus&&i.$lastFocus.trigger("focus"),i.current=null,e=n.fancybox.getInstance(),e?e.activate():(a.removeClass("fancybox-active compensate-for-scrollbar"),n("#fancybox-style-noscroll").remove(),a.hasClass("fancybox-iosfix")&&(o=parseInt(a[0].style.top,10),a.css("top","").removeClass("fancybox-iosfix"),s.scrollTop(-o)))},trigger:function(t,e){var o,i=Array.prototype.slice.call(arguments,1),a=this,s=e&&e.opts?e:a.current;return s?i.unshift(s):s=a,i.unshift(a),n.isFunction(s.opts[t])&&(o=s.opts[t].apply(s,i)),o===!1?o:void("afterClose"!==t&&a.$refs?a.$refs.container.trigger(t+".fb",i):r.trigger(t+".fb",i))},updateControls:function(t){var e=this,n=e.current,o=n.index,i=n.opts.caption,a=e.$refs.container,s=e.$refs.caption;n.$slide.trigger("refresh"),e.$caption=i&&i.length?s.html(i):null,e.isHiddenControls||e.isIdle||e.showControls(),a.find("[data-fancybox-count]").html(e.group.length),a.find("[data-fancybox-index]").html(o+1),a.find("[data-fancybox-prev]").toggleClass("disabled",!n.opts.loop&&o<=0),a.find("[data-fancybox-next]").toggleClass("disabled",!n.opts.loop&&o>=e.group.length-1),"image"===n.type?a.find("[data-fancybox-zoom]").show().end().find("[data-fancybox-download]").attr("href",n.opts.image.src||n.src).show():n.opts.toolbar&&a.find("[data-fancybox-download],[data-fancybox-zoom]").hide()},hideControls:function(){this.isHiddenControls=!0,this.$refs.container.removeClass("fancybox-show-infobar fancybox-show-toolbar fancybox-show-caption fancybox-show-nav")},showControls:function(){var t=this,e=t.current?t.current.opts:t.opts,n=t.$refs.container;t.isHiddenControls=!1,t.idleSecondsCounter=0,n.toggleClass("fancybox-show-toolbar",!(!e.toolbar||!e.buttons)).toggleClass("fancybox-show-infobar",!!(e.infobar&&t.group.length>1)).toggleClass("fancybox-show-nav",!!(e.arrows&&t.group.length>1)).toggleClass("fancybox-is-modal",!!e.modal),t.$caption?n.addClass("fancybox-show-caption "):n.removeClass("fancybox-show-caption")}
736,toggleControls:function(){this.isHiddenControls?this.showControls():this.hideControls()}}),n.fancybox={version:"3.3.1",defaults:a,getInstance:function(t){var e=n('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"),o=Array.prototype.slice.call(arguments,1);return e instanceof h&&("string"===n.type(t)?e[t].apply(e,o):"function"===n.type(t)&&t.apply(e,o),e)},open:function(t,e,n){return new h(t,e,n)},close:function(t){var e=this.getInstance();e&&(e.close(),t===!0&&this.close())},destroy:function(){this.close(!0),r.add("body").off("click.fb-start","**")},isMobile:e.createTouch!==o&&/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),use3d:function(){var n=e.createElement("div");return t.getComputedStyle&&t.getComputedStyle(n)&&t.getComputedStyle(n).getPropertyValue("transform")&&!(e.documentMode&&e.documentMode<11)}(),getTranslate:function(t){var e;return!(!t||!t.length)&&(e=t[0].getBoundingClientRect(),{top:e.top||0,left:e.left||0,width:e.width,height:e.height,opacity:parseFloat(t.css("opacity"))})},setTranslate:function(t,e){var n="",i={};if(t&&e)return e.left===o&&e.top===o||(n=(e.left===o?t.position().left:e.left)+"px, "+(e.top===o?t.position().top:e.top)+"px",n=this.use3d?"translate3d("+n+", 0px)":"translate("+n+")"),e.scaleX!==o&&e.scaleY!==o&&(n=(n.length?n+" ":"")+"scale("+e.scaleX+", "+e.scaleY+")"),n.length&&(i.transform=n),e.opacity!==o&&(i.opacity=e.opacity),e.width!==o&&(i.width=e.width),e.height!==o&&(i.height=e.height),t.css(i)},animate:function(t,e,i,a,s){
737    var r = !1; n.isFunction(i) && (a = i, i = null), n.isPlainObject(e) || t.removeAttr("style"), n.fancybox.stop(t), t.on(u, function (o) { (!o || !o.originalEvent || t.is(o.originalEvent.target) && "z-index" != o.originalEvent.propertyName) && (n.fancybox.stop(t), r && n.fancybox.setTranslate(t, r), n.isPlainObject(e) ? s === !1 && t.removeAttr("style") : s !== !0 && t.removeClass(e), n.isFunction(a) && a(o)) }), n.isNumeric(i) && t.css("transition-duration", i + "ms"), n.isPlainObject(e) ? (e.scaleX !== o && e.scaleY !== o && (r = n.extend({}, e, { width: t.width() * e.scaleX, height: t.height() * e.scaleY, scaleX: 1, scaleY: 1 }), delete e.width, delete e.height, t.parent().hasClass("fancybox-slide--image") && t.parent().addClass("fancybox-is-scaling")), n.fancybox.setTranslate(t, e)) : t.addClass(e), t.data("timer", setTimeout(function () { t.trigger("transitionend") }, i + 16))
738}, stop: function (t) { t && t.length && (clearTimeout(t.data("timer")), t.off("transitionend").css("transition-duration", ""), t.parent().removeClass("fancybox-is-scaling")) }
739}, n.fn.fancybox = function (t) { var e; return t = t || {}, e = t.selector || !1, e ? n("body").off("click.fb-start", e).on("click.fb-start", e, { options: t }, i) : this.off("click.fb-start").on("click.fb-start", { items: this, options: t }, i), this }, r.on("click.fb-start", "[data-fancybox]", i), r.on("click.fb-start", "[data-trigger]", function (t) { i(t, { $target: n('[data-fancybox="' + n(t.currentTarget).attr("data-trigger") + '"]').eq(n(t.currentTarget).attr("data-index") || 0), $trigger: n(this) }) })
740}
741}(window, document, window.jQuery || jQuery), function (t) { "use strict"; var e = function (e, n, o) { if (e) return o = o || "", "object" === t.type(o) && (o = t.param(o, !0)), t.each(n, function (t, n) { e = e.replace("$" + t, n || "") }), o.length && (e += (e.indexOf("?") > 0 ? "&" : "?") + o), e }, n = { youtube: { matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i, params: { autoplay: 1, autohide: 1, fs: 1, rel: 0, hd: 1, wmode: "transparent", enablejsapi: 1, html5: 1 }, paramPlace: 8, type: "iframe", url: "//www.youtube.com/embed/$4", thumb: "//img.youtube.com/vi/$4/hqdefault.jpg" }, vimeo: { matcher: /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/, params: { autoplay: 1, hd: 1, show_title: 1, show_byline: 1, show_portrait: 0, fullscreen: 1, api: 1 }, paramPlace: 3, type: "iframe", url: "//player.vimeo.com/video/$2" }, instagram: { matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, type: "image", url: "//$1/p/$2/media/?size=l" }, gmap_place: { matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i, type: "iframe", url: function (t) { return "//maps.google." + t[2] + "/?ll=" + (t[9] ? t[9] + "&z=" + Math.floor(t[10]) + (t[12] ? t[12].replace(/^\//, "&") : "") : t[12] + "").replace(/\?/, "&") + "&output=" + (t[12] && t[12].indexOf("layer=c") > 0 ? "svembed" : "embed") } }, gmap_search: { matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i, type: "iframe", url: function (t) { return "//maps.google." + t[2] + "/maps?q=" + t[5].replace("query=", "q=").replace("api=1", "") + "&output=embed" } } }; t(document).on("objectNeedsType.fb", function (o, i, a) { var s, r, c, l, d, u, f, p = a.src || "", h = !1; s = t.extend(!0, {}, n, a.opts.media), t.each(s, function (n, o) { if (c = p.match(o.matcher)) { if (h = o.type, f = n, u = {}, o.paramPlace && c[o.paramPlace]) { d = c[o.paramPlace], "?" == d[0] && (d = d.substring(1)), d = d.split("&"); for (var i = 0; i < d.length; ++i){ var s = d[i].split("=", 2); 2 == s.length && (u[s[0]] = decodeURIComponent(s[1].replace(/\+/g, " "))) } } return l = t.extend(!0, {}, o.params, a.opts[n], u), p = "function" === t.type(o.url) ? o.url.call(this, c, l, a) : e(o.url, c, l), r = "function" === t.type(o.thumb) ? o.thumb.call(this, c, l, a) : e(o.thumb, c), "vimeo" === n && (p = p.replace("&%23", "#")), !1 } }), h ? (a.opts.thumb || a.opts.$thumb && a.opts.$thumb.length || (a.opts.thumb = r), "iframe" === h && (a.opts = t.extend(!0, a.opts, { iframe: { preload: !1, attr: { scrolling: "no" } } })), t.extend(a, { type: h, src: p, origSrc: a.src, contentSource: f, contentType: "image" === h ? "image" : "gmap_place" == f || "gmap_search" == f ? "map" : "video" })) : p && (a.type = a.opts.defaultType) }) }(window.jQuery || jQuery), function (t, e, n) { "use strict"; var o = function () { return t.requestAnimationFrame || t.webkitRequestAnimationFrame || t.mozRequestAnimationFrame || t.oRequestAnimationFrame || function (e) { return t.setTimeout(e, 1e3 / 60) } }(), i = function () { return t.cancelAnimationFrame || t.webkitCancelAnimationFrame || t.mozCancelAnimationFrame || t.oCancelAnimationFrame || function (e) { t.clearTimeout(e) } }(), a = function (e) { var n = []; e = e.originalEvent || e || t.e, e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e]; for (var o in e) e[o].pageX ? n.push({ x: e[o].pageX, y: e[o].pageY }) : e[o].clientX && n.push({ x: e[o].clientX, y: e[o].clientY }); return n }, s = function (t, e, n) { return e && t ? "x" === n ? t.x - e.x : "y" === n ? t.y - e.y : Math.sqrt(Math.pow(t.x - e.x, 2) + Math.pow(t.y - e.y, 2)) : 0 }, r = function (t) { if (t.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio') || n.isFunction(t.get(0).onclick) || t.data("selectable")) return !0; for (var e = 0, o = t[0].attributes, i = o.length; e < i; e++)if ("data-fancybox-" === o[e].nodeName.substr(0, 14)) return !0; return !1 }, c = function (e) { var n = t.getComputedStyle(e)["overflow-y"], o = t.getComputedStyle(e)["overflow-x"], i = ("scroll" === n || "auto" === n) && e.scrollHeight > e.clientHeight, a = ("scroll" === o || "auto" === o) && e.scrollWidth > e.clientWidth; return i || a }, l = function (t) { for (var e = !1; ;){ if (e = c(t.get(0))) break; if (t = t.parent(), !t.length || t.hasClass("fancybox-stage") || t.is("body")) break } return e }, d = function (t) { var e = this; e.instance = t, e.$bg = t.$refs.bg, e.$stage = t.$refs.stage, e.$container = t.$refs.container, e.destroy(), e.$container.on("touchstart.fb.touch mousedown.fb.touch", n.proxy(e, "ontouchstart")) }; d.prototype.destroy = function () { this.$container.off(".fb.touch") }, d.prototype.ontouchstart = function (o) { var i = this, c = n(o.target), d = i.instance, u = d.current, f = u.$content, p = "touchstart" == o.t
741ype; if (p && i.$container.off("mousedown.fb.touch"), (!o.originalEvent || 2 != o.originalEvent.button) && c.length && !r(c) && !r(c.parent()) && (c.is("img") || !(o.originalEvent.clientX > c[0].clientWidth + c.offset().left))) { if (!u || d.isAnimating || d.isClosing) return o.stopPropagation(), void o.preventDefault(); if (i.realPoints = i.startPoints = a(o), i.startPoints.length) { if (o.stopPropagation(), i.startEvent = o, i.canTap = !0, i.$target = c, i.$content = f, i.opts = u.opts.touch, i.isPanning = !1, i.isSwiping = !1, i.isZooming = !1, i.isScrolling = !1, i.startTime = (new Date).getTime(), i.distanceX = i.distanceY = i.distance = 0, i.canvasWidth = Math.round(u.$slide[0].clientWidth), i.canvasHeight = Math.round(u.$slide[0].clientHeight), i.contentLastPos = null, i.contentStartPos = n.fancybox.getTranslate(i.$content) || { top: 0, left: 0 }, i.sliderStartPos = i.sliderLastPos || n.fancybox.getTranslate(u.$slide), i.stagePos = n.fancybox.getTranslate(d.$refs.stage), i.sliderStartPos.top -= i.stagePos.top, i.sliderStartPos.left -= i.stagePos.left, i.contentStartPos.top -= i.stagePos.top, i.contentStartPos.left -= i.stagePos.left, n(e).off(".fb.touch").on(p ? "touchend.fb.touch touchcancel.fb.touch" : "mouseup.fb.touch mouseleave.fb.touch", n.proxy(i, "ontouchend")).on(p ? "touchmove.fb.touch" : "mousemove.fb.touch", n.proxy(i, "ontouchmove")), n.fancybox.isMobile && e.addEventListener("scroll", i.onscroll, !0), !i.opts && !d.c
741anPan() || !c.is(i.$stage) && !i.$stage.find(c).length) return void (c.is(".fancybox-image") && o.preventDefault()); n.fancybox.isMobile && (l(c) || l(c.parent())) || o.preventDefault(), (1 === i.startPoints.length || u.hasError) && (i.instance.canPan() ? (n.fancybox.stop(i.$content), i.$content.css("transition-duration", ""), i.isPanning = !0) : i.isSwiping = !0, i.$container.addClass("fancybox-controls--isGrabbing")), 2 === i.startPoints.length && "image" === u.type && (u.isLoaded || u.$ghost) && (i.canTap = !1, i.isSwiping = !1, i.isPanning = !1, i.isZooming = !0, n.fancybox.stop(i.$content), i.$content.css("transition-duration", ""), i.centerPointStartX = .5 * (i.startPoints[0].x + i.startPoints[1].x) - n(t).scrollLeft(), i.centerPointStartY = .5 * (i.startPoints[0].y + i.startPoints[1].y) - n(t).scrollTop(), i.percentageOfImageAtPinchPointX = (i.centerPointStartX - i.contentStartPos.left) / i.contentStartPos.width, i.percentageOfImageAtPinchPointY = (i.centerPointStartY - i.contentStartPos.top) / i.contentStartPos.height, i.startDistanceBetweenFingers = s(i.startPoints[0], i.startPoints[1])) } } }, d.prototype.onscroll = function (t) { var n = this; n.isScrolling = !0, e.removeEventListener("scroll", n.onscroll, !0) }, d.prototype.ontouchmove = function (t) { var e = this, o = n(t.target); return void 0 !== t.originalEvent.buttons && 0 === t.originalEvent.buttons ? void e.ontouchend(t) : e.isScrolling || !o.is(e.$stage) && !e.$stage.find(o).length ? void (e.canTap = !1) : (e.newPoints = a(t), void ((e.opts || e.instance.canPan()) && e.newPoints.length && e.newPoints.length && (e.isSwiping && e.isSwiping === !0 || t.preventDefault(), e.distanceX = s(e.newPoints[0], e.startPoints[0], "x"), e.distanceY = s(e.newPoints[0], e.startPoints[0], "y"), e.distance = s(e.newPoints[0], e.startPoints[0]), e.distance > 0 && (e.isSwiping ? e.onSwipe(t) : e.isPanning ? e.onPan() : e.isZooming && e.onZoom())))) }, d.prototype.onSwipe = function (e) { var a, s = this, r = s.isSwiping, c = s.sliderStartPos.left || 0; if (r !== !0) "x" == r && (s.distanceX > 0 && (s.instance.group.length < 2 || 0 === s.instance.current.index && !s.instance.current.opts.loop) ? c += Math.pow(s.distanceX, .8) : s.distanceX < 0 && (s.instance.group.length < 2 || s.instance.current.index === s.instance.group.length - 1 && !s.instance.current.opts.loop) ? c -= Math.pow(-s.distanceX, .8) : c += s.distanceX), s.sliderLastPos = { top: "x" == r ? 0 : s.sliderStartPos.top + s.distanceY, left: c }, s.requestId && (i(s.requestId), s.requestId = null), s.requestId = o(function () { s.sliderLastPos && (n.each(s.instance.slides, function (t, e) { var o = e.pos - s.instance.currPos; n.fancybox.setTranslate(e.$slide, { top: s.sliderLastPos.top, left: s.sliderLastPos.left + o * s.canvasWidth + o * e.opts.gutter }) }), s.$container.addClass("fancybox-is-sliding")) }); else if (Math.abs(s.distance) > 10) { if (s.canTap = !1, s.instance.group.length < 2 && s.opts.vertical ? s.isSwiping = "y" : s.instance.isDragging || s.opts.vertical === !1 || "auto" === s.opts.vertical && n(t).width() > 800 ? s.isSwiping = "x" : (a = Math.abs(180 * Math.atan2(s.distanceY, s.distanceX) / Math.PI), s.isSwiping = a > 45 && a < 135 ? "y" : "x"), s.canTap = !1, "y" === s.isSwiping && n.fancybox.isMobile && (l(s.$target) || l(s.$target.parent()))) return void (s.isScrolling = !0); s.instance.isDragging = s.isSwiping, s.startPoints = s.newPoints, n.each(s.instance.slides, function (t, e) { n.fancybox.stop(e.$slide), e.$slide.css("transition-duration", ""), e.inTransition = !1, e.pos === s.instance.current.pos && (s.sliderStartPos.left = n.fancybox.getTranslate(e.$slide).left - n.fancybox.getTranslate(s.instance.$refs.stage).left) }), s.instance.SlideShow && s.instance.SlideShow.isActive && s.instance.SlideShow.stop() } }, d.prototype.onPan = function () { var t = this; return s(t.newPoints[0], t.realPoints[0]) < (n.fancybox.isMobile ? 10 : 5) ? void (t.startPoints = t.newPoints) : (t.canTap = !1, t.contentLastPos = t.limitMovement(), t.requestId && (i(t.requestId), t.requestId = null), void (t.requestId = o(function () { n.fancybox.setTranslate(t.$content, t.contentLastPos) }))) }, d.prototype.limitMovement = function () { var t, e, n, o, i, a, s = this, r = s.canvasWidth, c = s.canvasHeight, l = s.distanceX, d = s.distanceY, u = s.contentStartPos, f = u.left, p = u.top, h = u.width, g = u.height; return i = h > r ? f + l : f, a = p + d, t = Math.max(0, .5 * r - .5 * h), e = Math.max(0, .5 * c - .5 * g), n = Math.min(r - h, .5 * r - .5 * h), o = Math.min(c - g, .5 * c - .5 * g), l > 0 && i > t && (i = t - 1 + Math.pow(-t + f + l, .8) || 0), l < 0 && i < n && (i = n + 1 - Math.pow(n - f - l, .8) || 0), d > 0 && a > e && (a = e - 1 + Math.pow(-e + p + d, .8) || 0), d < 0 && a < o && (a = o + 1 - Math.pow(o - p - d, .8) || 0), { top: a, left: i } }, d.prototype.limitPosition = function (t, e, n, o) { var i = this, a = i.canvasWidth, s = i.canvasHeight; return n > a ? (t = t > 0 ? 0 : t, t = t < a - n ? a - n : t) : t = Math.max(0, a / 2 - n / 2), o > s ? (e = e > 0 ? 0 : e, e = e < s - o ? s - o : e) : e = Math.max(0, s / 2 - o / 2), { top: e, left: t } }, d.prototype.onZoom = function () { var e = this, a = e.contentStartPos, r = a.width, c = a.height, l = a.left, d = a.top, u = s(e.newPoints[0], e.newPoints[1]), f = u / e.startDistanceBetweenFingers, p = Math.floor(r * f), h = Math.floor(c * f), g = (r - p) * e.percentageOfImageAtPinchPointX, b = (c - h) * e.percentageOfImageAtPinchPointY, m = (e.newPoints[0].x + e.newPoints[1].x) / 2 - n(t).scrollLeft(), y = (e.newPoints[0].y + e.newPoints[1].y) / 2 - n(t).scrollTop(), v = m - e.centerPointStartX, x = y - e.centerPointStartY, w = l + (g + v), $ = d + (b + x), S = { top: $, left: w, scaleX: f, scaleY: f }; e.canTap = !1, e.newWidth = p, e.newHeight = h, e.contentLastPos = S, e.requestId && (i(e.requestId), e.requestId = null), e.requestId = o(function () { n.fancybox.setTranslate(e.$content, e.contentLastPos) }) }, d.prototype.ontouchend = function (t) { var o = this, s = Math.max((new Date).getTime() - o.startTime, 1), r = o.isSwiping, c = o.isPanning, l = o.isZooming, d = o.isScrolling; return o.endPoints = a(t), o.$container.removeClass("fancybox-controls--isGrabbing"), n(e).off(".fb.touch"), e.removeEventListener("scroll", o.onscroll, !0), o.requestId && (i(o.requestId), o.requestId = null), o.isSwiping = !1, o.isPanning = !1, o.isZooming = !1, o.isScrolling = !1, o.instance.isDragging = !1, o.canTap ? o.onTap(t) : (o.speed = 366, o.velocityX = o.distanceX / s * .5, o.velocityY = o.distanceY / s * .5, o.speedX = Math.max(.5 * o.speed, Math.min(1.5 * o.speed, 1 / Math.abs(o.velocityX) * o.speed)), void (c ? o.endPanning() : l ? o.endZooming() : o.endSwiping(r, d))) }, d.prototype.endSwiping = function (t, e) { var o = this, i = !1, a = o.instance.group.length; o.sliderLastPos = null, "y" == t && !e && Math.abs(o.distanceY) > 50 ? (n.fancybox.animate(o.instance.current.$slide, { top: o.sliderStartPos.top + o.distanceY + 150 * o.velocityY, opacity: 0 }, 200), i = o.instance.close(!0, 200)) : "x" == t && o.distanceX > 50 && a > 1 ? i = o.instance.previous(o.speedX) : "x" == t && o.distanceX < -50 && a > 1 && (i = o.instance.next(o.speedX)), i !== !1 || "x" != t && "y" != t || (e || a < 2 ? o.instance.centerSlide(o.instance.current, 150) : o.instance.jumpTo(o.instance.current.index)), o.$container.removeClass("fancybox-is-sliding") }, d.prototype.endPanning = function () { var t, e, o, i = this;
741 i.contentLastPos && (i.opts.momentum === !1 ? (t = i.contentLastPos.left, e = i.contentLastPos.top) : (t = i.contentLastPos.left + i.velocityX * i.speed, e = i.contentLastPos.top + i.velocityY * i.speed), o = i.limitPosition(t, e, i.contentStartPos.width, i.contentStartPos.height), o.width = i.contentStartPos.width, o.height = i.contentStartPos.height, n.fancybox.animate(i.$content, o, 330)) }, d.prototype.endZooming = function () { var t, e, o, i, a = this, s = a.instance.current, r = a.newWidth, c = a.newHeight; a.contentLastPos && (t = a.contentLastPos.left, e = a.contentLastPos.top, i = { top: e, left: t, width: r, height: c, scaleX: 1, scaleY: 1 }, n.fancybox.setTranslate(a.$content, i), r < a.canvasWidth && c < a.canvasHeight ? a.instance.scaleToFit(150) : r > s.width || c > s.height ? a.instance.scaleToActual(a.centerPointStartX, a.centerPointStartY, 150) : (o = a.limitPosition(t, e, r, c), n.fancybox.setTranslate(a.$content, n.fancybox.getTranslate(a.$content)), n.fancybox.animate(a.$content, o, 150))) }, d.prototype.onTap = function (e) { var o, i = this, s = n(e.target), r = i.instance, c = r.current, l = e && a(e) || i.startPoints, d = l[0] ? l[0].x - n(t).scrollLeft() - i.stagePos.left : 0, u = l[0] ? l[0].y - n(t).scrollTop() - i.stagePos.top : 0, f = function (t) { var o = c.opts[t]; if (n.isFunction(o) && (o = o.apply(r, [c, e])), o) switch (o) { case "close": r.close(i.startEvent); break; case "toggleControls": r.toggleControls(!0); break; case "next": r.next(); break; case "nextOrClose": r.group.length > 1 ? r.next() : r.close(i.startEvent); break; case "zoom": "image" == c.type && (c.isLoaded || c.$ghost) && (r.canPan() ? r.scaleToFit() : r.isScaledDown() ? r.scaleToActual(d, u) : r.group.length < 2 && r.close(i.startEvent)) } }; if ((!e.originalEvent || 2 != e.originalEvent.button) && (s.is("img") || !(d > s[0].clientWidth + s.offset().left))) { if (s.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container")) o = "Outside"; else if (s.is(".fancybox-slide")) o = "Slide"; else { if (!r.current.$content || !r.current.$content.find(s).addBack().filter(s).length) return; o = "Content" } if (i.tapped) { if (clearTimeout(i.tapped), i.tapped = null, Math.abs(d - i.tapX) > 50 || Math.abs(u - i.tapY) > 50) return this; f("dblclick" + o) } else i.tapX = d, i.tapY = u, c.opts["dblclick" + o] && c.opts["dblclick" + o] !== c.opts["click" + o] ? i.tapped = setTimeout(function () { i.tapped = null, f("click" + o) }, 500) : f("click" + o); return this } }, n(e).on("onActivate.fb", function (t, e) { e && !e.Guestures && (e.Guestures = new d(e)) }) }(window, document, window.jQuery || jQuery), function (t, e) { "use strict"; e.extend(!0, e.fancybox.defaults, { btnTpl: { slideShow: '<button data-fancybox-play class="fancybox-button fancybox-button--play" title="{{PLAY_START}}"><svg viewBox="0 0 40 40"><path d="M13,12 L27,20 L13,27 Z" /><path d="M15,10 v19 M23,10 v19" /></svg></button>' }, slideShow: { autoStart: !1, speed: 3e3 } }); var n = function (t) { this.instance = t, this.init() }; e.extend(n.prototype, { timer: null, isActive: !1, $button: null, init: function () { var t = this; t.$button = t.instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function () { t.toggle() }), (t.instance.group.length < 2 || !t.instance.group[t.instance.currIndex].opts.slideShow) && t.$button.hide() }, set: function (t) { var e = this; e.instance && e.instance.current && (t === !0 || e.instance.current.opts.loop || e.instance.currIndex < e.instance.group.length - 1) ? e.timer = setTimeout(function () { e.isActive && e.instance.jumpTo((e.instance.currIndex + 1) % e.instance.group.length) }, e.instance.current.opts.slideShow.speed) : (e.stop(), e.instance.idleSecondsCounter = 0, e.instance.showControls()) }, clear: function () { var t = this; clearTimeout(t.timer), t.timer = null }, start: function () { var t = this, e = t.instance.current; e && (t.isActive = !0, t.$button.attr("title", e.opts.i18n[e.opts.lang].PLAY_STOP).removeClass("fancybox-button--play").addClass("fancybox-button--pause"), t.set(!0)) }, stop: function () { var t = this, e = t.instance.current; t.clear(), t.$button.attr("title", e.opts.i18n[e.opts.lang].PLAY_START).removeClass("fancybox-button--pause").addClass("fancybox-button--play"), t.isActive = !1 }, toggle: function () { var t = this; t.isActive ? t.stop() : t.start() } }), e(t).on({ "onInit.fb": function (t, e) { e && !e.SlideShow && (e.SlideShow = new n(e)) }, "beforeShow.fb": function (t, e, n, o) { var i = e && e.SlideShow; o ? i && n.opts.slideShow.autoStart && i.start() : i && i.isActive && i.clear() }, "afterShow.fb": function (t, e, n) { var o = e && e.SlideShow; o && o.isActive && o.set() }, "afterKeydown.fb": function (n, o, i, a, s) { var r = o && o.SlideShow; !r || !i.opts.slideShow || 80 !== s && 32 !== s || e(t.activeElement).is("button,a,input") || (a.preventDefault(), r.toggle(
741)) }, "beforeClose.fb onDeactivate.fb": function (t, e) { var n = e && e.SlideShow; n && n.stop() } }), e(t).on("visibilitychange", function () { var n = e.fancybox.getInstance(), o = n && n.SlideShow; o && o.isActive && (t.hidden ? o.clear() : o.set()) }) }(document, window.jQuery || jQuery), function (t, e) { "use strict"; var n = function () { for (var e = [["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"], ["webkitRequestFullscreen", "webkitExitFullscreen", "webkitFullscreenElement", "webkitFullscreenEnabled", "webkitfullscreenchange", "webkitfullscreenerror"], ["webkitRequestFullScreen", "webkitCancelFullScreen", "webkitCurrentFullScreenElement", "webkitCancelFullScreen", "webkitfullscreenchange", "webkitfullscreenerror"], ["mozRequestFullScreen", "mozCancelFullScreen", "mozFullScreenElement", "mozFullScreenEnabled", "mozfullscreenchange", "mozfullscreenerror"], ["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"]], n = {}, o = 0; o < e.length; o++){ var i = e[o]; if (i && i[1] in t) { for (var a = 0; a < i.length; a++)n[e[0][a]] = i[a]; return n } } return !1 }(); if (!n) return void (e && e.fancybox && (e.fancybox.defaults.btnTpl.fullScreen = !1)); var o = { request: function (e) { e = e || t.documentElement, e[n.requestFullscreen](e.ALLOW_KEYBOARD_INPUT) }, exit: function () { t[n.exitFullscreen]() }, toggle: function (e) { e = e || t.documentElement, this.isFullscreen() ? this.exit() : this.request(e) }, isFullscreen: function () { return Boolean(t[n.fullscreenElement]) }, enabled: function () { return Boolean(t[n.fullscreenEnabled]) } }; e.extend(!0, e.fancybox.defaults, { btnTpl: { fullScreen: '<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fullscreen" title="{{FULL_SCREEN}}"><svg viewBox="0 0 40 40"><path d="M9,12 v16 h22 v-16 h-22 v8" /></svg></button>' }, fullScreen: { autoStart: !1 } }), e(t).on({ "onInit.fb": function (t, e) { var n; e && e.group[e.currIndex].opts.fullScreen ? (n = e.$refs.container, n.on("click.fb-fullscreen", "[data-fancybox-fullscreen]", function (t) { t.stopPropagation(), t.preventDefault(), o.toggle() }), e.opts.fullScreen && e.opts.fullScreen.autoStart === !0 && o.request(), e.FullScreen = o) : e && e.$refs.toolbar.find("[data-fancybox-fullscreen]").hide() }, "afterKeydown.fb": function (t, e, n, o, i) { e && e.FullScreen && 70 === i && (o.preventDefault(), e.FullScreen.toggle()) }, "beforeClose.fb": function (t, e) { e && e.FullScreen && e.$refs.container.hasClass("fancybox-is-fullscreen") && o.exit() } }), e(t).on(n.fullscreenchange, function () { var t = o.isFullscreen(), n = e.fancybox.getInstance(); n && (n.current && "image" === n.current.type && n.isAnimating && (n.current.$content.css("transition", "none"), n.isAnimating = !1, n.update(!0, !0, 0)), n.trigger("onFullscreenChange", t), n.$refs.container.toggleClass("fancybox-is-fullscreen", t)) }) }(document, window.jQuery || jQuery), function (t, e) { "use strict"; var n = "fancybox-thumbs", o = n + "-active", i = n + "-loading"; e.fancybox.defaults = e.extend(!0, { btnTpl: { thumbs: '<button data-fancybox-thumbs class="fancybox-button fancybox-button--thumbs" title="{{THUMBS}}"><svg viewBox="0 0 120 120"><path d="M30,30 h14 v14 h-14 Z M50,30 h14 v14 h-14 Z M70,30 h14 v14 h-14 Z M30,50 h14 v14 h-14 Z M50,50 h14 v14 h-14 Z M70,50 h14 v14 h-14 Z M30,70 h14 v14 h-14 Z M50,70 h14 v14 h-14 Z M70,70 h14 v14 h-14 Z" /></svg></button>' }, thumbs: { autoStart: !1, hideOnClose: !0, parentEl: ".fancybox-container", axis: "y" } }, e.fancybox.defaults); var a = function (t) { this.init(t) }; e.extend(a.prototype, { $button: null, $grid: null, $list: null, isVisible: !1, isActive: !1, init: function (t) { var e, n, o = this; o.instance = t, t.Thumbs = o, o.opts = t.group[t.currIndex].opts.thumbs, e = t.group[0], e = e.opts.thumb || !(!e.opts.$thumb || !e.opts.$thumb.length) && e.opts.$thumb.attr("src"), t.group.length > 1 && (n = t.group[1], n = n.opts.thumb || !(!n.opts.$thumb || !n.opts.$thumb.length) && n.opts.$thumb.attr("src")), o.$button = t.$refs.toolbar.find("[data-fancybox-thumbs]"), o.opts && e && n && e && n ? (o.$button.show().on("click", function () { o.toggle() }), o.isActive = !0) : o.$button.hide() }, create: function () { var t, o = this, a = o.instance, s = o.opts.parentEl, r = []; o.$grid || (o.$grid = e('<div class="' + n + " " + n + "-" + o.opts.axis + '"></div>').appendTo(a.$refs.container.find(s).addBack().filter(s)), o.$grid.on("click", "li", function () { a.jumpTo(e(this).attr("data-index")) })), o.$list || (o.$list = e("<ul>").appendTo(o.$grid)), e.each(a.group, function (e, n) { t = n.opts.thumb || (n.opts.$thumb ? n.opts.$thumb.attr("src") : null), t || "image" !== n.type || (t = n.src), r.push('<li data-index="' + e + '" tabindex="0" class="' + i + '"' + (t && t.length ? ' style="background-image:url(' + t + ')" />' : "") + "></li>") }), o.$list[0].innerHTML = r.join(""), "x" === o.opts.axis && o.$list.width(parseInt(o.$grid.css("padding-right"), 10) + a.group.length * o.$list.children().eq(0).outerWidth(!0)) }, focus: function (t) { var e, n, i = this, a = i.$list, s = i.$grid; i.instance.current && (e = a.children().removeClass(o).filter('[data-index="' + i.instance.current.index + '"]').addClass(o), n = e.position(), "y" === i.opts.axis && (n.top < 0 || n.top > a.height() - e.outerHeight()) ? a.stop().animate({ scrollTop: a.scrollTop() + n.top }, t) : "x" === i.opts.axis && (n.left < s.scrollLeft() || n.left > s.scrollLeft() + (s.width() - e.outerWidth())) && a.parent().stop().animate({ scrollLeft: n.left }, t)) }, update: function () { var t = this; t.instance.$refs.container.toggleClass("fancybox-show-thumbs", this.isVisible), t.isVisible ? (t.$grid || t.create(), t.instance.trigger("onThumbsShow"), t.focus(0)) : t.$grid && t.instance.trigger("onThumbsHide"), t.instance.update(
741) }, hide: function () { this.isVisible = !1, this.update() }, show: function () { this.isVisible = !0, this.update() }, toggle: function () { this.isVisible = !this.isVisible, this.update() } }), e(t).on({ "onInit.fb": function (t, e) { var n; e && !e.Thumbs && (n = new a(e), n.isActive && n.opts.autoStart === !0 && n.show()) }, "beforeShow.fb": function (t, e, n, o) { var i = e && e.Thumbs; i && i.isVisible && i.focus(o ? 0 : 250) }, "afterKeydown.fb": function (t, e, n, o, i) { var a = e && e.Thumbs; a && a.isActive && 71 === i && (o.preventDefault(), a.toggle()) }, "beforeClose.fb": function (t, e) { var n = e && e.Thumbs; n && n.isVisible && n.opts.hideOnClose !== !1 && n.$grid.hide() } }) }(document, window.jQuery || jQuery), function (t, e) { "use strict"; function n(t) { var e = { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;", "/": "&#x2F;", "`": "&#x60;", "=": "&#x3D;" }; return String(t).replace(/[&<>"'`=\/]/g, function (t) { return e[t] }) } e.extend(!0, e.fancybox.defaults, { btnTpl: { share: '<button data-fancybox-share class="fancybox-button fancybox-button--share" title="{{SHARE}}"><svg viewBox="0 0 40 40"><path d="M6,30 C8,18 19,16 23,16 L23,16 L23,10 L33,20 L23,29 L23,24 C19,24 8,27 6,30 Z"></svg></button>' }, share: { url: function (t, e) { return !t.currentHash && "inline" !== e.type && "html" !== e.type && (e.origSrc || e.src) || window.location }, tpl: '<div class="fancybox-share"><h1>{{SHARE}}</h1><p><a class="fancybox-share__button fancybox-share__button--fb" href="https://www.facebook.com/sharer/sharer.php?u={{url}}"><svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m287 456v-299c0-21 6-35 35-35h38v-63c-7-1-29-3-55-3-54 0-91 33-91 94v306m143-254h-205v72h196" /></svg><span>Facebook</span></a><a class="fancybox-share__button fancybox-share__button--tw" href="https://twitter.com/intent/tweet?url={{url}}&text={{descr}}"><svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m456 133c-14 7-31 11-47 13 17-10 30-27 37-46-15 10-34 16-52 20-61-62-157-7-141 75-68-3-129-35-169-85-22 37-11 86 26 109-13 0-26-4-37-9 0 39 28 72 65 80-12 3-25 4-37 2 10 33 41 57 77 57-42 30-77 38-122 34 170 111 378-32 359-208 16-11 30-25 41-42z" /></svg><span>Twitter</span></a><a class="fancybox-share__button fancybox-share__button--pt" href="https://www.pinterest.com/pin/create/button/?url={{url}}&description={{descr}}&media={{media}}"><svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m265 56c-109 0-164 78-164 144 0 39 15 74 47 87 5 2 10 0 12-5l4-19c2-6 1-8-3-13-9-11-15-25-15-45 0-58 43-110 113-110 62 0 96 38 96 88 0 67-30 122-73 122-24 0-42-19-36-44 6-29 20-60 20-81 0-19-10-35-31-35-25 0-44 26-44 60 0 21 7 36 7 36l-30 125c-8 37-1 83 0 87 0 3 4 4 5 2 2-3 32-39 42-75l16-64c8 16 31 29 56 29 74 0 124-67 124-157 0-69-58-132-146-132z" fill="#fff"/></svg><span>Pinterest</span></a></p><p><input class="fancybox-share__input" type="text" value="{{url_raw}}" /></p></div>' } }), e(t).on("click", "[data-fancybox-share]", function () { var t, o, i = e.fancybox.getInstance(), a = i.current || null; a && ("function" === e.type(a.opts.share.url) && (t = a.opts.share.url.apply(a, [i, a])), o = a.opts.share.tpl.replace(/\{\{media\}\}/g, "image" === a.type ? encodeURIComponent(a.src) : "").replace(/\{\{url\}\}/g, encodeURIComponent(t)).replace(/\{\{url_raw\}\}/g, n(t)).replace(/\{\{descr\}\}/g, i.$caption ? encodeURIComponent(i.$caption.text()) : ""), e.fancybox.open({ src: i.translate(i, o), type: "html", opts: { animationEffect: !1, afterLoad: function (t, e) { i.$refs.container.one("beforeClose.fb", function () { t.close(null, 0) }), e.$content.find(".fancybox-share__links a").click(function () { return window.open(this.href, "Share", "width=550, height=450"), !1 }) } } })) }) }(document, window.jQuery || jQuery), function (t, e, n) { "use strict"; function o() { var t = e.location.hash.substr(1), n = t.split("-"), o = n.length > 1 && /^\+?\d+$/.test(n[n.length - 1]) ? parseInt(n.pop(-1), 10) || 1 : 1, i = n.join("-"); return { hash: t, index: o < 1 ? 1 : o, gallery: i } } function i(t) { var e; "" !== t.gallery && (e = n("[data-fancybox='" + n.escapeSelector(t.gallery) + "']").eq(t.index - 1).trigger("click.fb-start")) } function a(t) { var e, n; return !!t && (e = t.current ? t.current.opts : t.opts, n = e.hash || (e.$orig ? e.$orig.data("fancybox") : ""), "" !== n && n) } n.escapeSelector || (n.escapeSelector = function (t) { var e = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, n = function (t, e) { return e ? "\0" === t ? "�" : t.slice(0, -1) + "\\" + t.charCodeAt(t.length - 1).toString(16) + " " : "\\" + t }; return (t + "").replace(e, n) }), n(function () { n.fancybox.defaults.hash !== !1 && (n(t).on({ "onInit.fb": function (t, e) { var n, i; e.group[e.currIndex].opts.hash !== !1 && (n = o(), i = a(e), i && n.gallery && i == n.gallery && (e.currIndex = n.index - 1)) }, "beforeShow.fb": function (n, o, i, s) { var r; i && i.opts.hash !== !1 && (r = a(o), r && (o.currentHash = r + (o.group.length > 1 ? "-" + (i.index + 1) : ""), e.location.hash !== "#" + o.currentHash && (o.origHash || (o.origHash = e.location.hash), o.hashTimer && clearTimeout(o.hashTimer), o.hashTimer = setTimeout(function () { "replaceState" in e.history ? (e.history[s ? "pushState" : "replaceState"]({}, t.title, e.location.pathname + e.location.search + "#" + o.currentHash), s && (o.hasCreatedHistory = !0)) : e.location.hash = o.currentHash, o.hashTimer = null }, 300)))) }, "beforeClose.fb": function (n, o, i) { var s; i.opts.hash !== !1 && (s = a(o), o.currentHash && o.hasCreatedHistory ? e.history.back() : o.currentHash && ("replaceState" in e.history ? e.history.replaceState({}, t.title, e.location.pathname + e.location.search + (o.origHash || "")) : e.location.hash = o.origHash), o.currentHash = null, clearTimeout(o.hashTimer)) } }), n(e).on("hashchange.fb", function () { var t, e = o(); n.each(n(".fancybox-container").get().reverse(), function (e, o) { var i = n(o).data("FancyBox"); if (i.currentHash) return t = i, !1 }), t ? !t.currentHash || t.currentHash === e.gallery + "-" + e.index || 1 === e.index && t.currentHash == e.gallery || (t.currentHash = null, t.close()) : "" !== e.gallery && i(e) }), setTimeout(function () { n.fancybox.getInstance() || i(o()) }, 50)) }) }(document, window, window.jQuery || jQuery), function (t, e) { "use strict"; var n = (new Date).getTime(); e(t).on({ "onInit.fb": function (t, e, o) { e.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll", function (t) { var o = e.current, i = (new Date).getTime(); e.group.length < 2 || o.opts.wheel === !1 || "auto" === o.opts.wheel && "image" !== o.type || (t.preventDefault(), t.stopPropagation(), o.$slide.hasClass("fancybox-animated") || (t = t.originalEvent || t, i - n < 250 || (n = i, e[(-t.deltaY || -t.deltaX || t.wheelDelta || -t.detail) < 0 ? "next" : "previous"]()))) }) } }) }(document, window.jQuery || jQuery);
742
743
744// Bind .MIV to use Fancybox functionality.
745(function () {
746    document.addEventListener("readystatechange", function () {
747        if (document.readyState === "interactive") {
748            $('.MIV').fancybox({
749                loop: false,
750                transitionEffect: "fade",
751                transitionDuration: 300
752            });
753        }
754    }, false);
755})();var PDPSchema;
756function appendSiteSchema() {
757
758  var prot = window.location.protocol;
759  var hnam = window.location.hostname;
760    var siteLinksSchema = {
761        "@context": "http://schema.org",
762        "@type": "WebSite",
763        "url": prot + '//' + hnam + '/',
764        "potentialAction": {
765            "@type": "SearchAction",
766            "target": window.location.protocol + '//' + window.location.host + getFacetResultsUrl(
766) + "?term={search_term_string}",
767            "query-input": "required name=search_term_string"
768        }
769    };
770  appendSchema(siteLinksSchema);
771
772  var schema = {
773    "@context": "http://schema.org",
774    "@graph": ''
775  };
776  var temparray = [];
777  $('#navi .CSSChild').each(function(i) {
778    var $t = $(this);
779    temparray.push({
780      "@type":"SiteNavigationElement",
781      "name": $t.text(),
782      "url": prot+'//'+hnam+$t.attr('href'),
783    });
784  });
785  schema['@graph'] = removeDuplicatesJSON(temparray);
786  appendSchema(schema);
787
788  // Find and Filter
789  if ($('input[name*="facetsearch"]').length > 0) {
790    var PLPSchema = {
791      "@context": "http://schema.org",
792      "@type": "CollectionPage",
793      "name": $('h1').text(),
794      "url": window.location.href,
795      "mainEntity":{
796        "@type": "ItemList",
797        "numberOfItems": $('.devProductData').length,
798         "itemListElement":[]
799      }
800    };
801    $('.devProductData').each(function(i) {
802      PLPSchema.mainEntity.itemListElement.push({
803        "@type": "Product",
804        "image":prot+'//'+hnam+'/'+$(this).attr('data-imagelargepath'),
805        "url": prot+'//'+hnam+'/'+$(this).attr('data-navigationurl'),
806        "name": $(this).attr('data-name'),
807        "offers": {"@type": "Offer", "availability": "http://schema.org/InStock", "price": $(this).attr('data-saleprice'), "priceCurrency": "GBP"}
808      });
809    });
810    appendSchema(PLPSchema);
811  }
812}
813
814function appendSchema(data)
815{
816    $('body, BODY').append('<script type="application/ld+json">' + JSON.stringify(data) + '</script>');
817}
818
819function removeDuplicatesJSON(json_all) {
820  var arr = [], collection = [];
821  $.each(json_all, function (index, value) {
822    if ($.inArray(value.url, arr) == -1) {
823      arr.push(value.url);
824      collection.push(value);
825    }
826  });
827  return collection;
828}
829var LOADINGSPINNERID = 'loading-detailfast';
830/** @constant
831 * @type {number}
832 * The maximum number of days before an item changes from "instock" to "available"
833 */
834var MAXIMUMDAYSTODISPLAYINSTOCK = 10,
835    MAXIMUMSTOCKLEVEL = 3;
836var A2B_HANDLINGATTRIBUTENAME = 'data-handlingmsg',
837    A2B_COLLECTATTRIBUTENAME = 'data-collectmsg';
838
839function add2basket_followupActions(result) {
840    var hasProductId = typeof ProductID !== 'undefined' && ProductID;
841
842    if (hasProductId) {
843        var loaderId = (typeof ProductID != "undefined" ?
844            'stateful-loader-' + ProductID :
845            '');
846
847        StatefulLoader(loaderId, true);
848    }
849
850    if (typeof ResetAdd2basketCover === 'function' && hasProductId) {
851        setTimeout(ResetAdd2basketCover(ProductID), 3000);
852    }
853
854    var $a2b = $('.dropdownA2B');
855
856    const basketElementDropdown = document.querySelector('.basketCtr.tbcnt');
857    const dropDownIsOpen = basketElementDropdown?.classList?.contains('tbcntOpen');
858    if (dropDownIsOpen === false) {
859        document.querySelector('.navIcons div.icon-bag').click();
860    }
861    else if (dropDownIsOpen) {
862        LoadMiniBasketHeader();
863    }
864
865    $a2b.remove('#trOutofStockAjax');
866    $a2b.after(`<div class="col-1 newsletterSuccess ctrPad16 centralise colorwhite" style="margin-bottom:16px;"><span class="fa fa-check"></span> &nbsp; ${GetTranslation('JavaScriptTranslations', '07AddToBasket-CongratulationsItemAddedToBasket')}</div>`);
867    
868    // Show a message to indicate successful item addition	
869    setTimeout(function () {
870        $('.newsletterSuccess').fadeOut(300);
871    }, 10000);
872    setTimeout(function () {
873        $('.newsletterSuccess').remove();
874    }, 10301);
875    // Fade the basket check out
876    if (typeof showhidmodalQVDD == "function") { showhidmodalQVDD(false); }
877}
878
879function ResetAdd2basketCover(productid) {
880    StatefulLoaderReset('stateful-loader-' + productid);
881    $('.a2bCover').removeClass('a2bAdded').fadeOut(150);
882}
883
884function LoadAddToBasket(targetElement, productId) {
885    AddStatefulLoadingSpinnerGlobal(LOADINGSPINNERID);
886
887    var cartTemplate = '<div class="col-1 add-to-cart-area" data-productid="[[PRODUCTID]]">'+
888                            '<div class="col-1 add-to-cart-area-1"><div class="col-1 zflex-s">'+
889                                '<div class="flex-grow1 add-to-cart-area-dropdown">'+
890                                    '<select tabindex="2" data-productid="[[PRODUCTID]]" onchange="AddBasketSelectChanged(event)">[[OPTIONS]]</select>'+
891                                '</div></div><div class="col-1 zflex-s add-to-cart-area-1-row-2"><div class="col-1 zflex-sb flex-grow1">'+
892                                '<div class="add-to-cart-area-dropdown-qty zflex-s">'+
893        '<div class="add-to-cart-area-dropdown-qty-label bgStandard coWhite flex-grow0">' + GetTranslation('JavaScriptTranslations', '07AddToBasket-QuantityButton') + '</div>'+
894                                    '<input class="text-center" tabindex="3" t
894ype="text" value="1" onclick="select();" onkeypress="return (event.keyCode > 47 && event.keyCode < 58);" />'+
895                                '</div>'+
896                                '<div tabindex="4"'+
897                                    'class="add-to-cart-area-button bgStandard"'+
898                                        'data-available=""></div>'+
899                            '</div></div></div>'+
900                            '<div class="col-1 add-to-cart-area-2">'+
901                                '<div class="col-1 flex-grow1 add-to-cart-area-msg">'+
902                                    '<div class="col-1 add-to-cart-area-msg-stock" data-qty="" data-amountmsg="" ></div>'+
903                                    '<div class="col-1 add-to-cart-area-msg-handling"'+
904        A2B_HANDLINGATTRIBUTENAME + '="" ' + A2B_COLLECTATTRIBUTENAME + '="" data-hideme="' + ecommerceConfig.A2BSettings.HideLeadTime +'"></div>'+
905                                '</div>'+
906                            '</div>'+
907                        '</div>';
908
909    var options = [];
910
911    var activePromise = $.Deferred(),
912        attributePromise = $.Deferred(),
913        processPromise = $.Deferred(),
914        finalPromise = $.Deferred();
915
916    CheckAddBasketActiveStatus(targetElement, productId, activePromise);
917
918    $.when(activePromise)
919        .then(function (resolveValue) {
920            if (resolveValue) {
921                GetAttributeGridForAddToBasket(productId, attributePromise);
922            }
923        });
924
925    $.when(attributePromise)
926        .then(function (resolveValue) {
927            if (resolveValue) {
928                ProcessAttributeGridForAddToBasket(resolveValue, productId, processPromise);
929            }
930        });
931
932    $.when(processPromise)
933        .then(function (resolveValue) {
934            if (resolveValue) {
935                options = resolveValue;
936                finalPromise.resolve();
937            }
938        });
939
940    // This is where the good stuff happens
941    $.when(finalPromise)
942        .then(function (_) {
943            var toAddToDom = cartTemplate.replace(/\[\[PRODUCTID\]\]/g, productId)
944                .replace(/\[\[OPTIONS\]\]/g, options.join());
945
946            targetElement.html(toAddToDom);
947
948            initClickAndCollectLocations();
949
950            if (typeof SetSelectedA2BAttributeBasedOnURLParam == 'function') {
951                SetSelectedA2BAttributeBasedOnURLParam(targetElement.find('select'));
952            }
953
954            var dropdown = targetElement.find('select');
955            if (dropdown && dropdown.children().length == 2) {
956                dropdown.children().each(function () {
957                    if ($(this).val() != '-1') {
958                        $(this).prop('selected', true);
959                        dropdown.trigger('change');
960                    }
961                });
962            }
963        });
964
965}
966
967function CheckAddBasketActiveStatus(targetElement, productId, deferredObj) {
968    var sendData = {
969        "prodID": productId
970    };
971
972    var warningHTML = `<div class="col-1 clWarning5">${GetTranslation('JavaScriptTranslations', '07AddToBasket-ProductNoLongerAvailable')}</div>`;
973
974    $.ajax({
975        type: "POST",
976        url: "/wsCitrusStore.asmx/isProductActive",
977        data: JSON.stringify(sendData),
978        contentType: "application/json; charset=utf-8",
979        dataType: "json",
980        success: function (data) {
981            if (data.d === false) {
982                targetElement.append(warningHTML);
983            }
984            deferredObj.resolve(data.d);
985        },
986        error: function () {
987            targetElement.append(warningHTML);
988            deferredObj.resolve(false);
989        }
990    });
991}
992
993function GetAttributeGridForAddToBasket(productId, deferredObj) {
994    const params = new URLSearchParams(window.location.search);
995    const preview = params.get('preview');
996
997    var sendData = {
998        controlLocation: "/modules/controls/clAttributeControl.ascx",
999        productId: productId,
1000        isDetailPage: true,
1001        dollar: 0,
1002        percentage: 0,
1003        preview: preview ?? false
1004    };
1005    $.ajax({
1006        type: "POST",
1007        url: "/wsCitrusStore.asmx/GetAttributesControl",
1008        data: JSON.stringify(sendData),
1009        contentType: "application/json; charset=utf-8",
1010        dataType: "json",
1011        success: function (data) {
1012            deferredObj.resolve(data);
1013        },
1014        error: function () {
1015            deferredObj.resolve(false);
1016        }
1017    });
1018}
1019
1020function ProcessAttributeGridForAddToBasket(results, productId, deferredObj) {
1021    var optionsToReturn = [`<option value="-1" data-status="null">${GetTranslation('JavaScriptTranslations', '07AddToBasket-ChooseYourOption')}</option>`];
1022
1023    var parsedHTML = $(results.d.HTML);
1024    var attRows = parsedHTML.find('.attRow');
1025
1026    sortAttributesByInStockAndThenAttributeOrder(attRows);
1027
1028    attRows.each(function () {
1029        var $this = $(this);
1030        var attQtyLocal = $this.attr('data-qtyinstock');
1031     
1032        var attributeQtyInStock = (!Number.isNaN(attQtyLocal) ? (Number(attQtyLocal) >= MAXIMUMSTOCKLEVEL ? MAXIMUMSTOCKLEVEL + "+" : Number(attQtyLocal)) : 0);
1033
1034        var attributeCode = $this.find('#attCode').text();
1035        var attributeName = $this.find('#attName').text();
1036        var attributePrice = $this.find('#attPrice span[id*="lblPrice"]').text();
1037        var attributeWasPrice = $this.find('#attWasPrice').text();
1038        var attributeDiscountLevel = $this.find('#attDiscountLevel').text();
1039        var attributeDetailID = ($this.find('.Attattributeid').text() !== 'undefined' ? $this.find('.Attattributeid').text() : 0);
1040        var attributeID = ($this.find('.hiddenFieldAttID').val() !== 'undefined' ? $this.find('.hiddenFieldAttID').val() : 0);
1041        var attributeStockStatus = $this.find('#attStockMessage').text().toLowerCase();
1042        var notifylink = '.' + $this.find('#trOutofStockAjax').attr('class');
1043
1044        if (attributeStockStatus === "out of stock"
1045            || attributeStockStatus === "no stock"
1046            || attributeStockStatus === "new season, coming soon.") {
1047            attributeName = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '07AddToBasket-OutOfStockX0VariantName'), attributeName);
1048        }
1049        else if (attributeStockStatus === "special order available") {
1050            attributeName = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '07AddToBasket-SpecialOrderX0VariantName'), attributeName);
1051        }
1052        else if (attributeStockStatus.indexOf("last") > -1 || attributeStockStatus.indexOf("few") > -1 || attributeStockStatus.indexOf("hurry") > -1) {
1053            attributeName = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '07AddToBasket-HurryLastFewX0VariantName'), attributeName);
1054        }
1055        else if (attributeStockStatus.indexOf("warehouse") != -1) {
1056            attributeName = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '07AddToBasket-InWarehouseX0VariantName'), attributeName);
1057        }
1058
1059        optionsToReturn.push('<option data-qty="1" data-onclick="CallAddToBasketMethodFromClick(event, ' + productId + ', ' + attributeDetailID + ', ' + attributeID + ')" '
1060            + ' data-onkeypress="if (event.keyCode === 13) { CallAddToBasketMethodFromClick(event, ' + productId + ', ' + attributeDetailID + ', ' + attributeID + ');} return false;" '
1061            + 'data-status="' + attributeStockStatus + '" '
1062            + 'data-id="' + attributeID + '" '
1063            + 'data-detailid="' + attributeDetailID + '" '
1064            + 'data-price="' + attributePrice + '" '
1065            + 'data-was-price="' + attributeWasPrice + '" '
1066            + 'data-discount-level="' + attributeDiscountLevel + '" '
1067            + 'data-notify-target="' + notifylink + '" '
1068            + 'data-qtyinstock="' + attributeQtyInStock + '" '
1069            + 'value="' + attributeCode + '">'
1070            + attributeName + ' - ' + attributePrice
1071            + '</option>');
1072
1073    });
1074
1075    deferredObj.resolve(optionsToReturn);
1076}
1077
1078/**
1079 * Sort attributes out of stock last.
1080 * @param  attRows The att rows.
1081 * @returns The sorted attributes out of stock last.
1082 */
1083function sortAttributesByInStockAndThenAttributeOrder(attRows) {
1084    attRows.sort(function (attRowElA, attRowElB) {
1085        var attQtyLocalA = $(attRowElA).attr('data-qtyinstock');
1086        var attQtyLocalB = $(attRowElB).attr('data-qtyinstock');
1087
1088        var notInStockA = (Number.isNaN(attQtyLocalA)) ? 0 : (Number(attQtyLocalA) > 0) ? 0 : 1;
1089        var notInStockB = (Number.isNaN(attQtyLocalB)) ? 0 : (Number(attQtyLocalB) > 0) ? 0 : 1;
1090
1091        var attAOrder = $(attRowElA).attr('data-displayorder');
1092        var attBOrder = $(attRowElB).attr('data-displayorder');
1093
1094        return notInStockA - notInStockB || attAOrder - attBOrder;
1095    });
1096}
1097
1098function AddBasketSelectChanged(event) {
1099
1100    var dropdown = $(event.target);
1101    var wrapper = dropdown.parent().parent().parent();
1102    var button = wrapper.find('.add-to-cart-area-button');
1103
1104    var selectedOption = GetSelectedOptionValuesAddBasket(dropdown.find(':selected'));
1105
1106    SetStockMessageForAttributesAddBasket(selectedOption, dropdown);
1107    SetAddBasketButtonState(selectedOption, button, wrapper);
1108
1109    if (typeof SetPriceElementOnDetailPageToNewValue == 'function') {
1110        SetPriceElementOnDetailPageToNewValue(selectedOption.price, selectedOption.wasPrice, selectedOption.discountLevel);
1111    }
1112
1113    document.dispatchEvent(new CustomEvent('attributeSelected', {
1114        detail: selectedOption
1115    }));
1116}
1117
1118function CallAddToBasketMethodFromClick(event, productId, attributeDetailId, attributeId) {
1119    var parent = $(event.target).parent();
1120    var qty = parent
1121        .find('.add-to-cart-area-dropdown-qty input')
1122        .val();
1123
1124    if (qty == 'undefined') {
1125        qty = 1;
1126    }
1127
1128    if (!Number.isInteger(attributeId)) attributeId = 0;
1129    if (!Number.isInteger(attributeDetailId)) attributeDetailId = 0;
1130
1131    ToggleLoadingSpinnerByName(LOADINGSPINNERID, true);
1132    var callback = $.Deferred();
1133    Add2BasketAttributeCtrl(productId, attributeId, attributeDetailId, qty, callback);
1134
1135    $.when(callback)
1136        .then(function (_) {
1137            ToggleLoadingSpinnerByName(LOADINGSPINNERID, false);
1138            document.dispatchEvent(new CustomEvent('ItemAddedToBasket'));
1139        });
1140}
1141
1142function GetSelectedOptionValuesAddBasket(selectedOption) {
1143    return {
1144        attributeId: selectedOption.attr('data-id'),
1145        attributeDetailId: selectedOption.attr('data-detailid'),
1146        status: selectedOption.attr('data-status'),
1147        value: $.trim(selectedOption.attr('value')),
1148        price: selectedOption.attr('data-price'),
1149        wasPrice: selectedOption.attr('data-was-price'),
1150        discountLevel: selectedOption.attr('data-discount-level'),
1151        qtyAvailable: selectedOption.attr('data-qtyinstock'),
1152        onclick: selectedOption.attr('data-onclick'),
1153        onkeypress: selectedOption.attr('data-onkeypress')
1154    };
1155}
1156
1157function SetStockMessageForAttributesAddBasket(selectedOption, dropdown) {
1158    var wrapper = dropdown.parent().parent().parent().parent();
1159    var msgStockEl = wrapper.find('.add-to-cart-area-msg-stock');
1160    var msgHandlingEl = wrapper.find('.add-to-cart-area-msg-handling');
1161
1162    // If the "select an option" attribute is selected
1163    if (selectedOption.value.toString() === '-1') {
1164        msgStockEl.attr('data-qty', '');
1165        msgStockEl.attr('data-amountmsg', '');
1166        SetDeliveryCollectionElement(msgHandlingEl, '', '');
1167    }
1168    // if it's backorder
1169    else if (selectedOption.status === "special order available") {
1170        msgStockEl.attr('data-qty', '');
1171        msgStockEl.attr('data-amountmsg', GetTranslation('JavaScriptTranslations', '07AddToBasket-AvailableToSpecialOrder'));
1172
1173        SetDeliveryCollectionElement(msgHandlingEl, GetTranslation('JavaScriptTranslations', '07AddToBasket-SpecialOrdered'), GetTranslation('JavaScriptTranslations', '07AddToBasket-SpecialOrderCollectionAvailable'));
1174    }
1175    // if it's non-inventory - no translation needed as 'data-amountmsg' is hidden if value is "non tracked" in CSS
1176    else if (selectedOption.status.indexOf("non tracked") > -1) {
1177        msgStockEl.attr('data-qty', '');
1178        msgStockEl.attr('data-amountmsg', 'non tracked');
1179        SetDeliveryCollectionElement(msgHandlingEl, 'non tracked', 'non tracked');
1180    }
1181    // no special item conditions (everything else)
1182    else {
1183        msgStockEl.attr('data-qty', '')
1184            .attr('data-amountmsg', '');
1185
1186        SetDeliveryCollectionElement(msgHandlingEl, GetTranslation('JavaScriptTranslations', '07AddToBasket-CheckingWithCouriers'), '');
1187
1188        CitrusStore.CitrusStore.wsCitrusStore.CourierIntegration_GetDeliveryQuote(parseInt(dropdown.attr('data-productid')),
1189            selectedOption.attributeId != 'undefined' ? selectedOption.attributeId : 0,
1190            selectedOption.attributeDetailId != 'undefined' ? selectedOption.attributeDetailId : 0,
1191            function (data) {
1192                msgStockEl.attr('data-qty', selectedOption.qtyAvailable);
1193                SetAddBasketStockLeadtimeMessageArea(msgStockEl, data, msgHandlingEl);
1194                if (selectedOption.status.indexOf("pre-order") > -1) {
1195                    msgStockEl.attr('data-qty', '');
1196                    msgStockEl.attr('data-amountmsg', GetTranslation('JavaScriptTranslations', '07AddToBasket-PreOrderItem'));
1197                    msgStockEl.addClass('amountmsg-preorder');
1198                }
1199                else {
1200                    msgStockEl.removeClass('amountmsg-preorder');
1201                }
1202            },
1203            function (err) {
1204                onFailedAddWS(err);
1205                msgStockEl.attr('data-amountmsg', GetTranslation('JavaScriptTranslations', '07AddToBasket-LeadTimeAvailable'));
1206                SetDeliveryCollectionElement(msgHandlingEl, '', '');
1207
1208                /* Invalid site configuration - critical error */
1209                OnErrorFromCourierIntegration_GetDeliveryQuoteShowModalMessage(err);
1210            });
1211    }
1212}
1213
1214/**
1215 * Sets the data-attributes for delivery and collection for the element provided into the msgHandlingEl param
1216 * @param msgHandlingEl {HTMLElement} The element for which the data-attributes will be updated
1217 * @param deliveryMessage {string} The delivery message we will update
1218 * @param collectionMessage {string} The collection message we will update
1219 */
1220function SetDeliveryCollectionElement(msgHandlingEl, deliveryMessage, collectionMessage) {
1221    msgHandlingEl.attr(A2B_HANDLINGATTRIBUTENAME, deliveryMessage);
1222    msgHandlingEl.attr(A2B_COLLECTATTRIBUTENAME, collectionMessage);
1223}
1224
1225function SetAddBasketStockLeadtimeMessageArea(msgStockEl, data, msgHandlingEl) {
1226    var isQuickerThanMaxDisplayValue = (data.Days2Prepare < MAXIMUMDAYSTODISPLAYINSTOCK);
1227    var now = new Date();
1228    var tomorrow = new Date();
1229
1230    tomorrow.setDate(tomorrow.getDate() + 1);
1231
1232    var earliestDespatch = new Date(data.EarliestDespatch);
1233    var earliestCollection = new Date(data.EarliestCollection);
1234
1235    SetDeliveryCollectionElement(msgHandlingEl,
1236        GetDeliveryMessage(data, now, earliestDespatch, tomorrow, isQuickerThanMaxDisplayValue),
1237        GetCollectionMessage(data, now, earliestCollection, tomorrow, isQuickerThanMaxDisplayValue));
1238    msgStockEl.attr('data-amountmsg', isQuickerThanMaxDisplayValue ? GetTranslation('JavaScriptTranslations', '07AddToBasket-LeadTimeInStock') : GetTranslation('JavaScriptTranslations', '07AddToBasket-LeadTimeAvailable'));
1239}
1240
1241/**
1242 * Builds a handling message based on the parameters provided
1243 * @param  data {object} Response object from CourierIntegration_GetDeliveryQuote.
1244 * @param  now {Date} The date and time now.
1245 * @param  earliestCollection {Date} The date and time dispatch is available.
1246 * @param  tomorrow {Date} now + 24 hours.
1247 * @param  isQuickerThanMaxDisplayValue {boolean} Is the item available quicker than MAXIMUMDAYSTODISPLAYINSTOCK.
1248 * @returns The collection message.
1249 */
1250function GetCollectionMessage(data, now, earliestCollection, tomorrow, isQuickerThanMaxDisplayValue) {
1251    const locale = Intl.DateTimeFormat().resolvedOptions().locale;
1252
1253    var availableToday = DatesTheSame(now, earliestCollection);
1254    var theCollectionMessage = '';
1255
1256    // Not sure about the precedence here - am sort of reading it as if data.CanShip will always win if true?
1257    // Tested it in the browser console and it does ... do we really want 'Click and Collect' if data.CanColect is false?
1258    if (data.CanCollect && availableToday || data.CanShip) {
1259        theCollectionMessage = GetTranslation('JavaScriptTranslations', '07AddToBasket-ClickAndCollectAvailable');
1260    }
1261    else if (data.CanCollect) {
1262        if (availableToday) {
1263            theCollectionMessage = ReplacePlaceholders(
1264                GetTranslation('JavaScriptTranslations', '07AddToBasket-OrderByForClickAndCollectX0CollectionTime'),
1265                earliestCollection.toLocaleTimeString(locale, { timeStyle: 'short' }));
1266        }
1267        else if (DatesTheSame(tomorrow, earliestCollection)) {
1268            theCollectionMessage = GetTranslation('JavaScriptTranslations', '07AddToBasket-DeliveryCollectionTomorrow');
1269        }
1270        else {
1271            theCollectionMessage = earliestCollection.toLocaleDateString(locale, { dateStyle: 'long' });
1272        }
1273    }
1274
1275    return theCollectionMessage;
1276}
1277
1278/**
1279 * Builds a handling message based on the parameters provided
1280 * @param data {object} Response object from CourierIntegration_GetDeliveryQuote
1281 * @param now {Date} The date and time now
1282 * @param earliestDespatch {Date} The date and time dispatch is available
1283 * @param tomorrow {Date} now + 24 hours
1284 * @param isQuickerThanMaxDisplayValue {boolean} Is the item available quicker than MAXIMUMDAYSTODISPLAYINSTOCK
1285 */
1286function GetDeliveryMessage(data, now, earliestDespatch, tomorrow, isQuickerThanMaxDisplayValue) {
1287    const locale = Intl.DateTimeFormat().resolvedOptions().locale;
1288    var theDeliveryMessage = '';
1289
1290    if (data.CanShip) {
1291        if (DatesTheSame(now, earliestDespatch)) {
1292            theDeliveryMessage = ReplacePlaceholders(
1293                GetTranslation('JavaScriptTranslations', '07AddToBasket-OrderByForDespatchX0DespatchTime'),
1294                earliestDespatch.toLocaleTimeString(locale, { timeStyle: 'short' }));
1295        }
1296        else if (DatesTheSame(tomorrow, earliestDespatch)) {
1297            theDeliveryMessage = GetTranslation('JavaScriptTranslations', '07AddToBasket-DeliveryCollectionTomorrow');
1298        }
1299        else {
1300            theDeliveryMessage = earliestDespatch.toLocaleDateString(locale, { dateStyle: 'long' });
1301        }
1302    }
1303
1304    return theDeliveryMessage;
1305}
1306
1307/// <summary>Returns true if two dates are the same</summary>
1308/// <param name="date1">The first date.</param>
1309/// <param name="date2">The second date.</param>
1310/// <returns>True if the dates are the same, false if not.</returns>
1311function DatesTheSame(date1, date2) {
1312    return (date1.getDate() == date2.getDate() &&
1313        date1.getMonth() == date2.getMonth() &&
1314        date1.getYear() == date2.getYear());
1315}
1316
1317function SetAddBasketButtonState(selectedOption, button, wrapper) {
1318    button.off('click').off('keypress').attr('onclick', '').attr('onkeypress', '');
1319
1320    if (selectedOption.value == -1) {
1321        wrapper.attr('data-selected', false)
1322            .attr('data-available', '');
1323        button.attr('data-available', '');
1324        button.click(InactiveAddBasketButtonClick);
1325    }
1326    else if (selectedOption.status === "out of stock"
1327        || selectedOption.status === "no stock"
1328        || selectedOption.status === "new season, coming soon.") {
1329        wrapper.attr('data-selected', false)
1330            .attr('data-available', false);
1331        button.attr('data-available', false);
1332        button.click(OutOfStockAddBasketButtonClick);
1333    }
1334    else {
1335        wrapper.attr('data-selected', true)
1336            .attr('data-available', true);
1337        button.attr('data-available', true);
1338        button.attr('onclick', selectedOption.onclick);
1339        button.attr('onkeypress', selectedOption.onkeypress);
1340    }
1341}
1342
1343function OutOfStockAddBasketButtonClick(event) {
1344    var button = $(event.target);
1345    var dropdown = button.parent().parent().parent().find('select');
1346    var selectedOption = GetSelectedOptionValuesAddBasket(dropdown.find(':selected'));
1347
1348    var buttonParent = button.closest('[data-productid]');
1349    var productId = buttonParent.attr('data-productid');
1350
1351    var msgContent = '<div class="col-1">' +
1352        `<p>${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '07AddToBasket-EnterYourEmailClickSendButtonX0TranslatedSend'), GetTranslation('JavaScriptTranslations', '07AddToBasket-SendButtonText'))}</p>` +
1353        '<div class="col-1 zflex-s">' +
1354        '<input class="col- flex-grow1 add-to-cart-input-back-in-stock" type="email" autocomplete />' +
1355        `<div class="col-" onclick="AddStockNotificationModular(event)" data-productid="${productId}" data-attributedetailid="${selectedOption.attributeDetailId}">${GetTranslation('JavaScriptTranslations', '07AddToBasket-SendButtonText')}</div>` +
1356        '</div>' +
1357        '<div class="col-1" data-backinstock="true"></div>' +
1358        '</div>';
1359
1360    var promiseName = 'OutOfStockAddBasketButtonClickPromise',
1361        messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
1362
1363    window[promiseName] = $.Deferred();
1364
1365    messageConfig.Header = GetTranslation('JavaScriptTranslations', '07AddToBasket-NotificationRequestHeader');
1366    messageConfig.Body = msgContent;
1367    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '07AddToBasket-NotificationRequestCloseButtonText');
1368
1369    ModularModalMessage(promiseName, messageConfig);
1370}
1371
1372function AddStockNotificationModular(event) {
1373    var sendNotificationButton = $(event.target);
1374    var inputEl = sendNotificationButton.siblings('input[type="email"]');
1375    var backInStockEl = sendNotificationButton.parent().siblings('[data-backinstock]');
1376
1377    var prodId = Number(sendNotificationButton.attr('data-productid'));
1378    var attDetailId = Number(sendNotificationButton.attr('data-attributedetailid'));
1379
1380    if (!Number.isInteger(prodId)) prodId = 0;
1381    if (!Number.isInteger(attDetailId)) attDetailId = 0;
1382
1383    if (inputEl) {
1384        $.when(validateEmail(inputEl.val()))
1385            .done(function (isValidEmail) {
1386                if (isValidEmail) {
1387                    CitrusStore.CitrusStore.wsCitrusStore.AddStockNotification(
1388                        prodId,
1389                        attDetailId,
1390                        inputEl.val(),
1391                        0,
1392                        function (data) {
1393                            if (data === true) {
1394                                ManageBackInStockMessage(backInStockEl, true, ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '07AddToBasket-GoodNewsRegisteredInterestInProductX0TranslatedCloseButtonText'), GetTranslation('JavaScriptTranslations', '07AddToBasket-NotificationRequestCloseButtonText')));
1395                            }
1396                            else {
1397                                ManageBackInStockMessage(backInStockEl, false, GetTranslation('JavaScriptTranslations', '07AddToBasket-YouHaveAlreadyRegisteredInterestForThisItem'));
1398                            }
1399                        },
1400                        onFailedWSBackInstock
1401                    );
1402                }
1403                else {
1404                    ManageBackInStockMessage(backInStockEl, false, GetTranslation('JavaScriptTranslations', '07AddToBasket-OopsEnterValidEmail'));
1405                }
1406            });
1407    }
1408    else {
1409        ManageBackInStockMessage(backInStockEl, false, GetTranslation('JavaScriptTranslations', '07AddToBasket-OopsEnterValidEmail'));
1410
1411
1412    }
1413}
1414
1415function ManageBackInStockMessage(backInStockEl, state, message) {
1416    backInStockEl
1417        .attr('data-backinstock', state)
1418        .html(message);
1419
1420    setTimeout(function () {
1421        backInStockEl
1422            .attr('data-backinstock', '')
1423            .empty();
1424    }, 10000);
1425}
1426
1427function InactiveAddBasketButtonClick() {
1428    var promiseName = 'AddBasketInactiveButtonPromise',
1429        messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
1430
1431    window[promiseName] = $.Deferred();
1432
1433    messageConfig.Header = GetTranslation('JavaScriptTranslations', '07AddToBasket-InactiveAddToBasketHeader');
1434    messageConfig.Body = `<p><strong>${GetTranslation('JavaScriptTranslations', '07AddToBasket-InactiveAddToBasketOopsMessage')}</strong></p><p>${GetTranslation('JavaScriptTranslations', '07AddToBasket-InactiveAddToBasketSelectMessage')}</p>`;
1435    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '07AddToBasket-InactiveAddToBasketCloseButtonText');
1436
1437    ModularModalMessage(promiseName, messageConfig);
1438}
1439var SELECTOR_CART_TARGET = '#cart-target',
1440    CCLOOKUPSERVICE_CLASS = 'cc-lookup-service-wrapper',
1441    CCLOOKUPSERVICE_ENTRYSECTION_CLASS = 'cc-lookup-service-entrysection',
1442    CCLOOKUPSERVICE_ENTRY_CLASS = 'cc-lookup-service-entry',
1443    CCLOOKUPSERVICE_CTRYSELECT_PARENT_CLASS = 'cc-lookup-service-countryselect-wrapper',
1444    CCLOOKUPSERVICE_CTRYSELECT_CLASS = 'cc-lookup-service-countryselect',
1445    CCLOOKUPSERVICE_WARNINGTEXT_CLASS = 'cc-lookup-service-warningtext',
1446    CCLOOKUPSERVICE_LOOKUPBTN_CLASS = 'cc-lookup-service-lookupbutton',
1447    CCLOOKUPSERVICE_LOOKUPBTN_LOCATION_CLASS = 'cc-lookup-service-lookupbutton-location',
1448    CCLOOKUPSERVICE_LOOKUPRESULTS_CLASS = 'cc-lookup-service-lookupresults',
1449    CCLOOKUPSERVICE_LOOKUPRESULTS_STORE_CLASS = 'cc-lookup-service-lookupresults-store',
1450    CCLOOKUPSERVICE_LOOKUPRESULTS_STORE_NAME_CLASS = 'cc-lookup-service-lookupresults-store---name',
1451    CCLOOKUPSERVICE_LOOKUPRESULTS_STORE_DISTANCE_CLASS = 'cc-lookup-service-lookupresults-store---distance',
1452    CCLOOKUPSERVICE_LOOKUPRESULTS_MORELESSTOGGLE_CLASS = 'cc-lookup-service-lookupresults-morelesstoggle',
1453    CCLOOKUPSERVICE_SPINNERID = 'CCLOOKUPSERVICE_SPINNER',
1454    CCLOOKUPSERVICE_ADDRESS_SAVEDKEY = 'CCLOOKUPSERVICE_ADDRESS_SAVEDKEY';
1455
1456$(window).on("load", initClickAndCollectLocations);
1457
1458let clickAndCollectHtmlCreated = false;
1459
1460function initClickAndCollectLocations() {
1461    if (ecommerceConfig.ClickAndCollectEnabled) {
1462        AddStatefulLoadingSpinnerGlobal(CCLOOKUPSERVICE_SPINNERID);
1463
1464        if (!clickAndCollectHtmlCreated) {
1465            AppendClickAndCollectLookupServiceHtml();
1466        }
1467
1468        AddCountriesToCCServiceDropdown();
1469        clickAndCollectServiceAttributeSelectedEventListener();
1470        $.getScript(`https://maps.googleapis.com/maps/api/js?key=AIzaSyAKd5egEIdjFJtQLj4RQ3aUgFGvNGrG4t4&language=${ecommerceConfig.Locale.split("-")[0]}`);
1471    }
1472}
1473
1474function AppendClickAndCollectLookupServiceHtml() {
1475    clickAndCollectHtmlCreated = true;
1476
1477    var ccServiceWrapper = document.createElement('div');
1478    ccServiceWrapper.classList.add(CCLOOKUPSERVICE_CLASS, 'col-1', 'ctrMgr8-top', 'ctrMgr16-bottom');
1479
1480    /* C&C header */
1481    var ccServiceRowImages = document.createElement('div');
1482    ccServiceRowImages.classList.add('col-1', 'zflex-sb', 'ctrMgr16-bottom');
1483    ccServiceRowImages.innerHTML = `<div id="cc-title">${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-ClickAndCollectTitle')}</div>
1484        <div id="cc-tagline">${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-ClickAndCollectTagline')}</div>`;
1485
1486    /* Warning Text */
1487    var ccServiceRowEntryWarningText = document.createElement('div');
1488    ccServiceRowEntryWarningText.classList.add('col-1', 'ctrMgr8-bottom', 'coRED', CCLOOKUPSERVICE_WARNINGTEXT_CLASS);
1489    ccServiceRowEntryWarningText.innerText = GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-ToUseClickAndCollectSelectOptionFromDropdown');
1490
1491    /* Add entry & lookup section */
1492    var ccServiceRowEntryLookup = document.createElement('div');
1493    ccServiceRowEntryLookup.classList.add('col-1', 'zflex-ws', 'ctrMgr8-bottom', 'pos-rel', CCLOOKUPSERVICE_ENTRYSECTION_CLASS, 'input-section');
1494    ccServiceRowEntryLookup.setAttribute('data-ilc', '');
1495    ccServiceRowEntryLookup.setAttribute('data-productid', '');
1496
1497    var savedInputValue = localStorage.getItem(CCLOOKUPSERVICE_ADDRESS_SAVEDKEY)
1498
1499    ccServiceRowEntryLookup.innerHTML = `<div class="col-1 ${CCLOOKUPSERVICE_LOOKUPBTN_LOCATION_CLASS}" onclick="ccLookupServiceWithGeoLocation(event); return false;"><span class="icon-drop coStandard"></span> ${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-UseMyCurrentLocation')}</div><div class="col-1 cc-lookup-service-divider zflex-s"><span class="cc-lookup-service-divider-left"></span><span class="cc-lookup-service-divider-middle">${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-Or')}</span><span class="cc-lookup-service-divider-right"></span></div><div class="col-1 zflex-s pos-rel ${CCLOOKUPSERVICE_ENTRY_CLASS}"><input type="text" value="${(savedInputValue ? savedInputValue : "")}" placeholder="${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-EnterPostcodeOrTownPlaceHolder')}" autocomplete="address-level4" tabindex="-1" onkeydown="handleEnterOnCountryInput(event);" onkeyup="handleEnterOnCountryInput(event);" onkeypress="handleEnterOnCountryInput(event);"><div class="${CCLOOKUPSERVICE_LOOKUPBTN_CLASS} icon-search" onclick="ccLookupServiceWithAddress(event); return false;" data-ilc="" data-productid=""></div></div>`;
1500
1501    var ccServiceRowCountryToggle = document.createElement('div');
1502    ccServiceRowCountryToggle.classList.add('col-1', 'ctrMgr8-bottom', 'no-user-select');
1503    ccServiceRowCountryToggle.innerHTML = `<div class="col-1"><a href="#" onclick="$('.${CCLOOKUPSERVICE_CTRYSELECT_PARENT_CLASS}').toggleClass('hideme'); return false;">${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-NotInCountryChangeLookUpX0CountryName'), '<span id="ctrySelName"></span>')}</a></div><div class="col-1 hideme cc-lookup-service-countryselect-wrapper"><select class="col-1 ${CCLOOKUPSERVICE_CTRYSELECT_CLASS}" onchange="SetCountryOnChangeEventListener(event);"></select></div>`;
1504
1505    /* Results section */
1506    var ccServiceRow3 = document.createElement('div');
1507    ccServiceRow3.classList.add('col-1', 'zflex-ws', CCLOOKUPSERVICE_LOOKUPRESULTS_CLASS);
1508    ccServiceRow3.setAttribute('data-expanded', 'false');
1509    ccServiceRow3.setAttribute('data-hasstores', 'false');
1510    ccServiceRow3.setAttribute('data-storecount', '0');
1511
1512    var ccServiceRow4 = document.createElement('div');
1513    ccServiceRow4.classList.add('col-1', 'zflex-ws', CCLOOKUPSERVICE_LOOKUPRESULTS_MORELESSTOGGLE_CLASS);
1514    ccServiceRow4.innerHTML = '<a href="#" class="col-1 transition" onclick="ToggleMoreLessStoreDisplay(event);"></a>';
1515
1516    ccServiceWrapper.appendChild(ccServiceRowImages);
1517    ccServiceWrapper.appendChild(ccServiceRowEntryLookup);
1518    ccServiceWrapper.appendChild(ccServiceRowCountryToggle);
1519    ccServiceWrapper.appendChild(ccServiceRowEntryWarningText);
1520    ccServiceWrapper.appendChild(ccServiceRow3);
1521    ccServiceWrapper.appendChild(ccServiceRow4);
1522
1523    $(SELECTOR_CART_TARGET).after(ccServiceWrapper);
1524}
1525
1526function ToggleMoreLessStoreDisplay(event) {
1527    event.preventDefault();
1528
1529    var toggleTarget = $(event.target).parent().siblings('.' + CCLOOKUPSERVICE_LOOKUPRESULTS_CLASS);
1530    toggleTarget.attr('data-expanded',
1531        toggleTarget.attr('data-expanded') === 'true' ? 'false' : 'true');
1532}
1533
1534function SetCountryOnChangeEventListener(event) {
1535    var selectElement = $(event.target);
1536
1537    $('#ctrySelName').text(selectElement.find(':selected').text());
1538
1539    $('.cc-lookup-service-countryselect-wrapper').addClass('hideme');
1540}
1541
1542function handleEnterOnCountryInput(event) {
1543    if (event instanceof KeyboardEvent) {
1544        var expectedKey = 'enter',
1545            expectedKeySecondary = 'numpadenter';
1546
1547        if (event.key.toLowerCase() === expectedKey
1548            || event.code.toLowerCase() === expectedKey
1549            || event.code.toLowerCase() === expectedKeySecondary) {
1550            event.preventDefault();
1551            $(event.target).siblings('.' + CCLOOKUPSERVICE_LOOKUPBTN_CLASS).trigger('click');
1552            $(event.target).blur();
1553        }
1554    }
1555}
1556
1557function clickAndCollectServiceAttributeSelectedEventListener() {
1558    var updateElements = $('.' + CCLOOKUPSERVICE_LOOKUPBTN_CLASS + ', .' + CCLOOKUPSERVICE_ENTRYSECTION_CLASS + ', .' + CCLOOKUPSERVICE_LOOKUPBTN_LOCATION_CLASS);
1559
1560    $(SELECTOR_CART_TARGET).on('change', '.add-to-cart-area-dropdown select', function (event) {
1561        $('.' + CCLOOKUPSERVICE_LOOKUPRESULTS_CLASS).empty();
1562        $('.' + CCLOOKUPSERVICE_LOOKUPRESULTS_CLASS)
1563            .attr('data-expanded', 'false')
1564            .attr('data-hasstores', 'false')
1565            .attr('data-storecount', '0');
1566
1567        var dropdown = $(event.target);
1568        var selectedValue = dropdown.find(':selected');
1569
1570        var selectedHasValue = selectedValue.val().toString() !== "-1";
1571
1572        $('.' + CCLOOKUPSERVICE_WARNINGTEXT_CLASS).toggle(!selectedHasValue);
1573
1574        updateElements.attr('data-attdetailid',
1575            selectedHasValue
1576                ? selectedValue.attr('data-detailid')
1577                : '')
1578            .attr('data-productid',
1579                selectedHasValue
1580                    ? dropdown.attr('data-productid')
1581                    : '')
1582            .attr('data-attid',
1583                selectedHasValue
1584                    ? selectedValue.attr('data-id')
1585                    : '');
1586    });
1587}
1588
1589function ccLookupServiceWithGeoLocation(event) {
1590    event.preventDefault();
1591    ToggleLoadingSpinnerByName(CCLOOKUPSERVICE_SPINNERID, true);
1592
1593    var clickedEl = $(event.target);
1594
1595    if (clickedEl && clickedEl.is('[data-attid]') && clickedEl.is('[data-attdetailid]') && clickedEl.is('[data-productid]')) {
1596        var attId = clickedEl.attr('data-attid').replace("undefined", "0");
1597        var attDetail = clickedEl.attr('data-attdetailid').replace("undefined", "0");
1598        var pId = clickedEl.attr('data-productid');
1599
1600        $.when(GetGeoLocation())
1601            .then(
1602                /* Success (resolved) */
1603                function (geolocationCoords) {
1604                    CitrusStore.CitrusStore.wsCitrusStore.ClickAndCollectServiceGeoLocation(
1605                        geolocationCoords.longitude,
1606                        geolocationCoords.latitude,
1607                        pId,
1608                        attId,
1609                        attDetail,
1610                        ccLookupServiceWithAddress_Success,
1611                        function (err) {
1612                            ToggleLoadingSpinnerByName(CCLOOKUPSERVICE_SPINNERID, false);
1613                            onFailedWS(err);
1614                        }
1615                    );
1616                },
1617                /* Failed (rejected) */
1618                function (errorInformation) {
1619                    ToggleLoadingSpinnerByName(CCLOOKUPSERVICE_SPINNERID, false);
1620                    var promiseName = 'ClickAndCollectLookupGeoLocationError',
1621                        messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
1622
1623                    var msgContent = `<p><span class="boldfont">${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-WeCouldNotGetYourGeolocationBecause')}</span><br />${errorInformation.message}'</p><p>${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-PleaseEnterYourTownPostcodeManually')}</p>`;
1624
1625                    window[promiseName] = $.Deferred();
1626
1627                    messageConfig.Header = GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-CannotGetYourGeoLocation');
1628                    messageConfig.Body = msgContent;
1629                    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-CloseButton');
1630
1631                    ModularModalMessage(promiseName, messageConfig);
1632                }
1633            );
1634    }
1635    else {
1636        ToggleLoadingSpinnerByName(CCLOOKUPSERVICE_SPINNERID, false);
1637
1638        var promiseName = 'ClickAndCollectLookupGeoLocationErrorNoElement',
1639            messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION),
1640            msgContent = `<p><span class="boldfont">${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-SorryErrorOccurredTryingToUseYourLocation')}</p><p>${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-PleaseEnterYourTownPostcodeManually')}</p>`;
1641
1642        window[promiseName] = $.Deferred();
1643
1644        messageConfig.Header = GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-AnErrorOccurred');
1645        messageConfig.Body = msgContent;
1646        messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-CloseButton');
1647
1648        ModularModalMessage(promiseName, messageConfig);
1649    }
1650}
1651
1652function ccLookupServiceWithAddress(event) {
1653    ToggleLoadingSpinnerByName(CCLOOKUPSERVICE_SPINNERID, true);
1654
1655    var clickedEl = $(event.target);
1656    var attId = clickedEl.attr('data-attid').replace("undefined", "0");
1657    var attDetail = clickedEl.attr('data-attdetailid').replace("undefined", "0");
1658    var pId = clickedEl.attr('data-productid');
1659
1660    var addr = clickedEl.siblings('input').val();
1661    var countryCode = $('select.' + CCLOOKUPSERVICE_CTRYSELECT_CLASS).find(':selected').val();
1662
1663    var shouldSend = true;
1664    if (addr.length < 3 || addr.length > 999 || countryCode.length != 2) {
1665        shouldSend = false;
1666        // Address must be entered
1667    }
1668
1669    if (shouldSend) {
1670        localStorage.setItem(CCLOOKUPSERVICE_ADDRESS_SAVEDKEY, addr);
1671
1672        CitrusStore.CitrusStore.wsCitrusStore.ClickAndCollectServiceAddress(
1673            addr,
1674            countryCode,
1675            pId,
1676            attId,
1677            attDetail,
1678            ccLookupServiceWithAddress_Success,
1679            function (err) {
1680                ToggleLoadingSpinnerByName(CCLOOKUPSERVICE_SPINNERID, false);
1681                onFailedWS(err);
1682            }
1683        );
1684    }
1685    else {
1686        ToggleLoadingSpinnerByName(CCLOOKUPSERVICE_SPINNERID, false);
1687
1688        if (addr.length < 3 || addr.length > 999) {
1689            var promiseName = 'ClickAndCollectLookupAddressLengthError',
1690                messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
1691
1692            var msgContent = '';
1693
1694            if (addr.length < 3) {
1695                msgContent += GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-TownPostcodeMustAtLeastThreeCharacters');
1696            }
1697
1698            if (addr.length > 999) {
1699                msgContent += GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-TownPostcodeMustBeNoLongerThan999Characters');
1700            }
1701
1702            window[promiseName] = $.Deferred();
1703
1704            messageConfig.Header = GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-InvalidAddressValue');
1705            messageConfig.Body = msgContent;
1706            messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-CloseButton');
1707
1708            ModularModalMessage(promiseName, messageConfig);
1709        }
1710    }
1711}
1712
1713function ccLookupServiceWithAddress_Success(result) {
1714    $('.' + CCLOOKUPSERVICE_LOOKUPRESULTS_CLASS).empty();
1715
1716    var resultSectionHtml = [];
1717
1718    if (result && result.Stores && result.Stores.length) {
1719        for (var i = 0; i < result.Stores.length; i++) {
1720            resultSectionHtml.push(BuildStoreHtml(result.Stores[i]));
1721        }
1722    }
1723    else {
1724        var noResultsEl = document.createElement('div');
1725
1726        noResultsEl.innerText = result.StatusMessage;
1727        noResultsEl.classList.add('col-1', 'errorMsg', 'ctrPad8', 'ctrMgr8-top', 'ctrMgr8-bottom');
1728
1729        resultSectionHtml.push(noResultsEl);
1730    }
1731
1732    $('.' + CCLOOKUPSERVICE_LOOKUPRESULTS_CLASS)
1733        .attr('data-hasstores', (result && result.Stores && result.Stores.length > 0 ? 'true' : 'false'))
1734        .attr('data-storecount', (result && result.Stores && result.Stores.length ? result.Stores.length.toString() : "0"));
1735
1736    $('.' + CCLOOKUPSERVICE_LOOKUPRESULTS_CLASS).append(resultSectionHtml);
1737    ToggleLoadingSpinnerByName(CCLOOKUPSERVICE_SPINNERID, false);
1738}
1739
1740function BuildStoreHtml(storeRecord) {
1741    var storesHtml = document.createElement('div');
1742    storesHtml.classList.add('col-1', CCLOOKUPSERVICE_LOOKUPRESULTS_STORE_CLASS, 'no-user-select');
1743
1744    var storesHtmlInner = document.createElement('div');
1745    storesHtmlInner.classList.add('col-1');
1746
1747    var storeRowStoreLeadtime = document.createElement('div');
1748    storeRowStoreLeadtime.classList.add('col-1', 'ctrMgr8-bottom', 'zflex-s');
1749    storeRowStoreLeadtime.setAttribute('data-leadtimeavailability', '');
1750    storeRowStoreLeadtime.innerHTML = '<div data-leadtime>' + storeRecord.LeadTimeText + '</div><div data-availability="' + storeRecord.AvailabilityText + '">' + storeRecord.AvailabilityText + '</div>';
1751
1752    var storeRowStoreNameAddress = document.createElement('div');
1753    storeRowStoreNameAddress.classList.add('col-1', 'ccservice-results-padding-8');
1754    storeRowStoreNameAddress.innerHTML = '<div class="' + CCLOOKUPSERVICE_LOOKUPRESULTS_STORE_NAME_CLASS + '">' + storeRecord.CollectionLocation.CollectionLocationInformation.Name + '</div><div>' + storeRecord.CollectionLocation.CollectionLocationInformation.AddressFormatted + '</div>';
1755
1756    var storeRowStoreMoreDetails = document.createElement('div');
1757    storeRowStoreMoreDetails.classList.add('col-1', 'zflex-s');
1758
1759    /* Left Column */
1760
1761    var storeRowStoreMoreDetailsLeft = document.createElement('div');
1762    storeRowStoreMoreDetailsLeft.classList.add('col-', 'flex-grow1');
1763
1764    var storeRowStoreDistance = document.createElement('div');
1765    storeRowStoreDistance.classList.add('col-1', 'ccservice-results-padding-8', CCLOOKUPSERVICE_LOOKUPRESULTS_STORE_DISTANCE_CLASS);
1766    storeRowStoreDistance.innerHTML = '<div>' + storeRecord.DistanceFromStore + '</div>';
1767
1768    var storeRowStoreOpeningHours = document.createElement('div');
1769    storeRowStoreOpeningHours.classList.add('col-1', 'ccservice-results-padding-8');
1770    if (storeRecord.TodaysOpeningHours) {
1771        storeRowStoreOpeningHours.innerHTML = '<div>' + storeRecord.TodaysOpeningHours.OpeningHours.replace(/(\:00\:00)/g, ":00") + '</div>';
1772    }
1773
1774    storeRowStoreMoreDetailsLeft.appendChild(storeRowStoreDistance);
1775    storeRowStoreMoreDetailsLeft.appendChild(storeRowStoreOpeningHours);
1776
1777    /* Middle Column */
1778
1779    var storeRowStoreMoreDetailsMiddle = document.createElement('div');
1780    storeRowStoreMoreDetailsMiddle.classList.add('col-', 'flex-grow1');
1781
1782    var storeRowStoreViewMap = document.createElement('div');
1783    storeRowStoreViewMap.classList.add('col-1', 'ccservice-results-padding-8');
1784    storeRowStoreViewMap.innerHTML = `<a href="#" onclick="ClickAndCollectMapModal(event, '${storeRecord.CollectionLocation.CollectionLocationInformation.DealerNumber}', '${storeRecord.CollectionLocation.CollectionLocationInformation.Name.replace(/'/gm, '')}', ${storeRecord.CollectionLocation.CollectionLocationInformation.Longitude}, ${storeRecord.CollectionLocation.CollectionLocationInformation.Latitude}); return false;" class="coStandard border2 removeborder-left removeborder-right removeborder-top">${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-ViewMap')}</a>`;
1785
1786    var storeRowStoreViewOpeningTimes = document.createElement('div');
1787    storeRowStoreViewOpeningTimes.classList.add('col-1', 'ccservice-results-padding-8');
1788    if (storeRecord.OpeningHours) {
1789        var mappedOpeningHours = storeRecord.OpeningHours.map(function (day) {
1790            return day.OpeningHours
1791        }).join('|||');
1792        storeRowStoreViewOpeningTimes.innerHTML = `<a href="#" onclick="ClickAndCollectOpeningTimesModal(event, '${storeRecord.CollectionLocation.CollectionLocationInformation.Name.replace(/'/gm, '')}'); return false;" data-times="${mappedOpeningHours}" class="coStandard border2 removeborder-left removeborder-right removeborder-top">${GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-AllOpeningTimes')}</a>`;
1793    }
1794    storeRowStoreMoreDetailsMiddle.appendChild(storeRowStoreViewM
1794ap);
1795    storeRowStoreMoreDetailsMiddle.appendChild(storeRowStoreViewOpeningTimes);
1796
1797    /* Append columns to more details */
1798
1799    storeRowStoreMoreDetails.appendChild(storeRowStoreMoreDetailsLeft);
1800    storeRowStoreMoreDetails.appendChild(storeRowStoreMoreDetailsMiddle);
1801
1802    /* Add Button */
1803
1804    var storeRowAddButton = document.createElement('div');
1805    storeRowAddButton.classList.add('col-1', 'ccservice-results-padding-8');
1806    storeRowAddButton.innerHTML = '<a href="#" onclick="AddTobasketClickAndCollectButtonProxy(event, \'' + storeRecord.CollectionLocation.CollectionLocationInformation.DealerNumber + '\'); return false;" class="col-1 add-to-cart-area-button"></a>';
1807
1808    /* Append "rows" */
1809
1810    storesHtmlInner.appendChild(storeRowStoreLeadtime);
1811    storesHtmlInner.appendChild(storeRowStoreNameAddress);
1812    storesHtmlInner.appendChild(storeRowStoreMoreDetails);
1813    storesHtmlInner.appendChild(storeRowAddButton);
1814
1815    /* Append inner to wrapper */
1816    storesHtml.appendChild(storesHtmlInner);
1817
1818    /* return wrapper */
1819    return storesHtml;
1820}
1821
1822function ClickAndCollectOpeningTimesModal(event, storeName) {
1823    event.preventDefault();
1824    var times = event.target.dataset.times.split('|||');
1825
1826    var promiseName = 'ClickAndCollectLookupStoreViewOpeningHours',
1827        messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
1828
1829    var msgContent = '';
1830    for (var i = 0; i < times.length; i++) {
1831        msgContent += '<div class="col-1 ctrPad8-bottom">' + times[i].replace(/(\:00\:00)/g, ":00") + '</div>';
1832    }
1833
1834    window[promiseName] = $.Deferred();
1835
1836    messageConfig.Header = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-OpeningHoursX0StoreName'), storeName);
1837    messageConfig.Body = msgContent;
1838    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-CloseButton');
1839
1840    ModularModalMessageWithID(promiseName, messageConfig, promiseName);
1841}
1842
1843function ClickAndCollectMapModal(event, storeDealerNumber, storeName, longitude, latitude) {
1844    event.preventDefault();
1845
1846    var promiseName = 'ClickAndCollectLookupStoreViewMap' + storeDealerNumber,
1847        messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
1848
1849    var msgContent = '<div id="' + promiseName + 'Map" class="col-1" style="min-height: 200px; aspect-ratio: 1;"></div>';
1850
1851    window[promiseName] = $.Deferred();
1852
1853    messageConfig.Header = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-MapLocationX0StoreName'), storeName);
1854    messageConfig.Body = msgContent;
1855    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '07bClickAndCollectLookupService-CloseButton');
1856
1857    ModularModalMessageWithID(promiseName, messageConfig, promiseName);
1858
1859    var map = new google.maps.Map(document.getElementById(promiseName + 'Map'), {
1860        center: { lat: latitude, lng: longitude },
1861        zoom: 15,
1862        mapTypeId: google.maps.MapTypeId.ROADMAP,
1863        mapTypeControl: false
1864    });
1865
1866    new google.maps.Marker({
1867        position: { lat: latitude, lng: longitude },
1868        map: map,
1869        title: storeName,
1870    });
1871}
1872
1873function AddTobasketClickAndCollectButtonProxy(event, dealerNumber) {
1874    event.preventDefault();
1875
1876    localStorage.setItem('SELECTEDDEALERNUMBER', dealerNumber);
1877    $('.add-to-cart-area-button[onclick*="CallAddToBasketMethodFromClick"]').click();
1878}
1879
1880function AddCountriesToCCServiceDropdown() {
1881    CitrusStore.CitrusStore.wsCitrusStore.GetCountryNameAndISOCodesList(
1882        function (rawResponse) {
1883            var response = JSON.parse(rawResponse);
1884
1885            var getCountryNameAndISOCodesListSelectBox = $('select.' + CCLOOKUPSERVICE_CTRYSELECT_CLASS);
1886            var getCountryNameAndISOCodesListKeys = Object.keys(response).sort();
1887
1888            var getCountryNameAndISOCodesListSelectOptions = [];
1889
1890            for (var i = 0; i < getCountryNameAndISOCodesListKeys.length; i++) {
1891                var newCCLSOptionCountry = document.createElement('option');
1892                newCCLSOptionCountry.value = response[getCountryNameAndISOCodesListKeys[i]];
1893                newCCLSOptionCountry.text = getCountryNameAndISOCodesListKeys[i];
1894
1895                newCCLSOptionCountry.selected = (response[getCountryNameAndISOCodesListKeys[i]] == ecommerceConfig.DespatchCountry);
1896
1897                getCountryNameAndISOCodesListSelectOptions.push(newCCLSOptionCountry);
1898            }
1899
1900            getCountryNameAndISOCodesListSelectBox.append(getCountryNameAndISOCodesListSelectOptions);
1901
1902            getCountryNameAndISOCodesListSelectBox.trigger('change');
1903        },
1904        onFailedWS
1905    );
1906}
1907// JavaScript Document
1908function GetQueryStringParams(sParam){
1909    var sPageURL = window.location.search.substring(1);
1910    var sURLVariables = sPageURL.split('&');
1911    for (var i = 0; i < sURLVariables.length; i++)
1912    {
1913        var sParameterName = sURLVariables[i].split('=');
1914        if (sParameterName[0] == sParam)
1915        {
1916            return sParameterName[1];
1917        }
1918    }
1919}
1920function tabs(){
1921	smoothScrollNew()
1922	var hash;
1923	setURL();
1924	$(window).bind('hashchange',function(){ 
1925		setURL();
1926		$("#moveTop" ).trigger( "click" );
1927	});
1928	
1929	function setURL(){
1930		hash = document.URL.substr(document.URL.indexOf('#')+1);
1931		if(window.location.hash) {
1932			$('.tabs li').removeClass('current');
1933			$('.tabsContent li').removeClass('current');
1934			$(".tabs li:nth-child("+(hash)+")").addClass('current');
1935			$(".tabsContent>div#"+hash).addClass('current');
1936			flipImages();
1937			window.location.hash = '#'+hash;
1938		}else{
1939			$(".tabs li:first-child").addClass('current');
1940			$("#tabs1").addClass('current');
1941			flipImages();
1942			window.location.hash = '#1';
1943		}
1944	}
1945	
1946	$('.tabs li').click(function(){
1947		event.preventDefault();
1948		var tab_id = $(this).attr('data-tab');
1949		$('.tabs li').removeClass('current');
1950		$('.tabsContent > div').removeClass('current');
1951		$(".tabs li:nth-child("+tab_id+")").addClass('current');
1952		$(".tabsContent>div#"+tab_id).addClass('current');
1953		flipImages();
1954	})
1955}
1956function smoothScrollNew() {
1957    $('.smoothScrollNew').click(function () {
1958        if ($(".masthead").css("position") === "fixed") {
1959            var mast = $('.masthead').height();
1960            $('html, body').animate({
1961                scrollTop: $($(this).attr('href')).offset().top - mast
1962            }, 300, 'swing');
1963            return false;
1964        } else {
1965            $('html, body').animate({
1966                scrollTop: $($(this).attr('href')).offset().top
1967            }, 300, 'swing');
1968            return false;
1969        }
1970    });
1971}(function () {
1972    var accinit = false;
1973    document.addEventListener("readystatechange", function () {
1974        if (document.readyState === "interactive") {
1975            if ($(".accordianBox").length == 0 || accinit) { }
1976            else {
1977                $('.accordianHeader, .accordionTrigger').click(function(e) {
1978                    var $this = $(this);
1979                    var attr = $(this).attr('data-acctarget');
1980                    if (typeof attr != typeof undefined && attr != false) {
1981                        $this = $('.accordianHeader[data-accdest="' + attr + '"]');
1982                        $('html, body').animate({ scrollTop: $this.offset().top }, 1200, 'swing');
1983                    }
1984                    var $p = $this.closest(".accordianBox");
1985                    var $group = $p.closest(".productAccordian").find(".accordianBox");
1986                    if ($p.hasClass('active')) {
1987                        $p.removeClass('active');
1988                        $p.removeClass('active');
1989                    } else {
1990                        /*$group.removeClass('active');*/
1991                        $p.addClass('active');
1992                        $p.addClass('active');
1993                    }
1994                    return false;
1995                });
1996                accinit = true;
1997            }
1998        }
1999    }, false);
2000})();var ctadefer = $.Deferred();
2001var subheadercfg = {
2002  "active":false,
2003  "customclasses": "zflex",
2004  "calltoactions": []
2005};
2006
2007document.addEventListener("readystatechange", function () {
2008  if (document.readyState === "interactive") {
2009    promiseResolution(ctadefer, ctaPromiseCallback);
2010    function ctaPromiseCallback() {
2011      if (window.location.href.indexOf('addsubheader=true') > -1) {subheadercfg["active"] = true;}
2012      if (subheadercfg["active"] == true && subheadercfg["calltoactions"].length) {
2013        var subhtml = $.parseHTML('<div class="wrapper submasthead">' +
2014                                      '<div class="grid fixed">' +
2015                                        '<div class="container">' +
2016                                        '<div class="topCTA">' +
2017                                        '</div>' +
2018                                      '</div>' +
2019                                    '</div>' +
2020                                  '</div>');
2021        var ctamarkup = '';
2022        for (var i = 0; i < subheadercfg["calltoactions"].length; i++) {
2023          ctamarkup += '<a href="'+subheadercfg["calltoactions"][i]["ctalink"]+'">'+subheadercfg["calltoactions"][i]["ctaname"]+'</a>';
2024        }
2025        $(subhtml).find('.topCTA').addClass(subheadercfg["customclasses"]).append(ctamarkup);
2026        $('.masthead').after(subhtml);
2027        if (typeof subBannerCallback == "function") {subBannerCallback();}
2028      }
2029    }
2030  }
2031});
2032function touchHandler(event) {
2033    var touches = event.changedTouches,
2034        first = touches[0],
2035        type = "";
2036    switch (event.type) {
2037        case "touchstart": type = "mousedown"; break;
2038        case "touchmove": type = "mousemove"; break;
2039        case "touchend": type = "mouseup"; break;
2040        default: return;
2041    }
2042
2043    var simulatedEvent = document.createEvent("MouseEvent");
2044    simulatedEvent.initMouseEvent(type, true, true, window, 1,
2045        first.screenX, first.screenY,
2046        first.clientX, first.clientY, false,
2047        false, false, false, 0/*left*/, null);
2048
2049    first.target.dispatchEvent(simulatedEvent);
2050    //event.preventDefault();
2051}
2052var financeSliderPip = document.querySelectorAll('.ui-slider .ui-slider-handle')[0];
2053(function () {
2054    document.addEventListener("readystatechange", function () {
2055        if (document.readyState === "interactive") {
2056            var fineventInt = setInterval(function () {
2057                if (financeSliderPip == undefined) {
2058                    financeSliderPip = document.querySelectorAll('.ui-slider .ui-slider-handle')[0];
2059                    if ("ontouchstart" in document.documentElement && typeof financeSliderPip != "undefined") {
2060                        financeSliderPip.addEventListener("touchstart", touchHandler, true);
2061                        financeSliderPip.addEventListener("touchmove", touchHandler, true);
2062                        financeSliderPip.addEventListener("touchend", touchHandler, true);
2063                        financeSliderPip.addEventListener("touchcancel", touchHandler, true);
2064                    }
2065                } else {
2066                    clearInterval(fineventInt);
2067                }
2068            }, 250);
2069        }
2070    }, false);
2071})();
2072
2073/*! jQuery UI - v1.12.1 - 2018-10-25
2074* http://jqueryui.com
2075* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/mouse.js, widgets/slider.js
2076* Copyright jQuery Foundation and other contributors; Licensed MIT */
2077
2078(function (t) { "function" == typeof define && define.amd ? define(["jquery"], t) : t(jQuery) })(function (t) { function e(t) { for (var e = t.css("visibility"); "inherit" === e;)t = t.parent(), e = t.css("visibility"); return "hidden" !== e } t.ui = t.ui || {}, t.ui.version = "1.12.1"; var i = 0, s = Array.prototype.slice; t.cleanData = function (e) { return function (i) { var s, n, o; for (o = 0; null != (n = i[o]); o++)try { s = t._data(n, "events"), s && s.remove && t(n).triggerHandler("remove") } catch (a) { } e(i) } }(t.cleanData), t.widget = function (e, i, s) { var n, o, a, r = {}, l = e.split(".")[0]; e = e.split(".")[1]; var h = l + "-" + e; return s || (s = i, i = t.Widget), t.isArray(s) && (s = t.extend.apply(null, [{}].concat(s))), t.expr[":"][h.toLowerCase()] = function (e) { return !!t.data(e, h) }, t[l] = t[l] || {}
vendor: 6,195 bytes, line 2078
2078, n = t[l][e], o = t[l][e] = function (t, e) { return this._createWidget ? (arguments.length && this._createWidget(t, e), void 0) : new o(t, e) }, t.extend(o, n, { version: s.version, _proto: t.extend({}, s), _childConstructors: [] }), a = new i, a.options = t.widget.extend({}, a.options), t.each(s, function (e, s) { return t.isFunction(s) ? (r[e] = function () { function t() { return i.prototype[e].apply(this, arguments) } function n(t) { return i.prototype[e].apply(this, t) } return function () { var e, i = this._super, o = this._superApply; return this._super = t, this._superApply = n, e = s.apply(this, arguments), this._super = i, this._superApply = o, e } }(), void 0) : (r[e] = s, void 0) }), o.prototype = t.widget.extend(a, { widgetEventPrefix: n ? a.widgetEventPrefix || e : e }, r, { constructor: o, namespace: l, widgetName: e, widgetFullName: h }), n ? (t.each(n._childConstructors, function (e, i) { var s = i.prototype; t.widget(s.namespace + "." + s.widgetName, o, i._proto) }), delete n._childConstructors) : i._childConstructors.push(o), t.widget.bridge(e, o), o }, t.widget.extend = function (e) { for (var i, n, o = s.call(arguments, 1), a = 0, r = o.length; r > a; a++)for (i in o[a]) n = o[a][i], o[a].hasOwnProperty(i) && void 0 !== n && (e[i] = t.isPlainObject(n) ? t.isPlainObject(e[i]) ? t.widget.extend({}, e[i], n) : t.widget.extend({}, n) : n); return e }, t.widget.bridge = function (e, i) { var n = i.prototype.widgetFullName || e; t.fn[e] = function (o) { var a = "string" == typeof o, r = s.call(arguments, 1), l = this; return a ? this.length || "instance" !== o ? this.each(function () { var i, s = t.data(this, n); return "instance" === o ? (l = s, !1) : s ? t.isFunction(s[o]) && "_" !== o.charAt(0) ? (i = s[o].apply(s, r), i !== s && void 0 !== i ? (l = i && i.jquery ? l.pushStack(i.get()) : i, !1) : void 0) : t.error("no such method '" + o + "' for " + e + " widget instance") : t.error("cannot call methods on " + e + " prior to initialization; " + "attempted to call method '" + o + "'") }) : l = void 0 : (r.length && (o = t.widget.extend.apply(null, [o].concat(r))), this.each(function () { var e = t.data(this, n); e ? (e.option(o || {}), e._init && e._init()) : t.data(this, n, new i(o, this)) })), l } }, t.Widget = function () { }, t.Widget._childConstructors = [], t.Widget.prototype = { widgetName: "widget", widgetEventPrefix: "", defaultElement: "<div>", options: { classes: {}, disabled: !1, create: null }, _createWidget: function (e, s) { s = t(s || this.defaultElement || this)[0], this.element = t(s), this.uuid = i++ , this.eventNamespace = "." + this.widgetName + this.uuid, this.bindings = t(), this.hoverable = t(), this.focusable = t(), this.classesElementLookup = {}, s !== this && (t.data(s, this.widgetFullName, this), this._on(!0, this.element, { remove: function (t) { t.target === s && this.destroy() } }), this.document = t(s.style ? s.ownerDocument : s.document || s), this.window = t(this.document[0].defaultView || this.document[0].parentWindow)), this.options = t.widget.extend({}, this.options, this._getCreateOptions(), e), this._create(), this.options.disabled && this._setOptionDisabled(this.options.disabled), this._trigger("create", null, this._getCreateEventData()), this._init() }, _getCreateOptions: function () { return {} }, _getCreateEventData: t.noop, _create: t.noop, _init: t.noop, destroy: function () { var e = this; this._destroy(), t.each(this.classesElementLookup, function (t, i) { e._removeClass(i, t) }), this.element.off(this.eventNamespace).removeData(this.widgetFullName), this.widget().off(this.eventNamespace).removeAttr("aria-disabled"), this.bindings.off(this.eventNamespace) }, _destroy: t.noop, widget: function () { return this.element }, option: function (e, i) { var s, n, o, a = e; if (0 === arguments.length) return t.widget.extend({}, this.options); if ("string" == typeof e) if (a = {}, s = e.split("."), e = s.shift(), s.length) { for (n = a[e] = t.widget.extend({}, this.options[e]), o = 0; s.length - 1 > o; o++)n[s[o]] = n[s[o]] || {}, n = n[s[o]]; if (e = s.pop(), 1 === arguments.length) return void 0 === n[e] ? null : n[e]; n[e] = i } else { if (1 === arguments.length) return void 0 === this.options[e] ? null : this.options[e]; a[e] = i } return this._setOptions(a), this }, _setOptions: function (t) { var e; for (e in t) this._setOption(e, t[e]); return this }, _setOption: function (t, e) { return "classes" === t && this._setOptionClasses(e), this.options[t] = e, "disabled" === t && this._setOptionDisabled(e), this }, _setOptionClasses: function (e) { var i, s, n; for (i in e) n = this.classesElementLookup[i], e[i] !== this.options.classes[i] && n && n.length && (s = t(n.get()), this._removeClass(n, i), s.addClass(this._classes({ element: s, keys: i, classes: e, add: !0 }))) }, _setOptionDisabled: function (t) { this._toggleClass(this.widget(), this.widgetFullName + "-disabled", null, !!t), t && (this._removeClass(this.hoverable, null, "ui-state-hover"), this._removeClass(this.focusable, null, "ui-state-focus")) }, enable: function () { return this._setOptions({ disabled: !1 }) }, disable: function () { return this._setOptions({ disabled: !0 }) }, _classes: function (e) { function i(i, o) { var a, r; for (r = 0; i.length > r; r++)a = n.classesElementLookup[i[r]] || t(), a = e.add ? t(t.unique(a.get().concat(e.element.get()))) : t(a.not(e.element).get()), n.classesElementLookup[i[r]] = a, s.push(i[r]), o && e.classes[i[r]] && s.push(e.classes[i[r]]) } var s = [], n = this; return e = t.extend({ element: this.element, classes: this.options.classes || {} }, e), this._on(e.element, { remove: "_untrackClassesElement" }), e.keys && i(e.keys.match(/\S+/g) || [], !0), e.extra && i(e.extra.match(/\S+/g) || []), s.join(" ") }, _untrackClassesElement: function (e) { var i = this; t.each(i.classesElementLookup, function (s, n) { -1 !== t.inArray(e.target, n) && (i.classesElementLookup[s] = t(n.not(e.target).get())) }) }, _removeClass: function (t, e, i) { return this._toggleClass(t, e, i, !1) }, _addClass: function (t, e, i) { return this._toggleClass(t, e, i, !0) }, _toggleClass: function (t, e, i, s) { s = "boolean" == typeof s ? s : i;
vendor: 13,025 bytes, line 2078
2078 var n = "string" == typeof t || null === t, o = { extra: n ? e : i, keys: n ? t : e, element: n ? this.element : t, add: s }; return o.element.toggleClass(this._classes(o), s), this }, _on: function (e, i, s) { var n, o = this; "boolean" != typeof e && (s = i, i = e, e = !1), s ? (i = n = t(i), this.bindings = this.bindings.add(i)) : (s = i, i = this.element, n = this.widget()), t.each(s, function (s, a) { function r() { return e || o.options.disabled !== !0 && !t(this).hasClass("ui-state-disabled") ? ("string" == typeof a ? o[a] : a).apply(o, arguments) : void 0 } "string" != typeof a && (r.guid = a.guid = a.guid || r.guid || t.guid++); var l = s.match(/^([\w:-]*)\s*(.*)$/), h = l[1] + o.eventNamespace, c = l[2]; c ? n.on(h, c, r) : i.on(h, r) }) }, _off: function (e, i) { i = (i || "").split(" ").join(this.eventNamespace + " ") + this.eventNamespace, e.off(i).off(i), this.bindings = t(this.bindings.not(e).get()), this.focusable = t(this.focusable.not(e).get()), this.hoverable = t(this.hoverable.not(e).get()) }, _delay: function (t, e) { function i() { return ("string" == typeof t ? s[t] : t).apply(s, arguments) } var s = this; return setTimeout(i, e || 0) }, _hoverable: function (e) { this.hoverable = this.hoverable.add(e), this._on(e, { mouseenter: function (e) { this._addClass(t(e.currentTarget), null, "ui-state-hover") }, mouseleave: function (e) { this._removeClass(t(e.currentTarget), null, "ui-state-hover") } }) }, _focusable: function (e) { this.focusable = this.focusable.add(e), this._on(e, { focusin: function (e) { this._addClass(t(e.currentTarget), null, "ui-state-focus") }, focusout: function (e) { this._removeClass(t(e.currentTarget), null, "ui-state-focus") } }) }, _trigger: function (e, i, s) { var n, o, a = this.options[e]; if (s = s || {}, i = t.Event(i), i.type = (e === this.widgetEventPrefix ? e : this.widgetEventPrefix + e).toLowerCase(), i.target = this.element[0], o = i.originalEvent) for (n in o) n in i || (i[n] = o[n]); return this.element.trigger(i, s), !(t.isFunction(a) && a.apply(this.element[0], [i].concat(s)) === !1 || i.isDefaultPrevented()) } }, t.each({ show: "fadeIn", hide: "fadeOut" }, function (e, i) { t.Widget.prototype["_" + e] = function (s, n, o) { "string" == typeof n && (n = { effect: n }); var a, r = n ? n === !0 || "number" == typeof n ? i : n.effect || i : e; n = n || {}, "number" == typeof n && (n = { duration: n }), a = !t.isEmptyObject(n), n.complete = o, n.delay && s.delay(n.delay), a && t.effects && t.effects.effect[r] ? s[e](n) : r !== e && s[r] ? s[r](n.duration, n.easing, o) : s.queue(function (i) { t(this)[e](), o && o.call(s[0]), i() }) } }), t.widget, function () { function e(t, e, i) { return [parseFloat(t[0]) * (u.test(t[0]) ? e / 100 : 1), parseFloat(t[1]) * (u.test(t[1]) ? i / 100 : 1)] } function i(e, i) { return parseInt(t.css(e, i), 10) || 0 } function s(e) { var i = e[0]; return 9 === i.nodeType ? { width: e.width(), height: e.height(), offset: { top: 0, left: 0 } } : t.isWindow(i) ? { width: e.width(), height: e.height(), offset: { top: e.scrollTop(), left: e.scrollLeft() } } : i.preventDefault ? { width: 0, height: 0, offset: { top: i.pageY, left: i.pageX } } : { width: e.outerWidth(), height: e.outerHeight(), offset: e.offset() } } var n, o = Math.max, a = Math.abs, r = /left|center|right/, l = /top|center|bottom/, h = /[\+\-]\d+(\.[\d]+)?%?/, c = /^\w+/, u = /%$/, d = t.fn.position; t.position = { scrollbarWidth: function () { if (void 0 !== n) return n; var e, i, s = t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"), o = s.children()[0]; return t("body").append(s), e = o.offsetWidth, s.css("overflow", "scroll"), i = o.offsetWidth, e === i && (i = s[0].clientWidth), s.remove(), n = e - i }, getScrollInfo: function (e) { var i = e.isWindow || e.isDocument ? "" : e.element.css("overflow-x"), s = e.isWindow || e.isDocument ? "" : e.element.css("overflow-y"), n = "scroll" === i || "auto" === i && e.width < e.element[0].scrollWidth, o = "scroll" === s || "auto" === s && e.height < e.element[0].scrollHeight; return { width: o ? t.position.scrollbarWidth() : 0, height: n ? t.position.scrollbarWidth() : 0 } }, getWithinInfo: function (e) { var i = t(e || window), s = t.isWindow(i[0]), n = !!i[0] && 9 === i[0].nodeType, o = !s && !n; return { element: i, isWindow: s, isDocument: n, offset: o ? t(e).offset() : { left: 0, top: 0 }, scrollLeft: i.scrollLeft(), scrollTop: i.scrollTop(), width: i.outerWidth(), height: i.outerHeight() } } }, t.fn.position = function (n) { if (!n || !n.of) return d.apply(this, arguments); n = t.extend({}, n); var u, p, f, g, m, _, v = t(n.of), b = t.position.getWithinInfo(n.within), y = t.position.getScrollInfo(b), w = (n.collision || "flip").split(" "), k = {}; return _ = s(v), v[0].preventDefault && (n.at = "left top"), p = _.width, f = _.height, g = _.offset, m = t.extend({}, g), t.each(["my", "at"], function () { var t, e, i = (n[this] || "").split(" "); 1 === i.length && (i = r.test(i[0]) ? i.concat(["center"]) : l.test(i[0]) ? ["center"].concat(i) : ["center", "center"]), i[0] = r.test(i[0]) ? i[0] : "center", i[1] = l.test(i[1]) ? i[1] : "center", t = h.exec(i[0]), e = h.exec(i[1]), k[this] = [t ? t[0] : 0, e ? e[0] : 0], n[this] = [c.exec(i[0])[0], c.exec(i[1])[0]] }), 1 === w.length && (w[1] = w[0]), "right" === n.at[0] ? m.left += p : "center" === n.at[0] && (m.left += p / 2), "bottom" === n.at[1] ? m.top += f : "center" === n.at[1] && (m.top += f / 2), u = e(k.at, p, f), m.left += u[0], m.top += u[1], this.each(function () { var s, r, l = t(this), h = l.outerWidth(), c = l.outerHeight(), d = i(this, "marginLeft"), _ = i(this, "marginTop"), x = h + d + i(this, "marginRight") + y.width, C = c + _ + i(this, "marginBottom") + y.height, D = t.extend({}, m), T = e(k.my, l.outerWidth(), l.outerHeight()); "right" === n.my[0] ? D.left -= h : "center" === n.my[0] && (D.left -= h / 2), "bottom" === n.my[1] ? D.top -= c : "center" === n.my[1] && (D.top -= c / 2), D.left += T[0], D.top += T[1], s = { marginLeft: d, marginTop: _ }, t.each(["left", "top"], function (e, i) { t.ui.position[w[e]] && t.ui.position[w[e]][i](D, { targetWidth: p, targetHeight: f, elemWidth: h, elemHeight: c, collisionPosition: s, collisionWidth: x, collisionHeight: C, offset: [u[0] + T[0], u[1] + T[1]], my: n.my, at: n.at, within: b, elem: l }) }), n.using && (r = function (t) { var e = g.left - D.left, i = e + p - h, s = g.top - D.top, r = s + f - c, u = { target: { element: v, left: g.left, top: g.top, width: p, height: f }, element: { element: l, left: D.left, top: D.top, width: h, height: c }, horizontal: 0 > i ? "left" : e > 0 ? "right" : "center", vertical: 0 > r ? "top" : s > 0 ? "bottom" : "middle" }; h > p && p > a(e + i) && (u.horizontal = "center"), c > f && f > a(s + r) && (u.vertical = "middle"), u.important = o(a(e), a(i)) > o(a(s), a(r)) ? "horizontal" : "vertical", n.using.call(this, t, u) }), l.offset(t.extend(D, { using: r })) }) }, t.ui.position = { fit: { left: function (t, e) { var i, s = e.within, n = s.isWindow ? s.scrollLeft : s.offset.left, a = s.width, r = t.left - e.collisionPosition.marginLeft, l = n - r, h = r + e.collisionWidth - a - n; e.collisionWidth > a ? l > 0 && 0 >= h ? (i = t.left + l + e.collisionWidth - a - n, t.left += l - i) : t.left = h > 0 && 0 >= l ? n : l > h ? n + a - e.collisionWidth : n : l > 0 ? t.left += l : h > 0 ? t.left -= h : t.left = o(t.left - r, t.left) }, top: function (t, e) { var i, s = e.within, n = s.isWindow ? s.scrollTop : s.offset.top, a = e.within.height, r = t.top - e.collisionPosition.marginTop, l = n - r, h = r + e.collisionHeight - a - n; e.collisionHeight > a ? l > 0 && 0 >= h ? (i = t.top + l + e.collisionHeight - a - n, t.top += l - i) : t.top = h > 0 && 0 >= l ? n : l > h ? n + a - e.collisionHeight : n : l > 0 ? t.top += l : h > 0 ? t.top -= h : t.top = o(t.top - r, t.top) } }, flip: { left: function (t, e) { var i, s, n = e.within, o = n.offset.left + n.scrollLeft, r = n.width, l = n.isWindow ? n.scrollLeft : n.offset.left, h = t.left - e.collisionPosition.marginLeft, c = h - l, u = h + e.collisionWidth - r - l, d = "left" === e.my[0] ? -e.elemWidth : "right" === e.my[0] ? e.elemWidth : 0, p = "left" === e.at[0] ? e.targetWidth : "right" === e.at[0] ? -e.targetWidth : 0, f = -2 * e.offset[0]; 0 > c ? (i = t.left + d + p + f + e.collisionWidth - r - o, (0 > i || a(c) > i) && (t.left += d + p + f)) : u > 0 && (s = t.left - e.collisionPosition.marginLeft + d + p + f - l, (s > 0 || u > a(s)) && (t.left += d + p + f)) }, top: function (t, e) { var i, s, n = e.within, o = n.offset.top + n.scrollTop, r = n.height, l = n.isWindow ? n.scrollTop : n.offset.top, h = t.top - e.collisionPosition.marginTop, c = h - l, u = h + e.collisionHeight - r - l, d = "top" === e.my[1], p = d ? -e.elemHeight : "bottom" === e.my[1] ? e.elemHeight : 0, f = "top" === e.at[1] ? e.targetHeight : "bottom" === e.at[1] ? -e.targetHeight : 0, g = -2 * e.offset[1]; 0 > c ? (s = t.top + p + f + g + e.collisionHeight - r - o, (0 > s || a(c) > s) && (t.top += p + f + g)) : u > 0 && (i = t.top - e.collisionPosition.marginTop + p + f + g - l, (i > 0 || u > a(i)) && (t.top += p + f + g)) } }, flipfit: { left: function () { t.ui.position.flip.left.apply(this, arguments), t.ui.position.fit.left.apply(this, arguments) }, top: function () { t.ui.position.flip.top.apply(this, arguments), t.ui.position.fit.top.apply(this, arguments) } } } }(), t.ui.position, t.extend(t.expr[":"], { data: t.expr.createPseudo ? t.expr.createPseudo(function (e) { return function (i) { return !!t.data(i, e) } }) : function (e, i, s) { return !!t.data(e, s[3]) } }), t.fn.extend({ disableSelection: function () { var t = "onselectstart" in document.createElement("div") ? "selectstart" : "mousedown"; return function () { return this.on(t + ".ui-disableSelection", function (t) { t.preventDefault() }) } }(), enableSelection: function () { return this.off(".ui-disableSelection") } }), t.ui.focusable = function (i, s) { var n, o, a, r, l, h = i.nodeName.toLowerCase(); return "area" === h ? (n = i.parentNode, o = n.name, i.href && o && "map" === n.nodeName.toLowerCase() ? (a = t("img[usemap='#" + o + "']"), a.length > 0 && a.is(":visible")) : !1) : (/^(input|select|textarea|button|object)$/.test(h) ? (r = !i.disabled, r && (l = t(i).closest("fieldset")[0], l && (r = !l.disabled))) : r = "a" === h ? i.href || s : s, r && t(i).is(":visible") && e(t(i))) }, t.extend(t.expr[":"], { focusable: function (e) { return t.ui.focusable(e, null != t.attr(e, "tabindex")) } }), t.ui.focusable, t.fn.form = function () { return "string" == typeof this[0].form ? this.closest("form") : t(this[0].form) }, t.ui.formResetMixin = { _formResetHandler: function () { var e = t(this); setTimeout(function () { var i = e.data("ui-form-reset-instances"); t.each(i, function () { this.refresh() }) }) }, _bindFormResetHandler: function () { if (this.form = this.element.form(), this.form.length) { var t = this.form.data("ui-form-reset-instances") || []; t.length || this.form.on("reset.ui-form-reset", this._formResetHandler), t.push(this), this.form.data("ui-form-reset-instances", t) } }, _unbindFormResetHandler: function () { if (this.form.length) { var e = this.form.data("ui-form-reset-instances"); e.splice(t.inArray(this, e), 1), e.length ? this.form.data("ui-form-reset-instances", e) : this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset") } } }, "1.7" === t.fn.jquery.substring(0, 3) && (t.each(["Width", "Height"], function (e, i) { function s(e, i, s, o) { return t.each(n, function () { i -= parseFloat(t.css(e, "padding" + this)) || 0, s && (i -= parseFloat(t.css(e, "border" + this + "Width")) || 0), o && (i -= parseFloat(t.css(e, "margin" + this)) || 0) }), i } var n = "Width" === i ? ["Left", "Right"] : ["Top", "Bottom"], o = i.toLowerCase(), a = { innerWidth: t.fn.innerWidth, innerHeight: t.fn.innerHeight, outerWidth: t.fn.outerWidth, outerHeight: t.fn.outerHeight }; t.fn["inner" + i] = function (e) { return void 0 === e ? a["inner" + i].call(this) : this.each(function () { t(this).css(o, s(this, e) + "px") }) }, t.fn["outer" + i] = function (e, n) { return "number" != typeof e ? a["outer" + i].call(this, e) : this.each(function () { t(this).css(o, s(this, e, !0, n) + "px") }) } }), t.fn.addBack = function (t) { return this.add(null == t ? this.prevObject : this.prevObject.filter(t)) }), t.ui.keyCode = { BACKSPACE: 8, COMMA: 188, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, LEFT: 37, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SPACE: 32, TAB: 9, UP: 38 }, t.ui.escapeSelector = function () { var t = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g; return function (e) { return e.replace(t, "\\$1") } }(), t.fn.labels = function () { var e, i, s, n, o; return this[0].labels && this[0].labels.length ? this.pushStack(this[0].labels) : (n = this.eq(0).parents("label"), s = this.attr("id"), s && (e = this.eq(0).parents().last(
vendor: 5,531 bytes, line 2078
2078), o = e.add(e.length ? e.siblings() : this.siblings()), i = "label[for='" + t.ui.escapeSelector(s) + "']", n = n.add(o.find(i).addBack(i))), this.pushStack(n)) }, t.fn.scrollParent = function (e) { var i = this.css("position"), s = "absolute" === i, n = e ? /(auto|scroll|hidden)/ : /(auto|scroll)/, o = this.parents().filter(function () { var e = t(this); return s && "static" === e.css("position") ? !1 : n.test(e.css("overflow") + e.css("overflow-y") + e.css("overflow-x")) }).eq(0); return "fixed" !== i && o.length ? o : t(this[0].ownerDocument || document) }, t.extend(t.expr[":"], { tabbable: function (e) { var i = t.attr(e, "tabindex"), s = null != i; return (!s || i >= 0) && t.ui.focusable(e, s) } }), t.fn.extend({ uniqueId: function () { var t = 0; return function () { return this.each(function () { this.id || (this.id = "ui-id-" + ++t) }) } }(), removeUniqueId: function () { return this.each(function () { /^ui-id-\d+$/.test(this.id) && t(this).removeAttr("id") }) } }), t.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()); var n = !1; t(document).on("mouseup", function () { n = !1 }), t.widget("ui.mouse", { version: "1.12.1", options: { cancel: "input, textarea, button, select, option", distance: 1, delay: 0 }, _mouseInit: function () { var e = this; this.element.on("mousedown." + this.widgetName, function (t) { return e._mouseDown(t) }).on("click." + this.widgetName, function (i) { return !0 === t.data(i.target, e.widgetName + ".preventClickEvent") ? (t.removeData(i.target, e.widgetName + ".preventClickEvent"), i.stopImmediatePropagation(), !1) : void 0 }), this.started = !1 }, _mouseDestroy: function () { this.element.off("." + this.widgetName), this._mouseMoveDelegate && this.document.off("mousemove." + this.widgetName, this._mouseMoveDelegate).off("mouseup." + this.widgetName, this._mouseUpDelegate) }, _mouseDown: function (e) { if (!n) { this._mouseMoved = !1, this._mouseStarted && this._mouseUp(e), this._mouseDownEvent = e; var i = this, s = 1 === e.which, o = "string" == typeof this.options.cancel && e.target.nodeName ? t(e.target).closest(this.options.cancel).length : !1; return s && !o && this._mouseCapture(e) ? (this.mouseDelayMet = !this.options.delay, this.mouseDelayMet || (this._mouseDelayTimer = setTimeout(function () { i.mouseDelayMet = !0 }, this.options.delay)), this._mouseDistanceMet(e) && this._mouseDelayMet(e) && (this._mouseStarted = this._mouseStart(e) !== !1, !this._mouseStarted) ? (e.preventDefault(), !0) : (!0 === t.data(e.target, this.widgetName + ".preventClickEvent") && t.removeData(e.target, this.widgetName + ".preventClickEvent"), this._mouseMoveDelegate = function (t) { return i._mouseMove(t) }, this._mouseUpDelegate = function (t) { return i._mouseUp(t) }, this.document.on("mousemove." + this.widgetName, this._mouseMoveDelegate).on("mouseup." + this.widgetName, this._mouseUpDelegate), e.preventDefault(), n = !0, !0)) : !0 } }, _mouseMove: function (e) { if (this._mouseMoved) { if (t.ui.ie && (!document.documentMode || 9 > document.documentMode) && !e.button) return this._mouseUp(e); if (!e.which) if (e.originalEvent.altKey || e.originalEvent.ctrlKey || e.originalEvent.metaKey || e.originalEvent.shiftKey) this.ignoreMissingWhich = !0; else if (!this.ignoreMissingWhich) return this._mouseUp(e) } return (e.which || e.button) && (this._mouseMoved = !0), this._mouseStarted ? (this._mouseDrag(e), e.preventDefault()) : (this._mouseDistanceMet(e) && this._mouseDelayMet(e) && (this._mouseStarted = this._mouseStart(this._mouseDownEvent, e) !== !1, this._mouseStarted ? this._mouseDrag(e) : this._mouseUp(e)), !this._mouseStarted) }, _mouseUp: function (e) { this.document.off("mousemove." + this.widgetName, this._mouseMoveDelegate).off("mouseup." + this.widgetName, this._mouseUpDelegate), this._mouseStarted && (this._mouseStarted = !1, e.target === this._mouseDownEvent.target && t.data(e.target, this.widgetName + ".preventClickEvent", !0), this._mouseStop(e)), this._mouseDelayTimer && (clearTimeout(this._mouseDelayTimer), delete this._mouseDelayTimer), this.ignoreMissingWhich = !1, n = !1, e.preventDefault() }, _mouseDistanceMet: function (t) { return Math.max(Math.abs(this._mouseDownEvent.pageX - t.pageX), Math.abs(this._mouseDownEvent.pageY - t.pageY)) >= this.options.distance }, _mouseDelayMet: function () { return this.mouseDelayMet }, _mouseStart: function () { }, _mouseDrag: function () { }, _mouseStop: function () { }, _mouseCapture: function () { return !0 } }), t.widget("ui.slider", t.ui.mouse, { version: "1.12.1", widgetEventPrefix: "slide", options: { animate: !1, classes: { "ui-slider": "ui-corner-all", "ui-slider-handle": "ui-corner-all", "ui-slider-range": "ui-corner-all ui-widget-header" }, distance: 0, max: 100, min: 0, orientation: "horizontal", range: !1, step: 1, value: 0, values: null, change: null, slide: null, start: null, stop: null }, numPages: 5, _create: function () { this._keySliding = !1, this._mouseSliding = !1, this._animateOff = !0, this._handleIndex = null, this._detectOrientation(), this._mouseInit(), this._calculateNewMax(), this._addClass("ui-slider ui-slider-" + this.orientation, "ui-widget ui-widget-content"), this._refresh(), this._animateOff = !1 }, _refresh: function () { this._createRange(), this._createHandles(), this._setupEvents(), this._refreshValue() }, _createHandles: function () { var e, i, s = this.options, n = this.element.find(".ui-slider-handle"), o = "<span tabindex='0'></span>", a = []; for (i = s.values && s.values.length || 1, n.length >
vendor: 4,759 bytes, line 2078
2078 i && (n.slice(i).remove(), n = n.slice(0, i)), e = n.length; i > e; e++)a.push(o); this.handles = n.add(t(a.join("")).appendTo(this.element)), this._addClass(this.handles, "ui-slider-handle", "ui-state-default"), this.handle = this.handles.eq(0), this.handles.each(function (e) { t(this).data("ui-slider-handle-index", e).attr("tabIndex", 0) }) }, _createRange: function () { var e = this.options; e.range ? (e.range === !0 && (e.values ? e.values.length && 2 !== e.values.length ? e.values = [e.values[0], e.values[0]] : t.isArray(e.values) && (e.values = e.values.slice(0)) : e.values = [this._valueMin(), this._valueMin()]), this.range && this.range.length ? (this._removeClass(this.range, "ui-slider-range-min ui-slider-range-max"), this.range.css({ left: "", bottom: "" })) : (this.range = t("<div>").appendTo(this.element), this._addClass(this.range, "ui-slider-range")), ("min" === e.range || "max" === e.range) && this._addClass(this.range, "ui-slider-range-" + e.range)) : (this.range && this.range.remove(), this.range = null) }, _setupEvents: function () { this._off(this.handles), this._on(this.handles, this._handleEvents), this._hoverable(this.handles), this._focusable(this.handles) }, _destroy: function () { this.handles.remove(), this.range && this.range.remove(), this._mouseDestroy() }, _mouseCapture: function (e) { var i, s, n, o, a, r, l, h, c = this, u = this.options; return u.disabled ? !1 : (this.elementSize = { width: this.element.outerWidth(), height: this.element.outerHeight() }, this.elementOffset = this.element.offset(), i = { x: e.pageX, y: e.pageY }, s = this._normValueFromMouse(i), n = this._valueMax() - this._valueMin() + 1, this.handles.each(function (e) { var i = Math.abs(s - c.values(e)); (n > i || n === i && (e === c._lastChangedValue || c.values(e) === u.min)) && (n = i, o = t(this), a = e) }), r = this._start(e, a), r === !1 ? !1 : (this._mouseSliding = !0, this._handleIndex = a, this._addClass(o, null, "ui-state-active"), o.trigger("focus"), l = o.offset(), h = !t(e.target).parents().addBack().is(".ui-slider-handle"), this._clickOffset = h ? { left: 0, top: 0 } : { left: e.pageX - l.left - o.width() / 2, top: e.pageY - l.top - o.height() / 2 - (parseInt(o.css("borderTopWidth"), 10) || 0) - (parseInt(o.css("borderBottomWidth"), 10) || 0) + (parseInt(o.css("marginTop"), 10) || 0) }, this.handles.hasClass("ui-state-hover") || this._slide(e, a, s), this._animateOff = !0, !0)) }, _mouseStart: function () { return !0 }, _mouseDrag: function (t) { var e = { x: t.pageX, y: t.pageY }, i = this._normValueFromMouse(e); return this._slide(t, this._handleIndex, i), !1 }, _mouseStop: function (t) { return this._removeClass(this.handles, null, "ui-state-active"), this._mouseSliding = !1, this._stop(t, this._handleIndex), this._change(t, this._handleIndex), this._handleIndex = null, this._clickOffset = null, this._animateOff = !1, !1 }, _detectOrientation: function () { this.orientation = "vertical" === this.options.orientation ? "vertical" : "horizontal" }, _normValueFromMouse: function (t) { var e, i, s, n, o; return "horizontal" === this.orientation ? (e = this.elementSize.width, i = t.x - this.elementOffset.left - (this._clickOffset ? this._clickOffset.left : 0)) : (e = this.elementSize.height, i = t.y - this.elementOffset.top - (this._clickOffset ? this._clickOffset.top : 0)), s = i / e, s > 1 && (s = 1), 0 > s && (s = 0), "vertical" === this.orientation && (s = 1 - s), n = this._valueMax() - this._valueMin(), o = this._valueMin() + s * n, this._trimAlignValue(o) }, _uiHash: function (t, e, i) { var s = { handle: this.handles[t], handleIndex: t, value: void 0 !== e ? e : this.value() }; return this._hasMultipleValues() && (s.value = void 0 !== e ? e : this.values(t), s.values = i || this.values()), s }, _hasMultipleValues: function () { return this.options.values && this.options.values.length }, _start: function (t, e) { return this._trigger("start", t, this._uiHash(e)) }, _slide: function (t, e, i) { var s, n, o = this.value(), a = this.values(); this._hasMultipleValues() && (n = this.values(e ? 0 : 1), o = this.values(e), 2 === this.options.values.length && this.options.range === !0 && (i = 0 === e ? Math.min(n, i) : Math.max(n, i)), a[e] = i), i !== o && (s = this._trigger("slide", t, this._uiHash(e, i, a)), s !== !1 && (this._hasMultipleValues() ? this.values(e, i) : this.value(i))) }, _stop: function (t, e) { this._trigger("stop", t, this._uiHash(e)) }, _change: function (t, e) { this._keySliding || this._mouseSliding || (this._lastChangedValue = e, this._trigger("change", t, this._uiHash(e))) }, value: function (t) { return arguments.length ? (this.options.value = this._trimAlignValue(t), this._refreshValue(), this._change(null, 0), void 0) : this._value(
vendor: 8,178 bytes, lines 2078-2122
2078) }, values: function (e, i) { var s, n, o; if (arguments.length > 1) return this.options.values[e] = this._trimAlignValue(i), this._refreshValue(), this._change(null, e), void 0; if (!arguments.length) return this._values(); if (!t.isArray(arguments[0])) return this._hasMultipleValues() ? this._values(e) : this.value(); for (s = this.options.values, n = arguments[0], o = 0; s.length > o; o += 1)s[o] = this._trimAlignValue(n[o]), this._change(null, o); this._refreshValue() }, _setOption: function (e, i) { var s, n = 0; switch ("range" === e && this.options.range === !0 && ("min" === i ? (this.options.value = this._values(0), this.options.values = null) : "max" === i && (this.options.value = this._values(this.options.values.length - 1), this.options.values = null)), t.isArray(this.options.values) && (n = this.options.values.length), this._super(e, i), e) { case "orientation": this._detectOrientation(), this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-" + this.orientation), this._refreshValue(), this.options.range && this._refreshRange(i), this.handles.css("horizontal" === i ? "bottom" : "left", ""); break; case "value": this._animateOff = !0, this._refreshValue(), this._change(null, 0), this._animateOff = !1; break; case "values": for (this._animateOff = !0, this._refreshValue(), s = n - 1; s >= 0; s--)this._change(null, s); this._animateOff = !1; break; case "step": case "min": case "max": this._animateOff = !0, this._calculateNewMax(), this._refreshValue(), this._animateOff = !1; break; case "range": this._animateOff = !0, this._refresh(), this._animateOff = !1 } }, _setOptionDisabled: function (t) { this._super(t), this._toggleClass(null, "ui-state-disabled", !!t) }, _value: function () { var t = this.options.value; return t = this._trimAlignValue(t) }, _values: function (t) { var e, i, s; if (arguments.length) return e = this.options.values[t], e = this._trimAlignValue(e); if (this._hasMultipleValues()) { for (i = this.options.values.slice(), s = 0; i.length > s; s += 1)i[s] = this._trimAlignValue(i[s]); return i } return [] }, _trimAlignValue: function (t) { if (this._valueMin() >= t) return this._valueMin(); if (t >= this._valueMax()) return this._valueMax(); var e = this.options.step > 0 ? this.options.step : 1, i = (t - this._valueMin()) % e, s = t - i; return 2 * Math.abs(i) >= e && (s += i > 0 ? e : -e), parseFloat(s.toFixed(5)) }, _calculateNewMax: function () { var t = this.options.max, e = this._valueMin(), i = this.options.step, s = Math.round((t - e) / i) * i; t = s + e, t > this.options.max && (t -= i), this.max = parseFloat(t.toFixed(this._precision())) }, _precision: function () { var t = this._precisionOf(this.options.step); return null !== this.options.min && (t = Math.max(t, this._precisionOf(this.options.min))), t }, _precisionOf: function (t) { var e = "" + t, i = e.indexOf("."); return -1 === i ? 0 : e.length - i - 1 }, _valueMin: function () { return this.options.min }, _valueMax: function () { return this.max }, _refreshRange: function (t) { "vertical" === t && this.range.css({ width: "", left: "" }), "horizontal" === t && this.range.css({ height: "", bottom: "" }) }, _refreshValue: function () { var e, i, s, n, o, a = this.options.range, r = this.options, l = this, h = this._animateOff ? !1 : r.animate, c = {}; this._hasMultipleValues() ? this.handles.each(function (s) { i = 100 * ((l.values(s) - l._valueMin()) / (l._valueMax() - l._valueMin())), c["horizontal" === l.orientation ? "left" : "bottom"] = i + "%", t(this).stop(1, 1)[h ? "animate" : "css"](c, r.animate), l.options.range === !0 && ("horizontal" === l.orientation ? (0 === s && l.range.stop(1, 1)[h ? "animate" : "css"]({ left: i + "%" }, r.animate), 1 === s && l.range[h ? "animate" : "css"]({ width: i - e + "%" }, { queue: !1, duration: r.animate })) : (0 === s && l.range.stop(1, 1)[h ? "animate" : "css"]({ bottom: i + "%" }, r.animate), 1 === s && l.range[h ? "animate" : "css"]({ height: i - e + "%" }, { queue: !1, duration: r.animate }))), e = i }) : (s = this.value(), n = this._valueMin(), o = this._valueMax(), i = o !== n ? 100 * ((s - n) / (o - n)) : 0, c["horizontal" === this.orientation ? "left" : "bottom"] = i + "%", this.handle.stop(1, 1)[h ? "animate" : "css"](c, r.animate), "min" === a && "horizontal" === this.orientation && this.range.stop(1, 1)[h ? "animate" : "css"]({ width: i + "%" }, r.animate), "max" === a && "horizontal" === this.orientation && this.range.stop(1, 1)[h ? "animate" : "css"]({ width: 100 - i + "%" }, r.animate), "min" === a && "vertical" === this.orientation && this.range.stop(1, 1)[h ? "animate" : "css"]({ height: i + "%" }, r.animate), "max" === a && "vertical" === this.orientation && this.range.stop(1, 1)[h ? "animate" : "css"]({ height: 100 - i + "%" }, r.animate)) }, _handleEvents: { keydown: function (e) { var i, s, n, o, a = t(e.target).data("ui-slider-handle-index"); switch (e.keyCode) { case t.ui.keyCode.HOME: case t.ui.keyCode.END: case t.ui.keyCode.PAGE_UP: case t.ui.keyCode.PAGE_DOWN: case t.ui.keyCode.UP: case t.ui.keyCode.RIGHT: case t.ui.keyCode.DOWN: case t.ui.keyCode.LEFT: if (e.preventDefault(), !this._keySliding && (this._keySliding = !0, this._addClass(t(e.target), null, "ui-state-active"), i = this._start(e, a), i === !1)) return }switch (o = this.options.step, s = n = this._hasMultipleValues() ? this.values(a) : this.value(), e.keyCode) { case t.ui.keyCode.HOME: n = this._valueMin(); break; case t.ui.keyCode.END: n = this._valueMax(); break; case t.ui.keyCode.PAGE_UP: n = this._trimAlignValue(s + (this._valueMax() - this._valueMin()) / this.numPages); break; case t.ui.keyCode.PAGE_DOWN: n = this._trimAlignValue(s - (this._valueMax() - this._valueMin()) / this.numPages); break; case t.ui.keyCode.UP: case t.ui.keyCode.RIGHT: if (s === this._valueMax()) return; n = this._trimAlignValue(s + o); break; case t.ui.keyCode.DOWN: case t.ui.keyCode.LEFT: if (s === this._valueMin()) return; n = this._trimAlignValue(s - o) }this._slide(e, a, n) }, keyup: function (e) { var i = t(e.target).data("ui-slider-handle-index"); this._keySliding && (this._keySliding = !1, this._stop(e, i), this._change(e, i), this._removeClass(t(e.target), null, "ui-state-active")) } } }) });/* De-commissioned */
2079/**
2080 * Add, hide or remove a message from the bottom of the page. 
2081 * @namespace bottomdrawer
2082 */
2083var bottomdrawer = {
2084    /**
2085     * The target for the toggledrawer function
2086     * @memberof BottomDrawer
2087     * @namespace BottomDrawer.selector
2088     */
2089    selector: '.bottom-drawer',
2090    /**
2091     * Creates the message which will be added to the page with toggledrawer
2092     * @method adddrawer
2093     * @param {String} content The text to add to the message bar.
2094     * @param {"green" | "blue" | "orange" | "red" | "grey" | "dark" | "offblack"} drawercolour The colour of the message bar.
2095     * @memberof BottomDrawer
2096     */
2097    adddrawer: function (content, drawercolour) {
2098        $('body').append('<div class="bottom-drawer ctrPad16" style="display:none;" data-drawercolour="' + drawercolour + '">' + content + '<span class="bottom-drawer---close icon-cross transition" onclick="bottomdrawer.toggledrawer(false, $(this));" class=""></span></div>');
2099        bottomdrawer.toggledrawer(true);
2100    },
2101    /**
2102     * Adds or removes the message bar to/from the page
2103     * @method toggledrawer
2104     * @param {Boolean} showhideboolean True to show the message (done automatically when you use adddrawer function) or False for hiding.
2105     * @param {String} [el] The element selector.Only required when hiding the message.
2106     * @memberof BottomDrawer
2107     */
2108    toggledrawer: function (showhideboolean, el) {
2109        if (showhideboolean) {
2110            $(bottomdrawer.selector).slideDown(300);
2111        }
2112        else {
2113            el.parent().slideUp(300, function () {
2114                el.parent().remove();
2115            });
2116        }
2117    }
2118};function GDPRCookies(open, boolean) {
2119    var foundCookie = getCookie('GDPRCookieTrack');
2120    var consentIsAlreadyProvided = foundCookie
2121                        ? foundCookie.toLowerCase() == "true"
2122                        : false;
2123
2124    if (open && !consentIsAlreadyProvided && ecommerceConfig.RequireGDPRConsent && ecommerceConfig.ShowCookieConsent) {
2125        $('#GDPRCookieBox').addClass('GDPRCookieBox-show');
2126    }
2127    else {
2128        if (consentIsAlreadyProvided == true) {
2129            /* Do Nothing */
2130        }
2131        else {
2132            $('#GDPRCookieBox').removeClass('GDPRCookieBox-show');
2133            setCookieWithDays("GDPRCookieTrack", boolean, 365);
2134        }
2135
2136        const consentOrBypass = consentIsAlreadyProvided || boolean
2137
2138        if (consentOrBypass && !localStorage.getItem('googleConsentModelUpdated')) {
2139            createDataLayerAndGtagMethod();
2140            setGoogleConsent(true, true, true, true);
2141
2142            localStorage.setItem('googleConsentModelUpdated', true);
2143        }
2144        else if (localStorage.getItem('googleConsentModelUpdated')) {
2145            console.log('Consent already updated.');
2146        }
2147
2148        if (consentOrBypass) {
2149            setUetConsent(true);
2150        }
2151    }
2152}
2153
2154$(window).load(function () {
2155    let cookieValue = '';
2156
2157    if (!ecommerceConfig.RequireGDPRConsent || !ecommerceConfig.ShowCookieConsent) {
2158        cookieValue = true;
2159    }
2160
2161    GDPRCookies(true, cookieValue);
2162});
2163var MODALTYPE_SUCCESS = 'success',
2164    MODALTYPE_INFORMATION = 'information',
2165    MODALTYPE_WARNING = 'warning',
2166    MODALTYPE_ERROR = 'error',
2167    MODALTYPE_CLPOS = 'clpos';
2168
2169function GetModalMessageTemplate() {
2170    var messageTemplate = '<modal-message id="[[MODALID]]">' +
2171        '<modal-message-inner modal-type="[[MODALTYPE]]">' +
2172            '<modal-message-close onclick="CloseModalMessage(\'[[MODALID]]\', \'[[PROMISENAME]]\', false);"></modal-message-close>' +
2173            '<modal-message-inner-message>' +
2174                '<modal-message-header>[[HEADER]]</modal-message-header>' +
2175                '<modal-message-body>[[BODY]]</modal-message-body>' +
2176                '<modal-message-footer>[[FOOTER]]</modal-message-footer>' +
2177            '</modal-message-inner-message>' +
2178        '</modal-message-inner>' +
2179    '</modal-message>';
2180    return messageTemplate;
2181}
2182
2183function GetModalMessageType(type) {
2184
2185    if (type === MODALTYPE_SUCCESS || type === MODALTYPE_INFORMATION || type === MODALTYPE_WARNING || type === MODALTYPE_ERROR || type === MODALTYPE_CLPOS) {
2186        /* Do Nothing to modify the type */
2187    }
2188    else {
2189        /* Provide a fallback */
2190        type = MODALTYPE_INFORMATION;
2191    }
2192
2193    return type;
2194}
2195
2196function GetModularMessageConfig(type) {
2197    return {
2198        Header: 'Information',
2199        Body: 'Body Message',
2200        Footer: {
2201            Confirm: {
2202                name: 'Confirm',
2203                action: 'resolve'
2204            },
2205            Cancel: null
2206        },
2207        Type: GetModalMessageType(type)
2208    };
2209}
2210
2211function ModularModalMessage(promiseObjectName, modularMessageConfig) {
2212    var modalId = 'ModalMessage-' + Math.round((new Date()).getTime());
2213
2214    ModularModalMessageWithID(promiseObjectName, modularMessageConfig, modalId);
2215}
2216
2217function ModularModalMessageWithID(promiseObjectName, modularMessageConfig, modalId)
2218{
2219    var modalHtml = ModalMessageCreate(promiseObjectName, modularMessageConfig, modalId);
2220
2221    $('body').append(modalHtml);
2222    $('#' + modalId).fadeTo(300, 1);
2223}
2224
2225function ModalMessageCreate(promiseObjectName, modularMessageConfig, modalId) {
2226    var modalType = GetModalMessageType(modularMessageConfig.Type);
2227
2228    return GetModalMessageTemplate().replace(/\[\[MODALID\]\]/gm, modalId)
2229        .replace('[[HEADER]]', modularMessageConfig.Header)
2230        .replace('[[MODALTYPE]]', modalType)
2231        .replace('[[PROMISENAME]]', promiseObjectName)
2232        .replace('[[BODY]]', modularMessageConfig.Body)
2233        .replace('[[FOOTER]]', ModalMessageFooterCreate(promiseObjectName, modularMessageConfig.Footer, modalId));
2234}
2235
2236function ModalMessageFooterCreate(promiseObjectName, footerObject, modalId) {
2237    var returnHtml = '';
2238   
2239    for (var footerElement in footerObject) {
2240        if (!footerObject[footerElement]) {
2241            continue;
2242        }
2243        var condition = footerObject[footerElement].action === 'resolve';
2244        returnHtml += '<span onclick="CloseModalMessage(\'' + modalId + '\', \'' + promiseObjectName + '\', ' + condition + ');">' + footerObject[footerElement].name + '</span>';
2245    }
2246
2247    return returnHtml;
2248}
2249
2250function CloseModalMessage(modalId, promiseObjectName, resolveCondition) {
2251    $('#'+modalId).fadeTo(300, 0, function () {
2252        window[promiseObjectName].resolve(resolveCondition);
2253        $(this).remove();
2254    });
2255}
2256function AddStatefulLoadingSpinnerGlobal(spinnerId) {
2257    var spinnerHtml = '<div id="' + spinnerId + '" class="col-1 bgSemiDark zflex-v pos-fix height-100-vh zindex-1000" style="top:0;left:0;right:0;bottom:0;display:none;"><div class="col-1 centralise ctrPad32"><div class="cart-lds-ellipsis"><div data-loadingdot="1"></div><div data-loadingdot="2"></div><div data-loadingdot="3"></div><div data-loadingdot="4"></div></div></div></div>';
2258
2259    if ($('#' + spinnerId).length === 0) {
2260        $('body').append(spinnerHtml);
2261    }
2262}
2263
2264function ToggleLoadingSpinnerByName(name, loadingState) {
2265    if ($('#' + name).is(":visible")
2266        && !loadingState) {
2267
2268        $('#' + name).fadeOut(150);
2269
2270    }
2271    else if ($('#' + name).is(":hidden")
2272        && loadingState) {
2273
2274        $('#' + name).fadeIn(150);
2275    }
2276    else {
2277        /*
2278            Do Nothing
2279        */
2280    }
2281
2282}
2283
2284function StatefulLoader(id, success) {
2285
2286    var loader = GetStatefulLoader(id);
2287
2288    /* Exit function if loader is not found */
2289    if (!loader.length) { return false };
2290
2291    loader
2292        .toggleClass('stateful-load-error', !success)
2293        .toggleClass('stateful-load-complete', success);
2294
2295    loader.find('.stateful-checkmark')
2296        .toggleClass('stateful-draw', success)
2297        .toggleClass('stateful-error', !success)
2298        .toggle();
2299
2300}
2301
2302function StatefulLoaderPresent(id) {
2303    return document.getElementById(id) != null;
2304}
2305
2306function GetStatefulLoader(id) {
2307    var loader;
2308    if (id.Empty()) {
2309        loader = $('*[id*="stateful-loader-"]').eq(0);
2310    }
2311    else {
2312        loader = $('#' + id);
2313    }
2314    return loader;
2315}
2316
2317function StatefulLoaderReset(id) {
2318    var loader = $('#' + id);
2319
2320    /* Exit function if loader is not found */
2321    if (!loader.length) { return false };
2322
2323    loader
2324        .removeClass('stateful-load-error')
2325        .removeClass('stateful-load-complete');
2326
2327    loader.find('.stateful-checkmark')
2328        .removeClass('stateful-draw')
2329        .removeClass('stateful-error')
2330        .hide();
2331}
2332/*
2333 * String.Empty('your string')
2334 * or
2335 * 'your string'.Empty()
2336 */ 
2337Object.defineProperty(String.prototype, "Empty", {
2338    value: function Empty() {
2339        return this.length === 0;
2340    },
2341    configurable: false,
2342    enumerable: false,
2343    writeable: false
2344});
2345
2346/*
2347 * String.EmptyOrWhitespace('your string')
2348 * or
2349 * 'your string'.EmptyOrWhitespace()
2350 */
2351Object.defineProperty(String.prototype, "EmptyOrWhitespace", {
2352    value: function EmptyOrWhitespace() {
2353        var stringToCheck = this.replace(/\s/gm, '');
2354        return stringToCheck.length === 0;
2355    },
2356    configurable: false,
2357    enumerable: false,
2358    writeable: false
2359});
2360
2361/* Turns a string localised number to a float value using the locale of the ecommerceConfig.Locale, e.g. EUR: "1.777,77".ToNonLocaleFloat("es-ES") or GBP: "1,777.77".ToNonLocaleFloat(en-GB)  both will output. Output 1777.77 (Number type) */
2362Object.defineProperty(String.prototype, "ToNonLocaleFloat", {
2363    value: function ToNonLocaleFloat(locale) {
2364
2365        if (!locale) {
2366            locale = "en-GB";
2367        }
2368
2369        var thousandSeparator = Intl.NumberFormat(locale).format(11111).replace(/\p{Number}/gu, '');
2370        var decimalSeparator = Intl.NumberFormat(locale).format(1.1).replace(/\p{Number}/gu, '');
2371
2372        return parseFloat(this
2373            .replace(/\s/g, '')
2374            .replace(new RegExp('\\' + thousandSeparator, 'g'), '')
2375            .replace(new RegExp('\\' + decimalSeparator), '.')
2376            .replace(/[^\d^.]/g, ''));
2377    },
2378    configurable: false,
2379    enumerable: false,
2380    writeable: false
2381});
2382if (!Array.prototype.find)
2383{
2384    Object.defineProperty(Array.prototype, 'find', {
2385        value: function (predicate)
2386        {
2387            if (this == null)
2388            {
2389                throw TypeError('"this" is null or not defined');
2390            }
2391
2392            var o = Object(this);
2393
2394            var len = o.length >>> 0;
2395
2396            if (typeof predicate !== 'function')
2397            {
2398                throw TypeError('predicate must be a function');
2399            }
2400
2401            var thisArg = arguments[1];
2402
2403            var k = 0;
2404
2405            while (k < len)
2406            {
2407                var kValue = o[k];
2408                if (predicate.call(thisArg, kValue, k, o))
2409                {
2410                    return kValue;
2411                }
2412                k++;
2413            }
2414
2415            return undefined;
2416        },
2417        configurable: true,
2418        writable: true
2419    });
2420}
2421function reviewModulesToggle(el, showhide) {
2422    // Show
2423    if (showhide) {
2424        $(el).addClass('slidein-show');
2425    }
2426    // Hide
2427    else {
2428        $('.modular-review-faq-slidein').each(function () {
2429            $(this).removeClass('slidein-show');
2430        });
2431    }
2432}
2433
2434(function () {
2435    document.addEventListener("readystatechange", function () {
2436        $('.reviewCount').text($('.reviewItem').length);
2437
2438        var $faqCountSelector = $('#faqAnswer .faqCompleteCtr');
2439        if (typeof ISDETAILFASTPAGE == 'boolean' && ISDETAILFASTPAGE == true) {
2440            $faqCountSelector = $('#FAQPane>.faqCompleteCtr');
2441        }
2442        $('.faqCount').text($faqCountSelector.length);
2443
2444    }, false);
2445})();
2446if (typeof Object.assign !== 'function')
2447{
2448    // Must be writable: true, enumerable: false, configurable: true
2449    Object.defineProperty(Object, "assign", {
2450        value: function assign(target, _)
2451        { // .length of function is 2
2452            'use strict';
2453            if (target === null || target === undefined)
2454            {
2455                throw new TypeError('Cannot convert undefined or null to object');
2456            }
2457
2458            var to = Object(target);
2459
2460            for (var index = 1; index < arguments.length; index++)
2461            {
2462                var nextSource = arguments[index];
2463
2464                if (nextSource !== null && nextSource !== undefined)
2465                {
2466                    for (var nextKey in nextSource)
2467                    {
2468                        // Avoid bugs when hasOwnProperty is shadowed
2469                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey))
2470                        {
2471                            to[nextKey] = nextSource[nextKey];
2472                        }
2473                    }
2474                }
2475            }
2476            return to;
2477        },
2478        writable: true,
2479        configurable: true
2480    });
2481}
2482
2483/*
2484 * Required because IE11 does not support ES6 syntax
2485 * When we finally 'deal with' IE, we can remove this polyfill
2486 */
2487Number.isNaN = Number.isNaN || function isNaN(input)
2488{
2489    return typeof input === 'number' && input !== input;
2490};
2491
2492/*
2493 * Required because IE11 does not support ES6 syntax
2494 * When we finally 'deal with' IE, we can remove this polyfill
2495 */
2496Number.isInteger = Number.isInteger || function (value)
2497{
2498    return typeof value === "number" &&
2499        isFinite(value) &&
2500        Math.floor(value) === value;
2501};
2502
2503/*
2504 * Polyfill for the Working Draft :focus-within pseudo selector.
2505 * When this leaves Working Draft, we can remove this polyfill.
2506 */
2507(function (window, document)
2508{
2509    'use strict';
2510    var slice = [].slice;
2511    var removeClass = function (elem)
2512    {
2513        elem.classList.remove('focus-within');
2514    };
2515    var update = (function ()
2516    {
2517        var running, last;
2518        var action = function ()
2519        {
2520            var element = document.activeElement;
2521            running = false;
2522            if (last !== element)
2523            {
2524                last = element;
2525                slice.call(document.getElementsByClassName('focus-within')).forEac
2525h(removeClass);
2526                while (element && element.classList)
2527                {
2528                    element.classList.add('focus-within');
2529                    element = element.parentNode;
2530                }
2531            }
2532        };
2533        return function ()
2534        {
2535            if (!running)
2536            {
2537                requestAnimationFrame(action);
2538                running = true;
2539            }
2540        };
2541    })();
2542    document.addEventListener('focus', update, true);
2543    document.addEventListener('blur', update, true);
2544})(window, document);
2545
2546// IE11 Polyfill
2547if (!Array.prototype.findIndex)
2548{
2549    Object.defineProperty(Array.prototype, 'findIndex', {
2550        value: function (predicate)
2551        {
2552            // 1. Let O be ? ToObject(this value).
2553            if (this == null)
2554            {
2555                throw new TypeError('"this" is null or not defined');
2556            }
2557
2558            var o = Object(this);
2559
2560            // 2. Let len be ? ToLength(? Get(O, "length")).
2561            var len = o.length >>> 0;
2562
2563            // 3. If IsCallable(predicate) is false, throw a TypeError exception.
2564            if (typeof predicate !== 'function')
2565            {
2566                throw new TypeError('predicate must be a function');
2567            }
2568
2569            // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
2570            var thisArg = arguments[1];
2571
2572            // 5. Let k be 0.
2573            var k = 0;
2574
2575            // 6. Repeat, while k < len
2576            while (k < len)
2577            {
2578                // a. Let Pk be ! ToString(k).
2579                // b. Let kValue be ? Get(O, Pk).
2580                // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
2581                // d. If testResult is true, return k.
2582                var kValue = o[k];
2583                if (predicate.call(thisArg, kValue, k, o))
2584                {
2585                    return k;
2586                }
2587                // e. Increase k by 1.
2588                k++;
2589            }
2590
2591            // 7. Return -1.
2592            return -1;
2593        },
2594        configurable: true,
2595        writable: true
2596    });
2597}
2598function GetGeoLocation()
2599{
2600    var returnPromise = $.Deferred();
2601    var geolocationResponse = {
2602        longitude: 0,
2603        latitude: 0
2604    };
2605
2606    navigator.geolocation.getCurrentPosition(
2607        function GotGeoLocation(position)
2608        {
2609            var coordindates = position.coords;
2610
2611            geolocationResponse.latitude = coordindates.latitude;
2612            geolocationResponse.longitude = coordindates.longitude;
2613
2614            returnPromise.resolve(geolocationResponse);
2615        },
2616        function GeoError(errorInformation)
2617        {
2618            returnPromise.reject(errorInformation);
2619        },
2620        {
2621            enableHighAccuracy: true,
2622            timeout: 5000,
2623            maximumAge: 0
2624        }
2625    );
2626
2627    return returnPromise;
2628}
2629
2630function ErrorGettingGeoLocationCallback(errorInformation)
2631{
2632    console.warn('ERROR(' + errorInformation.code + '): ' + errorInformation.message);
2633    console.warn('We are unable to get your location from your browser, please enter a postcode.');
2634}
2635const starbuyProductIdQueryParam = 'starbuyProductId';
2636const starbuyPromoIdQueryParam = 'starbuyPromoId';
2637
2638window.addEventListener('load', () => {
2639    starbuysInitialiseOnLoadAndPopstate();
2640});
2641
2642document.addEventListener('cartupdate', (event) => {
2643    const eventData = event.detail;
2644
2645    if (eventData?.Products?.length) {
2646        loadStartCartPreview();
2647    }
2648});
2649
2650function starbuysInitialiseOnLoadAndPopstate() {
2651    const starbuyProductId = GetURLParameterByName(starbuyProductIdQueryParam);
2652    const starbuyPromoId = GetURLParameterByName(starbuyPromoIdQueryParam);
2653
2654    if (starbuyProductId) {
2655        loadStarbuyDrawerOne(Number(starbuyProductId));
2656    }
2657
2658    if (starbuyPromoId) {
2659        loadStarbuyDrawerTwo(Number(starbuyPromoId));
2660    }
2661}
2662
2663
2664function loadStarbuyFindAndFilterPreview(starbuyId) {
2665    getStarbuy(
2666        starbuyId,
2667        false,
2668        (data) => {
2669            const responseData = data.d;
2670
2671            const previewElement = document.createElement('div');
2672            previewElement.classList.add('starbuy-faf-preview');
2673            previewElement.onclick = () => { previewElement.dataset.viewAllExplainer = previewElement.dataset.viewAllExplainer === '1' ? '0' : '1' }
2674
2675
2676            const previewHeader = document.createElement('div');
2677            previewHeader.classList.add('starbuy-faf-preview-header');
2678            const starbuysTerm = GetTranslation('JavaScriptTranslations', '24Starbuys-StarbuyTerm');
2679            previewHeader.innerHTML = `<span class="starbuy-faf-preview-header-star"></span> ${starbuysTerm}`;
2680
2681            const previewMsg = document.createElement('div');
2682            previewMsg.classList.add('starbuy-faf-preview-message');
2683
2684            const previewMsgLead = document.createElement('div');
2685            previewMsgLead.classList.add('starbuy-faf-preview-message-lead');
2686            previewMsgLead.innerHTML = responseData.PromotionText;
2687
2688            const previewMsgWhenYouBuy = document.createElement('div');
2689            previewMsgWhenYouBuy.classList.add('starbuy-faf-preview-message-whenyoubuy');
2690            previewMsgWhenYouBuy.innerHTML = ReplacePlaceholders(
2691                GetTranslation('JavaScriptTranslations', '24Starbuy-WhenYouBuyThisItemTodayX0FacetName'), responseData.SourceName.trim());
2692
2693            const previewMsgExplainer = document.createElement('div');
2694            previewMsgExplainer.classList.add('starbuy-faf-preview-message-explainer');
2695            previewMsgExplainer.innerHTML = ReplacePlaceholders(
2696                GetTranslation('JavaScriptTranslations', '24Starbuy-PriceExplainerX0SourceNameFaf'), responseData.SourceName.trim());
2697
2698            previewMsg.appendChild(previewMsgLead);
2699            previewMsg.appendChild(previewMsgWhenYouBuy);
2700            previewMsg.appendChild(previewMsgExplainer);
2701
2702            previewElement.appendChild(previewHeader);
2703            previewElement.appendChild(previewMsg);
2704
2705            const target = document.querySelector('#FAFCustomReorder.FAFResults');
2706
2707            if (target) {
2708                target.insertBefore(previewElement, target.firstChild);
2709            }
2710
2711        }
2712    );
2713}
2714
2715function loadStartCartPreview() {
2716    getStarbuysByCart(
2717        false,
2718        (data) => {
2719            const responseData = data.d;
2720            const unappliedOffers = responseData.filter(e => !e.IsApplied);
2721
2722            const cartRows = document.querySelectorAll('.basket-itemrow-wrapper');
2723
2724            for (const cartRow of cartRows) {
2725                const existingPromo = cartRow.dataset?.childid.toString() != 0 || cartRow.dataset?.parentid.toString() != 0;
2726                if (!existingPromo) {
2727                    const cartItemId = cartRow.dataset.cartitem;
2728                    const applicableStarbuysCount = unappliedOffers.filter(e => e.CartItemId == cartItemId).length;
2729
2730                    if (applicableStarbuysCount) {
2731                        const previewElement = document.createElement('div');
2732                        previewElement.classList.add('starbuy-product-preview');
2733                        previewElement.onclick = () => { loadStarbuyDrawerOne(cartRow.dataset.productid) };
2734
2735                        const previewHeader = document.createElement('div');
2736                        previewHeader.classList.add('starbuy-product-preview-header');
2737                        const starbuysTerm = GetTranslation('JavaScriptTranslations', '24Starbuys-StarbuyTerm');
2738                        previewHeader.innerHTML = `<span class="starbuy-product-preview-header-star"></span> ${starbuysTerm}`;
2739
2740                        const previewMsg = document.createElement('div');
2741                        previewMsg.classList.add('starbuy-product-preview-message');
2742                        previewMsg.innerHTML = ReplacePlaceholders(
2743                            GetTranslation('JavaScriptTranslations', '24Starbuys-StarbuyOffersAvailableWithThisItemX0NumberOfOffers'),
2744                            applicableStarbuysCount
2745                        );
2746
2747                        const previewLink = document.createElement('div');
2748                        previewLink.classList.add('starbuy-product-preview-link');
2749                        previewLink.innerHTML = GetTranslation('JavaScriptTranslations', '24Starbuys-ViewAllOffers');
2750
2751                        previewElement.appendChild(previewHeader);
2752                        previewElement.appendChild(previewMsg);
2753                        previewElement.appendChild(previewLink);
2754
2755                        const target = cartRow.querySelector('.basket-itemrow-offers');
2756                        target.innerHTML = '';
2757                        target.appendChild(previewElement);
2758                    }
2759                }
2760            }
2761        }
2762    );
2763}
2764
2765function loadStarbuyProductPreview(productId, selector) {
2766    const target = document.querySelector(selector);
2767
2768    if (target) {
2769        getStarbuysByProduct(
2770            productId,
2771            false,
2772            (data) => {
2773                const responseData = data.d;
2774
2775                if (responseData.Starbuys.length) {
2776                    const previewElement = document.createElement('div');
2777                    previewElement.classList.add('starbuy-product-preview');
2778                    previewElement.onclick = () => { loadStarbuyDrawerOne(productId) };
2779
2780                    const previewHeader = document.createElement('div');
2781                    previewHeader.classList.add('starbuy-product-preview-header');
2782                    const starbuysTerm = GetTranslation('JavaScriptTranslations', '24Starbuys-StarbuyTerm');
2783                    previewHeader.innerHTML = `<span class="starbuy-product-preview-header-star"></span> ${starbuysTerm}`;
2784
2785                    const previewMsg = document.createElement('div');
2786                    previewMsg.classList.add('starbuy-product-preview-message');
2787                    previewMsg.innerHTML = ReplacePlaceholders(
2788                        GetTranslation('JavaScriptTranslations', '24Starbuys-StarbuyOffersAvailableWithThisItemX0NumberOfOffers'),
2789                        responseData.Starbuys.length
2790                    );
2791
2792                    const previewLink = document.createElement('div');
2793                    previewLink.classList.add('starbuy-product-preview-link');
2794                    previewLink.innerHTML = GetTranslation('JavaScriptTranslations', '24Starbuys-ViewAllOffers');
2795
2796                    previewElement.appendChild(previewHeader);
2797                    previewElement.appendChild(previewMsg);
2798                    previewElement.appendChild(previewLink);
2799
2800                    target.appendChild(previewElement);
2801                }
2802            }
2803        );
2804    }
2805}
2806
2807function loadStarbuyDrawerOneCart() {
2808    let starbuyDrawer;
2809    getStarbuysByCart(
2810        false,
2811        (data) => {
2812            const responseData = data.d;
2813
2814            const appliedStarbuys = responseData?.filter(e => e.IsApplied) ?? 0;
2815            const appliedStarbuyCount = appliedStarbuys.length ?? 0;
2816            const unappliedStarbuyCount = responseData.length - appliedStarbuyCount;
2817
2818            if (unappliedStarbuyCount) {
2819                let starbuyContent = [];
2820
2821                const starbuyHeaderContent = GetTranslation('JavaScriptTranslations', '24Starbuys-YourStarbuyOffers');
2822
2823                const singularGreatNewsMessage = ReplacePlaceholders(
2824                    GetTranslation('JavaScriptTranslations', '24Starbuys-SingularGreatNewsMessageX0NumberOfOffers'),
2825                    appliedStarbuyCount
2826                );
2827                const pluralGreatNewsMessage = ReplacePlaceholders(
2828                    GetTranslation('JavaScriptTranslations', '24Starbuys-PluralGreatNewsMessageX0NumberOfOffers'),
2829                    appliedStarbuyCount
2830                );
2831                const appliedStarbuyDescription = appliedStarbuyCount > 0 ? (appliedStarbuyCount > 1 ? `${pluralGreatNewsMessage} ` : `${singularGreatNewsMessage} `) : '';
2832
2833                const unappliedStarbuyDescription = getUnappliedStarbuyInCartText(unappliedStarbuyCount);
2834
2835                const starbuyDescriptionContent = `${appliedStarbuyDescription}${unappliedStarbuyDescription}`;
2836
2837                if (unappliedStarbuyCount) {
2838                    for (const starbuyOffer of responseData.sort((a, b) => a.IsApplied - b.IsApplied)) {
2839                        starbuyContent.push(getStarbuyElement(starbuyOffer, starbuyOffer.IsApplied));
2840                    }
2841                }
2842
2843                starbuyDrawer = getStarbuyDrawer(1, starbuyHeaderContent, starbuyDescriptionContent, starbuyContent);
2844                document.body.appendChild(starbuyDrawer);
2845            }
2846        },
2847        () => {
2848            setTimeout(() => {
2849                if (starbuyDrawer) {
2850                    starbuyDrawer.dataset.state = 'open';
2851                }
2852            }, 150);
2853        }
2854    );
2855}
2856
2857function loadStarbuyDrawerOne(productId) {
2858    let starbuyDrawer;
2859    getStarbuysByProduct(
2860        productId,
2861        false,
2862        (data) => {
2863            const responseData = data.d;
2864
2865            if (responseData.Starbuys.length) {
2866                let starbuyContent = [];
2867
2868                const starbuyHeaderContent = GetTranslation('JavaScriptTranslations', '24Starbuys-ChooseYourStarbuy');
2869
2870                const singularThereAreUnappliedMessage = ReplacePlaceholders(
2871                    GetTranslation('JavaScriptTranslations', '24Starbuy-SingularItemsWithThisItem'),
2872                    responseData.Starbuys.length,
2873                    responseData.ProductName
2874                );
2875                const pluralThereAreUnappliedMessage = ReplacePlaceholders(
2876                    GetTranslation('JavaScriptTranslations', '24Starbuy-PluralItemsWithThisItem'),
2877                    responseData.Starbuys.length,
2878                    responseData.ProductName
2879                );
2880                const starbuyDescriptionContent = responseData.Starbuys.length > 1 ? pluralThereAreUnappliedMessage : singularThereAreUnappliedMessage;
2881
2882                for (const starbuyOffer of responseData.Starbuys) {
2883                    starbuyContent.push(getStarbuyElement(starbuyOffer));
2884                }
2885
2886                starbuyDrawer = getStarbuyDrawer(1, starbuyHeaderContent, starbuyDescriptionContent, starbuyContent);
2887                document.body.appendChild(starbuyDrawer);
2888
2889                addOrUpdateQueryParam(starbuyProductIdQueryParam, productId);
2890            }
2891        },
2892        () => {
2893            setTimeout(() => {
2894                if (starbuyDrawer) {
2895                    starbuyDrawer.dataset.state = 'open';
2896                }
2897            }, 150);
2898        }
2899    );
2900}
2901
2902function loadStarbuyDrawerTwo(starbuyId) {
2903    const starbuySpinnerId = `spinner-loadStarbuyDrawerTwo-${starbuyId}`;
2904    if (!StatefulLoaderPresent(starbuySpinnerId)) {
2905        AddStatefulLoadingSpinnerGlobal(starbuySpinnerId);
2906        ToggleLoadingSpinnerByName(starbuySpinnerId, true);
2907    }
2908
2909    let starbuyDrawer;
2910    getStarbuy(
2911        starbuyId,
2912        true,
2913        (data) => {
2914            const responseData = data.d;
2915            let starbuyContent = [];
2916
2917            const starbuyHeaderContent = responseData.PromotionText;
2918
2919            const singularWhenYouShopFromMessage = ReplacePlaceholders(
2920                GetTranslation('JavaScriptTranslations', '24Starbuy-WhenYouBuyThisItemTodayX0ItemName'),
2921                responseData.SourceName.trim()
2922            );
2923            const pluralWhenYouShopFromMessage = ReplacePlaceholders(
2924                GetTranslation('JavaScriptTranslations', '24Starbuy-WhenYouBuyThisItemTodayX0FacetName'),
2925                responseData.SourceName.trim()
2926            );
2927            const isSingleProductOffer = responseData.TargetProduct > 0;
2928            const starbuyDescriptionContent = isSingleProductOffer ? singularWhenYouShopFromMessage : pluralWhenYouShopFromMessage;
2929
2930            if (responseData.ItemsInOffer.length > 0) {
2931                if (isSingleProductOffer || responseData.ItemsInOffer.length == 1) {
2932                    /* Show item presentation */
2933                    starbuyContent.push(getViewAllOffersBackButton());
2934                    starbuyContent.push(getStarbuySingleProduct(responseData));
2935                }
2936                else {
2937                    starbuyContent.push(getStarbuyMultipleProducts(responseData));
2938                }
2939            }
2940
2941            starbuyDrawer = getStarbuyDrawer(2, starbuyHeaderContent, starbuyDescriptionContent, starbuyContent);
2942            document.body.appendChild(starbuyDrawer);
2943
2944            if (isSingleProductOffer || (responseData.ItemsInOffer.length == 1 && !responseData.ItemsInOffer[0].ProductUrl.includes('/builder/'))) {
2945                const addToBasketSelector = '.starbuy-drawer-addtobasket';
2946                waitForElement(addToBasketSelector)
2947                    .then(() => {
2948                        LoadAddToBasket($(addToBasketSelector), responseData.ItemsInOffer[0].ProductId);
2949                    });
2950            }
2951
2952            ToggleLoadingSpinnerByName(starbuySpinnerId, false);
2953
2954            addOrUpdateQueryParam(starbuyPromoIdQueryParam, starbuyId);
2955        },
2956        () => {
2957            setTimeout(() => { starbuyDrawer.dataset.state = 'open'; }, 150);
2958        }
2959    );
2960}
2961
2962/**** MARK-UP RETRIEVAL ***************************************************************************/
2963
2964function getStarbuyMultipleProducts(starbuy) {
2965    const multipleItemWrapper = document.createElement('div');
2966    multipleItemWrapper.classList.add('starbuy-drawer-multi-products');
2967
2968    const viewAllOffersButton = getViewAllOffersBackButton();
2969    const viewAllOffersButtonBottom = getViewAllOffersBackButton();
2970
2971    const viewAllApplicableProductsText = GetTranslation('JavaScriptTranslations', '24Starbuy-ViewAllApplicableProducts');
2972    const multipleItemViewProducts = document.createElement('a');
2973    multipleItemViewProducts.classList.add('starbuy-drawer-viewproduct', 'starbuy-drawer-viewproducttarget');
2974    multipleItemViewProducts.innerHTML = `${viewAllApplicableProductsText} <span class="fa icon icon-arrow-right"></span>`;
2975    multipleItemViewProducts.href = `${starbuy.TargetUrl}?fafStarbuyId=${starbuy.StarbuyId}`;
2976
2977    const multipleItemGrid = document.createElement('div');
2978    multipleItemGrid.classList.add('starbuy-drawer-multi-products-items');
2979
2980    const starBuyTopButtons = document.createElement('div');
2981    starBuyTopButtons.classList.add('starbuy-drawer-top-buttons');
2982    starBuyTopButtons.appendChild(viewAllOffersButton);
2983    starBuyTopButtons.appendChild(multipleItemViewProducts);
2984    multipleItemWrapper.appendChild(starBuyTopButtons);
2985
2986
2987    for (const itemInOffer of starbuy.ItemsInOffer) {
2988        const itemInOfferEl = document.createElement('div');
2989        itemInOfferEl.classList.add('starbuy-drawer-multi-products-items---item');
2990
2991        const singleProductImage = `
2992        <div class="col-1 css-image-320 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=400&amp;height=400&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
2993        <div class="col-1 css-image-414 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=800&amp;height=800&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
2994        <div class="col-1 css-image-767 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1000&amp;height=1000&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
2995        <div class="col-1 css-image-1024 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1000&amp;height=1000&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
2996        <div class="col-1 css-image-1440 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1400&amp;height=1400&amp;quality=85&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
2997        <div class="col-1 css-image-1800 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1800&amp;height=1800&amp;quality=85&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
2998        <div class="col-1 css-image-4k bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1998&amp;height=1998&amp;quality=85&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>`
2999
3000        const viewProductLinkText = !itemInOffer.ProductUrl.toLowerCase().includes('/builder/') ? GetTranslation('JavaScriptTranslations', '24Starbuy-CheckAvailability') : GetTranslation('JavaScriptTranslations', '24Starbuy-Customise');
3001        const beforeStarbuyPriceMessage = ReplacePlaceholders(
3002            GetTranslation('JavaScriptTranslations', '24Starbuy-WasPriceX0Price'),
3003            itemInOffer.Price
3004        );
3005
3006        itemInOfferEl.innerHTML = `
3007            <div class="starbuy-drawer-single-product-info">
3008                <a href="${itemInOffer.ProductUrl}" class="starbuy-drawer-single-product-info---image">${singleProductImage}</a>
3009                <div class="starbuy-drawer-single-product-info---name">${itemInOffer.Name}</div>
3010                <div class="starbuy-drawer-single-product-info---price">
3011                    <div class="starbuy-drawer-single-product-info---price-afterstarbuy">${itemInOffer.PriceWithStarbuyDiscount}</div>
3012                    <div class="starbuy-drawer-single-product-info---price-beforestarbuy">${beforeStarbuyPriceMessage}</div>
3013                </div>
3014                <div class="starbuy-drawer-viewproduct starbuy-drawer-viewproductquicklook" onclick="loadQuickLookByProductId(${itemInOffer.ProductId}, '${itemInOffer.PriceWithStarbuyDiscount}')">${viewProductLinkText}</div>
3015            </div>`
3016
3017        multipleItemGrid.appendChild(itemInOfferEl);
3018    }
3019
3020    multipleItemWrapper.appendChild(multipleItemGrid);
3021
3022    const starBuyBottomButtons = document.createElement('div');
3023    starBuyBottomButtons.classList.add('starbuy-drawer-bottom-buttons');
3024    starBuyBottomButtons.appendChild(viewAllOffersButtonBottom);
3025    starBuyBottomButtons.appendChild(multipleItemViewProducts.cloneNode(true));
3026    multipleItemWrapper.appendChild(starBuyBottomButtons);
3027
3028    return multipleItemWrapper;
3029}
3030
3031function getStarbuySingleProduct(starbuy) {
3032    const itemInOffer = starbuy.ItemsInOffer[0];
3033
3034    const starbuyDrawerOfferItemElement = document.createElement('div');
3035    starbuyDrawerOfferItemElement.classList.add('starbuy-drawer-single-product');
3036
3037    const singleProductImage = `
3038        <div class="col-1 css-image-320 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=572&amp;height=572&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3039        <div class="col-1 css-image-414 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1408&amp;height=1408&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3040        <div class="col-1 css-image-767 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1408&amp;height=1408&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3041        <div class="col-1 css-image-1024 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1408&amp;height=1408&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3042        <div class="col-1 css-image-1440 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1094&amp;height=1094&amp;quality=85&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3043        <div class="col-1 css-image-1800 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1465&amp;height=1465&amp;quality=85&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3044        <div class="col-1 css-image-4k bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1998&amp;height=1998&amp;quality=85&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>`
3045
3046    const beforeStarbuyPriceMessage = ReplacePlaceholders(
3047        GetTranslation('JavaScriptTranslations', '24Starbuy-WasPriceX0Price'),
3048        itemInOffer.Price
3049    );
3050
3051    const starbuyPriceExplainerMessage = ReplacePlaceholders(
3052        GetTranslation('JavaScriptTranslations', '24Starbuy-PriceExplainerX0Price'),
3053        itemInOffer.PriceWithStarbuyDiscount
3054    );
3055
3056    const productLinkMessage = !itemInOffer.ProductUrl.toLowerCase().includes('/builder/') ? GetTranslation('JavaScriptTranslations', 'FAFClientScripts-ProductLinkDefault') : GetTranslation('JavaScriptTranslations', '24Starbuy-Customise');
3057    const addbasketHtml = !itemInOffer.ProductUrl.toLowerCase().includes('/builder/') ? '<div class="starbuy-drawer-addtobasket"></div>' : '';
3058
3059    const salePriceTranslated = ReplacePlaceholders(
3060        GetTranslation('JavaScriptTranslations', '24Starbuy-SingleItem-FromX0Price'),
3061        itemInOffer.PriceWithStarbuyDiscount
3062    );
3063
3064    starbuyDrawerOfferItemElement.innerHTML = `
3065        <div class="starbuy-drawer-single-product-info">
3066            <a href="${itemInOffer.ProductUrl}" class="starbuy-drawer-single-product-info---image">${singleProductImage}</a>
3067            <div class="starbuy-drawer-single-product-info---name">${itemInOffer.Name}</div>
3068            <div class="starbuy-drawer-single-product-info---price">
3069                <div class="starbuy-drawer-single-product-info---price-afterstarbuy">${salePriceTranslated}</div>
3070                <div class="starbuy-drawer-single-product-info---price-beforestarbuy">${beforeStarbuyPriceMessage}</div>
3071                <div class="starbuy-drawer-single-product-info---price-explainer">${starbuyPriceExplainerMessage}</div>
3072            </div>
3073            ${addbasketHtml}
3074            <a class="starbuy-drawer-viewproduct" href="${itemInOffer.ProductUrl}">${productLinkMessage}</a>
3075        </div>
3076    `;
3077
3078    return starbuyDrawerOfferItemElement;
3079}
3080
3081function getViewAllOffersBackButton() {
3082    const viewAllApplicableOffersText = GetTranslation('JavaScriptTranslations', '24Starbuys-ViewAllOffers');
3083
3084    const viewAllOffersButton = document.createElement('div');
3085    viewAllOffersButton.classList.add('starbuy-drawer-viewalloffers-backbutton');
3086    viewAllOffersButton.innerHTML = `<span class="fa icon icon-arrow-left"></span> ${viewAllApplicableOffersText}`;
3087    viewAllOffersButton.onclick = () => { findAndCloseStarbuyDrawer(2); };
3088
3089    return viewAllOffersButton;
3090}
3091
3092function getStarbuyElement(starbuy, offerIsAppliedinCart = false, showStarbuyPrefix = false) {
3093    const starbuyDrawerOfferListElement = document.createElement('div');
3094    starbuyDrawerOfferListElement.classList.add('starbuy-list-element');
3095    starbuyDrawerOfferListElement.dataset.starbuyid = starbuy.StarbuyId;
3096    starbuyDrawerOfferL
3096istElement.dataset.applied = offerIsAppliedinCart;
3097    starbuyDrawerOfferListElement.onclick = () => { loadStarbuyDrawerTwo(starbuy.StarbuyId); };
3098
3099    const starbuysTerm = GetTranslation('JavaScriptTranslations', '24Starbuys-StarbuyTerm');
3100
3101    let prefixHtml = '';
3102    if (showStarbuyPrefix) {
3103        prefixHtml = `<div><span class="starbuy-list-element-prefix">${starbuysTerm}</span></div>`;
3104    }
3105
3106    if (offerIsAppliedinCart) {
3107        starbuyDrawerOfferListElement.innerHTML = `
3108            ${prefixHtml}<div>${starbuy.PromotionText}<span class="starbuy-list-element-check"></span></div>
3109        `;
3110    }
3111    else {
3112        starbuyDrawerOfferListElement.innerHTML = `
3113            ${prefixHtml}<div>${starbuy.PromotionText}<span class="starbuy-list-element-arrow"></span></div>
3114        `;
3115    }
3116
3117    return starbuyDrawerOfferListElement;
3118}
3119
3120function getStarbuyDrawer(drawerNumber, headerTitle, headerDescription, starbuyContent) {
3121    const starbuyDrawerElement = document.createElement('div');
3122    starbuyDrawerElement.classList.add('starbuy-drawer');
3123    starbuyDrawerElement.dataset.state = 'closed';
3124    starbuyDrawerElement.dataset.drawerNumber = drawerNumber;
3125    starbuyDrawerElement.onclick = closeStarbuyDrawerOverlay;
3126
3127    const starbuyDrawerInnerElement = document.createElement('div');
3128    starbuyDrawerInnerElement.classList.add('starbuy-drawer-inner');
3129
3130    const starbuyDrawerCloseElement = document.createElement('div');
3131    starbuyDrawerCloseElement.classList.add('starbuy-drawer-close');
3132    starbuyDrawerCloseElement.onclick = closeStarbuyDrawerCloseButton;
3133
3134    const starbuyDrawerBottomCloseElement = document.createElement('div');
3135    starbuyDrawerBottomCloseElement.classList.add('starbuy-drawer-close-inner');
3136    starbuyDrawerBottomCloseElement.innerHTML = `<span class="fa icon-cross"></span> ${GetTranslation('JavaScriptTranslations', 'DevJsCloseButton')}`;
3137    starbuyDrawerBottomCloseElement.onclick = () => { findAndCloseStarbuyDrawer(1); };
3138
3139    const starbuyDrawerPromoElement = document.createElement('div');
3140    starbuyDrawerPromoElement.classList.add('starbuy-drawer-promotion');
3141
3142    const starbuyPromoHeaderContent = getStarbuyDrawerHeaderContent(headerTitle, headerDescription);
3143
3144    starbuyDrawerPromoElement.appendChild(starbuyPromoHeaderContent);
3145    if (starbuyContent?.length) {
3146        for (const starbuyContentEl of starbuyContent) {
3147            starbuyDrawerPromoElement.appendChild(starbuyContentEl);
3148        }
3149    }
3150    else {
3151        const placeholderElement = document.createElement('div');
3152
3153        placeholderElement.innerText = GetTranslation('JavaScriptTranslations', '24Starbuy-NoItemsForStarbuy');
3154
3155        starbuyDrawerPromoElement.appendChild(placeholderElement);
3156    }
3157
3158    starbuyDrawerInnerElement.appendChild(starbuyDrawerCloseElement);
3159    starbuyDrawerInnerElement.appendChild(starbuyDrawerPromoElement);
3160
3161    if(drawerNumber === 1) {
3162        starbuyDrawerPromoElement.appendChild(starbuyDrawerBottomCloseElement);
3163    }
3164
3165    starbuyDrawerElement.appendChild(starbuyDrawerInnerElement);
3166
3167    return starbuyDrawerElement;
3168}
3169
3170function getStarbuyDrawerHeaderContent(headerTitle, headerDescription) {
3171    const starbuysTerm = GetTranslation('JavaScriptTranslations', '24Starbuys-StarbuyTerm');
3172
3173    const starbuyPromoHeaderContent = document.createElement('div');
3174    starbuyPromoHeaderContent.classList.add('starbuy-drawer-promo-header');
3175
3176    const starbuyPromoHeaderContentTitle = document.createElement('div');
3177    starbuyPromoHeaderContentTitle.classList.add('starbuy-drawer-promo-header-title');
3178    starbuyPromoHeaderContentTitle.innerHTML = `<span></span> ${starbuysTerm}`;
3179
3180    const starbuyPromoHeaderContentDesc = document.createElement('div');
3181    starbuyPromoHeaderContentDesc.classList.add('starbuy-drawer-promo-header-description');
3182
3183    const starbuyPromoHeaderContentDescTop = document.createElement('div');
3184    starbuyPromoHeaderContentDescTop.classList.add('starbuy-drawer-promo-header-description-top');
3185    starbuyPromoHeaderContentDescTop.innerText = headerTitle;
3186
3187    const starbuyPromoHeaderContentDescBottom = document.createElement('div');
3188    starbuyPromoHeaderContentDescBottom.classList.add('starbuy-drawer-promo-header-description-bottom');
3189    starbuyPromoHeaderContentDescBottom.innerHTML = headerDescription;
3190
3191    const starbuyPromoHeaderDivider = document.createElement('div');
3192    starbuyPromoHeaderDivider.classList.add('starbuy-drawer-divider');
3193
3194    starbuyPromoHeaderContentDesc.appendChild(starbuyPromoHeaderContentDescTop);
3195    starbuyPromoHeaderContentDesc.appendChild(starbuyPromoHeaderContentDescBottom);
3196
3197    starbuyPromoHeaderContent.appendChild(starbuyPromoHeaderContentTitle);
3198    starbuyPromoHeaderContent.appendChild(starbuyPromoHeaderContentDesc);
3199    starbuyPromoHeaderContent.appendChild(starbuyPromoHeaderDivider);
3200
3201    return starbuyPromoHeaderContent;
3202}
3203
3204function getUnappliedStarbuyInCartText(unappliedStarbuyCount) {
3205    const singularThereAreUnappliedMessage = ReplacePlaceholders(
3206        GetTranslation('JavaScriptTranslations', '24Starbuys-SingularThereAreStarbuyOffersInYourCartX0NumberOfOffers'),
3207        unappliedStarbuyCount
3208    );
3209    const pluralThereAreUnappliedMessage = ReplacePlaceholders(
3210        GetTranslation('JavaScriptTranslations', '24Starbuys-PluralThereAreStarbuyOffersInYourCartX0NumberOfOffers'),
3211        unappliedStarbuyCount
3212    );
3213    const unappliedStarbuyDescription = unappliedStarbuyCount > 0 ? (unappliedStarbuyCount > 1 ? `${pluralThereAreUnappliedMessage} ` : `${singularThereAreUnappliedMessage} `) : '';
3214    return unappliedStarbuyDescription;
3215}
3216
3217/* Functionality */
3218
3219function closeStarbuyDrawer(drawerElement) {
3220    if (drawerElement && drawerElement.classList.contains('starbuy-drawer')) {
3221        drawerElement.dataset.state = 'closed';
3222
3223        const drawerNumber = drawerElement.dataset.drawerNumber;
3224
3225        setTimeout(() => {
3226            drawerElement.remove();
3227        }, 150);
3228
3229        const isDrawerOne = drawerNumber.toString() == '1';
3230        addOrUpdateQueryParam(isDrawerOne ? starbuyProductIdQueryParam : starbuyPromoIdQueryParam, '');
3231    }
3232}
3233
3234function closeStarbuyDrawerCloseButton(event) {
3235    const drawerElement = event.target?.parentElement?.parentElement;
3236
3237    closeStarbuyDrawer(drawerElement);
3238}
3239
3240function closeStarbuyDrawerOverlay(event) {
3241    const drawerElement = event.target;
3242
3243    closeStarbuyDrawer(drawerElement);
3244}
3245
3246function findAndCloseStarbuyDrawer(drawerNumber) {
3247    const drawerElement = document.querySelector(`.starbuy-drawer[data-drawer-number="${drawerNumber}"]`);
3248
3249    if (drawerElement) {
3250        closeStarbuyDrawer(drawerElement);
3251    }
3252}
3253
3254/**** API CALLS ***************************************************************************/
3255
3256function getStarbuy(starbuyId, withItems, callback, finallyCallback = () => {}) {
3257    const fetchData = { starbuyId: starbuyId, withItems: withItems };
3258
3259    fetchClient('/wsCitrusStore.asmx/GetStarbuysByStarBuyId', 'POST', fetchData)
3260        .then(
3261            callback, /* resolved */
3262            (err) => {
3263                starbuyError(err, null, starbuyId)
3264            } /* rejected */
3265        )
3266        .catch((err) => {
3267            starbuyError(err, null, starbuyId)
3268        })
3269        .finally(finallyCallback);
3270}
3271
3272function getStarbuysByCart(withItems, callback, finallyCallback = () => { }) {
3273    const fetchData = { withItems: withItems };
3274
3275    fetchClient('/wsCitrusStore.asmx/GetStarbuysByCart', 'POST', fetchData)
3276        .then(
3277            callback, /* resolved */
3278            (err) => {
3279                starbuyError(err, null, null)
3280            } /* rejected */
3281        )
3282        .catch((err) => {
3283            starbuyError(err, null, null)
3284        })
3285        .finally(finallyCallback);
3286}
3287
3288function getStarbuysByProduct(productId, withItems, callback, finallyCallback = () => { }) {
3289    const fetchData = { productId: productId, withItems: withItems };
3290
3291    fetchClient('/wsCitrusStore.asmx/GetStarbuysByProductId', 'POST', fetchData)
3292        .then(
3293            callback, /* resolved */
3294            (err) => {
3295                starbuyError(err, productId, null)
3296            } /* rejected */
3297        )
3298        .catch((err) => {
3299            starbuyError(err, productId, null)
3300        })
3301        .finally(finallyCallback);
3302}
3303
3304function starbuyError(err, productId, starbuyId) {
3305    if (isBot())
3306    {
3307        // We don't want to log errors from bot traffic
3308        return;
3309    }
3310
3311    let extraText = 'starbuyError: ';
3312
3313    if (productId) {
3314        extraText += `Product ID = ${productId}, `;
3315    }
3316
3317    if (starbuyId) {
3318        extraText += `Starbuy ID = ${starbuyId}, `;
3319    }
3320
3321    ErrorLogger(err, `${extraText} Called from '${window.location.href}'`, 'error');
3322}
3323function fetchClient(url, method, requestBody) {
3324    method = method.toUpperCase();
3325
3326    const methodsWithBodies = ['PUT', 'POST'];
3327    const allowedMethods = [...methodsWithBodies, 'GET', 'DELETE'];
3328    if (!allowedMethods.includes(method)) {
3329        throw `The method must be one of "${allowedMethods.join(', ')}. The provided value is: ${method}"`;
3330    }
3331
3332    return new Promise((resolve, reject) => {
3333        fetch(url, getFetchClientConfig(methodsWithBodies, method, requestBody))
3334            .then(response => response.json())
3335            .then(data => {
3336                resolve(data);
3337            })
3338            .catch(error => {
3339                reject(error);
3340            });
3341    });
3342}
3343
3344function getFetchClientConfig(methodsWithBodies, method, requestBody) {
3345    const clientConfig = {
3346        method: method,
3347        headers: {
3348            'Content-Type': 'application/json',
3349        }
3350    };
3351
3352    if (methodsWithBodies.includes(method)) {
3353        clientConfig.body = JSON.stringify(requestBody);
3354    }
3355
3356    return clientConfig;
3357}
3358function loadQuickLookByProductId(productId, newStarbuyPrice = '') {
3359    if (!isQuicklookOpen()) {
3360        const fetchData = { productId: productId };
3361
3362        fetchClient('/wsCitrusStore.asmx/GetQuickviewItem', 'POST', fetchData)
3363            .then(
3364                (response) => {
3365                    const data = response.d;
3366                    const starbuyPriceCalculated = typeof (newStarbuyPrice) == 'string' && newStarbuyPrice.trim().length > 0 ? newStarbuyPrice : '';
3367                    loadQuickLookUi(data.Name, data.MainImage, [], data.ProductId, data.Price, data.WasPrice, starbuyPriceCalculated, data.ProductUrl, data.ClickAndCollectOnly);
3368                }, /* resolved */
3369                (err) => {
3370                    ErrorLogger(err, `Product ID = ${productId}, called from '${window.location.href}'`, 'error');
3371                } /* rejected */
3372            )
3373            .catch((err) => {
3374                ErrorLogger(err, `Product ID = ${productId}, called from '${window.location.href}'`, 'error');
3375            });
3376    }
3377    else {
3378        ErrorLogger('quicklook called whilst already open.', `Product ID = ${productId}, called from '${window.location.href}'`, 'warning');
3379    }
3380}
3381
3382function loadQuickLookUi(name, mainImage, extraImages, id, price, wasPrice, starbuyPrice, url, clickAndCollectOnly) {
3383    if (!isQuicklookOpen()) {
3384        const isCustomBuilderItem = url.toLowerCase().includes('/builder/');
3385
3386        const quickLookElement = buildQuickLookElement(name, mainImage, extraImages, id, price, wasPrice, starbuyPrice, url, isCustomBuilderItem);
3387
3388        if (clickAndCollectOnly) {
3389            quickLookElement.setAttribute("data-hidecc-message", true);
3390        }
3391
3392        document.body.appendChild(quickLookElement);
3393        LoadAddToBasket($(`.quicklookitem-inner-right---addtobasket[data-productid="${id}"]`), id);
3394
3395        setTimeout(() => {
3396            /* set quicklook visible state to enable css transitions */
3397            quickLookElement.dataset.state = 'open';
3398        }, 50);
3399    }
3400    else {
3401        ErrorLogger('quicklook called whilst already open.', `Product ID = ${id}, called from '${window.location.href}'`, 'warning');
3402    }
3403}
3404
3405function quicklookClose(event) {
3406    const quickLookElement = event.target.parentElement.parentElement;
3407
3408    quicklookSetStateAsClosedAndRemove(quickLookElement);
3409}
3410
3411function quickLookFindAndClose() {
3412    const quickLookElement = document.querySelector('.quicklookitem-wrapper');
3413
3414    if (quickLookElement) {
3415        quicklookSetStateAsClosedAndRemove(quickLookElement);
3416    }
3417}
3418
3419function quicklookSetStateAsClosedAndRemove(quickLookElement) {
3420    quickLookElement.dataset.state = 'closed';
3421
3422    setTimeout(() => {
3423        quickLookElement.remove();
3424    }, 50);
3425}
3426
3427
3428function isQuicklookOpen() {
3429    return document.querySelectorAll('.quicklookitem-wrapper').length > 0;
3430}
3431
3432function buildQuickLookElement(name, mainImage, extraImages, id, price, wasPrice, starbuyPrice, url, isCustomBuilderItem) {
3433    const quickLookWrapper = document.createElement('div');
3434    quickLookWrapper.classList.add('quicklookitem-wrapper');
3435    quickLookWrapper.dataset.state = 'closed';
3436
3437    const quickLookInner = document.createElement('div');
3438    quickLookInner.classList.add('quicklookitem-inner');
3439    quickLookInner.appendChild(getQuickLookCloseButtonElement());
3440    quickLookInner.appendChild(getQuickLookLeftSectionElement(mainImage, extraImages));
3441    quickLookInner.appendChild(getQuickLookRightSectionElement(name, id, price, wasPrice, starbuyPrice, url, isCustomBuilderItem));
3442
3443    quickLookWrapper.appendChild(quickLookInner);
3444
3445    return quickLookWrapper;
3446}
3447
3448function getQuickLookRightSectionElement(name, id, price, wasPrice, starbuyPrice, url, isCustomBuilderItem) {
3449    const element = document.createElement('div');
3450    element.classList.add('quicklookitem-inner-right');
3451
3452    let leadInElHtml = '';
3453    let priceHtml = '';
3454    let starbuyPriceExplainer = '';
3455
3456    if (starbuyPrice) {
3457        element.dataset.isstarbuy = 'true';
3458        const starbuysTerm = GetTranslation('JavaScriptTranslations', '24Starbuys-StarbuyTerm');
3459        leadInElHtml = `<div class="lead-in-header-starbuys"><span class="fa icon icon-star"></span> ${starbuysTerm}</div>`;
3460        priceHtml += `<div class="quicklookitem-inner-right---prices-starbuy">${starbuyPrice}</div>`;
3461
3462        const starbuyPriceExplainerMessage = ReplacePlaceholders(
3463            GetTranslation('JavaScriptTranslations', '24Starbuy-PriceExplainerX0Price'),
3464            starbuyPrice
3465        );
3466
3467        starbuyPriceExplainer = `<div class="quicklookitem-inner-right---prices-starbuy-explainer">${starbuyPriceExplainerMessage}</div>`;
3468    }
3469
3470
3471    const priceAsWasValue = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '24Starbuy-WasPriceX0Price'), price);
3472    const priceValue = starbuyPrice ? priceAsWasValue : price;
3473    priceHtml += `<div class="quicklookitem-inner-right---prices-price">${priceValue}</div>`;
3474
3475    if (wasPrice && wasPrice != price && !starbuyPrice) {
3476        const wasPriceValue = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '24Starbuy-WasPriceX0Price'), wasPrice);
3477        priceHtml += `<div class="quicklookitem-inner-right---prices-wasprice">${wasPriceValue}</div>`;
3478    }
3479
3480    const addToBasketArea = isCustomBuilderItem ? '' : `<div class="quicklookitem-inner-right---addtobasket" data-productid="${id}"></div>`;
3481    const productLinkText = isCustomBuilderItem ? GetTranslation('JavaScriptTranslations', 'FAFClientScripts-ProductLinkCustom') : GetTranslation('JavaScriptTranslations', 'FAFClientScripts-ProductLinkDefault');
3482    const productLink = `<a href="${url}" class="quicklookitem-inner-right---link">${productLinkText}</a>`;
3483
3484    element.innerHTML += `
3485        ${leadInElHtml}
3486        <div class="quicklookitem-inner-right---name">${name}</div>
3487        <div class="quicklookitem-inner-right---prices">
3488            ${priceHtml}
3489            ${starbuyPriceExplainer}
3490        </div>
3491        ${addToBasketArea}
3492        <div class="quicklookitem-inner-right---clickcollectnotice">${GetTranslation('JavaScriptTranslations', 'ClickAndCollectViewProductPrompt')}</div>
3493        ${productLink}
3494    `;
3495
3496    return element;
3497}
3498
3499function getQuickLookCloseButtonElement() {
3500    const element = document.createElement('div');
3501
3502    element.classList.add('quicklookitem-close');
3503    element.onclick = quicklookClose;
3504    element.innerHTML = '&#x2715;';
3505
3506    return element;
3507}
3508
3509function getQuickLookLeftSectionElement(imageUrl, imageArray) {
3510    const element = document.createElement('div');
3511    element.classList.add('quicklookitem-inner-left');
3512
3513    const productImageFirst = `
3514        <div class="col-1 css-image-320 bgContain imgCtr" style="background: url('/${imageUrl}?width=400&amp;height=400&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3515        <div class="col-1 css-image-414 bgContain imgCtr" style="background: url('/${imageUrl}?width=800&amp;height=800&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3516        <div class="col-1 css-image-767 bgContain imgCtr" style="background: url('/${imageUrl}?width=1000&amp;height=1000&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3517        <div class="col-1 css-image-1024 bgContain imgCtr" style="background: url('/${imageUrl}?width=1000&amp;height=1000&amp;quality=60&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3518        <div class="col-1 css-image-1440 bgContain imgCtr" style="background: url('/${imageUrl}?width=1400&amp;height=1400&amp;quality=85&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3519        <div class="col-1 css-image-1800 bgContain imgCtr" style="background: url('/${imageUrl}?width=1800&amp;height=1800&amp;quality=85&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>
3520        <div class="col-1 css-image-4k bgContain imgCtr" style="background: url('/${imageUrl}?width=1998&amp;height=1998&amp;quality=85&amp;mode=pad&amp;format=webp&amp;bgcolor=ffffff') no-repeat center center;"></div>`;
3521
3522    element.innerHTML = `<div class="quicklookitem-image">${productImageFirst}</div>`;
3523
3524    return element;
3525}
3526function getCustomerVipStatus(onSuccessCallback, onFailureCallback, finallyCallback) {
3527    fetchClient('/wsCitrusStore.asmx/IsCustomerVIP', 'POST', {})
3528        .then(
3529            onSuccessCallback, /* resolved */
3530            (err) => {
3531                onFailureCallback();
3532                ErrorLogger(err, "Error occurred whilst during the IsCustomerVIP WebService call.");
3533            } /* rejected */
3534        )
3535        .catch((err) => {
3536            onFailureCallback();
3537            ErrorLogger(err, "Error occurred whilst during the IsCustomerVIP WebService call.");
3538        })
3539        .finally(finallyCallback);
3540}
3541/**
3542 * Gets customer rewards card detail.
3543 * @param  onSuccessCallback The on success callback.
3544 * @param  onFailureCallback The on failure callback.
3545 * @param  finallyCallback The finally callback.
3546 * @returns The customer rewards card detail.
3547 */
3548function getCustomerRewardsCardDetail(onSuccessCallback, onFailureCallback, finallyCallback) {
3549    fetchClient('/wsCitrusStore.asmx/GetCustomerRewardsCardDetail', 'POST', {})
3550        .then(
3551            onSuccessCallback, /* resolved */
3552            (err) => {
3553                onFailureCallback();
3554                ErrorLogger(err, "Error occurred whilst during the GetCustomerRewardsCardDetail WebService call.");
3555            } /* rejected */
3556        )
3557        .catch((err) => {
3558            onFailureCallback();
3559            ErrorLogger(err, "Error occurred whilst during the GetCustomerRewardsCardDetail WebService call.");
3560        })
3561        .finally(finallyCallback);
3562}
3563function loadAffirmPromotionalMessaging(affirmConfig, type) {
3564    if (!affirmConfig) {
3565        return;
3566    }
3567
3568    (function (m, g, n, d, a, e, h, c) {
3569        var b = m[n] || {}, k = document.createElement(e), p = document.getElementsByTagName(e)[0], l = function (a, b, c) { return function () { a[b]._.push([c, arguments]) } }; b[d] = l(b, d, "set"); var f = b[d]; b[a] = {}; b[a]._ = []; f._ = []; b._ = []; b[a][h] = l(b, a, h); b[c] = function () { b._.push([h, arguments]) }; a = 0; for (c = "set add save post open empty reset on off trigger ready setProduct".split(" "); a < c.length; a++)f[c[a]] = l(b, d, c[a]); a = 0; for (c = ["get", "token", "url", "items"]; a < c.length; a++)f[c[a]] = function () { }; k.async =
3570            !0; k.src = g[e]; p.parentNode.insertBefore(k, p); delete g[e]; f(g); m[n] = b
3571    })(window, affirmConfig, "affirm", "checkout", "ui", "script", "ready", "jsReady");
3572
3573    if (type === 'product') {
3574        document.addEventListener('attributeSelected', e => {
3575            const price = Number(e.detail.price.replace(/[^0-9*]/g, ''));
3576
3577            const affirmBanner = document.getElementById('affirm-as-low-as');
3578
3579            if (affirmBanner) {
3580                affirmBanner.setAttribute('data-amount', Math.trunc(price));
3581
3582                affirm.ui.refresh();
3583            }
3584        });
3585    }
3586    else if (type === 'cart') {
3587        document.addEventListener('cartupdate', e => {
3588            const price = e.detail.MerchandiseTotal * 100;
3589
3590            const affirmBanner = document.getElementById('affirm-as-low-as');
3591
3592            if (affirmBanner) {
3593                affirmBanner.setAttribute('data-amount', Math.trunc(price));
3594
3595                affirm.ui.refresh();
3596            }
3597        });
3598    }
3599}
3600function isBot() {
3601    const userAgent = navigator.userAgent;
3602
3603    if (!userAgent) {
3604        return false;
3605    }
3606
3607    const knownBotUserAgents = [
3608        'Googlebot',
3609        'Bingbot',
3610        'Slurp',
3611        'DuckDuckBot',
3612        'Baiduspider',
3613        'YandexBot',
3614        'facebookexternalhit',
3615        'twitterbot',
3616        'rogerbot',
3617        'linkedinbot',
3618        'embedly',
3619        'quora link preview',
3620        'showyoubot',
3621        'outbrain',
3622        'pinterest/0.',
3623        'slackbot',
3624        'vkShare',
3625        'W3C_Validator',
3626        'redditbot',
3627        'Applebot',
3628        'WhatsApp',
3629        'flipboard',
3630        'tumblr',
3631        'bitlybot',
3632        'SkypeShell',
3633        'archive.org_bot',
3634        'GenericBot',
3635        'bot',
3636        'spider',
3637        'crawler'
3638    ];
3639
3640    const regExp = new RegExp(knownBotUserAgents.join('|'), 'i');
3641
3642    return regExp.test(userAgent);
3643}
3644(function () {
3645    var backdrop = null;
3646    var panel = null;
3647    var input = null;
3648    var systemPromptPanel = null;
3649    var systemPromptInput = null;
3650    var editSystemPromptBtn = null;
3651    var systemPromptSaveBtn = null;
3652    var systemPromptResetBtn = null;
3653    var systemPromptCloseBtn = null;
3654    var modelFilterInput = null;
3655    var providerSelect = null;
3656    var modelSelect = null;
3657    var resultsContainer = null;
3658    var loadingEl = null;
3659    var emptyEl = null;
3660    var errorEl = null;
3661    var isOpen = false;
3662    var isSystemPromptOpen = false;
3663    var activeIndex = -1;
3664    var currentResults = [];
3665    var awaitingM = false;
3666    var resetTimer = null;
3667    var allModels = [];
3668    var modelsFetched = false;
3669
3670    var MODEL_SESSION_KEY = 'citrusllm_model';
3671    var SP_SESSION_KEY = 'citrusllm_systemprompt';
3672    var SP_LOCAL_KEY = 'citrusllm_systemprompt';
3673
3674    function getElements() {
3675        backdrop = document.getElementById('aiRecCmdPaletteBackdrop');
3676        panel = document.getElementById('aiRecCmdPalettePanel');
3677        input = document.getElementById('cmdPaletteInput');
3678        systemPromptPanel = document.getElementById('cmdPaletteSystemPromptPanel');
3679        systemPromptInput = document.getElementById('cmdPaletteSystemPromptInput');
3680        editSystemPromptBtn = document.getElementById('cmdPaletteEditSystemPrompt');
3681        systemPromptSaveBtn = document.getElementById('cmdPaletteSystemPromptSave');
3682        systemPromptResetBtn = document.getElementById('cmdPaletteSystemPromptReset');
3683        systemPromptCloseBtn = document.getElementById('cmdPaletteSystemPromptClose');
3684        modelFilterInput = document.getElementById('cmdPaletteModelFilter');
3685        providerSelect = document.getElementById('cmdPaletteProviderFilter');
3686        modelSelect = document.getElementById('cmdPaletteModelSelect');
3687        resultsContainer = document.getElementById('cmdPaletteResults');
3688        loadingEl = document.getElementById('cmdPaletteLoading');
3689        emptyEl = document.getElementById('cmdPaletteEmpty');
3690        errorEl = document.getElementById('cmdPaletteError');
3691        return !!(backdrop && panel && input);
3692    }
3693
3694    function populateModelSelect(models) {
3695        if (!modelSelect) return;
3696        while (modelSelect.options.length > 0) modelSelect.remove(0);
3697        var defaultOpt = document.createElement('option');
3698        defaultOpt.value = '';
3699        defaultOpt.text = 'Server default';
3700        modelSelect.add(defaultOpt);
3701        for (var i = 0; i < models.length; i++) {
3702            var opt = document.createElement('option');
3703            opt.value = models[i].Id;
3704            opt.text = models[i].Name + ' (' + models[i].Id + ')';
3705            modelSelect.add(opt);
3706        }
3707    }
3708
3709    function populateProviderSelect() {
3710        if (!providerSelect) return;
3711        var providers = [];
3712        for (var i = 0; i < allModels.length; i++) {
3713            var parts = allModels[i].Id.split('/');
3714            var provider = parts.length > 1 ? parts[0] : null;
3715            if (provider && providers.indexOf(provider) === -1) {
3716                providers.push(provider);
3717            }
3718        }
3719        providers.sort();
3720        while (providerSelect.options.length > 0) providerSelect.remove(0);
3721        var defaultOpt = document.createElement('option');
3722        defaultOpt.value = '';
3723        defaultOpt.text = 'All providers';
3724        providerSelect.add(defaultOpt);
3725        for (var i = 0; i < providers.length; i++) {
3726            var opt = document.createElement('option');
3727            opt.value = providers[i];
3728            opt.text = providers[i];
3729            providerSelect.add(opt);
3730        }
3731    }
3732
3733    function filterModels() {
3734        if (!modelSelect) return;
3735        var textFilter = modelFilterInput ? modelFilterInput.value.toLowerCase().trim() : '';
3736        var provider = providerSelect ? providerSelect.value : '';
3737        var selectedValue = modelSelect.value;
3738        var filtered = allModels.filter(function (m) {
3739            var matchesText = !textFilter ||
3740                m.Id.toLowerCase().indexOf(textFilter) !== -1 ||
3741                m.Name.toLowerCase().indexOf(textFilter) !== -1;
3742            var matchesProvider = !provider || m.Id.split('/')[0] === provider;
3743            return matchesText && matchesProvider;
3744        });
3745        populateModelSelect(filtered);
3746        modelSelect.value = selectedValue;
3747    }
3748
3749    function restoreModelSelection() {
3750        if (!modelSelect) return;
3751        var saved = sessionStorage.getItem(MODEL_SESSION_KEY);
3752        if (saved) {
3753            modelSelect.value = saved;
3754        }
3755    }
3756
3757    function fetchModels() {
3758        if (modelsFetched) {
3759            restoreModelSelection();
3760            return;
3761        }
3762        $.ajax({
3763            type: 'POST',
3764            url: '/wsCitrusStore.asmx/GetRecommendationModels',
3765            data: '{}',
3766            contentType: 'application/json; charset=utf-8',
3767            dataType: 'json',
3768            success: function (data) {
3769                allModels = data.d || [];
3770                modelsFetched = true;
3771                populateProviderSelect();
3772                populateModelSelect(allModels);
3773                restoreModelSelection();
3774            },
3775            error: function () {
3776                // silent — server default applies
3777            }
3778        });
3779    }
3780
3781    function restoreSystemPrompt() {
3782        if (!systemPromptInput) {
3783            return true;
3784        }
3785
3786        const cachedValue = sessionStorage.getItem(SP_SESSION_KEY);
3787
3788        if (cachedValue) {
3789            systemPromptInput.value = cachedValue;
3790
3791            return true;
3792        }
3793
3794        return false;
3795    }
3796
3797
3798    function fetchSystemPrompt() {
3799        if (restoreSystemPrompt()) {
3800            return;
3801        }
3802
3803        $.ajax({
3804            type: 'POST',
3805            url: '/wsCitrusStore.asmx/GetRecommendationDefaultSystemPrompt',
3806            data: '{}',
3807            contentType: 'application/json; charset=utf-8',
3808            dataType: 'json',
3809            success: function (data) {
3810                sessionStorage.setItem(SP_SESSION_KEY, data.d);
3811
3812                restoreSystemPrompt();
3813            },
3814            error: function () {
3815                // silent — server default applies
3816            }
3817        });
3818    }
3819
3820    function openPalette() {
3821        if (!getElements()) return;
3822        isOpen = true;
3823        activeIndex = -1;
3824        currentResults = [];
3825
3826        backdrop.style.display = 'block';
3827        panel.style.display = 'flex';
3828
3829        requestAnimationFrame(function () {
3830            backdrop.classList.add('cmd-palette-visible');
3831            panel.classList.add('cmd-palette-visible');
3832        });
3833
3834        input.value = '';
3835        if (modelFilterInput) modelFilterInput.value = '';
3836        if (providerSelect) providerSelect.value = '';
3837        resultsContainer.innerHTML = '';
3838        loadingEl.style.display = 'none';
3839        emptyEl.style.display = 'none';
3840        errorEl.style.display = 'none';
3841
3842        fetchModels();
3843
3844        setTimeout(function () { input.focus(); }, 50);
3845        document.body.style.overflow = 'hidden';
3846    }
3847
3848    function closePalette() {
3849        if (!getElements() || !isOpen) return;
3850
3851        if (isSystemPromptOpen) {
3852            closeSystemPromptPanel();
3853        }
3854
3855        isOpen = false;
3856        activeIndex = -1;
3857        currentResults = [];
3858
3859        backdrop.classList.remove('cmd-palette-visible');
3860        panel.classList.remove('cmd-palette-visible');
3861
3862        setTimeout(function () {
3863            backdrop.style.display = 'none';
3864            panel.style.display = 'none';
3865        }, 200);
3866
3867        document.body.style.overflow = '';
3868    }
3869
3870    function openSystemPromptPanel() {
3871        if (!systemPromptPanel || !systemPromptInput) return;
3872
3873        var stored = localStorage.getItem(SP_LOCAL_KEY);
3874
3875        if (stored === null) {
3876            fetchSystemPrompt();
3877
3878            localStorage.setItem(SP_LOCAL_KEY, systemPromptInput.value);
3879        } else {
3880            systemPromptInput.value = stored;
3881        }
3882
3883        isSystemPromptOpen = true;
3884        systemPromptPanel.style.display = 'flex';
3885        systemPromptPanel.style.flexDirection = 'column';
3886
3887        requestAnimationFrame(function () {
3888            systemPromptPanel.style.transform = 'translateX(0)';
3889        });
3890    }
3891
3892    function closeSystemPromptPanel() {
3893        if (!systemPromptPanel) return;
3894        isSystemPromptOpen = false;
3895        systemPromptPanel.style.transform = 'translateX(100%)';
3896        setTimeout(function () {
3897            systemPromptPanel.style.display = 'none';
3898        }, 250);
3899    }
3900
3901    function setLoading(show) {
3902        loadingEl.style.display = show ? 'flex' : 'none';
3903        resultsContainer.innerHTML = '';
3904        emptyEl.style.display = 'none';
3905        errorEl.style.display = 'none';
3906    }
3907
3908    function formatPrice(value) {
3909        return parseFloat(value).toFixed(2);
3910    }
3911
3912    function buildPriceHtml(item) {
3913        if (item.IsOnSale && item.SalePrice > 0 && item.SalePrice < item.Price) {
3914            return '<span class="cmd-palette-result-price cmd-palette-result-price-sale">&pound;' +
3915                formatPrice(item.SalePrice) + '</span>' +
3916                '<span class="cmd-palette-result-price-original">&pound;' +
3917                formatPrice(item.Price) + '</span>';
3918        }
3919        return '<span class="cmd-palette-result-price">&pound;' + formatPrice(item.Price) + '</span>';
3920    }
3921
3922    function buildStockHtml(item) {
3923        if (item.InStock) {
3924            return '<div class="cmd-palette-result-stock cmd-palette-result-stock-in">&#9679; In Stock</div>';
3925        }
3926        return '<div class="cmd-palette-result-stock cmd-palette-result-stock-out">&#9675; Out of Stock</div>';
3927    }
3928
3929    function renderResults(items) {
3930        currentResults = items || [];
3931        activeIndex = -1;
3932
3933        if (currentResults.length === 0) {
3934            resultsContainer.innerHTML = '';
3935            emptyEl.style.display = 'block';
3936            return;
3937        }
3938
3939        var html = '';
3940        for (var i = 0; i < currentResults.length; i++) {
3941            var item = currentResults[i];
3942            var imgSrc = item.ImageUrl ? item.ImageUrl : '/layout/productloading.jpg';
3943            html += '<a href="' + (item.ProductUrl || '#') + '" class="cmd-palette-result" data-index="' + i + '">' +
3944                '<img class="cmd-palette-result-img" src="' + imgSrc + '" alt="' + (item.Name || '') + '" />' +
3945                '<div class="cmd-palette-result-info">' +
3946                '<span class="cmd-palette-result-name">' + (item.Name || '') + '</span>' +
3947                '<span class="cmd-palette-result-brand">' + (item.Brand || '') + '</span>' +
3948                '</div>' +
3949                '<div class="cmd-palette-result-meta">' +
3950                buildPriceHtml(item) +
3951                buildStockHtml(item) +
3952                '</div>' +
3953                '</a>';
3954        }
3955        resultsContainer.innerHTML = html;
3956
3957        document.dispatchEvent(new CustomEvent('cmdPalette:resultsRendered', {
3958            detail: { results: currentResults, container: resultsContainer }
3959        }));
3960    }
3961
3962    function setActiveResult(index) {
3963        var items = resultsContainer.querySelectorAll('.cmd-palette-result');
3964        if (items.length === 0) return;
3965
3966        for (var i = 0; i < items.length; i++) {
3967            items[i].classList.remove('cmd-palette-result-active');
3968        }
3969
3970        if (index < 0) index = items.length - 1;
3971        if (index >= items.length) index = 0;
3972        activeIndex = index;
3973
3974        items[activeIndex].classList.add('cmd-palette-result-active');
3975        items[activeIndex].scrollIntoView({ block: 'nearest' });
3976    }
3977
3978    function navigateToActiveResult() {
3979        var items = resultsContainer.querySelectorAll('.cmd-palette-result');
3980        if (activeIndex >= 0 && activeIndex < items.length) {
3981            var href = items[activeIndex].getAttribute('href');
3982            if (href && href !== '#') {
3983                window.location.href = href;
3984            }
3985        }
3986    }
3987
3988    function doSearch() {
3989        if (!getElements()) return;
3990        var query = input.value;
3991        if (!query || !query.trim()) return;
3992
3993        var systemPrompt = localStorage.getItem(SP_LOCAL_KEY) || '';
3994        var model = modelSelect ? modelSelect.value : '';
3995
3996        setLoading(true);
3997
3998        $.ajax({
3999            type: 'POST',
4000            url: '/wsCitrusStore.asmx/GetSearchRecommendations',
4001            data: JSON.stringify({ query: query.trim(), systemPrompt: systemPrompt.trim(), model: model }),
4002            contentType: 'application/json; charset=utf-8',
4003            dataType: 'json',
4004            success: function (data) {
4005                setLoading(false);
4006                renderResults(data.d);
4007            },
4008            error: function (xhr) {
4009                setLoading(false);
4010                var msg = 'An error occurred while searching.';
4011                try {
4012                    var responseJson = JSON.parse(xhr.responseText);
4013                    if (responseJson && responseJson.Message) {
4014                        msg = responseJson.Message;
4015                    }
4016                } catch (ignored) { }
4017                resultsContainer.innerHTML = '';
4018                emptyEl.style.display = 'none';
4019                errorEl.textContent = msg;
4020                errorEl.style.display = 'block';
4021            }
4022        });
4023    }
4024
4025    $(document).on('keydown', function (e) {
4026        if (e.ctrlKey && (e.key === 'c' || e.key === 'C') && !isOpen) {
4027            awaitingM = true;
4028            clearTimeout(resetTimer);
4029            resetTimer = setTimeout(function () { awaitingM = false; }, 2000);
4030            return;
4031        }
4032
4033        if (awaitingM && (e.key === 'm' || e.key === 'M')) {
4034            e.preventDefault();
4035            awaitingM = false;
4036            clearTimeout(resetTimer);
4037            if (isOpen) {
4038                closePalette();
4039            } else {
4040                openPalette();
4041            }
4042            return;
4043        }
4044
4045        if (!isOpen) return;
4046
4047        if (e.key === 'Escape') {
4048            e.preventDefault();
4049            if (isSystemPromptOpen) {
4050                closeSystemPromptPanel();
4051            } else {
4052                closePalette();
4053            }
4054            return;
4055        }
4056
4057        if (isSystemPromptOpen) return;
4058
4059        if (e.key === 'ArrowDown') {
4060            e.preventDefault();
4061            setActiveResult(activeIndex + 1);
4062            return;
4063        }
4064
4065        if (e.key === 'ArrowUp') {
4066            e.preventDefault();
4067            setActiveResult(activeIndex - 1);
4068            return;
4069        }
4070
4071        if (e.key === 'Enter') {
4072            if (activeIndex >= 0) {
4073                e.preventDefault();
4074                navigateToActiveResult();
4075            } else {
4076                e.preventDefault();
4077                doSearch();
4078            }
4079            return;
4080        }
4081    });
4082
4083    $(document).ready(function () {
4084        if (!getElements()) return;
4085
4086        backdrop.addEventListener('click', function () {
4087            closePalette();
4088        });
4089
4090        if (modelSelect) {
4091            modelSelect.addEventListener('change', function () {
4092                sessionStorage.setItem(MODEL_SESSION_KEY, modelSelect.value);
4093            });
4094        }
4095
4096        if (modelFilterInput) {
4097            modelFilterInput.addEventListener('input', filterModels);
4098        }
4099
4100        if (providerSelect) {
4101            providerSelect.addEventListener('change', filterModels);
4102        }
4103
4104        if (editSystemPromptBtn) {
4105            editSystemPromptBtn.addEventListener('click', function () {
4106                openSystemPromptPanel();
4107            });
4108        }
4109
4110        if (systemPromptSaveBtn) {
4111            systemPromptSaveBtn.addEventListener('click', function () {
4112                localStorage.setItem(SP_LOCAL_KEY, systemPromptInput.value);
4113                closeSystemPromptPanel();
4114            });
4115        }
4116
4117        if (systemPromptResetBtn) {
4118            systemPromptResetBtn.addEventListener('click', fetchSystemPrompt);
4119        }
4120
4121        if (systemPromptCloseBtn) {
4122            systemPromptCloseBtn.addEventListener('click', function () {
4123                closeSystemPromptPanel();
4124            });
4125        }
4126    });
4127})();
4128function recommendationsPrevItem() {
4129    const recommendationsItems = document.getElementsByClassName('recommendations-item');
4130
4131    if (recommendationsItems.length === 0) {
4132        return;
4133    }
4134
4135    const recommendationsRepeater = document.getElementsByClassName('recommendations-repeater')[0];
4136
4137    recommendationsRepeater.scrollBy({
4138        left: -recommendationsItems[0].offsetWidth,
4139        behavior: 'smooth'
4140    });
4141}
4142
4143function recommendationsNextItem() {
4144    const recommendationsItems = document.getElementsByClassName('recommendations-item');
4145
4146    if (recommendationsItems.length === 0) {
4147        return;
4148    }
4149
4150    const recommendationsRepeater = document.getElementsByClassName('recommendations-repeater')[0];
4151
4152    recommendationsRepeater.scrollBy({
4153        left: recommendationsItems[0].offsetWidth,
4154        behavior: 'smooth'
4155    });
4156}
4157
4158function recommendationsGoToPage(pageIndex) {
4159    const recommendationsItems = document.getElementsByClassName('recommendations-item');
4160
4161    if (recommendationsItems.length === 0) {
4162        return;
4163    }
4164
4165    const recommendationsRepeater = document.getElementsByClassName('recommendations-repeater')[0];
4166
4167    const pageSize = getPageSize(recommendationsRepeater);
4168    const targetItemIndex = Math.min(pageIndex * pageSize, recommendationsItems.length - 1);
4169    const targetItem = recommendationsItems[targetItemIndex];
4170    const leftPadding = getLeftPadding(recommendationsRepeater);
4171
4172    recommendationsRepeater.scrollTo({
4173        left: targetItem.offsetLeft - leftPadding,
4174        behavior: 'smooth'
4175    });
4176}
4177
4178function updateDisabledStatus(className, status) {
4179    let button = document.getElementsByClassName(className);
4180
4181    if (button.length === 0) {
4182        return;
4183    }
4184
4185    button = button[0];
4186
4187    button.setAttribute('aria-disabled', status);
4188}
4189
4190function atScrollStart(recommendationsRepeater) {
4191    const leftPadding = getLeftPadding(recommendationsRepeater);
4192
4193    return recommendationsRepeater.scrollLeft <= leftPadding;
4194}
4195
4196function atScrollEnd(recommendationsRepeater) {
4197    const leftPadding = getLeftPadding(recommendationsRepeater);
4198
4199    return recommendationsRepeater.scrollLeft + recommendationsRepeater.clientWidth >= recommendationsRepeater.scrollWidth - leftPadding;
4200}
4201
4202function getLeftPadding(element) {
4203    if (!element) {
4204        return 0;
4205    }
4206
4207    return parseFloat(getComputedStyle(element).paddingLeft);
4208}
4209
4210function getCurrentPageIndex(recommendationsRepeater) {
4211    const recommendationsItems = document.getElementsByClassName('recommendations-item');
4212
4213    const leftPadding = getLeftPadding(recommendationsRepeater);
4214    const scrollLeft = recommendationsRepeater.scrollLeft;
4215
4216    let closestIndex = 0;
4217    let closestDistance = Infinity;
4218
4219    for (let i = 0; i < recommendationsItems.length; i++) {
4220        const distance = Math.abs(recommendationsItems[i].offsetLeft - leftPadding - scrollLeft);
4221
4222        if (distance < closestDistance) {
4223            closestDistance = distance;
4224            closestIndex = i;
4225        }
4226    }
4227
4228    const pageSize = getPageSize(recommendationsRepeater);
4229
4230    return Math.floor(closestIndex / pageSize);
4231}
4232
4233function getPageSize(recommendationsRepeater) {
4234    const pageSize = getComputedStyle(recommendationsRepeater)
4235        .getPropertyValue('--recommendations-page-size');
4236
4237    return parseInt(pageSize, 10);
4238}
4239
4240function getTotalPages(recommendationsRepeater) {
4241    const recommendationsItems = document.getElementsByClassName('recommendations-item');
4242    const pageSize = getPageSize(recommendationsRepeater);
4243
4244    return Math.ceil(recommendationsItems.length / pageSize);
4245}
4246
4247function updateRecommendationsState() {
4248    let recommendationsRepeater = document.getElementsByClassName('recommendations-repeater');
4249
4250    if (recommendationsRepeater.length === 0) {
4251        return;
4252    }
4253
4254    recommendationsRepeater = recommendationsRepeater[0];
4255
4256    updateDisabledStatus('recommendations-repeater-prev', atScrollStart(recommendationsRepeater));
4257    updateDisabledStatus('recommendations-repeater-next', atScrollEnd(recommendationsRepeater));
4258
4259    const currentPage = getCurrentPageIndex(recommendationsRepeater);
4260    const dots = document.getElementsByClassName('recommendations-page-dot');
4261
4262    for (let i = 0; i < dots.length; i++) {
4263        dots[i].setAttribute('aria-current', i === currentPage);
4264    }
4265}
4266
4267function buildRecommendationsPageDots() {
4268    let recommendationsRepeater = document.getElementsByClassName('recommendations-repeater');
4269
4270    if (recommendationsRepeater.length === 0) {
4271        return;
4272    }
4273
4274    recommendationsRepeater = recommendationsRepeater[0];
4275
4276    const totalPages = getTotalPages(recommendationsRepeater);
4277    const pageIconsContainer = document.getElementsByClassName('recommendations-page-container')[0];
4278
4279    while (pageIconsContainer.firstChild) {
4280        pageIconsContainer.removeChild(pageIconsContainer.firstChild);
4281    }
4282
4283    if (totalPages <= 1) {
4284        return;
4285    }
4286
4287    for (let i = 0; i < totalPages; i++) {
4288        const dot = document.createElement('div');
4289
4290        dot.className = 'recommendations-page-dot';
4291        dot.setAttribute('aria-current', i === 0);
4292        dot.setAttribute('role', 'button');
4293        dot.dataset.page = i + 1;
4294
4295        dot.addEventListener('click', () => recommendationsGoToPage(i));
4296
4297        pageIconsContainer.appendChild(dot);
4298    }
4299}
4300
4301function initRecommendationsPaging() {
4302    let recommendationsRepeater = document.getElementsByClassName('recommendations-repeater');
4303
4304    if (recommendationsRepeater.length === 0) {
4305        return;
4306    }
4307
4308    recommendationsRepeater = recommendationsRepeater[0];
4309
4310    buildRecommendationsPageDots();
4311    updateRecommendationsState();
4312
4313    recommendationsRepeater.addEventListener('scroll', updateRecommendationsState);
4314
4315    window.addEventListener('resize', () => {
4316        buildRecommendationsPageDots();
4317        updateRecommendationsState();
4318    });
4319}
4320
4321function initRecommendationsAnalytics() {
4322    const items = document.getElementsByClassName('recommendations-item');
4323
4324    for (let i = 0; i < items.length; i++) {
4325        items[i].addEventListener('click', e => {
4326            const ga4Queue = new GoogleAnalyticsEventQueue();
4327
4328            ga4Queue.enqueueEvent([
4329                'select_item',
4330                {
4331                    id: items[i].dataset.productuid,
4332                    name: items[i].dataset.name,
4333                    brand: items[i].dataset.brand,
4334                    'sale_price': items[i].dataset.saleprice,
4335                    price: items[i].dataset.price,
4336                    list: 'recommendations-repeater',
4337                    index: i,
4338                }
4339            ]);
4340        });
4341    }
4342}
4343
4344document.addEventListener('DOMContentLoaded', function () {
4345    initRecommendationsPaging();
4346    initRecommendationsAnalytics();
4347});
4348subheadercfg["active"] = false;
4349
4350document.addEventListener("readystatechange", function ()
4351{
4352    var target = document.getElementsByClassName("Promise");
4353    if (document.readyState === "interactive" && target.length > 0)
4354    {
4355        var promctn = target[0].getElementsByTagName('a');
4356        for (var i = 0; i < promctn.length; i++)
4357        {
4358            if (promctn[i].attributes[0].nodeValue == "display:")
4359            {
4360                subheadercfg["calltoactions"].push({
4361                    "ctaname": promctn[i].textContent,
4362                    "ctalink": promctn[i].attributes[1].nodeValue
4363                });
4364            }
4365        }
4366        ctadefer.resolve(true);
4367    }
4368});
4369
4370function subBannerCallback()
4371{
4372    // Do stuff after the subbanner has been added
4373}
4374(function ($) {
4375    $.fn.visible = function (partial) {
4376
4377        var $t = $(this),
4378            $w = $(window),
4379            viewTop = $w.scrollTop(),
4380            viewBottom = viewTop + ($w.height() * 1.5),
4381            _top = $t.offset().top,
4382            _bottom = _top + $t.height(),
4383            compareTop = partial === true ? _bottom : _top,
4384            compareBottom = partial === true ? _top : _bottom;
4385
4386        return ((compareBottom <= viewBottom) && (compareTop >= viewTop));
4387    };
4388
4389})(jQuery);
4390
4391// NMCQ jQuery Routines
4392
4393/*
4394Declare constants
4395*/
4396
4397var STOCKLOOKUPCLASS = "stock-lookup-DEV";
4398var LOADER = "#loader-DEV";
4399var PRODUCTLANDING = "#product-landing-DEV";
4400var ADVTITLEDEV = ".adv-title-DEV";
4401var MIVLOOKUPCLASS = "clMIV-DEV";
4402var CRUMBSLOOKUPCLASS = "clCrumbs-DEV";
4403var STARBUYCLASSATTR = 'attributes-starbuy-DEV';
4404var CCSTOCKLOOKUPCLASS = 'collectionlocationstockcheck-DEV';
4405var ONEDAYINMILLISECONDS = (24 * 60 * 60 * 1000);
4406
4407var CONTROLFOLDERPATH = '/modules/controls/';
4408
4409var TermAtLoad;
4410
4411/*
4412Review Control Varibles
4413*/
4414
4415var starMax = 5;
4416var reviewHolder;
4417var reviewPreset;
4418var reviewRated;
4419
4420var windowIsFocused = true;
4421var popupWindowHasUnfocusedBefore = false;
4422
4423// Creates a shadow copy of console.log
4424console['_log'] = console.log;
4425
4426// Kill console.log if production environment
4427if (window.location.href.indexOf('.dev.citruslime.com') > -1 || window.location.href.indexOf('localhost') > -1 || window.location.href.indexOf('debugconsole=true') > -1) { }
4428else { console.log = function () { } }
4429
4430// Re-instates console.log from the shadow copy
4431function forcelog() {
4432    console['log'] = console._log;
4433    console.log('Console has been re-enabled');
4434}
4435
4436$(document).ready(function () {
4437    $(window).mouseleave(function () {
4438        setTimeout(function () {
4439            if (!windowIsFocused && !popupWindowHasUnfocusedBefore) {
4440                if (getCookie("unfocusPop") == "" && $('#UnFocusedPopupTrigger').length) {
4441                    $('#UnFocusedPopupTrigger').fancybox().trigger('click');
4442                    setCookie("unfocusPop", "true");
4443                    popupWindowHasUnfocusedBefore = true;
4444                }
4445            }
4446
4447        }, 5000);
4448    });
4449
4450    $(window).focus(function () {
4451        windowIsFocused = true;
4452    }).blur(function () {
4453        windowIsFocused = false;
4454    });
4455});
4456
4457function GetTranslation(resourceDictionary, resourceKey) {
4458    let getTranslationError = '';
4459
4460    if (window[resourceDictionary] == null) {
4461        getTranslationError = `The resource dictionary "${resourceDictionary}" is null. We cannot look-up translation keys for this object.`;
4462    }
4463    else if (Object.keys(window[resourceDictionary]).length == 0) {
4464        getTranslationError = `The resource dictionary "${resourceDictionary}" is present, but has no resource keys.`;
4465    }
4466    else if (!window[resourceDictionary]?.hasOwnProperty(resourceKey)) {
4467        getTranslationError = `The resource dictionary "${resourceDictionary}" does not contain a resource keyed as "${resourceKey}"`;
4468    }
4469    else if (window[resourceDictionary][resourceKey] == null || window[resourceDictionary][resourceKey].trim() == '') {
4470        getTranslationError = `The resource dictionary "${resourceDictionary}" contains a resource keyed as "${resourceKey}", but the resource value is null or empty.`;
4471    }
4472
4473    let resourceValue = '';
4474
4475    if (getTranslationError.length > 0) {
4476        LogErrorWithStackTrace(getTranslationError, GetTranslation);
4477
4478        resourceValue = 'ERROR OCCURRED';
4479    }
4480    else {
4481        resourceValue = window[resourceDictionary][resourceKey];
4482    }
4483
4484    return resourceValue;
4485}
4486
4487/**
4488 * Replace placeholders in a provided string value.
4489 * @param {string} value The value to replace placeholders in.
4490 * @param {string[]} replacements A variable-length parameters list containing replacements.
4491 * @example ReplacePlaceholders('Your name is {0} and mine is {1}.', 'Bob', 'Brian')
4492 * @returns The value with the placeholders removed.
4493 */
4494function ReplacePlaceholders(value, ...replacements) {
4495    let result = value;
4496
4497    if (typeof value !== 'string') {
4498        const errorMessage = 'Invalid value provided to replace placeholders in.';
4499
4500        LogErrorWithStackTrace(errorMessage, ReplacePlaceholders);
4501    }
4502
4503    for (let i = 0; i < replacements.length; i++) {
4504        result = result.replaceAll(`{${i}}`, replacements[i]);
4505    }
4506
4507    return result;
4508}
4509
4510/**
4511 * Logs an error message including its stack trace, where possible, to SEQ.
4512 * @param {string} errorMessage The error message to log.
4513 * @param {Function} func A handle to the function the error occurred in.
4514 */
4515function LogErrorWithStackTrace(errorMessage, func) {
4516    const callingContext = func?.caller?.name ?? 'top-level JS call';
4517    const prefix = `Error in "${func.name}", called by "${callingContext}", on "${window.location.href}".`;
4518
4519    /* This bit only works for Gecko-based browsers but provides really useful details. */
4520    if (Error.captureStackTrace) {
4521        const err = new Error();
4522
4523        Error.captureStackTrace(err, func);
4524
4525        errorMessage += `\n\n JS STACKTRACE:\n\n ${err.stack}`;
4526    }
4527
4528    /* Send the error to SEQ */
4529    ErrorLogger(errorMessage, prefix, 'error');
4530    console.error(`${prefix} // ${errorMessage}`);
4531}
4532
4533function handleEcommerceConfig() {
4534    if (ecommerceConfig) {
4535        setFinanceType();
4536    }
4537}
4538
4539function setFinanceType() {
4540    var body = document.getElementsByTagName("body")[0];
4541    body.setAttribute("data-financename", getPaymentMethodByType("Finance"));
4542}
4543
4544function getFacetResultsUrl() {
4545    return ecommerceConfig?.UseFacetSearchVersion === 2 ? "/facetresultsalt.aspx" : "/facetresults.aspx";
4546}
4547
4548function getPaymentMethodByType(typeToCheck) {
4549    var paymentsKeys = Object.keys(ecommerceConfig.ActivePaymentMethods);
4550    var toReturn = "";
4551    for (var i = 0; i < paymentsKeys.length; i++) {
4552        if (ecommerceConfig.ActivePaymentMethods[paymentsKeys[i]].Type == typeToCheck) {
4553            toReturn = paymentsKeys[i].toLowerCase();
4554            break;
4555        }
4556    }
4557    return toReturn;
4558}
4559
4560function setCookie(name, val) {
4561    setCookieWithDays(name, val, 1);
4562}
4563
4564function setCookieWithDays(name, val, numberOfDays) {
4565    var d = new Date();
4566    d.setTime(d.getTime() + (numberOfDays * ONEDAYINMILLISECONDS));
4567    document.cookie = name + "=" + val + "; expires=" + (d.toUTCString()) + "; path=/";
4568}
4569
4570function DeleteCookie(name) {
4571    document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/;';
4572}
4573
4574function facetStar() {
4575    $(".score").each(function (index) {
4576        var s = $(this).text();
4577        $(this).addClass("s" + s);
4578        if (s === "0") {
4579            $(this).html("").parent().addClass("inactive");
4580        }
4581    });
4582}
4583
4584function getCookie(name) {
4585    name = name + "=";
4586    var cookies = document.cookie.split(';');
4587    for (var i = 0; i < cookies.length; i++) {
4588        var currCook = cookies[i];
4589        while (currCook.charAt(0) == ' ') currCook = currCook.substring(1);
4590        if (currCook.indexOf(name) == 0) return currCook.substring(name.length, currCook.length);
4591    }
4592    return "";
4593}
4594
4595/*
4596These routines are called on page initalisation or AJAX postback to re-init any onpage objects
4597*/
4598
4599
4600function bindMasterHandler() {
4601
4602    // load the javascript console
4603    createErrorConsole();
4604
4605    // load any required AJAX images
4606    try {
4607        LoadAjaxImages();
4608    } catch (err) { processError(err); }
4609
4610    // this is the main search box defined by clSearch.ascx
4611    bindSearchReturnPress();
4612
4613
4614
4615    // local page routines...
4616    try {
4617        if (typeof bindHandlerCitrusStore == 'function') {
4618            bindHandlerCitrusStore();
4619        }
4620    } catch (err) { processError(err); }
4621
4622    try {
4623        if (typeof bindHandler == 'function') {
4624            bindHandler();
4625        }
4626    } catch (err) { processError(err); }
4627
4628    try {
4629        if (typeof bindHandlerSite == 'function') {
4630            bindHandlerSite();
4631        }
4632    } catch (err) { processError(err); }
4633
4634    // bind up the basket, login and rewards controls, if these are being streamed via AJAX
4635    bindAjaxTopHeader();
4636    $(".numeric").ForceNumericOnly();
4637
4638    logGoogleClientID();
4639
4640    passGclid();
4641    handleEcommerceConfig();
4642    CSSEditorPreview();
4643
4644    // Load Attribute Grid into elements which match the selector
4645    if ($('.dev-attgrid-ajax').length) {
4646        CitrusStore.CitrusStore.wsCitrusStore.GetAttributes(CONTROLFOLDERPATH + 'clAttributeControl.ascx', ProductID, false, 0, 0, loadProductAttgrid, onFailedWS);
4647    }
4648
4649}
4650
4651/**
4652 * Requests a Shareable Cart link from wsCitrusStore and provides it to the callback function.
4653 * @param {Function} successCallback A function which is ran upon successful call to wsCitrusStore. Provided the new Shareable Cart link.
4654 */
4655function GetDuplicateBasket(successCallback) {
4656    CitrusStore.CitrusStore.wsCitrusStore.DuplicateCart(function (newBasketId) {
4657        var host = document.location.origin;
4658        var basketUrl = host + '/cart/?CartIdToRetrieve=' + newBasketId;
4659        successCallback(basketUrl);
4660    }, onFailedWS);
4661}
4662
4663function checkBackInStock(onColRef) {
4664
4665    if (!ModularPlatform) {
4666        // Prevent Enter Button on Input
4667        $("#trOutofStockAjax input[type='text']").keypress(function (event) {
4668            if (event.keyCode === 10 || event.keyCode === 13) {
4669                event.preventDefault();
4670            }
4671        });
4672
4673        // event handler for AJAX attributes grid
4674        $(".dev-emailback-instock").click(function () {
4675            var clickedcode = parseInt(this.id.match(/\d+/));
4676            $('.parentAttGrid').removeClass('parentAttGrid');
4677            $(this).closest('.attRow').addClass('parentAttGrid');
4678            // Email validation
4679            var email = $(this).siblings("#dev-email-" + clickedcode).val();
4680            var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
4681            var passfail = regex.test(email);
4682
4683            var ProductID2 = "";
4684            if (onColRef) {
4685                ProductID2 = onColRef;
4686            } else {
4687                ProductID2 = ProductID;
4688            }
4689
4690            // Runs Webservice if the email IS a valid format
4691            if (passfail) {
4692                if ($('.newsletterSuccess').length) { } else {
4693                    CitrusStore.CitrusStore.wsCitrusStore.AddStockNotification(ProductID2, clickedcode, email, 0, SucceededBackInstock, onFailedWSBackInstock);
4694                }
4695            }
4696
4697            // Shows error if the email ISN'T in a valid format
4698            if (!passfail) {
4699                $('.newsletterFail, .newsletterSuccess').each(function () {
4700                    $(this).remove();
4701                });
4702                $('.parentAttGrid').after('<div class="col-1 ctrPad16 centralise newsletterFail colorwhite" style="margin-bottom:16px;"><span class="fa fa-close"></span> &nbsp; Oops, please enter a valid email address.</div>');
4703                setTimeout(function () { $('.newsletterFail').fadeOut(300); }, 5000);
4704                setTimeout(function () { $('.newsletterFail').remove(); }, 5301);
4705            }
4706        });
4707    }
4708}
4709/* DO NOT TRANSLATE - Old code investigate removal */
4710function SucceededBackInstock() {
4711    // Remove email error if present
4712    $('.newsletterFail, .newsletterSuccess').each(function () {
4713        $(this).remove();
4714    });
4715
4716    // Add success message to parent attGrid
4717    $('.parentAttGrid').after('<div class="col-1 newsletterSuccess ctrPad16 centralise colorwhite" style="margin-bottom:16px;"><span class="fa fa-check"></span> &nbsp; Thanks, we\'ve registered your request. We\'ll let you know when this item arrives.</div>');
4718    setTimeout(function () { $('.newsletterSuccess').fadeOut(300); }, 5000);
4719    setTimeout(function () { $('.newsletterSuccess').remove(); }, 5301);
4720
4721}
4722
4723function onFailedWSBackInstock(result) {
4724    console.error("Failed Back Instock Request // Reason : " + result._message);
4725}
4726
4727function loadProductAttgrid(result) {
4728    $(".dev-attgrid-ajax").each(function () {
4729        $(this).html(result.HTML);
4730    });
4731
4732    BasketStyles();
4733    $(".dev-attgrid-ajax div .OutofStockCSS").each(function (index) {
4734        $(this).closest('.attRow').addClass("out-of-stock");
4735    });
4736    checkBackInStock();
4737}
4738
4739function passGclid() {
4740    const gclid = getQueryStringParamRaw('gclid');
4741
4742    if (gclid) {
4743        const requestData = { gclid: gclid };
4744
4745        $.ajax({
4746            type: "POST",
4747            url: "/wsCitrusStore.asmx/PassGoogleGclid",
4748            data: JSON.stringify(requestData),
4749            contentType: "application/json; charset=utf-8",
4750            success: function (response) {
4751            },
4752            error: function (xhr, status, error) {
4753                // do nothing here
4754            }
4755        });
4756    }
4757
4758}
4759
4760function getQueryStringParamRaw(param) {
4761    const urlParams = new URLSearchParams(window.location.search);
4762    return urlParams.get(param);
4763}
4764
4765function logGoogleClientID() {
4766    const calledTime = window.performance.now();
4767    /*
4768     * This waits for the requisites for Google Analytics
4769     * and then executes the correct library method based on the
4770     * analytics scheme in use by the site.
4771    */
4772    waitFor(
4773        () => typeof ecommerceConfig == 'object'
4774            && typeof window.googleAnalyticsLibLoaded == 'boolean'
4775            && window.googleAnalyticsLibLoaded,
4776        50,
4777        333)
4778        .then(
4779            () => {
4780                console.debug(`logGoogleClientId predicate took ${window.performance.now() - calledTime}ms.`);
4781
4782                if (ecommerceConfig.AnalyticsScheme == 'GA4') {
4783                    initialiseGA4();
4784                }
4785                else {
4786                    console.error('Unsupported Analytics Scheme. Condition has been logged to the server.');
4787
4788                    ErrorLogger("Unsupported Analytics Scheme", `ecommerceConfig.AnalyticsScheme = ${ecommerceConfig.AnalyticsScheme}`, 'error');
4789                }
4790            })
4791        .catch(err => {
4792            console.error(err);
4793            ErrorLogger(err, `Error whilst loading analytics library. typeof ecommerceConfig = ${typeof ecommerceConfig == 'object'}. typeof googleAnalyticsLibLoaded = ${typeof googleAnalyticsLibLoaded}`, 'information');
4794
4795            /* We waited for the library but we haven't detected it as loading, we will try anyway (blank values) */
4796            sendAnalyticsId();
4797        });
4798
4799    /*
4800     * Send the request which posts the analytics client Id (and any associated data, too analytics)
4801     */
4802    function sendAnalyticsId() {
4803        const analyticsUserData = {
4804            ClientID: typeof window.GoogleAnalyticsClientId === 'string' ? window.GoogleAnalyticsClientId : '',
4805            gaSessionId: typeof window.GoogleAnalyticsSessionId === 'string' ? window.GoogleAnalyticsSessionId : ''
4806        };
4807
4808        $.ajax({
4809            type: "POST",
4810            url: "/wsCitrusStore.asmx/StoreGoogleClickID",
4811            data: JSON.stringify(analyticsUserData),
4812            contentType: "application/json; charset=utf-8"
4813        });
4814
4815        if (!analyticsUserData.ClientID.length || !analyticsUserData.ClientID.length) {
4816            let clientDataInfo = '';
4817
4818            if (!analyticsUserData.ClientID.length) {
4819                clientDataInfo += 'GoogleAnalyticsClientId was blank. ';
4820            }
4821
4822            if (!analyticsUserData.ClientID.length) {
4823                clientDataInfo += 'GoogleAnalyticsSessionId was blank.';
4824            }
4825
4826            ErrorLogger("'sendAnalyticsId' could not send user data", clientDataInfo, 'warning');
4827        }
4828    }
4829
4830    /**
4831     * Initialise GA4 analytics library.
4832     * Gets the client and session IDs from GA4 for use whilst sending pageviews and events.
4833     * Can only be called from within 'logGoogleClientID'.
4834     */
4835    function initialiseGA4() {
4836        createDataLayerAndGtagMethod();
4837
4838        gtag('js', new Date());
4839
4840        gtag('config', ecommerceConfig.AnalyticsId);
4841
4842        gtag('get', ecommerceConfig.AnalyticsId, 'client_id', (clientID) => {
4843            window.GoogleAnalyticsClientId = clientID;
4844
4845            gtag('get', ecommerceConfig.AnalyticsId, 'session_id', (sessionID) => {
4846                window.GoogleAnalyticsSessionId = sessionID;
4847
4848                sendAnalyticsId();
4849
4850                console.log('GoogleAnalyticsSessionId = ', window.GoogleAnalyticsSessionId);
4851            });
4852
4853            console.log('GoogleAnalyticsClientId = ', window.GoogleAnalyticsClientId);
4854        });
4855    }
4856}
4857
4858function createDataLayerAndGtagMethod() {
4859    window.dataLayer = window.dataLayer || [];
4860
4861    if (typeof window.gtag != 'function') {
4862        window.gtag = function () { dataLayer.push(arguments); };
4863    }
4864}
4865
4866function setGoogleConsent(allowAdStorage, allowAdUserData, allowAdPersonalisation, allowAnalyticsStorage) {
4867    createDataLayerAndGtagMethod();
4868
4869    const consentModel = getGoogleConsentModel(allowAdStorage, allowAdUserData, allowAdPersonalisation, allowAnalyticsStorage);
4870
4871    localStorage.setItem('googleConsentModel', JSON.stringify(consentModel));
4872    window.gtag('consent', 'update', consentModel);
4873
4874    /*
4875    * Added to improve ad tracking when ad storage is disabled
4876    * https://developers.google.com/tag-platform/security/guides/consent?consentmode=advanced#passthroughs
4877    */
4878    window.gtag('set', 'url_passthrough', true);
4879
4880    window.dataLayer.push({ 'event': 'consentUpdated' });
4881}
4882
4883function setUetConsent(allowAdStorage) {
4884    window.uetq = window.uetq || [];
4885
4886    const consentModel = {
4887        'ad_storage': allowAdStorage ? 'granted' : 'denied'
4888    }
4889
4890    localStorage.setItem('uetConsentModel', JSON.stringify(consentModel));
4891    window.uetq.push('consent', 'update', consentModel);
4892}
4893
4894/* Old code, investigate possibility of removal */
4895function SucceededProductPointsCallback(result) {
4896    if ($("#lblPoints").html() != null) {
4897        var original = $("#lblPoints").html().replace(/^\D+/g, '');
4898        var newvalue = result.replace(/^\D+/g, '');
4899        newvalue = newvalue.replace(',', '');
4900        original = original.replace(',', '');
4901
4902        if (newvalue != original) {
4903
4904            $("#lblPoints").html(result);
4905            $("#ProductDetail21_CustomerRewardsProductPointsBasket_lblPoints").html(result);
4906
4907            if (newvalue != original) {
4908                if (Math.abs((newvalue - original)) == 1) {
4909                    // rounding variance ignore
4910                }
4911                else {
4912
4913                    if (parseFloat(original) > parseFloat(newvalue)) {
4914                        // do not show negative bonus points....
4915                    }
4916                    else {
4917
4918                        if (ecommerceConfig.RewardsShowPointsAsCurrency) {
4919                            $('#devPromotext, .CRcopyBasket').html(
4920                                ReplacePlaceholders(
4921                                    GetTranslation('JavaScriptTranslations', 'DevJsRewardsIncludingOfBonusPointsX0CurrencyValueOfBonusPoints'),
4922                                    GetLocaleNumberAsFinancialNumber(newvalue - original)
4923                                )
4924                            );
4925                        }
4926                        else {
4927                            $('#devPromotext, .CRcopyBasket').html(
4928                                ReplacePlaceholders(
4929                                    GetTranslation('JavaScriptTranslations', 'DevJsRewardsIncludingOfBonusPointsX0AmountOfBonusPoints'),
4930                                    Number((newvalue - original).toFixed(0))
4931                                )
4932                            );
4933                        }
4934                    }
4935                }
4936            }
4937        }
4938    }
4939}
4940
4941function sanitiseCampaignId(campaignId) {
4942    const ids = campaignId.split(",");
4943
4944    let result = 'MailChimp:';
4945
4946    const uniqueIds = new Set();
4947
4948    for (let i = 0; i < ids.length; i++) {
4949        const id = ids[i].trim();
4950
4951        if (uniqueIds.has(id)) {
4952            continue;
4953        }
4954
4955        uniqueIds.add(id);
4956
4957        if (id.length + result.length > 50) {
4958            break;
4959        }
4960
4961        result += id + ",";
4962    }
4963
4964    return result.replace(/,$/, "");
4965}
4966
4967function bindAjaxTopHeader() {
4968    var qry = "";
4969    var campaignID = "";
4970    var docURL = document.URL;
4971
4972    if ($("#entryPointURLHidden").val() != null) {
4973        docURL = $("#entryPointURLHidden").val();
4974    }
4975
4976    if (docURL.indexOf("?") >= 0) {
4977        qry = docURL.split("?")[1];
4978        if (qry != "") {
4979            qrySplit = qry.split("&");
4980            for (var i = 0; i < qrySplit.length; i++) {
4981                if (qrySplit[i].indexOf("mc_cid=") >= 0) {
4982                    campaignID = sanitiseCampaignId(qrySplit[i].split("=")[1]);
4983                    break;
4984                }
4985            }
4986        }
4987    }
4988    CitrusStore.CitrusStore.wsCitrusStore.GetAjaxControls(CONTROLFOLDERPATH + "CartList.ascx", CONTROLFOLDERPATH + "CustomerRewards/CustomerRewardsDisplay.ascx", CONTROLFOLDERPATH + "clLogin.ascx", campaignID, GetAjaxControlsCallBack, onFailedWS);
4989}
4990
4991function GetAjaxControlsCallBack(result) {
4992
4993    if ($('#CartList-dev').length !== 0) {
4994        $("#CartList-dev").html(result.basket);
4995    }
4996
4997    if ($('#clLogin1-dev').length !== 0) {
4998        $("#clLogin1-dev").html(result.login);
4999        SetLogOutLinks();
5000        SetLoginLink();
5001    }
5002
5003    if ($('#CustomerRewardsDisplay1-dev').length !== 0) {
5004        $("#CustomerRewardsDisplay1-dev").html(result.rewards);
5005    }
5006}
5007
5008function SetLogOutLinks() {
5009    const promisedSignOut = $.Deferred();
5010
5011    $('#lnkSignOut').click(function (event) {
5012        event.preventDefault();
5013
5014        SignOutViaWebService(promisedSignOut);
5015    });
5016
5017    promiseResolution(promisedSignOut, () => {
5018        window.location.href = "/default.aspx";
5019    });
5020
5021    $('#lnkSignOut').href = '#';
5022}
5023
5024
5025function SetLoginLink() {
5026    $('#lnkLogin').click(function (event) {
5027        event.preventDefault();
5028        const redirectUrl = $(this).data('v4-login-url');   // or this.dataset.v4LoginUrl
5029        $.ajax({
5030            type: "POST",
5031            url: "/wsCitrusStore.asmx/CreateWalkin",
5032            contentType: "application/json; charset=utf-8",
5033            dataType: "json",
5034            success: function () {
5035                window.location.href = redirectUrl;
5036            },
5037            error: function () {
5038                ErrorLogger("Failed to create walkin session", "The walkin session could not be created.", "error");   
5039            }
5040        });
5041    });
5042}
5043
5044function SignOutViaWebService(promise) {
5045    $.ajax({
5046        type: "POST",
5047        url: "/wsCitrusStore.asmx/SignOut",
5048        contentType: "application/json; charset=utf-8",
5049        dataType: "json",
5050        success: function () {
5051            promise.resolve();
5052        },
5053        error: function () {
5054            promise.resolve();
5055        }
5056    });
5057}
5058
5059function syncSelectedSizeTerm(uid) {
5060    var hidden = document.getElementById("selectedSizeTermHidden");
5061
5062    if (hidden.value == uid) {
5063        hidden.value = "";
5064    } else {
5065        hidden.value = uid;
5066    }
5067    $("#txtPageNo").val(0);
5068    var prm = Sys.WebForms.PageRequestManager.getInstance();
5069    prm._doPostBack('txtPageNo', '');
5070
5071}
5072
5073function toggleClearSizeTerm() {
5074    var hidden = document.getElementById("selectedSizeTermHidden");
5075
5076    if (hidden.value == "") {
5077        document.getElementById("clearSizeTerm").hidden = "hidden";
5078    }
5079}
5080
5081function clearSizeTerm() {
5082    document.getElementById("selectedSizeTermHidden").value = "";
5083}
5084
5085function SucceededBasketCallback(result) {
5086
5087    $("#CartList-dev").html(result);
5088}
5089function SucceededLoginCallback(result) {
5090
5091    $("#clLogin1-dev").html(result);
5092    SetLogOutLinks();
5093}
5094function SucceededCustomerRewardsCallback(result) {
5095
5096    $("#CustomerRewardsDisplay1-dev").html(result);
5097}
5098
5099
5100function createErrorConsole() {
5101
5102    if ($("#javascriptconsole").length > 0) {
5103        // do something here
5104    }
5105    else {
5106        $('body').append('<div id="javascriptconsole"><div id="javascriptheader">Javascript Errors - Hover to zoom (esc to close)</div><div id="javascriptconsolecontent" ></div></div>');
5107    }
5108
5109
5110    $("#javascriptconsole").css("position", "fixed");
5111    $("#javascriptconsole").css("left", "0px");
5112    $("#javascriptconsole").css("bottom", "0px");
5113    $("#javascriptconsole").css("height", "120px");
5114    $("#javascriptconsole").css("width", "100%");
5115    $("#javascriptconsole").css("background", "#F44");
5116    $("#javascriptconsole").css("opacity", "0.95");
5117    $("#javascriptconsole").hide();
5118
5119    $("#javascriptconsolecontent").css("height", "100px");
5120    $("#javascriptconsolecontent").css("overflow", "auto");
5121    $("#javascriptconsolecontent").css("color", "#FFF");
5122    $("#javascriptconsolecontent").css("font-family", "Courier New");
5123    $("#javascriptconsolecontent").css("margin-left", "10px");
5124
5125    $("#javascriptheader").css("font-weight", "bold");
5126    $("#javascriptheader").css("height", "20px");
5127    $("#javascriptheader").css("color", "#FFF");
5128    $("#javascriptheader").css("font-family", "Courier New");
5129    $("#javascriptheader").css("overflow", "auto");
5130    $("#javascriptheader").css("margin-left", "5px");
5131
5132    $("#javascriptconsole").mouseover(function () {
5133        maxiconsole();
5134    });
5135
5136    $(document).keyup(function (e) {
5137        if (e.keyCode === 27) { // ESC
5138            $("#javascriptconsole").hide();
5139        }
5140    });
5141
5142    $(document).keyup(function (e) {
5143        if (e.shiftKey && e.keyCode === 223) { // Shift + ¬
5144            maxiconsole();
5145            $("#javascriptconsole").show();
5146        }
5147    });
5148
5149    function maxiconsole() {
5150        $("#javascriptconsole").height(800);
5151        $("#javascriptconsolecontent").height(780);
5152    }
5153
5154}
5155
5156///<summary>Method for Web Service Failed Event</summary>
5157///<param name="error">Error Object</param>
5158///<returns>false</returns>
5159function onFailedWS(error) {
5160    var pathname = window.location.hostname;
5161
5162    if (pathname.indexOf("localhost") != -1 || pathname.indexOf("dev.citruslime") != -1) {
5163        $("#javascriptconsole").show();
5164    }
5165
5166    $("#javascriptconsolecontent").append("WEB SERVICE ERROR : " + error.get_message() + "<br />");
5167
5168    $("#javascriptconsolecontent").append("---------------------------------------------------------------");
5169}
5170
5171
5172function processError(err) {
5173    ErrorLogger(err, err.stack, "error");
5174
5175    var pathname = window.location.hostname;
5176
5177    if (pathname.indexOf("localhost") != -1 || pathname.indexOf("dev.citruslime") != -1) {
5178        $("#javascriptconsole").show();
5179
5180    }
5181
5182    $("#javascriptconsolecontent").append("ERROR : " + err + "<br />" +
5183        "STACK : " + err.stack + "<br />" +
5184        "DESCRIPTION  : " + err.description + "(" + err.number + ") <br />");
5185    $("#javascriptconsolecontent").append("---------------------------------------------------------------");
5186}
5187
5188function SucceededFinanceCallback(result) {
5189    //get the div element
5190    $("input[name=Finance\\[Code\\]]").val(result.FinanceProduct);
5191    $("input[name=Finance\\[Deposit\\]]").val(result.Deposit);
5192
5193    if (result.Deposit <= 0) {
5194
5195        $("#tblCreditCard").hide();
5196        $("#financedepositmessage").hide();
5197    } else {
5198        $("#financedepositmessage").show();
5199        $("#tblCreditCard").show();
5200
5201    }
5202
5203    if (typeof FINANCEPROVIDER !== 'undefined' && FINANCEPROVIDER !== 'V12')// V12 finance do not take deposits on our platform it's part of their checkout
5204    {
5205        // deal with the display of the credit card panel on the rutland & new checkouts
5206        if (result.Deposit <= 0 && $("#financePaymentPanel").is(":visible")) {
5207            // hide the card control
5208            $("div[id*='_cardDetailsPanel']").toggle();
5209        }
5210        else {
5211            // show the card control
5212            $("div[id*='_cardDetailsPanel']").show();
5213        }
5214    }
5215
5216    if (result.Deposit > 0) {
5217        $(".financedepositsummary").show();
5218    }
5219
5220    var separatorSpace = " ";
5221
5222    $("#financeDepositSummary").html(result.Deposit.toFixed(2)); // update deposit info panel
5223    $("#testarea").html(result.PaymentValue +
5224        separatorSpace +
5225        result.MonthlyPayment +
5226        separatorSpace +
5227        result.PaymentCount +
5228        separatorSpace +
5229        result.Deposit +
5230        separatorSpace +
5231        result.CreditAmount +
5232        separatorSpace +
5233        result.TotalPay +
5234        separatorSpace +
5235        result.FinanceProduct +
5236        separatorSpace +
5237        result.ProductName +
5238        separatorSpace +
5239        result.Rate +
5240        separatorSpace +
5241        result.MinDeposit +
5242        separatorSpace +
5243        result.MaxDeposit +
5244        separatorSpace +
5245        result.InterestTotal);
5246
5247    $("#lblDeposit").text(result.DepositFormatted);
5248
5249    $("#lblMonthlyPayment2").text(result.MonthlyPaymentFormatted);
5250    $("#lblMonthlyPayment").text(result.MonthlyPaymentFormatted);
5251
5252    $("#lblNoPayments").text(result.PaymentCount);
5253    $("#lblNoPayments2").text(result.PaymentCount);
5254
5255    $("#lblPrice").text(result.PaymentValueFormatted);
5256
5257    $("#lblTotal").text(result.TotalPayFormatted);
5258    $("#lblCredit").text(result.CreditAmountFormatted);
5259
5260    $("#lblRate").text(result.PercentageRate + ' %');
5261    $("#lblRate2").text(result.PercentageRate + ' %');
5262
5263    $("#txtMinDeposit").text(result.MinDeposit);
5264    $("#txtMinDeposit").val(result.MinDeposit);
5265    $("#txtMaxDeposit").text(result.MaxDeposit);
5266    $("#txtMaxDeposit").val(result.MaxDeposit);
5267
5268    $("#txtDeposit").text(result.Deposit);
5269
5270    $("#lblMinDeposit").text(result.MinDepositFormatted);
5271    $("#lblMaxDeposit").text(result.MaxDepositFormatted);
5272
5273    $("#lblInterestTotal").text(result.InterestTotalFormatted);
5274
5275    // if the deposit is capped below our default due to the order value, change the values...
5276    if (parseFloat($("#txtDeposit").text()) >= result.MaxDeposit) {
5277        $("#txtDeposit").val(result.MaxDeposit);
5278        $("#lblDeposit").text(result.MaxDepositFormatted);
5279    }
5280
5281    bindfinanceslider();
5282
5283    if ($("#financeTopPanel").length > 0) {
5284        var perMonthPayment = ($("form#form1").length > 0 && $("form#form1").is("[data-financepayment]")
5285            ? $("form#form1").attr("data-financepayment")
5286            : $("#lblMonthlyPayment2").text());
5287
5288        $("#financeTopPanel").html(`<a href='#finance' data-touch='false'  id='financeLink' data-fancybox='finance'>${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', 'DevJsFinanceFromPerMonthX0MonthlyPayment'), result.MonthlyPaymentFormatted)}</a>`);
5289        $('[data-fancybox="finance"]').fancybox({
5290            touch: false,
5291            clickSlide: false
5292        });
5293    }
5294
5295}
5296
5297function callFinance() {
5298
5299    // these variable declarations are used as 'out' variables on the ajax call, so naming is irrelavent.
5300    var var1 = 0;
5301    var var2 = 0;
5302    var var3 = 0;
5303    var var4 = 1000;
5304    var var5 = 0;
5305    var var6 = 0;
5306    var var7 = 0;
5307
5308    try {
5309        if ($('.finalTotalField').length > 0 && $('.finalTotalField').eq(0).text() != "undefined") {
5310            /* Checkout */
5311            var paymentValue = $('.finalTotalField').eq(0).text();
5312
5313            var financeIntervalCounter = 0;
5314            var financeInterval = setInterval(function () {
5315                paymentValue = $('.finalTotalField').eq(0).text();
5316
5317                if (!isNaN(parseFloatFromString(paymentValue))) {
5318                    clearInterval(financeInterval);
5319                    CitrusStore.CitrusStore.wsCitrusStore.GetFinancePaymentJS(parseFloatFromString(paymentValue),
5320                        var1,
5321                        var2,
5322                        $("#txtDeposit").val(),
5323                        var3,
5324                        var4,
5325                        $("#txtProduct").val(),
5326                        'Test',
5327                        var5,
5328                        var6,
5329                        var7,
5330                        SucceededFinanceCallback,
5331                        onFailedWS);
5332                }
5333                else {
5334                    if (financeIntervalCounter > 6) {
5335                        clearInterval(financeInterval);
5336                    }
5337                }
5338
5339                financeIntervalCounter++;
5340            }, 500);
5341        }
5342        else {
5343            /* Not Checkout */
5344            CitrusStore.CitrusStore.wsCitrusStore.GetFinancePaymentJS(parseFloatFromString($("#lblPrice").text()),
5345                var1,
5346                var2,
5347                $("#txtDeposit").val(),
5348                var3,
5349                var4,
5350                $("#txtProduct").val(),
5351                'Test',
5352                var5,
5353                var6,
5354                var7,
5355                SucceededFinanceCallback,
5356                onFailedWS);
5357        }
5358    }
5359    catch (err) {
5360        /*  RARE but important
5361         *  ------------------
5362         *  If it takes too long for the checkout to return a value for the order total, we must log the error, but we can allow progress through the checkout.
5363         *  There MAY be disrepancies on the finance calculator but the correct amount is quoted in the credit application, billed to the customer and subsequently placed against the order.
5364        */
5365
5366        ErrorLogger(err,
5367            'Caught callFinance() JS error: We did not throw in the catch. This allowed the user to progress through checkout but we do need to investigate this issue.',
5368            'error');
5369    }
5370}
5371
5372function bindFinanceControl() {
5373    if ($("#financemessage").length == 0) {
5374    }
5375    else {
5376        callFinance();
5377
5378        $("#txtDeposit").keypress(function (event) {
5379            if (event.which == 13) {
5380                event.stopImmediatePropagation();
5381                event.preventDefault();
5382
5383                callFinance();
5384            }
5385        });
5386
5387        var $radBtn = $('input[name*="$radFinanceProductList"]');
5388        $radBtn.click(function () {
5389
5390            $("#txtProduct").val($(this).val());
5391
5392            callFinance();
5393        });
5394
5395        bindfinanceslider();
5396    }
5397}
5398
5399/**
5400 * Bind the finance calculator slider
5401 */
5402function bindfinanceslider() {
5403    const debouncedCallFinance = debounce(callFinance, 300);
5404
5405    $("#slider-single").slider({
5406        min: parseInt($("#txtMinDeposit").val()),
5407        max: parseInt($("#txtMaxDeposit").val()),
5408        step: 5,
5409        value: [parseInt($("#txtDeposit").val())],
5410        slide: function (event, ui) {
5411            $("#txtDeposit").val(ui.value);
5412            $("#lblDeposit").text("£" + ui.value + ".00");
5413        },
5414        stop: debouncedCallFinance
5415    });
5416}
5417
5418/**
5419 * Creates a debounced version of a given function.
5420 * @param  func The function to debounce.
5421 * @param  wait The debounce wait in ms.
5422 * @returns The debounced function.
5423 */
5424function debounce(func, wait) {
5425    let timeout;
5426
5427    return () => {
5428        clearTimeout(timeout);
5429        timeout = setTimeout(func, wait);
5430    };
5431}
5432
5433function parseFloatFromString(parseval) {
5434    return parseFloat(parseval.replace(/[^\d.]/g, ''));
5435}
5436
5437function invalidsearchterm(text) {
5438    if (text == '' || text.replace(/ /g, '').length <= 2) {
5439        return true;
5440    }
5441    else {
5442        return false;
5443    }
5444}
5445
5446function bindSearchReturnPress() {
5447
5448    $("#txtTerm").keyup(function (event) {
5449        if (event.which != 13) {
5450            getSearchChildCategories();
5451        }
5452    });
5453
5454    $("#txtTerm").click(function (event) {
5455        if ($("#txtTerm").val().length > 2) {
5456            $("#txtTerm").trigger("keydown.autocomplete");
5457        }
5458    });
5459
5460    $("#lnkSearch").click(function (event) {
5461        var text = $("#txtTerm").val();
5462        event.stopImmediatePropagation();
5463        event.preventDefault();
5464        if (invalidsearchterm(text)) {
5465            event.preventDefault();
5466            return false;
5467        }
5468        else {
5469            IsBetterSearch();
5470        }
5471    });
5472
5473    $("#txtTermBetterSearch").keypress(function (event) {
5474        if (event.which == 13) {
5475            var text = $("#txtTermBetterSearch").val();
5476
5477            if (text == '') {
5478                event.stopImmediatePropagation();
5479                event.preventDefault();
5480                return false;
5481            } else {
5482                return false;
5483            }
5484        }
5485    });
5486
5487
5488}
5489
5490function getSearchChildCategories() {
5491
5492    if ($("#txtTerm").val().length > 0 && $('#rootCategoryHidden').length) {
5493
5494        var search = $("#txtTerm").val()
5495        if ($("#rootCategoryHidden").val() != "") {
5496            var tierLimit = $("#tierLimitHidden").val();
5497
5498            if (tierLimit == '') {
5499                tierLimit = 0;
5500            }
5501
5502            $.ajax({
5503                type: "POST",
5504                url: "/wsCitrusStore.asmx/SearchCategories",
5505                data: '{"DepartmentRoot":"' + $("#rootCategoryHidden").val() + '" , "SearchTerm":"' + search + '", "TierLimitStr":"' + tierLimit + '"}',
5506                contentType: "application/json; charset=utf-8",
5507                dataType: "json",
5508                success: function (data) {
5509                    var options = JSON.parse(data.d);
5510
5511                    $("#txtTerm").autocomplete({
5512                        minLength: 3,
5513                        source: options,
5514                        focus: function (event, ui) {
5515                            $("#txtTerm").val(ui.item.value);
5516                        },
5517                        select: function (event, ui) {
5518                            window.location.href = ui.item.link;
5519                        }
5520                    });
5521                },
5522                error: function () {
5523                    console.error("Error'd");
5524                }
5525            });
5526        }
5527    }
5528}
5529
5530function EndRequestHandler(sender, args) {
5531    try { bindMasterHandler(); } catch (err) { }
5532
5533    if (typeof resetscroll != 'undefined') {
5534        if (resetscroll == true) {
5535            $("html, body").animate({ scrollTop: 0 }, "slow");
5536            resetscroll = false;
5537        }
5538    }
5539    else {
5540
5541    }
5542}
5543
5544function StartRequestHandler(sender, args) {
5545    try { BetterSearchstartAJAXPostback(); } catch (err) { }
5546}
5547
5548
5549/*
5550AJAX Helper functions
5551*/
5552
5553function getElementsByClass(searchClass, node, tag) {
5554    var classElements = new Array();
5555
5556    if (node == null)
5557        node = document;
5558
5559    if (tag == null)
5560        tag = '*';
5561
5562    var els = node.getElementsByTagName(tag);
5563    var elsLen = els.length;
5564    var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
5565
5566    for (i = 0, j = 0; i < elsLen; i++) {
5567        if (pattern.test(els[i].className)) {
5568            classElements[j] = els[i];
5569            j++;
5570        }
5571    }
5572    return classElements;
5573}
5574
5575
5576
5577function BetterSearchPageSize(event) {
5578    alert(event);
5579    return false;
5580}
5581
5582function BetterSearchbindErrorDisplay() {
5583    $("#ErrorMessage-DEV").hide();
5584    $("#adv-productContainer-search").dblclick(function (event) {
5585        if (event.shiftKey) {
5586            $("#ErrorMessage-DEV").toggle();
5587        }
5588    });
5589}
5590
5591///<summary>This is the callback function that processes the Web Service return value.</summary>
5592///<param name="result">result Object from Web Service</param>
5593function SucceededCallback(result) {
5594    //get the div element
5595    var RsltElem = $get("testDiv");
5596    //update div inner Html
5597    RsltElem.innerHTML = result;
5598}
5599
5600function SucceededPriceCallback(result) {
5601
5602    $("#" + result.ProductID).html(result.HTML);
5603
5604}
5605
5606
5607function SucceededSupplierStockCallback(result) {
5608    //get the div element
5609    $("#clSupplierCache").html(result);
5610
5611    // load the attributes control
5612    CitrusStore.CitrusStore.wsTest.GetAttributes($("#clAttributes").attr('class'), true, SucceededAttributeCallback, onFailedWS);
5613}
5614
5615///<summary>This function calls the GetControlHtml Web Service method.</summary>
5616///<param name="error">Succeed Object</param>
5617///<param name="error">Error Object</param>
5618function getPriceData(controlLocation, productid) {
5619    CitrusStore.CitrusStore.wsTest.GetPricing(controlLocation, productid, SucceededPriceCallback, onFailedWS);
5620}
5621
5622function IsBetterSearch() {
5623    CitrusStore.CitrusStore.wsCitrusStore.IsBetterSearch(SucceededBetterCallback, onFailedWS);
5624}
5625
5626function SucceededBetterCallback(result) {
5627    if (result == "True") {
5628        var url = "/advancedsearch.aspx?Term=" + $("#txtTerm").val();
5629        $(location).attr('href', url);
5630    }
5631    else {
5632        if (result == "Facet") {
5633            var url = getFacetResultsUrl() + "?Term=" + $("#txtTerm").val().trim();
5634            $(location).attr('href', url);
5635        }
5636        else {
5637            var url = "/NewSearchRes.aspx?strName=" + $("#txtTerm").val();
5638            $(location).attr('href', url);
5639        }
5640    }
5641}
5642
5643
5644///<summary>This function calls the GetControlHtml Web Service method.</summary>
5645///<param name="error">Succeed Object</param>
5646///<param name="error">Error Object</param>
5647function getData(controlLocation) {
5648    CitrusStore.CitrusStore.wsTest.GetControlHtml(controlLocation, SucceededCallback, onFailedWS);
5649}
5650
5651function GetNewSearch() {
5652    CitrusStore.CitrusStore.wsTest.GetNewSearch(SucceededCallback, onFailedWS);
5653}
5654
5655
5656
5657function LoadAjaxImages() {
5658    var divs = getElementsByClass("cacheImage", null, null);
5659    for (var i = 0; i < divs.length; i++) {
5660
5661        var imageurl = new String();
5662        imageurl = divs[i].id;
5663
5664        imageurl += '?width=' + divs[i].width;
5665        imageurl += '&height=' + divs[i].height;
5666        imageurl += '&format=webp&quality=70&bgcolor=fff';
5667
5668        divs[i].src = imageurl;
5669
5670    }
5671}
5672
5673function LoadSearchPrices(pricecontrol) {
5674
5675    var divs = getElementsByClass("prices", null, null);
5676    for (var i = 0; i < divs.length; i++) {
5677
5678        getPriceData(pricecontrol, divs[i].id);
5679    }
5680}
5681
5682function SucceededAttributeCallback(result) {
5683    $("#" + result.ProductID).html(result.HTML);
5684}
5685
5686function SucceededMIVBatchCallback(result) {
5687
5688    for (x in result) {
5689        $("#MIV-" + result[x].ProductID).html(result[x].HTML);
5690    }
5691    $(".fancybox").fancybox();
5692}
5693
5694function SucceededAttributeBatchCallback(result) {
5695    for (x in result) {
5696        $("#" + result[x].ProductID).html(result[x].HTML);
5697    }
5698}
5699
5700function SucceededCrumbsCallback(result) {
5701    $("#Crumbs-" + result.CategoryID).html(result.HTML);
5702}
5703
5704
5705function getStockData(controlLocation, productid, detailpage, dollar, percentage) {
5706    CitrusStore.CitrusStore.wsCitrusStore.GetAttributes(controlLocation, productid, detailpage, dollar, percentage, SucceededAttributeCallback, onFailedWS);
5707}
5708function getBatchStockData(controlLocation, productids, detailpage, dollar, percentage) {
5709    CitrusStore.CitrusStore.wsCitrusStore.GetAttributesBatch(controlLocation, productids, detailpage, dollar, percentage, SucceededAttributeBatchCallback, onFailedWS);
5710}
5711
5712
5713/* End Ajax integration */
5714
5715
5716// routines for search....
5717
5718
5719
5720function SucceededGetProductCallback(result) {
5721    $("#title-dev").html(result.Name);
5722    $("#ShortDescription-dev").html(result.ShortDescription);
5723    $("#LongDescription-dev").html(result.LongDescription);
5724    $("#link-dev").html("<a href='" + result.Link + "' class='button quickview' >Proceed to full product information.</a>");
5725    $("#ImageLargePath-dev").html('<img src=\'/' + result.ImageLargePath + '?height=500&width=500\' border=\'0\' />');
5726    CitrusStore.CitrusStore.wsCitrusStore.GetPricing(CONTROLFOLDERPATH + 'clpricing2.ascx', result.uid, result.IsOnSale, result.Price, result.SalePrice, SucceededPriceCallback, onFailedWS);
5727    eval(result.Add2BasketScript);
5728}
5729
5730
5731
5732function navigateAwayFromPomegranate() {
5733    try {
5734        if ($("#entryPointURLHidden").val() != null) {
5735            var initialURL = "/" + $("#entryPointURLHidden").val();
5736
5737            if (initialURL == "/") {
5738                initialURL = getFacetResultsUrl()
5739            }
5740            var stateObj = {
5741                didNavigateAway: true
5742            }
5743
5744            history.pushState(stateObj, "PomegranateRefilter", initialURL);
5745        }
5746    } catch (ex) {
5747
5748    }
5749}
5750
5751function SucceededPriceCallback(result) {
5752    $("#clPrice-dev").html(result.HTML);
5753}
5754
5755function quickLookMIVCallback(result) {
5756    $("#MIV-quicklook-dev").html(result.HTML);
5757    $(".fancybox").fancybox();
5758
5759}
5760
5761function SucceededAttributeQuickLookCallback(result) {
5762    $("#attribute-quicklook-dev").html(result.HTML);
5763    $(".fancybox").fancybox();
5764
5765    $("#attribute-quicklook-dev div .OutofStockCSS").each(function (index) {
5766        $(this).removeClass().parent().parent().addClass("out-of-stock")
5767    }).delay(2000);
5768
5769}
5770
5771// propotypes
5772function autoComplete() {
5773    $("#txtTermBetterSearch").autocomplete({
5774        source: function (request, response) {
5775            $.ajax({
5776                url: "/wsTest.asmx/SearchProducts",
5777                data: "{ 'term': '" + request.term + "' }",
5778                dataType: "json",
5779                type: "POST",
5780                contentType: "application/json; charset=utf-8",
5781                dataFilter: function (data) { return data; },
5782                success: function (data) {
5783                    response($.map(data.d, function (item) {
5784                        return {
5785                            value: item.Name
5786                        }
5787                    }))
5788                },
5789                error: function (XMLHttpRequest, textStatus, errorThrown) {
5790                    alert(textStatus);
5791                }
5792            });
5793        },
5794        minLength: 3
5795    });
5796
5797}
5798
5799String.prototype.killWhiteSpace = function () {
5800    return this.replace(/\s/g, '');
5801};
5802
5803function getQueryStringValue(key) {
5804    var result = new RegExp(key + "=([^&]*)", "i").exec(window.location.search);
5805    return result && unescape(result[1]) || "";
5806}
5807
5808
5809function PopStarBuy() {
5810    if (typeof tagalongTK === 'undefined') {
5811        // variable is undefined
5812    }
5813    else {
5814        $("#clTagAlongPopID").click();
5815        StarBuysBindAttributes(0, 0);
5816    }
5817
5818}
5819
5820function StarBuy() {
5821    var percentage = 0;
5822    var dollar = 0;
5823    if ($('#clTagAlongPromoter1_lblCatPercent').length >= 1) {
5824        percentage = $('#clTagAlongPromoter1_lblCatPercent').text();
5825        percentage = parseFloatFromString(percentage);
5826    }
5827
5828    if ($('#lblItemDollar').length >= 1) {
5829        dollar = $('#lblItemDollar').text();
5830        dollar = parseFloatFromString(dollar);
5831    }
5832
5833    StarBuysBindAttributes(dollar, percentage);
5834}
5835
5836function PageChange(back) {
5837
5838
5839    var pageno = parseInt($("#txtPageNo").val());
5840    var prm = Sys.WebForms.PageRequestManager.getInstance();
5841
5842    if (back) {
5843        $("#txtPageNo").val(pageno - 1);
5844        var prm = Sys.WebForms.PageRequestManager.getInstance();
5845        prm._doPostBack('txtPageNo', '');
5846    }
5847    else {
5848        $("#txtPageNo").val(pageno + 1);
5849        var prm = Sys.WebForms.PageRequestManager.getInstance();
5850        prm._doPostBack('txtPageNo', '');
5851    }
5852}
5853
5854function ResetBasketGrid(success) {
5855    $(".attribute-quicklook-dev div .OutofStockCSS").each(function (index) {
5856        $(this).removeClass().parent().parent().addClass("out-of-stock");
5857    });
5858    $('.clAttributeGridContainer>div').each(function (i) {
5859        if ($(this).hasClass('disableAdd')) {
5860            $(this).removeClass("disableAdd");
5861            if (success) {
5862                $(this).addClass("added");
5863            }
5864
5865        }
5866    });
5867
5868}
5869
5870/**
5871 * Called when add to basket completes so followup actions can be completed.
5872 *
5873 * @param {any} result - A string containing error information or details on the action (for example show starbuy or move to basket).
5874 */
5875function SucceededAdd2BasketCallback(result) {
5876
5877    const resultSplit = result.split("//**//");
5878    const isRemainOnDetailResult = resultSplit[0] == 'remainondetail';
5879
5880    const isErrorResponse = resultSplit.length > 1 && resultSplit[1] == 'error';
5881    const isNoStockErrorResponse = result.toLowerCase().indexOf(GetTranslation('JavaScriptTranslations', 'AddTobasketNoStock').toLowerCase()) > -1;
5882    const a2bFailedDueToNoStock = isErrorResponse && isNoStockErrorResponse;
5883
5884    const addToBasketSuccessText = GetTranslation('JavaScriptTranslations', 'AddedToBasketSuccessText')?.replace("{0}", "");
5885
5886    const resultmsg = resultSplit.length > 1 ? resultSplit[resultSplit.length - 1] : resultSplit[0];
5887
5888    const isAddedFromProductPage = typeof ProductID != 'undefined';
5889    const isSpecialOrderProductResponse = resultmsg.indexOf("will be special ordered") > -1;
5890
5891    if (isErrorResponse) {
5892        ShowAddToBasketCallbackFailedMessage(resultmsg);
5893
5894        if (a2bFailedDueToNoStock) {
5895            ResetBasketGrid(false);
5896        }
5897
5898        return false;
5899    }
5900
5901    if (resultmsg.indexOf(addToBasketSuccessText) == -1) {
5902        ShowAddToBasketCallbackFailedMessage(resultmsg);
5903
5904        if (isAddedFromProductPage) {
5905            StatefulLoader('stateful-loader-' + ProductID, false);
5906        }
5907
5908        if (!isSpecialOrderProductResponse) {
5909            // Only exit the function if it's an error and not a feedback message
5910            // e.g. "The item will be special ordered".
5911            return false;
5912        }
5913    }
5914
5915    const usePopup = typeof popupAdd2Basket !== 'undefined';
5916
5917    // if possible send data to google enhanced ecommerce
5918    try {
5919        addECTracking();
5920    }
5921    catch (e) {
5922        // do nothing
5923    }
5924
5925    Add2BasketAddTracking();
5926
5927    // enable the add2basket grid
5928    $(".basketMessage").html(GetTranslation('JavaScriptTranslations', 'DevJsCongratulationsAddedToTheBasket')).addClass("success");
5929
5930    findAndCloseStarbuyDrawer(2);
5931    findAndCloseStarbuyDrawer(1);
5932    quickLookFindAndClose();
5933
5934    loadStarbuyDrawerOneCart();
5935
5936    // Check if the project uses pop-ups or stay-on-detail
5937    if (!isErrorResponse && (usePopup || isRemainOnDetailResult)) {
5938        if (isRemainOnDetailResult) {
5939            remainondetail();
5940            HandlePopup(isErrorResponse);
5941        }
5942        else {
5943            window.location = "/cart/";
5944        }
5945    }
5946    // Project doesn't use pop-ups or stay-on-detail
5947    else if (!isErrorResponse) {
5948        window.location = result;
5949    }
5950}
5951
5952function ShowAddToBasketCallbackFailedMessage(resultmsg) {
5953    window.SucceededAdd2BasketCallbackFailMessagePromise = $.Deferred();
5954    var messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
5955    messageConfig.Header = GetTranslation('JavaScriptTranslations', 'DevJsShowAddToBasketCallbackFailedMessageHeader');
5956    messageConfig.Body = resultmsg;
5957    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', 'DevJsThanksButton');
5958    ModularModalMessage('SucceededAdd2BasketCallbackFailMessagePromise', messageConfig);
5959}
5960
5961/**
5962 * This routine gets called within the add 2 basket callback and is used to add third party tracking scripts.
5963 * */
5964function Add2BasketAddTracking() {
5965
5966    // functions that returns the selected attribute price
5967    const getProductPrice = () => {
5968        let price = document.querySelector('.add-to-cart-area-dropdown select option:checked').dataset.price || universal_product?.unit_sale_price || 0;
5969
5970        if(ecommerceConfig.DespatchCountry === 'ES') {
5971            price = price.replace(/[^0-9,]+/g,"").replace(/,+/g,".")
5972        } else {
5973            price = price.replace(/[^0-9.-]+/g,"");
5974        }
5975        return Number(price);
5976    }
5977
5978     // functions that returns the selected attribute ILC
5979    const getAttributeIdOrDefault = () => document.querySelector('.add-to-cart-area-dropdown select option:checked').value || universal_product?.sku_code || '';
5980
5981    // call facebook add to basket tracking if defined
5982    if (typeof fbq !== 'undefined' && typeof universal_pageType !== 'undefined' && typeof ecommerceConfig !== 'undefined') {
5983
5984        let attrCode = getAttributeIdOrDefault(),
5985            prodPrice = getProductPrice();
5986
5987        let fbqData = {
5988            value: prodPrice,
5989            currency: ecommerceConfig.LocalCurrencyCode,
5990            content_type: universal_pageType,
5991            content_ids: [attrCode]
5992        };
5993
5994        fbq('track', 'AddToCart', fbqData);
5995
5996    } else {
5997        if (typeof fbq !== 'undefined') {
5998            fbq('track', 'AddToCart');
5999        }
6000    }
6001}
6002
6003
6004
6005function remainondetail() {
6006    // stay on this page just rebind the basket control
6007    if ($('#CartList-dev').length !== 0) {
6008        CitrusStore.CitrusStore.wsCitrusStore.GetBasket(CONTROLFOLDERPATH + "CartList.ascx", SucceededBasketCallback, onFailedWS);
6009    }
6010    $(".basketMessage").html(GetTranslation('JavaScriptTranslations', 'DevJsCongratulationsAddedToTheBasket')).addClass("success");
6011    ResetBasketGrid(true);
6012    if (typeof (add2basket_followupActions) == 'function') {
6013        add2basket_followupActions();
6014    }
6015    // if we're on a search results page, close the quickview box
6016    try { $.fancybox.close(); } catch (err) { /* fine if this isn't present */ }
6017}
6018
6019
6020function HandlePopup(isError) {
6021    if (!isError && $('#CartList-dev').length !== 0) {
6022        CitrusStore.CitrusStore.wsCitrusStore.GetBasket(CONTROLFOLDERPATH + "CartList.ascx", SucceededBasketCallback, onFailedWS);
6023    }
6024}
6025function popupLoad() {
6026    setTimeout(function () {
6027
6028        var productID = $("#currProduct").val();
6029
6030        $.ajax({
6031            type: "POST",
6032            url: "/wsCitrusStore.asmx/isProductActive",
6033            data: '{"prodID":"' + productID + '"}',
6034            contentType: "application/json; charset=utf-8",
6035            dataType: "json",
6036            success: function (data) {
6037                if (data.d) {
6038                    $.ajax({
6039                        type: "POST",
6040                        url: "/wsCitrusStore.asmx/productInStock",
6041                        data: '{"prodID":"' + productID + '"}',
6042                        contentType: "application/json; charset=utf-8",
6043                        dataType: "json",
6044                        success: function (data) {
6045                            if (data.d) {
6046
6047                            } else {
6048
6049                                $.ajax({
6050                                    type: "POST",
6051                                    url: "/wsCitrusStore.asmx/hasRelatedProducts",
6052                                    data: '{"prodID":"' + productID + '"}',
6053                                    contentType: "application/json; charset=utf-8",
6054                                    dataType: "json",
6055                                    success: function (data) {
6056
6057                                        if (data.d) {
6058                                            $('#RelatedPopupOOSTrigger').fancybox().trigger('click');
6059                                        } else {
6060                                            $('#InactiveNoRelatedTrigger').fancybox().trigger('click');
6061                                        }
6062
6063                                    },
6064                                    error: function () { $('#RelatedPopupOOSTrigger').fancybox().trigger('click'); }
6065                                });
6066
6067
6068                            }
6069                        },
6070                        error: function () {
6071                        }
6072
6073                    });
6074
6075                } else {
6076                    $.ajax({
6077                        type: "POST",
6078                        url: "/wsCitrusStore.asmx/hasRelatedProducts",
6079                        data: '{"prodID":"' + productID + '"}',
6080                        contentType: "application/json; charset=utf-8",
6081                        dataType: "json",
6082                        success: function (data) {
6083
6084                            if (data.d) {
6085                                $('#RelatedPopupOOSTrigger').fancybox().trigger('click');
6086                            } else {
6087                                $('#InactiveNoRelatedTrigger').fancybox().trigger('click');
6088                            }
6089
6090                        },
6091                        error: function () { $('#RelatedPopupOOSTrigger').fancybox().trigger('click'); }
6092                    });
6093                }
6094            },
6095            error: function () {
6096            }
6097
6098        });
6099
6100
6101
6102
6103    }, 2000);
6104}
6105
6106function onFailedAddWS(error) {
6107    if (typeof StatefulLoader !== 'undefined') {
6108        StatefulLoader('stateful-loader-' + ProductID, false);
6109    }
6110
6111    $(".basketMessage").html(GetTranslation('JavaScriptTranslations', 'DevJsOopsThereHasBeenAProblem')).addClass("fail");
6112    $('.clAttributeGridContainer>div').each(function (i) {
6113        if ($(this).hasClass('disableAdd')) {
6114            $(this).removeClass("disableAdd").addClass("notAdded");
6115        }
6116    });
6117}
6118
6119
6120
6121function Add2BasketAttributeCtrl(productid, att, attdid, qtyToAdd, promiseToResolve) {
6122
6123    navigateAwayFromPomegranate();
6124
6125    // add the product to the basket
6126    if (typeof (addToBasketHide) === "function") {
6127        addToBasketHide();
6128    }
6129
6130    var qtyBox = $('#dev-qty-' + attdid);
6131
6132    // are we displaying a quantity field?
6133    if (qtyBox.length > 0 && !qtyToAdd) {
6134
6135        var qtyBoxValue = Number($.trim(qtyBox.val()));
6136        if (qtyBoxValue > 0 && qtyBoxValue === Math.round(qtyBoxValue)) {
6137
6138            $(".basketMessage").removeClass().addClass("basketMessage");
6139            $(".basketMessage").html(ReplacePlaceholders(GetTranslation('JavaScriptTranslations', 'DevJsAddingXToYourBasketX0QuantityAdded'), qtyBoxValue)).addClass("add");
6140            $(this).parent().parent().addClass("disableAdd").addClass("waiting").addClass("showloading");
6141
6142            CitrusStore.CitrusStore.wsCitrusStore.AddToBasketJSNew(productid, qtyBoxValue, att, attdid, AddToBasketJsNewSucceed, AddToBasketJsNewFail);
6143        }
6144        else {
6145            ShowAddToBasketCallbackFailedMessage(GetTranslation('JavaScriptTranslations', 'DevJsInvalidQuantity'));
6146            if (typeof ResetAdd2basketCover === "function") {
6147                ResetAdd2basketCover(productid);
6148            }
6149        }
6150    }
6151    else if (qtyToAdd && Number.isInteger(Number(qtyToAdd))) {
6152        CitrusStore.CitrusStore.wsCitrusStore.AddToBasketJSNew(productid, Math.floor(Number(qtyToAdd)), att, attdid, AddToBasketJsNewSucceed, AddToBasketJsNewFail);
6153    }
6154    else {
6155        // if not add the item with a qty of 1
6156        CitrusStore.CitrusStore.wsCitrusStore.AddToBasketJSNew(productid, 1, att, attdid, AddToBasketJsNewSucceed, AddToBasketJsNewFail);
6157    }
6158
6159    function AddToBasketJsNewSucceed(data) {
6160        if (IsDeferredObject(promiseToResolve)) {
6161            promiseToResolve.resolve();
6162        }
6163        SucceededAdd2BasketCallback(data);
6164    }
6165
6166    function AddToBasketJsNewFail(err) {
6167        if (IsDeferredObject(promiseToResolve)) {
6168            promiseToResolve.resolve();
6169        }
6170        onFailedAddWS(err);
6171    }
6172
6173}
6174
6175function IsDeferredObject(objectToEvaluate) {
6176    var toReturn = (typeof objectToEvaluate == 'object'
6177        && typeof objectToEvaluate.resolve == 'function'
6178        && typeof objectToEvaluate.resolveWith == 'function'
6179        && typeof objectToEvaluate.reject == 'function'
6180        && typeof objectToEvaluate.rejectWith == 'function'
6181        && typeof objectToEvaluate.notify == 'function'
6182        && typeof objectToEvaluate.notifyWith == 'function'
6183        && typeof objectToEvaluate.always == 'function'
6184        && typeof objectToEvaluate.then == 'function'
6185        && typeof objectToEvaluate.promise == 'function'
6186        && typeof objectToEvaluate.pipe == 'function'
6187        && typeof objectToEvaluate.done == 'function'
6188        && typeof objectToEvaluate.fail == 'function'
6189        && typeof objectToEvaluate.progress == 'function'
6190    );
6191
6192    return toReturn;
6193}
6194
6195function AddNewsletterSub(email, firstname, lastname, successFunction, failedFunction) {
6196    try {
6197        // attempt to push a GA Event so newletters signups are tracked.
6198        _gaq.push(['_trackEvent', 'Newsletter', 'Newsletter Signup', 'Newsletter Signup']);
6199    }
6200    catch (err) { }
6201
6202    CitrusStore.CitrusStore.wsCitrusStore.NewsletterSignup(email, firstname, lastname, successFunction, failedFunction);
6203}
6204
6205function bindCheckBoxes() {
6206    $('#chkCollectAtStore').change(function () {
6207        if ($('#chkCollectAtStore').attr('checked')) {
6208            $("#chkAlternativeDelivery").removeAttr('checked');
6209        }
6210    });
6211
6212    $('#chkAlternativeDelivery').change(function () {
6213        if ($('#chkAlternativeDelivery').attr('checked')) {
6214            $("#chkCollectAtStore").removeAttr('checked');
6215        }
6216    });
6217}
6218
6219function getCustomerDetails() {
6220    $("#javascriptconsolecontent").append("Triggered Messaging ::  Customer Callback starting<br />");
6221    CitrusStore.CitrusStore.wsCitrusStore.getCustomerDetails(successgetCustomerDetails, failedFunction);
6222}
6223
6224function successgetCustomerDetails(result) {
6225    try {
6226        $("#javascriptconsolecontent").append("Triggered Messaging ::  Customer Callback complete<br />");
6227        if (result.found) {
6228            window.universal_variable.user = window.universal_variable.user || {};
6229            window.universal_variable.user.name = result.firstname + " " + result.lastname;
6230            window.universal_variable.user.email = result.email;
6231            window.universal_variable.user.id = result.userid;
6232
6233            if ($TB && typeof $TB.setDetails === 'function') {
6234                $TB.setDetails(result.email, result.firstname, result.lastname, null, result.userid, null);
6235                $("#javascriptconsolecontent").append("Triggered Messaging :: Customer details logged for customer email " + result.email + " <br />");
6236            }
6237            else {
6238                $("#javascriptconsolecontent").append("Triggered Messaging :: LOG FAILED <br />");
6239            }
6240
6241        }
6242        else {
6243            $("#javascriptconsolecontent").append("Triggered Messaging :: Customer Not Logged In<br />");
6244        }
6245    }
6246    catch (err) {
6247        processError(err);
6248    }
6249}
6250
6251
6252
6253function rateProduct(star) {
6254
6255    reviewRated = 0;
6256    reviewPreset = star;
6257    rate(star);
6258
6259
6260}
6261
6262function rateRollOff() {
6263    if (reviewRated) {
6264        rate(reviewPreset);
6265    }
6266}
6267
6268function rate(star) {
6269    if (reviewRated == 0) {
6270        s = star.id.replace("_", '');
6271        a = 0;
6272
6273        for (i = 1; i <= starMax; i++) {
6274            if (i <= s) {
6275                document.getElementById("_" + i).className = "on";
6276                reviewHolder = a + 1;
6277                a++;
6278            }
6279            else {
6280                document.getElementById("_" + i).className = "off";
6281            }
6282        }
6283
6284        reviewRated = 1;
6285    }
6286    else {
6287
6288        s = star.id.replace("_", '');
6289        a = 0;
6290
6291        for (i = 1; i <= starMax; i++) {
6292            if (i <= s) {
6293                document.getElementById("_" + i).className = "on";
6294            }
6295            else {
6296                document.getElementById("_" + i).className = "off";
6297            }
6298        }
6299
6300    }
6301}
6302
6303function ResetReviewStars() {
6304    var stars = document.querySelectorAll('#starRate .on');
6305    for (var i = 0; i < stars.length; i++) {
6306        stars[i].className = 'off';
6307    }
6308}
6309
6310function handleCoupon() {
6311    $("#txtPromotionCode").keypress(
6312        function (e) {
6313            if (e.which == 13) {
6314                e.preventDefault();
6315                eval($("#btnApply").attr("href"));
6316            }
6317        }
6318    );
6319}
6320
6321function handleClickAndCollect() {
6322    $("#txtPostcode").keypress(
6323        function (e) {
6324            if (e.which == 13) {
6325                e.preventDefault();
6326                eval($("#btnClickandCollect").attr("href"));
6327            }
6328        }
6329    );
6330}
6331
6332
6333function SubmitReview(uid) {
6334    var name = document.getElementById('forenameBox').value;
6335    var comments = document.getElementById('reviewTextBox').value;
6336    var recomend = document.getElementsByName('recBtn');
6337    var recomendFinalValue;
6338
6339    for (var i = 0; i < recomend.length; i++) {
6340        if (recomend[i].checked) {
6341            recomendFinalValue = recomend[i].value;
6342        }
6343    }
6344    var score = document.querySelectorAll('#starRate .on').length;
6345    var email = document.getElementById('emailBox').value;
6346
6347    $.when(validateEmail(email))
6348        .done(function (emailIsValid) {
6349
6350            if (name == '' || comments == '' || recomendFinalValue == '' || score == 0 || !emailIsValid) {
6351                document.getElementById("reviewStatus").style.visibility = 'visible';
6352                document.getElementById("reviewStatus").className = 're
6352cNo';
6353                if (document.getElementById("reviewConfirmation")) {
6354                    document.getElementById("reviewConfirmation").style.visibility = 'hidden';
6355                }
6356                ResetReviewStars();
6357            }
6358            else {
6359                comments = comments.replace(new RegExp("'", "gi"), "");
6360                name = name.replace(new RegExp("'", "gi"), "");
6361
6362                // Populate variables into JSON object.
6363                // Turned into a string during the below AJAX call.
6364                var postReviewData = {
6365                    productUid: (uid || ProductID).toString(),
6366                    name: name,
6367                    review: comments,
6368                    score: score,
6369                    Recomend: recomendFinalValue,
6370                    email: email
6371                };
6372
6373                $.ajax({
6374                    method: "POST",
6375                    url: "/wsCitrusStore.asmx/postReview",
6376                    data: JSON.stringify(postReviewData),
6377                    contentType: "application/json; charset=utf-8",
6378                    dataType: "json",
6379                    success: function (data) {
6380                        var promiseName = 'ReviewSubmitted',
6381                            messageConfig = GetModularMessageConfig(MODALTYPE_SUCCESS);
6382
6383                        window[promiseName] = $.Deferred();
6384
6385                        messageConfig.Header = GetTranslation('JavaScriptTranslations', 'DevJsReviewSubmitted');
6386                        messageConfig.Body = `<p>${GetTranslation('JavaScriptTranslations', 'DevJsReviewSubmittedBody')}</p>`;
6387                        messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', 'DevJsContinueButton');
6388                        ModularModalMessage(promiseName, messageConfig);
6389                    },
6390                    error: function (data) {
6391                        var promiseName = 'ReviewSubmitted',
6392                            messageConfig = GetModularMessageConfig(MODALTYPE_ERROR);
6393
6394                        window[promiseName] = $.Deferred();
6395
6396                        messageConfig.Header = GetTranslation('JavaScriptTranslations', 'DevJsReviewSubmittedError');
6397                        messageConfig.Body = `<p>${GetTranslation('JavaScriptTranslations', 'DevJsReviewSubmittedErrorBody')}</p>`;
6398                        messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', 'DevJsContinueButton');
6399                        ModularModalMessage(promiseName, messageConfig);
6400                    }
6401                });
6402
6403                // Hide the modular platform review box.
6404                if (typeof reviewModulesToggle == "function") {
6405                    reviewModulesToggle($('.modular-review-faq-slidein'), false);
6406                }
6407
6408                if (document.getElementById("reviewConfirmation")) {
6409                    document.getElementById("reviewConfirmation").style.visibility = 'visible';
6410                    document.getElementById("reviewConfirmation").className = 'recYes';
6411                }
6412                document.getElementById("reviewStatus").style.visibility = 'hidden';
6413                parent.$.fancybox.close();
6414
6415                document.getElementById('forenameBox').value = "";
6416                document.getElementById('reviewTextBox').value = "";
6417                document.getElementsByName('recBtn').value = "";
6418
6419                ResetReviewStars();
6420                rateRollOff();
6421            }
6422        });
6423}
6424
6425
6426// Numeric only control handler
6427jQuery.fn.ForceNumericOnly =
6428    function () {
6429        return this.each(function () {
6430            $(this).keydown(function (e) {
6431
6432                var key = e.charCode || e.keyCode || 0;
6433
6434                // allow backspace, tab, delete, arrows, numbers and keypad numbers ONLY
6435                return (
6436                    key == 8 ||
6437                    key == 9 ||
6438                    key == 46 ||
6439                    key == 36 ||
6440                    key == 35 ||
6441                    (key >= 37 && key <= 40) ||
6442                    (key >= 48 && key <= 57) ||
6443                    (key >= 96 && key <= 105));
6444            })
6445        })
6446    };
6447
6448// FAQ Front end functionality
6449
6450function submitFAQ() {
6451    var name = document.getElementById("FAQFirstName").value;
6452    var question = document.getElementById("FAQQuestion").value;
6453    var email = document.getElementById("FAQEmail").value;
6454    var telephone = document.getElementById("FAQPhone").value;
6455    var prodID = document.getElementById("currentProduct").value;
6456
6457    if (prodID == "") {
6458        if (typeof ProductID !== 'undefined' && ProductID > 0) { prodID = ProductID; }
6459        else { prodID = -1; }
6460    }
6461
6462
6463    if (name != "" && question != "" && email != "") {
6464
6465        var valid = true;
6466
6467        if (telephone != "") {
6468            valid = validatePhone(telephone);
6469        }
6470
6471        $.when(validateEmail(email))
6472            .done(function (isEmailValid) {
6473                if (isEmailValid) {
6474                    if (valid == true) {
6475                        $("#faqStatusLbl").text('').hide();
6476
6477                        $.ajax({
6478                            type: "POST",
6479                            url: "/wsCitrusStore.asmx/AddFAQ",
6480                            data: JSON.stringify({ "firstName": name, "question": question, "productID": prodID, "emailAddress": email, "telephone": telephone }),
6481                            contentType: "application/json; charset=utf-8",
6482                            dataType: "Text",
6483                            success: function (data) {
6484                                var promiseName = 'FAQQuestionSubmitted',
6485                                    messageConfig = GetModularMessageConfig(MODALTYPE_SUCCESS);
6486
6487                                window[promiseName] = $.Deferred();
6488
6489                                messageConfig.Header = GetTranslation('JavaScriptTranslations', 'DevJsFaqSubmitted');
6490                                messageConfig.Body = `<p>${GetTranslation('JavaScriptTranslations', 'DevJsFaqSubmittedBody')}</p>`;
6491                                messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', 'DevJsContinueButton');
6492                                ModularModalMessage(promiseName, messageConfig);
6493
6494                                // Hide the modular platform review box.
6495                                if (typeof reviewModulesToggle == "function") {
6496                                    reviewModulesToggle($('.modular-review-faq-slidein'), false);
6497                                }
6498                            },
6499                            error: function () {
6500                                var promiseName = 'FAQQuestionSubmitError',
6501                                    messageConfig = GetModularMessageConfig(MODALTYPE_ERROR);
6502
6503                                window[promiseName] = $.Deferred();
6504
6505                                messageConfig.Header = GetTranslation('JavaScriptTranslations', 'DevJsFaqSubmittedError');
6506                                messageConfig.Body = `<p>${GetTranslation('JavaScriptTranslations', 'DevJsFaqSubmittedErrorBody')}</p>`;
6507                                messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', 'DevJsContinueButton');
6508                                ModularModalMessage(promiseName, messageConfig);
6509
6510                                // Hide the modular platform review box.
6511                                if (typeof reviewModulesToggle == "function") {
6512                                    reviewModulesToggle($('.modular-review-faq-slidein'), false);
6513                                }
6514                            }
6515                        });
6516                    }
6517                }
6518                else {
6519                    $("#faqStatusLbl").text(GetTranslation('JavaScriptTranslations', 'DevJsInvalidEmailAddressEntered')).show().addClass('ctrPad16 col-1 bgLRed').removeClass('bgLGreen');
6520                }
6521            });
6522    } else {
6523        $("#faqStatusLbl").text(GetTranslation('JavaScriptTranslations', 'DevJsIncompleteFormError')).show().addClass('ctrPad16 col-1 bgLRed').removeClass('bgLGreen');
6524    }
6525}
6526
6527function validatePhone(phoneNum) {
6528    var phoneLetterTest = /[a-zA-Z]/;
6529    var phoneNumericalTest = /^[0-9]/;
6530
6531    if (phoneLetterTest.test(phoneNum) == false && phoneNumericalTest.test(phoneNum) == true) {
6532        return true;
6533    } else {
6534        $("#faqStatusLbl").text(GetTranslation('JavaScriptTranslations', 'DevJsInvalidPhoneNumberError')).addClass('ctrPad16 col-1 bgLRed').removeClass('bgLGreen');
6535        return false;
6536    }
6537}
6538
6539function CheckPreSelectFinance() {
6540    if (selectfinance) {
6541        $("#TotalDisplay1_PaymentMethod option:selected").removeAttr("selected");
6542        $("#TotalDisplay1_PaymentMethod option[value='20']").attr("selected", "selected");
6543    }
6544}
6545
6546function validateEmail(email) {
6547    var promiseToReturn = $.Deferred();
6548
6549    $.ajax({
6550        type: "POST",
6551        url: "/wsCitrusStore.asmx/ValidateEmailAddress",
6552        data: JSON.stringify({ "emailAddress": email }),
6553        contentType: "application/json; charset=utf-8",
6554        success: function (data) {
6555            promiseToReturn.resolve(data.d);
6556        },
6557        error: function (e) {
6558            ErrorLogger(e, "Error occurred whilst during the ValidateEmailAddress WebService call.");
6559            promiseToReturn.resolve(false);
6560        }
6561    });
6562
6563    return promiseToReturn;
6564}
6565
6566/// This function displays a fancybox driven popup which allows messages to the user without
6567/// needing to alter the underlying page markup. It's available throughout CitrusEcommerce
6568function displayDevMessage(title, message, type) {
6569
6570    $(".ErrorPopUp").trigger('click');
6571
6572    $('.alert.info').hide();
6573    $('.alert.notice').hide();
6574    $('.alert.success').hide();
6575    $('.alert.error').hide();
6576    switch (type) {
6577        case "info":
6578            $('#devPopInfoTitle').html(title);
6579            $('#devPopInfoMsg').html(message);
6580            $('.alert.info').show();
6581            break;
6582        case "notice":
6583            $('#devPopNoticeTitle').html(title);
6584            $('#devPopNoticeMsg').html(message);
6585            $('.alert.notice').show();
6586            break;
6587        case "success":
6588            $('#devPopSuccessTitle').html(title);
6589            $('#devPopSuccessMsg').html(message);
6590            $('.alert.success').show();
6591            break;
6592        case "error":
6593            $('#devPopErrorTitle').html(title);
6594            $('#devPopErrorMsg').html(message);
6595            $('.alert.error').show();
6596            break;
6597    }
6598
6599}
6600
6601/**
6602 * Successful Starbuys V2 control callback for the product page
6603 */
6604function starbuysV2SuccessfulCallback(result) {
6605    $("#starbuysV2Panel").html(result);
6606    colourPickerPromises.successfulTagAlongItemCallback.resolve();
6607    colourPickerPromises.starbuysV2SuccessfulCallback.resolve();
6608}
6609
6610/**
6611 * Trigger Colour Picker WebService
6612 * @param {Number} prodID The product ID to load
6613 */
6614function refreshFromColour(prodID) {
6615    // TODO: CLECOM-4854
6616    // I haven't removed this function due to the call in dev.js on line 2803, which will need the selector reworking.
6617    // This can be removed as part of the removal of old product pages
6618    return;
6619}
6620
6621var prodUID = 0;
6622/**
6623 * Successful Colour Picker Callback Function.
6624 * Calls multiple AJAX calls for various parts of the product page.
6625 * @param {Object} result The result from the colour picker function
6626 */
6627function successfulColourProductCallback(result) {
6628    colourPickerPromises.successfulColourProductCallback.resolve();
6629    $(".detailShortDesc").html(result.shortDescription);
6630    try {
6631        $("#devProductName").html(result.Name);
6632        $(".productName").each(function () {
6633            $(this).html(result.Name);
6634        });
6635        $(".code").html(result.Code);
6636        $(".bigImg").attr("data-image", "/" + result.ImageLargePath);
6637        $(".bigImg").find("a").attr("href", "/" + result.ImageLargePath);
6638        $(".detailShortDesc").html(result.ShortDescription);
6639        if (result.ComingSoon) {
6640            $("#prelaunchPanel").show();
6641        } else {
6642            $("#prelaunchPanel").show();
6643        }
6644    } catch (ex) {
6645        console.error(ex.message);
6646    }
6647    CitrusStore.CitrusStore.wsCitrusStore.GetAttributes(CONTROLFOLDERPATH + 'clAttributeControl.ascx', result.uid, false, 0, 0, successfulAttributeGridCallback, onFailedWS);
6648    CitrusStore.CitrusStore.wsCitrusStore.GetProductDetailCustomerRewards(CONTROLFOLDERPATH + "CustomerRewards/CustomerRewardsProductPoints.ascx", result.Price, result.SalePrice, result.IsOnSale, true, successfulCustomerRewardProductCallback, onFailedWS);
6649    CitrusStore.CitrusStore.wsCitrusStore.GetClFinance(CONTROLFOLDERPATH + "clFinance.ascx", result.IsOnSale, result.SalePrice, result.Price, false, successfulFinanceTopCallback, onFailedWS);
6650    CitrusStore.CitrusStore.wsCitrusStore.GetClFinance(CONTROLFOLDERPATH + "clFinanceCalculator.ascx", result.IsOnSale, result.SalePrice, result.Price, true, successfulFinanceCalcCallback, onFailedWS);
6651
6652    setTimeout(function () {
6653        CitrusStore.CitrusStore.wsCitrusStore.RewardsPoints(result.uid, SucceededProductPointsCallback, onFailedWS);
6654        colourPickerPromises.SucceededProductPointsCallback.resolve();
6655    }, 500);
6656
6657    $(".clWarning5").hide();
6658}
6659
6660/**
6661 * The Colour Picker Deferred Objects
6662 */
6663var colourPickerPromises = {
6664    'successfulColourProductCallback': $.Deferred(),
6665    'successfulColourProductPriceCallback': $.Deferred(),
6666    'successfulAttributeGridCallback': $.Deferred(),
6667    'successfulCustomerRewardProductCallback': $.Deferred(),
6668    'successfulFinanceTopCallback': $.Deferred(),
6669    'successfulFinanceCalcCallback': $.Deferred(),
6670    'successfulDynamicCurrencyTopCallback': $.Deferred(),
6671    'successfulDynamicCurrencySummaryCallback': $.Deferred(),
6672    'successfulTagAlongItemCallback': $.Deferred(),
6673    'starbuysV2SuccessfulCallback': $.Deferred(),
6674    'SucceededProductPointsCallback': $.Deferred()
6675};
6676
6677/**
6678 * Handles Colour Picker Deferred Object Resolution
6679 */
6680function handleForColourPickerPromises() {
6681
6682    var deferredArrayForColourPicker = [
6683        colourPickerPromises.successfulColourProductCallback,
6684        colourPickerPromises.successfulColourProductPriceCallback,
6685        colourPickerPromises.successfulAttributeGridCallback,
6686        colourPickerPromises.successfulCustomerRewardProductCallback,
6687        colourPickerPromises.successfulFinanceTopCallback,
6688        colourPickerPromises.successfulFinanceCalcCallback,
6689        colourPickerPromises.successfulDynamicCurrencyTopCallback,
6690        colourPickerPromises.successfulDynamicCurrencySummaryCallback,
6691        colourPickerPromises.successfulTagAlongItemCallback,
6692        colourPickerPromises.starbuysV2SuccessfulCallback,
6693        colourPickerPromises.SucceededProductPointsCallback
6694    ];
6695
6696    $.when.apply($, deferredArrayForColourPicker)
6697        .done(function () {
6698            colourPickerButtonState(true);
6699            setColourPickerPromisesAsDeferred();
6700        });
6701}
6702
6703/**
6704 * Reset the Colour Picker deferred objects.
6705 */
6706function setColourPickerPromisesAsDeferred() {
6707    colourPickerPromises.successfulColourProductCallback = $.Deferred();
6708    colourPickerPromises.successfulColourProductPriceCallback = $.Deferred();
6709    colourPickerPromises.successfulCustomerRewardProductCallback = $.Deferred();
6710    colourPickerPromises.successfulFinanceTopCallback = $.Deferred();
6711    colourPickerPromises.successfulFinanceCalcCallback = $.Deferred();
6712    colourPickerPromises.successfulDynamicCurrencyTopCallback = $.Deferred();
6713    colourPickerPromises.successfulDynamicCurrencySummaryCallback = $.Deferred();
6714    colourPickerPromises.successfulTagAlongItemCallback = $.Deferred();
6715    colourPickerPromises.starbuysV2SuccessfulCallback = $.Deferred();
6716    colourPickerPromises.SucceededProductPointsCallback = $.Deferred();
6717}
6718
6719/**
6720 * Handle the Colour Picker Thumbnail State.
6721 * Fades out and greyscales when not clickable.
6722 * @param {Boolean} active Is the button clickable or not.
6723 */
6724function colourPickerButtonState(active) {
6725    var $colourPickerItem = $('[onclick*="refreshFromColour"], .colourPicker > div[data-productuid]');
6726    var percent = (active ? "0" : "100");
6727    var cursor = (active ? "pointer" : "wait");
6728    var opacity = (active ? "1.0" : "0.5");
6729    $colourPickerItem.each(function () {
6730        $(this).attr("data-loading", !active);
6731        $(this).css({
6732            "-webkit-transition": "250ms",
6733            "-webkit-filter": "grayscale(" + percent + "%)",
6734            "opacity": opacity,
6735            "cursor": cursor
6736        });
6737    });
6738}
6739
6740
6741/**
6742 * Successful pricing control callback for the product page
6743 */
6744function successfulColourProductPriceCallback(result) {
6745    colourPickerPromises.successfulColourProductPriceCallback.resolve();
6746    try {
6747        $(".pricing").html(result.HTML);
6748        if ($(".percentOff").html() != null) {
6749            if ($(".percentOff").html().length > 0) {
6750                $(".percentOff").html($(".percentOff").html() + " off")
6751            }
6752        }
6753    } catch (ex) {
6754        console.error(ex.message);
6755    }
6756}
6757
6758/**
6759 * Successful attribute control callback for the product page
6760 */
6761function successfulAttributeGridCallback(result) {
6762    colourPickerPromises.successfulAttributeGridCallback.resolve();
6763    try {
6764        $(".clAttributeGridContainer").html(result.HTML);
6765
6766        BasketStyles();
6767        checkBackInStock(ProductID);
6768    } catch (ex) {
6769        console.error(ex.message);
6770    }
6771}
6772
6773/**
6774 * Successful rewards control callback for the product page
6775 */
6776function successfulCustomerRewardProductCallback(result) {
6777    colourPickerPromises.successfulCustomerRewardProductCallback.resolve();
6778    try {
6779        $("#CustomerRewardPanel").html(result);
6780    } catch (ex) {
6781        console.error(ex.message);
6782    }
6783}
6784
6785/**
6786 * Successful top-finance (the finance summary) control callback for the product page
6787 */
6788function successfulFinanceTopCallback(result) {
6789    colourPickerPromises.successfulFinanceTopCallback.resolve();
6790    try {
6791        if ($("#lblMonthlyPayment2").length) {
6792            $("#financeTopPanel").html(`<a href='#finance' data-touch='false'  id='financeLink' data-fancybox='finance'>${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', 'DevJsFinanceFromPerMonthX0MonthlyPayment'), $("#lblMonthlyPayment2").text())}</a>`)
6793            $('[data-fancybox="finance"]').fancybox({
6794                touch: false,
6795                clickSlide: false
6796            });
6797        }
6798    } catch (ex) {
6799        console.error(ex.message);
6800    }
6801}
6802
6803/**
6804 * Successful finance calculator control callback for the product page
6805 */
6806function successfulFinanceCalcCallback(result) {
6807    colourPickerPromises.successfulFinanceCalcCallback.resolve();
6808    try {
6809        $("#financeCalculatorPanel").html(result);
6810    } catch (ex) {
6811        console.error(ex.message);
6812    }
6813}
6814
6815/**
6816 * Successful dynamic currency (summary, top of page) control callback for the product page
6817 */
6818function successfulDynamicCurrencyTopCallback(result) {
6819    colourPickerPromises.successfulDynamicCurrencyTopCallback.resolve();
6820    try {
6821        $("#dynamicCurrencyPanel").html(result);
6822    } catch (ex) {
6823        console.error(ex.message);
6824    }
6825}
6826
6827/**
6828 * Successful dynamic currency control callback for the product page
6829 */
6830function successfulDynamicCurrencySummaryCallback(result) {
6831    colourPickerPromises.successfulDynamicCurrencySummaryCallback.resolve();
6832    try {
6833        $(".currencyMain").html(result);
6834    } catch (ex) {
6835        console.error(ex.message);
6836    }
6837}
6838
6839/**
6840 * Successful Starbuys V1 control callback for the product page
6841 */
6842function successfulTagAlongItemCallback(result) {
6843    colourPickerPromises.successfulTagAlongItemCallback.resolve();
6844    colourPickerPromises.starbuysV2SuccessfulCallback.resolve();
6845    try {
6846        $("#tagAlongPanel").html(result);
6847    } catch (ex) {
6848        console.error(ex.message);
6849    }
6850}
6851
6852function checkFacetBreadcrumb(anchorElement) {
6853    if ($(anchorElement).attr("href") != null) {
6854        if ($("#isDetailPageHidden").val() == "true") {
6855            //Just navigate, no history point required
6856            window.location.href = $(anchorElement).attr("href");
6857        } else {
6858            //Create history point then navigate
6859            var initialURL = "/" + $("#entryPointURLHidden").val();
6860
6861            if (initialURL == "/") {
6862                initialURL = getFacetResultsUrl()
6863            }
6864
6865            var stateObj = {
6866                didNavigateAway: true
6867            }
6868
6869            history.pushState(stateObj, "PomegranateRefilter", initialURL);
6870            window.location.href = $(anchorElement).attr("href");
6871        }
6872    } else {
6873        return false;
6874    }
6875}
6876
6877/* DO NOT TRANSLATE - Old code investigate removal */
6878function FindandFilterHitTest(productid, fafquery) {
6879    CitrusStore.CitrusStore.wsCitrusStore.FindandFilterTestProduct(productid, fafquery, findhitsuccess, onFailedWS);
6880
6881}
6882/* DO NOT TRANSLATE - Old code investigate removal */
6883function findhitsuccess(data) {}
6884
6885/* DO NOT TRANSLATE - Old code investigate removal */
6886function toggleCIMOptions(el) {
6887    console.log('toggleCIMOptions ');
6888    el.siblings('#cim-data-all').slideToggle(300, function () {
6889        console.log('toggleCIMOptions done');
6890        if ($(this).is(':visible')) { el.text('Fewer Options ...'); }
6891        else { el.text('More Options ...'); }
6892    });
6893}
6894
6895function ErrorLogger(msg, detailedmsg, loglevel) {
6896    if (typeof loglevel == "null" || typeof loglevel == "undefined" || !loglevel) {
6897        loglevel = 'error';
6898    }
6899
6900    CitrusStore.CitrusStore.wsCitrusStore.FrontEndLogMessage2SEQWithPage(
6901        getSerializedValueSafe(msg),
6902        `${getSerializedValueSafe(detailedmsg)} || ${getSerializedBrowserNavigatorValue()}`,
6903        loglevel,
6904        window.location.href,
6905        () => {},
6906        onFailedAddWS);
6907}
6908
6909function getSerializedBrowserNavigatorValue() {
6910    let navigatorSerialized = '';
6911
6912    try {
6913        var _navigator = {};
6914        for (var i in navigator)
6915            _navigator[i] = navigator[i];
6916
6917        navigatorSerialized = JSON.stringify(_navigator);
6918    }
6919    catch (err) {
6920        navigatorSerialized = 'Could not serialize browser details.';
6921    }
6922
6923    return navigatorSerialized;
6924}
6925
6926function getSerializedValueSafe(valueToSerialize) {
6927    let serializedValue = null;
6928
6929    if (typeof valueToSerialize == 'undefined' || valueToSerialize == null) {
6930        serializedValue = '';
6931    }
6932    else if (typeof valueToSerialize == 'object') {
6933        try {
6934            serializedValue = JSON.stringify(valueToSerialize, Object.getOwnPropertyNames(valueToSerialize));
6935        }
6936        catch (er) {
6937            // do nothing
6938        }
6939
6940        serializedValue = serializedValue ?? valueToSerialize?.stack ?? valueToSerialize?.toString() ?? '';
6941    }
6942    else {
6943        serializedValue = valueToSerialize?.toString() ?? '';
6944    }
6945
6946    return serializedValue;
6947}
6948
6949/* -------------------------------------------------------- */
6950/* Begin port from citrusstore-reference.js (12th Nov 2018) */
6951/* -------------------------------------------------------- */
6952
6953// This function is called whenever a page loads, throughout the site
6954function bindHandlerCitrusStore() {
6955    if (typeof FancyBoxWithClassNameMIV != "undefined" && (typeof fancybox != "undefined" || typeof $.fancybox != "undefined")) { FancyBoxWithClassNameMIV(); }
6956    if (typeof NewsletterSignup != "undefined") { NewsletterSignup(); }
6957    if (typeof FancyAnchorReviewTrigger != "undefined") { FancyAnchorReviewTrigger(); }
6958    if (typeof changeStars != "undefined") { changeStars(); }
6959    if (typeof smoothScroll != "undefined") { smoothScroll(); }
6960    if (typeof currentDate != "undefined") { currentDate(); }
6961    if (typeof newsletterMessage != "undefined") { newsletterMessage(); }
6962}
6963
6964// Footer -- Newsletter Sginup feature
6965var newsletterDivID;
6966var newsletterValue;
6967function NewsletterSignup() {
6968    if ($("#footerEmail").length == 0) { } else {
6969        $("#newsletter-footer-submit").click(function (event) {
6970            newsletterDivID = "#newsletter-footer-text";
6971            newsletterValue = $("#footerEmail").val();
6972            validateNewsletterEmail(newsletterValue);
6973        });
6974        $("#footerEmail").keypress(function (e) {
6975            if (e.which == 13) {
6976                newsletterDivID = "#newsletter-footer-text";
6977                newsletterValue = $("#footerEmail").val();
6978                validateNewsletterEmail(newsletterValue);
6979            }
6980        });
6981    }
6982    if ($("#popupEmail").length == 0) { } else {
6983        $("#newsletter-popup-submit").click(function (event) {
6984            newsletterDivID = "#newsletter-popup-text";
6985            newsletterValue = $("#popupEmail").val();
6986            validateNewsletterEmail(newsletterValue);
6987        });
6988        $("#popupEmail").keypress(function (e) {
6989            if (e.which == 13) {
6990                newsletterDivID = "#newsletter-popup-text";
6991                newsletterValue = $("#popupEmail").val();
6992                validateNewsletterEmail(newsletterValue);
6993            }
6994        });
6995    }
6996    if ($("#pageEmail").length == 0) { } else {
6997        $("#newsletter-page-submit").click(function (event) {
6998            newsletterDivID = "#newsletter-page-text";
6999            newsletterValue = $("#pageEmail").val();
7000            validateNewsletterEmail(newsletterValue);
7001        });
7002        $("#pageEmail").keypress(function (e) {
7003            if (e.which == 13) {
7004                newsletterDivID = "#newsletter-page-text";
7005                newsletterValue = $("#pageEmail").val();
7006                validateNewsletterEmail(newsletterValue);
7007            }
7008        });
7009    }
7010    if ($("#topBannerEmail").length == 0) { } else {
7011        $("#newsletter-topBanner-submit").click(function (event) {
7012            newsletterDivID = "#newsletter-topBanner-text";
7013            newsletterValue = $("#topBannerEmail").val();
7014            validateNewsletterEmail(newsletterValue);
7015        });
7016        $("#topBannerEmail").keypress(function (e) {
7017            if (e.which == 13) {
7018                newsletterDivID = "#newsletter-topBanner-text";
7019                newsletterValue = $("#topBannerEmail").val();
7020                validateNewsletterEmail(newsletterValue);
7021            }
7022        });
7023    }
7024}
7025
7026function accordion() {
7027    if ($(".accordionPanel").length == 0) { } else {
7028        var allPanels = $('.accordionPanel > .accordionContent').hide();
7029        var allSection = $('.accordionSelection');
7030        $('.accordionSelection').click(function () {
7031            $this = $(this);
7032            $target = $this.next();
7033            if (!$target.hasClass('active')) {
7034                allPanels.removeClass('active').slideUp();
7035                allSection.removeClass('active');
7036                $target.addClass('active').slideDown();
7037                $this.addClass('active');
7038            }
7039            if ($("#dpdmap").length > 0) {
7040                DPDMapInitialize();
7041            }
7042            if ($("#standardMap").length > 0) {
7043                CollectMapInitialize();
7044            }
7045            if ($("#map").length > 0) {
7046                standardMapInit();
7047            }
7048            return false;
7049        });
7050    }
7051}
7052
7053function accordionMap() {
7054    if ($(".accordionPanelMap").length == 0) { } else {
7055        var allPanels = $('.accordionPanelMap > .accordionContentMap').hide();
7056        var allSection = $('.accordionSelectionMap');
7057        $('.accordionSelectionMap').click(function () {
7058            $this = $(this);
7059            $target = $this.next();
7060            if (!$target.hasClass('active')) {
7061                allPanels.removeClass('active').slideUp();
7062                allSection.removeClass('active');
7063                $target.addClass('active').slideDown();
7064                $this.addClass('active');
7065            }
7066            return false;
7067        });
7068    }
7069}
7070
7071function validateNewsletterEmail(emailAddress) {
7072    $.when(validateEmail(emailAddress))
7073        .done(function (isEmailValid) {
7074            if (isEmailValid) {
7075                AddNewsletterSub(emailAddress, 'firstname', 'lastname', successFunction, failedFunction);
7076            }
7077            else {
7078                $(newsletterDivID).text(ReplacePlaceholders(GetTranslation('JavaScriptTranslations', 'DevJsNewsletterInvalidEmailX0EmailAddress'), newsletterValue));
7079                $(newsletterDivID).removeClass().addClass("newsletterFail");
7080                $(newsletterDivID).fadeIn("fast");
7081            }
7082        });
7083}
7084function failedFunction(error) {
7085    var message = (error && error.get_statusCode() === 400)
7086        ? GetTranslation('JavaScriptTranslations', 'DevJsNewsletterServiceRateLimit')
7087        : GetTranslation('JavaScriptTranslations', 'DevJsNewsletterServiceNotWorking');
7088    $(newsletterDivID).text(message);
7089    $(newsletterDivID).removeClass().addClass("newsletterFail");
7090    $(newsletterDivID).fadeIn("fast");
7091}
7092
7093function successFunction(result) {
7094    if (typeof emailmsg == "undefined") {
7095        window.emailmsg = "";
7096    }
7097    if (result = true) {
7098        $(newsletterDivID).html(ReplacePlaceholders(GetTranslation('JavaScriptTranslations', 'DevJsNewsletterSuccessX0EmailAddressX1SignupMessage'), newsletterValue, emailmsg));
7099        $(newsletterDivID).removeClass().addClass("newsletterSuccess");
7100        $(newsletterDivID).fadeIn("fast");
7101    }
7102    else {
7103        $(newsletterDivID).html(ReplacePlaceholders(GetTranslation('JavaScriptTranslations', 'DevJsNewsletterFailureX0EmailAddress'), newsletterValue));
7104        $(newsletterDivID).removeClass().addClass("newsletterFail");
7105        $(newsletterDivID).fadeIn("fast");
7106    }
7107}
7108
7109// Smooth Scroll -- Make any class with .smoothScroll smoothly scrol to designated archore tag set via the ID.
7110function smoothScroll() {
7111    $('.smoothScroll').click(function () {
7112        if ($(".masthead").css("position") === "fixed") {
7113            var mast = $('.masthead').height();
7114            $('html, body').animate({
7115                scrollTop: $($(this).attr('href')).offset().top - mast
7116            }, 1200, 'swing');
7117            return false;
7118        } else {
7119            $('html, body').animate({
7120                scrollTop: $($(this).attr('href')).offset().top
7121            }, 1200, 'swing');
7122            return false;
7123        }
7124    });
7125}
7126
7127// Fancybox -- Makes any class a fancybox to ID.
7128function FancyBoxWithClassNameMIV() {
7129    $("a.MIV").fancybox();
7130    $(".MIViframe").fancybox({
7131        type: "iframe"
7132    });
7133    $(".ErrorPopUp").fancybox();
7134    $('.autosize').fancybox();
7135}
7136
7137function FancyAnchorReviewTrigger() {
7138    $(document).ready(function () {
7139        if (location.hash.toLowerCase() == '#review') {
7140            $("#reviewShow").trigger('click');
7141        }
7142    })
7143}
7144
7145// sitewide -- Get the current year
7146function currentDate() {
7147    var d = new Date();
7148    $('.citrusDate').text(d.getFullYear());
7149}
7150
7151function reviewsRemoveErrorClass() {
7152    $("#lblErr").removeClass("ErrorMessages");
7153}
7154
7155// Detail Page -- Create start out of TEXT, Review Star function
7156$.fn.stars = function () {
7157    return $(this).each(function () {
7158        if ($(this).html() == "?") {
7159            $(this).html("");
7160        } else {
7161            $(this).html($('<span />').width(Math.max(0, (Math.min(5, parseFloat($(this).html())))) * 20));
7162        }
7163    });
7164}
7165$.fn.starsLarge = function () {
7166    return $(this).each(function () {
7167        if ($(this).html() == "?") {
7168            $(this).html("");
7169        } else {
7170            $(this).html($('<span />').width(Math.max(0, (Math.min(5, parseFloat($(this).html())))) * 30));
7171        }
7172    });
7173}
7174$.fn.starsBS = function () {
7175    return $(this).each(function () {
7176        if ($(this).html() == "?") {
7177            $(this).html("");
7178        } else {
7179            if ($(this).html() == "0") {
7180                $(this).hide();
7181            } else {
7182                $(this).html($('<span />').width(Math.max(0, (Math.min(5, parseFloat($(this).html())))) * 20));
7183            }
7184
7185
7186        }
7187    });
7188}
7189function changeStars() {
7190    if ($("span.stars").length) { $('span.stars').stars(); }
7191    if ($("span.starsLarge").length) { $('span.starsLarge').starsLarge(); }
7192    if ($("span.starsBS").length) { $('span.starsBS').starsBS(); }
7193}
7194
7195function courierfilter() {
7196    var courierfilterSpinnerId = 'courierLoadingSpinner-00001';
7197    if (typeof AddStatefulLoadingSpinnerGlobal == 'function') {
7198        AddStatefulLoadingSpinnerGlobal(courierfilterSpinnerId);
7199        ToggleLoadingSpinnerByName(courierfilterSpinnerId, true);
7200    }
7201
7202    $('.courierCountrySearch-select').click(function () {
7203        $('.courierCountrySelection').removeClass('hideme');
7204    });
7205    $('.courierCountrySelection-close').click(function () {
7206        $('.courierCountrySelection').addClass('hideme');
7207    });
7208
7209    var mylist = $('.courierchart');
7210
7211    var listitems = mylist.children('li').get();
7212    listitems.sort(function (a, b) {
7213        var compA = $(a).text().toUpperCase();
7214        var compB = $(b).text().toUpperCase();
7215        return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
7216    })
7217    $.each(listitems, function (idx, itm) { mylist.append(itm); });
7218    $('.courierchart>li.postcoderegion').insertAfter('.courierchart>li[data-iso="iso-GB"]');
7219    $('.courierchart>li[data-iso]').each(function () {
7220        var $this = $(this);
7221        if (this.className.indexOf("country-") > -1) {
7222            var cls = $this.attr('class');
7223            var iso = $this.attr('data-iso');
7224            var findspan = $this.find('.loctitle');
7225            var type = $this.attr('data-locationtype');
7226            var span = findspan.clone();
7227            span.wrap('<div>');
7228            var spanString = span.parent().html();
7229            var thetext = findspan.text().toLowerCase();
7230            var wildcard = "";
7231            if (iso === "iso-GB" || $this.hasClass('postcoderegion')) {
7232                wildcard = "uk england wales cymru scotland u.k.";
7233            }
7234            if (iso === "iso-US") {
7235                wildcard = "usa u.s.a. america";
7236            }
7237            if (iso === "iso-AE") {
7238                wildcard = "uae u.a.e.";
7239            }
7240            var html = "<li class='selectCountryCourier " + cls + "' data-iso='" + iso + "' data-isotype='" + type + "' data-name='" + thetext + "' data-string='" + thetext + wildcard + "'>" + spanString + "</li>";
7241            $('.courierCountrySelection-body').append(html);
7242            wildcard = "";
7243        }
7244    });
7245
7246    $('.courierCountrySelection-search .emptysearch').click(function () {
7247        $('.courierCountrySelection-search input').val('');
7248        $('.selectCountryCourier').show().removeClass('hideLocationCourier');
7249
7250    });
7251
7252    $('.courierCountrySelection-search input').keyup(function () {
7253        var val = $(this).val();
7254        var value = $.trim(val.toLowerCase());
7255        if (value === "" || value.length < 1 || value === " " || value === "  " || value === "   " || value === "    " || value === "     ") {
7256            $('.selectCountryCourier').show().removeClass('inactive');
7257        }
7258        else {
7259            clearTimeout(courierItemTimer);
7260            var courierItemTimer = setTimeout(function () {
7261                $('.selectCountryCourier').hide().addClass('hideLocationCourier');
7262                $('.selectCountryCourier[data-string*="' + value + '"]').each(function () {
7263                    $(this).show().removeClass('hideLocationCourier');
7264                });
7265            }, 100);
7266        }
7267    });
7268
7269    $('.selectCountryCourier').click(function () {
7270        var $this = $(this);
7271        var cname = $this.attr('data-name');
7272        var dataiso = $this.attr('data-iso');
7273        var dataisotype = $this.attr('data-isotype');
7274        var trimiso = dataiso.replace('iso-', '');
7275        var selector = dataisotype != 'undefined'
7276            ? '.courierchart>li[data-iso="' + dataiso + '"][data-locationtype="' + dataisotype + '"]'
7277            : '.courierchart>li[data-iso="' + dataiso + '"]';
7278
7279        $('.courierchart>li').slideUp(300, function () {
7280            $(selector).slideDown();
7281        });
7282
7283        $('.courierCountrySelection').addClass('hideme');
7284        $('.courierCountrySelection-search input').val('');
7285        $('.selectCountryCourier').show().removeClass('hideLocationCourier');
7286        if (dataiso === "iso-GB") {
7287            $('.courierchart>li.postcoderegion[data-iso]').fadeIn();
7288        }
7289        $('.courierCountrySearch>li').attr('class', '').addClass('country-' + trimiso).attr('data-iso', dataiso);
7290        $('.courierCountrySearch>li .loctitle').text(cname);
7291    });
7292
7293    if ($('.courierCountrySearch>li').attr('data-iso').toLowerCase().indexOf(ecommerceConfig.DespatchCountry.toLowerCase()) == -1) {
7294        var defaultCountryByDespatchCountry = $('li.selectCountryCourier[data-isotype="country"][data-iso="iso-' + ecommerceConfig.DespatchCountry + '"]');
7295
7296        if (defaultCountryByDespatchCountry.length) {
7297            defaultCountryByDespatchCountry.eq(0).click();
7298        }
7299    }
7300
7301    $('.courierCountrySearch, .courierchart').fadeIn(300);
7302
7303    if (typeof AddStatefulLoadingSpinnerGlobal == 'function') {
7304        ToggleLoadingSpinnerByName(courierfilterSpinnerId, false);
7305    }
7306}
7307
7308/* Customer Builder Routines */
7309function CustomerBuilderPostBackStarts() {
7310    $("#AjaxPanel").fadeTo(300, 0.5);
7311}
7312
7313function CustomerBuilderPostBackComplete() {
7314    $("#AjaxPanel").delay(200).fadeTo(300, 1);
7315    if (typeof flipImages != "undefined") { setTimeout(flipImages(true), 350); }
7316}
7317
7318function cpbNoChange() {
7319    $("div.attPrice span:empty").text("- -");
7320    $("div.cpb-chosenAtt span:empty").text(GetTranslation('JavaScriptTranslations', 'DevJsCustomBuilderNoSelection')).css({ 'color': '#e75a5f' });
7321}
7322
7323
7324/**
7325   This function allows us to use $.Deferred() objects
7326   with the var.resolve() method to negate the use of
7327   setTimeouts. First, you declare a variable, this must
7328   be within the scope of whereever promiseResolution() is
7329   called, or can be globally scoped, if it's a variable
7330   that's likely to be used or resolved from multiple
7331   locations. Then, you resolve it in whichever asyncronous
7332   function you need. Now, when the deferred object is resolved
7333   you're callback function runs.
7334
7335   Example -----------------------------------------------------
7336
7337   var qwertyDeferred = $.Deferred();
7338   promiseResolution(qwertyDeferred, makestuffred);
7339
7340   $.ajax({
7341        url:"slowurl.aspx",
7342        type:"GET,
7343        success:function(data) {
7344            doSomethingwithdata(data);
7345            qwertyDeferred.resolve(data);
7346        }
7347    });
7348
7349   function makestuffred(data) {
7350       $('*').css({color:'tomato'});
7351       qwertyDeferred = $.Deferred();
7352   }
7353   End // Example ----------------------------------------------
7354*/
7355function promiseResolution(promised, callback) {
7356    $.when(promised).done(callback).then(function () {
7357        promised = $.Deferred();
7358    });
7359}
7360
7361function waitForElement(selector) {
7362    return new Promise(resolve => {
7363        const existingElement = document.querySelector(selector);
7364
7365        if (existingElement) {
7366            return resolve(existingElement);
7367        }
7368
7369        const observer = new MutationObserver(mutations => {
7370            const newlyAddedElement = document.querySelector(selector);
7371            if (newlyAddedElement) {
7372                observer.disconnect();
7373                resolve(newlyAddedElement);
7374            }
7375        });
7376
7377        observer.observe(document.body, {
7378            childList: true,
7379            subtree: true
7380        });
7381    });
7382}
7383
7384/**
7385 * Waits for the provided predicate function to return true and then resolves the promise.
7386 * Polls the predicate method every 250ms.
7387 * @param {Function} predicate A function that returns true. The things we are waiting to be ready.
7388 * @param {Number} maximumAttempts The Maximum attempts we should try to wait. Defaults to 0 (inifnitely).
7389 * @param {Number} intervalTime The time in milliseconds between polling the predicate. Defaults to 250ms.
7390 */
7391async function waitFor(predicate, maximumAttempts, intervalTime) {
7392    let waitForArgs = arguments;
7393
7394    return new Promise((resolve, reject) => {
7395
7396        let attempts = 0;
7397
7398        let waitForInterval = setInterval(
7399            () => {
7400                attempts++;
7401
7402                if (predicate()) {
7403                    clearInterval(waitForInterval);
7404                    waitForInterval = null;
7405
7406                    resolve(true);
7407                    console.debug(`Attempt ${attempts} => Completed waitFor() "${waitForArgs[0].toString()}"`);
7408                }
7409                else {
7410                    console.debug(`Attempt ${attempts} => Incomplete waitFor() "${arguments[0].toString()}" ...`);
7411                }
7412
7413                if (maximumAttempts > 0 && attempts == maximumAttempts) {
7414                    clearInterval(waitForInterval);
7415                    waitForInterval = null;
7416
7417                    reject(`Maximum attempts reached: ${maximumAttempts}.`);
7418
7419                    console.debug(`Exited waitFor() maximum attempts reached: ${maximumAttempts}.`);
7420                }
7421            },
7422            intervalTime);
7423    });
7424}
7425
7426function initPayPalExpress(elstr) {
7427    //elstr represents the selector as a string for the button.
7428
7429    if (!ecommerceConfig.ActivePaymentMethods["PayPal"]) {
7430        $(elstr).hide();
7431    }
7432    else {
7433        // Do something
7434        var data = {
7435            d: { status: true, errorMsg: '/ssl/secure/' }
7436        };
7437
7438        if (data.d.status == true) {
7439            $(elstr).attr('href', data.d.errorMsg).show();
7440        } else {
7441            $(elstr).hide();
7442        }
7443    }
7444}
7445
7446
7447function testAutoSIMItem(item) {
7448    CitrusStore.CitrusStore.wsCitrusStore.SIM_GetItem(item,
7449        function (data) {
7450            console.log(data);
7451        },
7452        function (error) {
7453            console.error('failed to get item' + error);
7454        });
7455}
7456
7457function displayUserFeedbackError(title, message) {
7458    displayUserFeedbackPopup(title, message, 'red', false);
7459}
7460
7461function displayUserFeedbackWarning(title, message) {
7462    displayUserFeedbackPopup(title, message, 'red', true);
7463}
7464
7465function displayUserFeedbackMessage(title, message) {
7466    displayUserFeedbackPopup(title, message, 'blue', true);
7467}
7468
7469function displayUserFeedbackPopup(title, message, colour, autohide) {
7470
7471    var autohideDelay = 0;
7472
7473    if (autohide === true) {
7474        transitionOut = 'elastic';
7475        autohideDelay = 7500;
7476    }
7477
7478    if (typeof addBodyMessage === "function") {
7479        removeBodyMessage();
7480        addBodyMessage(colour, message, autohide, autohideDelay);
7481    }
7482    else {
7483        bottomdrawer.adddrawer(message, colour);
7484    }
7485}
7486
7487function CourierIntegration_DisplayFeedback(type, message) {
7488
7489    if (type === "error") {
7490        displayUserFeedbackError('', message);
7491    }
7492
7493    if (type === "warning") {
7494        displayUserFeedbackWarning('', message);
7495    }
7496
7497    if (type === "message") {
7498        displayUserFeedbackMessage('', message);
7499    }
7500}
7501
7502/**
7503 * Enables the previewing of CSS from the Cloud MT CSS Editor
7504 */
7505var CSSEditorPreview = function () {
7506
7507    var rawParamValue = GetURLParameterByName('preview')
7508    var css = atob(rawParamValue),
7509        head = document.head || document.getElementsByTagName('head')[0],
7510        style = document.createElement('style');
7511
7512    head.appendChild(style);
7513
7514    style.type = 'text/css';
7515    if (style.styleSheet) {
7516        style.styleSheet.cssText = css;
7517    } else {
7518        style.appendChild(document.createTextNode(css));
7519    }
7520
7521};
7522
7523function GetCheckoutWorkflowOptions() {
7524
7525    const cardButton = GetCheckoutWorkflowOptionSchema('CreditCard',
7526        '#4c90e1',
7527        GetTranslation('JavaScriptTranslations', 'DevJsPaymentButtonCard'),
7528        'Credit/Debit Card'
7529    );
7530
7531    const paypalV2Button = GetCheckoutWorkflowOptionSchema('PayPalV2',
7532        '#ffc439',
7533        `<img src="/ssl/images/cards/paypal-logo-150px.png" border="0" height="28" />`,
7534        'PayPal'
7535    );
7536
7537    const financeButton = GetCheckoutWorkflowOptionSchema('Finance',
7538        '#389583',
7539        GetTranslation('JavaScriptTranslations', 'DevJsPaymentButtonFinance'),
7540        'Finance'
7541        );
7542
7543    const isCsolCycle2Work = window.location.href.indexOf('cycletowork.cyclesolutions') > 1 || window.location.href.indexOf('csolc2w.dev') > 1 || (typeof isC2WSite !== "undefined" && isC2WSite) || ($('#IsCSOL').length > 0 && $('#IsCSOL').val().toLowerCase() == 'true');
7544
7545    const cycleSchemeButton = GetCheckoutWorkflowOptionSchema('CycleScheme',
7546        '#195079',
7547        isCsolCycle2Work ? GetTranslation('JavaScriptTranslations', 'DevJsPaymentButtonGeneric') : GetTranslation('JavaScriptTranslations', 'DevJsPaymentButtonCycleScheme'),
7548        isCsolCycle2Work ? 'Cycle to Work Scheme' : 'Cyclescheme'
7549        );
7550
7551    const purchaseOrderButton = GetCheckoutWorkflowOptionSchema('PurchaseOrder',
7552        '#b05286',
7553        GetTranslation('JavaScriptTranslations', 'DevJsPaymentButtonPurchaseOrder'),
7554        'Purchase Order'
7555        );
7556
7557    const creditAccountButton = GetCheckoutWorkflowOptionSchema('CreditAccount',
7558        '#d85d13',
7559        GetTranslation('JavaScriptTranslations', 'DevJsPaymentButtonCreditAccount'),
7560        'Credit Account'
7561        );
7562
7563    const moneyTransferButton = GetCheckoutWorkflowOptionSchema('MoneyTransfer',
7564        '#529eb0',
7565        GetTranslation('JavaScriptTranslations', 'DevJsPaymentButtonMoneyTransfer'),
7566        'Cheque/Internet Banking'
7567        );
7568
7569    const klarnaButton = GetCheckoutWorkflowOptionSchema('Klarna',
7570        '#ffb3c7',
7571        '<img src="/ssl/images/cards/klarna-logo.png" border="0" height="28" />',
7572        'Klarna'
7573        );
7574
7575    const clearPayAfterPayLogoUrl = ['GB', 'ES', 'FR'].includes(ecommerceConfig.DespatchCountry)
7576        ? 'clearpay.png'
7577        : 'afterpay.png';
7578
7579    const clearPayAfterPayButton = GetCheckoutWorkflowOptionSchema('CitrusPayStripeClearPayAfterPay',
7580        '#b2fce4',
7581        `<img src="/ssl/images/cards/${clearPayAfterPayLogoUrl}" border="0" height="28" />`,
7582        'ClearPayAfterPay'
7583    );
7584
7585    const applePayButton = GetCheckoutWorkflowOptionSchema('AdyenApplePay',
7586        '#000',
7587        '<img src="/ssl/images/cards/raw-apple.png" border="0" height="22" />',
7588        'Apple Pay'
7589    );
7590
7591    const affirmFinanceButton = GetCheckoutWorkflowOptionSchema('AdyenAffirm',
7592        '#3131a3',
7593        'Buy now with <img src="/ssl/images/cards/affirm-logo.png" border="0" height="22" />',
7594        'Affirm Finance'
7595    );
7596
7597    return {
7598        CreditCard: cardButton,
7599        Finance: financeButton,
7600        CycleScheme: cycleSchemeButton,
7601        PurchaseOrder: purchaseOrderButton,
7602        CreditAccount: creditAccountButton,
7603        MoneyTransfer: moneyTransferButton,
7604        Klarna: klarnaButton,
7605        CitrusPayStripeClearPayAfterPay: clearPayAfterPayButton,
7606        PayPalV2: paypalV2Button,
7607        AdyenApplePay: applePayButton,
7608        AdyenAffirm: affirmFinanceButton
7609    };
7610}
7611
7612function GetCheckoutWorkflowOptionSchema(name, cssColor, buttonContent, shortName) {
7613    return {
7614        name: name,
7615        color: cssColor,
7616        content: buttonContent,
7617        shortDesc: shortName
7618    };
7619}
7620
7621function GetActiveWorkflowButtons() {
7622
7623    var activePaymentOptionTypes = GetActivePaymentTypes();
7624    var checkoutWorkflowOptions = GetCheckoutWorkflowOptions();
7625
7626    var buttonSchema = [];
7627
7628    for (var paymentOptionName in activePaymentOptionTypes) {
7629        if (typeof checkoutWorkflowOptions[paymentOptionName] != "undefined") {
7630            buttonSchema.push(checkoutWorkflowOptions[paymentOptionName]);
7631        }
7632    }
7633
7634    return buttonSchema;
7635}
7636
7637function GetActivePaymentTypes() {
7638    var activePaymentOptionTypes = [];
7639
7640    for (var activePaymentOption in ecommerceConfig.ActivePaymentMethods) {
7641        var paymentMethodType = ecommerceConfig.ActivePaymentMethods[activePaymentOption].Type.replace(' ', '');
7642        activePaymentOptionTypes[paymentMethodType] = true;
7643    }
7644
7645    return activePaymentOptionTypes;
7646}
7647
7648/**
7649 * Takes a number and formats it as a locale-accurate currency string
7650 * @param {Number} value the value to display. (Parsed as number internally).
7651 */
7652function GetLocaleNumberAsFinancialNumber(value) {
7653    var toReturn = '';
7654
7655    if (isNaN(value)) {
7656        value = parseFloatFromString(value);
7657    }
7658
7659    if (typeof (Intl) == 'object') {
7660        var numberFormatOptions = {
7661            style: 'currency',
7662            currency: ecommerceConfig.LocalCurrencyCode
7663        };
7664
7665        toReturn = new Intl.NumberFormat(ecommerceConfig.Locale, numberFormatOptions).format(value);
7666    }
7667    else {
7668        toReturn = ecommerceConfig.LocalCurrencySymbol + value;
7669    }
7670
7671    return toReturn;
7672}
7673
7674/**
7675 * Gets locale number string for decimal.
7676 * @param  value The value.
7677 * @param  minDecimalPlaces The minimum decimal places.
7678 * @param  maxDecimalPlaces The maximum decimal places.
7679 * @returns The locale number string for decimal.
7680 */
7681function GetLocaleNumberStringForDecimal(value, minDecimalPlaces, maxDecimalPlaces) {
7682    var toReturn = '';
7683
7684    if (isNaN(value)) {
7685        value = parseFloatFromString(value).toFixed(minDecimalPlaces);
7686    }
7687
7688    if (typeof (Intl) == 'object') {
7689        var numberFormatOptions = {
7690            style: 'decimal',
7691            minimumFractionDigits: minDecimalPlaces,
7692            maximumFractionDigits: maxDecimalPlaces
7693        };
7694
7695        toReturn = new Intl.NumberFormat(ecommerceConfig.Locale, numberFormatOptions).format(value);
7696    }
7697    else {
7698        toReturn = value;
7699    }
7700
7701    return toReturn;
7702}
7703
7704function ConvertAnonymousAccountToFullAccount(username, password, gdprAllowed, promise) {
7705    var detailsToSend = {
7706        username: username,
7707        password: password,
7708        gdprAllowed: gdprAllowed,
7709    };
7710
7711    $.ajax({
7712        type: "POST",
7713        url: "/wsCitrusStore.asmx/ConvertToFullAccount",
7714        data: JSON.stringify(detailsToSend),
7715        contentType: "application/json; charset=utf-8",
7716        dataType: "json",
7717        success: promise.resolve,
7718        error: promise.reject
7719    });
7720}
7721
7722function OnErrorFromCourierIntegration_GetDeliveryQuoteShowModalMessage(err) {
7723    var errorMessageObject = getCourierIntegrationErrorMessageFromObject(err);
7724    if (errorMessageObject.isDotNetError || errorMessageObject.isJqueryError) {
7725        const msgContent = `<div class="col-1">
7726            <p>${GetTranslation('JavaScriptTranslations', 'DevJSCourierIntegrationErrorMessage')}</p>
7727            <p>${errorMessageObject.errorMessage}</p>
7728        </div>
7729        `;
7730
7731        var promiseName = 'CourierIntegration_GetDeliveryQuoteErrorPromise',
7732            messageConfig = GetModularMessageConfig(MODALTYPE_ERROR);
7733
7734        window[promiseName] = $.Deferred();
7735
7736        messageConfig.Header = GetTranslation('JavaScriptTranslations', 'DevJSCourierIntegrationErrorTitle');
7737        messageConfig.Body = msgContent;
7738        messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', 'DevJsCloseButton');
7739
7740        ModularModalMessage(promiseName, messageConfig);
7741    }
7742}
7743
7744function getCourierIntegrationErrorMessageFromObject(err) {
7745    var errorMessageObject = {
7746        isJqueryError: false,
7747        isDotNetError: false,
7748        errorMessage: ''
7749    };
7750
7751    errorMessageObject.isDotNetError = err.hasOwnProperty("_errorObject") && err._errorObject.hasOwnProperty("Message") && err._errorObject.Message.indexOf('invalid value') > -1;
7752    errorMessageObject.isJqueryError = err.hasOwnProperty("Message");
7753
7754    if (errorMessageObject.isDotNetError) {
7755        errorMessageObject.errorMessage = err._errorObject.Message;
7756    }
7757    else if (errorMessageObject.isJqueryError) {
7758        errorMessageObject.errorMessage = err.Message;
7759    }
7760
7761    return errorMessageObject;
7762}
7763
7764/**
7765 * Checks if a script has been added to the DOM with a particular URL
7766 * @param {string} scriptUrl the URL to check
7767 * @returns {boolean} true if script is present, false if not.
7768 */
7769function pageHasScriptWithUrl(scriptUrl) {
7770    return document.querySelectorAll(`script[src="${scriptUrl}"]`).length > 0;
7771}
7772
7773/**
7774 * Adds a script to the head of the page, with a specific URL
7775 * @param {string} scriptUrl the url of the script to add
7776 * @param {Function} callback the callback function to add to the "onload" of the script.
7777 */
7778function addScriptWithUrlToHead(scriptUrl, callback) {
7779    let head = document.getElementsByTagName('head')[0];
7780
7781    let script = document.createElement('script');
7782    script.type = 'text/javascript';
7783    script.src = scriptUrl;
7784    script.onload = callback;
7785
7786    head.appendChild(script);
7787}
7788
7789function SendAnalyticsEvent(...theArguments) {
7790    if (ecommerceConfig.AnalyticsScheme == 'GA4') {
7791        SendGoogleAnalyticsGa4Event(...theArguments);
7792    }
7793    else {
7794        console.error('SendAnalyticsEvent analytics scheme not set. Cannot log events.');
7795    }
7796}
7797
7798const domReady = (callbackFunction) => {
7799    // If we're early to the party
7800    document.addEventListener("DOMContentLoaded", callbackFunction);
7801    // If late; I mean on time.
7802    if (document.readyState === "interactive" || document.readyState === "complete") {
7803        callbackFunction();
7804    }
7805};
7806
7807var ga4QueueInterval = null;
7808
7809domReady(() => {
7810    window.ga4QueueInterval = window.ecommerceConfig.AnalyticsScheme == 'GA4' ?
7811        setInterval(
7812            function () {
7813                new GoogleAnalyticsEventQueue().run();
7814            },
7815            3000)
7816        : null;
7817});
7818
7819/**
7820 * Enqueues a google analytics version 4 event to the event queue
7821 * @param {params unknown} theArguments A variable-length parameters list containing the arguments.
7822 * @returns void.
7823 */
7824function SendGoogleAnalyticsGa4Event(...theArguments) {
7825    new GoogleAnalyticsEventQueue().enqueueEvent(theArguments);
7826}
7827
7828const chunkArray = (arrayToChunk, chunkSize) => {
7829    const chunks = [];
7830
7831    for (var i = 0; i < arrayToChunk.length; i += chunkSize) {
7832        chunks.push(arrayToChunk.slice(i, i + chunkSize));
7833    }
7834
7835    return chunks;
7836};
7837
7838function getAutoSimBrands() {
7839    CitrusStore.CitrusStore.wsCitrusStore.SIM_AutomaticSIM(dumpAutoSimBrands, onFailedWS)
7840}
7841
7842function dumpAutoSimBrands(data) {
7843    data.forEach(function (record) {
7844        if (record.Season === '') {
7845            console.log('Brand ' + record.Brand + ' Season ' + record.Season + 'Item Count ' + record.ItemCount);
7846        }
7847    });
7848}
7849
7850/**
7851 * Provides a first-in-first-out, cross-window/browser-context event queue for GA4 events
7852 * @class Provides a cross-window/browser context event queue for GA4 events
7853 * @classdesc Provides a cross-window/browser context event queue for GA4 events
7854 * @external localStorage uses localStorage for the cache mechanism
7855 * @external gtag uses the window.gtag function to push events to the GA4 library
7856 * @external JSON uses the JSON.stringify and JSON.parse methods whilst saving and retrieving from cache
7857*/
7858class GoogleAnalyticsEventQueue {
7859    /** @type {string}  */
7860    #queueAndDequeueLockKey;
7861
7862    /** @type {string}  */
7863    #intervalLockKey;
7864
7865    /** @type {string}  */
7866    #cacheKey;
7867
7868    /** @type {Array<Array>}  */
7869    #elements;
7870
7871    /**
7872     * @constructs GoogleAnalyticsEventQueue Initialises the cachekey, event array and retrieves existing values from the cache.
7873     * @public
7874     */
7875    constructor() {
7876        this.#queueAndDequeueLockKey = 'ga4QueueDequeueLock';
7877        this.#intervalLockKey = 'ga4QueueIntervalLock';
7878        this.#cacheKey = 'GoogleAnalyticsEventQueue_cache';
7879
7880        this.#setElementsFromCache();
7881        this.#saveToCache();
7882    }
7883
7884    /**
7885     * Sets the elements array using the cache items, or as an empty array if the cache is empty.
7886     * @private
7887    */
7888    #setElementsFromCache() {
7889        this.#elements = this.#getElementsFromCache();
7890    }
7891
7892    /**
7893     * Gets the elements array from the cache.
7894     * @returns {Array<Array>} An array of events
7895     * @private
7896    */
7897    #getElementsFromCache() {
7898        const elementsFromCache = window.localStorage.getItem(this.#cacheKey);
7899
7900        return elementsFromCache
7901            ? JSON.parse(elementsFromCache)
7902            : [];
7903    }
7904
7905    /**
7906     * Saves the current elements array to the cache
7907     * @private
7908    */
7909    #saveToCache() {
7910        const elementsWithATruthyValue = this.#elements.filter(e => e);
7911        window.localStorage.setItem(this.#cacheKey, JSON.stringify(elementsWithATruthyValue));
7912    }
7913
7914    /**
7915     * Processes the current event queue.
7916     * ---
7917     * Locks the event queue to the "winning" browser window i.e. the first context to call this method.
7918     * ---
7919     * If the lock is unable to be acquired, a warning will log into console.
7920     * It's not a problem if the lock can't be acquired, but it's handy to see.
7921     * @public
7922     * @memberof GoogleAnalyticsEventQueue
7923     * @throws {Error} Throws an error if the ga4 library is not yet initialised.
7924     * @returns void.
7925     */
7926    run() {
7927        if (!(typeof window.gtag == 'function')) {
7928            console.error('GoogleAnalyticsEventQueue.run // gtag() not set, cannot log events.');
7929            throw new Error("ga4 must be initialised before running the ga4 event queue.");
7930        }
7931
7932        /* Ensure the events in the queue are up to date */
7933        this.#setElementsFromCache();
7934
7935        if (this.#elements.length) {
7936            navigator.locks.request(
7937                this.#intervalLockKey,
7938                { ifAvailable: true },
7939                (lock) => {
7940                    if (!lock) {
7941                        console.warn('Could not acquire lock for GoogleAnalyticsEventQueue.run. This isn\'t a big issue, it\'s probably in use in another tab/window.');
7942                    }
7943                    else {
7944                        const elementsToDelete = [];
7945
7946                        for (let i = 0; i < this.#elements.length; i++) {
7947
7948                            const currentElement = this.#elements[i];
7949
7950                            if (currentElement.length == 3) {
7951                                window.gtag('event', currentElement[0], currentElement[1]);
7952                            }
7953                            else if (currentElement.length == 4) {
7954                                window.gtag('event', currentElement[1], {
7955                                    'event_category': currentElement[0],
7956                                    'event_label': currentElement[2]
7957                                });
7958                            }
7959                            else if (currentElement.length == 5) {
7960                                window.gtag('event', currentElement[1], {
7961                                    'event_category': currentElement[0],
7962                                    'event_label': currentElement[2],
7963                                    'value': currentElement[3]
7964                                });
7965                            }
7966                            else {
7967                                /* Dequeue the erroneous event */
7968                                this.#dequeueEvents([
7969                                    ...elementsToDelete,
7970                                    currentElement
7971                                ]);
7972                                throw new Error(`Could not log event due to an incorrect number of array items: ${currentElement.length}. Event = ${JSON.stringify(currentElement)}`);
7973                            }
7974
7975                            elementsToDelete.push(this.#elements[i]);
7976                        }
7977
7978                        this.#dequeueEvents(elementsToDelete);
7979
7980                        return true;
7981                    }
7982                })
7983                .catch(err => {
7984                    ErrorLogger(err, 'Incorrect number of array items in analytics event.', 'error');
7985                    console.error('Incorrect number of array items in analytics event. error = ', err);
7986                });
7987
7988        }
7989    }
7990
7991    /**
7992     * Dequeue events
7993     * @param elementsToDelete {Array<Array>} The events to delete from the cache
7994     * @returns void
7995     * @memberof GoogleAnalyticsEventQueue
7996     * @private
7997     * @example this.#enqueueEvent([
7998     *  ['view_item' { the_item_properties }],
7999     *  ['view_item' { the_item_properties }]
8000     * ]);
8001    */
8002    #dequeueEvents(elementsToDelete) {
8003        const hasMatchingDeletionElement = (elementToCheck) => {
8004            const serializedElement = JSON.stringify(elementToCheck);
8005
8006            return elementsToDelete.find(e => JSON.stringify(e) === serializedElement);
8007        }
8008
8009        this.#tryModifyQueue(() => {
8010            this.#setElementsFromCache();
8011
8012            for (let i = 0; i < this.#elements.length; i++) {
8013
8014                if (hasMatchingDeletionElement(this.#elements[i])) {
8015                    delete this.#elements[i];
8016                }
8017            }
8018
8019            this.#saveToCache();
8020        });
8021    }
8022
8023    /**
8024     * Tries to modify the queue. If the lock is unavailable it will retry until it becomes available.
8025     * @param processModificationCallback {Function} the callback to run when the lock becomes available.
8026     * @memberof GoogleAnalyticsEventQueue
8027     * @private
8028    */
8029    #tryModifyQueue(processModificationCallback) {
8030        const tryGetLockIfAvailable = async () => {
8031            await navigator.locks.request(
8032                this.#queueAndDequeueLockKey,
8033                { ifAvailable: true },
8034                (callbackValue) => {
8035                    if (!callbackValue) {
8036                        setTimeout(() => tryGetLockIfAvailable(), 50);
8037                    }
8038                    else {
8039                        processModificationCallback();
8040                    }
8041                });
8042        };
8043
8044        tryGetLockIfAvailable();
8045    }
8046
8047    /**
8048     * Adds a new event to the end of the queue.
8049     * @public
8050     * @memberof GoogleAnalyticsEventQueue
8051     * @example new GoogleAnalyticsEventQueue().enqueueEvent(['view_item' { the_item_properties }]);
8052    */
8053    enqueueEvent(element) {
8054        this.#tryModifyQueue(() => {
8055            this.#setElementsFromCache();
8056
8057            /* Make the event unique with the timestamp. It doesn't matter that this is local time and not UTC */
8058            element.push(new Date().getTime());
8059
8060            this.#elements.push(element);
8061
8062            this.#saveToCache();
8063        });
8064    }
8065}
8066function contactFormPriceMatch()
8067{
8068    var priceMatchPathName = window.location.pathname;
8069    var priceMatchCurrentProduct = $('h1').text();
8070    var pricematchLink = "/pricematch.aspx?RD=" + priceMatchPathName + "&ProductName=" + priceMatchCurrentProduct
8071    $(".priceMatchLink a").attr("href", pricematchLink);
8072    if ($("#ContactForms_panPriceRequest").length)
8073    {
8074        var get = [];
8075        location.search.replace('?', '').split('&').forEach(function (val)
8076        {
8077            split = val.split("=", 2);
8078            get[split[0]] = split[1];
8079        });
8080        var priceMatchName = get["ProductName"]
8081        if (priceMatchName == undefined) { } else
8082        {
8083            var replaced = priceMatchName.replace(/%20/g, " ");
8084            $("input#txtProductNamePM").val(replaced);
8085        }
8086    }
8087    var newAcc1 = "false";
8088    var newAcc2 = "false";
8089    var newAcc3 = "false";
8090    var newAcc4 = "false";
8091    var txtCAFirstName = $("#txtName");
8092    var txtCAFirstNameInfo = $("#txtNameInfo");
8093    txtCAFirstName.blur(validateFirstName);
8094    txtCAFirstName.keyup(validateFirstName);
8095    function validateFirstName()
8096    {
8097        if (txtCAFirstName.val().length < 1)
8098        {
8099            txtCAFirstName.removeClass("completeForm").addClass("errorForm");
8100            txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-ForenameInvalid'));
8101            txtCAFirstNameInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8102            newAcc1 = "false";
8103            valbtnbtnContinue();
8104        }
8105        else
8106        {
8107            txtCAFirstName.removeClass("errorForm").addClass("completeForm");
8108            txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormName'));
8109            txtCAFirstNameInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8110            newAcc1 = "true";
8111            valbtnbtnContinue();
8112        }
8113    }
8114    var txtCAEMail = $("#txtEmail");
8115    var txtCAEMailInfo = $("#txtEmailInfo");
8116    txtCAEMail.blur(validateEmailCA);
8117    txtCAEMail.keyup(validateEmailCA);
8118    function validateEmailCA()
8119    {
8120        var emailAddress = $("#txtEmail").val();
8121        $.when(validateEmail(emailAddress))
8122            .done(function (isValidEmail)
8123            {
8124                if (isValidEmail)
8125                {
8126                    txtCAEMail.removeClass("errorForm").addClass("completeForm");
8127                    txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailValid'));
8128                    txtCAEMailInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8129                    newAcc2 = "true";
8130                    valbtnbtnContinue();
8131                }
8132                else
8133                {
8134                    txtCAEMail.removeClass("completeForm").addClass("errorForm");
8135                    txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailInvalid'));
8136                    txtCAEMailInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8137                    newAcc2 = "false";
8138                    valbtnbtnContinue();
8139                }
8140            });
8141    }
8142    var txtCompetWebsite = $("#txtCompetWebsite");
8143    var txtCompetWebsiteInfo = $("#txtCompetWebsiteInfo");
8144    txtCompetWebsite.blur(validatetxtCompetWebsite);
8145    txtCompetWebsite.keyup(validatetxtCompetWebsite);
8146    function validatetxtCompetWebsite()
8147    {
8148        if (txtCompetWebsite.val().length < 1)
8149        {
8150            txtCompetWebsite.removeClass("completeForm").addClass("errorForm");
8151            txtCompetWebsiteInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-UrlInvalid'));
8152            txtCompetWebsiteInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8153            newAcc3 = "false";
8154            valbtnbtnContinue();
8155        }
8156        else
8157        {
8158            txtCompetWebsite.removeClass("errorForm").addClass("completeForm");
8159            txtCompetWebsiteInfo.html(GetTranslation('JavaScriptTranslations', 'ContactFormUrl'));
8160            txtCompetWebsiteInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8161            newAcc3 = "true";
8162            valbtnbtnContinue();
8163        }
8164    }
8165    var txtPrice = $("#txtPrice");
8166    var txtPriceInfo = $("#txtPriceInfo");
8167    txtPrice.blur(validatetxtPrice);
8168    txtPrice.keyup(validatetxtPrice);
8169    function validatetxtPrice()
8170    {
8171        if (txtPrice.val().length < 1)
8172        {
8173            txtPrice.removeClass("completeForm").addClass("errorForm");
8174            txtPriceInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-PriceInvalid'));
8175            txtPriceInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8176            newAcc4 = "false";
8177            valbtnbtnContinue();
8178        }
8179        else
8180        {
8181            txtPrice.removeClass("errorForm").addClass("completeForm");
8182            txtPriceInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormPrice'));
8183            txtPriceInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8184            newAcc4 = "true";
8185            valbtnbtnContinue();
8186        }
8187    }
8188    function valbtnbtnContinue()
8189    {
8190        if (newAcc1 == 'true' && newAcc2 == 'true' && newAcc3 == 'true' && newAcc4 == 'true')
8191        {
8192            $("#butSend").removeAttr('disabled');
8193            $("#butSend").removeClass("button grey").addClass("button green");
8194            $("#butSend").html(GetTranslation('JavaScriptTranslations', '00Misc-Send'));
8195        } else
8196        {
8197            $("#butSend").attr('disabled', true);
8198            $("#butSend").removeClass("button green").addClass("button grey");
8199            $("#butSend").html(GetTranslation('JavaScriptTranslations', 'ContactFormSubmit'));
8200        }
8201    }
8202    valbtnbtnContinue();
8203}
8204
8205function contactFormStandard()
8206{
8207    var newAcc1 = "false";
8208    var newAcc2 = "false";
8209    var newAcc3 = "false";
8210    var txtCAFirstName = $("#txtName");
8211    var txtCAFirstNameInfo = $("#txtNameInfo");
8212    txtCAFirstName.blur(validateFirstName);
8213    txtCAFirstName.keyup(validateFirstName);
8214    function validateFirstName()
8215    {
8216        if (txtCAFirstName.val().length < 1)
8217        {
8218            txtCAFirstName.removeClass("completeForm").addClass("errorForm");
8219            txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-ForenameInvalid'));
8220            txtCAFirstNameInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8221            newAcc1 = "false";
8222            valbtnbtnContinue();
8223        }
8224        else
8225        {
8226            txtCAFirstName.removeClass("errorForm").addClass("completeForm");
8227            txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormName'));
8228            txtCAFirstNameInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8229            newAcc1 = "true";
8230            valbtnbtnContinue();
8231        }
8232    }
8233    var txtCAEMail = $("#txtEmail");
8234    var txtCAEMailInfo = $("#txtEmailInfo");
8235    txtCAEMail.blur(validateEmailCA);
8236    txtCAEMail.keyup(validateEmailCA);
8237    function validateEmailCA()
8238    {
8239        var emailAddress = $("#txtEmail").val();
8240        $.when(validateEmail(emailAddress))
8241            .done(function (isValidEmail)
8242            {
8243                if (isValidEmail)
8244                {
8245                    txtCAEMail.removeClass("errorForm").addClass("completeForm");
8246                    txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailValid'));
8247                    txtCAEMailInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8248                    newAcc2 = "true";
8249                    valbtnbtnContinue();
8250                }
8251                else
8252                {
8253                    txtCAEMail.removeClass("completeForm").addClass("errorForm");
8254                    txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailInvalid'));
8255                    txtCAEMailInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8256                    newAcc2 = "false";
8257                    valbtnbtnContinue();
8258                }
8259            });
8260    }
8261    var txttxtMessage = $("#txtMessage");
8262    var txttxtMessageInfo = $("#txtMessageInfo");
8263    txttxtMessage.blur(validatetxtMessage);
8264    txttxtMessage.keyup(validatetxtMessage);
8265    function validatetxtMessage()
8266    {
8267        if (txttxtMessage.val().length < 1)
8268        {
8269            txttxtMessage.removeClass("completeForm").addClass("errorForm");
8270            txttxtMessageInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-MessageInvalid'));
8271            txttxtMessageInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8272            newAcc3 = "false";
8273            valbtnbtnContinue();
8274        }
8275        else
8276        {
8277            txttxtMessage.removeClass("errorForm").addClass("completeForm");
8278            txttxtMessageInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormMessage'));
8279            txttxtMessageInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8280            newAcc3 = "true";
8281            valbtnbtnContinue();
8282        }
8283    }
8284    function valbtnbtnContinue()
8285    {
8286        if (newAcc1 == 'true' && newAcc2 == 'true' && newAcc3 == 'true')
8287        {
8288            $("#butSend").removeAttr('disabled');
8289            $("#butSend").removeClass("button grey").addClass("button green");
8290            $("#butSend").html(GetTranslation('JavaScriptTranslations', '00Misc-Send'));
8291        } else
8292        {
8293            $("#butSend").attr('disabled', true);
8294            $("#butSend").removeClass("button green").addClass("button grey");
8295            $("#butSend").html(GetTranslation('JavaScriptTranslations', 'ContactFormSubmit'));
8296        }
8297    }
8298    valbtnbtnContinue();
8299}
8300
8301function contactFormSpecialOrder()
8302{
8303    var newAcc1 = "false";
8304    var newAcc2 = "false";
8305    var newAcc3 = "false";
8306    var txtCAFirstName = $("#txtName");
8307    var txtCAFirstNameInfo = $("#txtNameInfo");
8308    txtCAFirstName.blur(validateFirstName);
8309    txtCAFirstName.keyup(validateFirstName);
8310    function validateFirstName()
8311    {
8312        if (txtCAFirstName.val().length < 1)
8313        {
8314            txtCAFirstName.removeClass("completeForm").addClass("errorForm");
8315            txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-ForenameInvalid'));
8316            txtCAFirstNameInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8317            newAcc1 = "false";
8318            valbtnbtnContinue();
8319        }
8320        else
8321        {
8322            txtCAFirstName.removeClass("errorForm").addClass("completeForm");
8323            txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormName'));
8324            txtCAFirstNameInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8325            newAcc1 = "true";
8326            valbtnbtnContinue();
8327        }
8328    }
8329    var txtCAEMail = $("#txtEmail");
8330    var txtCAEMailInfo = $("#txtEmailInfo");
8331    txtCAEMail.blur(validateEmailCA);
8332    txtCAEMail.keyup(validateEmailCA);
8333    function validateEmailCA()
8334    {
8335        var emailAddress = $("#txtEmail").val();
8336        $.when(validateEmail(emailAddress))
8337            .done(function (isValidEmail)
8338            {
8339                if (isValidEmail)
8340                {
8341                    txtCAEMail.removeClass("errorForm").addClass("completeForm");
8342                    txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailValid'));
8343                    txtCAEMailInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8344                    newAcc2 = "true";
8345                    valbtnbtnContinue();
8346                }
8347                else
8348                {
8349                    txtCAEMail.removeClass("completeForm").addClass("errorForm");
8350                    txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailInvalid'));
8351                    txtCAEMailInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8352                    newAcc2 = "false";
8353                    valbtnbtnContinue();
8354                }
8355            });
8356    }
8357    var txttxtMessage = $("#txtSpecialProductName");
8358    var txttxtMessageInfo = $("#txtSpecialProductNameInfo");
8359    txttxtMessage.blur(validatetxtMessage);
8360    txttxtMessage.keyup(validatetxtMessage);
8361    function validatetxtMessage()
8362    {
8363        if (txttxtMessage.val().length < 1)
8364        {
8365            txttxtMessage.removeClass("completeForm").addClass("errorForm");
8366            txttxtMessageInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-ProductNameInvalid'));
8367            txttxtMessageInfo.removeClass("completeFormInfo").addClass("errorFormInfo");
8368            newAcc3 = "false";
8369            valbtnbtnContinue();
8370        }
8371        else
8372        {
8373            txttxtMessage.removeClass("errorForm").addClass("completeForm");
8374            txttxtMessageInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormProductName'));
8375            txttxtMessageInfo.removeClass("errorFormInfo").addClass("completeFormInfo");
8376            newAcc3 = "true";
8377            valbtnbtnContinue();
8378        }
8379    }
8380    function valbtnbtnContinue()
8381    {
8382        if (newAcc1 == 'true' && newAcc2 == 'true' && newAcc3 == 'true')
8383        {
8384            $("#butSend").removeAttr('disabled');
8385            $("#butSend").removeClass("button grey").addClass("button green");
8386            $("#butSend").html(GetTranslation('JavaScriptTranslations', '00Misc-Send'));
8387        } else
8388        {
8389            $("#butSend").attr('disabled', true);
8390            $("#butSend").removeClass("button green").addClass("button grey");
8391            $("#butSend").html(GetTranslation('JavaScriptTranslations', 'ContactFormSubmit'));
8392        }
8393    }
8394    valbtnbtnContinue();
8395}
8396
8397function sitemapLayout() {
8398    $('.siteMap>ul>li').each(function () {
8399        $(this).addClass('col-4');
8400    });
8401    $('.siteMap a').each(function () {
8402        $(this).removeClass('CSSChild').removeClass('CSSParent')
8403    });
8404}
8405
8406// Hide empty/unncessary table cells from the order totals box.
8407if (window.location.href.toLowerCase().indexOf('/cart/') > -1)
8408{
8409
8410    document.addEventListener("readystatechange", function ()
8411    {
8412        if (document.readyState === "interactive")
8413        {
8414
8415            DeleteCookie(WORKFLOWCOOKIENAME);
8416            trimOrderTotalFields();
8417            showhideCardIconsShoppingCart();
8418            LoadCheckoutButtons();
8419
8420        }
8421    });
8422}
8423
8424function trimOrderTotalFields()
8425{
8426    $('.orderCartWrap .orderTotal td').each(function ()
8427    {
8428        var $e = $(this);
8429        if ($.trim($e.html()) == "" || $.trim($e.html()) == "&nbsp;")
8430        {
8431            $e.hide();
8432        }
8433    });
8434}
8435
8436function showhideCardIconsShoppingCart()
8437{
8438    showHideCardIcons('#cart-paymenticons');
8439}
8440
8441function LoadCheckoutButtons()
8442{
8443
8444    var buttonSchema = GetActiveWorkflowButtons();
8445    for (var i = 0; i < buttonSchema.length; i++) {
8446        if (buttonSchema[i] && (buttonSchema[i].name.indexOf('citruspaywallet') > -1 || buttonSchema[i].name.toLowerCase().indexOf('citruspaystripeclearpayafterpay') > -1)) {
8447            delete buttonSchema[i];
8448        }
8449    }
8450
8451    var $target = $('#ShoppingCartButtonPlaceholder');
8452    $target.replaceWith(GetCheckoutWorkflowButtonHtml(buttonSchema, $target.attr('data-href')));
8453
8454    CheckIfKlarnaAvailable();
8455    CheckIfFinanceAvailable();
8456}
8457
8458function GetCheckoutWorkflowButtonHtml(buttons, checkoutLink)
8459{
8460    var buttonHtml = '';
8461    var BUTTONTEMPLATE = '<a href="' + checkoutLink + '/" data-type="[[NAME]]" class="col-1 pos-rel button bSquare buttonChkOut ctrMgr8-top ctrMgr8-bottom autoCheckoutButton" style="background-color:[[BGCOLOUR]]; background:[[BGCOLOUR]];" onclick="GoToCheckout($(this), event);" [[DISABLED]]>[[BUTTONCONTENT]]</a>';
8462    for (var i = 0; i < buttons.length; i++)
8463    {
8464        if (buttons[i])
8465        {
8466            var isButtonWhichNeedsAdditionalCheck = (buttons[i].name.toLowerCase() === 'klarna' || buttons[i].name.toLowerCase() === 'finance');
8467            if (isButtonWhichNeedsAdditionalCheck)
8468            {
8469                buttonHtml += '<div class="col-1 pos-rel"><div id="stateful-loader-' + buttons[i].name.toLowerCase() + '" class="stateful-loader"><div class="stateful-checkmark stateful-error"></div></div>';
8470            }
8471
8472            buttonHtml += BUTTONTEMPLATE.replace(/\[\[BGCOLOUR\]\]/gm, buttons[i].color)
8473                .replace('[[BUTTONCONTENT]]', buttons[i].content)
8474                .replace('[[NAME]]', buttons[i].name)
8475                .replace('[[DISABLED]]', (isButtonWhichNeedsAdditionalCheck ? 'disabled' : ''));
8476
8477            if (isButtonWhichNeedsAdditionalCheck)
8478            {
8479                buttonHtml += '</div>';
8480            }
8481        }
8482    }
8483
8484    return buttonHtml;
8485}
8486
8487function CheckIfFinanceAvailable()
8488{
8489    var $financeButton = $('.autoCheckoutButton[data-type="Finance"]'),
8490        financeLoaderId = 'stateful-loader-finance',
8491        disabledAttributeName = 'disabled';
8492
8493    var defer = $.Deferred();
8494
8495    $.ajax({
8496        type: "POST",
8497        url: '/wsCitrusStore.asmx/WightLoadBasketFinanceControl',
8498        data: '{}',
8499        contentType: "application/json; charset=utf-8",
8500        dataType: "json",
8501        success: function (data)
8502        {
8503            var financeAvail = data.d.indexOf('<div id="financecalc"') > -1;
8504            if (financeAvail)
8505            {
8506                $financeButton.siblings('#' + financeLoaderId).fadeOut();
8507                $financeButton.removeAttr(disabledAttributeName);
8508            }
8509            else
8510            {
8511                $financeButton.attr(disabledAttributeName, disabledAttributeName);
8512                $financeButton.parent().slideUp();
8513            }
8514            defer.resolve(financeAvail);
8515        },
8516        error: function (e)
8517        {
8518            $financeButton.attr(disabledAttributeName, disabledAttributeName);
8519            $financeButton.parent().slideUp();
8520            defer.resolve(false);
8521        }
8522    });
8523
8524    return defer;
8525}
8526
8527function CheckIfKlarnaAvailable()
8528{
8529    var $klarnaButton = $('.autoCheckoutButton[data-type="Klarna"]'),
8530        klarnaLoaderId = 'stateful-loader-klarna',
8531        disabledAttributeName = 'disabled';
8532
8533    StatefulLoaderReset(klarnaLoaderId);
8534    $klarnaButton.attr(disabledAttributeName, disabledAttributeName);
8535    $klarnaButton.siblings('#' + klarnaLoaderId).show();
8536
8537    if (typeof ecommerceConfig.ActivePaymentMethods.Klarna === "undefined")
8538    {
8539        $klarnaButton.attr(disabledAttributeName, disabledAttributeName);
8540        $klarnaButton.parent().slideUp();
8541    }
8542    else
8543    {
8544        $.ajax({
8545            url: '/wsCitrusStore.asmx/IsKlarnaAvailable',
8546            type: 'POST',
8547            data: '{}',
8548            contentType: "application/json; charset=utf-8",
8549            dataType: "json",
8550            success: function (data)
8551            {
8552                StatefulLoader(klarnaLoaderId, data.d.KlarnaAvailableOnThisBasket);
8553                if (data.d.KlarnaAvailableOnThisBasket)
8554                {
8555                    $klarnaButton.siblings('#' + klarnaLoaderId).fadeOut();
8556                    $klarnaButton.removeAttr(disabledAttributeName);
8557                }
8558                else
8559                {
8560                    if (data.d.KlarnaAvailable && data.d.MinimumSpend > 0
8561                        && $('#klarnaNotAvailableOnThisBasket') != null
8562                        && $('#klarnaMinimumSpend') != null) {
8563
8564                        $('#klarnaMinimumSpend').text(GetLocaleNumberAsFinancialNumber(data.d.MinimumSpend));
8565                        $('#klarnaNotAvailableOnThisBasket').show();
8566                    }
8567
8568                    $klarnaButton.attr(disabledAttributeName, disabledAttributeName);
8569                    $klarnaButton.parent().slideUp();
8570                }
8571            },
8572            error: function ()
8573            {
8574                StatefulLoader(klarnaLoaderId, false);
8575                $klarnaButton.attr(disabledAttributeName, disabledAttributeName);
8576                $klarnaButton.parent().slideUp();
8577            }
8578        });
8579    }
8580}
8581
8582var WORKFLOWCOOKIENAME = 'CHECKOUTWORKFLOW';
8583
8584function GoToCheckout(el, event)
8585{
8586    event.preventDefault();
8587    var workflow = el.attr('data-type');
8588    setCookieWithDays(WORKFLOWCOOKIENAME, workflow, 1);
8589
8590    window.location = el.attr('href');
8591}
8592function instagram (URL,totalPost,productLink,hashtag) {
8593	if(productLink) {
8594        $(".instagramContent").addClass("instaLinked");
8595    }
8596	$.ajax({
8597		type: "GET",
8598		dataType: "jsonp",
8599		cache: false,
8600		url: URL,
8601		success: function(data) {
8602				console.log(data);
8603				$(".instagramTitle").append("<div class='instagramPicture'><img src='"+data.data[0].user.profile_picture+"'></div><a target='_blank' href='https://www.instagram.com/"+data.data[0].user.username+"' class='instagramUsername'>#"+data.data[0].user.username+"</a></div>");
8604				runInsta();
8605				function runInsta() {
8606					for(var i=0; i< totalPost; i++) {
8607						//render()
8608						var x = 0;
8609						var currpos = i;
8610						var pq = 0;
8611						if(productLink) {
8612							$.each(data.data[i].tags, function(x, currpos){
8613								var id = this.valueOf();
8614								if (id.indexOf(hashtag) !== -1) {
8615									prodID = id.substring(hashtag.length, id.length);
8616									pq = prodID;
8617									CitrusStore.CitrusStore.wsCitrusStore.GetProductLW(prodID, SucceededGetProductCallbackProduct, onFailedWS);
8618
8619								}
8620								function SucceededGetProductCallbackProduct(result) {
8621									console.log(result);
8622									var styles1 = {
8623										background: 'url("/'+result.ImageLargePath+'") no-repeat 50% 50% #fff',
8624										backgroundSize: 'contain',
8625									};
8626									$('.instagramContent li[data-productid="'+result.uid+'"] .instComments').append('<a class="instaproductpics" href="'+result.Link+'"></a>');
8627									$('.instagramContent li[data-productid="'+result.uid+'"] .instComments .instaproductpics').css(styles1);
8628									$('.instagramContent li[data-productid="'+result.uid+'"] .instComments .instaproductpics').append('<div class="instaproductPrice">£'+result.SalePrice+'</div>');
8629
8630								}
8631							});
8632						}
8633						$(".instagramContent").append("<li data-index='"+i+"' data-productid='"+pq+"'><a class='autosize' target='_blank' href='"+data.data[i].link+"' style='position:relative;z-index:1;'><img src='" + data.data[i].images.standard_resolution.url +"' width='490'></img><div class='instComments'><div class='likes'>"+data.data[i].likes.count+"</div><div class='comments'>"+data.data[i].comments.count+"</div><div class='caption'>"+data.data[i].caption.text+"</div></div></a></li>");
8634					}
8635				}
8636
8637		}
8638	});
8639}function sApproved () {
8640    //sApprovedOverview("https://www.shopperapproved.com/api/sites/?siteid=10116&token=Tz415ZRFcbQgKCq&jsonp=?");
8641    //sApprovedReviews("https://www.shopperapproved.com/api/reviews/?siteid=10116&token=Tz415ZRFcbQgKCq&sort=newest&jsonp=?");
8642}
8643
8644function sApprovedOverview() {
8645
8646    $.ajax({
8647		crossDomain: true,
8648		type:"GET",
8649		headers: { 'Access-Control-Allow-Origin': '*' },
8650		dataType: 'jsonp',
8651        contentType: "application/json",
8652		url: URL,
8653		error: function(xhr, status, error) {
8654            console.log(error.message);
8655        },
8656		success: function(result){
8657
8658			// Do something with it
8659			var sitename = result.site;
8660			var siteurl = result.url;
8661			var sitecount = result.review_count;
8662			var siteavg = result.average;
8663			var reviewStarValue;
8664
8665			$('.fReviewRate').append(siteavg);
8666			$('.fReviewCount').append(sitecount);
8667
8668            var
8669			html = '<div class="reviewOverview col-1">'; //Opens Div
8670            html += '<h2>An Average rating of <span id="siteavgval">' + siteavg + ' / 5</span> from <span>' + sitecount + '</span> verified customers.</h2>';
8671			html += '<div class="col-1"><a href="http://www.shopperapproved.com/reviews/' + sitename + '/">View all reviews</a></div>' ;
8672			html += '</div>' ; //Closes Div
8673
8674            $('#tReviewOverview').append($(html));
8675
8676			if (siteavg === "0.0") {
8677				reviewStarValue = "<span>    </span>";
8678			}
8679
8680			if ((siteavg > "0.0") && (siteavg < "1.0")) {
8681				reviewStarValue = "<span>    </span>";
8682			}
8683
8684			if (siteavg === "1.0") {
8685				reviewStarValue = "<span>    </span>";
8686			}
8687
8688			if ((siteavg > "1.0") && (siteavg < "2.0")) {
8689				reviewStarValue = "<span>    </span>";
8690			}
8691
8692			if (siteavg === "2.0") {
8693				reviewStarValue = "<span>    </span>";
8694			}
8695
8696			if ((siteavg > "2.0" && siteavg < "3.0")) {
8697				reviewStarValue = "<span>    </span>";
8698			}
8699
8700			if (siteavg === "3.0") {
8701				reviewStarValue = "<span>    </span>";
8702			}
8703
8704			if ((siteavg > "3.0") && (siteavg < "4.0")) {
8705				reviewStarValue = "<span>    </span>";
8706			}
8707
8708			if (siteavg === "4.0") {
8709				reviewStarValue = "<span>    </span>";
8710			}
8711
8712			if ((siteavg > "4.0") && (siteavg < "4.5")) {
8713				reviewStarValue = "<span>    </span>";
8714			}
8715
8716			if (siteavg > "4.5") {
8717				reviewStarValue = "<span>    </span>";
8718			}
8719			else {}
8720
8721			$('.reviewStars').append(reviewStarValue);
8722
8723			// This is the end ...
8724
8725    	}
8726	});
8727}
8728
8729
8730function sApprovedReviews(URL) {
8731    
8732    $.ajax({
8733		crossDomain: true,
8734		type:"GET",
8735		headers: { 'Access-Control-Allow-Origin': '*' },
8736		dataType: 'jsonp',
8737        contentType: "application/json",
8738		url: URL,
8739		error: function(xhr, status, error) {
8740            console.log(error.message);
8741        },
8742		success: function(result){
8743
8744			// Do something with it
8745            console.log(result)
8746			$.each(result, function (index, data) {
8747
8748                console.log(data.displaydate)
8749				var reviewname = data.name;
8750				var reviewdate = data.displaydate;
8751				var reviewcomment = data.textcomments;
8752				var reviewurl = data.fullurl;
8753                var reviewRate = data.Overall;
8754                var reviewLocation = data.location;
8755                
8756				if (reviewcomment == "") {
8757					var reviewcomment = "Customer left no comment";
8758				}
8759				var
8760				html = '<div class="ctrPad16 col-2"><div class="reviewBox col-1 ctrPad16">'; //Opens Div
8761				html += '<h4> ' + reviewRate + '<span>Overall</span></h4>' ;
8762				html += '<h3>' + reviewname + '<span>Submitted: ' + reviewdate + '</span></h3>';
8763                html += '<div class="col-1 reviewComment"><p><strong>Customer Comment...</strong> ' + reviewcomment + '<br>' + reviewLocation + '</p></div>' ;
8764				html += '<div class="col-1"><a href="' + reviewurl + '">View full review</a></div>' ;
8765				html += '</div></div>' ; //Closes Div
8766
8767				$('#tReviewBox').append($(html));
8768
8769			});
8770    	}
8771	});
8772}function brandPageSorting()
8773{
8774    $('.sortMe').each(function ()
8775    {
8776        var toMove = $(this);
8777        var firstLetterOfBrand = toMove.html().charAt(0).toLowerCase();
8778        if (isNaN(parseFloat(firstLetterOfBrand)))
8779        {
8780            toMove.appendTo("#brand" + firstLetterOfBrand.toUpperCase());
8781        } else
8782        {
8783            toMove.appendTo("#brand09");
8784        }
8785    });
8786}
8787/* Purposefully empty - this is a duplicate file */function toggleDark(){
8788	$(".toggleDark").click(function(){
8789		$("html").toggleClass("dark");
8790	});
8791}
8792if (window.location.href.indexOf('/pages/starbuys') > -1) {
8793
8794    document.addEventListener("readystatechange", function () {
8795        if (document.readyState === "interactive") {
8796
8797            $.ajax({
8798                type: "POST",
8799                url: "/wsCitrusStore.asmx/getAllStarBuysV2",
8800                data: '{}',
8801                contentType: "application/json; charset=utf-8",
8802                dataType: "json",
8803                success: function (data) {
8804
8805                    var starBuysList = JSON.parse(data.d);
8806                    
8807                    for (var i = 0; i < starBuysList.length; i++) {
8808
8809                        var offerAppliesToText = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '08StarbuysV2Page-OfferAppliesProductX0Name'), starBuysList[i].AppliesToName);
8810                        var offerProduct = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '08StarbuysV2Page-ViewOfferX0Product'), starBuysList[i].ItemName);
8811                        var offerExpireText = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '08StarbuysV2Page-ExpiresOnX0Date'), starBuysList[i].OfferExpiry)
8812                        var offerTagLineText = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '08StarbuysV2Page-TaglineX0Product'), starBuysList[i].ItemName)
8813                        var endsSoonClass = ((starBuysList[i].IsEndingSoon) ? "sb-ends-soon" : "");
8814
8815                        $('#sbpagev2-all-starbuys').append(`
8816                            <a href="${starBuysList[i].Itemlink}" class="col-2 ctrPad8" alt="${offerProduct}" title="${offerProduct}">
8817                                <div class="col-1 ctrPad32 sbv2-page-bg ${endsSoonClass}">
8818                                    <div class="col-1 small ctrMgr4-bottom">${offerExpireText}</div>
8819                                    <div class="col-1 boldfont ctrMgr4-bottom">${starBuysList[i].PromoText}</div>
8820                                    <div class="col-1 small ctrMgr8-bottom">${offerTagLineText}</div>
8821                                    <div class="col-1 small sbv2-page---appto">${offerAppliesToText}</div>
8822                                </div>
8823                            </a>
8824                        `);
8825                    }
8826                },
8827                error: function (data) {
8828                    console.log('getAllStarBuysV2 : error = ', data);
8829                }
8830            });
8831
8832        }
8833    });
8834}
8835
8836/**
8837 * Gets the value of a URL parameter based on the parameter name
8838 * @param {string} sParam The parameter name to get the value of
8839 */ 
8840var getUrlParameter = function getUrlParameter(sParam) {
8841    var sPageURL = window.location.search.substring(1),
8842        sURLVariables = sPageURL.split('&'),
8843        sParameterName,
8844        i;
8845
8846    for (i = 0; i < sURLVariables.length; i++) {
8847        sParameterName = sURLVariables[i].split('=');
8848
8849        if (sParameterName[0] === sParam) {
8850            return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
8851        }
8852    }
8853};
8854
8855/**
8856 * Loads the product data from the array of product IDs (var productuids)
8857 */ 
8858function runcompare() {
8859
8860    var productuids = getUrlParameter('p'),
8861        productCompareRunLength = 0,
8862        productCompareHasRun = false,
8863        ProductCompareStats = {
8864            Prices: {
8865                highest: null,
8866                lowest: null,
8867                average: null,
8868                avg: 0,
8869                sum: 0,
8870                all: [],
8871                PriceTemplate: function (n, p) {
8872                    this.name = n;
8873                    this.price = p;
8874                },
8875                currency: ''
8876            }
8877        };
8878
8879    if (productuids) {
8880        productuids = productuids.split(',');
8881        productCompareRunLength = productuids.length;
8882    }
8883
8884    if (productuids && productCompareRunLength > 0) {
8885        $('h1>span').text(productCompareRunLength);
8886        for (var i = 0; i < productCompareRunLength; i++) {
8887            CitrusStore.CitrusStore.wsCitrusStore.GetProductLW(productuids[i], function (data) {
8888                ProductCompareStats = successfulCallbackProductCompareModular(data, ProductCompareStats);
8889                productCompareHasRun = (i == productCompareRunLength);
8890                if (productCompareHasRun) {
8891                    buildCompareStats(ProductCompareStats);
8892                }
8893            }, onFailedWS);
8894        }
8895    }
8896}
8897
8898/**
8899 * Callback for the GetProductLW WebService called inside runcompare() function
8900 * @param {object} result The data retrieved from the WebService
8901 */ 
8902function successfulCallbackProductCompareModular(result, productCompareStats) {
8903
8904    /* Update Object */
8905    productCompareStats.Prices.all.push(new productCompareStats.Prices.PriceTemplate(result.Name, result.SalePrice));
8906    productCompareStats.Prices.currency = result.CurrencySymbol;
8907
8908    var html = '';
8909    /* Open */
8910    html += '<div id="cp' + result.uid + '" data-sku="' + result.Code + '" data-puid="' + result.uid + '" data-name="' + result.Name + '" class="col-4 ctrPad16">';
8911    /* Info */
8912    html += '<div class="col-1 imgCtr border1 bgContain" style="background:url(\'/' + result.ImageLargePath + '?width=500&height=500&format=webp&bgcolor=ffffff&quality=80\') no-repeat center center"></div>';
8913    html += '<div class="col-1 ctrPad16-top">';
8914    /* Pricing */
8915    html += '<div class="col-1 zflex-s">';
8916    html += '<div class="col- flex-grow1">&pound;' + result.SalePrice.toFixed(2) + '</div>';
8917    if (result.IsOnSale) {
8918        html += '<div class="col- co888"><em><s>was &pound;' + result.Price.toFixed(2) + '</s></em></div>';
8919    } else {
8920        html += '<div class="col- co888">&nbsp;</div>';
8921    }
8922    html += '</div>';
8923    /* Name */
8924    html += '<div class="col-1 ctrMgr8-top ctrMgr16-bottom ctrPad16-bottom border1 removeborder-left removeborder-right removeborder-top large compare-min-height">' + result.Name + '</div>';
8925    /* Short Desc */
8926    html += '<div class="col-1 ctrMgr16-bottom ctrPad16-bottom border1 removeborder-left removeborder-right removeborder-top small">' + result.ShortDescription + '</div>';
8927    html += '</div>';
8928    /* View product link */
8929    html += '<div class="col-1 printhide">';
8930    html += `<div class="col- ctrPad16-right"><a href="${result.Link}" class="cpointer button btn-border" target="new">${GetTranslation('JavaScriptTranslations', '09ProductCompare-ViewProduct')}</a></div>`;
8931    html += '</div>';
8932    /* Close */
8933    html += '</div>';
8934    $('#comparetgt').append(html);
8935
8936    return productCompareStats;
8937}
8938
8939/**
8940 * Gets/Sets the high/middle/low priced item objects inside the ProductCompareStats object
8941 */ 
8942function buildCompareStats(productCompareStats) {
8943    productCompareStats.Prices.sum = productCompareStats.Prices.all.reduce(function(total, current, index, array) {
8944        if (isNaN(total)) {total = total.price;}
8945        total += current.price;
8946        return total;
8947    }, 0);
8948    productCompareStats.Prices.avg = parseFloat((productCompareStats.Prices.sum / productCompareStats.Prices.all.length));
8949    // set lowest and highest prices
8950    productCompareStats.Prices.highest = productCompareStats.Prices.all.reduce(function (highest, item) {
8951        return highest.price > item.price ? highest : item;
8952    });
8953    productCompareStats.Prices.lowest = productCompareStats.Prices.all.reduce(function (highest, item) {
8954        return highest.price < item.price ? highest : item;
8955    });
8956    productCompareStats.Prices.average = closestValue(productCompareStats.Prices.all, productCompareStats.Prices.avg);
8957
8958    addCompareStatsToUI("highest", productCompareStats);
8959    addCompareStatsToUI("lowest", productCompareStats);
8960    addCompareStatsToUI("average", productCompareStats);
8961
8962    $('#comparetgt, #comparestats').css('opacity', '1');
8963}
8964
8965/**
8966 * Adds the comparison statistics to the UI
8967 * @param {string} type The type of statistic; options are [highest, lowest, average]. These values relate to various object keys and javascript selectors.
8968 */ 
8969function addCompareStatsToUI(type, productCompareStats) {
8970    $('[data-element="' + type + 'price-value"]').text(productCompareStats.Prices.currency + productCompareStats.Prices[type].price.toFixed(2));
8971    $('[data-element="' + type + 'price-name"]').text(productCompareStats.Prices[type].name);
8972    $('#comparetgt >
8972 [data-name="' + productCompareStats.Prices[type].name + '"]').attr('data-before-tag', type);
8973}
8974
8975/**
8976 * Gets the closest item in an array based on a a value
8977 * @param {object} array The array to search. Uses the item[i].price value to determine the closest item
8978 * @param {integer} value The value in which to compare the items.
8979 */ 
8980function closestValue(array, value) {
8981    var result,
8982        lastDelta;
8983    array.some(function (item) {
8984        var delta = Math.abs(value - item.price);
8985        if (delta >= lastDelta) {
8986            return true;
8987        }
8988        result = item;
8989        lastDelta = delta;
8990    });
8991    return result;
8992}
8993
8994/**
8995 * Opens a new email window with a site-specific subject and link to the comparison page.
8996 */ 
8997function emailCurrentPage() {
8998    window.location.href = `mailto:?subject=${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '09ProductCompare-MailLinkX0Site'), '<%= writeTitle().ToString() %>')}&body=${escape(window.location.href)}`;
8999}
9000function GetContactFormValue(elementID) {
9001    return ($(elementID).val() !== undefined ? $(elementID).val() : "")
9002}
9003
9004function PostContactForm(e) {
9005    e.preventDefault();
9006
9007    ToggleContactFormButtons(false, false);
9008
9009    if (typeof grecaptcha !== 'undefined' &&
9010        typeof reCaptchaPublicKey !== 'undefined' &&
9011        grecaptcha &&
9012        reCaptchaPublicKey) {
9013        grecaptcha.ready(() => {
9014            grecaptcha.execute(reCaptchaPublicKey, { action: 'submit' })
9015                .then((token) => {
9016                    ContactSubmitSuccessful(token);
9017                });
9018        });
9019    }
9020    else {
9021        ContactSubmitSuccessful('');
9022    }
9023}
9024
9025function ContactSubmitSuccessful(reCaptchaResponse) {
9026    const postData = {
9027        emailAddress: GetContactFormValue('#txtEmail'),
9028        name: GetContactFormValue('#txtName'),
9029        phone: GetContactFormValue('#txtPhone'),
9030        orderNum: GetContactFormValue('#txtOrder'),
9031        messageBody: GetContactFormValue('#txtMessage'),
9032        isPriceRequest: ($('#txtProductNamePM').val() !== undefined),
9033        isSpecialOrder: ($('#txtSpecialProductName').val() !== undefined),
9034        productName: '',
9035        modelDesc: '',
9036        sizeReq: '',
9037        colour: '',
9038        competWebsite: '',
9039        competPrice: '',
9040        comments: '',
9041        reCaptchaResponse
9042    };
9043
9044    if (postData.isPriceRequest) {
9045        postData.productName = GetContactFormValue('#txtProductNamePM');
9046        postData.competWebsite = GetContactFormValue('#txtCompetWebsite');
9047        postData.competPrice = GetContactFormValue('#txtPrice');
9048        postData.comments = GetContactFormValue('#txtComments');
9049    } else if (postData.isSpecialOrder) {
9050        postData.productName = GetContactFormValue('#txtSpecialProductName');
9051        postData.modelDesc = GetContactFormValue('#txtSpecialModel');
9052        postData.sizeReq = GetContactFormValue('#txtSizeRequested');
9053        postData.colour = GetContactFormValue('#txtColourRequested');
9054    }
9055
9056    var postDataStr = JSON.stringify(postData);
9057    var promiseName = 'ContactFormSubmittedPromise';
9058    var messageConfig;
9059
9060    window.ContactFormSubmittedPromise = $.Deferred();
9061
9062    $.ajax({
9063        type: 'POST',
9064        url: '/wsCitrusStore.asmx/SubmitContactForm',
9065        data: postDataStr,
9066        contentType: 'application/json; charset=utf-8',
9067        dataType: 'json',
9068        success: function (data) {
9069            var contactFormResults = JSON.parse(data.d);
9070
9071            $('#butSend').toggle(!contactFormResults.status);
9072
9073            if (contactFormResults.status) {
9074                ToggleContactFormButtons(false, true);
9075
9076                messageConfig = GetModularMessageConfig(MODALTYPE_SUCCESS);
9077                messageConfig.Header = GetTranslation('JavaScriptTranslations', '10ContactForm-ContactFormSubmittedHeader');
9078                messageConfig.Body = GetTranslation('JavaScriptTranslations', '10ContactForm-ThanksForYourMessage');
9079                messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '10ContactForm-OkayButtonText');
9080                ModularModalMessage(promiseName, messageConfig);
9081            }
9082            else if (contactFormResults.ErrorMsg.includes('ReCaptcha')) {
9083                ContactSubmitFail();
9084            }
9085            else {
9086                ToggleContactFormButtons(true, true);
9087
9088                messageConfig = GetModularMessageConfig(MODALTYPE_ERROR);
9089                messageConfig.Header = GetTranslation('JavaScriptTranslations', '10ContactForm-ErrorHeader');
9090                messageConfig.Body = contactFormResults.ErrorMsg;
9091                messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '10ContactForm-OkayButtonText');
9092
9093                ModularModalMessage(promiseName, messageConfig);
9094            }
9095        },
9096        error: function (e) {
9097            ToggleContactFormButtons(true, true);
9098
9099            var errorMessage = GetTranslation('JavaScriptTranslations', '10ContactForm-AnErrorHasOccurredWhenAttemptingToValidateYourSessionMessage');
9100
9101            messageConfig = GetModularMessageConfig(MODALTYPE_ERROR);
9102            messageConfig.Header = GetTranslation('JavaScriptTranslations', '10ContactForm-ErrorHeader');
9103            messageConfig.Body = errorMessage;
9104            messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '10ContactForm-OkayButtonText');
9105            ModularModalMessage(promiseName, messageConfig);
9106            ErrorLogger(e, errorMessage);
9107        }
9108    });
9109
9110}
9111
9112function ResetContactForm() {
9113    $.each(["#txtName", "#txtPhone", "#txtOrder", "#txtMessage", "#txtProductNamePM", "#txtSpecialProductName", "#txtProductNamePM", "#txtCompetWebsite", "#txtPrice", "#txtComments", "#txtSpecialProductName", "#txtSpecialModel", "#txtSizeRequested", "#txtColourRequested", "#txtEmail"], function (index, formItemSelector) {
9114        var formItem = $(formItemSelector);
9115        if (formItem.length) {
9116            formItem.val('');
9117        }
9118    });
9119
9120    $('#butSend').show();
9121    $('#ResetButton').hide();
9122
9123    ToggleContactFormButtons(false, false);
9124}
9125
9126function ToggleContactFormButtons(enableSendButton, enableResetButton) {
9127    if (!enableSendButton) {
9128        $('#butSend').prop('disabled', true);
9129    }
9130    else {
9131        $('#butSend').removeProp('disabled');
9132    }
9133
9134    if (!enableResetButton) {
9135        $('#ResetButton').prop('disabled', true);
9136    }
9137    else {
9138        $('#ResetButton').removeProp('disabled');
9139    }
9140}
9141
9142function ContactSubmitFail() {
9143    var messageConfig = GetModularMessageConfig(MODALTYPE_ERROR);
9144
9145    messageConfig.Header = GetTranslation('JavaScriptTranslations', '10ContactForm-ErrorHeader');
9146    messageConfig.Body = GetTranslation('JavaScriptTranslations', '10ContactForm-AnErrorHasOccurredWhenAttemptingToValidateYourSessionMessage');
9147    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '10ContactForm-OkayButtonText');
9148
9149    window.ContactFormSubmitFailedPromise = $.Deferred();
9150
9151    ModularModalMessage('ContactFormSubmitFailedPromise', messageConfig);
9152}
9153var NEWBASKETGLOBALVARS = {};
9154
9155
9156
9157function LoadNewBasket() {
9158    CartOnloadMessageHandler();
9159    NEWBASKETGLOBALVARS.PRODUCTTEMPLATE = GetProductTemplate();
9160    NEWBASKETGLOBALVARS.SHIPPINGTEMPLATE = GetShippingOptionTemplate();
9161    NEWBASKETGLOBALVARS.CURRENCYTEMPLATE = GetCurrencyTemplate();
9162    NEWBASKETGLOBALVARS.CTABUBBLETEMPLATE = GetCTABubbleTemplate();
9163
9164    DeleteCookie(WORKFLOWCOOKIENAME);
9165
9166    GetCartInitialise();
9167
9168    document.addEventListener('ItemAddedToBasket', () => {
9169        GetCartInitialise();
9170    });
9171
9172    document.addEventListener('PaymentButtonClicked', () => {
9173        SendGA4BeginCheckout();
9174    });
9175}
9176
9177function SendGA4BeginCheckout() {
9178    if (ecommerceConfig.AnalyticsScheme != 'GA4' || !ecommerceConfig.GoogleAnalyticsClientSidePostingEnabled) {
9179        return;
9180    }
9181
9182    const items = [];
9183
9184    for (const item of NEWBASKETGLOBALVARS.PRODUCTS) {
9185        items.push({
9186            "item_id": item.ProductCode,
9187            "item_name": item.Name,
9188            "item_variant": item.AttributeCode || '',
9189            "price": item.SalePrice,
9190            "quantity": item.Quantity
9191        });
9192    }
9193
9194    window.gtag('event', 'begin_checkout', {
9195        "currency": ecommerceConfig.LocalCurrencyCode,
9196        "value": NEWBASKETGLOBALVARS.MERCHANDISETOTAL,
9197        "items": items
9198    });
9199}
9200
9201function GetCartInitialise() {
9202    CitrusStore.CitrusStore.wsCitrusStore.GetMiniBasket(SucceededLoadNewBasket,
9203        function(err) {
9204            onFailedWS(err);
9205            FailedLoadNewBasket(err);
9206        });
9207}
9208
9209const CHECKOUT_ERROR_KEY_TO_RESOURCE_ID = {
9210    FailedToBegin: '11NewBasket-CheckoutError-FailedToBegin',
9211    NoCartLines: '11NewBasket-CheckoutError-NoCartLines',
9212    StockCheckFailed: '11NewBasket-CheckoutError-StockCheckFailed',
9213};
9214
9215const CHECKOUT_ERROR_DEFAULT_RESOURCE_ID = '11NewBasket-CheckoutError';
9216
9217function CartOnloadMessageHandler() {
9218    const checkoutErrorParamName = 'checkoutError';
9219
9220    let searchParams = new URLSearchParams(window.location.search.replace('?', ''));
9221
9222    if (!searchParams.has(checkoutErrorParamName)) {
9223        return;
9224    }
9225
9226    const key = searchParams.get(checkoutErrorParamName);
9227
9228    const resourceId = CHECKOUT_ERROR_KEY_TO_RESOURCE_ID.hasOwnProperty(key) ?
9229        CHECKOUT_ERROR_KEY_TO_RESOURCE_ID[key] :
9230        CHECKOUT_ERROR_DEFAULT_RESOURCE_ID;
9231
9232    GenericNewCartError(GetTranslation('JavaScriptTranslations', resourceId));
9233}
9234
9235function FailedLoadNewBasket(err) {
9236    var errorObj = getCourierIntegrationErrorMessageFromObject(err);
9237
9238    if (errorObj.isDotNetError || errorObj.isJqueryError) {
9239        var basketWrapperEl = document.querySelector('.basket-wrapper .container');
9240        basketWrapperEl.innerHTML = `<div class="col-1 ctrPad32"><div class="col-1 ctrPad32 coRED bgLRed x-large ctrMgr32-top ctrMgr32-bottom">${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-CannotContinueErrorX0Message'), errorObj.errorMessage)}</div></div>`;
9241    }
9242}
9243
9244function SucceededLoadNewBasket(result) {
9245
9246    if (result === null) {
9247        TogglePageLoading(false);
9248        GenericNewCartError(GetTranslation('JavaScriptTranslations', '11NewBasket-LoadingError'));
9249        return;
9250    }
9251
9252    CheckStockErrors(result); /* ShowStockErrors must always be first in this function - moving this will result in annoyance and a broken page */
9253
9254    NEWBASKETGLOBALVARS.PRODUCTS = PopulateProductArray(result);
9255    NEWBASKETGLOBALVARS.MERCHANDISETOTAL = result.MerchandiseTotal;
9256
9257    LoadCheckoutButtonsNewCart();
9258    $('#new-basket-starbuyitems, #new-basket-standarditems').empty();
9259
9260    PopulateNonStarbuyProducts(result.Products, result.StarbuyGroups.length);
9261    PopulateStarbuyProducts(result.StarbuyGroups);
9262    PopulateShippingOptions(result);
9263    AddFinancialsToPage(result);
9264    PopulateCurrencyConversion(result.CurrencyConvertedValues);
9265    PopulateCTABubbles(result);
9266    AddMessages(result);
9267    ToggleConditionalUIElements(result);
9268    AddStatefulLoadingSpinner();
9269
9270    TogglePageLoading(false);
9271
9272    document.dispatchEvent(new CustomEvent('cartupdate', {
9273        detail: result
9274    }));
9275}
9276
9277function CheckStockErrors(result) {
9278    NEWBASKETGLOBALVARS.STOCKERRORSPRESENT = (result.StockErrors.EmptyOrWhitespace() === false);
9279}
9280
9281function PopulateProductArray(result) {
9282    var toReturn = [];
9283
9284    var currentProductIndex = 0,
9285        productCount = result.Products.length;
9286
9287    for (currentProductIndex; currentProductIndex < productCount; currentProductIndex++) {
9288        toReturn.push(result.Products[currentProductIndex]);
9289    }
9290
9291    if (result.StarbuyGroups.length) {
9292        toReturn = Object.keys(result.StarbuyGroups).reduce(function (r, k
9292) {
9293            return toReturn.concat(result.StarbuyGroups[k].ParentItem, result.StarbuyGroups[k].ChildItem);
9294        }, []);
9295    }
9296
9297    return toReturn;
9298}
9299
9300function AddFinancialsToPage(result) {
9301    $('#new-basket-items-total').text(result.MerchandiseTotalFormatted);
9302    $('#new-basket-item-savings').text(result.SavingsFormatted);
9303    $('#new-basket-starbuy-savings').text(result.StarbuySavingsFormatted);
9304    $('#new-basket-total-savings').text(result.TotalSavingsFormatted);
9305    $('#new-basket-items-vat').text(GetTranslation('JavaScriptTranslations', '11NewBasket-VATCalculation'));
9306    $('#new-basket-rewardspointsestimate').html(result.RewardsPointsEstimateAsString);
9307}
9308
9309function PopulateStarbuyProducts(starbuyGroups) {
9310    var productHTML = '';
9311    if (starbuyGroups.length) {
9312
9313        var currentIndex = 0,
9314            productCount = starbuyGroups.length;
9315
9316        for (currentIndex; currentIndex < productCount; currentIndex++) {
9317            productHTML += '<div class="col-1 new-basket-starbuyparent">';
9318            productHTML += ReplaceProductTemplatePlaceholders(starbuyGroups[currentIndex].ParentItem);
9319            productHTML += '</div>';
9320
9321            if (starbuyGroups[currentIndex].ChildItem) {
9322                productHTML += '<div class="col-1 new-basket-starbuychild">';
9323                productHTML += ReplaceProductTemplatePlaceholders(starbuyGroups[currentIndex].ChildItem);
9324                productHTML += '</div>';
9325            }
9326        }
9327
9328        $('#new-basket-starbuyitems').html(productHTML);
9329    }
9330}
9331
9332function PopulateNonStarbuyProducts(products, starbuyGroupLength) {
9333    var productHTML = '';
9334    if (products.length) {
9335
9336        var currentIndex = 0,
9337            productCount = products.length;
9338
9339        for (currentIndex; currentIndex < productCount; currentIndex++) {
9340            productHTML += ReplaceProductTemplatePlaceholders(products[currentIndex]);
9341        }
9342    }
9343    else if (starbuyGroupLength) {
9344        // Don't add an empty cart message if star buy groups aren't empty
9345    }
9346    else {
9347        productHTML = `<div class="col-1 small ctrPad16-top ctrPad8-bottom coRED">${GetTranslation('JavaScriptTranslations', '11NewBasket-EmptyCart')}</div>`;
9348    }
9349    $('#new-basket-standarditems').html(productHTML);
9350}
9351
9352function PopulateShippingOptions(result) {
9353    var shippingHTML = '';
9354    if (result.AvailableShippingOptions.length && result.MerchandiseTotal > 0) {
9355
9356        var currentIndex = 0,
9357            serviceCount = result.AvailableShippingOptions.length;
9358
9359        for (currentIndex; currentIndex < serviceCount; currentIndex++) {
9360            shippingHTML += ReplaceShippingTemplatePlaceholders(result.AvailableShippingOptions[currentIndex]);
9361        }
9362    }
9363    else {
9364        shippingHTML = `<div class="col-1 small coRED">${GetTranslation('JavaScriptTranslations', '11NewBasket-NoShippingServices')}</div>`;
9365    }
9366
9367    $('#new-basket-shipping').html(shippingHTML);
9368}
9369
9370function PopulateCurrencyConversion(currencies) {
9371    var currencyHTML = '';
9372
9373    var currenciesPresent = currencies !== null;
9374
9375    $('.new-basket-currency').toggle(currenciesPresent);
9376
9377    if (currenciesPresent) {
9378        for (key in currencies) {
9379            currencyHTML += ReplaceCurrencyTemplatePlaceholders(key, currencies[key]);
9380        }
9381        currencyHTML += `<div class="col-1 ctrMgr16-top small">${GetTranslation('JavaScriptTranslations', '11NewBasket-CurrencyNotice')}</div>` + `<div class="col-1 small"><strong>${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-CurrencyUsedX0CurrencyType'), ecommerceConfig.LocalCurrencyCode)}<strong></div>`;
9382        $('#new-basket-currencytotal').html(currencyHTML);
9383    }
9384}
9385
9386function PopulateCTABubbles(result) {
9387    var ctaBubbleHTML = '';
9388
9389    if (result.FinanceAvailable) {
9390        ctaBubbleHTML += ReplaceCTABubbleTemplatePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-FinanceAvailable'), 'finance');
9391    }
9392
9393    var ccActive = result.AvailableShippingOptions.some(function (option) { return option.Name === 'Click & Collect' });
9394    if (ccActive) {
9395        ctaBubbleHTML += ReplaceCTABubbleTemplatePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-ClickAndCollectAvailable'), 'clickandcollect');
9396    }
9397
9398    var dpdActive = result.AvailableShippingOptions.some(function (option) { return option.Name === 'DPD Pick-up' });
9399    if (dpdActive) {
9400        ctaBubbleHTML += ReplaceCTABubbleTemplatePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-DPDAvailable'), 'dpdpickup');
9401    }
9402
9403    $('#new-basket-bubbles').html(ctaBubbleHTML);
9404}
9405
9406function AddMessages(result) {
9407    $('#new-basket-messages').empty();
9408
9409    var messageHTML = '';
9410
9411    if (NEWBASKETGLOBALVARS.STOCKERRORSPRESENT) {
9412        /* Only add the stock error message */
9413        messageHTML += FormatStockErrorMessage(result.StockErrors);
9414    }
9415    else {
9416        /* Add all other messages */
9417        messageHTML += CheckAddClickAndCollectOnlyMessage(result.MailOrderAvailable);
9418    }
9419
9420    $('#new-basket-messages').html(messageHTML);
9421}
9422
9423function FormatStockErrorMessage(message) {
9424    var formattedErrorMessage = '';
9425
9426    if (NEWBASKETGLOBALVARS.STOCKERRORSPRESENT) {
9427        formattedErrorMessage = `<div class="col-1 new-basket-error small zflex-v"><div class="col- flex-grow1">${message}</div><div>` + `<span class="borderi removeborder-top removeborder-left removeborder-right pointer" onclick="FixStockIssues();"><span class="boldfont">${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssues')}</span> <span class="fa icon-arrow-right"></span></span></div></div>`;
9428    }
9429
9430    return formattedErrorMessage;
9431}
9432
9433function CheckAddClickAndCollectOnlyMessage(mailOrderAvailable) {
9434    var ccMessageHTML = '';
9435
9436    if (!mailOrderAvailable) {
9437        ccMessageHTML = `<div class="col-1 new-basket-info small">${GetTranslation('JavaScriptTranslations', '11NewBasket-ClickAndCollectOnly')}</div>`;
9438    }
9439
9440    return ccMessageHTML;
9441}
9442
9443function ToggleConditionalUIElements(result) {
9444    TogglePaymentButtons();
9445    $('[data-toggle="finance"]').toggle(result.FinanceAvailable);
9446    $('[data-toggle="rewards"]').toggle(result.RewardsAvailable);
9447
9448    const ccTextEl = $('#cart-cc-description-text');
9449    ccTextEl.html(result.FinanceAvailable && !checkIfFinanceActiveForClickAndCollect() ? ccTextEl.attr('data-nofinancecc-msg') : ccTextEl.attr('data-standardcc-msg'));
9450
9451    $('[data-toggle="clickandcollect"]').toggle(result.AvailableShippingOptions.some(function (option) { return option.Name === 'Click & Collect' }));
9452    $('[data-toggle="dpdpickup"]').toggle(result.AvailableShippingOptions.some(function (option) { return option.Name === 'DPD Pick-up' }));
9453    $('[data-toggle="paypal"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('PayPal'));
9454    $('[data-toggle="applepay"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('ApplePay'));
9455    $('[data-toggle="googlepay"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('GooglePay') && result.ItemCount > 0);
9456    $('.new-basket-item-savings').toggle(result.MerchandiseTotal > 0 && result.Savings > 0);
9457    $('.new-basket-starbuy-savings').toggle(result.MerchandiseTotal > 0 && result.StarbuySavings > 0);
9458    $('.new-basket-total-savings').toggle(result.MerchandiseTotal > 0 && result.TotalSavings > 0);
9459    $('.basket-items-column-saving').toggle(document.querySelectorAll('.basket-items-column-saving[data-savingvisible="true"]').length > 0);
9460
9461    $('[data-toggle="applepayandpaypal"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('ApplePay') && ecommerceConfig.ActivePaymentMethods.hasOwnProperty('PayPal'));
9462    $('[data-toggle="applepayorpaypal"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('ApplePay') || ecommerceConfig.ActivePaymentMethods.hasOwnProperty('PayPal'));
9463}
9464
9465function TogglePaymentButtons() {
9466    $('#new-basket-paymentoptions .payment-buttons, .applebasket, #paypExpButton').not('[href="#"]').toggle(NEWBASKETGLOBALVARS.STOCKERRORSPRESENT === false);
9467
9468    var stockErrorPanelEl = $('#new-basket-paymentoptions #stock-error-message-warning');
9469
9470    if (!stockErrorPanelEl.length) {
9471        $('#new-basket-paymentoptions').append(`<div class="col-1 ctrPad16" id="stock-error-message-warning">${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesPrompt')}</div>`);
9472        stockErrorPanelEl = $('#new-basket-paymentoptions #stock-error-message-warning');
9473    }
9474
9475    stockErrorPanelEl.toggle(NEWBASKETGLOBALVARS.STOCKERRORSPRESENT);
9476}
9477
9478/* UI Functionality */
9479
9480function IncreaseItemQuantity(cartGuid) {
9481    TogglePageLoading(true);
9482    CitrusStore.CitrusStore.wsCitrusStore.IncreaseItemQuantityMiniBasket(cartGuid, SucceededChangeItemQuantity, FailedChangeItemQuantity);
9483}
9484
9485function DecreaseItemQuantity(cartGuid) {
9486    TogglePageLoading(true);
9487    CitrusStore.CitrusStore.wsCitrusStore.DecreaseItemQuantityMiniBasket(cartGuid, SucceededChangeItemQuantity, FailedChangeItemQuantity);
9488}
9489
9490function RemoveItemFromBasket(cartGuid) {
9491    TogglePageLoading(true);
9492    CitrusStore.CitrusStore.wsCitrusStore.RemoveItemFromCart(cartGuid, SucceededChangeItemQuantity, FailedChangeItemQuantity);
9493}
9494
9495function FixStockIssues() {
9496
9497    var promiseName = 'FixStockErrorsPromise',
9498        messageConfig = GetModularMessageConfig(MODALTYPE_ERROR);
9499
9500    window[promiseName] = $.Deferred();
9501
9502    messageConfig.Header = GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalTitle');
9503    messageConfig.Body = `<p><strong>${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalHeading')}</strong></p><p>${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalMessage')}</p><p>${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalPrompt')}</p>`;
9504    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalConfirm');
9505    messageConfig.Footer.Cancel = {
9506        name: GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalCancel'),
9507        action: 'cancel'
9508    };
9509
9510    ModularModalMessage(promiseName, messageConfig);
9511
9512    window[promiseName].then(function (val) {
9513        if (val === true) {
9514            TogglePageLoading(true);
9515            CitrusStore.CitrusStore.wsCitrusStore.FixMiniBasketItems(SucceededLoadNewBasket, FailedChangeItemQuantity);
9516        }
9517    });
9518}
9519
9520function GenericNewCartError(message) {
9521    TogglePageLoading(false);
9522
9523    var promiseName = 'GenericNewCartErrorPromise',
9524        messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
9525
9526    window[promiseName] = $.Deferred();
9527
9528    messageConfig.Header = GetTranslation('JavaScriptTranslations', '11NewBasket-ErrorModalTitle');
9529    messageConfig.Body = message;
9530    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '11NewBasket-ErrorModalConfirm');
9531
9532    ModularModalMessage(promiseName, messageConfig);
9533}
9534
9535function SucceededChangeItemQuantity(result) {
9536
9537    if (result.ActionResultMessage !== '') {
9538        FailedChangeItemQuantity(result);
9539    }
9540
9541    SucceededLoadNewBasket(result);
9542}
9543
9544function FailedChangeItemQuantity(result) {
9545    TogglePageLoading(false);
9546
9547    var promiseName = 'FailedChangeItemQuantityPromise',
9548        messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
9549
9550    window[promiseName] = $.Deferred();
9551
9552    messageConfig.Header = GetTranslation('JavaScriptTranslations', '11NewBasket-FailedModalTitle');
9553    messageConfig.Body = (result.ActionResultMessage ? result.ActionResultMessage : result._message);
9554    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '11NewBasket-FailedModalConfirm');
9555
9556    ModularModalMessage(promiseName, messageConfig);
9557}
9558
9559function LoadCheckoutButtonsNewCart() {
9560    TogglePaymentButtons();
9561    if (NEWBASKETGLOBALVARS.STOCKERRORSPRESENT === false) {
9562
9563        var buttonSchema = GetActiveWorkflowButtons();
9564        for (var i = 0; i < buttonSchema.length; i++) {
9565            if (buttonSchema[i] && (buttonSchema[i].name.indexOf('citruspaywallet') > -1 || buttonSchema[i].name.toLowerCase().indexOf('citruspaystripeclearpayafterpay') > -1)) {
9566                delete buttonSchema[i];
9567            }
9568        }
9569        var $target = $('#ShoppingCartButtonPlaceholder');
9570        $target.replaceWith(GetCheckoutWorkflowButtonHtml(buttonSchema, $target.attr('data-href')));
9571
9572        initPayPalExpress('#paypExpButton');
9573        CheckIfKlarnaAvailable();
9574        CheckIfFinanceAvailable()
9575            .then(function (value) {
9576                $('[data-toggle="finance"]').toggle(value);
9577            });
9578
9579        $('.payment-buttons')
9580            .on('click', function () {
9581                document.dispatchEvent(new CustomEvent('PaymentButtonClicked', { detail: this }));
9582            });
9583    }
9584}
9585
9586function StarBuysExplainerModal(offerTitleApplied) {
9587
9588    var promiseName = 'StarBuysExplainerModalPromise',
9589        messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION);
9590
9591    window[promiseName] = $.Deferred();
9592
9593    messageConfig.Header = GetTranslation('JavaScriptTranslations', '11NewBasket-StarBuysChildOfferExplainer-Title');
9594    messageConfig.Body = `<p><strong>${offerTitleApplied}</strong></p><div>${GetTranslation('JavaScriptTranslations', '11NewBasket-StarBuysChildOfferExplainer-AlwaysTheBestOffer')}</div>`;
9595    messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', 'DevJsContinueButton');
9596
9597    ModularModalMessage(promiseName, messageConfig);
9598}
9599
9600function AddStatefulLoadingSpinner() {
9601    var spinnerId = 'stateful-loader-cart',
9602        spinnerHtml = '<div id="' + spinnerId + '" class="col-1 bgSemiDark zflex-v pos-fix height-100-vh zindex-100" style="top:0;left:0;right:0;bottom:0;display:none;"><div class="col-1 centralise ctrPad32"><div class="cart-lds-ellipsis"><div data-loadingdot="1"></div><div data-loadingdot="2"></div><div data-loadingdot="3"></div><div data-loadingdot="4"></div></div></div></div>';
9603
9604    if ($('#' + spinnerId).length === 0) {
9605        $('body').append(spinnerHtml);
9606    }
9607}
9608
9609function TogglePageLoading(loadingState) {
9610    if ($('#stateful-loader-cart').is(":visible")
9611        && !loadingState) {
9612
9613        $('#stateful-loader-cart').fadeOut(150);
9614
9615    }
9616    else if ($('#stateful-loader-cart').is(":hidden")
9617        && loadingState) {
9618
9619        $('#stateful-loader-cart').fadeIn(150);
9620    }
9621    else {
9622        /* Do Nothing */
9623    }
9624
9625}
9626
9627/**
9628 * Check if finance active for click and collect orders.
9629 * @returns true if the finance payment method is active, false if not.
9630 */
9631function checkIfFinanceActiveForClickAndCollect() {
9632
9633    if (ecommerceConfig.FinanceSetup.FinanceOnClickAndCollectOrders) {
9634        for (const key in ecommerceConfig.ActivePaymentMethods) {
9635
9636            const paymentMethod = ecommerceConfig.ActivePaymentMethods[key];
9637
9638            if (paymentMethod.Type == 'Finance') {
9639                return true;
9640            }
9641
9642        }
9643    }
9644
9645    return false;
9646}
9647
9648/* Helpers */
9649
9650function ReplaceProductTemplatePlaceholders(productData) {
9651    return NEWBASKETGLOBALVARS.PRODUCTTEMPLATE.replace(/\[\[PRODUCTURL\]\]/gm, productData.ProductURL)
9652        .replace(/\[\[PRODUCTID\]\]/gm, productData.ProductID)
9653        .replace(/\[\[STARBUYCHILDID\]\]/gm, productData.StarbuyChildID)
9654        .replace(/\[\[STARBUYPARENTID\]\]/gm, productData.StarbuyParentID)
9655        .replace(/\[\[CARTITEMID\]\]/gm, productData.CartItemId)
9656        .replace(/\[\[IMGURL\]\]/gm, productData.Image)
9657        .replace(/\[\[QTY\]\]/gm, productData.Quantity)
9658        .replace(/\[\[NAME\]\]/gm, productData.Name)
9659        .replace(/\[\[PRODUCTCODE\]\]/gm, productData.ProductCode)
9660        .replace(/\[\[ATTRNAME\]\]/gm, productData.AttributeName)
9661        .replace(/\[\[ATTRCODE\]\]/gm, productData.AttributeCode)
9662        .replace(/\[\[SALEPRICE\]\]/gm, (productData.IsStarbuyChild ? productData.StarbuyPriceFormatted : productData.SalePriceFormatted))
9663        .replace(/\[\[SAVINGS\]\]/gm, productData.SavingsFormatted)
9664        .replace(/\[\[SAVINGSVISIBLE\]\]/gm, productData.SavingsVisible)
9665        .replace(/\[\[ITEMSUBTOTAL\]\]/gm, productData.ItemSubTotalFormatted)
9666        .replace(/\[\[STARBUYCHILD\]\]/gm, productData.IsStarbuyChild)
9667        .replace(/\[\[PROMOTEXT\]\]/gm, productData.StarbuyPromoText)
9668        .replace(/\[\[PROMOMESSAGE\]\]/gm, productData.PromoMessage)
9669        .replace(/\[\[STARBUYSOFFERTITLE\]\]/gm, productData.StarbuyPromoText)
9670        .replace(/\[\[PREORDERMESSAGE\]\]/gm, productData.PreorderMessage)
9671        .replace(/\[\[LEADTIMEMESSAGE\]\]/gm, productData.LeadtimeMessage)
9672        .replace(/\[\[CLICKANDCOLLECTONLYMESSAGE\]\]/gm, productData.ClickAndCollectOnly ? GetTranslation('JavaScriptTranslations', '11NewBasket-ItemClickAndCollectOnly') : '')
9673        .replace(/\[\[STRINGIFIEDITEMOBJECT\]\]/gm, productData.CartItemId)
9674        .replace(/\[\[REWARDSPOINTSESTIMATEASSTRING\]\]/gm, productData.RewardsPointsEstimate === 0 ? '' : productData.RewardsPointsEstimateAsString);
9675}
9676
9677function ReplaceShippingTemplatePlaceholders(serviceData) {
9678    return NEWBASKETGLOBALVARS.SHIPPINGTEMPLATE.replace(/\[\[NAME\]\]/gm, serviceData.Name)
9679        .replace(/\[\[PRICE\]\]/gm, serviceData.CustomerPrice)
9680        .replace(/\[\[MSG1\]\]/gm, serviceData.DispatchMessage)
9681        .replace(/\[\[MSG2\]\]/gm, serviceData.EstimatedDeliveryMessage);
9682}
9683
9684function ReplaceCurrencyTemplatePlaceholders(abbreviation, value) {
9685    return NEWBASKETGLOBALVARS.CURRENCYTEMPLATE.replace(/\[\[ABBREV\]\]/gm, abbreviation)
9686        .replace(/\[\[VALUE\]\]/gm, value);
9687}
9688
9689function ReplaceCTABubbleTemplatePlaceholders(message, toggleValue) {
9690    return NEWBASKETGLOBALVARS.CTABUBBLETEMPLATE.replace(/\[\[MESSAGE\]\]/gm, message)
9691        .replace(/\[\[TOGGLE\]\]/gm, toggleValue);
9692}
9693
9694function GetProductTemplate() {
9695    return '<div class="col-1 basket-itemrow-wrapper small border3 removeborder-top removeborder-left removeborder-right" data-promotext="[[PROMOTEXT]]" data-childid="[[STARBUYCHILDID]]" data-parentid="[[STARBUYPARENTID]]" data-producturl="[[PRODUCTURL]]" data-cartitem="[[CARTITEMID]]" data-productid="[[PRODUCTID]]">' +
9696        '<div class="col-1 basket-itemrow">' +
9697        '<div class="basket-items-column-product flex-grow1 zflex-v">' +
9698        '<span class="basket-items-column-img"><img src="[[IMGURL]]?width=172&height=172&format=webp&bgcolor=ffffff" width="84" height="84" /></span>' +
9699        '<div class="flex-grow1 ">' +
9700        '<span class="col-1 tt-uppercase x-small">[[PRODUCTCODE]]</span>' +
9701        '<a href="[[PRODUCTURL]]" class="coStandard normal">[[NAME]]</a>' +
9702        '<span class="col-1 rewards-item-estimate" data-rewardspointsestimateasstring="[[REWARDSPOINTSESTIMATEASSTRING]]">[[REWARDSPOINTSESTIMATEASSTRING]]</span>' +
9703        '<span class="col-1 tt-uppercase x-small" data-matrix="[[ATTRNAME]]">[[ATTRNAME]] ([[ATTRCODE]])</span>' +
9704        '<span class="col-1 coStarbuys small" data-msg="[[PROMOMESSAGE]]">[[PROMOMESSAGE]]</span>' +
9705        '<span class="col-1"><span class="small pointer" data-starbuytitle="[[STARBUYSOFFERTITLE]]" onclick="StarBuysExplainerModal(\'[[STARBUYSOFFERTITLE]]\')"><span>[[STARBUYSOFFERTITLE]]</span><span class="starbuy-child-offer-explainer">' + GetTranslation('JavaScriptTranslations', '11NewBasket-StarBuysChildOfferExplainer-Title') +' <i class="icon fa icon-maximize x-small"></i></span></span>' +
9706        '<div class="col-1"><span class="col- bgLRed coRED ctrMgr8-top ctrPad8 lh--100-perc small" data-msg="[[LEADTIMEMESSAGE]]" data-msgtype="LEADTIMEMESSAGE">[[LEADTIMEMESSAGE]]</span></div>' +
9707        '<div class="col-1"><span class="col- bgLBlue coBlue ctrMgr8-top ctrPad8 lh--100-perc small" data-msg="[[PREORDERMESSAGE]]" data-msgtype="PREORDERMESSAGE">[[PREORDERMESSAGE]]</span></div>' +
9708        '<div class="col-1"><span class="col- bgLRed coRED ctrMgr8-top ctrPad8 lh--100-perc small" data-msg="[[CLICKANDCOLLECTONLYMESSAGE]]">[[CLICKANDCOLLECTONLYMESSAGE]]</span></div>' +
9709        '</div>' +
9710        '</div>' +
9711        '<div class="basket-items-column-price">' +
9712        '<span class="col-">[[SALEPRICE]]</span>' +
9713        '</div>' +
9714        '<div class="basket-items-column-saving" data-savingvisible="[[SAVINGSVISIBLE]]">' +
9715        '<span class="coRED" data-savingvisible="[[SAVINGSVISIBLE]]">[[SAVINGS]]</span>' +
9716        '</div>' +
9717        '<div class="basket-items-column-qty">' +
9718        '[[QTY]]' +
9719        '</div>' +
9720        '<div class="basket-items-column-mng">' +
9721        '<span class="basket-items-ctrl basket-items---minus borderradiu
9721s x-small transition" onclick="DecreaseItemQuantity(\'[[STRINGIFIEDITEMOBJECT]]\');"></span>' +
9722        '<span class="basket-items-ctrl basket-items---plus borderradius x-small transition" onclick="IncreaseItemQuantity(\'[[STRINGIFIEDITEMOBJECT]]\');"></span>' +
9723        '<span class="basket-items-ctrl basket-items---remove borderradius x-small transition" onclick="RemoveItemFromBasket(\'[[STRINGIFIEDITEMOBJECT]]\');"></span>' +
9724        '</div>' +
9725        '<div class="basket-items-column-total">[[ITEMSUBTOTAL]]</div>' +
9726        '</div>' +
9727        '<div class="col-1 basket-itemrow-offers">' +
9728        '</div>' +
9729        '</div>';
9730}
9731
9732function GetShippingOptionTemplate() {
9733    return '<div class="col-1 basket-shippingrow border3 removeborder-top removeborder-left removeborder-right">' +
9734        '<div class="col-1 zflex-s">' +
9735        '<span class="flex-grow1">[[NAME]]</span>' +
9736        '<span class="coStandard basket-shippingrow-price">[[PRICE]]</span>' +
9737        '</div>' +
9738        '<span class="col-1 small">[[MSG1]]</span>' +
9739        '<span class="col-1 small coRED">[[MSG2]]</span>' +
9740        '</div>';
9741}
9742
9743function GetCurrencyTemplate() {
9744    return '<div class="col-1 basket-convertedtotal zflex-v" title="Currency: [[ABBREV]]" alt="Currency: [[ABBREV]]">' +
9745        '<div class="isoFlag" id="[[ABBREV]]"></div>' +
9746        '<span class="col-1">[[VALUE]]</span>' +
9747        '</div>';
9748}
9749
9750function GetCTABubbleTemplate() {
9751    return '<span class="new-basket-bubble borderradius colorwhite centralise boldfont small flex-grow1 zflex-v" data-toggle="[[TOGGLE]]" style="display: none;"><span>[[MESSAGE]]</span></span>';
9752}
9753/**
9754 * The name of the Promise which the Share Cart modal functionality will use to call-back to.
9755 */
9756var shareCartPromiseName = 'CartV2ShareBasketModal';
9757
9758/**
9759 * The name of the Cloud POS product/feature
9760 */ 
9761const cartShareProductName = () => GetTranslation('JavaScriptTranslations', '12ShareBasket-Title');
9762
9763/**
9764 * The text for the "confirm" button link in the modal.
9765 */
9766const cartShareLinkText = () => GetTranslation('JavaScriptTranslations', '12ShareBasket-GetLink');
9767
9768/**
9769 * The CloudPOS image header in the modal.
9770 */
9771var cartShareImageTag = '<img src="/platformlayout/citruslime-productlogo-cloudpos.png" height="48" style="width: auto !important">';
9772
9773/**
9774 * Is the "Share Cart" functionality active on the page.
9775 * Prevents the spamming of SHIFT+S to add superfluous DOM nodes.
9776 */
9777var shareCartVisible = false;
9778
9779window[shareCartPromiseName] = $.Deferred();
9780
9781/**
9782 * Show a modal on the Cart page from which a "Saved Cart" can be generated.
9783 * @returns {void} 
9784 */ 
9785function ShowShareModal()
9786{
9787    if (!shareCartVisible) {
9788        var messageConfig = GetModularMessageConfig(MODALTYPE_CLPOS);
9789        messageConfig.Header = cartShareImageTag;
9790        messageConfig.Body = `<h2>${cartShareProductName()}</h2><p>${GetTranslation('JavaScriptTranslations', '12ShareBasket-Heading')}</p><p>${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '12ShareBasket-PromptX0ButtonX1Tool'), cartShareLinkText(), cartShareProductName())}</p>`;
9791        messageConfig.Footer.Confirm.name = cartShareLinkText();
9792        messageConfig.Footer.Cancel = {
9793            name: GetTranslation('JavaScriptTranslations', '12ShareBasket-Cancel'),
9794            action: 'reject'
9795        };
9796
9797        ModularModalMessage(shareCartPromiseName, messageConfig);
9798        shareCartVisible = true;
9799
9800        $.when(window[shareCartPromiseName])
9801            .done(function (createLink)
9802            {
9803                if (createLink) {
9804                    ShowShareLinkResult();
9805                }
9806
9807                shareCartVisible = false;
9808            })
9809            .then(function ()
9810            {
9811                window[shareCartPromiseName] = $.Deferred();
9812            });
9813    }
9814}
9815
9816/**
9817 * Show a modal with a generated basket link which can be copied to clipboard.
9818 * @returns {void}
9819 */
9820function ShowShareLinkResult()
9821{
9822    GetDuplicateBasket(function (newShareLink)
9823    {
9824        var promiseName = 'newShareLinkcreated',
9825            messageConfig = GetModularMessageConfig(MODALTYPE_CLPOS);
9826
9827        window[promiseName] = $.Deferred();
9828
9829        messageConfig.Header = cartShareImageTag;
9830        messageConfig.Body = `<h2>${cartShareProductName()}</h2><p class="boldfont">${GetTranslation('JavaScriptTranslations', '12ShareBasket-CopyLink')}</p><div class="col-1 zflex-s share-banner-copy"><input value="${newShareLink}" class="flex-grow1"><span onclick="CopyAdjescentInputFieldValue(this); return false;"></span></div>`;
9831        messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '12ShareBasket-Confirm');
9832        ModularModalMessage(promiseName, messageConfig);
9833    });
9834}
9835
9836/**
9837 * Copies the value of the first input sibling, of the element provided to "clickElement"
9838 * @param {HTMLElement} clickedElement The element which we'll use to find the input sibling of and copy its value.
9839 * @returns {void}
9840 */
9841function CopyAdjescentInputFieldValue(clickedElement)
9842{
9843    var inputElement = clickedElement.parentElement.getElementsByTagName('input')[0];
9844    inputElement.select();
9845    inputElement.setSelectionRange(0, 99999);
9846    document.execCommand("copy");
9847
9848    var newElement = document.createElement('div');
9849    newElement.classList.add('col-1', 'alert', 'info');
9850    newElement.innerText = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '12ShareBasket-CopiedToClipboardX0Tool'), cartShareProductName());
9851    newElement.style.userSelect = 'none';
9852
9853    clickedElement.parentElement.after(newElement);
9854    setTimeout(function ()
9855    {
9856        clickedElement.parentElement.parentElement.removeChild(newElement);
9857    }, 5000);
9858}
9859
9860/**
9861 * Event listener which listens for key-down events and when SHIFT+S is pressed, it runs ShowShareModal();
9862 * Only runs if the pathname of the page is /cart/ or /cart.
9863 * @returns {void}
9864 */
9865if (window.location.pathname.toLowerCase() == '/cart/' || window.location.pathname.toLowerCase() == '/cart') {
9866    document.addEventListener("keydown", function (event)
9867    {
9868        var isShiftAndSKey = event.shiftKey && event.which == 83;
9869
9870        if (isShiftAndSKey)
9871        {
9872            ShowShareModal();
9873        }
9874    });
9875}
9876let viewCartHasBeenCalled = false;
9877
9878document.addEventListener('cartupdate', function (event) {
9879    const eventData = event.detail;
9880
9881    if (ecommerceConfig.AnalyticsScheme == 'GA4' && !viewCartHasBeenCalled) {
9882
9883        const ga4Queue = new GoogleAnalyticsEventQueue();
9884        ga4Queue.enqueueEvent([
9885            'view_cart',
9886            {
9887                "currency": ecommerceConfig.LocalCurrencyCode,
9888                "value": eventData.MerchandiseTotal,
9889                "items": GetGa4CartItemData(eventData)
9890            }
9891        ]);
9892
9893        viewCartHasBeenCalled = true;
9894    }
9895});
9896
9897function GetGa4CartItemData(eventData) {
9898    const ga4ItemArray = [];
9899
9900    const items = GetCartItemsFromEvent(eventData);
9901
9902    for (const item of items) {
9903        ga4ItemArray.push({
9904            "item_id": item.ProductCode,
9905            "item_name": item.Name,
9906            "item_variant": item.AttributeName,
9907            "price": item.SalePrice,
9908            "quantity": item.Quantity
9909        });
9910    }
9911
9912    return ga4ItemArray;
9913}
9914
9915function GetCartItemsFromEvent(eventData) {
9916    var toReturn = [];
9917
9918    var currentProductIndex = 0,
9919        productCount = eventData.Products.length;
9920
9921    for (currentProductIndex; currentProductIndex < productCount; currentProductIndex++) {
9922        toReturn.push(eventData.Products[currentProductIndex]);
9923    }
9924
9925    if (eventData.StarbuyGroups.length) {
9926        toReturn = Object.keys(eventData.StarbuyGroups).reduce(function (r, k) {
9927            return toReturn.concat(eventData.StarbuyGroups[k].ParentItem, eventData.StarbuyGroups[k].ChildItem);
9928        }, []);
9929    }
9930
9931    return toReturn;
9932}
9933function map() {	
9934	var map;
9935	var bounds = new google.maps.LatLngBounds();
9936	var mapOptions = {
9937		mapTypeId: 'roadmap',
9938		zoomControl: true,
9939		scaleControl: true,
9940		scrollwheel: false,
9941		disableDoubleClickZoom: true
9942	};
9943
9944	// Display a map on the page
9945	map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
9946	
9947	$.ajax({
9948		type: "GET",
9949		async: true,
9950		url: "/pages/shops/map.xml",
9951		success:
9952		function (xml) {
9953			var id
9954			var infoWindowContent = [];
9955			var places = xml.documentElement.getElementsByTagName("places");
9956			var output = "<div class='markers ctrPad32 columnFlow'>";
9957			var labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
9958      		var labelIndex = 0;
9959			var trimed = window.location.pathname.split("/")[3];
9960			var part = trimed.substring(10);
9961			for( i = 0; i < places.length; i++ ) {
9962				var name = places[i].getAttribute('name');
9963				var lat = places[i].getAttribute('latitude');
9964				var long = places[i].getAttribute('longitude');
9965				var tel = places[i].getAttribute('tel');
9966				var desc = places[i].getAttribute('desc');
9967				var address = places[i].getAttribute('address');
9968				var email = places[i].getAttribute('email');
9969				var position = new google.maps.LatLng(lat, long);
9970				bounds.extend(position);
9971				marker = new google.maps.Marker({
9972					position: position,
9973					label: labels[labelIndex++ % labels.length],
9974					map: map,
9975					title: name
9976				});
9977				
9978				infoWindowContent.push({name: name, desc: desc, tel: tel, address: address, email: email});
9979
9980				
9981				//console.log(infoWindowContent)
9982				
9983				// Allow each marker to have an info window    
9984				google.maps.event.addListener(marker, 'click', (function(marker, i) {
9985					return function() {
9986						infoWindow.setContent("<div class='ctrPad32'><a href='/pages/shops/cycles-uk-"+infoWindowContent[i].name+"'><h2>"+infoWindowContent[i].name+"</h2><p>"+infoWindowContent[i].desc+"<br><br>View our "+infoWindowContent[i].name+" Store Now</p></a></div>");
9987						infoWindow.open(map, marker);
9988					}
9989				})(marker, i));
9990				output=output+"<a  href='/pages/shops/cycles-uk-"+name+"' class='store'>"
9991				output=output+"<div class='mpin'>
9991"+labels[labelIndex-1 % labels.length]+"</div>"
9992				output=output+"<div class='mname'>"+name+"</div>"
9993				output=output+"<div class='mtel'>"+tel+"</div>"
9994				output=output+"<div class='mdesc'>"+desc+"</div>"
9995				output=output+"</a>"
9996				
9997				// Automatically center the map fitting all markers on the screen
9998				map.fitBounds(bounds);
9999				if(infoWindowContent[i].name.toLowerCase() === part)  {
10000					PageId = i
10001				}
10002			}
10003			$(".stores").append(output);
10004			output=output+"</div>";
10005			$(".addres").append(infoWindowContent[PageId].address)
10006			$(".tel").append(infoWindowContent[PageId].tel)
10007			$(".name").append(infoWindowContent[PageId].name)
10008			$(".email").append(infoWindowContent[PageId].email);
10009		}
10010	});
10011
10012	// Display multiple markers on a map
10013	var infoWindow = new google.maps.InfoWindow(), marker, i;
10014
10015
10016	// Override our map zoom level once our fitBounds function runs (Make sure it only runs once)
10017	var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event) {
10018		this.setZoom(8);
10019		google.maps.event.removeListener(boundsListener);
10020	});
10021}

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.