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} 8066function contactFormPriceMatch() 8067{ 8068 var priceMatchPathName = window.location.pathname; 8069 var priceMatchCurrentProduct = $('h1').text(); 8070 var pricematchLink = "/pricematch.aspx?RD=" + priceMatchPathName + "&ProductName=" + priceMatchCurrentProduct 8071 $(".priceMatchLink a").attr("href", pricematchLink); 8072 if ($("#ContactForms_panPriceRequest").length) 8073 { 8074 var get = []; 8075 location.search.replace('?', '').split('&').forEach(function (val) 8076 { 8077 split = val.split("=", 2); 8078 get[split[0]] = split[1]; 8079 }); 8080 var priceMatchName = get["ProductName"] 8081 if (priceMatchName == undefined) { } else 8082 { 8083 var replaced = priceMatchName.replace(/%20/g, " "); 8084 $("input#txtProductNamePM").val(replaced); 8085 } 8086 } 8087 var newAcc1 = "false"; 8088 var newAcc2 = "false"; 8089 var newAcc3 = "false"; 8090 var newAcc4 = "false"; 8091 var txtCAFirstName = $("#txtName"); 8092 var txtCAFirstNameInfo = $("#txtNameInfo"); 8093 txtCAFirstName.blur(validateFirstName); 8094 txtCAFirstName.keyup(validateFirstName); 8095 function validateFirstName() 8096 { 8097 if (txtCAFirstName.val().length < 1) 8098 { 8099 txtCAFirstName.removeClass("completeForm").addClass("errorForm"); 8100 txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-ForenameInvalid')); 8101 txtCAFirstNameInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8102 newAcc1 = "false"; 8103 valbtnbtnContinue(); 8104 } 8105 else 8106 { 8107 txtCAFirstName.removeClass("errorForm").addClass("completeForm"); 8108 txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormName')); 8109 txtCAFirstNameInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8110 newAcc1 = "true"; 8111 valbtnbtnContinue(); 8112 } 8113 } 8114 var txtCAEMail = $("#txtEmail"); 8115 var txtCAEMailInfo = $("#txtEmailInfo"); 8116 txtCAEMail.blur(validateEmailCA); 8117 txtCAEMail.keyup(validateEmailCA); 8118 function validateEmailCA() 8119 { 8120 var emailAddress = $("#txtEmail").val(); 8121 $.when(validateEmail(emailAddress)) 8122 .done(function (isValidEmail) 8123 { 8124 if (isValidEmail) 8125 { 8126 txtCAEMail.removeClass("errorForm").addClass("completeForm"); 8127 txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailValid')); 8128 txtCAEMailInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8129 newAcc2 = "true"; 8130 valbtnbtnContinue(); 8131 } 8132 else 8133 { 8134 txtCAEMail.removeClass("completeForm").addClass("errorForm"); 8135 txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailInvalid')); 8136 txtCAEMailInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8137 newAcc2 = "false"; 8138 valbtnbtnContinue(); 8139 } 8140 }); 8141 } 8142 var txtCompetWebsite = $("#txtCompetWebsite"); 8143 var txtCompetWebsiteInfo = $("#txtCompetWebsiteInfo"); 8144 txtCompetWebsite.blur(validatetxtCompetWebsite); 8145 txtCompetWebsite.keyup(validatetxtCompetWebsite); 8146 function validatetxtCompetWebsite() 8147 { 8148 if (txtCompetWebsite.val().length < 1) 8149 { 8150 txtCompetWebsite.removeClass("completeForm").addClass("errorForm"); 8151 txtCompetWebsiteInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-UrlInvalid')); 8152 txtCompetWebsiteInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8153 newAcc3 = "false"; 8154 valbtnbtnContinue(); 8155 } 8156 else 8157 { 8158 txtCompetWebsite.removeClass("errorForm").addClass("completeForm"); 8159 txtCompetWebsiteInfo.html(GetTranslation('JavaScriptTranslations', 'ContactFormUrl'));
8160 txtCompetWebsiteInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8161 newAcc3 = "true"; 8162 valbtnbtnContinue(); 8163 } 8164 } 8165 var txtPrice = $("#txtPrice"); 8166 var txtPriceInfo = $("#txtPriceInfo"); 8167 txtPrice.blur(validatetxtPrice); 8168 txtPrice.keyup(validatetxtPrice); 8169 function validatetxtPrice() 8170 { 8171 if (txtPrice.val().length < 1) 8172 { 8173 txtPrice.removeClass("completeForm").addClass("errorForm"); 8174 txtPriceInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-PriceInvalid')); 8175 txtPriceInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8176 newAcc4 = "false"; 8177 valbtnbtnContinue(); 8178 } 8179 else 8180 { 8181 txtPrice.removeClass("errorForm").addClass("completeForm"); 8182 txtPriceInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormPrice')); 8183 txtPriceInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8184 newAcc4 = "true"; 8185 valbtnbtnContinue(); 8186 } 8187 } 8188 function valbtnbtnContinue() 8189 { 8190 if (newAcc1 == 'true' && newAcc2 == 'true' && newAcc3 == 'true' && newAcc4 == 'true') 8191 { 8192 $("#butSend").removeAttr('disabled'); 8193 $("#butSend").removeClass("button grey").addClass("button green"); 8194 $("#butSend").html(GetTranslation('JavaScriptTranslations', '00Misc-Send')); 8195 } else 8196 { 8197 $("#butSend").attr('disabled', true); 8198 $("#butSend").removeClass("button green").addClass("button grey"); 8199 $("#butSend").html(GetTranslation('JavaScriptTranslations', 'ContactFormSubmit')); 8200 } 8201 } 8202 valbtnbtnContinue(); 8203} 8204 8205function contactFormStandard() 8206{ 8207 var newAcc1 = "false"; 8208 var newAcc2 = "false"; 8209 var newAcc3 = "false"; 8210 var txtCAFirstName = $("#txtName"); 8211 var txtCAFirstNameInfo = $("#txtNameInfo"); 8212 txtCAFirstName.blur(validateFirstName); 8213 txtCAFirstName.keyup(validateFirstName); 8214 function validateFirstName() 8215 { 8216 if (txtCAFirstName.val().length < 1) 8217 { 8218 txtCAFirstName.removeClass("completeForm").addClass("errorForm"); 8219 txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-ForenameInvalid')); 8220 txtCAFirstNameInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8221 newAcc1 = "false"; 8222 valbtnbtnContinue(); 8223 } 8224 else 8225 { 8226 txtCAFirstName.removeClass("errorForm").addClass("completeForm"); 8227 txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormName')); 8228 txtCAFirstNameInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8229 newAcc1 = "true"; 8230 valbtnbtnContinue(); 8231 } 8232 } 8233 var txtCAEMail = $("#txtEmail"); 8234 var txtCAEMailInfo = $("#txtEmailInfo"); 8235 txtCAEMail.blur(validateEmailCA); 8236 txtCAEMail.keyup(validateEmailCA); 8237 function validateEmailCA() 8238 { 8239 var emailAddress = $("#txtEmail").val(); 8240 $.when(validateEmail(emailAddress)) 8241 .done(function (isValidEmail) 8242 { 8243 if (isValidEmail) 8244 { 8245 txtCAEMail.removeClass("errorForm").addClass("completeForm"); 8246 txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailValid')); 8247 txtCAEMailInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8248 newAcc2 = "true"; 8249 valbtnbtnContinue(); 8250 } 8251 else 8252 { 8253 txtCAEMail.removeClass("completeForm").addClass("errorForm"); 8254 txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailInvalid')); 8255 txtCAEMailInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8256 newAcc2 = "false"; 8257 valbtnbtnContinue(); 8258 } 8259 }); 8260 } 8261 var txttxtMessage = $("#txtMessage"); 8262 var txttxtMessageInfo = $("#txtMessageInfo"); 8263 txttxtMessage.blur(validatetxtMessage); 8264 txttxtMessage.keyup(validatetxtMessage); 8265 function validatetxtMessage() 8266 { 8267 if (txttxtMessage.val().length < 1) 8268 { 8269 txttxtMessage.removeClass("completeForm").addClass("errorForm"); 8270 txttxtMessageInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-MessageInvalid')); 8271 txttxtMessageInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8272 newAcc3 = "false"; 8273 valbtnbtnContinue(); 8274 } 8275 else 8276 { 8277 txttxtMessage.removeClass("errorForm").addClass("completeForm"); 8278 txttxtMessageInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormMessage')); 8279 txttxtMessageInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8280 newAcc3 = "true"; 8281 valbtnbtnContinue(); 8282 } 8283 } 8284 function valbtnbtnContinue() 8285 { 8286 if (newAcc1 == 'true' && newAcc2 == 'true' && newAcc3 == 'true') 8287 { 8288 $("#butSend").removeAttr('disabled'); 8289 $("#butSend").removeClass("button grey").addClass("button green"); 8290 $("#butSend").html(GetTranslation('JavaScriptTranslations', '00Misc-Send')); 8291 } else 8292 { 8293 $("#butSend").attr('disabled', true); 8294 $("#butSend").removeClass("button green").addClass("button grey"); 8295 $("#butSend").html(GetTranslation('JavaScriptTranslations', 'ContactFormSubmit')); 8296 } 8297 } 8298 valbtnbtnContinue(); 8299} 8300 8301function contactFormSpecialOrder() 8302{ 8303 var newAcc1 = "false"; 8304 var newAcc2 = "false"; 8305 var newAcc3 = "false"; 8306 var txtCAFirstName = $("#txtName"); 8307 var txtCAFirstNameInfo = $("#txtNameInfo"); 8308 txtCAFirstName.blur(validateFirstName); 8309 txtCAFirstName.keyup(validateFirstName); 8310 function validateFirstName() 8311 { 8312 if (txtCAFirstName.val().length < 1) 8313 { 8314 txtCAFirstName.removeClass("completeForm").addClass("errorForm"); 8315 txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-ForenameInvalid')); 8316 txtCAFirstNameInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8317 newAcc1 = "false"; 8318 valbtnbtnContinue(); 8319 } 8320 else 8321 { 8322 txtCAFirstName.removeClass("errorForm").addClass("completeForm"); 8323 txtCAFirstNameInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormName')); 8324 txtCAFirstNameInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8325 newAcc1 = "true"; 8326 valbtnbtnContinue(); 8327 } 8328 } 8329 var txtCAEMail = $("#txtEmail"); 8330 var txtCAEMailInfo = $("#txtEmailInfo"); 8331 txtCAEMail.blur(validateEmailCA); 8332 txtCAEMail.keyup(validateEmailCA); 8333 function validateEmailCA() 8334 { 8335 var emailAddress = $("#txtEmail").val(); 8336 $.when(validateEmail(emailAddress)) 8337 .done(function (isValidEmail) 8338 { 8339 if (isValidEmail) 8340 { 8341 txtCAEMail.removeClass("errorForm").addClass("completeForm"); 8342 txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailValid')); 8343 txtCAEMailInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8344 newAcc2 = "true"; 8345 valbtnbtnContinue(); 8346 } 8347 else 8348 { 8349 txtCAEMail.removeClass("completeForm").addClass("errorForm"); 8350 txtCAEMailInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-EmailInvalid')); 8351 txtCAEMailInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8352 newAcc2 = "false"; 8353 valbtnbtnContinue(); 8354 } 8355 }); 8356 } 8357 var txttxtMessage = $("#txtSpecialProductName"); 8358 var txttxtMessageInfo = $("#txtSpecialProductNameInfo"); 8359 txttxtMessage.blur(validatetxtMessage); 8360 txttxtMessage.keyup(validatetxtMessage); 8361 function validatetxtMessage() 8362 { 8363 if (txttxtMessage.val().length < 1) 8364 { 8365 txttxtMessage.removeClass("completeForm").addClass("errorForm"); 8366 txttxtMessageInfo.text(GetTranslation('JavaScriptTranslations', '00Misc-ProductNameInvalid')); 8367 txttxtMessageInfo.removeClass("completeFormInfo").addClass("errorFormInfo"); 8368 newAcc3 = "false"; 8369 valbtnbtnContinue(); 8370 } 8371 else 8372 { 8373 txttxtMessage.removeClass("errorForm").addClass("completeForm"); 8374 txttxtMessageInfo.text(GetTranslation('JavaScriptTranslations', 'ContactFormProductName')); 8375 txttxtMessageInfo.removeClass("errorFormInfo").addClass("completeFormInfo"); 8376 newAcc3 = "true"; 8377 valbtnbtnContinue(); 8378 } 8379 } 8380 function valbtnbtnContinue() 8381 { 8382 if (newAcc1 == 'true' && newAcc2 == 'true' && newAcc3 == 'true') 8383 { 8384 $("#butSend").removeAttr('disabled'); 8385 $("#butSend").removeClass("button grey").addClass("button green"); 8386 $("#butSend").html(GetTranslation('JavaScriptTranslations', '00Misc-Send')); 8387 } else 8388 { 8389 $("#butSend").attr('disabled', true); 8390 $("#butSend").removeClass("button green").addClass("button grey"); 8391 $("#butSend").html(GetTranslation('JavaScriptTranslations', 'ContactFormSubmit')); 8392 } 8393 } 8394 valbtnbtnContinue(); 8395} 8396 8397function sitemapLayout() { 8398 $('.siteMap>ul>li').each(function () { 8399 $(this).addClass('col-4'); 8400 });
8401 $('.siteMap a').each(function () { 8402 $(this).removeClass('CSSChild').removeClass('CSSParent') 8403 }); 8404} 8405 8406// Hide empty/unncessary table cells from the order totals box. 8407if (window.location.href.toLowerCase().indexOf('/cart/') > -1) 8408{ 8409 8410 document.addEventListener("readystatechange", function () 8411 { 8412 if (document.readyState === "interactive") 8413 { 8414 8415 DeleteCookie(WORKFLOWCOOKIENAME); 8416 trimOrderTotalFields(); 8417 showhideCardIconsShoppingCart(); 8418 LoadCheckoutButtons(); 8419 8420 } 8421 }); 8422} 8423 8424function trimOrderTotalFields() 8425{ 8426 $('.orderCartWrap .orderTotal td').each(function () 8427 { 8428 var $e = $(this); 8429 if ($.trim($e.html()) == "" || $.trim($e.html()) == " ") 8430 { 8431 $e.hide(); 8432 } 8433 }); 8434} 8435 8436function showhideCardIconsShoppingCart() 8437{ 8438 showHideCardIcons('#cart-paymenticons'); 8439} 8440 8441function LoadCheckoutButtons() 8442{ 8443 8444 var buttonSchema = GetActiveWorkflowButtons(); 8445 for (var i = 0; i < buttonSchema.length; i++) { 8446 if (buttonSchema[i] && (buttonSchema[i].name.indexOf('citruspaywallet') > -1 || buttonSchema[i].name.toLowerCase().indexOf('citruspaystripeclearpayafterpay') > -1)) { 8447 delete buttonSchema[i]; 8448 } 8449 } 8450 8451 var $target = $('#ShoppingCartButtonPlaceholder'); 8452 $target.replaceWith(GetCheckoutWorkflowButtonHtml(buttonSchema, $target.attr('data-href'))); 8453 8454 CheckIfKlarnaAvailable(); 8455 CheckIfFinanceAvailable(); 8456} 8457 8458function GetCheckoutWorkflowButtonHtml(buttons, checkoutLink) 8459{ 8460 var buttonHtml = ''; 8461 var BUTTONTEMPLATE = '<a href="' + checkoutLink + '/" data-type="[[NAME]]" class="col-1 pos-rel button bSquare buttonChkOut ctrMgr8-top ctrMgr8-bottom autoCheckoutButton" style="background-color:[[BGCOLOUR]]; background:[[BGCOLOUR]];" onclick="GoToCheckout($(this), event);" [[DISABLED]]>[[BUTTONCONTENT]]</a>'; 8462 for (var i = 0; i < buttons.length; i++) 8463 { 8464 if (buttons[i]) 8465 { 8466 var isButtonWhichNeedsAdditionalCheck = (buttons[i].name.toLowerCase() === 'klarna' || buttons[i].name.toLowerCase() === 'finance'); 8467 if (isButtonWhichNeedsAdditionalCheck) 8468 { 8469 buttonHtml += '<div class="col-1 pos-rel"><div id="stateful-loader-' + buttons[i].name.toLowerCase() + '" class="stateful-loader"><div class="stateful-checkmark stateful-error"></div></div>'; 8470 } 8471 8472 buttonHtml += BUTTONTEMPLATE.replace(/\[\[BGCOLOUR\]\]/gm, buttons[i].color) 8473 .replace('[[BUTTONCONTENT]]', buttons[i].content) 8474 .replace('[[NAME]]', buttons[i].name) 8475 .replace('[[DISABLED]]', (isButtonWhichNeedsAdditionalCheck ? 'disabled' : '')); 8476 8477 if (isButtonWhichNeedsAdditionalCheck) 8478 { 8479 buttonHtml += '</div>'; 8480 } 8481 } 8482 } 8483 8484 return buttonHtml; 8485} 8486 8487function CheckIfFinanceAvailable() 8488{ 8489 var $financeButton = $('.autoCheckoutButton[data-type="Finance"]'), 8490 financeLoaderId = 'stateful-loader-finance', 8491 disabledAttributeName = 'disabled'; 8492 8493 var defer = $.Deferred(); 8494 8495 $.ajax({
8496 type: "POST", 8497 url: '/wsCitrusStore.asmx/WightLoadBasketFinanceControl', 8498 data: '{}', 8499 contentType: "application/json; charset=utf-8", 8500 dataType: "json", 8501 success: function (data) 8502 { 8503 var financeAvail = data.d.indexOf('<div id="financecalc"') > -1; 8504 if (financeAvail) 8505 { 8506 $financeButton.siblings('#' + financeLoaderId).fadeOut(); 8507 $financeButton.removeAttr(disabledAttributeName); 8508 } 8509 else 8510 { 8511 $financeButton.attr(disabledAttributeName, disabledAttributeName); 8512 $financeButton.parent().slideUp(); 8513 } 8514 defer.resolve(financeAvail); 8515 }, 8516 error: function (e) 8517 { 8518 $financeButton.attr(disabledAttributeName, disabledAttributeName); 8519 $financeButton.parent().slideUp(); 8520 defer.resolve(false); 8521 } 8522 }); 8523 8524 return defer; 8525} 8526 8527function CheckIfKlarnaAvailable() 8528{ 8529 var $klarnaButton = $('.autoCheckoutButton[data-type="Klarna"]'), 8530 klarnaLoaderId = 'stateful-loader-klarna', 8531 disabledAttributeName = 'disabled'; 8532 8533 StatefulLoaderReset(klarnaLoaderId); 8534 $klarnaButton.attr(disabledAttributeName, disabledAttributeName); 8535 $klarnaButton.siblings('#' + klarnaLoaderId).show(); 8536 8537 if (typeof ecommerceConfig.ActivePaymentMethods.Klarna === "undefined") 8538 { 8539 $klarnaButton.attr(disabledAttributeName, disabledAttributeName); 8540 $klarnaButton.parent().slideUp(); 8541 } 8542 else 8543 { 8544 $.ajax({
8545 url: '/wsCitrusStore.asmx/IsKlarnaAvailable', 8546 type: 'POST', 8547 data: '{}', 8548 contentType: "application/json; charset=utf-8", 8549 dataType: "json", 8550 success: function (data) 8551 { 8552 StatefulLoader(klarnaLoaderId, data.d.KlarnaAvailableOnThisBasket); 8553 if (data.d.KlarnaAvailableOnThisBasket) 8554 { 8555 $klarnaButton.siblings('#' + klarnaLoaderId).fadeOut(); 8556 $klarnaButton.removeAttr(disabledAttributeName); 8557 } 8558 else 8559 { 8560 if (data.d.KlarnaAvailable && data.d.MinimumSpend > 0 8561 && $('#klarnaNotAvailableOnThisBasket') != null 8562 && $('#klarnaMinimumSpend') != null) { 8563 8564 $('#klarnaMinimumSpend').text(GetLocaleNumberAsFinancialNumber(data.d.MinimumSpend)); 8565 $('#klarnaNotAvailableOnThisBasket').show(); 8566 } 8567 8568 $klarnaButton.attr(disabledAttributeName, disabledAttributeName); 8569 $klarnaButton.parent().slideUp(); 8570 } 8571 }, 8572 error: function () 8573 { 8574 StatefulLoader(klarnaLoaderId, false); 8575 $klarnaButton.attr(disabledAttributeName, disabledAttributeName); 8576 $klarnaButton.parent().slideUp(); 8577 } 8578 }); 8579 } 8580} 8581 8582var WORKFLOWCOOKIENAME = 'CHECKOUTWORKFLOW'; 8583 8584function GoToCheckout(el, event) 8585{ 8586 event.preventDefault(); 8587 var workflow = el.attr('data-type'); 8588 setCookieWithDays(WORKFLOWCOOKIENAME, workflow, 1); 8589 8590 window.location = el.attr('href'); 8591} 8592function instagram (URL,totalPost,productLink,hashtag) { 8593 if(productLink) { 8594 $(".instagramContent").addClass("instaLinked"); 8595 } 8596 $.ajax({ 8597 type: "GET", 8598 dataType: "jsonp", 8599 cache: false, 8600 url: URL, 8601 success: function(data) { 8602 console.log(data); 8603 $(".instagramTitle").append("<div class='instagramPicture'><img src='"+data.data[0].user.profile_picture+"'></div><a target='_blank' href='https://www.instagram.com/"+data.data[0].user.username+"' class='instagramUsername'>#"+data.data[0].user.username+"</a></div>"); 8604 runInsta(); 8605 function runInsta() { 8606 for(var i=0; i< totalPost; i++) { 8607 //render() 8608 var x = 0; 8609 var currpos = i; 8610 var pq = 0; 8611 if(productLink) { 8612 $.each(data.data[i].tags, function(x, currpos){ 8613 var id = this.valueOf(); 8614 if (id.indexOf(hashtag) !== -1) { 8615 prodID = id.substring(hashtag.length, id.length); 8616 pq = prodID; 8617 CitrusStore.CitrusStore.wsCitrusStore.GetProductLW(prodID, SucceededGetProductCallbackProduct, onFailedWS); 8618 8619 } 8620 function SucceededGetProductCallbackProduct(result) { 8621 console.log(result); 8622 var styles1 = { 8623 background: 'url("/'+result.ImageLargePath+'") no-repeat 50% 50% #fff', 8624 backgroundSize: 'contain', 8625 }; 8626 $('.instagramContent li[data-productid="'+result.uid+'"] .instComments').append('<a class="instaproductpics" href="'+result.Link+'"></a>'); 8627 $('.instagramContent li[data-productid="'+result.uid+'"] .instComments .instaproductpics').css(styles1); 8628 $('.instagramContent li[data-productid="'+result.uid+'"] .instComments .instaproductpics').append('<div class="instaproductPrice">£'+result.SalePrice+'</div>'); 8629 8630 } 8631 }); 8632 } 8633 $(".instagramContent").append("<li data-index='"+i+"' data-productid='"+pq+"'><a class='autosize' target='_blank' href='"+data.data[i].link+"' style='position:relative;z-index:1;'><img src='" + data.data[i].images.standard_resolution.url +"' width='490'></img><div class='instComments'><div class='likes'>"+data.data[i].likes.count+"</div><div class='comments'>"+data.data[i].comments.count+"</div><div class='caption'>"+data.data[i].caption.text+"</div></div></a></li>"); 8634 } 8635 } 8636 8637 } 8638 }); 8639}function sApproved () { 8640 //sApprovedOverview("https://www.shopperapproved.com/api/sites/?siteid=10116&token=Tz415ZRFcbQgKCq&jsonp=?"); 8641 //sApprovedReviews("https://www.shopperapproved.com/api/reviews/?siteid=10116&token=Tz415ZRFcbQgKCq&sort=newest&jsonp=?"); 8642} 8643 8644function sApprovedOverview() { 8645 8646 $.ajax({
8647 crossDomain: true, 8648 type:"GET", 8649 headers: { 'Access-Control-Allow-Origin': '*' }, 8650 dataType: 'jsonp', 8651 contentType: "application/json", 8652 url: URL, 8653 error: function(xhr, status, error) { 8654 console.log(error.message); 8655 }, 8656 success: function(result){ 8657 8658 // Do something with it 8659 var sitename = result.site; 8660 var siteurl = result.url; 8661 var sitecount = result.review_count; 8662 var siteavg = result.average; 8663 var reviewStarValue; 8664 8665 $('.fReviewRate').append(siteavg); 8666 $('.fReviewCount').append(sitecount); 8667 8668 var 8669 html = '<div class="reviewOverview col-1">'; //Opens Div 8670 html += '<h2>An Average rating of <span id="siteavgval">' + siteavg + ' / 5</span> from <span>' + sitecount + '</span> verified customers.</h2>'; 8671 html += '<div class="col-1"><a href="http://www.shopperapproved.com/reviews/' + sitename + '/">View all reviews</a></div>' ; 8672 html += '</div>' ; //Closes Div 8673 8674 $('#tReviewOverview').append($(html)); 8675 8676 if (siteavg === "0.0") { 8677 reviewStarValue = "<span></span>"; 8678 } 8679 8680 if ((siteavg > "0.0") && (siteavg < "1.0")) { 8681 reviewStarValue = "<span> </span>"; 8682 } 8683 8684 if (siteavg === "1.0") { 8685 reviewStarValue = "<span> </span>"; 8686 } 8687 8688 if ((siteavg > "1.0") && (siteavg < "2.0")) { 8689 reviewStarValue = "<span>  </span>"; 8690 } 8691 8692 if (siteavg === "2.0") { 8693 reviewStarValue = "<span>  </span>"; 8694 } 8695 8696 if ((siteavg > "2.0" && siteavg < "3.0")) { 8697 reviewStarValue = "<span>   </span>"; 8698 } 8699 8700 if (siteavg === "3.0") { 8701 reviewStarValue = "<span>   </span>"; 8702 } 8703 8704 if ((siteavg > "3.0") && (siteavg < "4.0")) { 8705 reviewStarValue = "<span>    </span>"; 8706 } 8707 8708 if (siteavg === "4.0") { 8709 reviewStarValue = "<span>    </span>"; 8710 } 8711 8712 if ((siteavg > "4.0") && (siteavg < "4.5")) { 8713 reviewStarValue = "<span>    </span>"; 8714 } 8715 8716 if (siteavg > "4.5") { 8717 reviewStarValue = "<span>    </span>"; 8718 } 8719 else {} 8720 8721 $('.reviewStars').append(reviewStarValue); 8722 8723 // This is the end ... 8724 8725 } 8726 }); 8727} 8728 8729 8730function sApprovedReviews(URL) { 8731 8732 $.ajax({
8733 crossDomain: true, 8734 type:"GET", 8735 headers: { 'Access-Control-Allow-Origin': '*' }, 8736 dataType: 'jsonp', 8737 contentType: "application/json", 8738 url: URL, 8739 error: function(xhr, status, error) { 8740 console.log(error.message); 8741 }, 8742 success: function(result){ 8743 8744 // Do something with it 8745 console.log(result) 8746 $.each(result, function (index, data) { 8747 8748 console.log(data.displaydate) 8749 var reviewname = data.name; 8750 var reviewdate = data.displaydate; 8751 var reviewcomment = data.textcomments; 8752 var reviewurl = data.fullurl; 8753 var reviewRate = data.Overall; 8754 var reviewLocation = data.location; 8755 8756 if (reviewcomment == "") { 8757 var reviewcomment = "Customer left no comment"; 8758 } 8759 var 8760 html = '<div class="ctrPad16 col-2"><div class="reviewBox col-1 ctrPad16">'; //Opens Div 8761 html += '<h4> ' + reviewRate + '<span>Overall</span></h4>' ; 8762 html += '<h3>' + reviewname + '<span>Submitted: ' + reviewdate + '</span></h3>'; 8763 html += '<div class="col-1 reviewComment"><p><strong>Customer Comment...</strong> ' + reviewcomment + '<br>' + reviewLocation + '</p></div>' ; 8764 html += '<div class="col-1"><a href="' + reviewurl + '">View full review</a></div>' ; 8765 html += '</div></div>' ; //Closes Div 8766 8767 $('#tReviewBox').append($(html)); 8768 8769 }); 8770 } 8771 }); 8772}function brandPageSorting() 8773{ 8774 $('.sortMe').each(function () 8775 { 8776 var toMove = $(this); 8777 var firstLetterOfBrand = toMove.html().charAt(0).toLowerCase(); 8778 if (isNaN(parseFloat(firstLetterOfBrand))) 8779 { 8780 toMove.appendTo("#brand" + firstLetterOfBrand.toUpperCase()); 8781 } else 8782 { 8783 toMove.appendTo("#brand09"); 8784 } 8785 }); 8786} 8787/* Purposefully empty - this is a duplicate file */function toggleDark(){ 8788 $(".toggleDark").click(function(){ 8789 $("html").toggleClass("dark"); 8790 }); 8791} 8792if (window.location.href.indexOf('/pages/starbuys') > -1) { 8793 8794 document.addEventListener("readystatechange", function () { 8795 if (document.readyState === "interactive") { 8796 8797 $.ajax({
8798 type: "POST", 8799 url: "/wsCitrusStore.asmx/getAllStarBuysV2", 8800 data: '{}', 8801 contentType: "application/json; charset=utf-8", 8802 dataType: "json", 8803 success: function (data) { 8804 8805 var starBuysList = JSON.parse(data.d); 8806 8807 for (var i = 0; i < starBuysList.length; i++) { 8808 8809 var offerAppliesToText = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '08StarbuysV2Page-OfferAppliesProductX0Name'), starBuysList[i].AppliesToName); 8810 var offerProduct = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '08StarbuysV2Page-ViewOfferX0Product'), starBuysList[i].ItemName); 8811 var offerExpireText = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '08StarbuysV2Page-ExpiresOnX0Date'), starBuysList[i].OfferExpiry) 8812 var offerTagLineText = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '08StarbuysV2Page-TaglineX0Product'), starBuysList[i].ItemName) 8813 var endsSoonClass = ((starBuysList[i].IsEndingSoon) ? "sb-ends-soon" : ""); 8814 8815 $('#sbpagev2-all-starbuys').append(` 8816 <a href="${starBuysList[i].Itemlink}" class="col-2 ctrPad8" alt="${offerProduct}" title="${offerProduct}"> 8817 <div class="col-1 ctrPad32 sbv2-page-bg ${endsSoonClass}"> 8818 <div class="col-1 small ctrMgr4-bottom">${offerExpireText}</div> 8819 <div class="col-1 boldfont ctrMgr4-bottom">${starBuysList[i].PromoText}</div> 8820 <div class="col-1 small ctrMgr8-bottom">${offerTagLineText}</div> 8821 <div class="col-1 small sbv2-page---appto">${offerAppliesToText}</div> 8822 </div> 8823 </a> 8824 `); 8825 } 8826 }, 8827 error: function (data) { 8828 console.log('getAllStarBuysV2 : error = ', data); 8829 } 8830 }); 8831 8832 } 8833 }); 8834} 8835 8836/** 8837 * Gets the value of a URL parameter based on the parameter name 8838 * @param {string} sParam The parameter name to get the value of 8839 */ 8840var getUrlParameter = function getUrlParameter(sParam) { 8841 var sPageURL = window.location.search.substring(1), 8842 sURLVariables = sPageURL.split('&'), 8843 sParameterName, 8844 i; 8845 8846 for (i = 0; i < sURLVariables.length; i++) { 8847 sParameterName = sURLVariables[i].split('='); 8848 8849 if (sParameterName[0] === sParam) { 8850 return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]); 8851 } 8852 } 8853}; 8854 8855/** 8856 * Loads the product data from the array of product IDs (var productuids) 8857 */ 8858function runcompare() { 8859 8860 var productuids = getUrlParameter('p'), 8861 productCompareRunLength = 0, 8862 productCompareHasRun = false, 8863 ProductCompareStats = { 8864 Prices: { 8865 highest: null, 8866 lowest: null, 8867 average: null, 8868 avg: 0, 8869 sum: 0, 8870 all: [], 8871 PriceTemplate: function (n, p) { 8872 this.name = n; 8873 this.price = p; 8874 }, 8875 currency: '' 8876 } 8877 }; 8878 8879 if (productuids) { 8880 productuids = productuids.split(','); 8881 productCompareRunLength = productuids.length; 8882 } 8883 8884 if (productuids && productCompareRunLength > 0) { 8885 $('h1>span').text(productCompareRunLength); 8886 for (var i = 0; i < productCompareRunLength; i++) { 8887 CitrusStore.CitrusStore.wsCitrusStore.GetProductLW(productuids[i], function (data) { 8888 ProductCompareStats = successfulCallbackProductCompareModular(data, ProductCompareStats);
8889 productCompareHasRun = (i == productCompareRunLength); 8890 if (productCompareHasRun) { 8891 buildCompareStats(ProductCompareStats); 8892 } 8893 }, onFailedWS); 8894 } 8895 } 8896} 8897 8898/** 8899 * Callback for the GetProductLW WebService called inside runcompare() function 8900 * @param {object} result The data retrieved from the WebService 8901 */ 8902function successfulCallbackProductCompareModular(result, productCompareStats) { 8903 8904 /* Update Object */ 8905 productCompareStats.Prices.all.push(new productCompareStats.Prices.PriceTemplate(result.Name, result.SalePrice)); 8906 productCompareStats.Prices.currency = result.CurrencySymbol; 8907 8908 var html = ''; 8909 /* Open */ 8910 html += '<div id="cp' + result.uid + '" data-sku="' + result.Code + '" data-puid="' + result.uid + '" data-name="' + result.Name + '" class="col-4 ctrPad16">'; 8911 /* Info */ 8912 html += '<div class="col-1 imgCtr border1 bgContain" style="background:url(\'/' + result.ImageLargePath + '?width=500&height=500&format=webp&bgcolor=ffffff&quality=80\') no-repeat center center"></div>'; 8913 html += '<div class="col-1 ctrPad16-top">'; 8914 /* Pricing */ 8915 html += '<div class="col-1 zflex-s">'; 8916 html += '<div class="col- flex-grow1">£' + result.SalePrice.toFixed(2) + '</div>'; 8917 if (result.IsOnSale) { 8918 html += '<div class="col- co888"><em><s>was £' + result.Price.toFixed(2) + '</s></em></div>'; 8919 } else { 8920 html += '<div class="col- co888"> </div>'; 8921 } 8922 html += '</div>'; 8923 /* Name */ 8924 html += '<div class="col-1 ctrMgr8-top ctrMgr16-bottom ctrPad16-bottom border1 removeborder-left removeborder-right removeborder-top large compare-min-height">' + result.Name + '</div>'; 8925 /* Short Desc */ 8926 html += '<div class="col-1 ctrMgr16-bottom ctrPad16-bottom border1 removeborder-left removeborder-right removeborder-top small">' + result.ShortDescription + '</div>'; 8927 html += '</div>'; 8928 /* View product link */ 8929 html += '<div class="col-1 printhide">'; 8930 html += `<div class="col- ctrPad16-right"><a href="${result.Link}" class="cpointer button btn-border" target="new">${GetTranslation('JavaScriptTranslations', '09ProductCompare-ViewProduct')}</a></div>`; 8931 html += '</div>'; 8932 /* Close */ 8933 html += '</div>'; 8934 $('#comparetgt').append(html); 8935 8936 return productCompareStats; 8937} 8938 8939/** 8940 * Gets/Sets the high/middle/low priced item objects inside the ProductCompareStats object 8941 */ 8942function buildCompareStats(productCompareStats) { 8943 productCompareStats.Prices.sum = productCompareStats.Prices.all.reduce(function(total, current, index, array) { 8944 if (isNaN(total)) {total = total.price;} 8945 total += current.price; 8946 return total; 8947 }, 0); 8948 productCompareStats.Prices.avg = parseFloat((productCompareStats.Prices.sum / productCompareStats.Prices.all.length)); 8949 // set lowest and highest prices 8950 productCompareStats.Prices.highest = productCompareStats.Prices.all.reduce(function (highest, item) { 8951 return highest.price > item.price ? highest : item; 8952 }); 8953 productCompareStats.Prices.lowest = productCompareStats.Prices.all.reduce(function (highest, item) { 8954 return highest.price < item.price ? highest : item; 8955 }); 8956 productCompareStats.Prices.average = closestValue(productCompareStats.Prices.all, productCompareStats.Prices.avg); 8957 8958 addCompareStatsToUI("highest", productCompareStats); 8959 addCompareStatsToUI("lowest", productCompareStats); 8960 addCompareStatsToUI("average", productCompareStats); 8961 8962 $('#comparetgt, #comparestats').css('opacity', '1'); 8963} 8964 8965/** 8966 * Adds the comparison statistics to the UI 8967 * @param {string} type The type of statistic; options are [highest, lowest, average]. These values relate to various object keys and javascript selectors. 8968 */ 8969function addCompareStatsToUI(type, productCompareStats) { 8970 $('[data-element="' + type + 'price-value"]').text(productCompareStats.Prices.currency + productCompareStats.Prices[type].price.toFixed(2)); 8971 $('[data-element="' + type + 'price-name"]').text(productCompareStats.Prices[type].name); 8972 $('#comparetgt >
8972 [data-name="' + productCompareStats.Prices[type].name + '"]').attr('data-before-tag', type); 8973} 8974 8975/** 8976 * Gets the closest item in an array based on a a value 8977 * @param {object} array The array to search. Uses the item[i].price value to determine the closest item 8978 * @param {integer} value The value in which to compare the items. 8979 */ 8980function closestValue(array, value) { 8981 var result, 8982 lastDelta; 8983 array.some(function (item) { 8984 var delta = Math.abs(value - item.price); 8985 if (delta >= lastDelta) { 8986 return true; 8987 } 8988 result = item; 8989 lastDelta = delta; 8990 }); 8991 return result; 8992} 8993 8994/** 8995 * Opens a new email window with a site-specific subject and link to the comparison page. 8996 */ 8997function emailCurrentPage() { 8998 window.location.href = `mailto:?subject=${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '09ProductCompare-MailLinkX0Site'), '<%= writeTitle().ToString() %>')}&body=${escape(window.location.href)}`; 8999} 9000function GetContactFormValue(elementID) { 9001 return ($(elementID).val() !== undefined ? $(elementID).val() : "") 9002} 9003 9004function PostContactForm(e) { 9005 e.preventDefault(); 9006 9007 ToggleContactFormButtons(false, false); 9008 9009 if (typeof grecaptcha !== 'undefined' && 9010 typeof reCaptchaPublicKey !== 'undefined' && 9011 grecaptcha && 9012 reCaptchaPublicKey) { 9013 grecaptcha.ready(() => { 9014 grecaptcha.execute(reCaptchaPublicKey, { action: 'submit' }) 9015 .then((token) => { 9016 ContactSubmitSuccessful(token); 9017 }); 9018 }); 9019 } 9020 else { 9021 ContactSubmitSuccessful(''); 9022 } 9023} 9024 9025function ContactSubmitSuccessful(reCaptchaResponse) { 9026 const postData = { 9027 emailAddress: GetContactFormValue('#txtEmail'), 9028 name: GetContactFormValue('#txtName'), 9029 phone: GetContactFormValue('#txtPhone'), 9030 orderNum: GetContactFormValue('#txtOrder'), 9031 messageBody: GetContactFormValue('#txtMessage'), 9032 isPriceRequest: ($('#txtProductNamePM').val() !== undefined), 9033 isSpecialOrder: ($('#txtSpecialProductName').val() !== undefined), 9034 productName: '', 9035 modelDesc: '', 9036 sizeReq: '', 9037 colour: '', 9038 competWebsite: '', 9039 competPrice: '', 9040 comments: '', 9041 reCaptchaResponse 9042 }; 9043 9044 if (postData.isPriceRequest) { 9045 postData.productName = GetContactFormValue('#txtProductNamePM'); 9046 postData.competWebsite = GetContactFormValue('#txtCompetWebsite'); 9047 postData.competPrice = GetContactFormValue('#txtPrice'); 9048 postData.comments = GetContactFormValue('#txtComments'); 9049 } else if (postData.isSpecialOrder) { 9050 postData.productName = GetContactFormValue('#txtSpecialProductName'); 9051 postData.modelDesc = GetContactFormValue('#txtSpecialModel'); 9052 postData.sizeReq = GetContactFormValue('#txtSizeRequested'); 9053 postData.colour = GetContactFormValue('#txtColourRequested'); 9054 } 9055 9056 var postDataStr = JSON.stringify(postData); 9057 var promiseName = 'ContactFormSubmittedPromise'; 9058 var messageConfig; 9059 9060 window.ContactFormSubmittedPromise = $.Deferred(); 9061 9062 $.ajax({
9063 type: 'POST', 9064 url: '/wsCitrusStore.asmx/SubmitContactForm', 9065 data: postDataStr, 9066 contentType: 'application/json; charset=utf-8', 9067 dataType: 'json', 9068 success: function (data) { 9069 var contactFormResults = JSON.parse(data.d); 9070 9071 $('#butSend').toggle(!contactFormResults.status); 9072 9073 if (contactFormResults.status) { 9074 ToggleContactFormButtons(false, true); 9075 9076 messageConfig = GetModularMessageConfig(MODALTYPE_SUCCESS); 9077 messageConfig.Header = GetTranslation('JavaScriptTranslations', '10ContactForm-ContactFormSubmittedHeader'); 9078 messageConfig.Body = GetTranslation('JavaScriptTranslations', '10ContactForm-ThanksForYourMessage'); 9079 messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '10ContactForm-OkayButtonText'); 9080 ModularModalMessage(promiseName, messageConfig); 9081 } 9082 else if (contactFormResults.ErrorMsg.includes('ReCaptcha')) { 9083 ContactSubmitFail(); 9084 } 9085 else { 9086 ToggleContactFormButtons(true, true); 9087 9088 messageConfig = GetModularMessageConfig(MODALTYPE_ERROR); 9089 messageConfig.Header = GetTranslation('JavaScriptTranslations', '10ContactForm-ErrorHeader'); 9090 messageConfig.Body = contactFormResults.ErrorMsg; 9091 messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '10ContactForm-OkayButtonText'); 9092 9093 ModularModalMessage(promiseName, messageConfig); 9094 } 9095 }, 9096 error: function (e) { 9097 ToggleContactFormButtons(true, true); 9098 9099 var errorMessage = GetTranslation('JavaScriptTranslations', '10ContactForm-AnErrorHasOccurredWhenAttemptingToValidateYourSessionMessage'); 9100 9101 messageConfig = GetModularMessageConfig(MODALTYPE_ERROR); 9102 messageConfig.Header = GetTranslation('JavaScriptTranslations', '10ContactForm-ErrorHeader'); 9103 messageConfig.Body = errorMessage; 9104 messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '10ContactForm-OkayButtonText'); 9105 ModularModalMessage(promiseName, messageConfig); 9106 ErrorLogger(e, errorMessage); 9107 } 9108 }); 9109 9110} 9111 9112function ResetContactForm() { 9113 $.each(["#txtName", "#txtPhone", "#txtOrder", "#txtMessage", "#txtProductNamePM", "#txtSpecialProductName", "#txtProductNamePM", "#txtCompetWebsite", "#txtPrice", "#txtComments", "#txtSpecialProductName", "#txtSpecialModel", "#txtSizeRequested", "#txtColourRequested", "#txtEmail"], function (index, formItemSelector) { 9114 var formItem = $(formItemSelector); 9115 if (formItem.length) { 9116 formItem.val(''); 9117 } 9118 }); 9119 9120 $('#butSend').show(); 9121 $('#ResetButton').hide(); 9122 9123 ToggleContactFormButtons(false, false); 9124} 9125 9126function ToggleContactFormButtons(enableSendButton, enableResetButton) { 9127 if (!enableSendButton) { 9128 $('#butSend').prop('disabled', true); 9129 } 9130 else { 9131 $('#butSend').removeProp('disabled'); 9132 } 9133 9134 if (!enableResetButton) { 9135 $('#ResetButton').prop('disabled', true); 9136 } 9137 else { 9138 $('#ResetButton').removeProp('disabled'); 9139 } 9140} 9141 9142function ContactSubmitFail() { 9143 var messageConfig = GetModularMessageConfig(MODALTYPE_ERROR); 9144 9145 messageConfig.Header = GetTranslation('JavaScriptTranslations', '10ContactForm-ErrorHeader'); 9146 messageConfig.Body = GetTranslation('JavaScriptTranslations', '10ContactForm-AnErrorHasOccurredWhenAttemptingToValidateYourSessionMessage'); 9147 messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '10ContactForm-OkayButtonText'); 9148 9149 window.ContactFormSubmitFailedPromise = $.Deferred(); 9150 9151 ModularModalMessage('ContactFormSubmitFailedPromise', messageConfig); 9152} 9153var NEWBASKETGLOBALVARS = {}; 9154 9155 9156 9157function LoadNewBasket() { 9158 CartOnloadMessageHandler(); 9159 NEWBASKETGLOBALVARS.PRODUCTTEMPLATE = GetProductTemplate(); 9160 NEWBASKETGLOBALVARS.SHIPPINGTEMPLATE = GetShippingOptionTemplate(); 9161 NEWBASKETGLOBALVARS.CURRENCYTEMPLATE = GetCurrencyTemplate(); 9162 NEWBASKETGLOBALVARS.CTABUBBLETEMPLATE = GetCTABubbleTemplate(); 9163 9164 DeleteCookie(WORKFLOWCOOKIENAME); 9165 9166 GetCartInitialise(); 9167 9168 document.addEventListener('ItemAddedToBasket', () => { 9169 GetCartInitialise(); 9170 });
9171 9172 document.addEventListener('PaymentButtonClicked', () => { 9173 SendGA4BeginCheckout(); 9174 }); 9175} 9176 9177function SendGA4BeginCheckout() { 9178 if (ecommerceConfig.AnalyticsScheme != 'GA4' || !ecommerceConfig.GoogleAnalyticsClientSidePostingEnabled) { 9179 return; 9180 } 9181 9182 const items = []; 9183 9184 for (const item of NEWBASKETGLOBALVARS.PRODUCTS) { 9185 items.push({ 9186 "item_id": item.ProductCode, 9187 "item_name": item.Name, 9188 "item_variant": item.AttributeCode || '', 9189 "price": item.SalePrice, 9190 "quantity": item.Quantity 9191 }); 9192 } 9193 9194 window.gtag('event', 'begin_checkout', { 9195 "currency": ecommerceConfig.LocalCurrencyCode, 9196 "value": NEWBASKETGLOBALVARS.MERCHANDISETOTAL, 9197 "items": items 9198 }); 9199} 9200 9201function GetCartInitialise() { 9202 CitrusStore.CitrusStore.wsCitrusStore.GetMiniBasket(SucceededLoadNewBasket, 9203 function(err) { 9204 onFailedWS(err); 9205 FailedLoadNewBasket(err); 9206 }); 9207} 9208 9209const CHECKOUT_ERROR_KEY_TO_RESOURCE_ID = { 9210 FailedToBegin: '11NewBasket-CheckoutError-FailedToBegin', 9211 NoCartLines: '11NewBasket-CheckoutError-NoCartLines', 9212 StockCheckFailed: '11NewBasket-CheckoutError-StockCheckFailed', 9213}; 9214 9215const CHECKOUT_ERROR_DEFAULT_RESOURCE_ID = '11NewBasket-CheckoutError'; 9216 9217function CartOnloadMessageHandler() { 9218 const checkoutErrorParamName = 'checkoutError'; 9219 9220 let searchParams = new URLSearchParams(window.location.search.replace('?', '')); 9221 9222 if (!searchParams.has(checkoutErrorParamName)) { 9223 return; 9224 } 9225 9226 const key = searchParams.get(checkoutErrorParamName); 9227 9228 const resourceId = CHECKOUT_ERROR_KEY_TO_RESOURCE_ID.hasOwnProperty(key) ? 9229 CHECKOUT_ERROR_KEY_TO_RESOURCE_ID[key] : 9230 CHECKOUT_ERROR_DEFAULT_RESOURCE_ID; 9231 9232 GenericNewCartError(GetTranslation('JavaScriptTranslations', resourceId)); 9233} 9234 9235function FailedLoadNewBasket(err) { 9236 var errorObj = getCourierIntegrationErrorMessageFromObject(err); 9237 9238 if (errorObj.isDotNetError || errorObj.isJqueryError) { 9239 var basketWrapperEl = document.querySelector('.basket-wrapper .container'); 9240 basketWrapperEl.innerHTML = `<div class="col-1 ctrPad32"><div class="col-1 ctrPad32 coRED bgLRed x-large ctrMgr32-top ctrMgr32-bottom">${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-CannotContinueErrorX0Message'), errorObj.errorMessage)}</div></div>`; 9241 } 9242} 9243 9244function SucceededLoadNewBasket(result) { 9245 9246 if (result === null) { 9247 TogglePageLoading(false); 9248 GenericNewCartError(GetTranslation('JavaScriptTranslations', '11NewBasket-LoadingError')); 9249 return; 9250 } 9251 9252 CheckStockErrors(result); /* ShowStockErrors must always be first in this function - moving this will result in annoyance and a broken page */ 9253 9254 NEWBASKETGLOBALVARS.PRODUCTS = PopulateProductArray(result); 9255 NEWBASKETGLOBALVARS.MERCHANDISETOTAL = result.MerchandiseTotal; 9256 9257 LoadCheckoutButtonsNewCart(); 9258 $('#new-basket-starbuyitems, #new-basket-standarditems').empty(); 9259 9260 PopulateNonStarbuyProducts(result.Products, result.StarbuyGroups.length); 9261 PopulateStarbuyProducts(result.StarbuyGroups); 9262 PopulateShippingOptions(result); 9263 AddFinancialsToPage(result); 9264 PopulateCurrencyConversion(result.CurrencyConvertedValues); 9265 PopulateCTABubbles(result); 9266 AddMessages(result); 9267 ToggleConditionalUIElements(result); 9268 AddStatefulLoadingSpinner(); 9269 9270 TogglePageLoading(false); 9271 9272 document.dispatchEvent(new CustomEvent('cartupdate', { 9273 detail: result 9274 })); 9275} 9276 9277function CheckStockErrors(result) { 9278 NEWBASKETGLOBALVARS.STOCKERRORSPRESENT = (result.StockErrors.EmptyOrWhitespace() === false); 9279} 9280 9281function PopulateProductArray(result) { 9282 var toReturn = []; 9283 9284 var currentProductIndex = 0, 9285 productCount = result.Products.length; 9286 9287 for (currentProductIndex; currentProductIndex < productCount; currentProductIndex++) { 9288 toReturn.push(result.Products[currentProductIndex]); 9289 } 9290 9291 if (result.StarbuyGroups.length) { 9292 toReturn = Object.keys(result.StarbuyGroups).reduce(function (r, k
9292) { 9293 return toReturn.concat(result.StarbuyGroups[k].ParentItem, result.StarbuyGroups[k].ChildItem); 9294 }, []); 9295 } 9296 9297 return toReturn; 9298} 9299 9300function AddFinancialsToPage(result) { 9301 $('#new-basket-items-total').text(result.MerchandiseTotalFormatted); 9302 $('#new-basket-item-savings').text(result.SavingsFormatted); 9303 $('#new-basket-starbuy-savings').text(result.StarbuySavingsFormatted); 9304 $('#new-basket-total-savings').text(result.TotalSavingsFormatted); 9305 $('#new-basket-items-vat').text(GetTranslation('JavaScriptTranslations', '11NewBasket-VATCalculation')); 9306 $('#new-basket-rewardspointsestimate').html(result.RewardsPointsEstimateAsString); 9307} 9308 9309function PopulateStarbuyProducts(starbuyGroups) { 9310 var productHTML = ''; 9311 if (starbuyGroups.length) { 9312 9313 var currentIndex = 0, 9314 productCount = starbuyGroups.length; 9315 9316 for (currentIndex; currentIndex < productCount; currentIndex++) { 9317 productHTML += '<div class="col-1 new-basket-starbuyparent">'; 9318 productHTML += ReplaceProductTemplatePlaceholders(starbuyGroups[currentIndex].ParentItem); 9319 productHTML += '</div>'; 9320 9321 if (starbuyGroups[currentIndex].ChildItem) { 9322 productHTML += '<div class="col-1 new-basket-starbuychild">'; 9323 productHTML += ReplaceProductTemplatePlaceholders(starbuyGroups[currentIndex].ChildItem); 9324 productHTML += '</div>'; 9325 } 9326 } 9327 9328 $('#new-basket-starbuyitems').html(productHTML); 9329 } 9330} 9331 9332function PopulateNonStarbuyProducts(products, starbuyGroupLength) { 9333 var productHTML = ''; 9334 if (products.length) { 9335 9336 var currentIndex = 0, 9337 productCount = products.length; 9338 9339 for (currentIndex; currentIndex < productCount; currentIndex++) { 9340 productHTML += ReplaceProductTemplatePlaceholders(products[currentIndex]); 9341 } 9342 } 9343 else if (starbuyGroupLength) { 9344 // Don't add an empty cart message if star buy groups aren't empty 9345 } 9346 else { 9347 productHTML = `<div class="col-1 small ctrPad16-top ctrPad8-bottom coRED">${GetTranslation('JavaScriptTranslations', '11NewBasket-EmptyCart')}</div>`; 9348 } 9349 $('#new-basket-standarditems').html(productHTML); 9350} 9351 9352function PopulateShippingOptions(result) { 9353 var shippingHTML = ''; 9354 if (result.AvailableShippingOptions.length && result.MerchandiseTotal > 0) { 9355 9356 var currentIndex = 0, 9357 serviceCount = result.AvailableShippingOptions.length; 9358 9359 for (currentIndex; currentIndex < serviceCount; currentIndex++) { 9360 shippingHTML += ReplaceShippingTemplatePlaceholders(result.AvailableShippingOptions[currentIndex]); 9361 } 9362 } 9363 else { 9364 shippingHTML = `<div class="col-1 small coRED">${GetTranslation('JavaScriptTranslations', '11NewBasket-NoShippingServices')}</div>`; 9365 } 9366 9367 $('#new-basket-shipping').html(shippingHTML); 9368} 9369 9370function PopulateCurrencyConversion(currencies) { 9371 var currencyHTML = ''; 9372 9373 var currenciesPresent = currencies !== null; 9374 9375 $('.new-basket-currency').toggle(currenciesPresent); 9376 9377 if (currenciesPresent) { 9378 for (key in currencies) { 9379 currencyHTML += ReplaceCurrencyTemplatePlaceholders(key, currencies[key]); 9380 } 9381 currencyHTML += `<div class="col-1 ctrMgr16-top small">${GetTranslation('JavaScriptTranslations', '11NewBasket-CurrencyNotice')}</div>` + `<div class="col-1 small"><strong>${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-CurrencyUsedX0CurrencyType'), ecommerceConfig.LocalCurrencyCode)}<strong></div>`; 9382 $('#new-basket-currencytotal').html(currencyHTML); 9383 } 9384} 9385 9386function PopulateCTABubbles(result) { 9387 var ctaBubbleHTML = ''; 9388 9389 if (result.FinanceAvailable) { 9390 ctaBubbleHTML += ReplaceCTABubbleTemplatePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-FinanceAvailable'), 'finance'); 9391 } 9392 9393 var ccActive = result.AvailableShippingOptions.some(function (option) { return option.Name === 'Click & Collect' }); 9394 if (ccActive) { 9395 ctaBubbleHTML += ReplaceCTABubbleTemplatePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-ClickAndCollectAvailable'), 'clickandcollect'); 9396 } 9397 9398 var dpdActive = result.AvailableShippingOptions.some(function (option) { return option.Name === 'DPD Pick-up' }); 9399 if (dpdActive) { 9400 ctaBubbleHTML += ReplaceCTABubbleTemplatePlaceholders(GetTranslation('JavaScriptTranslations', '11NewBasket-DPDAvailable'), 'dpdpickup'); 9401 } 9402 9403 $('#new-basket-bubbles').html(ctaBubbleHTML); 9404} 9405 9406function AddMessages(result) { 9407 $('#new-basket-messages').empty(); 9408 9409 var messageHTML = ''; 9410 9411 if (NEWBASKETGLOBALVARS.STOCKERRORSPRESENT) { 9412 /* Only add the stock error message */ 9413 messageHTML += FormatStockErrorMessage(result.StockErrors); 9414 } 9415 else { 9416 /* Add all other messages */ 9417 messageHTML += CheckAddClickAndCollectOnlyMessage(result.MailOrderAvailable); 9418 } 9419 9420 $('#new-basket-messages').html(messageHTML); 9421} 9422 9423function FormatStockErrorMessage(message) { 9424 var formattedErrorMessage = ''; 9425 9426 if (NEWBASKETGLOBALVARS.STOCKERRORSPRESENT) { 9427 formattedErrorMessage = `<div class="col-1 new-basket-error small zflex-v"><div class="col- flex-grow1">${message}</div><div>` + `<span class="borderi removeborder-top removeborder-left removeborder-right pointer" onclick="FixStockIssues();"><span class="boldfont">${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssues')}</span> <span class="fa icon-arrow-right"></span></span></div></div>`; 9428 } 9429 9430 return formattedErrorMessage; 9431} 9432 9433function CheckAddClickAndCollectOnlyMessage(mailOrderAvailable) { 9434 var ccMessageHTML = ''; 9435 9436 if (!mailOrderAvailable) { 9437 ccMessageHTML = `<div class="col-1 new-basket-info small">${GetTranslation('JavaScriptTranslations', '11NewBasket-ClickAndCollectOnly')}</div>`; 9438 } 9439 9440 return ccMessageHTML; 9441} 9442 9443function ToggleConditionalUIElements(result) { 9444 TogglePaymentButtons(); 9445 $('[data-toggle="finance"]').toggle(result.FinanceAvailable); 9446 $('[data-toggle="rewards"]').toggle(result.RewardsAvailable); 9447 9448 const ccTextEl = $('#cart-cc-description-text'); 9449 ccTextEl.html(result.FinanceAvailable && !checkIfFinanceActiveForClickAndCollect() ? ccTextEl.attr('data-nofinancecc-msg') : ccTextEl.attr('data-standardcc-msg')); 9450 9451 $('[data-toggle="clickandcollect"]').toggle(result.AvailableShippingOptions.some(function (option) { return option.Name === 'Click & Collect' })); 9452 $('[data-toggle="dpdpickup"]').toggle(result.AvailableShippingOptions.some(function (option) { return option.Name === 'DPD Pick-up' })); 9453 $('[data-toggle="paypal"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('PayPal')); 9454 $('[data-toggle="applepay"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('ApplePay')); 9455 $('[data-toggle="googlepay"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('GooglePay') && result.ItemCount > 0); 9456 $('.new-basket-item-savings').toggle(result.MerchandiseTotal > 0 && result.Savings > 0); 9457 $('.new-basket-starbuy-savings').toggle(result.MerchandiseTotal > 0 && result.StarbuySavings > 0); 9458 $('.new-basket-total-savings').toggle(result.MerchandiseTotal > 0 && result.TotalSavings > 0); 9459 $('.basket-items-column-saving').toggle(document.querySelectorAll('.basket-items-column-saving[data-savingvisible="true"]').length > 0); 9460 9461 $('[data-toggle="applepayandpaypal"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('ApplePay') && ecommerceConfig.ActivePaymentMethods.hasOwnProperty('PayPal')); 9462 $('[data-toggle="applepayorpaypal"]').toggle(ecommerceConfig.ActivePaymentMethods.hasOwnProperty('ApplePay') || ecommerceConfig.ActivePaymentMethods.hasOwnProperty('PayPal')); 9463} 9464 9465function TogglePaymentButtons() { 9466 $('#new-basket-paymentoptions .payment-buttons, .applebasket, #paypExpButton').not('[href="#"]').toggle(NEWBASKETGLOBALVARS.STOCKERRORSPRESENT === false); 9467 9468 var stockErrorPanelEl = $('#new-basket-paymentoptions #stock-error-message-warning'); 9469 9470 if (!stockErrorPanelEl.length) { 9471 $('#new-basket-paymentoptions').append(`<div class="col-1 ctrPad16" id="stock-error-message-warning">${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesPrompt')}</div>`); 9472 stockErrorPanelEl = $('#new-basket-paymentoptions #stock-error-message-warning'); 9473 } 9474 9475 stockErrorPanelEl.toggle(NEWBASKETGLOBALVARS.STOCKERRORSPRESENT); 9476} 9477 9478/* UI Functionality */ 9479 9480function IncreaseItemQuantity(cartGuid) { 9481 TogglePageLoading(true); 9482 CitrusStore.CitrusStore.wsCitrusStore.IncreaseItemQuantityMiniBasket(cartGuid, SucceededChangeItemQuantity, FailedChangeItemQuantity); 9483} 9484 9485function DecreaseItemQuantity(cartGuid) { 9486 TogglePageLoading(true); 9487 CitrusStore.CitrusStore.wsCitrusStore.DecreaseItemQuantityMiniBasket(cartGuid, SucceededChangeItemQuantity, FailedChangeItemQuantity); 9488} 9489 9490function RemoveItemFromBasket(cartGuid) { 9491 TogglePageLoading(true); 9492 CitrusStore.CitrusStore.wsCitrusStore.RemoveItemFromCart(cartGuid, SucceededChangeItemQuantity, FailedChangeItemQuantity); 9493} 9494 9495function FixStockIssues() { 9496 9497 var promiseName = 'FixStockErrorsPromise', 9498 messageConfig = GetModularMessageConfig(MODALTYPE_ERROR); 9499 9500 window[promiseName] = $.Deferred(); 9501 9502 messageConfig.Header = GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalTitle'); 9503 messageConfig.Body = `<p><strong>${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalHeading')}</strong></p><p>${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalMessage')}</p><p>${GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalPrompt')}</p>`; 9504 messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalConfirm'); 9505 messageConfig.Footer.Cancel = { 9506 name: GetTranslation('JavaScriptTranslations', '11NewBasket-FixIssuesModalCancel'), 9507 action: 'cancel' 9508 }; 9509 9510 ModularModalMessage(promiseName, messageConfig); 9511 9512 window[promiseName].then(function (val) { 9513 if (val === true) { 9514 TogglePageLoading(true); 9515 CitrusStore.CitrusStore.wsCitrusStore.FixMiniBasketItems(SucceededLoadNewBasket, FailedChangeItemQuantity); 9516 } 9517 });
9518} 9519 9520function GenericNewCartError(message) { 9521 TogglePageLoading(false); 9522 9523 var promiseName = 'GenericNewCartErrorPromise', 9524 messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION); 9525 9526 window[promiseName] = $.Deferred(); 9527 9528 messageConfig.Header = GetTranslation('JavaScriptTranslations', '11NewBasket-ErrorModalTitle'); 9529 messageConfig.Body = message; 9530 messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '11NewBasket-ErrorModalConfirm'); 9531 9532 ModularModalMessage(promiseName, messageConfig); 9533} 9534 9535function SucceededChangeItemQuantity(result) { 9536 9537 if (result.ActionResultMessage !== '') { 9538 FailedChangeItemQuantity(result); 9539 } 9540 9541 SucceededLoadNewBasket(result); 9542} 9543 9544function FailedChangeItemQuantity(result) { 9545 TogglePageLoading(false); 9546 9547 var promiseName = 'FailedChangeItemQuantityPromise', 9548 messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION); 9549 9550 window[promiseName] = $.Deferred(); 9551 9552 messageConfig.Header = GetTranslation('JavaScriptTranslations', '11NewBasket-FailedModalTitle'); 9553 messageConfig.Body = (result.ActionResultMessage ? result.ActionResultMessage : result._message); 9554 messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '11NewBasket-FailedModalConfirm'); 9555 9556 ModularModalMessage(promiseName, messageConfig); 9557} 9558 9559function LoadCheckoutButtonsNewCart() { 9560 TogglePaymentButtons(); 9561 if (NEWBASKETGLOBALVARS.STOCKERRORSPRESENT === false) { 9562 9563 var buttonSchema = GetActiveWorkflowButtons(); 9564 for (var i = 0; i < buttonSchema.length; i++) { 9565 if (buttonSchema[i] && (buttonSchema[i].name.indexOf('citruspaywallet') > -1 || buttonSchema[i].name.toLowerCase().indexOf('citruspaystripeclearpayafterpay') > -1)) { 9566 delete buttonSchema[i]; 9567 } 9568 } 9569 var $target = $('#ShoppingCartButtonPlaceholder'); 9570 $target.replaceWith(GetCheckoutWorkflowButtonHtml(buttonSchema, $target.attr('data-href'))); 9571 9572 initPayPalExpress('#paypExpButton'); 9573 CheckIfKlarnaAvailable(); 9574 CheckIfFinanceAvailable() 9575 .then(function (value) { 9576 $('[data-toggle="finance"]').toggle(value); 9577 }); 9578 9579 $('.payment-buttons') 9580 .on('click', function () { 9581 document.dispatchEvent(new CustomEvent('PaymentButtonClicked', { detail: this })); 9582 }); 9583 } 9584} 9585 9586function StarBuysExplainerModal(offerTitleApplied) { 9587 9588 var promiseName = 'StarBuysExplainerModalPromise', 9589 messageConfig = GetModularMessageConfig(MODALTYPE_INFORMATION); 9590 9591 window[promiseName] = $.Deferred(); 9592 9593 messageConfig.Header = GetTranslation('JavaScriptTranslations', '11NewBasket-StarBuysChildOfferExplainer-Title'); 9594 messageConfig.Body = `<p><strong>${offerTitleApplied}</strong></p><div>${GetTranslation('JavaScriptTranslations', '11NewBasket-StarBuysChildOfferExplainer-AlwaysTheBestOffer')}</div>`; 9595 messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', 'DevJsContinueButton'); 9596 9597 ModularModalMessage(promiseName, messageConfig); 9598} 9599 9600function AddStatefulLoadingSpinner() { 9601 var spinnerId = 'stateful-loader-cart', 9602 spinnerHtml = '<div id="' + spinnerId + '" class="col-1 bgSemiDark zflex-v pos-fix height-100-vh zindex-100" style="top:0;left:0;right:0;bottom:0;display:none;"><div class="col-1 centralise ctrPad32"><div class="cart-lds-ellipsis"><div data-loadingdot="1"></div><div data-loadingdot="2"></div><div data-loadingdot="3"></div><div data-loadingdot="4"></div></div></div></div>'; 9603 9604 if ($('#' + spinnerId).length === 0) { 9605 $('body').append(spinnerHtml); 9606 } 9607} 9608 9609function TogglePageLoading(loadingState) { 9610 if ($('#stateful-loader-cart').is(":visible") 9611 && !loadingState) { 9612 9613 $('#stateful-loader-cart').fadeOut(150); 9614 9615 } 9616 else if ($('#stateful-loader-cart').is(":hidden") 9617 && loadingState) { 9618 9619 $('#stateful-loader-cart').fadeIn(150); 9620 } 9621 else { 9622 /* Do Nothing */ 9623 } 9624 9625} 9626 9627/** 9628 * Check if finance active for click and collect orders. 9629 * @returns true if the finance payment method is active, false if not. 9630 */ 9631function checkIfFinanceActiveForClickAndCollect() { 9632 9633 if (ecommerceConfig.FinanceSetup.FinanceOnClickAndCollectOrders) { 9634 for (const key in ecommerceConfig.ActivePaymentMethods) { 9635 9636 const paymentMethod = ecommerceConfig.ActivePaymentMethods[key]; 9637 9638 if (paymentMethod.Type == 'Finance') { 9639 return true; 9640 } 9641 9642 } 9643 } 9644 9645 return false; 9646} 9647 9648/* Helpers */ 9649 9650function ReplaceProductTemplatePlaceholders(productData) { 9651 return NEWBASKETGLOBALVARS.PRODUCTTEMPLATE.replace(/\[\[PRODUCTURL\]\]/gm, productData.ProductURL) 9652 .replace(/\[\[PRODUCTID\]\]/gm, productData.ProductID) 9653 .replace(/\[\[STARBUYCHILDID\]\]/gm, productData.StarbuyChildID) 9654 .replace(/\[\[STARBUYPARENTID\]\]/gm, productData.StarbuyParentID) 9655 .replace(/\[\[CARTITEMID\]\]/gm, productData.CartItemId) 9656 .replace(/\[\[IMGURL\]\]/gm, productData.Image) 9657 .replace(/\[\[QTY\]\]/gm, productData.Quantity) 9658 .replace(/\[\[NAME\]\]/gm, productData.Name) 9659 .replace(/\[\[PRODUCTCODE\]\]/gm, productData.ProductCode) 9660 .replace(/\[\[ATTRNAME\]\]/gm, productData.AttributeName) 9661 .replace(/\[\[ATTRCODE\]\]/gm, productData.AttributeCode) 9662 .replace(/\[\[SALEPRICE\]\]/gm, (productData.IsStarbuyChild ? productData.StarbuyPriceFormatted : productData.SalePriceFormatted)) 9663 .replace(/\[\[SAVINGS\]\]/gm, productData.SavingsFormatted) 9664 .replace(/\[\[SAVINGSVISIBLE\]\]/gm, productData.SavingsVisible) 9665 .replace(/\[\[ITEMSUBTOTAL\]\]/gm, productData.ItemSubTotalFormatted) 9666 .replace(/\[\[STARBUYCHILD\]\]/gm, productData.IsStarbuyChild) 9667 .replace(/\[\[PROMOTEXT\]\]/gm, productData.StarbuyPromoText) 9668 .replace(/\[\[PROMOMESSAGE\]\]/gm, productData.PromoMessage)
9669 .replace(/\[\[STARBUYSOFFERTITLE\]\]/gm, productData.StarbuyPromoText) 9670 .replace(/\[\[PREORDERMESSAGE\]\]/gm, productData.PreorderMessage) 9671 .replace(/\[\[LEADTIMEMESSAGE\]\]/gm, productData.LeadtimeMessage) 9672 .replace(/\[\[CLICKANDCOLLECTONLYMESSAGE\]\]/gm, productData.ClickAndCollectOnly ? GetTranslation('JavaScriptTranslations', '11NewBasket-ItemClickAndCollectOnly') : '') 9673 .replace(/\[\[STRINGIFIEDITEMOBJECT\]\]/gm, productData.CartItemId) 9674 .replace(/\[\[REWARDSPOINTSESTIMATEASSTRING\]\]/gm, productData.RewardsPointsEstimate === 0 ? '' : productData.RewardsPointsEstimateAsString); 9675} 9676 9677function ReplaceShippingTemplatePlaceholders(serviceData) { 9678 return NEWBASKETGLOBALVARS.SHIPPINGTEMPLATE.replace(/\[\[NAME\]\]/gm, serviceData.Name) 9679 .replace(/\[\[PRICE\]\]/gm, serviceData.CustomerPrice) 9680 .replace(/\[\[MSG1\]\]/gm, serviceData.DispatchMessage) 9681 .replace(/\[\[MSG2\]\]/gm, serviceData.EstimatedDeliveryMessage); 9682} 9683 9684function ReplaceCurrencyTemplatePlaceholders(abbreviation, value) { 9685 return NEWBASKETGLOBALVARS.CURRENCYTEMPLATE.replace(/\[\[ABBREV\]\]/gm, abbreviation) 9686 .replace(/\[\[VALUE\]\]/gm, value); 9687} 9688 9689function ReplaceCTABubbleTemplatePlaceholders(message, toggleValue) { 9690 return NEWBASKETGLOBALVARS.CTABUBBLETEMPLATE.replace(/\[\[MESSAGE\]\]/gm, message) 9691 .replace(/\[\[TOGGLE\]\]/gm, toggleValue); 9692} 9693 9694function GetProductTemplate() { 9695 return '<div class="col-1 basket-itemrow-wrapper small border3 removeborder-top removeborder-left removeborder-right" data-promotext="[[PROMOTEXT]]" data-childid="[[STARBUYCHILDID]]" data-parentid="[[STARBUYPARENTID]]" data-producturl="[[PRODUCTURL]]" data-cartitem="[[CARTITEMID]]" data-productid="[[PRODUCTID]]">' + 9696 '<div class="col-1 basket-itemrow">' + 9697 '<div class="basket-items-column-product flex-grow1 zflex-v">' + 9698 '<span class="basket-items-column-img"><img src="[[IMGURL]]?width=172&height=172&format=webp&bgcolor=ffffff" width="84" height="84" /></span>' + 9699 '<div class="flex-grow1 ">' + 9700 '<span class="col-1 tt-uppercase x-small">[[PRODUCTCODE]]</span>' + 9701 '<a href="[[PRODUCTURL]]" class="coStandard normal">[[NAME]]</a>' + 9702 '<span class="col-1 rewards-item-estimate" data-rewardspointsestimateasstring="[[REWARDSPOINTSESTIMATEASSTRING]]">[[REWARDSPOINTSESTIMATEASSTRING]]</span>' + 9703 '<span class="col-1 tt-uppercase x-small" data-matrix="[[ATTRNAME]]">[[ATTRNAME]] ([[ATTRCODE]])</span>' + 9704 '<span class="col-1 coStarbuys small" data-msg="[[PROMOMESSAGE]]">[[PROMOMESSAGE]]</span>' + 9705 '<span class="col-1"><span class="small pointer" data-starbuytitle="[[STARBUYSOFFERTITLE]]" onclick="StarBuysExplainerModal(\'[[STARBUYSOFFERTITLE]]\')"><span>[[STARBUYSOFFERTITLE]]</span><span class="starbuy-child-offer-explainer">' + GetTranslation('JavaScriptTranslations', '11NewBasket-StarBuysChildOfferExplainer-Title') +' <i class="icon fa icon-maximize x-small"></i></span></span>' + 9706 '<div class="col-1"><span class="col- bgLRed coRED ctrMgr8-top ctrPad8 lh--100-perc small" data-msg="[[LEADTIMEMESSAGE]]" data-msgtype="LEADTIMEMESSAGE">[[LEADTIMEMESSAGE]]</span></div>' + 9707 '<div class="col-1"><span class="col- bgLBlue coBlue ctrMgr8-top ctrPad8 lh--100-perc small" data-msg="[[PREORDERMESSAGE]]" data-msgtype="PREORDERMESSAGE">[[PREORDERMESSAGE]]</span></div>' + 9708 '<div class="col-1"><span class="col- bgLRed coRED ctrMgr8-top ctrPad8 lh--100-perc small" data-msg="[[CLICKANDCOLLECTONLYMESSAGE]]">[[CLICKANDCOLLECTONLYMESSAGE]]</span></div>' + 9709 '</div>' + 9710 '</div>' + 9711 '<div class="basket-items-column-price">' + 9712 '<span class="col-">[[SALEPRICE]]</span>' + 9713 '</div>' + 9714 '<div class="basket-items-column-saving" data-savingvisible="[[SAVINGSVISIBLE]]">' + 9715 '<span class="coRED" data-savingvisible="[[SAVINGSVISIBLE]]">[[SAVINGS]]</span>' + 9716 '</div>' + 9717 '<div class="basket-items-column-qty">' + 9718 '[[QTY]]' + 9719 '</div>' + 9720 '<div class="basket-items-column-mng">' + 9721 '<span class="basket-items-ctrl basket-items---minus borderradiu
9721s x-small transition" onclick="DecreaseItemQuantity(\'[[STRINGIFIEDITEMOBJECT]]\');"></span>' + 9722 '<span class="basket-items-ctrl basket-items---plus borderradius x-small transition" onclick="IncreaseItemQuantity(\'[[STRINGIFIEDITEMOBJECT]]\');"></span>' + 9723 '<span class="basket-items-ctrl basket-items---remove borderradius x-small transition" onclick="RemoveItemFromBasket(\'[[STRINGIFIEDITEMOBJECT]]\');"></span>' + 9724 '</div>' + 9725 '<div class="basket-items-column-total">[[ITEMSUBTOTAL]]</div>' + 9726 '</div>' + 9727 '<div class="col-1 basket-itemrow-offers">' + 9728 '</div>' + 9729 '</div>'; 9730} 9731 9732function GetShippingOptionTemplate() { 9733 return '<div class="col-1 basket-shippingrow border3 removeborder-top removeborder-left removeborder-right">' + 9734 '<div class="col-1 zflex-s">' + 9735 '<span class="flex-grow1">[[NAME]]</span>' + 9736 '<span class="coStandard basket-shippingrow-price">[[PRICE]]</span>' + 9737 '</div>' + 9738 '<span class="col-1 small">[[MSG1]]</span>' + 9739 '<span class="col-1 small coRED">[[MSG2]]</span>' + 9740 '</div>'; 9741} 9742 9743function GetCurrencyTemplate() { 9744 return '<div class="col-1 basket-convertedtotal zflex-v" title="Currency: [[ABBREV]]" alt="Currency: [[ABBREV]]">' + 9745 '<div class="isoFlag" id="[[ABBREV]]"></div>' + 9746 '<span class="col-1">[[VALUE]]</span>' + 9747 '</div>'; 9748} 9749 9750function GetCTABubbleTemplate() { 9751 return '<span class="new-basket-bubble borderradius colorwhite centralise boldfont small flex-grow1 zflex-v" data-toggle="[[TOGGLE]]" style="display: none;"><span>[[MESSAGE]]</span></span>'; 9752} 9753/** 9754 * The name of the Promise which the Share Cart modal functionality will use to call-back to. 9755 */ 9756var shareCartPromiseName = 'CartV2ShareBasketModal'; 9757 9758/** 9759 * The name of the Cloud POS product/feature 9760 */ 9761const cartShareProductName = () => GetTranslation('JavaScriptTranslations', '12ShareBasket-Title'); 9762 9763/** 9764 * The text for the "confirm" button link in the modal. 9765 */ 9766const cartShareLinkText = () => GetTranslation('JavaScriptTranslations', '12ShareBasket-GetLink'); 9767 9768/** 9769 * The CloudPOS image header in the modal. 9770 */ 9771var cartShareImageTag = '<img src="/platformlayout/citruslime-productlogo-cloudpos.png" height="48" style="width: auto !important">'; 9772 9773/** 9774 * Is the "Share Cart" functionality active on the page. 9775 * Prevents the spamming of SHIFT+S to add superfluous DOM nodes. 9776 */ 9777var shareCartVisible = false; 9778 9779window[shareCartPromiseName] = $.Deferred(); 9780 9781/** 9782 * Show a modal on the Cart page from which a "Saved Cart" can be generated. 9783 * @returns {void} 9784 */ 9785function ShowShareModal() 9786{ 9787 if (!shareCartVisible) { 9788 var messageConfig = GetModularMessageConfig(MODALTYPE_CLPOS); 9789 messageConfig.Header = cartShareImageTag; 9790 messageConfig.Body = `<h2>${cartShareProductName()}</h2><p>${GetTranslation('JavaScriptTranslations', '12ShareBasket-Heading')}</p><p>${ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '12ShareBasket-PromptX0ButtonX1Tool'), cartShareLinkText(), cartShareProductName())}</p>`; 9791 messageConfig.Footer.Confirm.name = cartShareLinkText(); 9792 messageConfig.Footer.Cancel = { 9793 name: GetTranslation('JavaScriptTranslations', '12ShareBasket-Cancel'), 9794 action: 'reject' 9795 }; 9796 9797 ModularModalMessage(shareCartPromiseName, messageConfig); 9798 shareCartVisible = true; 9799 9800 $.when(window[shareCartPromiseName]) 9801 .done(function (createLink) 9802 { 9803 if (createLink) { 9804 ShowShareLinkResult(); 9805 } 9806 9807 shareCartVisible = false; 9808 }) 9809 .then(function () 9810 { 9811 window[shareCartPromiseName] = $.Deferred(); 9812 }); 9813 } 9814} 9815 9816/** 9817 * Show a modal with a generated basket link which can be copied to clipboard. 9818 * @returns {void} 9819 */ 9820function ShowShareLinkResult() 9821{ 9822 GetDuplicateBasket(function (newShareLink) 9823 { 9824 var promiseName = 'newShareLinkcreated', 9825 messageConfig = GetModularMessageConfig(MODALTYPE_CLPOS); 9826 9827 window[promiseName] = $.Deferred(); 9828 9829 messageConfig.Header = cartShareImageTag; 9830 messageConfig.Body = `<h2>${cartShareProductName()}</h2><p class="boldfont">${GetTranslation('JavaScriptTranslations', '12ShareBasket-CopyLink')}</p><div class="col-1 zflex-s share-banner-copy"><input value="${newShareLink}" class="flex-grow1"><span onclick="CopyAdjescentInputFieldValue(this); return false;"></span></div>`; 9831 messageConfig.Footer.Confirm.name = GetTranslation('JavaScriptTranslations', '12ShareBasket-Confirm'); 9832 ModularModalMessage(promiseName, messageConfig); 9833 });
9834} 9835 9836/** 9837 * Copies the value of the first input sibling, of the element provided to "clickElement" 9838 * @param {HTMLElement} clickedElement The element which we'll use to find the input sibling of and copy its value. 9839 * @returns {void} 9840 */ 9841function CopyAdjescentInputFieldValue(clickedElement) 9842{ 9843 var inputElement = clickedElement.parentElement.getElementsByTagName('input')[0]; 9844 inputElement.select(); 9845 inputElement.setSelectionRange(0, 99999); 9846 document.execCommand("copy"); 9847 9848 var newElement = document.createElement('div'); 9849 newElement.classList.add('col-1', 'alert', 'info'); 9850 newElement.innerText = ReplacePlaceholders(GetTranslation('JavaScriptTranslations', '12ShareBasket-CopiedToClipboardX0Tool'), cartShareProductName()); 9851 newElement.style.userSelect = 'none'; 9852 9853 clickedElement.parentElement.after(newElement); 9854 setTimeout(function () 9855 { 9856 clickedElement.parentElement.parentElement.removeChild(newElement); 9857 }, 5000); 9858} 9859 9860/** 9861 * Event listener which listens for key-down events and when SHIFT+S is pressed, it runs ShowShareModal(); 9862 * Only runs if the pathname of the page is /cart/ or /cart. 9863 * @returns {void} 9864 */ 9865if (window.location.pathname.toLowerCase() == '/cart/' || window.location.pathname.toLowerCase() == '/cart') { 9866 document.addEventListener("keydown", function (event) 9867 { 9868 var isShiftAndSKey = event.shiftKey && event.which == 83; 9869 9870 if (isShiftAndSKey) 9871 { 9872 ShowShareModal(); 9873 } 9874 }); 9875} 9876let viewCartHasBeenCalled = false; 9877 9878document.addEventListener('cartupdate', function (event) { 9879 const eventData = event.detail; 9880 9881 if (ecommerceConfig.AnalyticsScheme == 'GA4' && !viewCartHasBeenCalled) { 9882 9883 const ga4Queue = new GoogleAnalyticsEventQueue(); 9884 ga4Queue.enqueueEvent([ 9885 'view_cart', 9886 { 9887 "currency": ecommerceConfig.LocalCurrencyCode, 9888 "value": eventData.MerchandiseTotal, 9889 "items": GetGa4CartItemData(eventData) 9890 } 9891 ]); 9892 9893 viewCartHasBeenCalled = true; 9894 } 9895}); 9896 9897function GetGa4CartItemData(eventData) { 9898 const ga4ItemArray = []; 9899 9900 const items = GetCartItemsFromEvent(eventData); 9901 9902 for (const item of items) { 9903 ga4ItemArray.push({ 9904 "item_id": item.ProductCode, 9905 "item_name": item.Name, 9906 "item_variant": item.AttributeName, 9907 "price": item.SalePrice, 9908 "quantity": item.Quantity 9909 }); 9910 } 9911 9912 return ga4ItemArray; 9913} 9914 9915function GetCartItemsFromEvent(eventData) { 9916 var toReturn = []; 9917 9918 var currentProductIndex = 0, 9919 productCount = eventData.Products.length; 9920 9921 for (currentProductIndex; currentProductIndex < productCount; currentProductIndex++) { 9922 toReturn.push(eventData.Products[currentProductIndex]); 9923 } 9924 9925 if (eventData.StarbuyGroups.length) { 9926 toReturn = Object.keys(eventData.StarbuyGroups).reduce(function (r, k) { 9927 return toReturn.concat(eventData.StarbuyGroups[k].ParentItem, eventData.StarbuyGroups[k].ChildItem); 9928 }, []); 9929 } 9930 9931 return toReturn; 9932} 9933function map() { 9934 var map; 9935 var bounds = new google.maps.LatLngBounds(); 9936 var mapOptions = { 9937 mapTypeId: 'roadmap', 9938 zoomControl: true, 9939 scaleControl: true, 9940 scrollwheel: false, 9941 disableDoubleClickZoom: true 9942 }; 9943 9944 // Display a map on the page 9945 map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); 9946 9947 $.ajax({ 9948 type: "GET", 9949 async: true, 9950 url: "/pages/shops/map.xml", 9951 success: 9952 function (xml) { 9953 var id 9954 var infoWindowContent = []; 9955 var places = xml.documentElement.getElementsByTagName("places"); 9956 var output = "<div class='markers ctrPad32 columnFlow'>"; 9957 var labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 9958 var labelIndex = 0; 9959 var trimed = window.location.pathname.split("/")[3]; 9960 var part = trimed.substring(10); 9961 for( i = 0; i < places.length; i++ ) { 9962 var name = places[i].getAttribute('name'); 9963 var lat = places[i].getAttribute('latitude'); 9964 var long = places[i].getAttribute('longitude'); 9965 var tel = places[i].getAttribute('tel'); 9966 var desc = places[i].getAttribute('desc'); 9967 var address = places[i].getAttribute('address'); 9968 var email = places[i].getAttribute('email'); 9969 var position = new google.maps.LatLng(lat, long); 9970 bounds.extend(position); 9971 marker = new google.maps.Marker({ 9972 position: position, 9973 label: labels[labelIndex++ % labels.length], 9974 map: map, 9975 title: name 9976 }); 9977 9978 infoWindowContent.push({name: name, desc: desc, tel: tel, address: address, email: email}); 9979 9980 9981 //console.log(infoWindowContent) 9982 9983 // Allow each marker to have an info window 9984 google.maps.event.addListener(marker, 'click', (function(marker, i) { 9985 return function() { 9986 infoWindow.setContent("<div class='ctrPad32'><a href='/pages/shops/cycles-uk-"+infoWindowContent[i].name+"'><h2>"+infoWindowContent[i].name+"</h2><p>"+infoWindowContent[i].desc+"<br><br>View our "+infoWindowContent[i].name+" Store Now</p></a></div>"); 9987 infoWindow.open(map, marker); 9988 } 9989 })(marker, i)); 9990 output=output+"<a href='/pages/shops/cycles-uk-"+name+"' class='store'>" 9991 output=output+"<div class='mpin'>
9991"+labels[labelIndex-1 % labels.length]+"</div>" 9992 output=output+"<div class='mname'>"+name+"</div>" 9993 output=output+"<div class='mtel'>"+tel+"</div>" 9994 output=output+"<div class='mdesc'>"+desc+"</div>" 9995 output=output+"</a>" 9996 9997 // Automatically center the map fitting all markers on the screen 9998 map.fitBounds(bounds); 9999 if(infoWindowContent[i].name.toLowerCase() === part) { 10000 PageId = i 10001 } 10002 } 10003 $(".stores").append(output); 10004 output=output+"</div>"; 10005 $(".addres").append(infoWindowContent[PageId].address) 10006 $(".tel").append(infoWindowContent[PageId].tel) 10007 $(".name").append(infoWindowContent[PageId].name) 10008 $(".email").append(infoWindowContent[PageId].email); 10009 } 10010 }); 10011 10012 // Display multiple markers on a map 10013 var infoWindow = new google.maps.InfoWindow(), marker, i; 10014 10015 10016 // Override our map zoom level once our fitBounds function runs (Make sure it only runs once) 10017 var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event) { 10018 this.setZoom(8); 10019 google.maps.event.removeListener(boundsListener); 10020 }); 10021}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.