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&>(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> / <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 = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'", "/": "/", "`": "`", "=": "=" }; 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> ${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&height=400&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 2993 <div class="col-1 css-image-414 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=800&height=800&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 2994 <div class="col-1 css-image-767 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1000&height=1000&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 2995 <div class="col-1 css-image-1024 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1000&height=1000&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 2996 <div class="col-1 css-image-1440 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1400&height=1400&quality=85&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 2997 <div class="col-1 css-image-1800 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1800&height=1800&quality=85&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 2998 <div class="col-1 css-image-4k bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1998&height=1998&quality=85&mode=pad&format=webp&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&height=572&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3039 <div class="col-1 css-image-414 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1408&height=1408&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3040 <div class="col-1 css-image-767 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1408&height=1408&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3041 <div class="col-1 css-image-1024 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1408&height=1408&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3042 <div class="col-1 css-image-1440 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1094&height=1094&quality=85&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3043 <div class="col-1 css-image-1800 bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1465&height=1465&quality=85&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3044 <div class="col-1 css-image-4k bgContain imgCtr" style="background: url('${itemInOffer.Image}?width=1998&height=1998&quality=85&mode=pad&format=webp&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 = '✕'; 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&height=400&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3515 <div class="col-1 css-image-414 bgContain imgCtr" style="background: url('/${imageUrl}?width=800&height=800&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3516 <div class="col-1 css-image-767 bgContain imgCtr" style="background: url('/${imageUrl}?width=1000&height=1000&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3517 <div class="col-1 css-image-1024 bgContain imgCtr" style="background: url('/${imageUrl}?width=1000&height=1000&quality=60&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3518 <div class="col-1 css-image-1440 bgContain imgCtr" style="background: url('/${imageUrl}?width=1400&height=1400&quality=85&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3519 <div class="col-1 css-image-1800 bgContain imgCtr" style="background: url('/${imageUrl}?width=1800&height=1800&quality=85&mode=pad&format=webp&bgcolor=ffffff') no-repeat center center;"></div> 3520 <div class="col-1 css-image-4k bgContain imgCtr" style="background: url('/${imageUrl}?width=1998&height=1998&quality=85&mode=pad&format=webp&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">£' + 3915 formatPrice(item.SalePrice) + '</span>' + 3916 '<span class="cmd-palette-result-price-original">£' + 3917 formatPrice(item.Price) + '</span>'; 3918 } 3919 return '<span class="cmd-palette-result-price">£' + 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">● In Stock</div>'; 3925 } 3926 return '<div class="cmd-palette-result-stock cmd-palette-result-stock-out">○ 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> 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> 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 += ' <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.