PageSourceSearch

https://www.thecycleroom.co.uk/citr-faf.js?version=2026-9-23-9-21-40

js thecycleroom.co.uk collected 2026-10-10 00:05:24 UTC 775,394 bytes, 11,393 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}
8066/*
8067jQuery Waypoints - v1.1.6
8068Copyright (c) 2011-2012 Caleb Troughton
8069Dual licensed under the MIT license and GPL license.
8070https://github.com/imakewebthings/jquery-waypoints/blob/master/MIT-license.txt
8071https://github.com/imakewebthings/jquery-waypoints/blob/master/GPL-license.txt
8072*/
8073(function ($, k, m, i, d) { var e = $(i), g = "waypoint.reached", b = function (o, n) { o.element.trigger(g, n); if (o.options.triggerOnce) { o.element[k]("destroy") } }, h = function (p, o) { if (!o) { return -1 } var n = o.waypoints.length - 1; while (n >= 0 && o.waypoints[n].element[0] !== p[0]) { n -= 1 } return n }, f = [], l = function (n) { $.extend(this, { element: $(n), oldScroll: 0, waypoints: [], didScroll: false, didResize: false, doScroll: $.proxy(function () { var q = this.element.scrollTop(), p = q > this.oldScroll, s = this, r = $.grep(this.waypoints, function (u, t) { return p ? (u.offset > s.oldScroll && u.offset <= q) : (u.offset <= s.oldScroll && u.offset > q) }), o = r.length; if (!this.oldScroll || !q) { $[m]("refresh") } this.oldScroll = q; if (!o) { return } if (!p) { r.reverse() } $.each(r, function (u, t) { if (t.options.continuous || u === o - 1) { b(t, [p ? "down" : "up"]) } }) }, this) }); $(n).bind("scroll.waypoints", $.proxy(function () { if (!this.didScroll) { this.didScroll = true; i.setTimeout($.proxy(function () { this.doScroll(); this.didScroll = false }, this), $[m].settings.scrollThrottle) } }, this)).bind("resize.waypoints", $.proxy(function () { if (!this.didResize) { this.didResize = true; i.setTimeout($.proxy(function () { $[m]("refresh"); this.didResize = false }, this), $[m].settings.resizeThrottle) } }, this)); e.load($.proxy(function () { this.doScroll() }, this)) }, j = function (n) { var o = null; $.each(f, function (p, q) { if (q.element[0] === n) { o = q; return false } }); return o }, c = { init: function (o, n) { this.each(function () { var u = $.fn[k].defaults.context, q, t = $(this); if (n && n.context) { u = n.context } if (!$.isWindow(u)) { u = t.closest(u)[0] } q = j(u); if (!q) { q = new l(u); f.push(q) } var p = h(t, q), s = p < 0 ? $.fn[k].defaults : q.waypoints[p].options, r = $.extend({}, s, n); r.offset = r.offset === "bottom-in-view" ? function () { var v = $.isWindow(u) ? $[m]("viewportHeight") : $(u).height(); return v - $(this).outerHeight() } : r.offset; if (p < 0) { q.waypoints.push({ element: t, offset: null, options: r }) } else { q.waypoints[p].options = r } if (o) { t.bind(g, o) } if (n && n.handler) { t.bind(g, n.handler) } }); $[m]("refresh"); return this }, remove: function () { return this.each(function (o, p) { var n = $(p); $.each(f, function (r, s) { var q = h(n, s); if (q >= 0) { s.waypoints.splice(q, 1); if (!s.waypoints.length) { s.element.unbind("scroll.waypoints resize.waypoints"); f.splice(r, 1) } } }) }) }, destroy: function () { return this.unbind(g)[k]("remove") } }, a = { refresh: function () { $.each(f, function (r, s) { var q = $.isWindow(s.element[0]), n = q ? 0 : s.element.offset().top, p = q ? $[m]("viewportHeight") : s.element.height(), o = q ? 0 : s.element.scrollTop(); $.each(s.waypoints, function (u, x) { if (!x) { return } var t = x.options.offset, w = x.offset; if (typeof x.options.offset === "function") { t = x.options.offset.apply(x.element) } else { if (typeof x.options.offset === "string") { var v = parseFloat(x.options.offset); t = x.options.offset.indexOf("%") ? Math.ceil(p * (v / 100)) : v } } x.offset = x.element.offset().top - n + o - t; if (x.options.onlyOnScroll) { return } if (w !== null && s.oldScroll > w && s.oldScroll <= x.offset) { b(x, ["up"]) } else { if (w !== null && s.oldScroll < w && s.oldScroll >= x.offset) { b(x, ["down"]) } else { if (!w && o > x.offset) { b(x, ["down"]) } } } });
8073 s.waypoints.sort(function (u, t) { return u.offset - t.offset }) }) }, viewportHeight: function () { return (i.innerHeight ? i.innerHeight : e.height()) }, aggregate: function () { var n = $(); $.each(f, function (o, p) { $.each(p.waypoints, function (q, r) { n = n.add(r.element) }) }); return n } }; $.fn[k] = function (n) { if (c[n]) { return c[n].apply(this, Array.prototype.slice.call(arguments, 1)) } else { if (typeof n === "function" || !n) { return c.init.apply(this, arguments) } else { if (typeof n === "object") { return c.init.apply(this, [null, n]) } else { $.error("Method " + n + " does not exist on jQuery " + k) } } } }; $.fn[k].defaults = { continuous: true, offset: 0, triggerOnce: false, context: i }; $[m] = function (n) { if (a[n]) { return a[n].apply(this) } else { return a.aggregate() } }; $[m].settings = { resizeThrottle: 200, scrollThrottle: 100 }; e.load(function () { $[m]("refresh") }) })(jQuery, "waypoint", "waypoints", window);
8074/* Purposefully empty --- we shouldn't duplicate JS */(function() {(function(n){var x=this||(0,eval)("this"),u=x.document,M=x.navigator,v=x.jQuery,F=x.JSON;(function(n){"function"===typeof define&&define.amd?define(["exports","require"],n):"object"===typeof exports&&"object"===typeof module?n(module.exports||exports):n(x.ko={})})(function(N,O){function J(a,c){return null===a||typeof a in T?a===c:!1}function U(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function V(b,c){var d;return function(){clearTimeout(d);d=a.a.setTimeout(b,c)}}function W(a,
8075c){c&&c!==I?"beforeChange"===c?this.Kb(a):this.Ha(a,c):this.Lb(a)}function X(a,c){null!==c&&c.k&&c.k()}function Y(a,c){var d=this.Hc,e=d[s];e.R||(this.lb&&this.Ma[c]?(d.Pb(c,a,this.Ma[c]),this.Ma[c]=null,--this.lb):e.r[c]||d.Pb(c,a,e.s?{ia:a}:d.uc(a)))}function K(b,c,d,e){a.d[b]={init:function(b,g,k,l,m){var h,r;a.m(function(){var q=a.a.c(g()),p=!d!==!q,A=!r;if(A||c||p!==h)A&&a.va.Aa()&&(r=a.a.ua(a.f.childNodes(b),!0)),p?(A||a.f.da(b,a.a.ua(r)),a.eb(e?e(m,q):m,b)):a.f.xa(b),h=p},null,{i:b});return{controlsDescendantBindings:!0}}};
8076a.h.ta[b]=!1;a.f.Z[b]=!0}var a="undefined"!==typeof N?N:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.G=function(a,c,d){a[c]=d};a.version="3.4.0";a.b("version",a.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1};a.a=function(){function b(a,b){for(var c in a)a.hasOwnProperty(c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=b;return a}function e(b,c,d,e){var h=b[c].match(r)||
8077[];a.a.q(d.match(r),function(b){a.a.pa(h,b,e)});b[c]=h.join(" ")}var f={__proto__:[]}instanceof Array,g="function"===typeof Symbol,k={},l={};k[M&&/Firefox\/2/i.test(M.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];k.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");b(k,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)l[b[c]]=a});var m={propertychange:!0},h=u&&function(){for(var a=3,b=u.createElement("div"),c=
8078b.getElementsByTagName("i");b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e",c[0];);return 4<a?a:n}(),r=/\S+/g;return{cc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],q:function(a,b){for(var c=0,d=a.length;c<d;c++)b(a[c],c)},o:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Sb:function(a,b,c){for(var d=0,e=a.length;d<e;d++)if(b.call(c,a[d],d))return a[d];
8079return null},La:function(b,c){var d=a.a.o(b,c);0<d?b.splice(d,1):0===d&&b.shift()},Tb:function(b){b=b||[];for(var c=[],d=0,e=b.length;d<e;d++)0>a.a.o(c,b[d])&&c.push(b[d]);return c},fb:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)c.push(b(a[d],d));return c},Ka:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)b(a[d],d)&&c.push(a[d]);return c},ra:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<d;c++)a.push(b[c]);return a},pa:function(b,c,d){var e=
8080a.a.o(a.a.zb(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},ka:f,extend:c,Xa:d,Ya:f?d:c,D:b,Ca:function(a,b){if(!a)return a;var c={},d;for(d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d],d,a));return c},ob:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},jc:function(b){b=a.a.V(b);for(var c=(b[0]&&b[0].ownerDocument||u).createElement("div"),d=0,e=b.length;d<e;d++)c.appendChild(a.$(b[d]));return c},ua:function(b,c){for(var d=0,e=b.length,h=[];d<e;d++){var m=b[d].cloneNode(!0);h.push(c?a.$(m):m)}return h},
8081da:function(b,c){a.a.ob(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},qc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],h=e.parentNode,m=0,l=c.length;m<l;m++)h.insertBefore(c[m],e);m=0;for(l=d.length;m<l;m++)a.removeNode(d[m])}},za:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;
vendor: 4,183 bytes, lines 8081-8089
8081if(1<a.length){var c=a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),
8082c=c.nextSibling;a.push(d)}}return a},sc:function(a,b){7>h?a.setAttribute("selected",b):a.selected=b},$a:function(a){return null===a||a===n?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},nd:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},Mc:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(3===a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=
8083b;)a=a.parentNode;return!!a},nb:function(b){return a.a.Mc(b,b.ownerDocument.documentElement)},Qb:function(b){return!!a.a.Sb(b,a.a.nb)},A:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},Wb:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Wb(b),c)},$b:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},p:function(b,c,d){var e=a.a.Wb(d);d=h&&m[c];if(a.options.useOnlyNativeEvents||
8084d||!v)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var l=function(a){e.call(b,a)},f="on"+c;b.attachEvent(f,l);a.a.F.oa(b,function(){b.detachEvent(f,l)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else v(b).bind(c,e)},Da:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===a.a.A(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==
8085d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!v||d)if("function"==typeof u.createEvent)if("function"==typeof b.dispatchEvent)d=u.createEvent(l[c]||"HTMLEvents"),d.initEvent(c,!0,!0,x,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");else v(b).trigger(c)},c:function(b){return a.H(b)?
8086b():b},zb:function(b){return a.H(b)?b.t():b},bb:function(b,c,d){var h;c&&("object"===typeof b.classList?(h=b.classList[d?"add":"remove"],a.a.q(c.match(r),function(a){h.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},Za:function(b,c){var d=a.a.c(c);if(null===d||d===n)d="";var e=a.f.firstChild(b);!e||3!=e.nodeType||a.f.nextSibling(e)?a.f.da(b,[b.ownerDocument.createTextNode(d)]):e.data=d;a.a.Rc(b)},rc:function(a,b){a.name=b;if(7>=h)try{a.mergeAttributes(u.createElement("<input name='"+
8087a.name+"'/>"),!1)}catch(c){}},Rc:function(a){9<=h&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},Nc:function(a){if(h){var b=a.style.width;a.style.width=0;a.style.width=b}},hd:function(b,c){b=a.a.c(b);c=a.a.c(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},V:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},Yb:function(a){return g?Symbol(a):a},rd:6===h,sd:7===h,C:h,ec:function(b,c){for(var d=a.a.V(b.getElementsByTagName("input")).concat(a.a.V(b.getElementsByTagName("textarea"))),
8088e="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},h=[],m=d.length-1;0<=m;m--)e(d[m])&&h.push(d[m]);return h},ed:function(b){return"string"==typeof b&&(b=a.a.$a(b))?F&&F.parse?F.parse(b):(new Function("return "+b))():null},Eb:function(b,c,d){if(!F||!F.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
8089return F.stringify(a.a.c(b),c,d)},fd:function(c,d,e){e=e||{};var h=e.params||{},m=e.includeFields||this.cc,l=c;if("object"==typeof c&&"form"===a.a.A(c))for(var l=c.action,f=m.length-1;0<=f;f--)for(var g=a.a.ec(c,m[f]),k=g.length-1;0<=k;k--)h[g[k].name]=g[k].value;d=a.a.c(d);var r=u.createElement("form");r.style.display="none";r.action=l;r.method="post";for(var n in d)c=u.createElement("input"),c.type="hidden",c.name=n,c.value=a.a.Eb(a.a.c(d[n])
8089),r.appendChild(c);b(h,function(a,b){var c=u.createElement("input");
8090c.type="hidden";c.name=a;c.value=b;r.appendChild(c)});u.body.appendChild(r);e.submitter?e.submitter(r):r.submit();setTimeout(function(){r.parentNode.removeChild(r)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.q);a.b("utils.arrayFirst",a.a.Sb);a.b("utils.arrayFilter",a.a.Ka);a.b("utils.arrayGetDistinctValues",a.a.Tb);a.b("utils.arrayIndexOf",a.a.o);a.b("utils.arrayMap",a.a.fb);a.b("utils.arrayPushAll",a.a.ra);a.b("utils.arrayRemoveItem",a.a.La);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost",
8091a.a.cc);a.b("utils.getFormFields",a.a.ec);a.b("utils.peekObservable",a.a.zb);a.b("utils.postJson",a.a.fd);a.b("utils.parseJson",a.a.ed);a.b("utils.registerEventHandler",a.a.p);a.b("utils.stringifyJson",a.a.Eb);a.b("utils.range",a.a.hd);a.b("utils.toggleDomNodeCssClass",a.a.bb);a.b("utils.triggerEvent",a.a.Da);a.b("utils.unwrapObservable",a.a.c);a.b("utils.objectForEach",a.a.D);a.b("utils.addOrRemoveItem",a.a.pa);a.b("utils.setTextContent",a.a.Za);a.b("unwrap",a.a.c);Function.prototype.bind||(Function.prototype.bind=
8092function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.e=new function(){function a(b,g){var k=b[d];if(!k||"null"===k||!e[k]){if(!g)return n;k=b[d]="ko"+c++;e[k]={}}return e[k]}var c=0,d="__ko__"+(new Date).getTime(),e={};return{get:function(c,d){var e=a(c,!1);return e===n?n:e[d]},set:function(c,d,e){if(e!==n||a(c,!1)!==n)a(c,!0)[d]=
8093e},clear:function(a){var b=a[d];return b?(delete e[b],a[d]=null,!0):!1},I:function(){return c++ +d}}};a.b("utils.domData",a.a.e);a.b("utils.domData.clear",a.a.e.clear);a.a.F=new function(){function b(b,c){var e=a.a.e.get(b,d);e===n&&c&&(e=[],a.a.e.set(b,d,e));return e}function c(d){var e=b(d,!1);if(e)for(var e=e.slice(0),l=0;l<e.length;l++)e[l](d);a.a.e.clear(d);a.a.F.cleanExternalData(d);if(f[d.nodeType])for(e=d.firstChild;d=e;)e=d.nextSibling,8===d.nodeType&&c(d)}var d=a.a.e.I(),e={1:!0,8:!0,9:!0},
8094f={1:!0,9:!0};return{oa:function(a,c){if("function"!=typeof c)throw Error("Callback must be a function");b(a,!0).push(c)},pc:function(c,e){var l=b(c,!1);l&&(a.a.La(l,e),0==l.length&&a.a.e.set(c,d,n))},$:function(b){if(e[b.nodeType]&&(c(b),f[b.nodeType])){var d=[];a.a.ra(d,b.getElementsByTagName("*"));for(var l=0,m=d.length;l<m;l++)c(d[l])}return b},removeNode:function(b){a.$(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){v&&"function"==typeof v.cleanData&&v.cleanData([a])}}};
8095a.$=a.a.F.$;a.removeNode=a.a.F.removeNode;a.b("cleanNode",a.$);a.b("removeNode",a.removeNode);a.b("utils.domNodeDisposal",a.a.F);a.b("utils.domNodeDisposal.addDisposeCallback",a.a.F.oa);a.b("utils.domNodeDisposal.removeDisposeCallback",a.a.F.pc);(function(){var b=[0,"",""],c=[1,"<table>","</table>"],d=[3,"<table><tbody><tr>","</tr></tbody></table>"],e=[1,"<select multiple='multiple'>","</select>"],f={thead:c,tbody:c,tfoot:c,tr:[2,"<table><tbody>","</tbody></table>"],td:d,th:d,option:e,optgroup:e},
8096g=8>=a.a.C;a.a.ma=function(c,d){var e;if(v)if(v.parseHTML)e=v.parseHTML(c,d)||[];else{if((e=v.clean([c],d))&&e[0]){for(var h=e[0];h.parentNode&&11!==h.parentNode.nodeType;)h=h.parentNode;h.parentNode&&h.parentNode.removeChild(h)}}else{(e=d)||(e=u);var h=e.parentWindow||e.defaultView||x,r=a.a.$a(c).toLowerCase(),q=e.createElement("div"),p;p=(r=r.match(/^<([a-z]+)[ >]/))&&f[r[1]]||b;r=p[0];p="ignored<div>"+p[1]+c+p[2]+"</div>";"function"==typeof h.innerShiv?q.appendChild(h.innerShiv(p)):(g&&e.appendChild(q),
8097q.innerHTML=p,g&&q.parentNode.removeChild(q));for(;r--;)q=q.lastChild;e=a.a.V(q.lastChild.childNodes)}return e};a.a.Cb=function(b,c){a.a.ob(b);c=a.a.c(c);if(null!==c&&c!==n)if("string"!=typeof c&&(c=c.toString()),v)v(b).html(c);else for(var d=a.a.ma(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b("utils.parseHtmlFragment",a.a.ma);a.b("utils.setHtml",a.a.Cb);a.M=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.M.lc(c.nodeValue);null!=f&&e.push({Lc:c,cd:f})}else if(1==c.nodeType)for(var f=
80980,g=c.childNodes,k=g.length;f<k;f++)b(g[f],e)}var c={};
vendor: 4,995 bytes, lines 8098-8107
8098return{wb:function(a){if("function"!=typeof a)throw Error("You can only pass a function to ko.memoization.memoize()");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},xc:function(a,b){var f=c[a];if(f===n)throw Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.");try{return f.apply(null,b||[]),
8099!0}finally{delete c[a]}},yc:function(c,e){var f=[];b(c,f);for(var g=0,k=f.length;g<k;g++){var l=f[g].Lc,m=[l];e&&a.a.ra(m,e);a.M.xc(f[g].cd,m);l.nodeValue="";l.parentNode&&l.parentNode.removeChild(l)}},lc:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:null}}}();a.b("memoization",a.M);a.b("memoization.memoize",a.M.wb);a.b("memoization.unmemoize",a.M.xc);a.b("memoization.parseMemoText",a.M.lc);a.b("memoization.unmemoizeDomNodeAndDescendants",a.M.yc);a.Y=function(){function b(){if(e)for(var b=
8100e,c=0,m;g<e;)if(m=d[g++]){if(g>b){if(5E3<=++c){g=e;a.a.$b(Error("'Too much recursion' after processing "+c+" task groups."));break}b=e}try{m()}catch(h){a.a.$b(h)}}}function c(){b();g=e=d.length=0}var d=[],e=0,f=1,g=0;return{scheduler:x.MutationObserver?function(a){var b=u.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):u&&"onreadystatechange"in u.createElement("script")?function(a){var b=u.createElement("script");b.onreadystatechange=
8101function(){b.onreadystatechange=null;u.documentElement.removeChild(b);b=null;a()};u.documentElement.appendChild(b)}:function(a){setTimeout(a,0)},Wa:function(b){e||a.Y.scheduler(c);d[e++]=b;return f++},cancel:function(a){a-=f-e;a>=g&&a<e&&(d[a]=null)},resetForTesting:function(){var a=e-g;g=e=d.length=0;return a},md:b}}();a.b("tasks",a.Y);a.b("tasks.schedule",a.Y.Wa);a.b("tasks.runEarly",a.Y.md);a.ya={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.B({read:b,write:function(e){clearTimeout(d);
8102d=a.a.setTimeout(function(){b(e)},c)}})},rateLimit:function(a,c){var d,e,f;"number"==typeof c?d=c:(d=c.timeout,e=c.method);a.cb=!1;f="notifyWhenChangesStop"==e?V:U;a.Ta(function(a){return f(a,d)})},deferred:function(b,c){if(!0!==c)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.cb||(b.cb=!0,b.Ta(function(c){var e;return function(){a.Y.cancel(e);e=a.Y.Wa(c);b.notifySubscribers(n,"dirty")}}))},notify:function(a,c){a.equalityComparer=
8103"always"==c?null:J}};var T={undefined:1,"boolean":1,number:1,string:1};a.b("extenders",a.ya);a.vc=function(b,c,d){this.ia=b;this.gb=c;this.Kc=d;this.R=!1;a.G(this,"dispose",this.k)};a.vc.prototype.k=function(){this.R=!0;this.Kc()};a.J=function(){a.a.Ya(this,D);D.rb(this)};var I="change",D={rb:function(a){a.K={};a.Nb=1},X:function(b,c,d){var e=this;d=d||I;var f=new a.vc(e,c?b.bind(c):b,function(){a.a.La(e.K[d],f);e.Ia&&e.Ia(d)});e.sa&&e.sa(d);e.K[d]||(e.K[d]=[]);e.K[d].push(f);return f},notifySubscribers:function(b,
8104c){c=c||I;c===I&&this.zc();if(this.Pa(c))try{a.l.Ub();for(var d=this.K[c].slice(0),e=0,f;f=d[e];++e)f.R||f.gb(b)}finally{a.l.end()}},Na:function(){return this.Nb},Uc:function(a){return this.Na()!==a},zc:function(){++this.Nb},Ta:function(b){var c=this,d=a.H(c),e,f,g;c.Ha||(c.Ha=c.notifySubscribers,c.notifySubscribers=W);var k=b(function(){c.Mb=!1;d&&g===c&&(g=c());e=!1;c.tb(f,g)&&c.Ha(f=g)});c.Lb=function(a){c.Mb=e=!0;g=a;k()};c.Kb=function(a){e||(f=a,c.Ha(a,"beforeChange"))}},Pa:function(a){return this.K[a]&&
8105this.K[a].length},Sc:function(b){if(b)return this.K[b]&&this.K[b].length||0;var c=0;a.a.D(this.K,function(a,b){"dirty"!==a&&(c+=b.length)});return c},tb:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},extend:function(b){var c=this;b&&a.a.D(b,function(b,e){var f=a.ya[b];"function"==typeof f&&(c=f(c,e)||c)});return c}};a.G(D,"subscribe",D.X);a.G(D,"extend",D.extend);a.G(D,"getSubscriptionsCount",D.Sc);a.a.ka&&a.a.Xa(D,Function.prototype);a.J.fn=D;a.hc=function(a){return null!=
8106a&&"function"==typeof a.X&&"function"==typeof a.notifySubscribers};a.b("subscribable",a.J);a.b("isSubscribable",a.hc);a.va=a.l=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{Ub:b,end:c,oc:function(b){if(e){if(!a.hc(b))throw Error("Only subscribable things can act as dependencies");e.gb.call(e.Gc,b,b.Cc||(b.Cc=++f))}},w:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},Aa:function(){if(e)return e.m.Aa()},Sa:function(){if(e)return e.Sa}}}();a.b("computedContext",
8107a.va);a.b("computedContext.getDependenciesCount",a.va.Aa);a.b("computedContext.isInitial",a.va.Sa);a.b("ignoreDependencies",a.qd=a.l.w);var E=a.a.Yb("_latestValue");a.N=function(b){function c(){if(0<arguments.length)return c.tb(c[E],arguments[0])&&(c.ga(),c[E]=arguments[0],c.fa()),this;a.l.oc(c);return c[E]}c[E]=b;a.a.ka||a.a.extend(c,a.J.fn);a.J.fn.rb(c);a.a.Ya(c,B);a.options.deferUpdates&&a.ya.deferred(c,!0);return c};
8107var B={equalityComparer:J,t:function(){return this[E]},fa:function(){this.notifySubscribers(this[E])},
8108ga:function(){this.notifySubscribers(this[E],"beforeChange")}};a.a.ka&&a.a.Xa(B,a.J.fn);var H=a.N.gd="__ko_proto__";B[H]=a.N;a.Oa=function(b,c){return null===b||b===n||b[H]===n?!1:b[H]===c?!0:a.Oa(b[H],c)};a.H=function(b){return a.Oa(b,a.N)};a.Ba=function(b){return"function"==typeof b&&b[H]===a.N||"function"==typeof b&&b[H]===a.B&&b.Vc?!0:!1};a.b("observable",a.N);a.b("isObservable",a.H);a.b("isWriteableObservable",a.Ba);a.b("isWritableObservable",a.Ba);a.b("observable.fn",B);a.G(B,"peek",B.t);a.G(B,
8109"valueHasMutated",B.fa);a.G(B,"valueWillMutate",B.ga);a.la=function(b){b=b||[];if("object"!=typeof b||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");b=a.N(b);a.a.Ya(b,a.la.fn);return b.extend({trackArrayChanges:!0})};a.la.fn={remove:function(b){for(var c=this.t(),d=[],e="function"!=typeof b||a.H(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];e(g)&&(0===d.length&&this.ga(),d.push(g),c.splice(f,1),f--)}d.length&&
8110this.fa();return d},removeAll:function(b){if(b===n){var c=this.t(),d=c.slice(0);this.ga();c.splice(0,c.length);this.fa();return d}return b?this.remove(function(c){return 0<=a.a.o(b,c)}):[]},destroy:function(b){var c=this.t(),d="function"!=typeof b||a.H(b)?function(a){return a===b}:b;this.ga();for(var e=c.length-1;0<=e;e--)d(c[e])&&(c[e]._destroy=!0);this.fa()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.o(b,c)}):[]},indexOf:function(b){var c=
8111this();return a.a.o(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ga(),this.t()[d]=c,this.fa())}};a.a.ka&&a.a.Xa(a.la.fn,a.N.fn);a.a.q("pop push reverse shift sort splice unshift".split(" "),function(b){a.la.fn[b]=function(){var a=this.t();this.ga();this.Vb(a,b,arguments);var d=a[b].apply(a,arguments);this.fa();return d===a?this:d}});a.a.q(["slice"],function(b){a.la.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.b("observableArray",a.la);a.ya.trackArrayChanges=function(b,
8112c){function d(){if(!e){e=!0;var c=b.notifySubscribers;b.notifySubscribers=function(a,b){b&&b!==I||++k;return c.apply(this,arguments)};var d=[].concat(b.t()||[]);f=null;g=b.X(function(c){c=[].concat(c||[]);if(b.Pa("arrayChange")){var e;if(!f||1<k)f=a.a.ib(d,c,b.hb);e=f}d=c;f=null;k=0;e&&e.length&&b.notifySubscribers(e,"arrayChange")})}}b.hb={};c&&"object"==typeof c&&a.a.extend(b.hb,c);b.hb.sparse=!0;if(!b.Vb){var e=!1,f=null,g,k=0,l=b.sa,m=b.Ia;b.sa=function(a){l&&l.call(b,a);"arrayChange"===a&&d()};
8113b.Ia=function(a){m&&m.call(b,a);"arrayChange"!==a||b.Pa("arrayChange")||(g.k(),e=!1)};b.Vb=function(b,c,d){function m(a,b,c){return l[l.length]={status:a,value:b,index:c}}if(e&&!k){var l=[],g=b.length,t=d.length,G=0;switch(c){case "push":G=g;case "unshift":for(c=0;c<t;c++)m("added",d[c],G+c);break;case "pop":G=g-1;case "shift":g&&m("deleted",b[G],G);break;case "splice":c=Math.min(Math.max(0,0>d[0]?g+d[0]:d[0]),g);for(var g=1===t?g:Math.min(c+(d[1]||0),g),t=c+t-2,G=Math.max(g,t),P=[],n=[],Q=2;c<G;++c,
8114++Q)c<g&&n.push(m("deleted",b[c],c)),c<t&&P.push(m("added",d[Q],c));a.a.dc(n,P);break;default:return}f=l}}}};var s=a.a.Yb("_state");a.m=a.B=function(b,c,d){function e(){if(0<arguments.length){if("function"===typeof f)f.apply(g.pb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");return this}a.l.oc(e);(g.S||g.s&&e.Qa())&&e.aa();return g.T}"object"===typeof b?d=b:(d=d||{},b&&(d.read=
8115b));if("function"!=typeof d.read)throw Error("Pass a function that returns the value of the ko.computed");var f=d.write,g={T:n,S:!0,Ra:!1,Fb:!1,R:!1,Va:!1,s:!1,jd:d.read,pb:c||d.owner,i:d.disposeWhenNodeIsRemoved||d.i||null,wa:d.disposeWhen||d.wa,mb:null,r:{},L:0,bc:null};e[s]=g;e.Vc="function"===typeof f;a.a.ka||a.a.extend(e,a.J.fn);a.J.fn.rb(e);a.a.Ya(e,z);d.pure?(g.Va=!0,g.s=!0,a.a.extend(e,$)):d.deferEvaluation&&a.a.extend(e,aa);a.options.deferUpdates&&a.ya.deferred(e,!0);g.i&&(g.Fb=!0,g.i.nodeType||
8116(g.i=null));g.s||d.deferEvaluation||e.aa();
8116g.i&&e.ba()&&a.a.F.oa(g.i,g.mb=function(){e.k()});return e};var z={equalityComparer:J,Aa:function(){return this[s].L},Pb:function(a,c,d){if(this[s].Va&&c===this)throw Error("A 'pure' computed must not be called recursively");this[s].r[a]=d;d.Ga=this[s].L++;d.na=c.Na()},Qa:function(){var a,c,d=this[s].r;for(a in d)if(d.hasOwnProperty(a)&&(c=d[a],c.ia.Uc(c.na)))return!0},bd:function(){this.Fa&&!this[s].Ra&&this.Fa()},ba:function(){return this[s].S||0<this[s].L},
8117ld:function(){this.Mb||this.ac()},uc:function(a){if(a.cb&&!this[s].i){var c=a.X(this.bd,this,"dirty"),d=a.X(this.ld,this);return{ia:a,k:function(){c.k();d.k()}}}return a.X(this.ac,this)},ac:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[s].bc),this[s].bc=a.a.setTimeout(function(){b.aa(!0)},c)):b.Fa?b.Fa():b.aa(!0)},aa:function(b){var c=this[s],d=c.wa;if(!c.Ra&&!c.R){if(c.i&&!a.a.nb(c.i)||d&&d()){if(!c.Fb){this.k();return}}else c.Fb=!1;c.Ra=!0;try{this.Qc(b)}finally{c.Ra=!1}c.L||
8118this.k()}},Qc:function(b){var c=this[s],d=c.Va?n:!c.L,e={Hc:this,Ma:c.r,lb:c.L};a.l.Ub({Gc:e,gb:Y,m:this,Sa:d});c.r={};c.L=0;e=this.Pc(c,e);this.tb(c.T,e)&&(c.s||this.notifySubscribers(c.T,"beforeChange"),c.T=e,c.s?this.zc():b&&this.notifySubscribers(c.T));d&&this.notifySubscribers(c.T,"awake")},Pc:function(b,c){try{var d=b.jd;return b.pb?d.call(b.pb):d()}finally{a.l.end(),c.lb&&!b.s&&a.a.D(c.Ma,X),b.S=!1}},t:function(){var a=this[s];(a.S&&!a.L||a.s&&this.Qa())&&this.aa();return a.T},Ta:function(b){a.J.fn.Ta.call(this,
8119b);this.Fa=function(){this.Kb(this[s].T);this[s].S=!0;this.Lb(this)}},k:function(){var b=this[s];!b.s&&b.r&&a.a.D(b.r,function(a,b){b.k&&b.k()});b.i&&b.mb&&a.a.F.pc(b.i,b.mb);b.r=null;b.L=0;b.R=!0;b.S=!1;b.s=!1;b.i=null}},$={sa:function(b){var c=this,d=c[s];if(!d.R&&d.s&&"change"==b){d.s=!1;if(d.S||c.Qa())d.r=null,d.L=0,d.S=!0,c.aa();else{var e=[];a.a.D(d.r,function(a,b){e[b.Ga]=a});a.a.q(e,function(a,b){var e=d.r[a],l=c.uc(e.ia);l.Ga=b;l.na=e.na;d.r[a]=l})}d.R||c.notifySubscribers(d.T,"awake")}},
8120Ia:function(b){var c=this[s];c.R||"change"!=b||this.Pa("change")||(a.a.D(c.r,function(a,b){b.k&&(c.r[a]={ia:b.ia,Ga:b.Ga,na:b.na},b.k())}),c.s=!0,this.notifySubscribers(n,"asleep"))},Na:function(){var b=this[s];b.s&&(b.S||this.Qa())&&this.aa();return a.J.fn.Na.call(this)}},aa={sa:function(a){"change"!=a&&"beforeChange"!=a||this.t()}};a.a.ka&&a.a.Xa(z,a.J.fn);var R=a.N.gd;a.m[R]=a.N;z[R]=a.m;a.Xc=function(b){return a.Oa(b,a.m)};a.Yc=function(b){return a.Oa(b,a.m)&&b[s]&&b[s].Va};a.b("computed",a.m);
8121a.b("dependentObservable",a.m);a.b("isComputed",a.Xc);a.b("isPureComputed",a.Yc);a.b("computed.fn",z);a.G(z,"peek",z.t);a.G(z,"dispose",z.k);a.G(z,"isActive",z.ba);a.G(z,"getDependenciesCount",z.Aa);a.nc=function(b,c){if("function"===typeof b)return a.m(b,c,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.m(b,c)};a.b("pureComputed",a.nc);(function(){function b(a,f,g){g=g||new d;a=f(a);if("object"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof
8122Number||a instanceof Boolean)return a;var k=a instanceof Array?[]:{};g.save(a,k);c(a,function(c){var d=f(a[c]);switch(typeof d){case "boolean":case "number":case "string":case "function":k[c]=d;break;case "object":case "undefined":var h=g.get(d);k[c]=h!==n?h:b(d,f,g)}});return k}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);"function"==typeof a.toJSON&&b("toJSON")}else for(c in a)b(c)}function d(){this.keys=[];this.Ib=[]}a.wc=function(c){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");
8123return b(c,function(b){for(var c=0;a.H(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.wc(b);return a.a.Eb(b,c,d)};d.prototype={save:function(b,c){var d=a.a.o(this.keys,b);0<=d?this.Ib[d]=c:(this.keys.push(b),this.Ib.push(c))},get:function(b){b=a.a.o(this.keys,b);return 0<=b?this.Ib[b]:n}}})();a.b("toJS",a.wc);a.b("toJSON",a.toJSON);(function(){a.j={u:function(b){switch(a.a.A(b)){case "option":return!0===b.__ko__hasDomDataOptionValue__?a.a.e.get(b,a.d.options.xb):7>=a.a.C?b.getAttributeNode("value")&&
8124b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex]):n;default:return b.value}},ha:function(b,c,d){switch(a.a.A(b)){case "option":switch(typeof c){case "string":a.a.e.set(b,a.d.options.xb,n);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.e.set(b,a.d.options.xb,c),b.__ko__hasDomDataOptionValue__=!0,b.value="number"===typeof c?c:""}break;case "select":if(""===c||
8125null===c)c=n;for(var e=-1,f=0,g=b.options.length,k;f<g;++f)if(k=a.j.u(b.options[f]),k==c||""==k&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e;break;default:if(null===c||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.j);a.b("selectExtensions.readValue",a.j.u);a.b("selectExtensions.writeValue",a.j.ha);a.h=function(){function b(b){b=a.a.$a(b);123===b.charCodeAt(0)&&(b=b.slice(1,-1));var c=[],d=b.match(e),r,k=[],p=0;if(d){d.push(",");for(var A=0,y;y=d[A];++A){var t=y.charCodeAt(0);
8126if(44===t){if(0>
vendor: 18,812 bytes, lines 8126-8162
8126=p){c.push(r&&k.length?{key:r,value:k.join("")}:{unknown:r||k.join("")});r=p=0;k=[];continue}}else if(58===t){if(!p&&!r&&1===k.length){r=k.pop();continue}}else 47===t&&A&&1<y.length?(t=d[A-1].match(f))&&!g[t[0]]&&(b=b.substr(b.indexOf(y)+1),d=b.match(e),d.push(","),A=-1,y="/"):40===t||123===t||91===t?++p:41===t||125===t||93===t?--p:r||k.length||34!==t&&39!==t||(y=y.slice(1,-1));k.push(y)}}return c}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,
8127e=RegExp("\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|/(?:[^/\\\\]|\\\\.)*/w*|[^\\s:,/][^,\"'{}()/:[\\]]*[^\\s,\"'{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,g={"in":1,"return":1,"typeof":1},k={};return{ta:[],ea:k,yb:b,Ua:function(e,m){function h(b,e){var m;if(!A){var l=a.getBindingHandler(b);if(l&&l.preprocess&&!(e=l.preprocess(e,b,h)))return;if(l=k[b])m=e,0<=a.a.o(c,m)?m=!1:(l=m.match(d),m=null===l?!1:l[1]?"Object("+l[1]+")"+l[2]:m),l=m;l&&g.push("'"+b+"':function(_z){"+m+"=_z}")}p&&(e=
8128"function(){return "+e+" }");f.push("'"+b+"':"+e)}m=m||{};var f=[],g=[],p=m.valueAccessors,A=m.bindingParams,y="string"===typeof e?b(e):e;a.a.q(y,function(a){h(a.key||a.unknown,a.value)});g.length&&h("_ko_property_writers","{"+g.join(",")+" }");return f.join(",")},ad:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},Ea:function(b,c,d,e,f){if(b&&a.H(b))!a.Ba(b)||f&&b.t()===e||b(e);else if((b=c.get("_ko_property_writers"))&&b[d])b[d](e)}}}();a.b("expressionRewriting",a.h);a.b("expressionRewriting.bindingRewriteValidators",
8129a.h.ta);a.b("expressionRewriting.parseObjectLiteral",a.h.yb);a.b("expressionRewriting.preProcessBindings",a.h.Ua);a.b("expressionRewriting._twoWayBindings",a.h.ea);a.b("jsonExpressionRewriting",a.h);a.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",a.h.Ua);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&k.test(f?a.text:a.nodeValue)}function d(a,d){for(var e=a,f=1,l=[];e=e.nextSibling;){if(c(e)&&(f--,0===f))return l;l.push(e);
8130b(e)&&f++}if(!d)throw Error("Cannot find closing comment tag to match: "+a.nodeValue);return null}function e(a,b){var c=d(a,b);return c?0<c.length?c[c.length-1].nextSibling:a.nextSibling:null}var f=u&&"\x3c!--test--\x3e"===u.createComment("test").text,g=f?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,k=f?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,l={ul:!0,ol:!0};a.f={Z:{},childNodes:function(a){return b(a)?d(a):a.childNodes},xa:function(c){if(b(c)){c=a.f.childNodes(c);for(var d=
81310,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.ob(c)},da:function(c,d){if(b(c)){a.f.xa(c);for(var e=c.nextSibling,f=0,l=d.length;f<l;f++)e.parentNode.insertBefore(d[f],e)}else a.a.da(c,d)},mc:function(a,c){b(a)?a.parentNode.insertBefore(c,a.nextSibling):a.firstChild?a.insertBefore(c,a.firstChild):a.appendChild(c)},gc:function(c,d,e){e?b(c)?c.parentNode.insertBefore(d,e.nextSibling):e.nextSibling?c.insertBefore(d,e.nextSibling):c.appendChild(d):a.f.mc(c,d)},firstChild:function(a){return b(a)?!a.nextSibling||
8132c(a.nextSibling)?null:a.nextSibling:a.firstChild},nextSibling:function(a){b(a)&&(a=e(a));return a.nextSibling&&c(a.nextSibling)?null:a.nextSibling},Tc:b,pd:function(a){return(a=(f?a.text:a.nodeValue).match(g))?a[1]:null},kc:function(d){if(l[a.a.A(d)]){var h=d.firstChild;if(h){do if(1===h.nodeType){var f;f=h.firstChild;var g=null;if(f){do if(g)g.push(f);else if(b(f)){var k=e(f,!0);k?f=k:g=[f]}else c(f)&&(g=[f]);while(f=f.nextSibling)}if(f=g)for(g=h.nextSibling,k=0;k<f.length;k++)g?d.insertBefore(f[k],
8133g):d.appendChild(f[k])}while(h=h.nextSibling)}}}}})();a.b("virtualElements",a.f);a.b("virtualElements.allowedBindings",a.f.Z);a.b("virtualElements.emptyNode",a.f.xa);a.b("virtualElements.insertAfter",a.f.gc);a.b("virtualElements.prepend",a.f.mc);a.b("virtualElements.setDomNodeChildren",a.f.da);(function(){a.Q=function(){this.Fc={}};a.a.extend(a.Q.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=b.getAttribute("data-bind")||a.g.getComponentNameForNode(b);case 8:return a.f.Tc(b);
8134default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.g.Ob(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.g.Ob(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return a.f.pd(b);default:return null}},parseBindingsString:function(b,c,d,e){try{var f=this.Fc,g=b+(e&&e.valueAccessors||
8135""),k;if(!(k=f[g])){var l,m="with($context){with($data||{}){return{"+a.h.Ua(b,e)+"}}}";l=new Function("$context","$element",m);k=f[g]=l}return k(c,d)}catch(h){throw h.message="Unable to parse bindings.\nBindings value: "+b+"\nMessage: "+h.message,h;}}});a.Q.instance=new a.Q})();a.b("bindingProvider",a.Q);(function(){function b(a){return function(){return a}}function c(a){return a()}function d(b){return a.a.Ca(a.l.w(b),function(a,c){return function(){return b()[c]}})}function e(c,e,h){return"function"===
8136typeof c?d(c.bind(null,e,h)):a.a.Ca(c,b)}function f(a,b){return d(this.getBindings.bind(this,a,b))}function g(b,c,d){var e,h=a.f.firstChild(c),f=a.Q.instance,m=f.preprocessNode;if(m){for(;e=h;)h=a.f.nextSibling(e),m.call(f,e);h=a.f.firstChild(c)}for(;e=h;)h=a.f.nextSibling(e),k(b,e,d)}function k(b,c,d){var e=!0,h=1===c.nodeType;h&&a.f.kc(c);if(h&&d||a.Q.instance.nodeHasBindings(c))e=m(c,null,b,d).shouldBindDescendants;e&&!r[a.a.A(c)]&&g(b,c,!h)}function l(b){var c=[],d={},e=[];a.a.D(b,function Z(h){if(!d[h]){var f=
8137a.getBindingHandler(h);f&&(f.after&&(e.push(h),a.a.q(f.after,function(c){if(b[c]){if(-1!==a.a.o(e,c))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+e.join(", "));Z(c)}}),e.length--),c.push({key:h,fc:f}));d[h]=!0}});return c}function m(b,d,e,h){var m=a.a.e.get(b,q);if(!d){if(m)throw Error("You cannot apply bindings multiple times to the same element.");a.a.e.set(b,q,!0)}!m&&h&&a.tc(b,e);var g;if(d&&"function"!==typeof d)g=d;else{var k=a.Q.instance,r=k.getBindingAccessors||
8138f,p=a.B(function(){(g=d?d(e,b):r.call(k,b,e))&&e.P&&e.P();return g},null,{i:b});g&&p.ba()||(p=null)}var u;if(g){var v=p?function(a){return function(){return c(p()[a])}}:function(a){return g[a]},s=function(){return a.a.Ca(p?p():g,c)};s.get=function(a){return g[a]&&c(v(a))};s.has=function(a){return a in g};h=l(g);a.a.q(h,function(c){var d=c.fc.init,h=c.fc.update,f=c.key;if(8===b.nodeType&&!a.f.Z[f])throw Error("The binding '"+f+"' cannot be used with virtual elements");try{"function"==typeof d&&a.l.w(function(){var a=
8139d(b,v(f),s,e.$data,e);if(a&&a.controlsDescendantBindings){if(u!==n)throw Error("Multiple bindings ("+u+" and "+f+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");u=f}}),"function"==typeof h&&a.B(function(){h(b,v(f),s,e.$data,e)},null,{i:b})}catch(m){throw m.message='Unable to process binding "'+f+": "+g[f]+'"\nMessage: '+m.message,m;}})}return{shouldBindDescendants:u===n}}function h(b){return b&&b instanceof a.U?b:new a.U(b)}
8140a.d={};var r={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.d[b]};a.U=function(b,c,d,e){var h=this,f="function"==typeof b&&!a.H(b),m,g=a.B(function(){var m=f?b():b,l=a.a.c(m);c?(c.P&&c.P(),a.a.extend(h,c),g&&(h.P=g)):(h.$parents=[],h.$root=l,h.ko=a);h.$rawData=m;h.$data=l;d&&(h[d]=l);e&&e(h,c,l);return h.$data},null,{wa:function(){return m&&!a.a.Qb(m)},i:!0});g.ba()&&(h.P=g,g.equalityComparer=null,m=[],g.Ac=function(b){m.push(b);a.a.F.oa(b,function(b){a.a.La(m,b);m.length||
8141(g.k(),h.P=g=n)})})};a.U.prototype.createChildContext=function(b,c,d){return new a.U(b,this,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);d&&d(a)})};a.U.prototype.extend=function(b){return new a.U(this.P||this.$data,this,null,function(c,d){c.$rawData=d.$rawData;a.a.extend(c,"function"==typeof b?b():b)})};var q=a.a.e.I(),p=a.a.e.I();a.tc=function(b,c){if(2==arguments.length)a.a.e.set(b,p,c),c.P&&c.P.Ac(b);else return a.a.e.get(b,
8142p)};a.Ja=function(b,c,d){1===b.nodeType&&a.f.kc(b);return m(b,c,h(d),!0)};a.Dc=function(b,c,d){d=h(d);return a.Ja(b,e(c,d,b),d)};a.eb=function(a,b){1!==b.nodeType&&8!==b.nodeType||g(h(a),b,!0)};a.Rb=function(a,b){!v&&x.jQuery&&(v=x.jQuery);if(b&&1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");b=b||x.document.body;k(h(a),b,!0)};a.kb=function(b){switch(b.nodeType){case 1:case 8:var c=a.tc(b);if(c)return c;
8143if(b.parentNode)return a.kb(b.parentNode)}return n};a.Jc=function(b){return(b=a.kb(b))?b.$data:n};a.b("bindingHandlers",a.d);a.b("applyBindings",a.Rb);a.b("applyBindingsToDescendants",a.eb);a.b("applyBindingAccessorsToNode",a.Ja);a.b("applyBindingsToNode",a.Dc);a.b("contextFor",a.kb);a.b("dataFor",a.Jc)})();(function(b){function c(c,e){var m=f.hasOwnProperty(c)?f[c]:b,h;m?m.X(e):(m=f[c]=new a.J,m.X(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,Zc:e};delete f[c];h||e?m.notifySubscribers(b):
8144a.Y.Wa(function(){m.notifySubscribers(b)})}),h=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",[a,c],function(a){b(a,c)}):b(null,null)})}function e(c,d,f,h){h||(h=a.g.loaders.slice(0));var g=h.shift();if(g){var q=g[c];if(q){var p=!1;if(q.apply(g,d.concat(function(a){p?f(null):null!==a?f(a):e(c,d,f,h)}))!==b&&(p=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,h)}else f(null)}
8145var f={},g={};a.g={get:function(d,e){var f=g.hasOwnProperty(d)?g[d]:b;f?f.Zc?a.l.w(function(){e(f.definition)}):a.Y.Wa(function(){e(f.definition)}):c(d,e)},Xb:function(a){delete g[a]},Jb:e};a.g.loaders=[];a.b("components",a.g);a.b("components.get",a.g.get);a.b("components.clearCachedDefinition",a.g.Xb)})();(function(){function b(b,c,d,e){function g(){0===--y&&e(k)}var k={},y=2,t=d.template;d=d.viewModel;t?f(c,t,function(c){a.g.Jb("loadTemplate",[b,c],function(a){k.template=a;g()})}):g();d?f(c,d,function(c){a.g.Jb("loadViewModel",
8146[b,c],function(a){k[l]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)});else if("function"===typeof b[l])d(b[l]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.A(b)){case "script":return a.a.ma(b.text);case "textarea":return a.a.ma(b.value);case "template":if(e(b.content))return a.a.ua(b.content.childNodes)}return a.a.ua(b.childNodes)}function e(a){return x.DocumentFragment?
8147a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require?O||x.require?(O||x.require)([b.require],c):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+a+"': "+b);}}var k={};a.g.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.g.ub(b))throw Error("Component "+b+" is already registered");k[b]=c};a.g.ub=function(a){return k.hasOwnProperty(a)};a.g.od=function(b){delete k[b];
8148a.g.Xb(b)};a.g.Zb={getConfig:function(a,b){b(k.hasOwnProperty(a)?k[a]:null)},loadComponent:function(a,c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.ma(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.V(c.childNodes));else if(c.element)if(c=c.element,x.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var l=u.getElementById(c);l?f(d(l)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+
8149c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),b,d)}};var l="createViewModel";a.b("components.register",a.g.register);a.b("components.isRegistered",a.g.ub);a.b("components.unregister",a.g.od);a.b("components.defaultLoader",a.g.Zb);a.g.loaders.push(a.g.Zb);a.g.Bc=k})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ca(f,function(c){return a.m(c,null,{i:b})}),g=a.a.Ca(f,function(c){var e=
8150c.t();return c.ba()?a.m({read:function(){return a.a.c(c())},write:a.Ba(e)&&function(a){c()(a)},i:b}):e});g.hasOwnProperty("$raw")||(g.$raw=f);return g}return{$raw:{}}}a.g.getComponentNameForNode=function(b){var c=a.a.A(b);if(a.g.ub(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.C&&b.tagName===c))return c};a.g.Ob=function(c,e,f,g){if(1===e.nodeType){var k=a.g.getComponentNameForNode(e);if(k){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component');
8151var l={name:k,params:b(e,f)};c.component=g?function(){return l}:l}}return c};var c=new a.Q;9>a.a.C&&(a.g.register=function(a){return function(b){u.createElement(b);return a.apply(this,arguments)}}(a.g.register),u.createDocumentFragment=function(b){return function(){var c=b(),f=a.g.Bc,g;for(g in f)f.hasOwnProperty(g)&&c.createElement(g);return c}}(u.createDocumentFragment))})();(function(b){function c(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.ua(c);a.f.da(d,b)}
8152function d(a,b,c,d){var e=a.createViewModel;return e?e.call(a,d,{element:b,templateNodes:c}):d}var e=0;a.d.component={init:function(f,g,k,l,m){function h(){var a=r&&r.dispose;"function"===typeof a&&a.call(r);q=r=null}var r,q,p=a.a.V(a.f.childNodes(f));a.a.F.oa(f,h);a.m(function(){var l=a.a.c(g()),k,t;"string"===typeof l?k=l:(k=a.a.c(l.name),t=a.a.c(l.params));if(!k)throw Error("No component name specified");var n=q=++e;a.g.get(k,function(e){if(q===n){h();if(!e)throw Error("Unknown component '"+k+
8153"'");c(k,e,f);var g=d(e,f,p,t);e=m.createChildContext(g,b,function(a){a.$component=g;a.$componentTemplateNodes=p});r=g;a.eb(e,f)}})},null,{i:f});return{controlsDescendantBindings:!0}}};a.f.Z.component=!0})();var S={"class":"className","for":"htmlFor"};a.d.attr={update:function(b,c){var d=a.a.c(c())||{};a.a.D(d,function(c,d){d=a.a.c(d);var g=!1===d||null===d||d===n;g&&b.removeAttribute(c);8>=a.a.C&&c in S?(c=S[c],g?b.removeAttribute(c):b[c]=d):g||b.setAttribute(c,d.toString());"name"===c&&a.a.rc(b,
8154g?"":d.toString())})}};(function(){a.d.checked={after:["value","attr"],init:function(b,c,d){function e(){var e=b.checked,f=p?g():e;if(!a.va.Sa()&&(!l||e)){var m=a.l.w(c);if(h){var k=r?m.t():m;q!==f?(e&&(a.a.pa(k,f,!0),a.a.pa(k,q,!1)),q=f):a.a.pa(k,f,e);r&&a.Ba(m)&&m(k)}else a.h.Ea(m,d,"checked",f,!0)}}function f(){var d=a.a.c(c());b.checked=h?0<=a.a.o(d,g()):k?d:g()===d}var g=a.nc(function(){return d.has("checkedValue")?a.a.c(d.get("checkedValue")):d.has("value")?a.a.c(d.get("value")):b.value}),k=
8155"checkbox"==b.type,l="radio"==b.type;if(k||l){var m=c(),h=k&&a.a.c(m)instanceof Array,r=!(h&&m.push&&m.splice),q=h?g():n,p=l||h;l&&!b.name&&a.d.uniqueName.init(b,function(){return!0});a.m(e,null,{i:b});a.a.p(b,"click",e);a.m(f,null,{i:b});m=n}}};a.h.ea.checked=!0;a.d.checkedValue={update:function(b,c){b.value=a.a.c(c())}}})();a.d.css={update:function(b,c){var d=a.a.c(c());null!==d&&"object"==typeof d?a.a.D(d,function(c,d){d=a.a.c(d);a.a.bb(b,c,d)}):(d=a.a.$a(String(d||"")),a.a.bb(b,b.__ko__cssValue,
8156!1),b.__ko__cssValue=d,a.a.bb(b,d,!0))}};a.d.enable={update:function(b,c){var d=a.a.c(c());d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.d.disable={update:function(b,c){a.d.enable.update(b,function(){return!a.a.c(c())})}};a.d.event={init:function(b,c,d,e,f){var g=c()||{};a.a.D(g,function(g){"string"==typeof g&&a.a.p(b,g,function(b){var m,h=c()[g];if(h){try{var r=a.a.V(arguments);e=f.$data;r.unshift(e);m=h.apply(e,r)}finally{!0!==m&&(b.preventDefault?b.preventDefault():
8157b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.d.foreach={ic:function(b){return function(){var c=b(),d=a.a.zb(c);if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.W.sb};a.a.c(c);return{foreach:d.data,as:d.as,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.W.sb}}},init:function(b,c){return a.d.template.init(b,
8158a.d.foreach.ic(c))},update:function(b,c,d,e,f){return a.d.template.update(b,a.d.foreach.ic(c),d,e,f)}};a.h.ta.foreach=!1;a.f.Z.foreach=!0;a.d.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(h){g=f.body}e=g===b}f=c();a.h.Ea(f,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.p(b,"focus",f);a.a.p(b,"focusin",f);a.a.p(b,"blur",g);a.a.p(b,
8159"focusout",g)},update:function(b,c){var d=!!a.a.c(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.l.w(a.a.Da,null,[b,d?"focusin":"focusout"]))}};a.h.ea.hasfocus=!0;a.d.hasFocus=a.d.hasfocus;a.h.ea.hasFocus=!0;a.d.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Cb(b,c())}};K("if");K("ifnot",!1,!0);K("with",!0,!1,function(a,c){return a.createChildContext(c)});var L={};
8160a.d.options={init:function(b){if("select"!==a.a.A(b))throw Error("options binding applies only to SELECT elements");for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.Ka(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c}function g(c,e){if(A&&h)a.j.ha(b,a.a.c(d.get("value")),!0);else if(p.length){var f=0<=a.a.o(p,a.j.u(e[0]));a.a.sc(e[0],f);A&&!f&&a.l.w(a.a.Da,null,[b,
8161"change"])}}var k=b.multiple,l=0!=b.length&&k?b.scrollTop:null,m=a.a.c(c()),h=d.get("valueAllowUnset")&&d.has("value"),r=d.get("optionsIncludeDestroyed");c={};var q,p=[];h||(k?p=a.a.fb(e(),a.j.u):0<=b.selectedIndex&&p.push(a.j.u(b.options[b.selectedIndex])));m&&("undefined"==typeof m.length&&(m=[m]),q=a.a.Ka(m,function(b){return r||b===n||null===b||!a.a.c(b._destroy)}),d.has("optionsCaption")&&(m=a.a.c(d.get("optionsCaption")),null!==m&&m!==n&&q.unshift(L)));var A=!1;c.beforeRemove=function(a){b.removeChild(a)};
8162m=g;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(m=function(b,c){g(0,c);a.l.w(d.get("optionsAfterRender"),null,[c[0],b!==L?b:n])});a.a.Bb(b,q,function(c,e,g){g.length&&(p=!h&&g[0].selected?[a.j.u(g[0])]:[],A=!0);e=b.ownerDocument.createElement("option");
8162c===L?(a.a.Za(e,d.get("optionsCaption")),a.j.ha(e,n)):(g=f(c,d.get("optionsValue"),c),a.j.ha(e,a.a.c(g)),c=f(c,d.get("optionsText"),g),a.a.Za(e,c));return[e]},c,m);a.l.w(function(){h?a.j.ha(b,a.a.c(d.get("value")),
8163!0):(k?p.length&&e().length<p.length:p.length&&0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex])!==p[0]:p.length||0<=b.selectedIndex)&&a.a.Da(b,"change")});a.a.Nc(b);l&&20<Math.abs(l-b.scrollTop)&&(b.scrollTop=l)}};a.d.options.xb=a.a.e.I();a.d.selectedOptions={after:["options","foreach"],init:function(b,c,d){a.a.p(b,"change",function(){var e=c(),f=[];a.a.q(b.getElementsByTagName("option"),function(b){b.selected&&f.push(a.j.u(b))});a.h.Ea(e,d,"selectedOptions",f)})},update:function(b,c){if("select"!=
8164a.a.A(b))throw Error("values binding applies only to SELECT elements");var d=a.a.c(c()),e=b.scrollTop;d&&"number"==typeof d.length&&a.a.q(b.getElementsByTagName("option"),function(b){var c=0<=a.a.o(d,a.j.u(b));b.selected!=c&&a.a.sc(b,c)});b.scrollTop=e}};a.h.ea.selectedOptions=!0;a.d.style={update:function(b,c){var d=a.a.c(c()||{});a.a.D(d,function(c,d){d=a.a.c(d);if(null===d||d===n||!1===d)d="";b.style[c]=d})}};a.d.submit={init:function(b,c,d,e,f){if("function"!=typeof c())throw Error("The value for a submit binding must be a function");
8165a.a.p(b,"submit",function(a){var d,e=c();try{d=e.call(f.$data,b)}finally{!0!==d&&(a.preventDefault?a.preventDefault():a.returnValue=!1)}})}};a.d.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Za(b,c())}};a.f.Z.text=!0;(function(){if(x&&x.navigator)var b=function(a){if(a)return parseFloat(a[1])},c=x.opera&&x.opera.version&&parseInt(x.opera.version()),d=x.navigator.userAgent,e=b(d.match(/^(?:(?!chrome).)*version\/([^ ]*) safari/i)),f=b(d.match(/Firefox\/([^ ]*)/));
8166if(10>a.a.C)var g=a.a.e.I(),k=a.a.e.I(),l=function(b){var c=this.activeElement;(c=c&&a.a.e.get(c,k))&&c(b)},m=function(b,c){var d=b.ownerDocument;a.a.e.get(d,g)||(a.a.e.set(d,g,!0),a.a.p(d,"selectionchange",l));a.a.e.set(b,k,c)};a.d.textInput={init:function(b,d,g){function l(c,d){a.a.p(b,c,d)}function k(){var c=a.a.c(d());if(null===c||c===n)c="";v!==n&&c===v?a.a.setTimeout(k,4):b.value!==c&&(u=c,b.value=c)}function y(){s||(v=b.value,s=a.a.setTimeout(t,4))}function t(){clearTimeout(s);v=s=n;var c=
8167b.value;u!==c&&(u=c,a.h.Ea(d(),g,"textInput",c))}var u=b.value,s,v,x=9==a.a.C?y:t;10>a.a.C?(l("propertychange",function(a){"value"===a.propertyName&&x(a)}),8==a.a.C&&(l("keyup",t),l("keydown",t)),8<=a.a.C&&(m(b,x),l("dragend",y))):(l("input",t),5>e&&"textarea"===a.a.A(b)?(l("keydown",y),l("paste",y),l("cut",y)):11>c?l("keydown",y):4>f&&(l("DOMAutoComplete",t),l("dragdrop",t),l("drop",t)));l("change",t);a.m(k,null,{i:b})}};a.h.ea.textInput=!0;a.d.textinput={preprocess:function(a,b,c){c("textInput",
8168a)}}})();a.d.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+ ++a.d.uniqueName.Ic;a.a.rc(b,d)}}};a.d.uniqueName.Ic=0;a.d.value={after:["options","foreach"],init:function(b,c,d){if("input"!=b.tagName.toLowerCase()||"checkbox"!=b.type&&"radio"!=b.type){var e=["change"],f=d.get("valueUpdate"),g=!1,k=null;f&&("string"==typeof f&&(f=[f]),a.a.ra(e,f),e=a.a.Tb(e));var l=function(){k=null;g=!1;var e=c(),f=a.j.u(b);a.h.Ea(e,d,"value",f)};!a.a.C||"input"!=b.tagName.toLowerCase()||"text"!=b.type||
8169"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.o(e,"propertychange")||(a.a.p(b,"propertychange",function(){g=!0}),a.a.p(b,"focus",function(){g=!1}),a.a.p(b,"blur",function(){g&&l()}));a.a.q(e,function(c){var d=l;a.a.nd(c,"after")&&(d=function(){k=a.j.u(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.p(b,c,d)});var m=function(){var e=a.a.c(c()),f=a.j.u(b);if(null!==k&&e===k)a.a.setTimeout(m,0);else if(e!==f)if("select"===a.a.A(b)){var g=d.get("valueAllowUnset"),f=function(){a.j.ha(b,
8170e,g)};f();g||e===a.j.u(b)?a.a.setTimeout(f,0):a.l.w(a.a.Da,null,[b,"change"])}else a.j.ha(b,e)};a.m(m,null,{i:b})}else a.Ja(b,{checkedValue:c})},update:function(){}};a.h.ea.value=!0;a.d.visible={update:function(b,c){var d=a.a.c(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};(function(b){a.d[b]={init:function(c,d,e,f,g){return a.d.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click");a.O=function(){};a.O.prototype.renderTemplateSource=
8171function(){throw Error("Override renderTemplateSource");};a.O.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.O.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||u;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.v.n(d)}if(1==b.nodeType||8==b.nodeType)return new a.v.qa(b);throw Error("Unknown template type: "+b);};a.O.prototype.renderTemplate=function(a,c,d,e){a=this.makeTemplateSource(a,
8172e);return this.renderTemplateSource(a,c,d,e)};a.O.prototype.isTemplateRewritten=function(a,c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.O.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.O);a.Gb=function(){function b(b,c,d,k){b=a.h.yb(b);for(var l=a.h.ta,m=0;m<b.length;m++){var h=b[m].key;if(l.hasOwnProperty(h)){var r=l[h];if("function"===typeof r){if(h=
8173r(b[m].value))throw Error(h);}else if(!r)throw Error("This template engine does not support the '"+h+"' binding within its templates");}}d="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+a.h.Ua(b,{valueAccessors:!0})+" } })()},'"+d.toLowerCase()+"')";return k.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>
8173]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{Oc:function(b,
8174c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.Gb.dd(b,c)},d)},dd:function(a,f){return a.replace(c,function(a,c,d,e,h){return b(h,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},Ec:function(b,c){return a.M.wb(function(d,k){var l=d.nextSibling;l&&l.nodeName.toLowerCase()===c&&a.Ja(l,b,k)})}}}();a.b("__tr_ambtns",a.Gb.Ec);(function(){a.v={};a.v.n=function(b){if(this.n=b){var c=a.a.A(b);this.ab="script"===c?1:"textarea"===c?2:"template"==c&&
8175b.content&&11===b.content.nodeType?3:4}};a.v.n.prototype.text=function(){var b=1===this.ab?"text":2===this.ab?"value":"innerHTML";if(0==arguments.length)return this.n[b];var c=arguments[0];"innerHTML"===b?a.a.Cb(this.n,c):this.n[b]=c};var b=a.a.e.I()+"_";a.v.n.prototype.data=function(c){if(1===arguments.length)return a.a.e.get(this.n,b+c);a.a.e.set(this.n,b+c,arguments[1])};var c=a.a.e.I();a.v.n.prototype.nodes=function(){var b=this.n;if(0==arguments.length)return(a.a.e.get(b,c)||{}).jb||(3===this.ab?
8176b.content:4===this.ab?b:n);a.a.e.set(b,c,{jb:arguments[0]})};a.v.qa=function(a){this.n=a};a.v.qa.prototype=new a.v.n;a.v.qa.prototype.text=function(){if(0==arguments.length){var b=a.a.e.get(this.n,c)||{};b.Hb===n&&b.jb&&(b.Hb=b.jb.innerHTML);return b.Hb}a.a.e.set(this.n,c,{Hb:arguments[0]})};a.b("templateSources",a.v);a.b("templateSources.domElement",a.v.n);a.b("templateSources.anonymousTemplate",a.v.qa)})();(function(){function b(b,c,d){var e;for(c=a.f.nextSibling(c);b&&(e=b)!==c;)b=a.f.nextSibling(e),
8177d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,k=a.Q.instance,n=k.preprocessNode;if(n){b(e,f,function(a,b){var c=a.previousSibling,d=n.call(k,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):(c.push(e,f),a.a.za(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.Rb(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.M.yc(b,[d])});a.a.za(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,
8178e,f,k,q){q=q||{};var p=(b&&d(b)||f||{}).ownerDocument,n=q.templateEngine||g;a.Gb.Oc(f,n,p);f=n.renderTemplate(f,k,q,p);if("number"!=typeof f.length||0<f.length&&"number"!=typeof f[0].nodeType)throw Error("Template engine must return an array of DOM nodes");p=!1;switch(e){case "replaceChildren":a.f.da(b,f);p=!0;break;case "replaceNode":a.a.qc(b,f);p=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+e);}p&&(c(f,k),q.afterRender&&a.l.w(q.afterRender,null,[f,k.$data]));
8179return f}function f(b,c,d){return a.H(b)?b():"function"===typeof b?b(c,d):b}var g;a.Db=function(b){if(b!=n&&!(b instanceof a.O))throw Error("templateEngine must inherit from ko.templateEngine");g=b};a.Ab=function(b,c,h,k,q){h=h||{};if((h.templateEngine||g)==n)throw Error("Set a template engine before calling renderTemplate");q=q||"replaceChildren";if(k){var p=d(k);return a.B(function(){var g=c&&c instanceof a.U?c:new a.U(a.a.c(c)),n=f(b,g.$data,g),g=e(k,q,n,g,h);"replaceNode"==q&&(k=g,p=d(k))},null,
8180{wa:function(){return!p||!a.a.nb(p)},i:p&&"replaceNode"==q?p.parentNode:p})}return a.M.wb(function(d){a.Ab(b,c,h,d,"replaceNode")})};a.kd=function(b,d,g,k,q){function p(a,b){c(b,s);g.afterRender&&g.afterRender(b,a);s=null}function u(a,c){s=q.createChildContext(a,g.as,function(a){a.$index=c});var d=f(b,a,s);return e(null,"ignoreTargetNode",d,s,g)}var s;return a.B(function(){var b=a.a.c(d)||[];"undefined"==typeof b.length&&(b=[b]);b=a.a.Ka(b,function(b){return g.includeDestroyed||b===n||null===b||!a.a.c(b._destroy)});
8181a.l.w(a.a.Bb,null,[k,b,u,g,p])},null,{i:k})};var k=a.a.e.I();a.d.template={init:function(b,c){var d=a.a.c(c());if("string"==typeof d||d.name)a.f.xa(b);else{if("nodes"in d){if(d=d.nodes||[],a.H(d))throw Error('The "nodes" option must be a plain, non-observable array.');}else d=a.f.childNodes(b);d=a.a.jc(d);(new a.v.qa(b)).nodes(d)}return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c(),s;c=a.a.c(g);d=!0;e=null;"string"==typeof c?c={}:(g=c.name,"if"in c&&(d=a.a.c(c["if"])),d&&"ifnot"in
8182c&&(d=!a.a.c(c.ifnot)),s=a.a.c(c.data));"foreach"in c?e=a.kd(g||b,d&&c.foreach||[],c,b,f):d?(f="data"in c?f.createChildContext(s,c.as):f,e=a.Ab(g||b,f,c,b)):a.f.xa(b);f=e;(s=a.a.e.get(b,k))&&"function"==typeof s.k&&s.k();a.a.e.set(b,k,f&&f.ba()?f:n)}};a.h.ta.template=function(b){b=a.h.yb(b);return 1==b.length&&b[0].unknown||a.h.ad(b,"name")?null:"This template engine does not support anonymous templates nested within its templates"};a.f.Z.template=!0})();a.b("setTemplateEngine",a.Db);a.b("renderTemplate",
8183a.Ab);a.a.dc=function(a,c,d){if(a.length&&c.length){var e,f,g,k,l;for(e=f=0;(!d||e<d)&&(k=a[f]);++f){for(g=0;l=c[g];++g)if(k.value===l.value){k.moved=l.index;l.moved=k.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.ib=function(){function b(b,d,e,f,g){var k=Math.min,l=Math.max,m=[],h,n=b.length,q,p=d.length,s=p-n||1,u=n+p+1,t,v,x;for(h=0;h<=n;h++)for(v=t,m.push(t=[]),x=k(p,h+s),q=l(0,h-1);q<=x;q++)t[q]=q?h?b[h-1]===d[q-1]?v[q-1]:k(v[q]||u,t[q-1]||u)+1:q+1:h+1;k=[];l=[];s=[];h=n;for(q=p;h||q;)p=m[h][q]-
81841,q&&p===m[h][q-1]?l.push(k[k.length]={status:e,value:d[--q],index:q}):h&&p===m[h-1][q]?s.push(k[k.length]={status:f,value:b[--h],index:h}):(--q,--h,g.sparse||k.push({status:"retained",value:d[q]}));a.a.dc(s,l,!g.dontLimitMoves&&10*n);return k.reverse()}return function(a,d,e){e="boolean"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,"added","deleted",e):b(d,a,"deleted","added",e)}}();a.b("utils.compareArrays",a.a.ib);(function(){function b(b,c,d,k,l){var m=[],
8185h=a.B(function(){var h=c(d,l,a.a.za(m,b))||[];0<m.length&&(a.a.qc(m,h),k&&a.l.w(k,null,[d,h,l]));m.length=0;a.a.ra(m,h)},null,{i:b,wa:function(){return!a.a.Qb(m)}});return{ca:m,B:h.ba()?h:n}}var c=a.a.e.I(),d=a.a.e.I();a.a.Bb=function(e,f,g,k,l){function m(b,c){w=q[c];v!==c&&(D[b]=w);w.qb(v++);a.a.za(w.ca,e);u.push(w);z.push(w)}function h(b,c){if(b)for(var d=0,e=c.length;d<e;d++)c[d]&&a.a.q(c[d].ca,function(a){b(a,d,c[d].ja)})}f=f||[];k=k||{};var r=a.a.e.get(e,c)===n,q=a.a.e.get(e,c)||[],p=a.a.fb(q,
8186function(a){return a.ja}),s=a.a.ib(p,f,k.dontLimitMoves),u=[],t=0,v=0,x=[],z=[];f=[];for(var D=[],p=[],w,C=0,B,E;B=s[C];C++)switch(E=B.moved,B.status){case "deleted":E===n&&(w=q[t],w.B&&(w.B.k(),w.B=n),a.a.za(w.ca,e).length&&(k.beforeRemove&&(u.push(w),z.push(w),w.ja===d?w=null:f[C]=w),w&&x.push.apply(x,w.ca)));t++;break;case "retained":m(C,t++);break;case "added":E!==n?m(C,E):(w={ja:B.value,qb:a.N(v++)},u.push(w),z.push(w),r||(p[C]=w))}a.a.e.set(e,c,u);h(k.beforeMove,D);
8186a.a.q(x,k.beforeRemove?a.$:
8187a.removeNode);for(var C=0,r=a.f.firstChild(e),F;w=z[C];C++){w.ca||a.a.extend(w,b(e,g,w.ja,l,w.qb));for(t=0;s=w.ca[t];r=s.nextSibling,F=s,t++)s!==r&&a.f.gc(e,s,F);!w.Wc&&l&&(l(w.ja,w.ca,w.qb),w.Wc=!0)}h(k.beforeRemove,f);for(C=0;C<f.length;++C)f[C]&&(f[C].ja=d);h(k.afterMove,D);h(k.afterAdd,p)}})();a.b("utils.setDomNodeChildrenFromArrayMapping",a.a.Bb);a.W=function(){this.allowTemplateRewriting=!1};a.W.prototype=new a.O;a.W.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.C?0:b.nodes)?
8188b.nodes():null)return a.a.V(c.cloneNode(!0).childNodes);b=b.text();return a.a.ma(b,e)};a.W.sb=new a.W;a.Db(a.W.sb);a.b("nativeTemplateEngine",a.W);(function(){a.vb=function(){var a=this.$c=function(){if(!v||!v.tmpl)return 0;try{if(0<=v.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,e,f,g){g=g||u;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var k=b.data("precompiled");
8189k||(k=b.text()||"",k=v.template(null,"{{ko_with $item.koBindingContext}}"+k+"{{/ko_with}}"),b.data("precompiled",k));b=[e.$data];e=v.extend({koBindingContext:e},f.templateOptions);e=v.tmpl(k,b,e);e.appendTo(g.createElement("div"));v.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){u.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(v.tmpl.tag.ko_code={open:"__.push($1 || '');"},
8190v.tmpl.tag.ko_with = { open: "with($1) {", close: "} " })
8191}; a.vb.prototype = new a.O; var b = new a.vb; 0 < b.$c && a.Db(b); a.b("jqueryTmplTemplateEngine", a.vb)
8192})()
8193})
8194})();
8195})();
8196(function (e) { "function" === typeof require && "object" === typeof exports && "object" === typeof module ? e(require("knockout"), exports) : "function" === typeof define && define.amd ? define(["knockout", "exports"], e) : e(ko, ko.mapping = {}) })(function (e, f) {
8197    function y(b, c) {
8198        var a, d; for (d in c) if (c.hasOwnProperty(d) && c[d]) if (a = f.getType(b[d]), d && b[d] && "array" !== a && "string" !== a) y(b[d], c[d]); else if ("array" === f.getType(b[d]) && "array" === f.getType(c[d])) {
8199            a = b; for (var e = d, l = b[d], n = c[d], t = {}, g = l.length - 1; 0 <= g; --g) t[l[g]] = l[g]; for (g =
8200            n.length - 1; 0 <= g; --g) t[n[g]] = n[g]; l = []; n = void 0; for (n in t) l.push(t[n]); a[e] = l
8201        } else b[d] = c[d]
8202    } function E(b, c) { var a = {}; y(a, b); y(a, c); return a } function z(b, c) {
8203        for (var a = E({}, b), e = L.length - 1; 0 <= e; e--) { var f = L[e]; a[f] && (a[""] instanceof Object || (a[""] = {}), a[""][f] = a[f], delete a[f]) } c && (a.ignore = h(c.ignore, a.ignore), a.include = h(c.include, a.include), a.copy = h(c.copy, a.copy), a.observe = h(c.observe, a.observe)); a.ignore = h(a.ignore, j.ignore); a.include = h(a.include, j.include); a.copy = h(a.copy, j.copy); a.observe = h(a.observe,
8204        j.observe); a.mappedProperties = a.mappedProperties || {}; a.copiedProperties = a.copiedProperties || {}; return a
8205    } function h(b, c) { "array" !== f.getType(b) && (b = "undefined" === f.getType(b) ? [] : [b]); "array" !== f.getType(c) && (c = "undefined" === f.getType(c) ? [] : [c]); return e.utils.arrayGetDistinctValues(b.concat(c)) } function F(b, c, a, d, k, l, n) {
8206        var t = "array" === f.getType(e.utils.unwrapObservable(c)); l = l || ""; if (f.isMapped(b)) { var g = e.utils.unwrapObservable(b)[p]; a = E(g, a) } var j = n || k, h = function () {
8207            return a[d] && a[d].create instanceof
8208            Function
8209        }, x = function (b) {
8210            var f = G, g = e.dependentObservable; e.dependentObservable = function (a, b, c) { c = c || {}; a && "object" == typeof a && (c = a); var d = c.deferEvaluation, M = !1; c.deferEvaluation = !0; a = new H(a, b, c); if (!d) { var g = a, d = e.dependentObservable; e.dependentObservable = H; a = e.isWriteableObservable(g); e.dependentObservable = d; d = H({ read: function () { M || (e.utils.arrayRemoveItem(f, g), M = !0); return g.apply(g, arguments) }, write: a && function (a) { return g(a) }, deferEvaluation: !0 }); d.__DO = g; a = d; f.push(a) } return a }; e.dependentObservable.fn =
8211            H.fn; e.computed = e.dependentObservable; b = e.utils.unwrapObservable(k) instanceof Array ? a[d].create({ data: b || c, parent: j, skip: N }) : a[d].create({ data: b || c, parent: j }); e.dependentObservable = g; e.computed = e.dependentObservable; return b
8212        }, u = function () { return a[d] && a[d].update instanceof Function }, v = function (b, f) { var g = { data: f || c, parent: j, target: e.utils.unwrapObservable(b) }; e.isWriteableObservable(b) && (g.observable = b); return a[d].update(g) }; if (n = I.get(c)) return n; d = d || ""; if (t) {
8213            var t = [], s = !1, m = function (a) { return a };
8214            a[d] && a[d].key && (m = a[d].key, s = !0); e.isObservable(b) || (b = e.observableArray([]), b.mappedRemove = function (a) { var c = "function" == typeof a ? a : function (b) { return b === m(a) }; return b.remove(function (a) { return c(m(a)) }) }, b.mappedRemoveAll = function (a) { var c = C(a, m); return b.remove(function (a) { return -1 != e.utils.arrayIndexOf(c, m(a)) }) }, b.mappedDestroy = function (a) { var c = "function" == typeof a ? a : function (b) { return b === m(a) }; return b.destroy(function (a) { return c(m(a)) }) }, b.mappedDestroyAll = function (a) {
8215                var c = C(a, m); return b.destroy(function (a) {
8216                    return -1 !=
8217                    e.utils.arrayIndexOf(c, m(a))
8218                })
8219            }, b.mappedIndexOf = function (a) { var c = C(b(), m); a = m(a); return e.utils.arrayIndexOf(c, a) }, b.mappedGet = function (a) { return b()[b.mappedIndexOf(a)] }, b.mappedCreate = function (a) { if (-1 !== b.mappedIndexOf(a)) throw Error("There already is an object with the key that you specified."); var c = h() ? x(a) : a; u() && (a = v(c, a), e.isWriteableObservable(c) ? c(a) : c = a); b.push(c); return c }); n = C(e.utils.unwrapObservable(b), m).sort(); g = C(c, m); s && g.sort(); s = e.utils.compareArrays(n, g); n = {}; var J, A = e.utils.unwrapObservable(c),
8220            y = {}, z = !0, g = 0; for (J = A.length; g < J; g++) { var r = m(A[g]); if (void 0 === r || r instanceof Object) { z = !1; break } y[r] = A[g] } var A = [], B = 0, g = 0; for (J = s.length; g < J; g++) {
8221                var r = s[g], q, w = l + "[" + g + "]"; switch (r.status) {
8222                    case "added": var D = z ? y[r.value] : K(e.utils.unwrapObservable(c), r.value, m); q = F(void 0, D, a, d, b, w, k); h() || (q = e.utils.unwrapObservable(q)); w = O(e.utils.unwrapObservable(c), D, n); q === N ? B++ : A[w - B] = q; n[w] = !0; break; case "retained": D = z ? y[r.value] : K(e.utils.unwrapObservable(c), r.value, m); q = K(b, r.value, m); F(q, D, a, d, b, w,
8223                    k); w = O(e.utils.unwrapObservable(c), D, n); A[w] = q; n[w] = !0; break; case "deleted": q = K(b, r.value, m)
8224                } t.push({ event: r.status, item: q })
8225            } b(A); a[d] && a[d].arrayChanged && e.utils.arrayForEach(t, function (b) { a[d].arrayChanged(b.event, b.item) })
8226        } else if (P(c)) {
8227            b = e.utils.unwrapObservable(b); if (!b) { if (h()) return s = x(), u() && (s = v(s)), s; if (u()) return v(s); b = {} } u() && (b = v(b)); I.save(c, b); if (u()) return b; Q(c, function (d) {
8228                var f = l.length ? l + "." + d : d; if (-1 == e.utils.arrayIndexOf(a.ignore, f)) if (-1 != e.utils.arrayIndexOf(a.copy, f)) b[d] =
8229                c[d]; else if ("object" != typeof c[d] && "array" != typeof c[d] && 0 < a.observe.length && -1 == e.utils.arrayIndexOf(a.observe, f)) b[d] = c[d], a.copiedProperties[f] = !0; else { var g = I.get(c[d]), k = F(b[d], c[d], a, d, b, f, b), g = g || k; if (0 < a.observe.length && -1 == e.utils.arrayIndexOf(a.observe, f)) b[d] = g(), a.copiedProperties[f] = !0; else { if (e.isWriteableObservable(b[d])) { if (g = e.utils.unwrapObservable(g), b[d]() !== g) b[d](g) } else g = void 0 === b[d] ? g : e.utils.unwrapObservable(g), b[d] = g; a.mappedProperties[f] = !0 } }
8230            })
8231        } else switch (f.getType(c)) {
8232            case "function": u() ?
8233            e.isWriteableObservable(c) ? (c(v(c)), b = c) : b = v(c) : b = c; break; default: if (e.isWriteableObservable(b)) return q = u() ? v(b) : e.utils.unwrapObservable(c), b(q), q; h() || u(); b = h() ? x() : e.observable(e.utils.unwrapObservable(c)); u() && b(v(b))
8234        } return b
8235    } function O(b, c, a) { for (var d = 0, e = b.length; d < e; d++) if (!0 !== a[d] && b[d] === c) return d; return null } function R(b, c) { var a; c && (a = c(b)); "undefined" === f.getType(a) && (a = b); return e.utils.unwrapObservable(a) } function K(b, c, a) {
8236        b = e.utils.unwrapObservable(b); for (var d = 0, f = b.length; d <
8237        f; d++) { var l = b[d]; if (R(l, a) === c) return l } throw Error("When calling ko.update*, the key '" + c + "' was not found!");
8238    } function C(b, c) { return e.utils.arrayMap(e.utils.unwrapObservable(b), function (a) { return c ? R(a, c) : a }) } function Q(b, c) { if ("array" === f.getType(b)) for (var a = 0; a < b.length; a++) c(a); else for (a in b) c(a) } function P(b) { var c = f.getType(b); return ("object" === c || "array" === c) && null !== b } function T() {
8239        var b = [], c = []; this.save = function (a, d) { var f = e.utils.arrayIndexOf(b, a); 0 <= f ? c[f] = d : (b.push(a), c.push(d)) };
8240        this.get = function (a) { a = e.utils.arrayIndexOf(b, a); return 0 <= a ? c[a] : void 0 }
8241    } function S() { var b = {}, c = function (a) { var c; try { c = a } catch (e) { c = "$$$" } a = b[c]; void 0 === a && (a = new T, b[c] = a); return a }; this.save = function (a, b) { c(a).save(a, b) }; this.get = function (a) { return c(a).get(a) } }
8241 var p = "__ko_mapping__", H = e.dependentObservable, B = 0, G, I, L = ["create", "update", "key", "arrayChanged"], N = {}, x = { include: ["_destroy"], ignore: [], copy: [], observe: [] }, j = x; f.isMapped = function (b) { return (b = e.utils.unwrapObservable(b)) && b[p] }; f.fromJS =
8242    function (b) { if (0 == arguments.length) throw Error("When calling ko.fromJS, pass the object you want to convert."); try { B++ || (G = [], I = new S); var c, a; 2 == arguments.length && (arguments[1][p] ? a = arguments[1] : c = arguments[1]); 3 == arguments.length && (c = arguments[1], a = arguments[2]); a && (c = E(c, a[p])); c = z(c); var d = F(a, b, c); a && (d = a); if (!--B) for (; G.length;) { var e = G.pop(); e && (e(), e.__DO.throttleEvaluation = e.throttleEvaluation) } d[p] = E(d[p], c); return d } catch (f) { throw B = 0, f; } }; f.fromJSON = function (b) {
8243        var c = e.utils.parseJson(b);
8244        arguments[0] = c; return f.fromJS.apply(this, arguments)
8245    }; f.updateFromJS = function () { throw Error("ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!"); }; f.updateFromJSON = function () { throw Error("ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!"); }; f.toJS = function (b, c) {
8246        j || f.resetDefaultOptions(); if (0 == arguments.length) throw Error("When calling ko.mapping.toJS, pass the object you want to convert.");
8247        if ("array" !== f.getType(j.ignore)) throw Error("ko.mapping.defaultOptions().ignore should be an array."); if ("array" !== f.getType(j.include)) throw Error("ko.mapping.defaultOptions().include should be an array."); if ("array" !== f.getType(j.copy)) throw Error("ko.mapping.defaultOptions().copy should be an array."); c = z(c, b[p]); return f.visitModel(b, function (a) { return e.utils.unwrapObservable(a) }, c)
8248    }; f.toJSON = function (b, c) { var a = f.toJS(b, c); return e.utils.stringifyJson(a) }; f.defaultOptions = function () {
8249        if (0 < arguments.length) j =
8250        arguments[0]; else return j
8251    }; f.resetDefaultOptions = function () { j = { include: x.include.slice(0), ignore: x.ignore.slice(0), copy: x.copy.slice(0) } }; f.getType = function (b) { if (b && "object" === typeof b) { if (b.constructor === Date) return "date"; if (b.constructor === Array) return "array" } return typeof b }; f.visitModel = function (b, c, a) {
8252        a = a || {}; a.visitedObjects = a.visitedObjects || new S; var d, k = e.utils.unwrapObservable(b); if (P(k)) a = z(a, k[p]), c(b, a.parentName), d = "array" === f.getType(k) ? [] : {}; else return c(b, a.parentName); a.visitedObjects.save(b,
8253        d); var l = a.parentName; Q(k, function (b) {
8254            if (!(a.ignore && -1 != e.utils.arrayIndexOf(a.ignore, b))) {
8255                var j = k[b], g = a, h = l || ""; "array" === f.getType(k) ? l && (h += "[" + b + "]") : (l && (h += "."), h += b); g.parentName = h; if (!(-1 === e.utils.arrayIndexOf(a.copy, b) && -1 === e.utils.arrayIndexOf(a.include, b) && k[p] && k[p].mappedProperties && !k[p].mappedProperties[b] && k[p].copiedProperties && !k[p].copiedProperties[b] && "array" !== f.getType(k))) switch (f.getType(e.utils.unwrapObservable(j))) {
8256                    case "object": case "array": case "undefined": g = a.visitedObjects.get(j);
8257                        d[b] = "undefined" !== f.getType(g) ? g : f.visitModel(j, c, a); break; default: d[b] = c(j, a.parentName)
8258                }
8259            }
8260        }); return d
8261    }
8262});
8263/* Purposefully empty --- we shouldn't duplicate JS */function ForceSaleFAF() {
8264
8265    var $sel = $('#displayType.Simple');
8266    if ($sel.length) {
8267        $('#FFSale').click(function () {
8268            if ($sel.hasClass('ShowRRP')) {
8269                $sel.removeClass('ShowRRP');
8270            } else {
8271                $sel.addClass('ShowRRP');
8272            }
8273        });
8274        if (window.location.href.indexOf("/onsale") > -1) {
8275            $sel.addClass('ShowRRP');
8276        }
8277    }
8278}
8279
8280domReady(() => {
8281    $('body').on('click', 'div[class*="stockStatus-"][data-bind*="DisplayQuickview"]', function () {
8282        SendAnalyticsEvent('FAF', 'Quickview New', 'Opened Quickview');
8283        console.log("FF QVNew : Opened");
8284    });
8285    $('body').on('click', '.fafqvdd select', function () {
8286        SendAnalyticsEvent('FAF', 'Quickview New', 'Select Expanded');
8287        console.log("FF QVNew : Select Expanded");
8288    });
8289    $('body').on('click', '.fafqvdd .add-to-cart-area-button[onclick]', function () {
8290        if ($(this).hasClass('a2bButtonInactive')) { }
8291        else {
8292            SendAnalyticsEvent('FAF', 'Quickview New', 'Added to basket');
8293            console.log("FF QVNew : Added to basket");
8294        }
8295    });
8296});
8297/* De-commissioned */
8298var FACETNAVERRORLDJSON = 'Error whilst populating LD+JSON schema for Find and Filter Page(' + window.location.href + '). ',
8299    THROWCONTINUATION = 'We did not throw in the catch; this allowed the page to render correctly. ';
8300
8301/**
8302 * Returns ItemList(Product) schema object which Search engines can read.
8303 * This needs to be added to the DOM by another method called "appendSchema"
8304 */
8305function FindAndFilterItemSchemaMaker() {
8306    var listObj = {
8307        "@context": "https://schema.org",
8308        "@type": "ItemList",
8309        "itemListElement": []
8310    };
8311
8312    var newDate = new Date();
8313    newDate.setFullYear(newDate.getFullYear() + 1);
8314    var oneYearFromNow = newDate.toISOString().split('T')[0];
8315    var baseUrlForSite = window.location.protocol + '//' + window.location.host;
8316
8317    var i = 0;
8318    var len = universal_listing.length;
8319    for (i; i < len; i++) {
8320        var item = universal_listing[i];
8321        if (item) {
8322            try {
8323                var matchingRawItem = rawproducts.find(function (el) { return el.uid == item.id });
8324
8325                if (matchingRawItem) {
8326                    var toPush = GetSchemaTemplate();
8327                    UpdateToPushItemProperties(toPush, i + 1, item, matchingRawItem, oneYearFromNow, baseUrlForSite);
8328
8329                    listObj.itemListElement.push(toPush);
8330                }
8331            } catch (err) {
8332                ErrorLogger(err,
8333                    FACETNAVERRORLDJSON + ' Item specific error for the item "' + item.id + '". ' + THROWCONTINUATION,
8334                    'error');
8335            }
8336        }
8337    }
8338
8339    return listObj;
8340}
8341
8342function UpdateToPushItemProperties(toPush, i, item, matchingRawItem, oneYearFromNow, baseUrlForSite) {
8343    toPush.position = i;
8344
8345    toPush.item.name = item.name;
8346    if (item.description) {
8347        toPush.item.description = item.description.replace(/\<br((\s)*|((\s)*(\/)))\>/gm, '')
8348            .replace(/\r/gm, '')
8349            .replace(/\n/gm, '')
8350            .replace(/\t/gm, '');
8351    }
8352    else {
8353        toPush.item.description = item.name + ' by ' + item.manufacturer;
8354    }
8355    toPush.item.brand.name = item.manufacturer;
8356    toPush.item.url = baseUrlForSite + matchingRawItem.navigationurl;
8357    toPush.item.image.push(baseUrlForSite + '/' + item.image);
8358    toPush.item.sku = item.sku_code;
8359
8360    toPush.item.offers.availability = GetAvailablilitySchema(item, matchingRawItem);
8361    toPush.item.offers.price = item.unit_sale_price;
8362    toPush.item.offers.priceValidUntil = oneYearFromNow;
8363    toPush.item.offers.priceCurrency = ecommerceConfig.LocalCurrencyCode;
8364    toPush.item.offers.url = baseUrlForSite + matchingRawItem.navigationurl;
8365
8366    const separateReviewSchemaEls = $('#hasSeparateReviewSchema');
8367
8368    if (separateReviewSchemaEls.length === 0 || separateReviewSchemaEls[0].value === 'False') {
8369        if (item.reviewCount > 0) {
8370            var aggRate = {
8371                "@type": "AggregateRating",
8372                "ratingValue": item.reviewAverage,
8373                "bestRating": "5",
8374                "worstRating": "0",
8375                "reviewCount": item.reviewCount
8376            }
8377            toPush.item.aggregateRating = aggRate;
8378        }
8379
8380        toPush.item.review = [];
8381
8382        item.reviewList.forEach(function (review) {
8383            toPush.item.review.push({
8384                "@type": "Review",
8385                "author": review.Name,
8386                "datePublished": review.addDate,
8387                "reviewBody": review.Comments,
8388                "name": item.name,
8389                "reviewRating": {
8390                    "@type": "Rating",
8391                    "bestRating": "5",
8392                    "ratingValue": review.Rate,
8393                    "worstRating": "0"
8394                }
8395            });
8396        });
8397    }
8398}
8399
8400function GetSchemaTemplate() {
8401    return {
8402        "@type": "ListItem",
8403        "position": "[[REPLACE_ITEMINDEX]]",
8404        "item": {
8405            "@context": "https://schema.org/",
8406            "@type": "Product",
8407            "url": "[[REPLACE_URL]]",
8408            "name": "[[REPLACE_PRODUCTNAME]]",
8409            "image": [],
8410            "description": "[[REPLACE_DESCRIPTION]]",
8411            "sku": "[[SKU]]",
8412            "brand": {
8413                "@type": "Brand",
8414                "name": "[[REPLACE_BRAND]]"
8415            },
8416            "offers": {
8417                "@type": "Offer",
8418                "availability": "[[REPLACE_AVAILABILITY]]",
8419                "price": "[[REPLACE_PRICE]]",
8420                "priceValidUntil": "[[REPLACE_PRICEVALIDUNTIL]]",
8421                "priceCurrency": "[[REPLACE_CURRENCY]]",
8422                "url": "[[REPLACE_URL]]"
8423            }
8424        }
8425    };
8426}
8427
8428function GetAvailablilitySchema(item, rawItem) {
8429    var toReturn = 'https://schema.org/InStock';
8430
8431    if (rawItem.instock) {
8432        if (rawItem.instock.toLowerCase() == 'true' && item.clickAndCollectOnly && item.clickAndCollectOnly == true) {
8433            toReturn = 'https://schema.org/InStoreOnly';
8434        }
8435        else if (rawItem.instock.toLowerCase() == 'true'
8436            && (rawItem.instock.toLowerCase() == 'comingsoon' || rawItem.instock.toLowerCase() == 'preorder')) {
8437            toReturn = 'https://schema.org/PreOrder';
8438        }
8439        else if (rawItem.instock.toLowerCase() !== 'true') {
8440            toReturn = 'https://schema.org/OutOfStock';
8441        }
8442    }
8443    else {
8444        toReturn = 'https://schema.org/InStoreOnly';
8445    }
8446
8447    return toReturn;
8448}
8449
8450/**
8451 * Returns breadcrumb schema object which Search engines can read.
8452 * This needs to be added to the DOM by another method called "appendSchema"
8453 */
8454function FacetBreadcrumbSchemaMaker() {
8455    var breadCrumbEls = document.querySelectorAll(".breadcrumbs a");
8456
8457    function breadCrumbItemTemplate(pos, name, item) {
8458        this["@type"] = "ListItem";
8459        this.position = pos;
8460        this.name = name;
8461        this.item = item;
8462    }
8463
8464    var breadcrumbObject = {
8465        "@context": "https://schema.org",
8466        "@type": "BreadcrumbList",
8467        "itemListElement": []
8468    };
8469
8470    var lengths = breadCrumbEls.length;
8471
8472    for (var i = 0; i < lengths; i++) {
8473        breadcrumbObject.itemListElement.push(new breadCrumbItemTemplate((i + 1), breadCrumbEls[i].innerText, breadCrumbEls[i].href));
8474    }
8475    return breadcrumbObject;
8476}
8477
8478
8479$(document).ready(function () {
8480    try {
8481        if (typeof universal_listing != 'undefined') {
8482            appendSchema(FindAndFilterItemSchemaMaker());
8483        }
8484        appendSchema(FacetBreadcrumbSchemaMaker());
8485    } catch (err) {
8486        ErrorLogger(err,
8487            FACETNAVERRORLDJSON + THROWCONTINUATION,
8488            'error');
8489    }
8490});
8491domReady(() => {
8492    waitFor(
8493        () => typeof ecommerceConfig == 'object'
8494            && typeof window.googleAnalyticsLibLoaded == 'boolean'
8495            && window.googleAnalyticsLibLoaded,
8496        50,
8497        333)
8498        .then(() => {
8499            SendGa4SearchEvent();
8500            SendGa4ViewItemListEvent();
8501        });
8502});
8503
8504var eventSent = false;
8505function SendGa4ViewItemListEvent() {
8506
8507    const isNonAlpPage = typeof rawproducts == 'object'
8508        && Array.isArray(rawproducts)
8509        && typeof rawfacets == 'object'
8510        && Array.isArray(rawfacets);
8511
8512    if (ecommerceConfig.AnalyticsScheme == 'GA4' && isNonAlpPage && !eventSent) {
8513
8514        const chunks = chunkArray(rawproducts, 10);
8515
8516        for (var i = 0; i < chunks.length; i++) {
8517
8518            const ga4Queue = new GoogleAnalyticsEventQueue();
8519
8520            ga4Queue.enqueueEvent([
8521                'view_item_list',
8522                {
8523                    "items": GetGa4ItemListData(chunks[i], i, isNonAlpPage)
8524                }
8525            ]);
8526
8527        } 
8528    }
8529}
8530
8531function GetGa4ItemListData(itemsToAdd, listIteration) {
8532    const itemListData = [];
8533
8534    for (const item of itemsToAdd) {
8535
8536        const brandName = getItemFacetByTypeNameAndPropertyId(rawfacets, 'Brand', 'manufacturerid', item.brandid);
8537        const departmentName = getItemFacetByTypeNameAndPropertyId(rawfacets, 'Department', 'facet
8537id', item.departmentfacetid);
8538        const productGroupName = getItemFacetByTypeNameAndPropertyId(rawfacets, 'ProductGroup', 'facetid', item.productgroupfacetid);
8539
8540        itemListData.push({
8541            "id": item.code,
8542            "name": item.name,
8543            "brand": brandName,
8544            "category": departmentName,
8545            "category2": productGroupName,
8546            "quantity": 1,
8547            "price": item.unit_sale_price,
8548            "list_name": `${document.querySelector('h1').innerText} ${listIteration}`,
8549            "colour": item.colour
8550        });
8551        
8552    }
8553
8554    return itemListData;
8555}
8556
8557/**
8558* Get's the facet definition by typename, then gets the facet by property and property value.
8559* @param facets {Array} The facets on the current page
8560* @param typename {string} The facet definition typename
8561* @param property {string} The property of the facet we are looking up e.g. facetid or manufacturerid
8562* @param propertyId {string} The ID of the property we are comparing against.
8563* @returns {string} The name of the facet or 'unknown' if the facet cannot be found.
8564*/
8565function getItemFacetByTypeNameAndPropertyId(facets, typename, property, propertyId) {
8566    return facets
8567        .find(facetDefinition => facetDefinition.typename == typename)
8568        ?.facets
8569        ?.find(facet => facet[property] == propertyId)
8570        ?.name
8571        ?? 'unknown';
8572}
8573
8574function SendGa4SearchEvent() {
8575    const termQuery = GetQueryStringParams('Term') ?? GetQueryStringParams('term');
8576
8577    if (ecommerceConfig.AnalyticsScheme == 'GA4' && termQuery && typeof termQuery == 'string' && termQuery.length) {
8578
8579        const ga4Queue = new GoogleAnalyticsEventQueue();
8580
8581        ga4Queue.enqueueEvent([
8582            'search',
8583            {
8584                "search_term": termQuery
8585            }
8586        ]);
8587
8588        ga4Queue.enqueueEvent([
8589            'view_search_results',
8590            {
8591                "search_term": termQuery
8592            }
8593        ]);
8594    }
8595}
8596/* Purposefully empty --- removed duplicated code */var itemElementClass = ".item";
8597var historyPosition = 0;
8598
8599$(document).ready(function () {
8600    initEntryURL();
8601    completeInit();
8602    handlePromotionalMessages();
8603});
8604
8605function completeInit() {
8606    var initInterval = setInterval(function () {
8607        if (findandfilterloaded) {
8608            clearInterval(initInterval);
8609            ko.applyBindings(Search);
8610            setEvents();
8611            flipImagesFaf();
8612            landingClmbShell();
8613            FAFSlider();
8614            validateResetBtn();
8615            FAFPostInit();
8616            initProductCompare();
8617            preloadSizeTerms();
8618        }
8619    }, 50);
8620}
8621
8622// adjust the query string if required, this could do with some more work as extrafacets gets removed.
8623function initEntryURL() {
8624    if (document.URL.indexOf("?") >= 0) {
8625        var ignoreVals = ["term", "discount", "minprice", "maxprice", "sizeterm", "extrafacets", "fafstarbuyid", "preview", "collection"];
8626        var qry = document.URL.split("?")[1];
8627        var appendStr = "";
8628        if (qry.indexOf("&") >= 0) {
8629            var qrysplit = qry.split("&");
8630            for (iqi = 0; iqi < qrysplit.length; iqi++) {
8631                if (ignoreVals.indexOf(qrysplit[iqi].split("=")[0].toLowerCase()) < 0) {
8632                    appendStr += "&" + qrysplit[iqi];
8633                }
8634            }
8635        } else {
8636            if (ignoreVals.indexOf(qry.split("=")[0].toLowerCase()) < 0) {
8637                appendStr += "&" + qry;
8638            }
8639        }
8640        $("#entryPointURLHidden").val($("#entryPointURLHidden").val() + appendStr);
8641    }
8642}
8643
8644function handlePromotionalMessages() {
8645    const entryUrl = document.querySelector('#entryPointURLHidden').value;
8646    const paramSearch = new URLSearchParams(entryUrl);
8647
8648    const foundStarBuysId = paramSearch.get('fafStarbuyId');
8649    const shouldRequestPromotion = foundStarBuysId && Number.isInteger(Number(foundStarBuysId));
8650
8651    if (shouldRequestPromotion) {
8652        loadStarbuyFindAndFilterPreview(Number(foundStarBuysId));
8653    }
8654}
8655
8656function resetPage() {
8657    history.go((historyPosition * -1) + 1);
8658    validateResetBtn();
8659}
8660
8661function validateResetBtn() {
8662    if (historyPosition > 1) { }
8663    else { }
8664}
8665
8666Reload();
8667function Reload() {
8668    try {
8669        var headElement = document.getElementsByTagName("head")[0];
8670        if (headElement && headElement.innerHTML)
8671            headElement.innerHTML += " ";
8672    } catch (e) { }
8673}
8674
8675
8676function checkForNavigateBack(state) {
8677    try {
8678        defCFNB.resolve(true);
8679    } catch (ex) {}
8680}
8681
8682$(window).bind("popstate", function (event) {
8683
8684    var stateObj = event.state;
8685
8686    if (stateObj == null) {
8687        stateObj = history.state;
8688    }
8689
8690    ApplyFiltersFromState(stateObj);
8691});
8692
8693function ApplyFiltersFromState(stateObj) {
8694    if (stateObj != null) {
8695        if (typeof stateObj.currDepartment != "undefined") {
8696            Search.CurrentDepartment(stateObj.currDepartment);
8697            Search.CurrentProductGroup(stateObj.currProductGroup);
8698            Search.CurrActivities(stateObj.currActivities);
8699            Search.CurrMaterials(stateObj.currMaterials);
8700            Search.CurrColours(stateObj.currColours);
8701            Search.CurrGenders(stateObj.currGenders);
8702            Search.CurrSeasons(stateObj.currSeasons);
8703            Search.CurrAges(stateObj.currAges);
8704            Search.CurrBrands(stateObj.currBrands);
8705            Search.CurrSubDepartmentFacetLvl1(stateObj.currSubDepLvl1);
8706            Search.CurrSubDepartmentFacetLvl2(stateObj.currSubDepLvl2);
8707            Search.CurrSubDepartmentFacetLvl3(stateObj.currSubDepLvl3);
8708            Search.CurrSubProductGroupFacetLvl1(stateObj.currSubProdGrpLvl1);
8709            Search.CurrSubProductGroupFacetLvl2(stateObj.currSubProdGrpLvl2);
8710            Search.CurrSubProductGroupFacetLvl3(stateObj.currSubProdGrpLvl3);
8711            Search.FilterByStockOnly(stateObj.checkByStock);
8712            Search.FilterBySaleOnly(stateObj.checkBySale);
8713            historyPosition = stateObj.historyPositionState;
8714        }
8715    }
8716    else {
8717        Search.Clear();
8718    }
8719
8720    Search.FilterProducts();
8721    Search.setSizeTermPanelStatus();
8722    validateResetBtn();
8723}
8724
8725function checkitQV(data) {
8726    if (typeof qvdropfaf == "boolean" || typeof qvdropfaf == "string") {
8727        BetterSearchQuickLookDD(data);
8728    } else {
8729        BetterSearchQuickLook(data);
8730    }
8731}
8732
8733function setEvents() {
8734
8735    $("#searchTermTxt").keyup(function (e) {
8736        if (e.keyCode === 13) {
8737            return false;
8738        } else {
8739            Search.CurrentSearchTerm($("#searchTermTxt").val());
8740            Search.FilterProducts();
8741        }
8742    });
8743
8744}
8745
8746function restrictInputToNumericFloat(element, event) {
8747    var char = event.keyCode;
8748    if (char > 31 && ((char < 48 || char > 57))) {
8749        if (char !== 46) {
8750            return false;
8751        } else {
8752            if ($(element).val().includes('.')) {
8753                return false;
8754            }
8755        }
8756    }
8757}
8758
8759
8760function setInStock(check) {
8761    Search.FilterByStockOnly(check.checked);
8762    Search.FilterSelected();
8763}
8764
8765function setOnSale(check) {
8766    Search.FilterBySaleOnly(check.checked);
8767    Search.FilterSelected();
8768}
8769
8770function setOnSaleLbl() {
8771    $("#FFSale").click();
8772    Search.FilterBySaleOnly($("#FFSale").prop("checked"));
8773    Search.FilterSelected();
8774}
8775
8776function setInStockLbl() {
8777    $("#FFStock").click();
8778    Search.FilterByStockOnly($("#FFStock").prop("checked"));
8779    Search.FilterSelected();
8780}
8781
8782function usePriceFilter() {
8783    Search.FilterByPrice(true);
8784    Search.FilterProducts();
8785}
8786
8787/* Make global variable so that we can access slider methods from outside this method */
8788var sliderFormat;
8789function FAFSlider() {
8790
8791    /*! nouislider - 10.0.0 - 2017-05-28 14:52:49 */
8792    !function (a) { "function" == typeof define && define.amd ? define([], a) : "object" == typeof exports ? module.exports = a() : window.noUiSlider = a() }(function () { "use strict"; function a(a) { return "object" == typeof a && "function" == typeof a.to && "function" == typeof a.from } function b(a) { a.parentElement.removeChild(a) } function c(a) { a.preventDefault() } function d(a) { return a.filter(function (a) { return this[a] ? !1 : this[a] = !0 }, {}) } function e(a, b) { return Math.round(a / b) * b } function f(a, b) { var c = a.getBoundingClientRect(), d = a.ownerDocument, e = d.documentElement, f = o(d); return /webkit.*Chrome.*Mobile/i.test(navigator.userAgent) && (f.x = 0), b ? c.top + f.y - e.clientTop : c.left + f.x - e.clientLeft }
8792 function g(a) { return "number" == typeof a && !isNaN(a) && isFinite(a) } function h(a, b, c) { c > 0 && (l(a, b), setTimeout(function () { m(a, b) }, c)) } function i(a) { return Math.max(Math.min(a, 100), 0) } function j(a) { return Array.isArray(a) ? a : [a] } function k(a) { a = String(a); var b = a.split("."); return b.length > 1 ? b[1].length : 0 } function l(a, b) { a.classList ? a.classList.add(b) : a.className += " " + b } function m(a, b) { a.classList ? a.classList.remove(b) : a.className = a.className.replace(new RegExp("(^|\\b)" + b.split(" ").join("|") + "(\\b|$)", "gi"), " ") } function n(a, b) { return a.classList ? a.classList.contains(b) : new RegExp("\\b" + b + "\\b").test(a.className) } function o(a) { var b = void 0 !== window.pageXOffset, c = "CSS1Compat" === (a.compatMode || ""), d = b ? window.pageXOffset : c ? a.documentElement.scrollLeft : a.body.scrollLeft, e = b ? window.pageYOffset : c ? a.documentElement.scrollTop : a.body.scrollTop; return { x: d, y: e } } function p() { return window.navigator.pointerEnabled ? { start: "pointerdown", move: "pointermove", end: "pointerup" } : window.navigator.msPointerEnabled ? { start: "MSPointerDown", move: "MSPointerMove", end: "MSPointerUp" } : { start: "mousedown touchstart", move: "mousemove touchmove", end: "mouseup touchend" } } function q() { var a = !1; try { var b = Object.defineProperty({}, "passive", { get: function () { a = !0 } }); window.addEventListener("test", null, b) } catch (c) { } return a } function r() { return window.CSS && CSS.supports && CSS.supports("touch-action", "none") } function s(a, b) { return 100 / (b - a) } function t(a, b) { return 100 * b / (a[1] - a[0]) } function u(a, b) { return t(a, a[0] < 0 ? b + Math.abs(a[0]) : b - a[0]) } function v(a, b) { return b * (a[1] - a[0]) / 100 + a[0] } function w(a, b) { for (var c = 1; a >= b[c];)c += 1; return c } function x(a, b, c) { if (c >= a.slice(-1)[0]) return 100; var d, e, f, g, h = w(c, a); return d = a[h - 1], e = a[h], f = b[h - 1], g = b[h], f + u([d, e], c) / s(f, g) } function y(a, b, c) { if (c >= 100) return a.slice(-1)[0]; var d, e, f, g, h = w(c, b); return d = a[h - 1], e = a[h], f = b[h - 1], g = b[h], v([d, e], (c - f) * s(f, g)) } function z(a, b, c, d) { if (100 === d) return d; var f, g, h = w(d, a); return c ? (f = a[h - 1], g = a[h], d - f > (g - f) / 2 ? g : f) : b[h - 1] ? a[h - 1] + e(d - a[h - 1], b[h - 1]) : d } function A(a, b, c) { var d; if ("number" == typeof b && (b = [b]), "[object Array]" !== Object.prototype.toString.call(b)) throw new Error("noUiSlider (" + $ + "): 'range' contains invalid value."); if (d = "min" === a ? 0 : "max" === a ? 100 : parseFloat(a), !g(d) || !g(b[0])) throw new Error("noUiSlider (" + $ + "): 'range' value isn't numeric."); c.xPct.push(d), c.xVal.push(b[0]), d ? c.xSteps.push(isNaN(b[1]) ? !1 : b[1]) : isNaN(b[1]) || (c.xSteps[0] = b[1]), c.xHighestCompleteStep.push(0) } function B(a, b, c) { if (!b) return !0; c.xSteps[a] = t([c.xVal[a], c.xVal[a + 1]], b) / s(c.xPct[a], c.xPct[a + 1]); var d = (c.xVal[a + 1] - c.xVal[a]) / c.xNumSteps[a], e = Math.ceil(Number(d.toFixed(3)) - 1), f = c.xVal[a] + c.xNumSteps[a] * e; c.xHighestCompleteStep[a] = f } function C(a, b, c) { this.xPct = [], this.xVal = [], this.xSteps = [c || !1], this.xNumSteps = [!1], this.xHighestCompleteStep = [], this.snap = b; var d, e = []; for (d in a) a.hasOwnProperty(d) && e.push([a[d], d]); for (e.sort(e.length && "object" == typeof e[0][0] ? function (a, b) { return a[0][0] - b[0][0] } : function (a, b) { return a[0] - b[0] }), d = 0; d < e.length; d++)A(e[d][1], e[d][0], this); for (this.xNumSteps = this.xSteps.slice(0), d = 0; d < this.xNumSteps.length; d++)B(d, this.xNumSteps[d], this) } function D(b) { if (a(b)) return !0; throw new Error("noUiSlider (" + $ + "): 'format' requires 'to' and 'from' methods.") } function E(a, b) { if (!g(b)) throw new Error("noUiSlider (" + $ + "): 'step' is not numeric."); a.singleStep = b } function F(a, b) { if ("object" != typeof b || Array.isArray(b)) throw new Error("noUiSlider (" + $ + "): 'range' is not an object."); if (void 0 === b.min || void 0 === b.max) throw new Error("noUiSlider (" + $ + "): Missing 'min' or 'max' in 'range'."); if (b.min === b.max) throw new Error("noUiSlider (" + $ + "): 'range' 'min' and 'max' cannot be equal."); a.spectrum = new C(b, a.snap, a.singleStep) } function G(a, b) { if (b = j(b), !Array.isArray(b) || !b.length) throw new Error("noUiSlider (" + $ + "): 'start' option is incorrect."); a.handles = b.length, a.start = b } function H(a, b) { if (a.snap = b, "boolean" != typeof b) throw new Error("noUiSlider (" + $ + "): 'snap' option must be a boolean.") } function I(a, b) { if (a.animate = b, "boolean" != typeof b) throw new Error("noUiSlider (" + $ + "): 'animate' option must be a boolean.") } function J(a, b) { if (a.animationDuration = b, "number" != typeof b) throw new Error("noUiSlider (" + $ + "): 'animationDuration' option must be a number.") } function K(a, b) { var c, d = [!1]; if ("lower" === b ? b = [!0, !1] : "upper" === b && (b = [!1, !0]), b === !0 || b === !1) { for (c = 1; c < a.handles; c++)d.push(b); d.push(!1) } else { if (!Array.isArray(b) || !b.length || b.length !== a.handles + 1) throw new Error("noUiSlider (" + $ + "): 'connect' option doesn't match handle count."); d = b } a.connect = d } function L(a, b) { switch (b) { case "horizontal": a.ort = 0; break; case "vertical": a.ort = 1; break; default: throw new Error("noUiSlider (" + $ + "): 'orientation' option is invali
8792d.") } } function M(a, b) { if (!g(b)) throw new Error("noUiSlider (" + $ + "): 'margin' option must be numeric."); if (0 !== b && (a.margin = a.spectrum.getMargin(b), !a.margin)) throw new Error("noUiSlider (" + $ + "): 'margin' option is only supported on linear sliders.") } function N(a, b) { if (!g(b)) throw new Error("noUiSlider (" + $ + "): 'limit' option must be numeric."); if (a.limit = a.spectrum.getMargin(b), !a.limit || a.handles < 2) throw new Error("noUiSlider (" + $ + "): 'limit' option is only supported on linear sliders with 2 or more handles.") } function O(a, b) { if (!g(b)) throw new Error("noUiSlider (" + $ + "): 'padding' option must be numeric."); if (0 !== b) { if (a.padding = a.spectrum.getMargin(b), !a.padding) throw new Error("noUiSlider (" + $ + "): 'padding' option is only supported on linear sliders."); if (a.padding < 0) throw new Error("noUiSlider (" + $ + "): 'padding' option must be a positive number."); if (a.padding >= 50) throw new Error("noUiSlider (" + $ + "): 'padding' option must be less than half the range.") } } function P(a, b) { switch (b) { case "ltr": a.dir = 0; break; case "rtl": a.dir = 1; break; default: throw new Error("noUiSlider (" + $ + "): 'direction' option was not recognized.") } } function Q(a, b) { if ("string" != typeof b) throw new Error("noUiSlider (" + $ + "): 'behaviour' must be a string containing options."); var c = b.indexOf("tap") >= 0, d = b.indexOf("drag") >= 0, e = b.indexOf("fixed") >= 0, f = b.indexOf("snap") >= 0, g = b.indexOf("hover") >= 0; if (e) { if (2 !== a.handles) throw new Error("noUiSlider (" + $ + "): 'fixed' behaviour must be used with 2 handles"); M(a, a.start[1] - a.start[0]) } a.events = { tap: c || f, drag: d, fixed: e, snap: f, hover: g } } function R(a, b) { if (b !== !1) if (b === !0) { a.tooltips = []; for (var c = 0; c < a.handles; c++)a.tooltips.push(!0) } else { if (a.tooltips = j(b), a.tooltips.length !== a.handles) throw new Error("noUiSlider (" + $ + "): must pass a formatter for all handles."); a.tooltips.forEach(function (a) { if ("boolean" != typeof a && ("object" != typeof a || "function" != typeof a.to)) throw new Error("noUiSlider (" + $ + "): 'tooltips' must be passed a formatter or 'false'.") }) } } function S(a, b) { a.ariaFormat = b, D(b) } function T(a, b) { a.format = b, D(b) } function U(a, b) { if (void 0 !== b && "string" != typeof b && b !== !1) throw new Error("noUiSlider (" + $ + "): 'cssPrefix' must be a string or `false`."); a.cssPrefix = b } function V(a, b) { if (void 0 !== b && "object" != typeof b) throw new Error("noUiSlider (" + $ + "): 'cssClasses' must be an object."); if ("string" == typeof a.cssPrefix) { a.cssClasses = {}; for (var c in b) b.hasOwnProperty(c) && (a.cssClasses[c] = a.cssPrefix + b[c]) } else a.cssClasses = b } function W(a, b) { if (b !== !0 && b !== !1) throw new Error("noUiSlider (" + $ + "): 'useRequestAnimationFrame' option should be true (default) or false."); a.useRequestAnimationFrame = b } function X(a) { var b = { margin: 0, limit: 0, padding: 0, animate: !0, animationDuration: 300, ariaFormat: _, format: _ }, c = { step: { r: !1, t: E }, start: { r: !0, t: G }, connect: { r: !0, t: K }, direction: { r: !0, t: P }, snap: { r: !1, t: H }, animate: { r: !1, t: I }, animationDuration: { r: !1, t: J }, range: { r: !0, t: F }, orientation: { r: !1, t: L }, margin: { r: !1, t: M }, limit: { r: !1, t: N }, padding: { r: !1, t: O }, behaviour: { r: !0, t: Q }, ariaFormat: { r: !1, t: S }, format: { r: !1, t: T }, tooltips: { r: !1, t: R }, cssPrefix: { r: !1, t: U }
8792, cssClasses: { r: !1, t: V }, useRequestAnimationFrame: { r: !1, t: W } }, d = { connect: !1, direction: "ltr", behaviour: "tap", orientation: "horizontal", cssPrefix: "noUi-", cssClasses: { target: "target", base: "base", origin: "origin", handle: "handle", handleLower: "handle-lower", handleUpper: "handle-upper", horizontal: "horizontal", vertical: "vertical", background: "background", connect: "connect", ltr: "ltr", rtl: "rtl", draggable: "draggable", drag: "state-drag", tap: "state-tap", active: "active", tooltip: "tooltip", pips: "pips", pipsHorizontal: "pips-horizontal", pipsVertical: "pips-vertical", marker: "marker", markerHorizontal: "marker-horizontal", markerVertical: "marker-vertical", markerNormal: "marker-normal", markerLarge: "marker-large", markerSub: "marker-sub", value: "value", valueHorizontal: "value-horizontal", valueVertical: "value-vertical", valueNormal: "value-normal", valueLarge: "value-large", valueSub: "value-sub" }, useRequestAnimationFrame: !0 }; a.format && !a.ariaFormat && (a.ariaFormat = a.format), Object.keys(c).forEach(function (e) { if (void 0 === a[e] && void 0 === d[e]) { if (c[e].r) throw new Error("noUiSlider (" + $ + "): '" + e + "' is required."); return !0 } c[e].t(b, void 0 === a[e] ? d[e] : a[e]) }), b.pips = a.pips; var e = [["left", "top"], ["right", "bottom"]]; return b.style = e[b.dir][b.ort], b.styleOposite = e[b.dir ? 0 : 1][b.ort], b } function Y(a, e, g) { function k(a, b) { var c = xa.createElement("div"); return b && l(c, b), a.appendChild(c), c } function s(a, b) { var c = k(a, e.cssClasses.origin), d = k(c, e.cssClasses.handle); return d.setAttribute("data-handle", b), d.setAttribute("tabindex", "0"), d.setAttribute("role", "slider"), d.setAttribute("aria-orientation", e.ort ? "vertical" : "horizontal"), 0 === b ? l(d, e.cssClasses.handleLower) : b === e.handles - 1 && l(d, e.cssClasses.handleUpper), c } function t(a, b) { return b ? k(a, e.cssClasses.connect) : !1 } function u(a, b) { ia = [], ja = [], ja.push(t(b, a[0])); for (var c = 0; c < e.handles; c++)ia.push(s(b, c)), ra[c] = c, ja.push(t(b, a[c + 1])) } function v(a) { l(a, e.cssClasses.target), 0 === e.dir ? l(a, e.cssClasses.ltr) : l(a, e.cssClasses.rtl), 0 === e.ort ? l(a, e.cssClasses.horizontal) : l(a, e.cssClasses.vertical), ha = k(a, e.cssClasses.base) } function w(a, b) { return e.tooltips[b] ? k(a.firstChild, e.cssClasses.tooltip) : !1 } function x() { var a = ia.map(w); ea("update", function (b, c, d) { if (a[c]) { var f = b[c]; e.tooltips[c] !== !0 && (f = e.tooltips[c].to(d[c])), a[c].innerHTML = f } }) } function y() { ea("update", function (a, b, c, d, f) { ra.forEach(function (a) { var b = ia[a], d = S(qa, a, 0, !0, !0, !0), g = S(qa, a, 100, !0, !0, !0), h = f[a], i = e.ariaFormat.to(c[a]); b.children[0].setAttribute("aria-valuemin", d.toFixed(1)), b.children[0].setAttribute("aria-valuemax", g.toFixed(1)), b.children[0].setAttribute("aria-valuenow", h.toFixed(1)), b.children[0].setAttribute("aria-valuetext", i) }) }) } function z(a, b, c) { if ("range" === a || "steps" === a) return ta.xVal; if ("count" === a) { if (!b) throw new Error("noUiSlider (" + $ + "): 'values' required for mode 'count'."); var d, e = 100 / (b - 1), f = 0; for (b = []; (d = f++ * e) <= 100;)b.push(d); a = "positions" } return "positions" === a ? b.map(function (a) { return ta.fromStepping(c ? ta.getStep(a) : a) }) : "values" === a ? c ? b.map(function (a) { return ta.fromStepping(ta.getStep(ta.toStepping(a))) }) : b : void 0 } function A(a, b, c) { function e(a, b) { return (a + b).toFixed(7) / 1 } var f = {}, g = ta.xVal[0], h = ta.xVal[ta.xVal.length - 1], i = !1, j = !1, k = 0; return c = d(c.slice().sort(function (a, b) { return a - b })), c[0] !== g && (c.unshift(g), i = !0), c[c.length - 1] !== h && (c.push(h), j = !0), c.forEach(function (d, g) { var h, l, m, n, o, p, q, r, s, t, u = d, v = c[g + 1]; if ("steps" === b && (h = ta.xNumSteps[g]), h || (h = v - u), u !== !1 && void 0 !== v) for (h = Math.max(h, 1e-7), l = u; v >= l; l = e(l, h)) { for (n = ta.toStepping(l), o = n - k, r = o / a, s = Math.round(r), t = o / s, m = 1; s >= m; m += 1)p = k + m * t, f[p.toFixed(5)] = ["x", 0]; q = c.indexOf(l) > -1 ? 1 : "steps" === b ? 2 : 0, !g && i && (q = 0), l === v && j || (f[n.toFixed(5)] = [l, q]), k = n } }), f } function B(a, b, c) { function d(a, b) { var c = b === e.cssClasse
8792s.value, d = c ? j : m, f = c ? h : i; return b + " " + d[e.ort] + " " + f[a] } function f(a, f) { f[1] = f[1] && b ? b(f[0], f[1]) : f[1]; var h = k(g, !1); h.className = d(f[1], e.cssClasses.marker), h.style[e.style] = a + "%", f[1] && (h = k(g, !1), h.className = d(f[1], e.cssClasses.value), h.style[e.style] = a + "%", h.innerText = c.to(f[0])) } var g = xa.createElement("div"), h = [e.cssClasses.valueNormal, e.cssClasses.valueLarge, e.cssClasses.valueSub], i = [e.cssClasses.markerNormal, e.cssClasses.markerLarge, e.cssClasses.markerSub], j = [e.cssClasses.valueHorizontal, e.cssClasses.valueVertical], m = [e.cssClasses.markerHorizontal, e.cssClasses.markerVertical]; return l(g, e.cssClasses.pips), l(g, 0 === e.ort ? e.cssClasses.pipsHorizontal : e.cssClasses.pipsVertical), Object.keys(a).forEach(function (b) { f(b, a[b]) }), g } function C() { la && (b(la), la = null) } function D(a) { C(); var b = a.mode, c = a.density || 1, d = a.filter || !1, e = a.values || !1, f = a.stepped || !1, g = z(b, e, f), h = A(c, b, g), i = a.format || { to: Math.round }; return la = pa.appendChild(B(h, d, i)) } function E() { var a = ha.getBoundingClientRect(), b = "offset" + ["Width", "Height"][e.ort]; return 0 === e.ort ? a.width || ha[b] : a.height || ha[b] } function F(a, b, c, d) { var f = function (b) { return pa.hasAttribute("disabled") ? !1 : n(pa, e.cssClasses.tap) ? !1 : (b = G(b, d.pageOffset)) ? a === ma.start && void 0 !== b.buttons && b.buttons > 1 ? !1 : d.hover && b.buttons ? !1 : (oa || b.preventDefault(), b.calcPoint = b.points[e.ort], void c(b, d)) : !1 }, g = []; return a.split(" ").forEach(function (a) { b.addEventListener(a, f, oa ? { passive: !0 } : !1), g.push([a, f]) }), g } function G(a, b) { var c, d, e = 0 === a.type.indexOf("touch"), f = 0 === a.type.indexOf("mouse"), g = 0 === a.type.indexOf("pointer"); if (0 === a.type.indexOf("MSPointer") && (g = !0), e) { if (a.touches.length > 1) return !1; c = a.changedTouches[0].pageX, d = a.changedTouches[0].pageY } return b = b || o(xa), (f || g) && (c = a.clientX + b.x, d = a.clientY + b.y), a.pageOffset = b, a.points = [c, d], a.cursor = f || g, a } function H(a) { var b = a - f(ha, e.ort), c = 100 * b / E(); return e.dir ? 100 - c : c } function I(a) { var b = 100, c = !1; return ia.forEach(function (d, e) { if (!d.hasAttribute("disabled")) { var f = Math.abs(qa[e] - a); b > f && (c = e, b = f) } }), c } function J(a, b, c, d) { var e = c.slice(), f = [!a, a], g = [a, !a]; d = d.slice(), a && d.reverse(), d.length > 1 ? d.forEach(function (a, c) { var d = S(e, a, e[a] + b, f[c], g[c], !1); d === !1 ? b = 0 : (b = d - e[a], e[a] = d) }) : f = g = [!0]; var h = !1; d.forEach(function (a, d) { h = W(a, c[a] + b, f[d], g[d]) || h }), h && d.forEach(function (a) { K("update", a), K("slide", a) }) } function K(a, b, c) { Object.keys(va).forEach(function (d) { var f = d.split(".")[0]; a === f && va[d].forEach(function (a) { a.call(ka, ua.map(e.format.to), b, ua.slice(), c || !1, qa.slice()) }) }) } function L(a, b) { "mouseout" === a.type && "HTML" === a.target.nodeName && null === a.relatedTarget && N(a, b) } function M(a, b) { if (-1 === navigator.appVersion.indexOf("MSIE 9") && 0 === a.buttons && 0 !== b.buttonsProperty) return N(a, b); var c = (e.dir ? -1 : 1) * (a.calcPoint - b.startCalcPoint), d = 100 * c / b.baseSize; J(c > 0, d, b.locations, b.handleNumbers) } function N(a, b) { sa && (m(sa, e.cssClasses.active), sa = !1), a.cursor && (za.style.cursor = "", za.removeEventListener("selectstart", c)), wa.forEach(function (a) { ya.removeEventListener(a[0], a[1]) }), m(pa, e.cssClasses.drag), V(), b.handleNumbers.forEach(function (a) { K("change", a), K("set", a), K("end", a) }) } function O(a, b) { if (1 === b.handleNumbers.length) { var d = ia[b.handleNumbers[0]]; if (d.hasAttribute("disabled")) return !1; sa = d.children[0], l(sa, e.cssClasses.active) } a.stopPropagation(); var f = F(ma.move, ya, M, { startCalcPoint: a.calcPoint, baseSize: E(), pageOffset: a.pageOffset, handleNumbers: b.handleNumbers, buttonsProperty: a.buttons, locations: qa.slice() }), g = F(ma.end, ya, N, { handleNumbers: b.handleNumbers }), h = F("mouseout", ya, L, { handleNumbers: b.handleNumbers }); wa = f.concat(g, h), a.cursor && (za.style.cursor = getComputedStyle(a.target).cursor, ia.length >
8792 1 && l(pa, e.cssClasses.drag), za.addEventListener("selectstart", c, !1)), b.handleNumbers.forEach(function (a) { K("start", a) }) } function P(a) { a.stopPropagation(); var b = H(a.calcPoint), c = I(b); return c === !1 ? !1 : (e.events.snap || h(pa, e.cssClasses.tap, e.animationDuration), W(c, b, !0, !0), V(), K("slide", c, !0), K("update", c, !0), K("change", c, !0), K("set", c, !0), void (e.events.snap && O(a, { handleNumbers: [c] }))) } function Q(a) { var b = H(a.calcPoint), c = ta.getStep(b), d = ta.fromStepping(c); Object.keys(va).forEach(function (a) { "hover" === a.split(".")[0] && va[a].forEach(function (a) { a.call(ka, d) }) }) } function R(a) { a.fixed || ia.forEach(function (a, b) { F(ma.start, a.children[0], O, { handleNumbers: [b] }) }), a.tap && F(ma.start, ha, P, {}), a.hover && F(ma.move, ha, Q, { hover: !0 }), a.drag && ja.forEach(function (b, c) { if (b !== !1 && 0 !== c && c !== ja.length - 1) { var d = ia[c - 1], f = ia[c], g = [b]; l(b, e.cssClasses.draggable), a.fixed && (g.push(d.children[0]), g.push(f.children[0])), g.forEach(function (a) { F(ma.start, a, O, { handles: [d, f], handleNumbers: [c - 1, c] }) }) } }) } function S(a, b, c, d, f, g) { return ia.length > 1 && (d && b > 0 && (c = Math.max(c, a[b - 1] + e.margin)), f && b < ia.length - 1 && (c = Math.min(c, a[b + 1] - e.margin))), ia.length > 1 && e.limit && (d && b > 0 && (c = Math.min(c, a[b - 1] + e.limit)), f && b < ia.length - 1 && (c = Math.max(c, a[b + 1] - e.limit))), e.padding && (0 === b && (c = Math.max(c, e.padding)), b === ia.length - 1 && (c = Math.min(c, 100 - e.padding))), c = ta.getStep(c), c = i(c), c !== a[b] || g ? c : !1 } function T(a) { return a + "%" } function U(a, b) { qa[a] = b, ua[a] = ta.fromStepping(b); var c = function () { ia[a].style[e.style] = T(b), Y(a), Y(a + 1) }; window.requestAnimationFrame && e.useRequestAnimationFrame ? window.requestAnimationFrame(c) : c() } function V() { ra.forEach(function (a) { var b = qa[a] > 50 ? -1 : 1, c = 3 + (ia.length + b * a); ia[a].childNodes[0].style.zIndex = c }) } function W(a, b, c, d) { return b = S(qa, a, b, c, d, !1), b === !1 ? !1 : (U(a, b), !0) } function Y(a) { if (ja[a]) { var b = 0, c = 100; 0 !== a && (b = qa[a - 1]), a !== ja.length - 1 && (c = qa[a]), ja[a].style[e.style] = T(b), ja[a].style[e.styleOposite] = T(100 - c) } } function Z(a, b) { null !== a && a !== !1 && ("number" == typeof a && (a = String(a)), a = e.format.from(a), a === !1 || isNaN(a) || W(b, ta.toStepping(a), !1, !1)) } function _(a, b) { var c = j(a), d = void 0 === qa[0]; b = void 0 === b ? !0 : !!b, c.forEach(Z), e.animate && !d && h(pa, e.cssClasses.tap, e.animationDuration), ra.forEach(function (a) { W(a, qa[a], !0, !1) }), V(), ra.forEach(function (a) { K("update", a), null !== c[a] && b && K("set", a) }) } function aa(a) { _(e.start, a) } function ba() { var a = ua.map(e.format.to); return 1 === a.length ? a[0] : a } function ca() { for (var a in e.cssClasses) e.cssClasses.hasOwnProperty(a) && m(pa, e.cssClasses[a]); for (; pa.firstChild;)pa.removeChild(pa.firstChild); delete pa.noUiSlider } function da() { return qa.map(function (a, b) { var c = ta.getNearbySteps(a), d = ua[b], e = c.thisStep.step, f = null; e !== !1 && d + e > c.stepAfter.startValue && (e = c.stepAfter.startValue - d), f = d > c.thisStep.startValue ? c.thisStep.step : c.stepBefore.step === !1 ? !1 : d - c.stepBefore.highestStep, 100 === a ? e = null : 0 === a && (f = null); var g = ta.countStepDecimals(); return null !== e && e !== !1 && (e = Number(e.toFixed(g))), null !== f && f !== !1 && (f = Number(f.toFixed(g))), [f, e] }) } function ea(a, b) { va[a] = va[a] || [], va[a].push(b), "update" === a.split(".")[0] && ia.forEach(function (a, b) { K("update", b) }) } function fa(a) { var b = a && a.split(".")[0], c = b && a.substring(b.length); Object.keys(va).forEach(function (a) { var d = a.split(".")[0], e = a.substring(d.length); b && b !== d || c && c !== e || delete va[a] }) } function ga(a, b) { var c = ba(), d = ["margin", "limit", "padding", "range", "animate", "snap", "step", "format"]; d.forEach(function (b) { void 0 !== a[b] && (g[b] = a[b]) }); var f = X(g); d.forEach(function (b) { void 0 !== a[b] && (e[b] = f[b]) }), ta = f.spectrum, e.margin = f.margin, e.limit = f.limit, e.padding = f.padding, e.pips && D(e.pips), qa = [], _(a.start || c, b) } var ha, ia, ja, ka, la, ma = p(), na = r(), oa = na && q(), pa = a, qa = [], ra = [], sa = !1, ta = e.spectrum, ua = [], va = {}, wa = null, xa = a.ownerDocument, ya = xa.documentElement, za = xa.body; if (pa.noUiSlider) throw new Error("noUiSlider (" + $ + "): Slider was already initialized."); return v(pa), u(e.connect, ha), ka = { destroy: ca, steps: da, on: ea, off: fa, get: ba, set
8792: _, reset: aa, __moveHandles: function (a, b, c) { J(a, b, qa, c) }, options: g, updateOptions: ga, target: pa, removePips: C, pips: D }, R(e.events), _(e.start), e.pips && D(e.pips), e.tooltips && x(), y(), ka } function Z(a, b) { if (!a || !a.nodeName) throw new Error("noUiSlider (" + $ + "): create requires a single element, got: " + a); var c = X(b, a), d = Y(a, c, b); return a.noUiSlider = d, d } var $ = "10.0.0"; C.prototype.getMargin = function (a) { var b = this.xNumSteps[0]; if (b && a / b % 1 !== 0) throw new Error("noUiSlider (" + $ + "): 'limit', 'margin' and 'padding' must be divisible by step."); return 2 === this.xPct.length ? t(this.xVal, a) : !1 }, C.prototype.toStepping = function (a) { return a = x(this.xVal, this.xPct, a) }, C.prototype.fromStepping = function (a) { return y(this.xVal, this.xPct, a) }, C.prototype.getStep = function (a) { return a = z(this.xPct, this.xSteps, this.snap, a) }, C.prototype.getNearbySteps = function (a) { var b = w(a, this.xPct); return { stepBefore: { startValue: this.xVal[b - 2], step: this.xNumSteps[b - 2], highestStep: this.xHighestCompleteStep[b - 2] }, thisStep: { startValue: this.xVal[b - 1], step: this.xNumSteps[b - 1], highestStep: this.xHighestCompleteStep[b - 1] }, stepAfter: { startValue: this.xVal[b - 0], step: this.xNumSteps[b - 0], highestStep: this.xHighestCompleteStep[b - 0] } } }, C.prototype.countStepDecimals = function () { var a = this.xNumSteps.map(k); return Math.max.apply(null, a) }, C.prototype.convert = function (a) { return this.getStep(this.toStepping(a)) }; var _ = { to: function (a) { return void 0 !== a && a.toFixed(2) }, from: Number }; return { version: $, create: Z } })
8793
8794
8795    !function (e) { "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? module.exports = e() : window.wNumb = e() }(function () { "use strict"; function e(e) { return e.split("").reverse().join("") } function t(e, t) { return e.substring(0, t.length) === t } function n(e, t) { return e.slice(-1 * t.length) === t } function r(e, t, n) { if ((e[t] || e[n]) && e[t] === e[n]) throw new Error(t) } function i(e) { return "number" == typeof e && isFinite(e) } function o(e, t) { return e = e.toString().split("e"), e = Math.round(+(e[0] + "e" + (e[1] ? +e[1] + t : t))), (+((e = e.toString().split("e"))[0] + "e" + (e[1] ? +e[1] - t : -t))).toFixed(t) } function f(t, n, r, f, u, s, c, a, p, d, l, h) { var g, v, m, w = h, x = "", y = ""; return s && (h = s(h)), !!i(h) && (!1 !== t && 0 === parseFloat(h.toFixed(t)) && (h = 0), h < 0 && (g = !0, h = Math.abs(h)), !1 !== t && (h = o(h, t)), h = h.toString(), -1 !== h.indexOf(".") ? (m = (v = h.split("."))[0], r && (x = r + v[1])) : m = h, n && (m = e((m = e(m).match(/.{1,3}/g)).join(e(n)))), g && a && (y += a), f && (y += f), g && p && (y += p), y += m, y += x, u && (y += u), d && (y = d(y, w)), y) } function u(e, r, o, f, u, s, c, a, p, d, l, h) { var g, v = ""; return l && (h = l(h)), !(!h || "string" != typeof h) && (a && t(h, a) && (h = h.replace(a, ""), g = !0), f && t(h, f) && (h = h.replace(f, "")), p && t(h, p) && (h = h.replace(p, ""), g = !0), u && n(h, u) && (h = h.slice(0, -1 * u.length)), r && (h = h.split(r).join("")), o && (h = h.replace(o, ".")), g && (v += "-"), v += h, "" !== (v = v.replace(/[^0-9\.\-.]/g, "")) && (v = Number(v), c && (v = c(v)), !!i(v) && v)) } function s(e) { var t, n, i, o = {}; for (void 0 === e.suffix && (e.suffix = e.postfix), t = 0; t < p.length; t += 1)if (n = p[t], void 0 === (i = e[n])) "negative" !== n || o.negativeBefore ? "mark" === n && "." !== o.thousand ? o[n] = "." : o[n] = !1 : o[n] = "-"; else if ("decimals" === n) { if (!(i >= 0 && i < 8)) throw new Error(n); o[n] = i } else if ("encoder" === n || "decoder" === n || "edit" === n || "undo" === n) { if ("function" != typeof i) throw new Error(n); o[n] = i } else { if ("string" != typeof i) throw new Error(n); o[n] = i } return r(o, "mark", "thousand"), r(o, "prefix", "negative"), r(o, "prefix", "negativeBefore"), o } function c(e, t, n) { var r, i = []; for (r = 0; r < p.length; r += 1)i.push(e[p[r]]); return i.push(n), t.apply("", i) } function a(e) { if (!(this instanceof a)) return new a(e); "object" == typeof e && (e = s(e), this.to = function (t) { return c(e, f, t) }, this.from = function (t) { return c(e, u, t) }) }
8795 var p = ["decimals", "thousand", "mark", "prefix", "suffix", "encoder", "decoder", "negativeBefore", "negative", "edit", "undo"]; return a });
8796
8797    sliderFormat = document.getElementById('sliderPrice');
8798    if (sliderFormat != null) {
8799        if (Search.minPrice() !== Search.maxPrice()) {
8800            noUiSlider.create(sliderFormat, {
8801                start: [Search.minPrice(), Search.maxPrice()],
8802                step: 1,
8803                behaviour: 'drag-tap',
8804                connect: true,
8805                tooltips: true,
8806                format: wNumb({
8807                    decimals: 0
8808                }),
8809                range: {
8810                    'min': Math.floor(Search.minPrice()),
8811                    'max': Math.ceil(Search.maxPrice())
8812                }
8813            });
8814            var snapValues = [
8815                document.getElementById('priceFilterLower'),
8816                document.getElementById('priceFilterUpper')
8817            ];
8818
8819            sliderFormat.noUiSlider.on('update', function (values, handle) {
8820                snapValues[handle].value = Math.round(values[handle]);
8821            });
8822
8823            sliderFormat.noUiSlider.on('end', function () {
8824                usePriceFilter();
8825            });
8826        }
8827    }
8828}
8829
8830function resetResultsSize() {
8831    var ElementSize = $(itemElementClass).outerHeight();
8832    $(".productContainer").height(ElementSize * 5);
8833}
8834
8835function landingClmbShell() {
8836    var selectors = {
8837        lpFilterLinkSelector: 'a[id*=lnkFacetLink]',
8838        expandedClass: 'LPFilters-expanded'
8839    };
8840
8841    LPExpandButtonInit(selectors);
8842    LPExpandButtonClickHandler(selectors);
8843}
8844
8845var LPExpandButtonClickHandlerCompleted = false;
8846/**
8847 * Set the click handler for the filter expand button on ALPs
8848 */
8849function LPExpandButtonClickHandler(selectors) {
8850    if (!LPExpandButtonClickHandlerCompleted) {
8851        LPExpandButtonClickHandlerCompleted = true;
8852
8853        $('.LPExpandButton').click(function () {
8854            var $this = $(this),
8855                $parent = $this.parent(),
8856                isCollapsed = $parent.hasClass(selectors.expandedClass),
8857                dataStartText = (isCollapsed ? 'Show' : 'Hide');
8858
8859            $this.attr('data-start', dataStartText);
8860            $parent.toggleClass(selectors.expandedClass);
8861        });
8862    }
8863}
8864
8865var LPExpandButtonInitCompleted = false;
8866/**
8867 * Sets the amount of hidden filters on the filter expand button
8868 */
8869function LPExpandButtonInit(selectors) {
8870    if (!LPExpandButtonInitCompleted) {
8871        LPExpandButtonInitCompleted = true;
8872
8873        $('.LPExpandButton').each(function () {
8874            var $this = $(this),
8875                extraSiblingCount = $this.siblings(selectors.lpFilterLinkSelector).length - 6;
8876
8877            $this.toggle(extraSiblingCount > 0);
8878            $this.text(extraSiblingCount);
8879        });
8880    }
8881}
8882
8883function showHideFilters(bool) {
8884    $(".FAFFilters, .FAFResults").toggleClass("filter-is-visible", bool);
8885}
8886
8887function FAFPostInit() {
8888
8889    var d = new Date();
8890    d = d.getTime();
8891    if ($('#reloadValue').val().length == 0) {
8892        $('#reloadValue').val(d);
8893        $('body').show();
8894    }
8895    else {
8896        $('#reloadValue').val('');
8897        location.reload();
8898    }
8899
8900    var mobile;
8901
8902    function ismobile() {
8903        if (window.innerWidth <= 1024) {
8904            mobile = true;
8905        } else {
8906            mobile = false;
8907        }
8908        return mobile;
8909    }
8910
8911    // Just in case the SearchModels.js function does not work when a result-set is empty.
8912    if (Search.totalVisibleProducts() == 0 || $('.productContainer').is(':empty')) {
8913
8914        const entryPointUrl = document.getElementById('entryPointURLHidden')?.value?.split('?');
8915
8916        if (entryPointUrl[0].startsWith("collection/") == false) {
8917            $("#noResultsPanel").show();
8918        }
8919    }
8920    else {
8921        $("#noResultsPanel").hide();
8922    }
8923
8924    function togglemobile() {
8925
8926        ismobile();
8927        var mob = "FFmobile";
8928        var desk = "FFDesktop"
8929        if (mobile == true) {
8930            $("#FafKnockoutResults .FAFFilters").addClass(mob);
8931            $("#FafKnockoutResults .FAFFilters").removeClass(desk);
8932            $("#FafKnockoutResults .FacetDefinitions > div").hide();
8933            $(".FAFFiltersReorder > div > .facetHdr").addClass("FFmobileHDR");
8934            $(".FAFFiltersReorder > div > .facetHdr").removeClass("FFDesktopHDR");
8935        } else {
8936            $("#FafKnockoutResults .FAFFilters").removeClass(mob);
8937            $("#FafKnockoutResults .FAFFilters").addClass(desk);
8938            $("#FafKnockoutResults .FacetDefinitions > div").show();
8939            $(".FAFFiltersReorder > div > .facetHdr").removeClass("FFmobileHDR");
8940            $(".FAFFiltersReorder > div > .facetHdr").addClass("FFDesktopHDR");
8941        }
8942
8943    }
8944
8945    togglemobile();
8946
8947    if ($("#UseLandingPageHidden").length > 0) {
8948        isLandingPageFCS = ($("#UseLandingPageHidden").val() === "true");
8949    }
8950
8951    if (isLandingPageFCS === true) {
8952        $(".mobile .FAFoptions").hide();
8953    }
8954
8955    //Desktop Toggle
8956    $(".filtersButton").click(function () {
8957        checkCookieFF(false);
8958    });
8959
8960    function checkCookieFF(isPageLoad) {
8961        if (!isLandingPageFCS) {
8962            var preuser = (getCookieFF("FFChecked")).toLowerCase();
8963            var user = (preuser == "true" || preuser == "false") ? true : false;
8964            if (isPageLoad) {
8965                if (window.innerWidth >= 1024) {
8966                    // If the user has opened the filters before, keep them open on subsequent visits.
8967                    if (user) {
8968                        if (preuser == "false") {
8969                            showHideFilters(false);
8970                        }
8971                        else {
8972                            showHideFilters(true);
8973                        }
8974                    }
8975                    // If the user hasn't opened the filters before, run the usual logic.
8976                    else {
8977                        showHideFilters(($('#ComplexMode').val() != 'Simple'));
8978                    }
8979                }
8980            } else {
8981                var togglebool = $(".FAFFilters").filter(':visible').length >= 1;
8982                setCookieFF("FFChecked", !togglebool);
8983                showHideFilters(!togglebool);
8984            }
8985        }
8986    }
8987
8988    checkCookieFF(true);
8989
8990    var FAFWindowResizeDebounce;
8991    var windowresizecheck = $(window).width();
8992    $(window).resize(function () {
8993        clearTimeout(FAFWindowResizeDebounce);
8994        FAFWindowResizeDebounce = setTimeout(function () {
8995            var currWindowWidth = $(window).width();
8996            if (windowresizecheck != currWindowWidth) {
8997                windowresizecheck = currWindowWidth;
8998                checkCookieFF(false);
8999                togglemobile();
9000                mobileheightfiletr();
9001            }
9002        }, 500);
9003    });
9004
9005    mobileheightfiletr();
9006
9007    function mobileheightfiletr() {
9008        h = window.innerHeight;
9009        $(".FFmobile #scroller").css("height", h);
9010    }
9011
9012    function hideReorder() {
9013        var land = $('.FAF.transition').css('display');
9014        if (land === 'none') {
9015            $(".FAFoptions").hide();
9016        }
9017    }
9018
9019    flipImages();
9020
9021    function sticky_relocate() {
9022        ismobile();
9023        if (mobile == true) {
9024            if (window.innerWidth < 1025) {
9025                var sticky;
9026                var topheader;
9027                var window_top = $(window).scrollTop();
9028                var div_top = getStickyAnchorOffset();
9029                if ($(".masthead").css("position") === "fixed") {
9030                    var topheader = $('.masthead').height();
9031                } else {
9032                    var topheader = 0
9033                }
9034                div_top = div_top - topheader
9035                if (window_top > div_top) {
9036                    $('.sticky').addClass('sticknow');
9037                    $('.FAFoptionsContainer').css("top", topheader);
9038                } else {
9039                    $('.sticky').removeClass('sticknow');
9040                    $('.FAFoptionsContainer').css("top", "0");
9041                }
9042            } else if (window.innerWidth > 1025) {
9043                $('.sticky').css("top", "0");
9044            }
9045        }
9046
9047    }
9048
9049    var timerStickyRelocate;
9050    $(window).scroll(function () {
9051        clearTimeout(timerStickyRelocate);
9052        timerStickyRelocate = setTimeout(sticky_relocate, 300);
9053    });
9054
9055    $('.FacetSearch').click(function () {
9056        $("#searchTermTxt").focus();
9057    });
9058
9059    $(".desktop .FAFoptionsReorder").click(function () {
9060        $(".reorder").toggleClass("filter-is-visible");
9061    });
9062
9063    // Filter headers
9064
9065    $(".filters").click(function () {
9066        FFback();
9067        $(".filters").toggleClass("FFFiletrActive");
9068        $("#filer-overlay").toggleClass("active");
9069        $(".FAFFilters").addClass("active");
9070        $("body").css("position", "fixed");
9071        TopPos = $('.masthead').height();
9072        $('html, body').animate({ scrollTop: getStickyAnchorOffset() - TopPos }, 250, 'swing');
9073
9074        ToggleSizeTermPanelVisibility();
9075    });
9076
9077    $('.FacetDefinitions  > div > div  > .facetHdr').click(function () {
9078        var nowtgt = $(this).siblings('.FacetOptions');
9079        var visible = nowtgt.is(":visible");
9080        if (visible) {
9081            nowtgt.hide();
9082            nowtgt.parent().removeClass('FFopen');
9083        } else {
9084            nowtgt.show();
9085            nowtgt.parent().addClass("FFopen");
9086        }
9087    });
9088
9089
9090    $('.FAFFiltersReorder > div > .facetHdr').click(function () {
9091        if ($(this).hasClass('FFDesktopHDR')) {
9092            var nowtgt = $(this).siblings('.col-1');
9093            var visible = nowtgt.is(":visible");
9094            if (visible) {
9095                nowtgt.hide();
9096            } else {
9097                nowtgt.show();
9098            }
9099        } else {
9100            var title = $(this).text();
9101            var nowtgt = $(this).siblings('.col-1');
9102            var visible = nowtgt.is(":visible");
9103            $(".ToggleMenu").hide();
9104            $(this).parent().show();
9105            $(this).hide();
9106            $(".title-holder .active h2").html(title);
9107            $(".title-holder .active").show();
9108            $(".title-holder .inactive").hide();
9109            if (visible) {
9110                nowtgt.hide();
9111            } else {
9112                nowtgt.show();
9113            }
9114        }
9115    });
9116
9117    $('.FFmobile #FF-back').click(function () {
9118        FFback();
9119    });
9120
9121    $('.FFmobile #close').click(function () {
9122        FFback();
9123    });
9124
9125    $(".facetHdr:contains('ProductGroup')").text('Category');
9126
9127    $(".ffclose").click(function () {
9128        closeFilters();
9129    });
9130
9131    function FFback() {
9132        $('.ToggleMenu  > .col-1').hide();
9133        $('.ToggleMenu').show();
9134        $('.ToggleMenu > .facetHdr').show();
9135        $(".title-holder .inactive").show();
9136        $(".title-holder .active").hide();
9137
9138        ToggleSizeTermPanelVisibility();
9139    }
9140
9141    var getStickyAnchorOffset = function () {
9142        var stickyElement = $('#sticky-anchor');
9143        var offsetValueToReturn = 0;
9144        if (stickyElement.length > 0) {
9145            if (typeof $('#sticky-anchor').offset().top != "null") {
9146                offsetValueToReturn = $('#sticky-anchor').offset().top;
9147            }
9148        }
9149        return offsetValueToReturn;
9150    }
9151
9152    function closeFilters() {
9153        $(".filters").toggleClass("FFFiletrActive");
9154        TopPos = $('.masthead').height();
9155        $('html, body').animate({ scrollTop: getStickyAnchorOffset() - 125 }, 250, 'swing');
9156        $("#filer-overlay").toggleClass("active");
9157        $(".FAFFilters").removeClass("active");
9158        $(".FAFResults").removeClass("active");
9159        $("body").css("position", "initial");
9160    }
9161
9162    function closestart() {
9163        $(".filters").removeClass("FFFiletrActive");
9164        TopPos = $('.masthead').height();
9165        $('html, body').animate({ scrollTop: getStickyAnchorOffset() - 125 }, 250, 'swing');
9166        $(".FAFFilters").removeClass("active");
9167        $(".FAFResults").removeClass("active");
9168    }
9169
9170    closestart();
9171
9172    $("#confirmButton").click(function () {
9173        var proceed = checkStatus();
9174        if (proceed == true) {
9175            FFback();
9176            closeFilters();
9177            closeProceed();
9178            navigateToSizeTerm(true);
9179        } else {
9180            closeFilters();
9181        }
9182    });
9183
9184    function closeProceed() {
9185        $(".facetOption").removeClass("facetSelectedff");
9186        checkStatus()
9187    }
9188
9189}
9190
9191function ToggleSizeTermPanelVisibility() {
9192    const hasSizeTermKnockoutElementGotContent = $.trim($("#sizeTermKnockout").html()) != "";
9193
9194    $("#SizeTermPanel").toggle(hasSizeTermKnockoutElementGotContent);
9195}
9196
9197function setCookieFF(cname, cvalue) {
9198    localStorage.setItem(cname, cvalue);
9199}
9200
9201function getCookieFF(cname) {
9202    return (localStorage.getItem(cname) ? localStorage.getItem(cname) : "none")
9203}
9204
9205function toggleSizeFilter(sizeTermID) {
9206    if (Search.SizeFilters().indexOf(sizeTermID) >= 0) {
9207        Search.SizeFilters.remove(sizeTermID);
9208        $("#sizeOption" + sizeTermID).removeClass("facetSelectedff");
9209        $("#sizeOption" + sizeTermID).addClass("facetUnselectedff");
9210    } else {
9211        Search.SizeFilters().push(sizeTermID);
9212        $("#sizeOption" + sizeTermID).removeClass("facetUnselectedff");
9213        $("#sizeOption" + sizeTermID).addClass("facetSelectedff");
9214    }
9215    if (Search.SizeFilters().length > 0) {
9216        $(".sizeFilterApplyBtn").addClass("active");
9217        $(".sizeFilterApplyBtn").attr("onclick", "navigateToSizeTerm(true)")
9218
9219    } else {
9220        $(".sizeFilterApplyBtn").removeClass("active");
9221        $(".sizeFilterApplyBtn").removeAttr("onclick")
9222    }
9223}
9224
9225function checkStatus() {
9226    return Search.SizeFilters().length > 0;
9227};
9228
9229function preloadSizeTerms() {
9230    var validRefresh = true;
9231
9232    ToggleSizeTermPanelVisibility();
9233
9234    if ($("#entryPointURLHidden").val().toLowerCase().indexOf('sizeterm') >= 0) {
9235        $("#SizeTermRevertPanel").show();
9236    }
9237
9238    if (validRefresh) {
9239        Search.SizeFilters = ko.observableArray();
9240
9241        if (Search.validateForSizeTerms()) {
9242            var term = "";
9243
9244            if ($("#entryPointURLHidden").val().indexOf('?') > 0) {
9245                var initialQueryStr = $("#entryPointURLHidden").val().split('?')[1];
9246
9247                if (initialQueryStr.indexOf("&") > 0) {
9248                    var queryStrSplit = initialQueryStr.split('&');
9249                    for (iq = 0; iq < queryStrSplit.length; iq++) {
9250                        if (queryStrSplit[iq].toLowerCase().indexOf("term=") >= 0 && queryStrSplit[iq].toLowerCase().indexOf("sizeterm=") < 0 && queryStrSplit[iq].toLowerCase().indexOf("utm_term=") < 0) {
9251                            if (queryStrSplit[iq].split('=')[1] != "") {
9252                                term = queryStrSplit[iq].split('=')[1]
9253                            }
9254                        }
9255                        else { }
9256                    }
9257                } else {
9258                    if (initialQueryStr.toLowerCase().indexOf("term=") >= 0 && initialQueryStr.toLowerCase().indexOf("sizeterm=") < 0 && initialQueryStr.toLowerCase().indexOf("utm_term=") < 0) {
9259                        if (initialQueryStr.split('=')[1] != null) {
9260                            term = initialQueryStr.split('=')[1];
9261                        }
9262                    } else {
9263
9264                    }
9265                }
9266            }
9267
9268            if ($("#sizeTermKnockout").html() != "") {
9269                Search.SizeFiltersAvailable(true);
9270
9271                ToggleSizeTermPanelVisibility();
9272
9273                if ($("#entryPointURLHidden").val().toLowerCase().indexOf('sizeterm') >= 0) {
9274                    $("#SizeTermRevertPanel").show();
9275                }
9276            }
9277        }
9278
9279        Search.setSizeFilterStatus(Search.Products());
9280    }
9281}
9282
9283/**
9284* Makes a call to navigateToSizeTerm(false), removing sizeterm params from the URL.
9285* It is called from HTML. So there are no references in code, but it is used.
9286*/
9287function revertSizeTerm() {
9288    navigateToSizeTerm(false);
9289}
9290
9291/**
9292* Navigate to or from a sizeterm-based Find & Filter URL.
9293* @param {boolean} addOrRemoveSizeTerms True to add a sizeterm parameter, false to remove it.
9294*/
9295function navigateToSizeTerm(addOrRemoveSizeTerms) {
9296    try {
9297        let initialURL = "/";
9298
9299        let selectedSizeTerms = [];
9300        ({ selectedSizeTerms, initialURL } = navigateToSizeTermSetFindAndFilterState(addOrRemoveSizeTerms, initialURL));
9301
9302        navigateToSizeTermSetBrowserStateAndUrl(initialURL, addOrRemoveSizeTerms, selectedSizeTerms);
9303    } catch (ex) {
9304        alert(ex);
9305    }
9306}
9307
9308/**
9309* Sets the browser state and URL as part of the navigate to navigateToSizeTerm process.
9310* @param {string} initialURL The URL from the hidden field on the page.
9311* @param {boolean} addOrRemoveSizeTerms True to add a sizeterm parameter, false to remove it.
9312* @param {string} selectedSizeTerms Comma-separated values of sizeterm ID's to add to the URL (if addOrRemoveSizeTerms is true).
9313*/
9314function navigateToSizeTermSetBrowserStateAndUrl(initialURL, addOrRemoveSizeTerms, selectedSizeTerms) {
9315    let naviURL = Search.buildURL();
9316
9317    const collectionTestUrl = initialURL.split('?').length > 1 ? initialURL.split('?')[1] : initialURL;
9318    const collectionSearchParamsTest = new URLSearchParams(collectionTestUrl);
9319
9320    if (!naviURL.length || collectionSearchParamsTest.has('collection')) {
9321        if (collectionSearchParamsTest.has('collection')) {
9322            naviURL = `/${collectionSearchParamsTest.get('collection')}`;
9323        }
9324        else {
9325            naviURL = initialURL;
9326        }
9327    }
9328
9329    const naviUrlSearchParams = naviURL.split('?').length > 1
9330        ? new URLSearchParams(naviURL.split('?')[1])
9331        : new URLSearchParams();
9332
9333    const additionalFacets = Search.getAdditionalFacets();
9334
9335    addOrRemoveParamFromSearchParams(
9336        naviUrlSearchParams,
9337        additionalFacets != "" && !naviUrlSearchParams.has('extrafacets'),
9338        'extrafacets',
9339        additionalFacets);
9340
9341    addOrRemoveParamFromSearchParams(
9342        naviUrlSearchParams,
9343        addOrRemoveSizeTerms && selectedSizeTerms.length,
9344        'sizeterm',
9345        selectedSizeTerms);
9346
9347    window.location.href = navigateToSizeTermGetFinalisedUrl(naviURL, naviUrlSearchParams);
9348}
9349
9350/**
9351* Gets the finalised URL Find and Filter will navigate to.
9352* @param {string} naviURL The initial navigation URL.
9353* @param {URLSearchParams} naviUrlSearchParams The search params we may use to modify the naviURL with.
9354* @returns {string} The URL Find and Filter will navigate to.
9355*/
9356function navigateToSizeTermGetFinalisedUrl(naviURL, naviUrlSearchParams) {
9357    let naviURLSplit = naviURL.split('?');
9358
9359    if (naviURLSplit.length > 0) {
9360        naviURLSplit[1] = naviUrlSearchParams.toString();
9361    }
9362    else {
9363        naviURLSplit.push(naviUrlSearchParams.toString());
9364    }
9365
9366    if (naviURLSplit.length > 1 && naviURLSplit[1].length) {
9367        naviURL = naviURLSplit.join('?');
9368    }
9369    else if (naviURLSplit.length) {
9370        naviURL = naviURLSplit[0];
9371    }
9372
9373    return naviURL;
9374}
9375
9376/**
9377* Sets the Find and Filter state and history push state as part of the navigate to navigateToSizeTerm process.
9378* @param {boolean} addOrRemoveSizeTerms True to add a sizeterm parameter, false to remove it.
9379* @param {string} initialURL The URL from the hidden field on the page.
9380* @returns { {selectedSizeTerms: string, initialURL:string} } Returns an kvp object containing a string for the selected size terms (selectedSizeTerms) and the initialURL which may or may not have been updated depending on the action being undertaken.
9381*/
9382function navigateToSizeTermSetFindAndFilterState(addOrRemoveSizeTerms, initialURL) {
9383    const entryPointUrl = document.getElementById('entryPointURLHidden')?.value?.split('?');
9384    const initialUrlSearchParams = new URLSearchParams(entryPointUrl?.length > 1 ? entryPointUrl[1] : entryPointUrl[0].indexOf("collection/") > -1 ? new URLSearchParams("") : entryPointUrl[0]);
9385
9386    let selectedSizeTerms = '';
9387
9388    if (addOrRemoveSizeTerms) {
9389        if (Search.SizeFilters().length) {
9390            selectedSizeTerms = Search.SizeFilters().join(',');
9391
9392            initialUrlSearchParams.set('sizeterm', selectedSizeTerms);
9393        }
9394    }
9395    else {
9396        if (initialUrlSearchParams.has('sizeterm')) {
9397            initialUrlSearchParams.delete('sizeterm');
9398        }
9399    }
9400
9401    if (initialURL == "/") {
9402        if (entryPointUrl[0].startsWith("collection/")) {
9403            initialURL = `/${entryPointUrl[0]}`
9404        } else {
9405            initialURL = getFacetResultsUrl();
9406        }
9407       
9408    }
9409    const queryString = initialUrlSearchParams.toString();
9410    if (queryString) {
9411        initialURL += `?${queryString}`;
9412    }
9413
9414    let stateObj = Search.createHistoryObj();
9415    stateObj.didNavigateAway = true;
9416
9417    history.pushState(stateObj, "PomegranateRefilter", initialURL);
9418    return { selectedSizeTerms, initialURL };
9419}
9420
9421/**
9422* Either sets or deletes a value from the provided URLSearchParams object
9423* @param {URLSearchParams} searchParams the searchparams object we are adding or removing a value to/from.
9424* @param {boolean} addCondition If true, we set the provided value with the specified key. Else remove it.
9425* @param {string} key The key of the value we are adding or removing.
9426* @param {string} value The value we are adding if addCondition is true.
9427*/
9428function addOrRemoveParamFromSearchParams(searchParams, addCondition, key, value) {
9429    if (addCondition) {
9430        searchParams.set(key, value);
9431    }
9432    else {
9433        searchParams.delete(key);
9434    }
9435}
9436
9437function BetterSearchQuickLookDD(productid)
9438{
9439    loadQuickLookByProductId(productid);
9440}
9441
9442/**
9443 * Starts the product compare functionality, if the FAFConfig object is present on FacetResults.aspx and the ProductCompare key has a value of true
9444 */
9445function initProductCompare() {
9446    if (typeof FAFConfig != "undefined") {
9447        if (FAFConfig.ProductCompare) {
9448            $('body').append('<a id="goToCompareButton" class="compare-button" href="/" style="display:none;" target="_blank">Compare <span></span> items</a>');
9449        }
9450    }
9451}
9452
9453var comparearray = [];
9454/**
9455 * Called on-click of the "compare me" portion of the FAF item
9456 * @param {object} el The JQuery $(this) Object reference for the item which has been clicked
9457 */
9458function getComparedItems(el) {
9459    var ischecked = el.is(':checked');
9460    var showhide = ischecked ? "show" : "hide";
9461    var parent = el.closest('.col-facetItem');
9462    var puid = parent.attr('data-uid');
9463    // Add or remove item from array
9464    manageCompareArray(puid, showhide);
9465    el.parent().toggleClass('incomparelist', ischecked);
9466    manageCompareButtonLink();
9467}
9468
9469/**
9470 * Update the compare array object [add or remove item, to/from array]
9471 * @param {string} uid The Product UID of the item
9472 * @param {string} addorremove Whether we are adding or removing the item from the array
9473 */
9474function manageCompareArray(uid, addorremove) {
9475    var inarray = comparearray.includes(uid);
9476    if (addorremove == "hide" && inarray) {
9477        comparearray = comparearray.filter(function (element) {
9478            return element != uid
9479        });
9480    }
9481    else if (addorremove == "show") {
vendor: 5,586 bytes, lines 9482-9512
9482        comparearray.push(uid);
9483    }
9484}
9485
9486/**
9487 * Manages the visibility and href attribute of the compare button
9488 */
9489function manageCompareButtonLink() {
9490
9491    // Manage button visability
9492    if (comparearray.length > 1) {
9493        // show if 2 or more items are selected for comparison
9494        $('.compare-button').show().find('span').text(comparearray.length);
9495    }
9496    else {
9497        // 1 or less items selected, hide button
9498        $('.compare-button').hide().find('span').text('');
9499    }
9500    // Update Page Link
9501    var comparePageUrlString = '/pages/compare/?p=' + comparearray.toString();
9502    $('#goToCompareButton').attr('href', comparePageUrlString);
9503}
9504
9505/*!
9506 * lazysizes - v5.2.2
9507 * Used to lazy load images effectively
9508 */
9509
9510function flipImagesFaf()
9511{
9512    !function (e) { var t = function (u, D, f) { "use strict"; var k, H; if (function () { var e; var t = { lazyClass: "lazyload", loadedClass: "lazyloaded", loadingClass: "lazyloading", preloadClass: "lazypreload", errorClass: "lazyerror", autosizesClass: "lazyautosizes", fastLoadedClass: "ls-is-cached", iframeLoadMode: 0, srcAttr: "data-src", srcsetAttr: "data-srcset", sizesAttr: "data-sizes", minSize: 40, customMedia: {}, init: true, expFactor: 1.5, hFac: .8, loadMode: 2, loadHidden: true, ricTimeout: 0, throttleDelay: 125 }; H = u.lazySizesConfig || u.lazysizesConfig || {}; for (e in t) { if (!(e in H)) { H[e] = t[e] } } }(), !D || !D.getElementsByClassName) { return { init: function () { }, cfg: H, noSupport: true } } var O = D.documentElement, i = u.HTMLPictureElement, P = "addEventListener", $ = "getAttribute", q = u[P].bind(u), I = u.setTimeout, U = u.requestAnimationFrame || I, o = u.requestIdleCallback, j = /^picture$/i, r = ["load", "error", "lazyincluded", "_lazyloaded"], a = {}, G = Array.prototype.forEach, J = function (e, t) { if (!a[t]) { a[t] = new RegExp("(\\s|^)" + t + "(\\s|$)") } return a[t].test(e[$]("class") || "") && a[t] }, K = function (e, t) { if (!J(e, t)) { e.setAttribute("class", (e[$]("class") || "").trim() + " " + t) } }, Q = function (e, t) { var a; if (a = J(e, t)) { e.setAttribute("class", (e[$]("class") || "").replace(a, " ")) } }, V = function (t, a, e) { var i = e ? P : "removeEventListener"; if (e) { V(t, a) } r.forEach(function (e) { t[i](e, a) }) }, X = function (e, t, a, i, r) { var n = D.createEvent("Event"); if (!a) { a = {} } a.instance = k; n.initEvent(t, !i, !r); n.detail = a; e.dispatchEvent(n); return n }, Y = function (e, t) { var a; if (!i && (a = u.picturefill || H.pf)) { if (t && t.src && !e[$]("srcset")) { e.setAttribute("srcset", t.src) } a({ reevaluate: true, elements: [e] }) } else if (t && t.src) { e.src = t.src } }, Z = function (e, t) { return (getComputedStyle(e, null) || {})[t] }, s = function (e, t, a) { a = a || e.offsetWidth; while (a < H.minSize && t && !e._lazysizesWidth) { a = t.offsetWidth; t = t.parentNode } return a }, ee = function () { var a, i; var t = []; var r = []; var n = t; var s = function () { var e = n; n = t.length ? r : t; a = true; i = false; while (e.length) { e.shift()() } a = false }; var e = function (e, t) { if (a && !t) { e.apply(this, arguments) } else { n.push(e); if (!i) { i = true; (D.hidden ? I : U)(s) } } }; e._lsFlush = s; return e }(), te = function (a, e) { return e ? function () { ee(a) } : function () { var e = this; var t = arguments; ee(function () { a.apply(e, t) }) } }, ae = function (e) { var a; var i = 0; var r = H.throttleDelay; var n = H.ricTimeout; var t = function () { a = false; i = f.now(); e() }; var s = o && n > 49 ? function () { o(t, { timeout: n }); if (n !== H.ricTimeout) { n = H.ricTimeout } } : te(function () { I(t) }, true); return function (e) { var t; if (e = e === true) { n = 33 } if (a) { return } a = true; t = r - (f.now() - i); if (t < 0) { t = 0 } if (e || t < 9) { s() } else { I(s, t) } } }, ie = function (e) { var t, a; var i = 99; var r = function () { t = null; e() }; var n = function () { var e = f.now() - a; if (e < i) { I(n, i - e) } else { (o || r)(r) } }; return function () { a = f.now(); if (!t) { t = I(n, i) } } }, e = function () { var v, m, c, h, e; var y, z, g, p, C, b, A; var n = /^img$/i; var d = /^iframe$/i; var E = "onscroll" in u && !/(gle|ing)bot/.test(navigator.userAgent); var _ = 0; var w = 0; var M = 0; var N = -1; var L = function (e) { M--; if (!e || M < 0 || !e.target) { M = 0 } }; var x = function (e) { if (A == null) { A = Z(D.body, "visibility") == "hidden" } return A || !(Z(e.parentNode, "visibility") == "hidden" && Z(e, "visibility") == "hidden") }; var W = function (e, t) { var a; var i = e; var r = x(e); g -= t; b += t; p -= t; C += t; while (r && (i = i.offsetParent) && i != D.body && i != O) { r = (Z(i, "opacity") || 1) > 0; if (r && Z(i, "overflow") != "visible") { a = i.getBoundingClientRect(); r = C > a.left && p < a.right && b > a.top - 1 && g < a.bottom + 1 } } return r }; var t = function () { var e, t, a, i, r, n, s, o, l, u, f, c; var d = k.elements; if ((h = H.loadMode) && M < 8 && (e = d.length)) { t = 0; N++; for (; t < e; t++) { if (!d[t] || d[t]._lazyRace) { continue } if (!E || k.prematureUnveil && k.prematureUnveil(d[t])) { R(d[t]); continue } if (!(o = d[t][$]("data-expand")) || !(n = o * 1)) { n = w } if (!u) { u = !H.expand || H.expand < 1 ? O.clientHeight > 500 && O.clientWidth > 500 ? 500 : 370 : H.expand; k._defEx = u; f = u * H.expFactor; c = H.hFac; A = null; if (w < f && M < 1 && N > 2 && h > 2 && !D.hidden) { w = f; N = 0 } else if (h > 1 && N > 1 && M < 6) { w = u } else { w = _ } } if (l !== n) { y = innerWidth + n * c;
vendor: 5,332 bytes, lines 9512-9527
9512 z = innerHeight + n; s = n * -1; l = n } a = d[t].getBoundingClientRect(); if ((b = a.bottom) >= s && (g = a.top) <= z && (C = a.right) >= s * c && (p = a.left) <= y && (b || C || p || g) && (H.loadHidden || x(d[t])) && (m && M < 3 && !o && (h < 3 || N < 4) || W(d[t], n))) { R(d[t]); r = true; if (M > 9) { break } } else if (!r && m && !i && M < 4 && N < 4 && h > 2 && (v[0] || H.preloadAfterLoad) && (v[0] || !o && (b || C || p || g || d[t][$](H.sizesAttr) != "auto"))) { i = v[0] || d[t] } } if (i && !r) { R(i) } } }; var a = ae(t); var S = function (e) { var t = e.target; if (t._lazyCache) { delete t._lazyCache; return } L(e); K(t, H.loadedClass); Q(t, H.loadingClass); V(t, B); X(t, "lazyloaded") }; var i = te(S); var B = function (e) { i({ target: e.target }) }; var T = function (e, t) { var a = e.getAttribute("data-load-mode") || H.iframeLoadMode; if (a == 0) { e.contentWindow.location.replace(t) } else if (a == 1) { e.src = t } }; var F = function (e) { var t; var a = e[$](H.srcsetAttr); if (t = H.customMedia[e[$]("data-media") || e[$]("media")]) { e.setAttribute("media", t) } if (a) { e.setAttribute("srcset", a) } }; var s = te(function (t, e, a, i, r) { var n, s, o, l, u, f; if (!(u = X(t, "lazybeforeunveil", e)).defaultPrevented) { if (i) { if (a) { K(t, H.autosizesClass) } else { t.setAttribute("sizes", i) } } s = t[$](H.srcsetAttr); n = t[$](H.srcAttr); if (r) { o = t.parentNode; l = o && j.test(o.nodeName || "") } f = e.firesLoad || "src" in t && (s || n || l); u = { target: t }; K(t, H.loadingClass); if (f) { clearTimeout(c); c = I(L, 2500); V(t, B, true) } if (l) { G.call(o.getElementsByTagName("source"), F) } if (s) { t.setAttribute("srcset", s) } else if (n && !l) { if (d.test(t.nodeName)) { T(t, n) } else { t.src = n } } if (r && (s || l)) { Y(t, { src: n }) } } if (t._lazyRace) { delete t._lazyRace } Q(t, H.lazyClass); ee(function () { var e = t.complete && t.naturalWidth > 1; if (!f || e) { if (e) { K(t, H.fastLoadedClass) } S(u); t._lazyCache = true; I(function () { if ("_lazyCache" in t) { delete t._lazyCache } }, 9) } if (t.loading == "lazy") { M-- } }, true) }); var R = function (e) { if (e._lazyRace) { return } var t; var a = n.test(e.nodeName); var i = a && (e[$](H.sizesAttr) || e[$]("sizes")); var r = i == "auto"; if ((r || !m) && a && (e[$]("src") || e.srcset) && !e.complete && !J(e, H.errorClass) && J(e, H.lazyClass)) { return } t = X(e, "lazyunveilread").detail; if (r) { re.updateElem(e, true, e.offsetWidth) } e._lazyRace = true; M++; s(e, t, r, i, a) }; var r = ie(function () { H.loadMode = 3; a() }); var o = function () { if (H.loadMode == 3) { H.loadMode = 2 } r() }; var l = function () { if (m) { return } if (f.now() - e < 999) { I(l, 999); return } m = true; H.loadMode = 3; a(); q("scroll", o, true) }; return { _: function () { e = f.now(); k.elements = D.getElementsByClassName(H.lazyClass); v = D.getElementsByClassName(H.lazyClass + " " + H.preloadClass); q("scroll", a, true); q("resize", a, true); q("pageshow", function (e) { if (e.persisted) { var t = D.querySelectorAll("." + H.loadingClass); if (t.length && t.forEach) { U(function () { t.forEach(function (e) { if (e.complete) { R(e) } }) }) } } }); if (u.MutationObserver) { new MutationObserver(a).observe(O, { childList: true, subtree: true, attributes: true }) } else { O[P]("DOMNodeInserted", a, true); O[P]("DOMAttrModified", a, true); setInterval(a, 999) } q("hashchange", a, true);["focus", "mouseover", "click", "load", "transitionend", "animationend"].forEach(function (e) { D[P](e, a, true) }); if (/d$|^c/.test(D.readyState)) { l() } else { q("load", l); D[P]("DOMContentLoaded", a); I(l, 2e4) } if (k.elements.length) { t(); ee._lsFlush() } else { a() } }, checkElems: a, unveil: R, _aLSL: o } }(), re = function () { var a; var n = te(function (e, t, a, i) { var r, n, s; e._lazysizesWidth = i; i += "px"; e.setAttribute("sizes", i); if (j.test(t.nodeName || "")) { r = t.getElementsByTagName("source"); for (n = 0, s = r.length; n < s; n++) { r[n].setAttribute("sizes", i) } } if (!a.detail.dataAttr) { Y(e, a.detail) } }); var i = function (e, t, a) { var i; var r = e.parentNode; if (r) { a = s(e, r, a); i = X(e, "lazybeforesizes", { width: a, dataAttr: !!t }); if (!i.defaultPrevented) { a = i.detail.width; if (a && a !== e._lazysizesWidth) { n(e, r, i, a) } } } }; var e = function () { var e; var t = a.length; if (t) { e = 0; for (; e < t; e++) { i(a[e]) } } }; var t = ie(e); return { _: function () { a = D.getElementsByClassName(H.autosizesClass); q("resize", t) }, checkElems: t, updateElem: i } }(), t = function () { if (!t.i && D.getElementsByClassName) { t.i = true; re._(); e._() } }; return I(function () { H.init && t() }), k = { cfg: H, autoSizer: re, loader: e, init: t, uP: Y, aC: K, rC: Q, hC: J, fire: X, gW: s, rAF: ee } }(e, e.document, Date); e.lazySizes = t, "object" == typeof module && module.exports && (module.exports = t) }("undefined" != typeof window ? window : {});
9513}
9514
9515/* Defunct but required for backwards compatibility */
9516function FAF() { }
9517var findandfilterloaded = false;
9518
9519
9520// Deferred objects
9521// ---- Required for the removal of Set Timeouts
9522var defFilterSelected = $.Deferred(),
9523    defLAF = $.Deferred(),
9524    defLAP = $.Deferred(),
9525    defLPF = $.Deferred(),
9526    defFP = $.Deferred(),
9527    defCFNB = $.Deferred();
9528// End - Deferred objects
9529
9530/**
9531 * Prefixes a URL with / if it does not have one. This makes it an absolute path.
9532 * @param urlToAbsolutelyPath the url to modify
9533 */
9534function AbsolutelyPathUrl(urlToAbsolutelyPath) {
9535    return urlToAbsolutelyPath.charAt(0) !== '/'
9536        ? '/' + urlToAbsolutelyPath // Is a relatively pathed Url so prefix with /.
9537        : urlToAbsolutelyPath; // Already an absolutely pathed URL; do nothing.
9538}
9539
9540
9541// Baked-in Knockout error event
9542var ErrorHandlingBindingProvider = function () {
9543    var original = new ko.bindingProvider();
9544
9545    //determine if an element has any bindings
9546    this.nodeHasBindings = original.nodeHasBindings;
9547
9548    //return the bindings given a node and the bindingContext
9549    this.getBindings = function (node, bindingContext) {
9550        var result;
9551        try {
9552            result = original.getBindings(node, bindingContext);
9553        }
9554        catch (e) {
9555            if (console && console.log) {
9556                console.log("Error in binding: " + e.message + "\nNode causing error:", node);
9557            }
9558        }
9559
9560        return result;
9561    };
9562};
9563
9564ko.bindingProvider.instance = new ErrorHandlingBindingProvider();
9565
9566
9567
9568var FacetDefinition = function () {
9569    var self = this;
9570    self.uid = ko.observable(0);
9571    self.Name = ko.observable("");
9572    self.Type = ko.observable(0);
9573    self.TypeName = ko.observable("");
9574    self.ParentFacet = ko.observable();
9575
9576    self.IsAvailable = ko.observable(true);
9577
9578    self.FacetOptions = ko.observableArray();
9579
9580    self.hasVisibleOptions = ko.pureComputed(function () {
9581
9582        for (i = 0; i < self.FacetOptions().length; i++) {
9583            if (self.FacetOptions()[i].IsVisible()) {
9584                return true;
9585            }
9586        }
9587
9588        return false;
9589    }, self);
9590
9591}
9592
9593var Facet = function () {
9594    var self = this;
9595    self.uid = ko.observable(0);
9596    self.Name = ko.observable("");
9597    self.Type = ko.observable(0);
9598    self.ParentID = ko.observable(0);
9599    self.ParentName = ko.observable("");
9600    self.FacetDefinitionID = ko.observable(0);
9601    self.FacetURLFragment = ko.observable("");
9602    self.FacetURLLevel = ko.observable(0);
9603
9604    self.IsAvailable = ko.observable(true);
9605    self.PreSelected = ko.observable(false);
9606    self.IsVisible = ko.observable(false);
9607    self.SubFacetOptions = ko.observableArray();
9608
9609    self.hasVisibleOptions = ko.pureComputed(function () {
9610
9611        for (i = 0; i < self.SubFacetOptions().length; i++) {
9612            if (self.SubFacetOptions()[i].IsVisible()) {
9613                return true;
9614            }
9615
9616            if (self.SubFacetOptions()[i].SubFacetOptions().length > 0) {
9617                for (is = 0; is < self.SubFacetOptions()[i].SubFacetOptions().length; is++) {
9618                    if (self.SubFacetOptions()[i].SubFacetOptions()[is].IsVisible()) {
9619                        return true;
9620                    }
9621                }
9622            }
9623        }
9624
9625        return false;
9626    }, self);
9627
9628    self.isSelected = ko.observable(false);
9629
9630    self.checkIsSelected = function () {
9631
9632        switch (self.Type()) {
9633            case Search.FacetDefinitionsTypes.DEPARTMENT:
9634                return (Search.CurrentDepartment() == self.uid());
9635                break;
9636            case Search.FacetDefinitionsTypes.SUBDEPLVL1:
9637                return (Search.CurrSubDepartmentFacetLvl1().indexOf(self.uid()) >= 0);
9638                break;
9639            case Search.FacetDefinitionsTypes.SUBDEPLVL2:
9640                return (Search.CurrSubDepartmentFacetLvl2().indexOf(self.uid()) >= 0);
9641                break;
9642            case Search.FacetDefinitionsTypes.SUBDEPLVL3:
9643                return (Search.CurrSubDepartmentFacetLvl3().indexOf(self.uid()) >= 0);
9644                break;
9645            case Search.FacetDefinitionsTypes.PRODUCTGROUP:
9646                return (Search.CurrentProductGroup() == self.uid());
9647                break;
9648            case Search.FacetDefinitionsTypes.SUBPRODLVL1:
9649                return (Search.CurrSubProductGroupFacetLvl1().indexOf(self.uid()) >= 0);
9650                break;
9651            case Search.FacetDefinitionsTypes.SUBPRODLVL2:
9652                return (Search.CurrSubProductGroupFacetLvl2().indexOf(self.uid()) >= 0);
9653                break;
9654            case Search.FacetDefinitionsTypes.SUBPRODLVL3:
9655                return (Search.CurrSubProductGroupFacetLvl3().indexOf(self.uid()) >= 0);
9656                break;
9657            case Search.FacetDefinitionsTypes.MATERIAL:
9658                return (Search.CurrMaterials().indexOf(self.uid()) >= 0);
9659                break;
9660            case Search.FacetDefinitionsTypes.ACTIVITY:
9661                return (Search.CurrActivities().indexOf(self.uid()) >= 0);
9662                break;
9663            case Search.FacetDefinitionsTypes.BRAND:
9664                return (Search.CurrBrands().indexOf(self.uid()) >= 0);
9665                break;
9666            case Search.FacetDefinitionsTypes.SEASON:
9667                return (Search.CurrSeasons().indexOf(self.Name()) >= 0);
9668                break;
9669            case Search.FacetDefinitionsTypes.GENDER:
9670                return (Search.CurrGenders().indexOf(self.Name()) >= 0);
9671                break;
9672            case Search.FacetDefinitionsTypes.COLOUR:
9673                return (Search.CurrColours().indexOf(self.Name()) >= 0);
9674                break;
9675            case Search.FacetDefinitionsTypes.AGE:
9676                return (Search.CurrAges().indexOf(self.Name().toLowerCase()) >= 0);
9677                break;
9678        }
9679
9680    };
9681
9682    self.showSubFacets = function () {
9683        if (self.Type() == Search.FacetDefinitionsTypes.DEPARTMENT || self.Type() == Search.FacetDefinitionsTypes.PRODUCTGROUP) {
9684            switch (self.Type()) {
9685                case Search.FacetDefinitionsTypes.DEPARTMENT:
9686                    return (self.uid() == Search.CurrentDepartment() && self.hasVisibleOptions());
9687                    break;
9688                case Search.FacetDefinitionsTypes.PRODUCTGROUP:
9689                    return (self.uid() === Search.CurrentProductGroup() && self.hasVisibleOptions());
9690                    break;
9691            }
9692        } else {
9693            return true;
9694        }
9695
9696    }
9697
9698    self.preSelect = function () {
9699        self.addFacetToArray();
9700        self.PreSelected(true);
9701    }
9702
9703    self.selectFacet = function () {
9704        if (self.PreSelected() != true && (self.IsAvailable() != false || self.checkIsSelected())) {
9705
9706            if (self.SubFacetOptions().length > 0) {
9707                $(".subFacetPanel" + self.Type()).hide();
9708            }
9709            var allowImmunity = false;
9710            allowImmunity = self.addFacetToArray();
9711
9712            if (allowImmunity) {
9713                Search.FacetImmunityID(self.ParentID());
9714                Search.FacetImmunityName(self.ParentName());
9715            } else {
9716                Search.FacetImmunityID(0);
9717                Search.FacetImmunityName("");
9718            }
9719
9720            Search.FilterSelected();
9721            promiseResolution(defFilterSelected, postFilterSelected());
9722            function postFilterSelected(d1) {
9723                if (self.checkIsSelected()) {
9724                    $("#subFacetsCheckBox" + self.FacetURLFragment()).addClass("checked").addClass("facetSelectedff");
9725                }
9726                else {
9727                    $("#subFacetsCheckBox" + self.FacetURLFragment()).removeClass("checked").removeClass("facetSelectedff");
9728                }
9729            }
9730
9731            Search.setSizeTermPanelStatus();
9732
9733        }
9734    }
9735
9736    self.addFacetToArray = function () {
9737        switch (self.Type()) {
9738            case Search.FacetDefinitionsTypes.DEPARTMENT:
9739                //Facet Is "Parent"
9740                if (Search.CurrentDepartment() == self.uid()) {
9741                    Search.CurrentDepartment(0);
9742                } else {
9743                    Search.CurrentDepartment(self.uid());
9744                    $("#subFacetsDiv" + self.uid()).show();
9745                }
9746                Search.resetSubDepartmentFacets();
9747                return false;
9748                break;
9749            case Search.FacetDefinitionsTypes.SUBDEPLVL1:
9750                Search.CurrentDepartment(self.FacetDefinitionID());
9751                if (Search.CurrSubDepartmentFacetLvl1().indexOf(self.uid()) >= 0) {
9752                    Search.CurrSubDepartmentFacetLvl1.remove(self.uid());
9753                    return (Search.CurrSubDepartmentFacetLvl1().length > 0);
9754                } else {
9755                    Search.CurrSubDepartmentFacetLvl1().push(self.uid());
9756                    return true;
9757                }
9758                break;
9759            case Search.FacetDefinitionsTypes.SUBDEPLVL2:
9760                Search.CurrentDepartment(self.FacetDefinitionID());
9761                if (Search.CurrSubDepartmentFacetLvl2().indexOf(self.uid()) >= 0) {
9762                    Search.CurrSubDepartmentFacetLvl2.remove(self.uid());
9763                    return (Search.CurrSubDepartmentFacetLvl2().length > 0);
9764                } else {
9765                    Search.CurrSubDepartmentFacetLvl2().push(self.uid());
9766                    return true;
9767                }
9768                break;
9769            case Search.FacetDefinitionsTypes.SUBDEPLVL3:
9770                Search.CurrentDepartment(self.FacetDefinitionID());
9771                if (Search.CurrSubDepartmentFacetLvl3().indexOf(self.uid()) >= 0) {
9772                    Search.CurrSubDepartmentFacetLvl3.remove(self.uid());
9773                    return (Search.CurrSubDepartmentFacetLvl3().length > 0);
9774                } else {
9775                    Search.CurrSubDepartmentFacetLvl3().push(self.uid());
9776                    return true;
9777                }
9778                break;
9779            case Search.FacetDefinitionsTypes.PRODUCTGROUP:
9780                if (Search.CurrentProductGroup() == self.uid()) {
9781                    Search.CurrentProductGroup(0);
9782                } else {
9783                    Search.CurrentProductGroup(self.uid());
9784                    $("#subFacetsDiv" + self.uid()).show();
9785                }
9786                Search.resetSubProductGroupFacets();
9787                return false;
9788                break;
9789            case Search.FacetDefinitionsTypes.SUBPRODLVL1:
9790                Search.CurrentProductGroup(self.FacetDefinitionID());
9791                if (Search.CurrSubProductGroupFacetLvl1().indexOf(self.uid()) >= 0) {
9792                    Search.CurrSubProductGroupFacetLvl1.remove(self.uid());
9793                    return (Search.CurrSubProductGroupFacetLvl1().length > 0);
9794                } else {
9795                    Search.CurrSubProductGroupFacetLvl1().push(self.uid());
9796                    return true;
9797                }
9798                break;
9799            case Search.FacetDefinitionsTypes.SUBPRODLVL2:
9800                Search.CurrentProductGroup(self.FacetDefinitionID());
9801                if (Search.CurrSubProductGroupFacetLvl2().indexOf(self.uid()) >= 0) {
9802                    Search.CurrSubProductGroupFacetLvl2.remove(self.uid());
9803                    return (Search.CurrSubProductGroupFacetLvl2().length > 0);
9804                } else {
9805                    Search.CurrSubProductGroupFacetLvl2().push(self.uid());
9806                    return true;
9807                }
9808                break;
9809            case Search.FacetDefinitionsTypes.SUBPRODLVL3:
9810                Search.CurrentProductGroup(self.FacetDefinitionID());
9811                if (Search.CurrSubProductGroupFacetLvl3().indexOf(self.uid()) >= 0) {
9812                    Search.CurrSubProductGroupFacetLvl3.remove(self.uid());
9813                    return (Search.CurrSubProductGroupFacetLvl3().length > 0);
9814                } else {
9815                    Search.CurrSubProductGroupFacetLvl3().push(self.uid());
9816                    return true;
9817                }
9818                break;
9819            case Search.FacetDefinitionsTypes.MATERIAL:
9820                if (Search.CurrMaterials().indexOf(self.uid()) >= 0) {
9821                    Search.CurrMaterials.remove(self.uid());
9822                    return (Search.CurrMaterials().length > 0);
9823                } else {
9824                    Search.CurrMaterials().push(self.uid());
9825                    return true;
9826                }
9827                break;
9828            case Search.FacetDefinitionsTypes.ACTIVITY:
9829                if (Search.CurrActivities().indexOf(self.uid()) >= 0) {
9830                    Search.CurrActivities.remove(self.uid());
9831                    return (Search.CurrActivities().length > 0);
9832                } else {
9833                    Search.CurrActivities().push(self.uid());
9834                    return true;
9835                }
9836                break;
9837            case Search.FacetDefinitionsTypes.SEASON:
9838                if (Search.CurrSeasons().indexOf(self.Name()) >= 0) {
9839                    Search.CurrSeasons.remove(self.Name());
9840                    return (Search.CurrSeasons().length > 0);
9841                } else {
9842                    Search.CurrSeasons().push(self.Name());
9843                    return true;
9844                }
9845                break;
9846            case Search.FacetDefinitionsTypes.GENDER:
9847                if (Search.CurrGenders().indexOf(self.Name()) >= 0) {
9848                    Search.CurrGenders.remove(self.Name());
9849                    return (Search.CurrGenders().length > 0);
9850                } else {
9851                    Search.CurrGenders().push(self.Name());
9852                    return true;
9853                }
9854                break;
9855            case Search.FacetDefinitionsTypes.COLOUR:
9856                if (Search.CurrColours().indexOf(self.Name()) >= 0) {
9857                    Search.CurrColours.remove(self.Name());
9858                    return (Search.CurrColours().length > 0);
9859                } else {
9860                    Search.CurrColours().push(self.Name());
9861                    return true;
9862                }
9863                break;
9864            case Search.FacetDefinitionsTypes.AGE:
9865                if (Search.CurrAges().indexOf(self.Name().toLowerCase()) >= 0) {
9866                    Search.CurrAges.remove(self.Name().toLowerCase());
9867                    return (Search.CurrAges().length > 0);
9868                } else {
9869                    Search.CurrAges().push(self.Name().toLowerCase());
9870                    return true;
9871                }
9872                break;
9873            case Search.FacetDefinitionsTypes.BRAND:
9874                if (Search.CurrBrands().indexOf(self.uid()) >= 0) {
9875                    Search.CurrBrands.remove(self.uid());
9876                    return (Search.CurrBrands().length > 0);
9877                } else {
9878                    Search.CurrBrands().push(self.uid());
9879                    return true;
9880                }
9881                break;
9882        }
9883    }
9884
9885
9886}
9887
9888var Product = function () {
9889    var self = this;
9890    self.uid = ko.observable(0);
9891    self.code = ko.observable("");
9892    self.Name = ko.observable("");
9893    self.NamePlural = ko.observable("");
9894    self.DetailLink = ko.observable("");
9895    self.ImageLargePath = ko.observable("");
9896    self.ImageSmallPath = ko.observable("");
9897    self.ImageLargePath2 = ko.observable("");
9898    self.ImageSmallPath2 = ko.observable("");
9899    self.ImageSmallPath3 = ko.observable("");
9900    self.ImageSmallPath4 = ko.observable("");
9901    self.ImageSmallPath5 = ko.observable("");
9902    self.Price = ko.observable(0.00);
9903    self.SalePrice = ko.observable(0.00);
9904    self.ShowNewDay = ko.observable(false);
9905    self.NewDayFinanceAvailable = ko.observable(false);
9906    self.BrandId = ko.observable(0);
9907    self.AssociatedCategories = ko.observableArray();
9908    self.AssociatedSizeTerms = ko.observableArray();
9909    self.Colour = ko.observable("");
9910    self.Gender = ko.observable("");
9911    self.Age = ko.observable("");
9912    self.DateAdded = ko.observable("");
9913    self.OnSale = ko.observable(false);
9914    self.InStock = ko.observable(false);
9915    self.InStockString = ko.observable("");
9916    self.AverageReview = ko.observable(0);
9917    self.IsStarbuy = ko.observable(false);
9918    self.HasCoupons = ko.observable(false);
9919    self.DiscountLevel = ko.observable(0.0);
9920    self.IsInColourGroup = ko.observable(true);
9921    self.FinancePayment = ko.observable("");
9922    self.PriorityItem = ko.observable(false);
9923    self.productCompareID = ko.observable("");
9924
9925    self.pricingCtrlHTML = ko.observable("");
9926
9927    self.Season = ko.observable("");
9928    self.DepartmentFacetID = ko.observable(0);
9929    self.ProductGroupFacetID = ko.observable(0);
9930    self.ActivityFacetID = ko.observable(0);
9931    self.DepartmentBrowseFilterLVL1 = ko.observable(0);
9932    self.DepartmentBrowseFilterLVL2 = ko.observable(0);
9933    self.DepartmentBrowseFilterLVL3 = ko.observable(0);
9934    self.ProductGroupBrowseFilterLVL1 = ko.observable(0);
9935    self.ProductGroupBrowseFilterLVL2 = ko.observable(0);
9936    self.ProductGroupBrowseFilterLVL3 = ko.observable(0);
9937    self.MaterialFacetID = ko.observable(0);
9938
9939    self.OriginalSortPosition = ko.observable(0);
9940
9941    self.ShowOnResults = ko.observable(false);
9942
9943    self.DisplayQuickview = function () {
9944        if (typeof qvdropfaf == "boolean" || typeof qvdropfaf == "string") {
9945            BetterSearchQuickLookDD(self.uid());
9946        } else {
9947            BetterSearchQuickLook(self.uid());
9948        }
9949    }
9950
9951    self.DisplayColorGroupQuickview = function () {
9952
9953    }
9954
9955    self.getCurrPrice = function () {
9956        return self.SalePrice();
9957    }
9958
9959    self.NavigateToDetail = function () {
9960
9961        var initialURL = "/";
9962
9963        var queryStr = "";
9964        if ($("#entryPointURLHidden").val().indexOf('?') > 0) {
9965            var initialQueryStr = $("#entryPointURLHidden").val().split('?')[1];
9966
9967            if (initialQueryStr.indexOf("&") > 0) {
9968                var queryStrSplit = initialQueryStr.split('&');
9969                for (iq = 0; iq < queryStrSplit.length; iq++) {
9970                    if (queryStrSplit[iq].indexOf("facet=") < 0 && queryStrSplit[iq].indexOf("collection=") < 0) {
9971                        if (queryStrSplit[iq].split('=')[1] != "") {
9972                            if (queryStr.indexOf('?') < 0) { queryStr += "?"; }
9973                            queryStr += queryStrSplit[iq];
9974                            if (iq < (queryStrSplit.length - 1)) { queryStr += "&"; }
9975                        }
9976                    } else {
9977                        initialURL += queryStrSplit[iq].split('=')[1];
9978                    }
9979                }
9980            } else {
9981                if (initialQueryStr.indexOf("facet=") < 0 && initialQueryStr.indexOf("collection=") < 0) {
9982                    if (initialQueryStr.split('=')[1] != null) {
9983                        queryStr += "?" + initialQueryStr;
9984                    }
9985                } else {
9986                    initialURL += initialQueryStr.split('=')[1];
9987                }
9988            }
9989        }
9990
9991        if (initialURL == "/") {
9992            initialURL = getFacetResultsUrl();
9993        }
9994
9995        initialURL += queryStr;
9996
9997        Search.writeToHistoryWithStartUrl(true);
9998
9999        window.location.href = self.DetailLink();
10000    }
10001
10002    self.NewTabToDetail = function () {
10003        var win = window.open(self.DetailLink(), '_blank');
10004        win.focus();
10005        return false;
10006    }
10007
10008}
10009
10010var Search = new function () {
10011    var self = this;
10012    self.Products = ko.observableArray().extend({ deferred: true });
10013    self.FacetDefinitions = ko.observableArray();
10014    self.CurrentDepartment = ko.observable(0);
10015    self.CurrentProductGroup = ko.observable(0);
10016    self.CurrSubDepartmentFacetLvl1 = ko.observableArray();
10017    self.CurrSubDepartmentFacetLvl2 = ko.observableArray();
10018    self.CurrSubProductGroupFacetLvl1 = ko.observableArray();
10019    self.CurrSubDepartmentFacetLvl3 = ko.observableArray();
10020    self.CurrSubProductGroupFacetLvl2 = ko.observableArray();
10021    self.CurrSubProductGroupFacetLvl3 = ko.observableArray();
10022    self.CurrBrands = ko.observableArray();
10023    self.CurrActivities = ko.observableArray();
10024    self.CurrMaterials = ko.observableArray();
10025    self.CurrColours = ko.observableArray();
10026    self.CurrGenders = ko.observableArray();
10027    self.CurrSeasons = ko.observableArray();
10028    self.CurrScrollY = window.scrollY || window.pageYOffset || document.documentElement.scrollTop;
10029    self.CurrAges = ko.observableArray();
10030    self.SizeTemplates = ko.observableArray();
10031    self.CurrentSearchTerm = ko.observable("");
10032    self.FilterByPrice = ko.observable(false);
10033    self.FilterByStockOnly = ko.observable(false);
10034    self.FilterBySaleOnly = ko.observable(false);
10035    self.OrderBy = ko.observable(0);
10036    self.SizeFiltersAvailable = ko.observable(false);
10037    self.SizeFilters = ko.observableArray();
10038
10039    self.FacetClicked = ko.observable(false);
10040
10041    self.minPrice = ko.observable(-0.01);
10042    self.maxPrice = ko.observable(-0.01);
10043    self.discountLvl = ko.observable(0.0);
10044
10045    self.FacetImmunityID = ko.observable(0);
10046    self.FacetImmunityName = ko.observable("");
10047
10048    self.HistoryIndex = ko.observable(0);
10049
10050    self.totalVisibleProducts = ko.observable(0);
10051
10052    self.sortOrderPreference = ko.observable('');
10053
10054    self.Clear = function () {
10055        self.CurrentDepartment = ko.observable(0);
10056        self.CurrentProductGroup = ko.observable(0);
10057        self.CurrSubDepartmentFacetLvl1 = ko.observableArray();
10058        self.CurrSubDepartmentFacetLvl2 = ko.observableArray();
10059        self.CurrSubDepartmentFacetLvl3 = ko.observableArray();
10060        self.CurrSubProductGroupFacetLvl1 = ko.observableArray();
10061        self.CurrSubProductGroupFacetLvl2 = ko.observableArray();
10062        self.CurrSubProductGroupFacetLvl3 = ko.observableArray();
10063        self.CurrActivities = ko.observableArray();
10064        self.CurrMaterials = ko.observableArray();
10065        self.CurrColours = ko.observableArray();
10066        self.CurrGenders = ko.observableArray();
10067        self.CurrSeasons = ko.observableArray();
10068        self.CurrAges = ko.observableArray();
10069
10070    }
10071
10072    self.FacetDefinitionsTypes = {
10073        DEPARTMENT: 1,
10074        ACTIVITY: 2,
10075        PRODUCTGROUP: 3,
10076        MATERIAL: 4,
10077        SUBDEPLVL1: 5,
10078        SUBDEPLVL2: 6,
10079        SUBDEPLVL3: 7,
10080        SUBPRODLVL1: 8,
10081        SUBPRODLVL2: 9,
10082        SUBPRODLVL3: 10,
10083        BRAND: 11,
10084        SEASON: 12,
10085        GENDER: 13,
10086        COLOUR: 14,
10087        AGE: 17
10088    }
10089
10090    self.OrderBy = {
10091        ORIGINALORDER: -999,
10092        NAME: 1,
10093        NAMEDESC: 2,
10094        PRICE: 3,
10095        PRICEDESC: 4,
10096        DATEADD: 5,
10097        DATEDESC: 6,
10098        BRAND: 7,
10099        BRANDDESC: 8,
10100        COL: 9,
10101        COLDESC: 10,
10102        DISCOUNT: 11,
10103        DISCOUNTDESC: 12,
10104        INSTOCKDATEADDED: 13,
10105        MANUAL: 14,
10106        DATEADDINSTOCK: 15
10107    }
10108
10109    self.resetSubDepartmentFacets = function () {
10110        self.CurrSubDepartmentFacetLvl1 = ko.observableArray();
10111        self.CurrSubDepartmentFacetLvl2 = ko.observableArray();
10112        self.CurrSubDepartmentFacetLvl3 = ko.observableArray();
10113    }
10114
10115    self.resetSubProductGroupFacets = function () {
10116        self.CurrSubProductGroupFacetLvl1 = ko.observableArray();
10117        self.CurrSubProductGroupFacetLvl2 = ko.observableArray();
10118        self.CurrSubProductGroupFacetLvl3 = ko.observableArray();
10119    }
10120
10121    self.FilterSelected = function () {
10122        self.FilterProducts();
10123        self.writeToHistory();
10124        validateResetBtn();
10125        defFilterSelected.resolve(true);
10126    }
10127
10128    self.writeToHistoryWithStartUrl = function (didNavigateAway) {
10129        var stateObj = self.createHistoryObj();
10130        stateObj.didNavigateAway = didNavigateAway;
10131
10132        var entryPointUrl = $("#entryPointURLHidden").val().toLowerCase();
10133        var newURL = AbsolutelyPathUrl(entryPointUrl.replace(getFacetResultsUrl() + '?facet=', '/').replace(getFacetResultsUrl() + '?collection=', '/'));
10134
10135        history.pushState(stateObj, "PomegranateRefilter", newURL);
10136    }
10137
10138    self.writeToHistory = function () {
10139
10140        var stateObj = self.createHistoryObj();
10141        var newURL = self.buildURL();
10142        if (newURL == "") {
10143            //Set to default/starting url
10144            newURL = "/" + $("#entryPointURLHidden").val();
10145        }
10146
10147        history.pushState(stateObj, "PomegranateRefilter", newURL);
10148    }
10149
10150    self.createHistoryObj = function () {
10151        historyPosition++;
10152        return {
10153            didNavigateAway: false,
10154            currDepartment: self.CurrentDepartment(),
10155            currProductGroup: self.CurrentProductGroup(),
10156            currScrollY: window.scrollY || window.pageYOffset || document.documentElement.scrollTop,
10157            currActivities: ko.toJS(self.CurrActivities),
10158            currMaterials: ko.toJS(self.CurrMaterials),
10159            currColours: ko.toJS(self.CurrColours),
10160            currGenders: ko.toJS(self.CurrGenders),
10161            currSeasons: ko.toJS(self.CurrSeasons),
10162            currAges: ko.toJS(self.CurrAges),
10163            currBrands: ko.toJS(self.CurrBrands),
10164            currSubDepLvl1: ko.toJS(self.CurrSubDepartmentFacetLvl1),
10165            currSubDepLvl2: ko.toJS(self.CurrSubDepartmentFacetLvl2),
10166            currSubDepLvl3: ko.toJS(self.CurrSubDepartmentFacetLvl3),
10167            currSubProdGrpLvl1: ko.toJS(self.CurrSubProductGroupFacetLvl1),
10168            currSubProdGrpLvl2: ko.toJS(self.CurrSubProductGroupFacetLvl2),
10169            currSubProdGrpLvl3: ko.toJS(self.CurrSubProductGroupFacetLvl3),
10170            checkByStock: self.FilterByStockOnly(),
10171            checkBySale: self.FilterBySaleOnly(),
10172            historyPositionState: historyPosition
10173        }
10174    }
10175
10176    self.getAdditionalFacets = function () {
10177
10178        var facetStr = "";
10179        var isFirst = true;
10180
10181        var GetFacetSeparatorForFacetStr = function (bool) {
10182            return (bool ? "" : ",");
10183        };
10184
10185        var UpdateFacetStringForAdditionalFacets = function (self, facetStr, facetArray, facetDefType) {
10186            if (Array.isArray(facetArray) && facetArray.length > 1) {
10187                var i = 0;
10188                for (i = 0; i < facetArray.length - 1; i++) {
10189                    var foundFacet = self.getFacet(facetArray[i], true, false, facetDefType);
10190                    if (foundFacet && self.FacetIsInUrl(foundFacet.Name()) == false) {
10191                        facetStr += GetFacetSeparatorForFacetStr(isFirst) + foundFacet.FacetURLFragment();
10192                        isFirst = false;
10193                    }
10194                }
10195            }
10196            return {
10197                facetStr: facetStr,
10198                isFirst: isFirst
10199            };
10200        };
10201
10202        var UpdateFacetStringForAdditionalPlatformFacets = function (facetStr, facetArray) {
10203            if (Array.isArray(facetArray) && facetArray.length > 1) {
10204                var i = 0;
10205                for (i = 0; i < facetArray.length - 1; i++) {
10206                    if (self.FacetIsInUrl(facetArray[i]) == false) {
10207                        facetStr += GetFacetSeparatorForFacetStr(isFirst) + facetArray[i];
10208                        isFirst = false;
10209                    }
10210                }
10211            }
10212            return {
10213                facetStr: facetStr,
10214                isFirst: isFirst
10215            };
10216        };
10217
10218        var updateForBrand = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrBrands(), self.FacetDefinitionsTypes.BRAND);
10219        facetStr = updateForBrand.facetStr;
10220        isFirst = updateForBrand.isFirst;
10221
10222        var updateForActivity = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrActivities(), self.FacetDefinitionsTypes.ACTIVITY);
10223        facetStr = updateForActivity.facetStr;
10224        isFirst = updateForActivity.isFirst;
10225
10226        var updateForDept1 = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrSubDepartmentFacetLvl1(), self.FacetDefinitionsTypes.DEPARTMENT);
10227        facetStr = updateForDept1.facetStr;
10228        isFirst = updateForDept1.isFirst;
10229
10230        var updateForDept2 = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrSubDepartmentFacetLvl2(), self.FacetDefinitionsTypes.DEPARTMENT);
10231        facetStr = updateForDept2.facetStr;
10232        isFirst = updateForDept2.isFirst;
10233
10234        var updateForDept3 = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrSubDepartmentFacetLvl3(), self.FacetDefinitionsTypes.DEPARTMENT);
10235        facetStr = updateForDept3.facetStr;
10236        isFirst = updateForDept3.isFirst;
10237
10238        var updateForProdGroup1 = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrSubProductGroupFacetLvl1(), self.FacetDefinitionsTypes.PRODUCTGROUP);
10239        facetStr = updateForProdGroup1.facetStr;
10240        isFirst = updateForProdGroup1.isFirst;
10241
10242        var updateForProdGroup2 = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrSubProductGroupFacetLvl2(), self.FacetDefinitionsTypes.PRODUCTGROUP);
10243        facetStr = updateForProdGroup2.facetStr;
10244        isFirst = updateForProdGroup2.isFirst;
10245
10246        var updateForProdGroup3 = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrSubProductGroupFacetLvl3(), self.FacetDefinitionsTypes.PRODUCTGROUP);
10247        facetStr = updateForProdGroup3.facetStr;
10248        isFirst = updateForProdGroup3.isFirst;
10249
10250        var updateForMaterial = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrMaterials(), self.FacetDefinitionsTypes.MATERIAL);
10251        facetStr = updateForMaterial.facetStr;
10252        isFirst = updateForMaterial.isFirst;
10253
10254        var updateForSeason = UpdateFacetStringForAdditionalFacets(self, facetStr, self.CurrSeasons(), self.FacetDefinitionsTypes.SEASON);
10255        facetStr = updateForSeason.facetStr;
10256        isFirst = updateForSeason.isFirst;
10257
10258        var updateForGender = UpdateFacetStringForAdditionalPlatformFacets(facetStr, self.CurrGenders());
10259        facetStr = updateForGender.facetStr;
10260        isFirst = updateForGender.isFirst;
10261
10262        var updateForCurrSeasons = UpdateFacetStringForAdditionalPlatformFacets(facetStr, self.CurrSeasons());
10263        facetStr = updateForCurrSeasons.facetStr;
10264        isFirst = updateForCurrSeasons.isFirst;
10265
10266        var updateForCurrColours = UpdateFacetStringForAdditionalPlatformFacets(facetStr, self.CurrColours());
10267        facetStr = updateForCurrColours.facetStr;
10268        isFirst = updateForCurrColours.isFirst;
10269
10270
10271        if ($("#entryPointURLHidden").val().indexOf('?') > 0) {
10272            var extraFacets = "";
10273            var queryStr = $("#entryPointURLHidden").val().split('?')[1];
10274
10275            if (queryStr.indexOf("&") > 0) {
10276                var queryStrSplit = queryStr.split('&');
10277                var iq = 0;
10278                for (iq = 0; iq < queryStrSplit.length; iq++) {
10279                    if (queryStrSplit[iq].toLowerCase().indexOf("extrafacets=") >= 0) {
10280                        if (queryStrSplit[iq].split('=')[1] != "") {
10281                            extraFacets += queryStrSplit[iq].split('=')[1];
10282                        }
10283                    }
10284                }
10285            }
10286            else {
10287                if (queryStr.toLowerCase().indexOf("extrafacets=") >= 0) {
10288                    if (queryStr.split('=')[1] != "") {
10289                        extraFacets += queryStr.split('=')[1];
10290                    }
10291                }
10292            }
10293
10294            if (extraFacets != "") {
10295                var extraFacetsSplit = extraFacets.split(",");
10296                var efi = 0;
10297                for (efi = 0; efi < extraFacetsSplit.length; efi++) {
10298                    if (facetStr.indexOf(extraFacetsSplit[efi]) < 0) {
10299                        facetStr += GetFacetSeparatorForFacetStr(isFirst) + extraFacetsSplit[efi];
10300                        isFirst = false;
10301                    }
10302                }
10303            }
10304
10305        }
10306
10307        return facetStr;
10308
10309    }
10310
10311    self.buildURL = function () {
10312        var urlStr = "";
10313        var currFacet = null;
10314
10315        if ($("#isCollectionHidden").val() != "True") {
10316            if (self.CurrActivities().length > 0) {
10317                urlStr += GetNextAvailableURLFragment(self.CurrActivities, self.FacetDefinitionsTypes.ACTIVITY, false);
10318            }
10319
10320            if (self.CurrentDepartment() != 0) {
10321                urlStr += "/" + self.getFacet(self.CurrentDepartment(), true, false, self.FacetDefinitionsTypes.DEPARTMENT).FacetURLFragment();
10322            }
10323
10324            if (self.CurrBrands().length > 0) {
10325                urlStr += GetNextAvailableURLFragment(self.CurrBrands, self.FacetDefinitionsTypes.BRAND, false);
10326            }
10327
10328            if (self.CurrentProductGroup() != 0) {
10329                urlStr += "/" + self.getFacet(self.CurrentProductGroup(), true, false, self.FacetDefinitionsTypes.PRODUCTGROUP).FacetURLFragment();
10330            }
10331
10332            if (self.CurrSubDepartmentFacetLvl1().length >= 0) {
10333                urlStr += GetNextAvailableURLFragment(self.CurrSubDepartmentFacetLvl1, self.FacetDefinitionsTypes.DEPARTMENT, false);
10334            }
10335
10336            if (self.CurrSubDepartmentFacetLvl2().length >= 0) {
10337                urlStr += GetNextAvailableURLFragment(self.CurrSubDepartmentFacetLvl2, self.FacetDefinitionsTypes.DEPARTMENT, false);
10338            }
10339
10340            if (self.CurrSubDepartmentFacetLvl3().length >= 0) {
10341                urlStr += GetNextAvailableURLFragment(self.CurrSubDepartmentFacetLvl3, self.FacetDefinitionsTypes.DEPARTMENT, false);
10342            }
10343
10344            if (self.CurrSubProductGroupFacetLvl1().length >= 0) {
10345                urlStr += GetNextAvailableURLFragment(self.CurrSubProductGroupFacetLvl1, self.FacetDefinitionsTypes.PRODUCTGROUP, false);
10346            }
10347
10348            if (self.CurrSubProductGroupFacetLvl2().length >= 0) {
10349                urlStr += GetNextAvailableURLFragment(self.CurrSubProductGroupFacetLvl2, self.FacetDefinitionsTypes.PRODUCTGROUP, false);
10350            }
10351
10352            if (self.CurrSubProductGroupFacetLvl3().length >= 0) {
10353                urlStr += GetNextAvailableURLFragment(self.CurrSubProductGroupFacetLvl3, self.FacetDefinitionsTypes.PRODUCTGROUP, false);
10354            }
10355
10356            if (self.CurrMaterials().length > 0) {
10357                urlStr += GetNextAvailableURLFragment(self.CurrMaterials, self.FacetDefinitionsTypes.MATERIAL, false);
10358            }
10359
10360            if (self.CurrSeasons().length > 0) {
10361                urlStr += GetNextAvailableURLFragment(self.CurrSeasons, self.FacetDefinitionsTypes.SEASON, true);
10362            }
10363
10364            if (self.CurrGenders().length > 0) {
10365                const facetForGender = self.getFacetByTypeAndName(self.CurrGenders(), self.FacetDefinitionsTypes.GENDER);
10366
10367                urlStr += facetForGender ? `/${facetForGender.FacetURLFragment()}` : '';
10368            }
10369
10370            if (self.CurrColours().length > 0) {
10371                urlStr += GetNextAvailableURLFragment(self.CurrColours, self.FacetDefinitionsTypes.COLOUR, true);
10372            }
10373
10374
10375
10376            if (self.FilterByStockOnly()) {
10377                urlStr += `/${GetTranslation('JavaScriptTranslations', 'FindAndFilterUrlInStock')}`;
10378            }
10379
10380            if (self.FilterBySaleOnly()) {
10381                urlStr += `/${GetTranslation('JavaScriptTranslations', 'FindAndFilterUrlOnSale')}`;
10382            }
10383
10384            if (self.CurrAges().length > 0) {
10385                for (ia = self.CurrAges().length - 1; ia >= 0; ia--) {
10386                    var check = self.CurrAges()[ia].charAt(0).toUpperCase() + self.CurrAges()[ia].slice(1);
10387                    currFacet = self.getFacetViaStr(check);
10388                    if (currFacet.IsAvailable()) {
10389                        urlStr += "/" + currFacet.FacetURLFragment()
10390                        break;
10391                    }
10392                }
10393            }
10394
10395            var { queryStr, queryStrSplit } = setNonFindAndFilterQueryStrings();
10396        }
10397        else {
10398
10399            var { queryStr, queryStrSplit } = setNonFindAndFilterQueryStrings();
10400
10401        }
10402        return urlStr;
10403
10404        function setNonFindAndFilterQueryStrings(queryCheck) {
10405
10406            if (queryCheck && $("#entryPointURLHidden").val().indexOf(queryCheck)) {
10407                urlStr = "/" + $("#entryPointURLHidden").val().split(queryCheck)[1];
10408            }
10409
10410            if ($("#entryPointURLHidden").val().indexOf('?') > 0) {
10411
10412                var queryStr = $("#entryPointURLHidden").val().split('?')[1];
10413
10414                if (queryStr.indexOf("&") > 0) {
10415                    var queryStrSplit = queryStr.split('&');
10416                    for (iq = 0; iq < queryStrSplit.length; iq++) {
10417                        if (queryStrSplit[iq].indexOf("facet=") < 0 && queryStrSplit[iq].indexOf("collection=") < 0) {
10418                            if (queryStrSplit[iq].split('=')[1] != "") {
10419                                if (urlStr.indexOf('?') < 0) {
10420                                    urlStr += "?";
10421                                }
10422                                urlStr += queryStrSplit[iq];
10423                                if (iq != (queryStrSplit.length - 1)) {
10424                                    urlStr += "&";
10425                                }
10426                            }
10427                        }
10428                    }
10429                }
10430            }
10431            return { queryStr, queryStrSplit };
10432        }
10433
10434        function GetNextAvailableURLFragment(currFacetArray, FacetDef, searchViaStr) {
10435            var currFacet = null;
10436            for (ir = currFacetArray().length - 1; ir >= 0; ir--) {
10437                if (searchViaStr) {
10438                    currFacet = self.getFacetViaStr(currFacetArray()[ir]);
10439                } else {
10440                    currFacet = self.getFacet(currFacetArray()[ir], true, false, FacetDef);
10441                }
10442
10443                if (currFacet != null) {
10444                    if (currFacet.IsAvailable()) {
10445                        try {
10446                            return "/" + currFacet.FacetURLFragment();
10447                        } catch (ex) {
10448                            return "";
10449                        }
10450                        break;
10451                    }
10452                }
10453            }
10454            return "";
10455        }
10456
10457    }
10458
10459    self.BuildURLArray = function (fullUrl) {
10460        var url = fullUrl.split('?')[0].split('/');
10461        return url.filter(function (e) {
10462            return e !== '';
10463        });
10464    }
10465
10466    self.FacetIsInUrl = function (facetName) {
10467        facetName = facetName.replace(/\s+/g, '-');
10468        var arr = self.BuildURLArray(self.buildURL())
10469        return arr.indexOf(facetName.toLowerCase()) > -1;
10470    }
10471
10472    self.setSizeTermPanelStatus = function () {
10473        if (self.SizeFiltersAvailable()) {
10474            preloadSizeTerms();
10475        }
10476    }
10477
10478    self.validateForSizeTerms = function () {
10479        return true;
10480        if (self.CurrActivities().length > 1) {
10481            return false;
10482        }
10483
10484        if (self.CurrBrands().length > 1) {
10485            return false;
10486        }
10487
10488        if (self.CurrSubDepartmentFacetLvl1().length > 1) {
10489            return false;
10490        }
10491
10492        if (self.CurrSubDepartmentFacetLvl2().length > 1) {
10493            return false;
10494        }
10495
10496        if (self.CurrSubDepartmentFacetLvl3().length > 1) {
10497            return false;
10498        }
10499
10500        if (self.CurrSubProductGroupFacetLvl1().length > 1) {
10501            return false;
10502        }
10503
10504        if (self.CurrSubProductGroupFacetLvl2().length > 1) {
10505            return false;
10506        }
10507
10508        if (self.CurrSubProductGroupFacetLvl3().length > 1) {
10509            return false;
10510        }
10511
10512        if (self.CurrMaterials().length > 1) {
10513            return false;
10514        }
10515
10516        if (self.CurrSeasons().length > 1) {
10517            return false;
10518        }
10519
10520        if (self.CurrGenders().length > 1) {
10521            return false;
10522        }
10523
10524        if (self.CurrColours().length > 1) {
10525            return false;
10526        }
10527
10528        if (self.CurrAges().length > 1) {
10529            return false;
10530        }
10531
10532        return true;
10533    }
10534
10535    //Used once item repeater has fully loaded
10536    self.initSearch = function () {
10537
10538        var isLandingPage = $("#UseLandingPageHidden").length > 0 && ($("#UseLandingPageHidden").val().toLowerCase() == "true");
10539
10540        if (isLandingPage == false) {
10541            bindHandlerSite();
10542            self.loadAllFacets();
10543            self.loadAllProducts();
10544
10545            promiseResolution([defLAF, defLAP], postloadALLFunc);
10546            function postloadALLFunc(d1) {
10547                self.loadPriceFilters();
10548                promiseResolution(defLPF, postloadALLFuncA2);
10549                function postloadALLFuncA2(d1) {
10550                    self.FilterProducts();
10551
10552                    var previousState = history.state,
10553                        hasPreviousState = previousState && previousState.hasOwnProperty('currDepartment'),
10554                        initState = hasPreviousState
10555                            ? previousState
10556                            : Search.createHistoryObj();
10557
10558                    if (hasPreviousState) {
10559                        ApplyFiltersFromState(initState);
10560                    }
10561
10562                    function scrollWhenReady(targetY, attempts) {
10563                    
10564                        if (document.documentElement.scrollHeight - window.innerHeight >= targetY || attempts <= 0) {
10565                            window.scrollTo({ top: targetY, behavior: "smooth" });
10566                        } 
10567                        else {
10568                            setTimeout(function () {
10569                                requestAnimationFrame(
10570                                    function () {
10571                                        scrollWhenReady(targetY, attempts - 1); 
10572                                    });
10573                                }, 50);
10574                        }
10575                    }
10576
10577                    scrollWhenReady(initState.currScrollY,5);
10578 
10579                    checkForNavigateBack(history.state);
10580                    history.replaceState(initState, "initFacetSearch", Search.buildURL());
10581                }
10582            }
10583
10584            promiseResolution([defLPF, defFP, defCFNB], postloadALLFuncB);
10585            function postloadALLFuncB(d1) {
10586                preloadSizeTerms();
10587                if (self.totalVisibleProducts() > 0) {
10588                    $("#noResultsPanel").hide();
10589                }
10590                else {
10591                    $("#noResultsPanel").show();
10592                }
10593                initSearchCompleted = true;
10594
10595                setTimeout(function () {
10596                    self.SetInitialProductOrder();
10597                }, 250);
10598
10599                findandfilterloaded = true;
10600            }
10601
10602        } else {
10603            setTimeout(function () {
10604                $(".FAFLanding").show().removeAttr('style');
10605                $("#FafKnockoutResults").hide();
10606                $("#LoadingPanel").hide();
10607                flipImagesFaf();
10608                initSearchCompleted = true;
10609                findandfilterloaded = true;
10610            }, 250);
10611        }
10612        $("#repPanel").hide();
10613    }
10614
10615    self.loadPriceFilters = function () {
10616        if ((typeof csolschemeobject !== 'undefined')) {
10617            $("#priceFilterUpper").val(csolschemeobject.csol_schemelimit);
10618        } else {
10619            if ($("#entryMinPrice").val() != "" && $("#entryMinPrice").val() != null) {
10620                $("#priceFilterLower").val($("#entryMinPrice").val());
10621                self.minPrice(parseFloat($("#entryMinPrice").val()));
10622                self.FilterByPrice(true);
10623            }
10624
10625            if ($("#entryMaxPrice").val() != "" && $("#entryMaxPrice").val() != null) {
10626                $("#priceFilterUpper").val($("#entryMaxPrice").val());
10627                self.maxPrice(parseFloat($("#entryMaxPrice").val()));
10628                self.FilterByPrice(true);
10629            }
10630
10631            if (self.FilterByPrice()) {
10632                if ($("#priceFilterLower").val() == "") {
10633                    $("#priceFilterLower").val(self.minPrice());
10634                }
10635
10636                if ($("#priceFilterUpper").val() == "") {
10637                    $("#priceFilterUpper").val(self.maxPrice());
10638                }
10639            }
10640        }
10641
10642        defLPF.resolve(true);
10643    }
10644
10645    //Used to obtain facet from specified definition
10646    self.getFacet = function (facetUID, GetByType, includeDef, TypeID) {
10647        for (i = 0; i < self.FacetDefinitions().length; i++) {
10648            if (GetByType == false || self.FacetDefinitions()[i].Type() == TypeID) {
10649                if (includeDef) {
10650                    if (self.FacetDefinitions()[i].uid() == facetUID) {
10651                        return self.FacetDefinitions()[i];
10652                    }
10653                }
10654
10655                for (is = 0; is < self.FacetDefinitions()[i].FacetOptions().length; is++) {
10656                    if (self.FacetDefinitions()[i].FacetOptions()[is].uid() == facetUID) {
10657                        return self.FacetDefinitions()[i].FacetOptions()[is];
10658                    }
10659
10660                    if (self.FacetDefinitions()[i].FacetOptions()[is].SubFacetOptions().length > 0) {
10661                        for (it = 0; it < self.FacetDefinitions()[i].FacetOptions()[is].SubFacetOptions().length; it++) {
10662                            for (ifor = 0; ifor < self.FacetDefinitions()[i].FacetOptions()[is].SubFacetOptions()[it].SubFacetOptions().length; ifor++) {
10663                                if (self.FacetDefinitions()[i].FacetOptions()[is].SubFacetOptions()[it].SubFacetOptions()[ifor].uid() == facetUID) {
10664                                    return self.FacetDefinitions()[i].FacetOptions()[is].SubFacetOptions()[it].SubFacetOptions()[ifor];
10665                                }
10666                            }
10667                        }
10668                    }
10669
10670                }
10671            }
10672        }
10673
10674        return null;
10675    }
10676
10677    self.getFacetByTypeAndName = function (facetNames, TypeID) {
10678        return self.FacetDefinitions()
10679            .find(def => def.Type() == TypeID)
10680            ?.FacetOptions()
10681            ?.filter(opt => facetNames.includes(opt.Name()))[0]
10682            ?? null;
10683    }
10684
10685    //For use with facets not of Department,Product Group, Material and Activity. Intended for URL rewriting
10686    self.getFacetViaStr = function (facetName) {
10687        for (i = 0; i < self.FacetDefinitions().length; i++) {
10688            if (self.FacetDefinitions()[i].Name() == facetName) {
10689                return self.FacetDefinitions()[i];
10690            }
10691
10692            for (is = 0; is < self.FacetDefinitions()[i].FacetOptions().length; is++) {
10693                if (self.FacetDefinitions()[i].FacetOptions()[is].Name() == facetName) {
10694                    return self.FacetDefinitions()[i].FacetOptions()[is];
10695                }
10696            }
10697        }
10698    }
10699
10700    self.loadAllFacets = function () {
10701
10702        var selectedFacets = [];
10703
10704        rawfacets.pop();
10705        for (var i = 0; i < (rawfacets.length); i++) {
10706            if (rawfacets[i]["type"] != "undefined") {
10707
10708                var parent = null;
10709
10710                if (parseInt(rawfacets[i]["facetfilterdefinitionid"]) != 0 && parseInt(rawfacets[i]["parentfacet"]) != 0) {
10711                    var facetType = parseInt(rawfacets[i]["type"]);
10712                    switch (parseInt(rawfacets[i]["type"])) {
10713                        case self.FacetDefinitionsTypes.SUBPRODLVL1:
10714                        case self.FacetDefinitionsTypes.SUBPRODLVL2:
10715                        case self.FacetDefinitionsTypes.SUBPRODLVL3:
10716                            facetType = self.FacetDefinitionsTypes.PRODUCTGROUP;
10717                            break;
10718                        case self.FacetDefinitionsTypes.SUBDEPLVL1:
10719                        case self.FacetDefinitionsTypes.SUBDEPLVL2:
10720                        case self.FacetDefinitionsTypes.SUBDEPLVL3:
10721                            facetType = self.FacetDefinitionsTypes.DEPARTMENT;
10722                            break;
10723                    }
10724                    parent = self.getFacet(parseInt(rawfacets[i]["parentfacet"]), true, true, facetType);
10725                }
10726
10727                if (parent == null) {
10728
10729                    var defInsert = new FacetDefinition();
10730
10731                    defInsert.uid(parseInt(rawfacets[i]["facetfilterdefinitionid"]));
10732                    defInsert.Name(rawfacets[i]["name"]);
10733                    defInsert.Type(parseInt(rawfacets[i]["type"]));
10734                    defInsert.TypeName(rawfacets[i]["typename"]);
10735                    defInsert.ParentFacet(parseInt(rawfacets[i]["parentfacet"]));
10736
10737                    rawfacets[i]["facets"].pop();
10738                    for (var j = 0; j < (rawfacets[i]["facets"].length); j++) {
10739                        if (rawfacets[i]["facets"][j]["facettype"] != "undefined") {
10740                            var facetInsert = new Facet();
10741                            if (rawfacets[i]["facets"][j]["manufacturerid"] == "0") {
10742                                facetInsert.uid(parseInt(rawfacets[i]["facets"][j]["facetid"]));
10743                            } else {
10744                                facetInsert.uid(parseInt(rawfacets[i]["facets"][j]["manufacturerid"]));
10745                            }
10746                            facetInsert.Name(rawfacets[i]["facets"][j]["name"]);
10747                            facetInsert.Type(parseInt(rawfacets[i]["facets"][j]["facettype"]));
10748                            facetInsert.FacetURLFragment(rawfacets[i]["facets"][j]["facet_url_fragment"]);
10749                            facetInsert.FacetURLLevel(parseInt(rawfacets[i]["facets"][j]["facet_url_level"]));
10750                            facetInsert.ParentID(defInsert.uid());
10751                            facetInsert.ParentName(defInsert.Name());
10752                            if (rawfacets[i]["facets"][j]["facet_selected"].toLowerCase() == "true" && !selectedFacets.some(e => e.Name() == rawfacets[i]["facets"][j]["name"])) {
10753                                selectedFacets.push(facetInsert);
10754                            }
10755                            defInsert.FacetOptions.push(facetInsert);
10756                        }
10757                    }
10758
10759                    self.FacetDefinitions.push(defInsert);
10760                } else {
10761                    var defInsert = new Facet();
10762                    defInsert.uid(parseInt(rawfacets[i]["facetfilterdefinitionid"]));
10763                    defInsert.Name(rawfacets[i]["name"]);
10764                    defInsert.Type(parseInt(rawfacets[i]["type"]));
10765                    defInsert.ParentID(parseInt(rawfacets[i]["facetfilterdefinitionid"]));
10766                    defInsert.FacetDefinitionID(parseInt(rawfacets[i]["facetfilterdefinitionid"]));
10767
10768                    rawfacets[i]["facets"].pop();
10769                    for (var j = 0; j < (rawfacets[i]["facets"].length); j++) {
10770                        if (rawfacets[i]["facets"][j]["facettype"] != "undefined") {
10771                            var facetInsert = new Facet();
10772                            facetInsert.uid(parseInt(rawfacets[i]["facets"][j]["facetid"]));
10773                            facetInsert.Name(rawfacets[i]["facets"][j]["name"]);
10774                            facetInsert.Type(parseInt(rawfacets[i]["facets"][j]["facettype"]));
10775                            facetInsert.FacetURLFragment(rawfacets[i]["facets"][j]["facet_url_fragment"]);
10776                            facetInsert.FacetURLLevel(parseInt(rawfacets[i]["facets"][j]["facet_url_level"]));
10777                            facetInsert.ParentID(defInsert.uid());
10778                            facetInsert.ParentName(defInsert.Name());
10779                            facetInsert.FacetDefinitionID(parent.uid());
10780                            if (rawfacets[i]["facets"][j]["facet_selected"].toLowerCase() == "true" && !selectedFacets.some(e => e.Name() == rawfacets[i]["facets"][j]["name"])) {
10781                                selectedFacets.push(facetInsert);
10782                            }
10783                            defInsert.SubFacetOptions.push(facetInsert);
10784                        }
10785                    }
10786                    parent.SubFacetOptions.push(defInsert);
10787                }
10788
10789            }
10790        }
10791
10792        if ($("#entryPointURLHidden").val().indexOf(GetTranslation('JavaScriptTranslations', 'FindAndFilterUrlOnSale')) > 0) {
10793            self.FilterBySaleOnly(true);
10794            $("#FFSale").attr("checked", "true");
10795            $("#FFSale").attr("disabled", true);
10796        }
10797
10798        if ($("#entryPointURLHidden").val().indexOf(GetTranslation('JavaScriptTranslations', 'FindAndFilterUrlInStock')) > 0) {
10799            self.FilterByStockOnly(true);
10800            $("#FFStock").attr("checked", "true");
10801            $("#FFStock").attr("disabled", true);
10802        }
10803
10804
10805        if (selectedFacets.length > 0) {
10806            for (i = 0; i < selectedFacets.length; i++) {
10807                selectedFacets[i].preSelect();
10808            }
10809            self.FilterProducts();
10810        }
10811
10812        defLAF.resolve(true);
10813
10814    }
10815
10816    self.loadAllProducts = function () {
10817        var availableFacets = [];
10818        var availableBrands = [];
10819        var products = [];
10820
10821        var minimumDiscountPercToShowSash = (typeof ecommerceConfig.MinDiscountSaleThreshold == "number" ? ecommerceConfig.MinDiscountSaleThreshold : 0);
10822
10823        if (typeof rawproducts != 'undefined' && Array.isArray(rawproducts)) {
10824            for (var i = 0; i < (rawproducts.length - 1); i++) {
10825                if (rawproducts[i]["uid"] != "undefined") {
10826                    var insert = new Product();
10827                    var discountLevelParsed = parseFloatFromString(rawproducts[i]["discountlevel"]);
10828
10829                    insert.OriginalSortPosition(i);
10830                    insert.ShowOnResults(true);
10831                    insert.uid(parseInt(rawproducts[i]["uid"]));
10832                    insert.code(rawproducts[i]["code"]);
10833                    insert.Name(rawproducts[i]["name"]);
10834                    insert.DetailLink(rawproducts[i]["navigationurl"]);
10835                    insert.BrandId(parseInt(rawproducts[i]["brandid"]));
10836                    insert.NamePlural(rawproducts[i]["nameplural"]);
10837                    insert.Price(rawproducts[i]["price"].ToNonLocaleFloat(ecommerceConfig.Locale));
10838                    insert.ShowNewDay(rawproducts[i]["showNewDay"] == "True" || rawproducts[i]["showNewDay"] == "1" ? true : false);
10839                    insert.NewDayFinanceAvailable(rawproducts[i]["newDayFinanceAvailable"] == "True" || rawproducts[i]["newDayFinanceAvailable"] == "1" ? true : false);
10840                    insert.SalePrice(rawproducts[i]["saleprice"].ToNonLocaleFloat(ecommerceConfig.Locale));
10841                    insert.Gender(rawproducts[i]["gender"].toLowerCase());
10842                    insert.Colour(rawproducts[i]["colour"]);
10843                    insert.DateAdded(Date(rawproducts[i]["dateadded"]));
10844                    insert.InStock(rawproducts[i]["instock"] == "True" ? true : false);
10845                    insert.InStockString(rawproducts[i]["instockstring"]);
10846                    insert.Age(rawproducts[i]["age"].toLowerCase());
10847                    insert.OnSale((rawproducts[i]["isonsale"] == "True" || rawproducts[i]["isonsale"] == "1") && (discountLevelParsed >= minimumDiscountPercToShowSash) ? true : false);
10848                    insert.ImageLargePath("/" + rawproducts[i]["imagelargepath"]);
10849                    insert.ImageLargePath2(rawproducts[i]["imagelargepath2"]);
10850                    insert.AverageReview(parseInt(rawproducts[i]["reviewaverage"]));
10851                    insert.IsStarbuy(rawproducts[i]["starbuy"] == "True" ? true : false);
10852                    insert.HasCoupons(rawproducts[i]["coupons"] == "True" ? true : false);
10853
10854                    var prht = "<div class='col-1 pricing' itemprop='offers' itemscope itemtype='http://schema.org/Offer'>";
10855                    prht += "<span id='lblNow' title='Price'><span title='Price' class='nowPrice-betterSearch'>" + ecommerceConfig.LocalCurrencySymbol + rawproducts[i]["saleprice"] + "</span></span>";
10856                    if (discountLevelParsed >= minimumDiscountPercToShowSash) {
10857                        prht += "<span id='lblwas' title='Price'><span id='lblPrice' title='Price' class='standardPrice-betterSearch'>" + ecommerceConfig.LocalCurrencySymbol + rawproducts[i]["price"] + "</span></span>";
10858                        prht += '&nbsp;<span class="percentOff-betterSearch">' + ReplacePlaceholders(GetTranslation('JavaScriptTranslations', 'FacetSearchSaveX0Percentage'), rawproducts[i]["discountlevel"]) + '</span><span class="facetIsOnSale"><span></span></span>';
10859                    }
10860                    prht += "</div>";
10861
10862                    insert.pricingCtrlHTML(prht);
10863                    insert.DiscountLevel(parseFloat(rawproducts[i]["discountlevel"]));
10864                    insert.IsInColourGroup(rawproducts[i]["colourgroup"] == "True" ? true : false);
10865                    insert.FinancePayment(rawproducts[i]["financepayment"]);
10866                    insert.Season(rawproducts[i]["season"]);
10867                    insert.DepartmentFacetID(parseInt(rawproducts[i]["departmentfacetid"]));
10868                    insert.ProductGroupFacetID(parseInt(rawproducts[i]["productgroupfacetid"]));
10869                    insert.ActivityFacetID(parseInt(rawproducts[i]["activityfacetid"]));
10870                    insert.MaterialFacetID(parseInt(rawproducts[i]["materialfacetid"]));
10871                    insert.DepartmentBrowseFilterLVL1(parseInt(rawproducts[i]["departbrowsefilterlvl1"]));
10872                    insert.DepartmentBrowseFilterLVL2(parseInt(rawproducts[i]["departbrowsefilterlvl2"]));
10873                    insert.DepartmentBrowseFilterLVL3(parseInt(rawproducts[i]["departbrowsefilterlvl3"]));
10874                    insert.ProductGroupBrowseFilterLVL1(parseInt(rawproducts[i]["productgroupbrowsefilterlvl1"]));
10875                    insert.ProductGroupBrowseFilterLVL2(parseInt(rawproducts[i]["productgroupbrowsefilterlvl2"]));
10876                    insert.ProductGroupBrowseFilterLVL3(parseInt(rawproducts[i]["productgroupbrowsefilterlvl3"]));
10877                    insert.PriorityItem(rawproducts[i]["priorityitem"] == "True" ? true : false);
10878                    insert.productCompareID('product-' + rawproducts[i]["uid"] + '-compare');
10879                    insert.AssociatedSizeTerms(rawproducts[i]["sizetermids"]);
10880
10881                    var currPrice = (insert.OnSale() ? insert.SalePrice() : insert.Price());
10882
10883                    if (Search.minPrice() == -0.01) {
10884                        Search.minPrice(currPrice);
10885                    } else {
10886                        if (currPrice < Search.minPrice()) {
10887                            Search.minPrice(currPrice);
10888                        }
10889                    }
10890
10891                    if (Search.maxPrice() == -0.01) {
10892                        Search.maxPrice(currPrice);
10893                    } else {
10894                        if (currPrice > Search.maxPrice()) {
10895                            Search.maxPrice(currPrice);
10896                        }
10897                    }
10898
10899                    products.push(insert);
10900
10901                    if (availableFacets.indexOf(insert.DepartmentFacetID()) < 0) { availableFacets.push(insert.DepartmentFacetID()); }
10902                    if (availableFacets.indexOf(insert.ProductGroupFacetID()) < 0) { availableFacets.push(insert.ProductGroupFacetID()) }
10903                    if (availableFacets.indexOf(insert.ActivityFacetID()) < 0) { availableFacets.push(insert.ActivityFacetID()) }
10904                    if (availableFacets.indexOf(insert.MaterialFacetID()) < 0) { availableFacets.push(insert.MaterialFacetID()) }
10905                    if (availableFacets.indexOf(insert.DepartmentBrowseFilterLVL1()) < 0) { availableFacets.push(insert.DepartmentBrowseFilterLVL1()) }
10906                    if (availableFacets.indexOf(insert.DepartmentBrowseFilterLVL2()) < 0) { availableFacets.push(insert.DepartmentBrowseFilterLVL2()) }
10907                    if (availableFacets.indexOf(insert.DepartmentBrowseFilterLVL3()) < 0) { availableFacets.push(insert.DepartmentBrowseFilterLVL3()) }
10908                    if (availableFacets.indexOf(insert.ProductGroupBrowseFilterLVL1()) < 0) { availableFacets.push(insert.ProductGroupBrowseFilterLVL1()) }
10909                    if (availableFacets.indexOf(insert.ProductGroupBrowseFilterLVL2()) < 0) { availableFacets.push(insert.ProductGroupBrowseFilterLVL2()) }
10910                    if (availableFacets.indexOf(insert.ProductGroupBrowseFilterLVL3()) < 0) { availableFacets.push(insert.ProductGroupBrowseFilterLVL3()) }
10911                    if (availableFacets.indexOf(insert.Colour()) < 0) { availableFacets.push(insert.Colour()) }
10912                    if (availableFacets.indexOf(insert.Season()) < 0) { availableFacets.push(insert.Season()) }
10913                    if (availableFacets.indexOf(insert.Age()) < 0) { availableFacets.push(insert.Age()) }
10914                    if (availableFacets.indexOf(insert.Gender()) < 0) { availableFacets.push(insert.Gender()) }
10915                    if (availableBrands.indexOf(insert.BrandId()) < 0) { availableBrands.push(insert.BrandId()); }
10916                }
10917            }
10918        }
10919
10920        self.Products = ko.observableArray(products);
10921
10922        Search.setFacetStatus(availableFacets, availableBrands, self.FacetUpdateTypes.VISIBILE);
10923
10924        Search.setSizeFilterStatus(self.Products());
10925
10926        defLAP.resolve(true);
10927    }
10928
10929    const FindAndFilterSortLocalStorageKey = `FAFReorderProducts_${btoa(window.location.href.replace(/[^\w\d]/gm, ''))}`;
10930
10931    self.SetInitialProductOrder = function () {
10932        var savedOrder = localStorage.getItem(FindAndFilterSortLocalStorageKey);
10933        if (savedOrder) {
10934            self.ReorderProducts(savedOrder);
10935        }
10936    }
10937
10938    self.DeleteSortOrderPreference = function () {
10939        self.ReorderProducts(self.OrderBy.ORIGINALORDER);
10940    }
10941
10942    self.ReorderProducts = function (val) {
10943        if (val == self.OrderBy.ORIGINALORDER) {
10944            self.sortOrderPreference = ko.observable('');
10945            localStorage.removeItem(FindAndFilterSortLocalStorageKey);
10946        }
10947        else {
10948            self.sortOrderPreference = ko.observable(val);
10949            localStorage.setItem(FindAndFilterSortLocalStorageKey, val);
10950        }
10951
10952        switch (Number(val)) {
10953            case self.OrderBy.NAME:
10954                self.SortProductsByNameAsc();
10955                break;
10956
10957            case self.OrderBy.NAMEDESC:
10958                self.SortProductsByNameDesc();
10959                break;
10960
10961            case self.OrderBy.PRICE:
10962                self.SortProductsByPriceAsc();
10963                break;
10964
10965            case self.OrderBy.PRICEDESC:
10966                self.SortProductsByPriceDesc();
10967                break;
10968
10969            case self.OrderBy.DATEADD:
10970                self.SortProductsByDateAsc();
10971                break;
10972
10973            case self.OrderBy.DATEDESC:
10974                self.SortProductsByDateDesc();
10975                break;
10976
10977            case self.OrderBy.DISCOUNTDESC:
10978                self.SortProductsByDiscountDesc();
10979                break;
10980
10981            case self.OrderBy.DATEADDINSTOCK:
10982                self.SortProductsByDateAddedInStock();
10983                break;
10984
10985            case self.OrderBy.ORIGINALORDER:
10986                self.SortProductsByOriginalSortOrder();
10987            default:
10988            /* Do Nothing - We do not support the sort order request (yet? ...) */
10989        }
10990
10991        $('.reorder, .sortedbymessage').attr('data-orderpreference', val);
10992    }
10993
10994    self.SortProductsByOriginalSortOrder = function () {
10995        self.Products.sort(function (left, right) {
10996            return parseInt(left.OriginalSortPosition()) == parseInt(right.OriginalSortPosition()) ? 0 : (parseInt(left.OriginalSortPosition()) < parseInt(right.OriginalSortPosition()) ? -1 : 1)
10997        });
10998    }
10999
11000    self.SortProductsByNameAsc = function () {
11001        self.Products.sort(function (left, right) {
11002            return left.Name() == right.Name() ? 0 : (left.Name() < right.Name() ? -1 : 1)
11003        });
11004    }
11005
11006    self.SortProductsByNameDesc = function () {
11007        self.Products.sort(function (left, right) {
11008            return left.Name() == right.Name() ? 0 : (left.Name() > right.Name() ? -1 : 1)
11009        });
11010    }
11011
11012    self.SortProductsByPriceAsc = function () {
11013        self.Products.sort(function (left, right) {
11014            return parseFloat(left.getCurrPrice()) == parseFloat(right.getCurrPrice()) ? 0 : (parseFloat(left.getCurrPrice()) < parseFloat(right.getCurrPrice()) ? -1 : 1)
11015        });
11016    }
11017
11018    self.SortProductsByPriceDesc = function () {
11019        self.Products.sort(function (left, right) {
11020            return parseFloat(left.getCurrPrice()) == parseFloat(right.getCurrPrice()) ? 0 : (parseFloat(left.getCurrPrice()) > parseFloat(right.getCurrPrice()) ? -1 : 1)
11021        });
11022    }
11023
11024    self.SortProductsByDateAsc = function () {
11025        self.Products.sort(function (left, right) {
11026            return Date.parse(left.DateAdded()) == Date.parse(right.DateAdded()) ? 0 : (Date.parse(left.DateAdded()) < Date.parse(right.DateAdded()) ? -1 : 1)
11027        });
11028    }
11029
11030    self.SortProductsByDateDesc = function () {
11031        self.Products.sort(function (left, right) {
11032            return Date.parse(left.DateAdded()) == Date.parse(right.DateAdded()) ? 0 : (Date.parse(left.DateAdded()) > Date.parse(right.DateAdded()) ? -1 : 1)
11033        });
11034    }
11035
11036    self.SortProductsByDiscountDesc = function () {
11037        self.Products.sort(function (left, right) {
11038            return parseFloat(left.DiscountLevel()) == parseFloat(right.DiscountLevel()) ? 0 : (parseFloat(left.DiscountLevel()) > parseFloat(right.DiscountLevel()) ? -1 : 1)
11039        });
11040    }
11041
11042    self.SortProductsByDateAddedInStock = function () {
11043        self.Products.sort(function (left, right) {
11044            return Date.parse(left.DateAdded()) == Date.parse(right.DateAdded()) ? (left.InStock() == false) ? 1 : -1 : (Date.parse(left.DateAdded()) < Date.parse(right.DateAdded()) ? -1 : 1)
11045        });
11046    }
11047
11048    self.FilterProducts = function () {
11049        self.totalVisibleProducts(0);
11050        var terms = []
11051        var availableFacets = [];
11052        var availableBrands = [];
11053
11054        var lower = 0;
11055        var upper = 0;
11056
11057        if (self.FilterByPrice()) {
11058
11059            if ($("#priceFilterLower").val() == "") {
11060                $("#priceFilterLower").val("0.00");
11061            }
11062
11063            if ($("#priceFilterUpper").val() == "") {
11064                $("#priceFilterUpper").val("0.00");
11065            }
11066
11067            lower = parseFloat($("#priceFilterLower").val());
11068            upper = parseFloat($("#priceFilterUpper").val());
11069
11070            if (upper < lower) {
11071                var temp = lower;
11072                lower = upper;
11073                upper = temp;
11074
11075                $("#priceFilterLower").val(lower);
11076                $("#priceFilterUpper").val(upper);
11077
11078            }
11079
11080        }
11081        for (i = 0; i < self.Products().length; i++) {
11082
11083            var currItem = self.Products()[i];
11084            var ShowOnResults = true;
11085
11086
11087
11088            if (((currItem.Name().toLowerCase().indexOf(self.CurrentSearchTerm().toLowerCase())) < 0) && ((currItem.NamePlural().toLowerCase().indexOf(self.CurrentSearchTerm().toLowerCase())) < 0)) {
11089                ShowOnResults = false;
11090            }
11091
11092            if (self.CurrBrands().length > 0) {
11093                if (self.CurrBrands().indexOf(currItem.BrandId()) < 0) {
11094                    ShowOnResults = false;
11095                }
11096            }
11097
11098            if (self.CurrentDepartment() != 0) {
11099                if (self.CurrentDepartment() != currItem.DepartmentFacetID()) {
11100                    ShowOnResults = false;
11101                }
11102            }
11103
11104            if (self.CurrSubDepartmentFacetLvl1().length > 0) {
11105                if (self.CurrSubDepartmentFacetLvl1().indexOf(currItem.DepartmentBrowseFilterLVL1()) < 0) {
11106                    ShowOnResults = false;
11107                }
11108            }
11109
11110            if (self.CurrSubDepartmentFacetLvl2().length > 0) {
11111                if (self.CurrSubDepartmentFacetLvl2().indexOf(currItem.DepartmentBrowseFilterLVL2()) < 0) {
11112                    ShowOnResults = false;
11113                }
11114            }
11115
11116            if (self.CurrSubDepartmentFacetLvl3().length > 0) {
11117                if (self.CurrSubDepartmentFacetLvl3().indexOf(currItem.DepartmentBrowseFilterLVL3()) < 0) {
11118                    ShowOnResults = false;
11119                }
11120            }
11121
11122            if (self.CurrentProductGroup() != 0) {
11123                if (self.CurrentProductGroup() != currItem.ProductGroupFacetID()) {
11124                    ShowOnResults = false;
11125                }
11126            }
11127
11128            if (self.CurrSubProductGroupFacetLvl1().length > 0) {
11129                if (self.CurrSubProductGroupFacetLvl1().indexOf(currItem.ProductGroupBrowseFilterLVL1()) < 0) {
11130                    ShowOnResults = false;
11131                }
11132            }
11133
11134            if (self.CurrSubProductGroupFacetLvl2().length > 0) {
11135                if (self.CurrSubProductGroupFacetLvl2().indexOf(currItem.ProductGroupBrowseFilterLVL2()) < 0) {
11136                    ShowOnResults = false;
11137                }
11138            }
11139
11140            if (self.CurrSubProductGroupFacetLvl3().length > 0) {
11141                if (self.CurrSubProductGroupFacetLvl3().indexOf(currItem.ProductGroupBrowseFilterLVL3()) < 0) {
11142                    ShowOnResults = false;
11143                }
11144            }
11145
11146            if (self.CurrActivities().indexOf(currItem.ActivityFacetID()) < 0) {
11147            }
11148
11149            if (self.CurrActivities().length > 0) {
11150                if (self.CurrActivities().indexOf(currItem.ActivityFacetID()) < 0) {
11151                    ShowOnResults = false;
11152                }
11153            }
11154
11155            if (self.CurrMaterials().length > 0) {
11156                if (self.CurrMaterials().indexOf(currItem.MaterialFacetID()) < 0) {
11157                    ShowOnResults = false;
11158                }
11159            }
11160
11161            if (self.CurrSeasons().length > 0) {
11162                if (self.CurrSeasons().indexOf(currItem.Season()) < 0) {
11163                    ShowOnResults = false;
11164                }
11165            }
11166
11167            if (self.CurrColours().length > 0) {
11168                if (self.CurrColours().indexOf(currItem.Colour()) < 0) {
11169                    ShowOnResults = false;
11170                }
11171            }
11172
11173            if (self.CurrGenders().length > 0) {
11174                if (self.CurrGenders().indexOf(currItem.Gender()) < 0) {
11175                    ShowOnResults = false;
11176                }
11177            }
11178
11179            if (self.CurrAges().length > 0) {
11180                if (self.CurrAges().indexOf(currItem.Age().toLowerCase()) < 0) {
11181                    ShowOnResults = false;
11182                }
11183            }
11184
11185            if (self.FilterByPrice()) {
11186                if (isNaN(lower)) {
11187                    lower = parseFloat(($("#entryMinPrice").val() != "" ? $("#entryMinPrice").val() : Search.minPrice()));
11188                }
11189                if (isNaN(upper)) {
11190                    upper = parseFloat(($("#entryMaxPrice").val() != "" ? $("#entryMaxPrice").val() : Search.maxPrice()));
11191                }
11192
11193                /* Gets whichever price is lowest between the price and sale price.
11194                 * We don't care if the item is marked as "onsale" or not. */
11195                var priceToCheck = Math.min(currItem.SalePrice(), currItem.Price());
11196
11197                if (!(priceToCheck >= lower && priceToCheck <= upper)) {
11198                    ShowOnResults = false;
11199                }
11200            }
11201
11202
11203            if (self.FilterByStockOnly()) {
11204                if (currItem.InStock() != true) {
11205                    ShowOnResults = false;
11206                }
11207            }
11208
11209            if (self.FilterBySaleOnly()) {
11210                if (currItem.OnSale() != true) {
11211                    ShowOnResults = false;
11212                }
11213            }
11214
11215            if (self.discountLvl() > 0) {
11216                if (currItem.DiscountLevel() < self.discountLvl()) {
11217                    ShowOnResults = false
11218                }
11219            }
11220
11221            currItem.ShowOnResults(ShowOnResults);
11222
11223            if (currItem.ShowOnResults() == true) {
11224                self.totalVisibleProducts(self.totalVisibleProducts() + 1);
11225                if (availableFacets.indexOf(currItem.DepartmentFacetID()) < 0) { availableFacets.push(currItem.DepartmentFacetID()); }
11226                if (availableFacets.indexOf(currItem.ProductGroupFacetID()) < 0) { availableFacets.push(currItem.ProductGroupFacetID()) }
11227                if (availableFacets.indexOf(currItem.ActivityFacetID()) < 0) { availableFacets.push(currItem.ActivityFacetID()) }
11228                if (availableFacets.indexOf(currItem.MaterialFacetID()) < 0) { availableFacets.push(currItem.MaterialFacetID()) }
11229                if (availableFacets.indexOf(currItem.DepartmentBrowseFilterLVL1()) < 0) { availableFacets.push(currItem.DepartmentBrowseFilterLVL1()) }
11230                if (availableFacets.indexOf(currItem.DepartmentBrowseFilterLVL2()) < 0) { availableFacets.push(currItem.DepartmentBrowseFilterLVL2()) }
11231                if (availableFacets.indexOf(currItem.DepartmentBrowseFilterLVL3()) < 0) { availableFacets.push(currItem.DepartmentBrowseFilterLVL3()) }
11232                if (availableFacets.indexOf(currItem.ProductGroupBrowseFilterLVL1()) < 0) { availableFacets.push(currItem.ProductGroupBrowseFilterLVL1()) }
11233                if (availableFacets.indexOf(currItem.ProductGroupBrowseFilterLVL2()) < 0) { availableFacets.push(currItem.ProductGroupBrowseFilterLVL2()) }
11234                if (availableFacets.indexOf(currItem.ProductGroupBrowseFilterLVL3()) < 0) { availableFacets.push(currItem.ProductGroupBrowseFilterLVL3()) }
11235                if (availableFacets.indexOf(currItem.Colour()) < 0) { availableFacets.push(currItem.Colour()) }
11236                if (availableFacets.indexOf(currItem.Season()) < 0) { availableFacets.push(currItem.Season()) }
11237                if (availableFacets.indexOf(currItem.Age()) < 0) { availableFacets.push(currItem.Age()) }
11238                if (availableFacets.indexOf(currItem.Gender()) < 0) { availableFacets.push(currItem.Gender()) }
11239
11240                if (availableBrands.indexOf(currItem.BrandId()) < 0) { availableBrands.push(currItem.BrandId()) }
11241
11242        
11242    }
11243
11244        }
11245
11246
11247        Search.setFacetStatus(availableFacets, availableBrands, self.FacetUpdateTypes.AVAILABLE);
11248
11249        Search.setSizeFilterStatus(self.Products());
11250
11251        Search.FacetImmunityID(0);
11252        Search.FacetImmunityName("");
11253
11254        Totalorder = self.totalVisibleProducts();
11255        setTimeout(function () {
11256            $(".Count").animate({
11257                Counter: Totalorder
11258            }, {
11259                duration: 500,
11260                easing: 'swing',
11261                step: function (numberOfResults) {
11262                    var resultsMessage = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', 'SearchModelsJS-ProductsFilteredX0Number'), Math.ceil(numberOfResults))
11263                    $(".Count").text(resultsMessage);
11264                }
11265            });
11266        }, 10);
11267        if (self.totalVisibleProducts() > 0) {
11268            $("#noResultsPanel").hide();
11269        } else {
11270            $("#noResultsPanel").show();
11271        }
11272
11273        defFP.resolve(true);
11274
11275    }
11276
11277    self.FacetUpdateTypes = {
11278        VISIBILE: 1,
11279        AVAILABLE: 2
11280    }
11281
11282    self.setSizeFilterStatus = function (products) {
11283        const sizeFiltersInProductResults = products
11284            .filter(e =>
11285                e.ShowOnResults()).map(e =>
11286                    e.AssociatedSizeTerms())
11287            .flat();
11288
11289        const sizeGroupingElements = document.querySelectorAll('#sizeTermKnockout .sizeFilterGrouping');
11290
11291        for (const sizeGroupingEl of sizeGroupingElements) {
11292            let numberOfVisibleOptionsInGrouping = 0;
11293
11294            const sizeElements = sizeGroupingEl.querySelectorAll('#sizeTermKnockout [name="subFacetsCheckBox"]');
11295
11296            for (const sizeEl of sizeElements) {
11297                const countEl = sizeEl.querySelector('.selectCount');
11298
11299                const sizeElFilterUid = parseFloatFromString(sizeEl.attributes?.value?.value || '0');
11300
11301                const numberOfOccurancesOfSizeFilter = sizeFiltersInProductResults
11302                    .filter(e => e === sizeElFilterUid).length;
11303
11304                sizeEl.parentElement.style.display =
11305                    numberOfOccurancesOfSizeFilter > 0
11306                        ? 'block'
11307                        : 'none';
11308
11309                if (countEl && numberOfOccurancesOfSizeFilter > 0) {
11310                    countEl.innerHTML = `(${numberOfOccurancesOfSizeFilter})`;
11311
11312                    numberOfVisibleOptionsInGrouping++;
11313                }
11314            }
11315
11316            sizeGroupingEl.style.display =
11317                numberOfVisibleOptionsInGrouping > 0
11318                    ? 'block'
11319                    : 'none';
11320        }
11321    };
11322
11323    self.setFacetStatus = function (facetArray, brandArray, updateType) {
11324
11325        for (io = 0; io < Search.FacetDefinitions().length; io++) {
11326            if (applyFacetUpdateCheck(Search.FacetDefinitions()[io]) || updateType == Search.FacetUpdateTypes.VISIBILE) {
11327
11328                for (is = 0; is < Search.FacetDefinitions()[io].FacetOptions().length; is++) {
11329                    facetAvailabilityRecurse(facetArray, brandArray, Search.FacetDefinitions()[io].FacetOptions()[is], updateType);
11330                }
11331
11332            }
11333        }
11334    }
11335
11336    function applyFacetUpdateCheck(currFacet, updateType) {
11337
11338        if (currFacet.Type() == Search.FacetDefinitionsTypes.DEPARTMENT || currFacet.Type() == Search.FacetDefinitionsTypes.PRODUCTGROUP) {
11339            return true;
11340        }
11341        if (currFacet.uid() == Search.FacetImmunityID() && Search.FacetImmunityID() != 0) {
11342            return false;
11343        } else if (currFacet.Name() == Search.FacetImmunityName() && Search.FacetImmunityName() != "") {
11344            return false;
11345        }
11346        return true;
11347    }
11348
11349    function facetAvailabilityRecurse(facetArray, brandArray, currFacet, updateType) {
11350        var ir = 0;
11351        currFacet.isSelected(currFacet.checkIsSelected());
11352
11353        if (currFacet.checkIsSelected()) {
11354            $("#subFacetsCheckBox" + currFacet.FacetURLFragment()).addClass("checked");
11355        }
11356        else {
11357            $("#subFacetsCheckBox" + currFacet.FacetURLFragment()).removeClass("checked");
11358        }
11359
11360        if (currFacet.uid() != 0) {
11361            if (updateType == Search.FacetUpdateTypes.VISIBILE) {
11362                if (currFacet.Type() != Search.FacetDefinitionsTypes.BRAND) {
11363                    currFacet.IsVisible(facetArray.indexOf(currFacet.uid()) >= 0);
11364                } else {
11365                    currFacet.IsVisible(brandArray.indexOf(currFacet.uid()) >= 0);
11366                }
11367
11368            } else {
11369                if (currFacet.IsVisible()) {
11370                    if (currFacet.Type() != Search.FacetDefinitionsTypes.BRAND) {
11371                        currFacet.IsAvailable(facetArray.indexOf(currFacet.uid()) >= 0);
11372                    } else {
11373                        currFacet.IsAvailable(brandArray.indexOf(currFacet.uid()) >= 0);
11374                    }
11375                }
11376            }
11377        } else {
11378            if (updateType == Search.FacetUpdateTypes.VISIBILE) {
11379                currFacet.IsVisible(facetArray.indexOf(currFacet.Type() == Search.FacetDefinitionsTypes.AGE ? currFacet.Name().toLowerCase() : currFacet.Name()) >= 0);
11380            } else {
11381                currFacet.IsAvailable(facetArray.indexOf(currFacet.Type() == Search.FacetDefinitionsTypes.AGE ? currFacet.Name().toLowerCase() : currFacet.Name()) >= 0);
11382
11383            }
11384        }
11385
11386        for (ir = 0; ir < currFacet.SubFacetOptions().length; ir++) {
11387            if (applyFacetUpdateCheck(currFacet.SubFacetOptions()[ir]) || updateType == Search.FacetUpdateTypes.VISIBILE) {
11388                facetAvailabilityRecurse(facetArray, brandArray, currFacet.SubFacetOptions()[ir], updateType);
11389            }
11390        }
11391
11392    }
11393}

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.