/* Minification failed. Returning unminified contents.
(2923,23-24): run-time error JS1195: Expected expression: >
 */
/*
 Copyright (C) Federico Zivolo 2018
 Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
 */
(function (e, t) { 'object' == typeof exports && 'undefined' != typeof module ? module.exports = t() : 'function' == typeof define && define.amd ? define(t) : e.Popper = t() })(this, function () { 'use strict'; function e(e) { return e && '[object Function]' === {}.toString.call(e) } function t(e, t) { if (1 !== e.nodeType) return []; var o = getComputedStyle(e, null); return t ? o[t] : o } function o(e) { return 'HTML' === e.nodeName ? e : e.parentNode || e.host } function n(e) { if (!e) return document.body; switch (e.nodeName) { case 'HTML': case 'BODY': return e.ownerDocument.body; case '#document': return e.body; }var i = t(e), r = i.overflow, p = i.overflowX, s = i.overflowY; return /(auto|scroll|overlay)/.test(r + s + p) ? e : n(o(e)) } function r(e) { if (!e) return document.documentElement; for (var o = ie(10) ? document.body : null, n = e.offsetParent; n === o && e.nextElementSibling;)n = (e = e.nextElementSibling).offsetParent; var i = n && n.nodeName; return i && 'BODY' !== i && 'HTML' !== i ? -1 !== ['TD', 'TABLE'].indexOf(n.nodeName) && 'static' === t(n, 'position') ? r(n) : n : e ? e.ownerDocument.documentElement : document.documentElement } function p(e) { var t = e.nodeName; return 'BODY' !== t && ('HTML' === t || r(e.firstElementChild) === e) } function s(e) { return null === e.parentNode ? e : s(e.parentNode) } function d(e, t) { if (!e || !e.nodeType || !t || !t.nodeType) return document.documentElement; var o = e.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_FOLLOWING, n = o ? e : t, i = o ? t : e, a = document.createRange(); a.setStart(n, 0), a.setEnd(i, 0); var l = a.commonAncestorContainer; if (e !== l && t !== l || n.contains(i)) return p(l) ? l : r(l); var f = s(e); return f.host ? d(f.host, t) : d(e, s(t).host) } function a(e) { var t = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : 'top', o = 'top' === t ? 'scrollTop' : 'scrollLeft', n = e.nodeName; if ('BODY' === n || 'HTML' === n) { var i = e.ownerDocument.documentElement, r = e.ownerDocument.scrollingElement || i; return r[o] } return e[o] } function l(e, t) { var o = 2 < arguments.length && void 0 !== arguments[2] && arguments[2], n = a(t, 'top'), i = a(t, 'left'), r = o ? -1 : 1; return e.top += n * r, e.bottom += n * r, e.left += i * r, e.right += i * r, e } function f(e, t) { var o = 'x' === t ? 'Left' : 'Top', n = 'Left' == o ? 'Right' : 'Bottom'; return parseFloat(e['border' + o + 'Width'], 10) + parseFloat(e['border' + n + 'Width'], 10) } function m(e, t, o, n) { return Q(t['offset' + e], t['scroll' + e], o['client' + e], o['offset' + e], o['scroll' + e], ie(10) ? o['offset' + e] + n['margin' + ('Height' === e ? 'Top' : 'Left')] + n['margin' + ('Height' === e ? 'Bottom' : 'Right')] : 0) } function h() { var e = document.body, t = document.documentElement, o = ie(10) && getComputedStyle(t); return { height: m('Height', e, t, o), width: m('Width', e, t, o) } } function c(e) { return de({}, e, { right: e.left + e.width, bottom: e.top + e.height }) } function g(e) { var o = {}; try { if (ie(10)) { o = e.getBoundingClientRect(); var n = a(e, 'top'), i = a(e, 'left'); o.top += n, o.left += i, o.bottom += n, o.right += i } else o = e.getBoundingClientRect() } catch (t) { } var r = { left: o.left, top: o.top, width: o.right - o.left, height: o.bottom - o.top }, p = 'HTML' === e.nodeName ? h() : {}, s = p.width || e.clientWidth || r.right - r.left, d = p.height || e.clientHeight || r.bottom - r.top, l = e.offsetWidth - s, m = e.offsetHeight - d; if (l || m) { var g = t(e); l -= f(g, 'x'), m -= f(g, 'y'), r.width -= l, r.height -= m } return c(r) } function u(e, o) { var i = 2 < arguments.length && void 0 !== arguments[2] && arguments[2], r = ie(10), p = 'HTML' === o.nodeName, s = g(e), d = g(o), a = n(e), f = t(o), m = parseFloat(f.borderTopWidth, 10), h = parseFloat(f.borderLeftWidth, 10); i && 'HTML' === o.nodeName && (d.top = Q(d.top, 0), d.left = Q(d.left, 0)); var u = c({ top: s.top - d.top - m, left: s.left - d.left - h, width: s.width, height: s.height }); if (u.marginTop = 0, u.marginLeft = 0, !r && p) { var b = parseFloat(f.marginTop, 10), y = parseFloat(f.marginLeft, 10); u.top -= m - b, u.bottom -= m - b, u.left -= h - y, u.right -= h - y, u.marginTop = b, u.marginLeft = y } return (r && !i ? o.contains(a) : o === a && 'BODY' !== a.nodeName) && (u = l(u, o)), u } function b(e) { var t = 1 < arguments.length && void 0 !== arguments[1] && arguments[1], o = e.ownerDocument.documentElement, n = u(e, o), i = Q(o.clientWidth, window.innerWidth || 0), r = Q(o.clientHeight, window.innerHeight || 0), p = t ? 0 : a(o), s = t ? 0 : a(o, 'left'), d = { top: p - n.top + n.marginTop, left: s - n.left + n.marginLeft, width: i, height: r }; return c(d) } function y(e) { var n = e.nodeName; return 'BODY' === n || 'HTML' === n ? !1 : 'fixed' === t(e, 'position') || y(o(e)) } function w(e) { if (!e || !e.parentElement || ie()) return document.documentElement; for (var o = e.parentElement; o && 'none' === t(o, 'transform');)o = o.parentElement; return o || document.documentElement } function E(e, t, i, r) { var p = 4 < arguments.length && void 0 !== arguments[4] && arguments[4], s = { top: 0, left: 0 }, a = p ? w(e) : d(e, t); if ('viewport' === r) s = b(a, p); else { var l; 'scrollParent' === r ? (l = n(o(t)), 'BODY' === l.nodeName && (l = e.ownerDocument.documentElement)) : 'window' === r ? l = e.ownerDocument.documentElement : l = r; var f = u(l, a, p); if ('HTML' === l.nodeName && !y(a)) { var m = h(), c = m.height, g = m.width; s.top += f.top - f.marginTop, s.bottom = c + f.top, s.left += f.left - f.marginLeft, s.right = g + f.left } else s = f } return s.left += i, s.top += i, s.right -= i, s.bottom -= i, s } function v(e) { var t = e.width, o = e.height; return t * o } function x(e, t, o, n, i) { var r = 5 < arguments.length && void 0 !== arguments[5] ? arguments[5] : 0; if (-1 === e.indexOf('auto')) return e; var p = E(o, n, r, i), s = { top: { width: p.width, height: t.top - p.top }, right: { width: p.right - t.right, height: p.height }, bottom: { width: p.width, height: p.bottom - t.bottom }, left: { width: t.left - p.left, height: p.height } }, d = Object.keys(s).map(function (e) { return de({ key: e }, s[e], { area: v(s[e]) }) }).sort(function (e, t) { return t.area - e.area }), a = d.filter(function (e) { var t = e.width, n = e.height; return t >= o.clientWidth && n >= o.clientHeight }), l = 0 < a.length ? a[0].key : d[0].key, f = e.split('-')[1]; return l + (f ? '-' + f : '') } function O(e, t, o) { var n = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null, i = n ? w(t) : d(t, o); return u(o, i, n) } function L(e) { var t = getComputedStyle(e), o = parseFloat(t.marginTop) + parseFloat(t.marginBottom), n = parseFloat(t.marginLeft) + parseFloat(t.marginRight), i = { width: e.offsetWidth + n, height: e.offsetHeight + o }; return i } function S(e) { var t = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; return e.replace(/left|right|bottom|top/g, function (e) { return t[e] }) } function T(e, t, o) { o = o.split('-')[0]; var n = L(e), i = { width: n.width, height: n.height }, r = -1 !== ['right', 'left'].indexOf(o), p = r ? 'top' : 'left', s = r ? 'left' : 'top', d = r ? 'height' : 'width', a = r ? 'width' : 'height'; return i[p] = t[p] + t[d] / 2 - n[d] / 2, i[s] = o === s ? t[s] - n[a] : t[S(s)], i } function D(e, t) { return Array.prototype.find ? e.find(t) : e.filter(t)[0] } function C(e, t, o) { if (Array.prototype.findIndex) return e.findIndex(function (e) { return e[t] === o }); var n = D(e, function (e) { return e[t] === o }); return e.indexOf(n) } function N(t, o, n) { var i = void 0 === n ? t : t.slice(0, C(t, 'name', n)); return i.forEach(function (t) { t['function'] && console.warn('`modifier.function` is deprecated, use `modifier.fn`!'); var n = t['function'] || t.fn; t.enabled && e(n) && (o.offsets.popper = c(o.offsets.popper), o.offsets.reference = c(o.offsets.reference), o = n(o, t)) }), o } function k() { if (!this.state.isDestroyed) { var e = { instance: this, styles: {}, arrowStyles: {}, attributes: {}, flipped: !1, offsets: {} }; e.offsets.reference = O(this.state, this.popper, this.reference, this.options.positionFixed), e.placement = x(this.options.placement, e.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding), e.originalPlacement = e.placement, e.positionFixed = this.options.positionFixed, e.offsets.popper = T(this.popper, e.offsets.reference, e.placement), e.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute', e = N(this.modifiers, e), this.state.isCreated ? this.options.onUpdate(e) : (this.state.isCreated = !0, this.options.onCreate(e)) } } function P(e, t) { return e.some(function (e) { var o = e.name, n = e.enabled; return n && o === t }) } function W(e) { for (var t = [!1, 'ms', 'Webkit', 'Moz', 'O'], o = e.charAt(0).toUpperCase() + e.slice(1), n = 0; n < t.length; n++) { var i = t[n], r = i ? '' + i + o : e; if ('undefined' != typeof document.body.style[r]) return r } return null } function B() { return this.state.isDestroyed = !0, P(this.modifiers, 'applyStyle') && (this.popper.removeAttribute('x-placement'), this.popper.style.position = '', this.popper.style.top = '', this.popper.style.left = '', this.popper.style.right = '', this.popper.style.bottom = '', this.popper.style.willChange = '', this.popper.style[W('transform')] = ''), this.disableEventListeners(), this.options.removeOnDestroy && this.popper.parentNode.removeChild(this.popper), this } function H(e) { var t = e.ownerDocument; return t ? t.defaultView : window } function A(e, t, o, i) { var r = 'BODY' === e.nodeName, p = r ? e.ownerDocument.defaultView : e; p.addEventListener(t, o, { passive: !0 }), r || A(n(p.parentNode), t, o, i), i.push(p) } function I(e, t, o, i) { o.updateBound = i, H(e).addEventListener('resize', o.updateBound, { passive: !0 }); var r = n(e); return A(r, 'scroll', o.updateBound, o.scrollParents), o.scrollElement = r, o.eventsEnabled = !0, o } function M() { this.state.eventsEnabled || (this.state = I(this.reference, this.options, this.state, this.scheduleUpdate)) } function F(e, t) { return H(e).removeEventListener('resize', t.updateBound), t.scrollParents.forEach(function (e) { e.removeEventListener('scroll', t.updateBound) }), t.updateBound = null, t.scrollParents = [], t.scrollElement = null, t.eventsEnabled = !1, t } function R() { this.state.eventsEnabled && (cancelAnimationFrame(this.scheduleUpdate), this.state = F(this.reference, this.state)) } function U(e) { return '' !== e && !isNaN(parseFloat(e)) && isFinite(e) } function Y(e, t) { Object.keys(t).forEach(function (o) { var n = ''; -1 !== ['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(o) && U(t[o]) && (n = 'px'), e.style[o] = t[o] + n }) } function j(e, t) { Object.keys(t).forEach(function (o) { var n = t[o]; !1 === n ? e.removeAttribute(o) : e.setAttribute(o, t[o]) }) } function q(e, t, o) { var n = D(e, function (e) { var o = e.name; return o === t }), i = !!n && e.some(function (e) { return e.name === o && e.enabled && e.order < n.order }); if (!i) { var r = '`' + t + '`'; console.warn('`' + o + '`' + ' modifier is required by ' + r + ' modifier in order to work, be sure to include it before ' + r + '!') } return i } function K(e) { return 'end' === e ? 'start' : 'start' === e ? 'end' : e } function V(e) { var t = 1 < arguments.length && void 0 !== arguments[1] && arguments[1], o = le.indexOf(e), n = le.slice(o + 1).concat(le.slice(0, o)); return t ? n.reverse() : n } function z(e, t, o, n) { var i = e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/), r = +i[1], p = i[2]; if (!r) return e; if (0 === p.indexOf('%')) { var s; switch (p) { case '%p': s = o; break; case '%': case '%r': default: s = n; }var d = c(s); return d[t] / 100 * r } if ('vh' === p || 'vw' === p) { var a; return a = 'vh' === p ? Q(document.documentElement.clientHeight, window.innerHeight || 0) : Q(document.documentElement.clientWidth, window.innerWidth || 0), a / 100 * r } return r } function G(e, t, o, n) { var i = [0, 0], r = -1 !== ['right', 'left'].indexOf(n), p = e.split(/(\+|\-)/).map(function (e) { return e.trim() }), s = p.indexOf(D(p, function (e) { return -1 !== e.search(/,|\s/) })); p[s] && -1 === p[s].indexOf(',') && console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'); var d = /\s*,\s*|\s+/, a = -1 === s ? [p] : [p.slice(0, s).concat([p[s].split(d)[0]]), [p[s].split(d)[1]].concat(p.slice(s + 1))]; return a = a.map(function (e, n) { var i = (1 === n ? !r : r) ? 'height' : 'width', p = !1; return e.reduce(function (e, t) { return '' === e[e.length - 1] && -1 !== ['+', '-'].indexOf(t) ? (e[e.length - 1] = t, p = !0, e) : p ? (e[e.length - 1] += t, p = !1, e) : e.concat(t) }, []).map(function (e) { return z(e, i, t, o) }) }), a.forEach(function (e, t) { e.forEach(function (o, n) { U(o) && (i[t] += o * ('-' === e[n - 1] ? -1 : 1)) }) }), i } function _(e, t) { var o, n = t.offset, i = e.placement, r = e.offsets, p = r.popper, s = r.reference, d = i.split('-')[0]; return o = U(+n) ? [+n, 0] : G(n, p, s, d), 'left' === d ? (p.top += o[0], p.left -= o[1]) : 'right' === d ? (p.top += o[0], p.left += o[1]) : 'top' === d ? (p.left += o[0], p.top -= o[1]) : 'bottom' === d && (p.left += o[0], p.top += o[1]), e.popper = p, e } for (var X = Math.min, J = Math.floor, Q = Math.max, Z = 'undefined' != typeof window && 'undefined' != typeof document, $ = ['Edge', 'Trident', 'Firefox'], ee = 0, te = 0; te < $.length; te += 1)if (Z && 0 <= navigator.userAgent.indexOf($[te])) { ee = 1; break } var i = Z && window.Promise, oe = i ? function (e) { var t = !1; return function () { t || (t = !0, window.Promise.resolve().then(function () { t = !1, e() })) } } : function (e) { var t = !1; return function () { t || (t = !0, setTimeout(function () { t = !1, e() }, ee)) } }, ne = {}, ie = function () { var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : 'all'; return (e = e.toString(), ne.hasOwnProperty(e)) ? ne[e] : ('11' === e ? ne[e] = -1 !== navigator.userAgent.indexOf('Trident') : '10' === e ? ne[e] = -1 !== navigator.appVersion.indexOf('MSIE 10') : 'all' === e ? ne[e] = -1 !== navigator.userAgent.indexOf('Trident') || -1 !== navigator.userAgent.indexOf('MSIE') : void 0, ne.all = ne.all || Object.keys(ne).some(function (e) { return ne[e] }), ne[e]) }, re = function (e, t) { if (!(e instanceof t)) throw new TypeError('Cannot call a class as a function') }, pe = function () { function e(e, t) { for (var o, n = 0; n < t.length; n++)o = t[n], o.enumerable = o.enumerable || !1, o.configurable = !0, 'value' in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } return function (t, o, n) { return o && e(t.prototype, o), n && e(t, n), t } }(), se = function (e, t, o) { return t in e ? Object.defineProperty(e, t, { value: o, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = o, e }, de = Object.assign || function (e) { for (var t, o = 1; o < arguments.length; o++)for (var n in t = arguments[o], t) Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]); return e }, ae = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'], le = ae.slice(3), fe = { FLIP: 'flip', CLOCKWISE: 'clockwise', COUNTERCLOCKWISE: 'counterclockwise' }, me = function () { function t(o, n) { var i = this, r = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {}; re(this, t), this.scheduleUpdate = function () { return requestAnimationFrame(i.update) }, this.update = oe(this.update.bind(this)), this.options = de({}, t.Defaults, r), this.state = { isDestroyed: !1, isCreated: !1, scrollParents: [] }, this.reference = o && o.jquery ? o[0] : o, this.popper = n && n.jquery ? n[0] : n, this.options.modifiers = {}, Object.keys(de({}, t.Defaults.modifiers, r.modifiers)).forEach(function (e) { i.options.modifiers[e] = de({}, t.Defaults.modifiers[e] || {}, r.modifiers ? r.modifiers[e] : {}) }), this.modifiers = Object.keys(this.options.modifiers).map(function (e) { return de({ name: e }, i.options.modifiers[e]) }).sort(function (e, t) { return e.order - t.order }), this.modifiers.forEach(function (t) { t.enabled && e(t.onLoad) && t.onLoad(i.reference, i.popper, i.options, t, i.state) }), this.update(); var p = this.options.eventsEnabled; p && this.enableEventListeners(), this.state.eventsEnabled = p } return pe(t, [{ key: 'update', value: function () { return k.call(this) } }, { key: 'destroy', value: function () { return B.call(this) } }, { key: 'enableEventListeners', value: function () { return M.call(this) } }, { key: 'disableEventListeners', value: function () { return R.call(this) } }]), t }(); return me.Utils = ('undefined' == typeof window ? global : window).PopperUtils, me.placements = ae, me.Defaults = { placement: 'bottom', positionFixed: !1, eventsEnabled: !0, removeOnDestroy: !1, onCreate: function () { }, onUpdate: function () { }, modifiers: { shift: { order: 100, enabled: !0, fn: function (e) { var t = e.placement, o = t.split('-')[0], n = t.split('-')[1]; if (n) { var i = e.offsets, r = i.reference, p = i.popper, s = -1 !== ['bottom', 'top'].indexOf(o), d = s ? 'left' : 'top', a = s ? 'width' : 'height', l = { start: se({}, d, r[d]), end: se({}, d, r[d] + r[a] - p[a]) }; e.offsets.popper = de({}, p, l[n]) } return e } }, offset: { order: 200, enabled: !0, fn: _, offset: 0 }, preventOverflow: { order: 300, enabled: !0, fn: function (e, t) { var o = t.boundariesElement || r(e.instance.popper); e.instance.reference === o && (o = r(o)); var n = E(e.instance.popper, e.instance.reference, t.padding, o, e.positionFixed); t.boundaries = n; var i = t.priority, p = e.offsets.popper, s = { primary: function (e) { var o = p[e]; return p[e] < n[e] && !t.escapeWithReference && (o = Q(p[e], n[e])), se({}, e, o) }, secondary: function (e) { var o = 'right' === e ? 'left' : 'top', i = p[o]; return p[e] > n[e] && !t.escapeWithReference && (i = X(p[o], n[e] - ('right' === e ? p.width : p.height))), se({}, o, i) } }; return i.forEach(function (e) { var t = -1 === ['left', 'top'].indexOf(e) ? 'secondary' : 'primary'; p = de({}, p, s[t](e)) }), e.offsets.popper = p, e }, priority: ['left', 'right', 'top', 'bottom'], padding: 5, boundariesElement: 'scrollParent' }, keepTogether: { order: 400, enabled: !0, fn: function (e) { var t = e.offsets, o = t.popper, n = t.reference, i = e.placement.split('-')[0], r = J, p = -1 !== ['top', 'bottom'].indexOf(i), s = p ? 'right' : 'bottom', d = p ? 'left' : 'top', a = p ? 'width' : 'height'; return o[s] < r(n[d]) && (e.offsets.popper[d] = r(n[d]) - o[a]), o[d] > r(n[s]) && (e.offsets.popper[d] = r(n[s])), e } }, arrow: { order: 500, enabled: !0, fn: function (e, o) { var n; if (!q(e.instance.modifiers, 'arrow', 'keepTogether')) return e; var i = o.element; if ('string' == typeof i) { if (i = e.instance.popper.querySelector(i), !i) return e; } else if (!e.instance.popper.contains(i)) return console.warn('WARNING: `arrow.element` must be child of its popper element!'), e; var r = e.placement.split('-')[0], p = e.offsets, s = p.popper, d = p.reference, a = -1 !== ['left', 'right'].indexOf(r), l = a ? 'height' : 'width', f = a ? 'Top' : 'Left', m = f.toLowerCase(), h = a ? 'left' : 'top', g = a ? 'bottom' : 'right', u = L(i)[l]; d[g] - u < s[m] && (e.offsets.popper[m] -= s[m] - (d[g] - u)), d[m] + u > s[g] && (e.offsets.popper[m] += d[m] + u - s[g]), e.offsets.popper = c(e.offsets.popper); var b = d[m] + d[l] / 2 - u / 2, y = t(e.instance.popper), w = parseFloat(y['margin' + f], 10), E = parseFloat(y['border' + f + 'Width'], 10), v = b - e.offsets.popper[m] - w - E; return v = Q(X(s[l] - u, v), 0), e.arrowElement = i, e.offsets.arrow = (n = {}, se(n, m, Math.round(v)), se(n, h, ''), n), e }, element: '[x-arrow]' }, flip: { order: 600, enabled: !0, fn: function (e, t) { if (P(e.instance.modifiers, 'inner')) return e; if (e.flipped && e.placement === e.originalPlacement) return e; var o = E(e.instance.popper, e.instance.reference, t.padding, t.boundariesElement, e.positionFixed), n = e.placement.split('-')[0], i = S(n), r = e.placement.split('-')[1] || '', p = []; switch (t.behavior) { case fe.FLIP: p = [n, i]; break; case fe.CLOCKWISE: p = V(n); break; case fe.COUNTERCLOCKWISE: p = V(n, !0); break; default: p = t.behavior; }return p.forEach(function (s, d) { if (n !== s || p.length === d + 1) return e; n = e.placement.split('-')[0], i = S(n); var a = e.offsets.popper, l = e.offsets.reference, f = J, m = 'left' === n && f(a.right) > f(l.left) || 'right' === n && f(a.left) < f(l.right) || 'top' === n && f(a.bottom) > f(l.top) || 'bottom' === n && f(a.top) < f(l.bottom), h = f(a.left) < f(o.left), c = f(a.right) > f(o.right), g = f(a.top) < f(o.top), u = f(a.bottom) > f(o.bottom), b = 'left' === n && h || 'right' === n && c || 'top' === n && g || 'bottom' === n && u, y = -1 !== ['top', 'bottom'].indexOf(n), w = !!t.flipVariations && (y && 'start' === r && h || y && 'end' === r && c || !y && 'start' === r && g || !y && 'end' === r && u); (m || b || w) && (e.flipped = !0, (m || b) && (n = p[d + 1]), w && (r = K(r)), e.placement = n + (r ? '-' + r : ''), e.offsets.popper = de({}, e.offsets.popper, T(e.instance.popper, e.offsets.reference, e.placement)), e = N(e.instance.modifiers, e, 'flip')) }), e }, behavior: 'flip', padding: 5, boundariesElement: 'viewport' }, inner: { order: 700, enabled: !1, fn: function (e) { var t = e.placement, o = t.split('-')[0], n = e.offsets, i = n.popper, r = n.reference, p = -1 !== ['left', 'right'].indexOf(o), s = -1 === ['top', 'left'].indexOf(o); return i[p ? 'left' : 'top'] = r[o] - (s ? i[p ? 'width' : 'height'] : 0), e.placement = S(t), e.offsets.popper = c(i), e } }, hide: { order: 800, enabled: !0, fn: function (e) { if (!q(e.instance.modifiers, 'hide', 'preventOverflow')) return e; var t = e.offsets.reference, o = D(e.instance.modifiers, function (e) { return 'preventOverflow' === e.name }).boundaries; if (t.bottom < o.top || t.left > o.right || t.top > o.bottom || t.right < o.left) { if (!0 === e.hide) return e; e.hide = !0, e.attributes['x-out-of-boundaries'] = '' } else { if (!1 === e.hide) return e; e.hide = !1, e.attributes['x-out-of-boundaries'] = !1 } return e } }, computeStyle: { order: 850, enabled: !0, fn: function (e, t) { var o = t.x, n = t.y, i = e.offsets.popper, p = D(e.instance.modifiers, function (e) { return 'applyStyle' === e.name }).gpuAcceleration; void 0 !== p && console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'); var s, d, a = void 0 === p ? t.gpuAcceleration : p, l = r(e.instance.popper), f = g(l), m = { position: i.position }, h = { left: J(i.left), top: J(i.top), bottom: J(i.bottom), right: J(i.right) }, c = 'bottom' === o ? 'top' : 'bottom', u = 'right' === n ? 'left' : 'right', b = W('transform'); if (d = 'bottom' == c ? -f.height + h.bottom : h.top, s = 'right' == u ? -f.width + h.right : h.left, a && b) m[b] = 'translate3d(' + s + 'px, ' + d + 'px, 0)', m[c] = 0, m[u] = 0, m.willChange = 'transform'; else { var y = 'bottom' == c ? -1 : 1, w = 'right' == u ? -1 : 1; m[c] = d * y, m[u] = s * w, m.willChange = c + ', ' + u } var E = { "x-placement": e.placement }; return e.attributes = de({}, E, e.attributes), e.styles = de({}, m, e.styles), e.arrowStyles = de({}, e.offsets.arrow, e.arrowStyles), e }, gpuAcceleration: !0, x: 'bottom', y: 'right' }, applyStyle: { order: 900, enabled: !0, fn: function (e) { return Y(e.instance.popper, e.styles), j(e.instance.popper, e.attributes), e.arrowElement && Object.keys(e.arrowStyles).length && Y(e.arrowElement, e.arrowStyles), e }, onLoad: function (e, t, o, n, i) { var r = O(i, t, e, o.positionFixed), p = x(o.placement, r, t, e, o.modifiers.flip.boundariesElement, o.modifiers.flip.padding); return t.setAttribute('x-placement', p), Y(t, { position: o.positionFixed ? 'fixed' : 'absolute' }), o }, gpuAcceleration: void 0 } } }, me });

;
function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}var Alert=function(e){var t=e.fn.alert,n={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},r="alert",i="fade",o="show",s=function(){function t(e){this._element=e}var s=t.prototype;return s.close=function(e){e=e||this._element;var t=this._getRootElement(e);this._triggerCloseEvent(t).isDefaultPrevented()||this._removeElement(t)},s.dispose=function(){e.removeData(this._element,"bs.alert"),this._element=null},s._getRootElement=function(t){var n=Util.getSelectorFromElement(t),i=!1;return n&&(i=e(n)[0]),i||(i=e(t).closest("."+r)[0]),i},s._triggerCloseEvent=function(t){var r=e.Event(n.CLOSE);return e(t).trigger(r),r},s._removeElement=function(t){var n=this;e(t).removeClass(o),Util.supportsTransitionEnd()&&e(t).hasClass(i)?e(t).one(Util.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(150):this._destroyElement(t)},s._destroyElement=function(t){e(t).detach().trigger(n.CLOSED).remove()},t._jQueryInterface=function(n){return this.each(function(){var r=e(this),i=r.data("bs.alert");i||(i=new t(this),r.data("bs.alert",i)),"close"===n&&i[n](this)})},t._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},_createClass(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}();return e(document).on(n.CLICK_DATA_API,'[data-dismiss="alert"]',s._handleDismiss(new s)),e.fn.alert=s._jQueryInterface,e.fn.alert.Constructor=s,e.fn.alert.noConflict=function(){return e.fn.alert=t,s._jQueryInterface},s}($);;
function _defineProperties(t,e){for(var n=0;n<e.length;n++){var s=e[n];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(t,s.key,s)}}function _createClass(t,e,n){return e&&_defineProperties(t.prototype,e),n&&_defineProperties(t,n),t}var Button=function(t){var e="button",n=t.fn[e],s="active",a="btn",i="focus",r='[data-toggle^="button"]',o='[data-toggle="buttons"]',l="input",u=".active",c=".btn",f={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},b=function(){function e(t){this._element=t}var n=e.prototype;return n.toggle=function(){var e=!0,n=!0,a=t(this._element).closest(o)[0];if(a){var i=t(this._element).find(l)[0];if(i){if("radio"===i.type)if(i.checked&&t(this._element).hasClass(s))e=!1;else{var r=t(a).find(u)[0];r&&t(r).removeClass(s)}if(e){if(i.hasAttribute("disabled")||a.hasAttribute("disabled")||i.classList.contains("disabled")||a.classList.contains("disabled"))return;i.checked=!t(this._element).hasClass(s),t(i).trigger("change")}i.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!t(this._element).hasClass(s)),e&&t(this._element).toggleClass(s)},n.dispose=function(){t.removeData(this._element,"bs.button"),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var s=t(this).data("bs.button");s||(s=new e(this),t(this).data("bs.button",s)),"toggle"===n&&s[n]()})},_createClass(e,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),e}();return t(document).on(f.CLICK_DATA_API,r,function(e){e.preventDefault();var n=e.target;t(n).hasClass(a)||(n=t(n).closest(c)),b._jQueryInterface.call(t(n),"toggle")}).on(f.FOCUS_BLUR_DATA_API,r,function(e){var n=t(e.target).closest(c)[0];t(n).toggleClass(i,/^focus(in)?$/.test(e.type))}),t.fn[e]=b._jQueryInterface,t.fn[e].Constructor=b,t.fn[e].noConflict=function(){return t.fn[e]=n,b._jQueryInterface},b}($);;
function _extends(){return(_extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e}).apply(this,arguments)}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}var Collapse=function(e){var t="collapse",n="bs.collapse",i=e.fn[t],r={toggle:!0,parent:""},s={toggle:"boolean",parent:"(string|element)"},a={SHOW:"show.bs.collapse",SHOWN:"shown.bs.collapse",HIDE:"hide.bs.collapse",HIDDEN:"hidden.bs.collapse",CLICK_DATA_API:"click.bs.collapse.data-api"},l="show",o="collapse",g="collapsing",h="collapsed",_="width",c="height",f={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},d=function(){function i(t,n){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(n),this._triggerArray=e.makeArray(e('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var i=e(f.DATA_TOGGLE),r=0;r<i.length;r++){var s=i[r],a=Util.getSelectorFromElement(s);null!==a&&e(a).filter(t).length>0&&(this._selector=a,this._triggerArray.push(s))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var d=i.prototype;return d.toggle=function(){e(this._element).hasClass(l)?this.hide():this.show()},d.show=function(){var t,r,s=this;if(!this._isTransitioning&&!e(this._element).hasClass(l)&&(this._parent&&0===(t=e.makeArray(e(this._parent).find(f.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(t=null),!(t&&(r=e(t).not(this._selector).data(n))&&r._isTransitioning))){var _=e.Event(a.SHOW);if(e(this._element).trigger(_),!_.isDefaultPrevented()){t&&(i._jQueryInterface.call(e(t).not(this._selector),"hide"),r||e(t).data(n,null));var c=this._getDimension();e(this._element).removeClass(o).addClass(g),this._element.style[c]=0,this._triggerArray.length>0&&e(this._triggerArray).removeClass(h).attr("aria-expanded",!0),this.setTransitioning(!0);var d=function(){e(s._element).removeClass(g).addClass(o).addClass(l),s._element.style[c]="",s.setTransitioning(!1),e(s._element).trigger(a.SHOWN)};if(Util.supportsTransitionEnd()){var u="scroll"+(c[0].toUpperCase()+c.slice(1));e(this._element).one(Util.TRANSITION_END,d).emulateTransitionEnd(600),this._element.style[c]=this._element[u]+"px"}else d()}}},d.hide=function(){var t=this;if(!this._isTransitioning&&e(this._element).hasClass(l)){var n=e.Event(a.HIDE);if(e(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",Util.reflow(this._element),e(this._element).addClass(g).removeClass(o).removeClass(l),this._triggerArray.length>0)for(var r=0;r<this._triggerArray.length;r++){var s=this._triggerArray[r],_=Util.getSelectorFromElement(s);if(null!==_)e(_).hasClass(l)||e(s).addClass(h).attr("aria-expanded",!1)}this.setTransitioning(!0);var c=function(){t.setTransitioning(!1),e(t._element).removeClass(g).addClass(o).trigger(a.HIDDEN)};this._element.style[i]="",Util.supportsTransitionEnd()?e(this._element).one(Util.TRANSITION_END,c).emulateTransitionEnd(600):c()}}},d.setTransitioning=function(e){this._isTransitioning=e},d.dispose=function(){e.removeData(this._element,n),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},d._getConfig=function(e){return(e=_extends({},r,e)).toggle=Boolean(e.toggle),Util.typeCheckConfig(t,e,s),e},d._getDimension=function(){return e(this._element).hasClass(_)?_:c},d._getParent=function(){var t=this,n=null;Util.isElement(this._config.parent)?(n=this._config.parent,void 0!==this._config.parent.jquery&&(n=this._config.parent[0])):n=e(this._config.parent)[0];var r='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return e(n).find(r).each(function(e,n){t._addAriaAndCollapsedClass(i._getTargetFromElement(n),[n])}),n},d._addAriaAndCollapsedClass=function(t,n){if(t){var i=e(t).hasClass(l);n.length>0&&e(n).toggleClass(h,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(t){var n=Util.getSelectorFromElement(t);return n?e(n)[0]:null},i._jQueryInterface=function(t){return this.each(function(){var s=e(this),a=s.data(n),l=_extends({},r,s.data(),"object"==typeof t&&t);if(!a&&l.toggle&&/show|hide/.test(t)&&(l.toggle=!1),a||(a=new i(this,l),s.data(n,a)),"string"==typeof t){if(void 0===a[t])throw new TypeError('No method named "'+t+'"');a[t]()}})},_createClass(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return r}}]),i}();return e(document).on(a.CLICK_DATA_API,f.DATA_TOGGLE,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var i=e(this),r=Util.getSelectorFromElement(this);e(r).each(function(){var t=e(this),r=t.data(n)?"toggle":i.data();d._jQueryInterface.call(t,r)})}),e.fn[t]=d._jQueryInterface,e.fn[t].Constructor=d,e.fn[t].noConflict=function(){return e.fn[t]=i,d._jQueryInterface},d}($);;
function _extends(){return(_extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}var Dropdown=function(e){var t="dropdown",n="bs.dropdown",r="."+n,o=e.fn[t],i=new RegExp("38|40|27"),s={HIDE:"hide"+r,HIDDEN:"hidden"+r,SHOW:"show"+r,SHOWN:"shown"+r,CLICK:"click"+r,CLICK_DATA_API:"click.bs.dropdown.data-api",KEYDOWN_DATA_API:"keydown.bs.dropdown.data-api",KEYUP_DATA_API:"keyup.bs.dropdown.data-api"},a="disabled",l="show",h="dropup",f="dropright",u="dropleft",p="dropdown-menu-right",d="dropdown-menu-left",c="position-static",_='[data-toggle="dropdown"]',g=".dropdown form",m=".dropdown-menu",v=".navbar-nav",w=".dropdown-menu .dropdown-item:not(.disabled)",y="top-start",C="top-end",b="bottom-start",P="bottom-end",A="right-start",E="left-start",D={offset:0,flip:!0,boundary:"scrollParent"},I={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},N=function(){function o(e,t){this._element=e,this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var g=o.prototype;return g.toggle=function(){if(!this._element.disabled&&!e(this._element).hasClass(a)){var t=o._getParentFromElement(this._element),n=e(this._menu).hasClass(l);if(o._clearMenus(),!n){var r={relatedTarget:this._element},i=e.Event(s.SHOW,r);if(e(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof Popper)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var f=this._element;e(t).hasClass(h)&&(e(this._menu).hasClass(d)||e(this._menu).hasClass(p))&&(f=t),"scrollParent"!==this._config.boundary&&e(t).addClass(c),this._popper=new Popper(f,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===e(t).closest(v).length&&e("body").children().on("mouseover",null,e.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),e(this._menu).toggleClass(l),e(t).toggleClass(l).trigger(e.Event(s.SHOWN,r))}}}},g.dispose=function(){e.removeData(this._element,n),e(this._element).off(r),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},g.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},g._addEventListeners=function(){var t=this;e(this._element).on(s.CLICK,function(e){e.preventDefault(),e.stopPropagation(),t.toggle()})},g._getConfig=function(n){return n=_extends({},this.constructor.Default,e(this._element).data(),n),Util.typeCheckConfig(t,n,this.constructor.DefaultType),n},g._getMenuElement=function(){if(!this._menu){var t=o._getParentFromElement(this._element);this._menu=e(t).find(m)[0]}return this._menu},g._getPlacement=function(){var t=e(this._element).parent(),n=b;return t.hasClass(h)?(n=y,e(this._menu).hasClass(p)&&(n=C)):t.hasClass(f)?n=A:t.hasClass(u)?n=E:e(this._menu).hasClass(p)&&(n=P),n},g._detectNavbar=function(){return e(this._element).closest(".navbar").length>0},g._getPopperConfig=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=_extends({},t.offsets,e._config.offset(t.offsets)||{}),t}:t.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:t,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},o._jQueryInterface=function(t){return this.each(function(){var r=e(this).data(n);if(r||(r=new o(this,"object"==typeof t?t:null),e(this).data(n,r)),"string"==typeof t){if(void 0===r[t])throw new TypeError('No method named "'+t+'"');r[t]()}})},o._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var r=e.makeArray(e(_)),i=0;i<r.length;i++){var a=o._getParentFromElement(r[i]),h=e(r[i]).data(n),f={relatedTarget:r[i]};if(h){var u=h._menu;if(e(a).hasClass(l)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&e.contains(a,t.target))){var p=e.Event(s.HIDE,f);e(a).trigger(p),p.isDefaultPrevented()||("ontouchstart"in document.documentElement&&e("body").children().off("mouseover",null,e.noop),r[i].setAttribute("aria-expanded","false"),e(u).removeClass(l),e(a).removeClass(l).trigger(e.Event(s.HIDDEN,f)))}}}},o._getParentFromElement=function(t){var n,r=Util.getSelectorFromElement(t);return r&&(n=e(r)[0]),n||t.parentNode},o._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||e(t.target).closest(m).length)):i.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!e(this).hasClass(a))){var n=o._getParentFromElement(this),r=e(n).hasClass(l);if((r||27===t.which&&32===t.which)&&(!r||27!==t.which&&32!==t.which)){var s=e(n).find(w).get();if(0!==s.length){var h=s.indexOf(t.target);38===t.which&&h>0&&h--,40===t.which&&h<s.length-1&&h++,h<0&&(h=0),s[h].focus()}}else{if(27===t.which){var f=e(n).find(_)[0];e(f).trigger("focus")}e(this).trigger("click")}}},_createClass(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return D}},{key:"DefaultType",get:function(){return I}}]),o}();return e(document).on(s.KEYDOWN_DATA_API,_,N._dataApiKeydownHandler).on(s.KEYDOWN_DATA_API,m,N._dataApiKeydownHandler).on(s.CLICK_DATA_API+" "+s.KEYUP_DATA_API,N._clearMenus).on(s.CLICK_DATA_API,_,function(t){t.preventDefault(),t.stopPropagation(),N._jQueryInterface.call(e(this),"toggle")}).on(s.CLICK_DATA_API,g,function(e){e.stopPropagation()}),e.fn[t]=N._jQueryInterface,e.fn[t].Constructor=N,e.fn[t].noConflict=function(){return e.fn[t]=o,N._jQueryInterface},N}($,Popper);;
function _extends(){return(_extends=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])}return t}).apply(this,arguments)}function _defineProperties(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function _createClass(t,e,i){return e&&_defineProperties(t.prototype,e),i&&_defineProperties(t,i),t}var Modal=function(t){var e="modal",i=".bs.modal",n=t.fn.modal,s={backdrop:!0,keyboard:!0,focus:!0,show:!0},o={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},a={HIDE:"hide.bs.modal",HIDDEN:"hidden.bs.modal",SHOW:"show.bs.modal",SHOWN:"shown.bs.modal",FOCUSIN:"focusin.bs.modal",RESIZE:"resize.bs.modal",CLICK_DISMISS:"click.dismiss.bs.modal",KEYDOWN_DISMISS:"keydown.dismiss.bs.modal",MOUSEUP_DISMISS:"mouseup.dismiss.bs.modal",MOUSEDOWN_DISMISS:"mousedown.dismiss.bs.modal",CLICK_DATA_API:"click.bs.modal.data-api"},r="modal-scrollbar-measure",d="modal-backdrop",l="modal-open",h="fade",c="show",_={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",STICKY_CONTENT:".sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},u=function(){function n(e,i){this._config=this._getConfig(i),this._element=e,this._dialog=t(e).find(_.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}var u=n.prototype;return u.toggle=function(t){return this._isShown?this.hide():this.show(t)},u.show=function(e){var i=this;if(!this._isTransitioning&&!this._isShown){Util.supportsTransitionEnd()&&t(this._element).hasClass(h)&&(this._isTransitioning=!0);var n=t.Event(a.SHOW,{relatedTarget:e});t(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),t(document.body).addClass(l),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(a.CLICK_DISMISS,_.DATA_DISMISS,function(t){return i.hide(t)}),t(this._dialog).on(a.MOUSEDOWN_DISMISS,function(){t(i._element).one(a.MOUSEUP_DISMISS,function(e){t(e.target).is(i._element)&&(i._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return i._showElement(e)}))}},u.hide=function(e){var i=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var n=t.Event(a.HIDE);if(t(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var s=Util.supportsTransitionEnd()&&t(this._element).hasClass(h);s&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),t(document).off(a.FOCUSIN),t(this._element).removeClass(c),t(this._element).off(a.CLICK_DISMISS),t(this._dialog).off(a.MOUSEDOWN_DISMISS),s?t(this._element).one(Util.TRANSITION_END,function(t){return i._hideModal(t)}).emulateTransitionEnd(300):this._hideModal()}}},u.dispose=function(){t.removeData(this._element,"bs.modal"),t(window,document,this._element,this._backdrop).off(i),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},u.handleUpdate=function(){this._adjustDialog()},u._getConfig=function(t){return t=_extends({},s,t),Util.typeCheckConfig(e,t,o),t},u._showElement=function(e){var i=this,n=Util.supportsTransitionEnd()&&t(this._element).hasClass(h);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,n&&Util.reflow(this._element),t(this._element).addClass(c),this._config.focus&&this._enforceFocus();var s=t.Event(a.SHOWN,{relatedTarget:e}),o=function(){i._config.focus&&i._element.focus(),i._isTransitioning=!1,t(i._element).trigger(s)};n?t(this._dialog).one(Util.TRANSITION_END,o).emulateTransitionEnd(300):o()},u._enforceFocus=function(){var e=this;t(document).off(a.FOCUSIN).on(a.FOCUSIN,function(i){document!==i.target&&e._element!==i.target&&0===t(e._element).has(i.target).length&&e._element.focus()})},u._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(a.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||t(this._element).off(a.KEYDOWN_DISMISS)},u._setResizeEvent=function(){var e=this;this._isShown?t(window).on(a.RESIZE,function(t){return e.handleUpdate(t)}):t(window).off(a.RESIZE)},u._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(l),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(a.HIDDEN)})},u._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},u._showBackdrop=function(e){var i=this,n=t(this._element).hasClass(h)?h:"";if(this._isShown&&this._config.backdrop){var s=Util.supportsTransitionEnd()&&n;if(this._backdrop=document.createElement("div"),this._backdrop.className=d,n&&t(this._backdrop).addClass(n),t(this._backdrop).appendTo(document.body),t(this._element).on(a.CLICK_DISMISS,function(t){i._ignoreBackdropClick?i._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===i._config.backdrop?i._element.focus():i.hide())}),s&&Util.reflow(this._backdrop),t(this._backdrop).addClass(c),!e)return;if(!s)return void e();t(this._backdrop).one(Util.TRANSITION_END,e).emulateTransitionEnd(150)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(c);var o=function(){i._removeBackdrop(),e&&e()};Util.supportsTransitionEnd()&&t(this._element).hasClass(h)?t(this._backdrop).one(Util.TRANSITION_END,o).emulateTransitionEnd(150):o()}else e&&e()},u._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},u._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},u._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},u._setScrollbar=function(){var e=this;if(this._isBodyOverflowing){t(_.FIXED_CONTENT).each(function(i,n){var s=t(n)[0].style.paddingRight,o=t(n).css("padding-right");t(n).data("padding-right",s).css("padding-right",parseFloat(o)+e._scrollbarWidth+"px")}),t(_.STICKY_CONTENT).each(function(i,n){var s=t(n)[0].style.marginRight,o=t(n).css("margin-right");t(n).data("margin-right",s).css("margin-right",parseFloat(o)-e._scrollbarWidth+"px")}),t(_.NAVBAR_TOGGLER).each(function(i,n){var s=t(n)[0].style.marginRight,o=t(n).css("margin-right");t(n).data("margin-right",s).css("margin-right",parseFloat(o)+e._scrollbarWidth+"px")});var i=document.body.style.paddingRight,n=t("body").css("padding-right");t("body").data("padding-right",i).css("padding-right",parseFloat(n)+this._scrollbarWidth+"px")}},u._resetScrollbar=function(){t(_.FIXED_CONTENT).each(function(e,i){var n=t(i).data("padding-right");void 0!==n&&t(i).css("padding-right",n).removeData("padding-right")}),t(_.STICKY_CONTENT+", "+_.NAVBAR_TOGGLER).each(function(e,i){var n=t(i).data("margin-right");void 0!==n&&t(i).css("margin-right",n).removeData("margin-right")});var e=t("body").data("padding-right");void 0!==e&&t("body").css("padding-right",e).removeData("padding-right")},u._getScrollbarWidth=function(){var t=document.createElement("div");t.className=r,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},n._jQueryInterface=function(e,i){return this.each(function(){var s=t(this).data("bs.modal"),o=_extends({},n.Default,t(this).data(),"object"==typeof e&&e);if(s||(s=new n(this,o),t(this).data("bs.modal",s)),"string"==typeof e){if(void 0===s[e])throw new TypeError('No method named "'+e+'"');s[e](i)}else o.show&&s.show(i)})},_createClass(n,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return s}}]),n}();return t(document).on(a.CLICK_DATA_API,_.DATA_TOGGLE,function(e){var i,n=this,s=Util.getSelectorFromElement(this);s&&(i=t(s)[0]);var o=t(i).data("bs.modal")?"toggle":_extends({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var r=t(i).one(a.SHOW,function(e){e.isDefaultPrevented()||r.one(a.HIDDEN,function(){t(n).is(":visible")&&n.focus()})});u._jQueryInterface.call(t(i),o,this)}),t.fn.modal=u._jQueryInterface,t.fn.modal.Constructor=u,t.fn.modal.noConflict=function(){return t.fn.modal=n,u._jQueryInterface},u}($);;
function _extends(){return(_extends=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}function _defineProperties(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function _createClass(t,e,n){return e&&_defineProperties(t.prototype,e),n&&_defineProperties(t,n),t}var Tooltip=function(t){var e="tooltip",n=".bs.tooltip",i=t.fn[e],o=new RegExp("(^|\\s)bs-tooltip\\S+","g"),r={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"},s={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},a={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},l="show",c="out",h={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,INSERTED:"inserted"+n,CLICK:"click"+n,FOCUSIN:"focusin"+n,FOCUSOUT:"focusout"+n,MOUSEENTER:"mouseenter"+n,MOUSELEAVE:"mouseleave"+n},u="fade",f="show",g=".tooltip-inner",p=".arrow",m="hover",d="focus",v="click",_="manual",E=function(){function i(t,e){if("undefined"==typeof Popper)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var E=i.prototype;return E.enable=function(){this._isEnabled=!0},E.disable=function(){this._isEnabled=!1},E.toggleEnabled=function(){this._isEnabled=!this._isEnabled},E.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(f))return void this._leave(null,this);this._enter(null,this)}},E.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},E.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(n);var o=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!o)return;var r=this.getTipElement(),s=Util.getUID(this.constructor.NAME);r.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(r).addClass(u);var a="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,l=this._getAttachment(a);this.addAttachmentClass(l);var h=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(h),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Popper(this.element,r,{placement:l,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:p},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(f),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var g=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===c&&e._leave(null,e)};Util.supportsTransitionEnd()&&t(this.tip).hasClass(u)?t(this.tip).one(Util.TRANSITION_END,g).emulateTransitionEnd(i._TRANSITION_DURATION):g()}},E.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==l&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(f),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[v]=!1,this._activeTrigger[d]=!1,this._activeTrigger[m]=!1,Util.supportsTransitionEnd()&&t(this.tip).hasClass(u)?t(i).one(Util.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},E.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},E.isWithContent=function(){return Boolean(this.getTitle())},E.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},E.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},E.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(g),this.getTitle()),e.removeClass(u+" "+f)},E.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},E.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},E._getAttachment=function(t){return s[t.toUpperCase()]},E._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==_){var i=n===m?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===m?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=_extends({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},E._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},E._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?d:m]=!0),t(n.getTipElement()).hasClass(f)||n._hoverState===l?n._hoverState=l:(clearTimeout(n._timeout),n._hoverState=l,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===l&&n.show()},n.config.delay.show):n.show())},E._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?d:m]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=c,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===c&&n.hide()},n.config.delay.hide):n.hide())},E._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},E._getConfig=function(n){return"number"==typeof(n=_extends({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),Util.typeCheckConfig(e,n,this.constructor.DefaultType),n},E._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},E._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(o);null!==n&&n.length>0&&e.removeClass(n.join(""))},E._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},E._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(u),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},i._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.tooltip"),o="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new i(this,o),t(this).data("bs.tooltip",n)),"string"==typeof e)){if(void 0===n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},_createClass(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return h}},{key:"EVENT_KEY",get:function(){return n}},{key:"DefaultType",get:function(){return r}}]),i}();return t.fn[e]=E._jQueryInterface,t.fn[e].Constructor=E,t.fn[e].noConflict=function(){return t.fn[e]=i,E._jQueryInterface},E}($,Popper);;
function _defineProperties(e, t) { for (var n = 0; n < t.length; n++) { var o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } function _createClass(e, t, n) { return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e } function _inheritsLoose(e, t) { e.prototype = Object.create(t.prototype), e.prototype.constructor = e, e.__proto__ = t } function _extends() { return (_extends = Object.assign || function (e) { for (var t = 1; t < arguments.length; t++) { var n = arguments[t]; for (var o in n) Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]) } return e }).apply(this, arguments) } var Popover = function (e) { var t = "popover", n = ".bs.popover", o = e.fn[t], r = new RegExp("(^|\\s)bs-popover\\S+", "g"), i = _extends({}, Tooltip.Default, { placement: "right", trigger: "click", content: "", template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>' }), s = _extends({}, Tooltip.DefaultType, { content: "(string|element|function)" }), p = "fade", a = "show", c = ".popover-header", u = ".popover-body", l = { HIDE: "hide" + n, HIDDEN: "hidden" + n, SHOW: "show" + n, SHOWN: "shown" + n, INSERTED: "inserted" + n, CLICK: "click" + n, FOCUSIN: "focusin" + n, FOCUSOUT: "focusout" + n, MOUSEENTER: "mouseenter" + n, MOUSELEAVE: "mouseleave" + n }, f = function (o) { function f() { return o.apply(this, arguments) || this } _inheritsLoose(f, o); var h = f.prototype; return h.isWithContent = function () { return this.getTitle() || this._getContent() }, h.addAttachmentClass = function (t) { e(this.getTipElement()).addClass("bs-popover-" + t) }, h.getTipElement = function () { return this.tip = this.tip || e(this.config.template)[0], this.tip }, h.setContent = function () { var t = e(this.getTipElement()); this.setElementContent(t.find(c), this.getTitle()); var n = this._getContent(); "function" == typeof n && (n = n.call(this.element)), this.setElementContent(t.find(u), n), t.removeClass(p + " " + a) }, h._getContent = function () { return this.element.getAttribute("data-content") || this.config.content }, h._cleanTipClass = function () { var t = e(this.getTipElement()), n = t.attr("class").match(r); null !== n && n.length > 0 && t.removeClass(n.join("")) }, f._jQueryInterface = function (t) { return this.each(function () { var n = e(this).data("bs.popover"), o = "object" == typeof t ? t : null; if ((n || !/destroy|hide/.test(t)) && (n || (n = new f(this, o), e(this).data("bs.popover", n)), "string" == typeof t)) { if (void 0 === n[t]) throw new TypeError('No method named "' + t + '"'); n[t]() } }) }, _createClass(f, null, [{ key: "VERSION", get: function () { return "4.0.0" } }, { key: "Default", get: function () { return i } }, { key: "NAME", get: function () { return t } }, { key: "DATA_KEY", get: function () { return "bs.popover" } }, { key: "Event", get: function () { return l } }, { key: "EVENT_KEY", get: function () { return n } }, { key: "DefaultType", get: function () { return s } }]), f }(Tooltip); return e.fn[t] = f._jQueryInterface, e.fn[t].Constructor = f, e.fn[t].noConflict = function () { return e.fn[t] = o, f._jQueryInterface }, f }($);;
function _extends(){return(_extends=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var s=arguments[e];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(t[r]=s[r])}return t}).apply(this,arguments)}function _defineProperties(t,e){for(var s=0;s<e.length;s++){var r=e[s];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}function _createClass(t,e,s){return e&&_defineProperties(t.prototype,e),s&&_defineProperties(t,s),t}var ScrollSpy=function(t){var e="scrollspy",s=t.fn[e],r={offset:10,method:"auto",target:""},i={offset:"number",method:"string",target:"(string|element)"},n={ACTIVATE:"activate.bs.scrollspy",SCROLL:"scroll.bs.scrollspy",LOAD_DATA_API:"load.bs.scrollspy.data-api"},o="dropdown-item",l="active",a={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},c="offset",h="position",f=function(){function s(e,s){var r=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(s),this._selector=this._config.target+" "+a.NAV_LINKS+","+this._config.target+" "+a.LIST_ITEMS+","+this._config.target+" "+a.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(n.SCROLL,function(t){return r._process(t)}),this.refresh(),this._process()}var f=s.prototype;return f.refresh=function(){var e=this,s=this._scrollElement===this._scrollElement.window?c:h,r="auto"===this._config.method?s:this._config.method,i=r===h?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var s,n=Util.getSelectorFromElement(e);if(n&&(s=t(n)[0]),s){var o=s.getBoundingClientRect();if(o.width||o.height)return[t(s)[r]().top+i,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},f.dispose=function(){t.removeData(this._element,"bs.scrollspy"),t(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},f._getConfig=function(s){if("string"!=typeof(s=_extends({},r,s)).target){var n=t(s.target).attr("id");n||(n=Util.getUID(e),t(s.target).attr("id",n)),s.target="#"+n}return Util.typeCheckConfig(e,s,i),s},f._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},f._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},f._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},f._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),s=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=s){var r=this._targets[this._targets.length-1];this._activeTarget!==r&&this._activate(r)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var i=this._offsets.length;i--;){this._activeTarget!==this._targets[i]&&t>=this._offsets[i]&&(void 0===this._offsets[i+1]||t<this._offsets[i+1])&&this._activate(this._targets[i])}}},f._activate=function(e){this._activeTarget=e,this._clear();var s=this._selector.split(",");s=s.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var r=t(s.join(","));r.hasClass(o)?(r.closest(a.DROPDOWN).find(a.DROPDOWN_TOGGLE).addClass(l),r.addClass(l)):(r.addClass(l),r.parents(a.NAV_LIST_GROUP).prev(a.NAV_LINKS+", "+a.LIST_ITEMS).addClass(l),r.parents(a.NAV_LIST_GROUP).prev(a.NAV_ITEMS).children(a.NAV_LINKS).addClass(l)),t(this._scrollElement).trigger(n.ACTIVATE,{relatedTarget:e})},f._clear=function(){t(this._selector).filter(a.ACTIVE).removeClass(l)},s._jQueryInterface=function(e){return this.each(function(){var r=t(this).data("bs.scrollspy");if(r||(r=new s(this,"object"==typeof e&&e),t(this).data("bs.scrollspy",r)),"string"==typeof e){if(void 0===r[e])throw new TypeError('No method named "'+e+'"');r[e]()}})},_createClass(s,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return r}}]),s}();return t(window).on(n.LOAD_DATA_API,function(){for(var e=t.makeArray(t(a.DATA_SPY)),s=e.length;s--;){var r=t(e[s]);f._jQueryInterface.call(r,r.data())}}),t.fn[e]=f._jQueryInterface,t.fn[e].Constructor=f,t.fn[e].noConflict=function(){return t.fn[e]=s,f._jQueryInterface},f}($);;
function _defineProperties(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}var Tab=function(e){var t=e.fn.tab,n={HIDE:"hide.bs.tab",HIDDEN:"hidden.bs.tab",SHOW:"show.bs.tab",SHOWN:"shown.bs.tab",CLICK_DATA_API:"click.bs.tab.data-api"},a="dropdown-menu",r="active",i="disabled",s="fade",o="show",l=".dropdown",d=".nav, .list-group",f=".active",u="> li > .active",c='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',h=".dropdown-toggle",b="> .dropdown-menu .active",v=function(){function t(e){this._element=e}var c=t.prototype;return c.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&e(this._element).hasClass(r)||e(this._element).hasClass(i))){var a,s,o=e(this._element).closest(d)[0],l=Util.getSelectorFromElement(this._element);if(o){var c="UL"===o.nodeName?u:f;s=(s=e.makeArray(e(o).find(c)))[s.length-1]}var h=e.Event(n.HIDE,{relatedTarget:this._element}),b=e.Event(n.SHOW,{relatedTarget:s});if(s&&e(s).trigger(h),e(this._element).trigger(b),!b.isDefaultPrevented()&&!h.isDefaultPrevented()){l&&(a=e(l)[0]),this._activate(this._element,o);var v=function(){var a=e.Event(n.HIDDEN,{relatedTarget:t._element}),r=e.Event(n.SHOWN,{relatedTarget:s});e(s).trigger(a),e(t._element).trigger(r)};a?this._activate(a,a.parentNode,v):v()}}},c.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},c._activate=function(t,n,a){var r=this,i=("UL"===n.nodeName?e(n).find(u):e(n).children(f))[0],o=a&&Util.supportsTransitionEnd()&&i&&e(i).hasClass(s),l=function(){return r._transitionComplete(t,i,a)};i&&o?e(i).one(Util.TRANSITION_END,l).emulateTransitionEnd(150):l()},c._transitionComplete=function(t,n,i){if(n){e(n).removeClass(o+" "+r);var s=e(n.parentNode).find(b)[0];s&&e(s).removeClass(r),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(e(t).addClass(r),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),Util.reflow(t),e(t).addClass(o),t.parentNode&&e(t.parentNode).hasClass(a)){var d=e(t).closest(l)[0];d&&e(d).find(h).addClass(r),t.setAttribute("aria-expanded",!0)}i&&i()},t._jQueryInterface=function(n){return this.each(function(){var a=e(this),r=a.data("bs.tab");if(r||(r=new t(this),a.data("bs.tab",r)),"string"==typeof n){if(void 0===r[n])throw new TypeError('No method named "'+n+'"');r[n]()}})},_createClass(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}();return e(document).on(n.CLICK_DATA_API,c,function(t){t.preventDefault(),v._jQueryInterface.call(e(this),"show")}),e.fn.tab=v._jQueryInterface,e.fn.tab.Constructor=v,e.fn.tab.noConflict=function(){return e.fn.tab=t,v._jQueryInterface},v}($);;
var Util=function(t){var e=!1;function n(e){var n=this,i=!1;return t(this).one(r.TRANSITION_END,function(){i=!0}),setTimeout(function(){i||r.triggerTransitionEnd(n)},e),this}var r={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},getSelectorFromElement:function(e){var n=e.getAttribute("data-target");n&&"#"!==n||(n=e.getAttribute("href")||""),"#"===n.charAt(0)&&(n=function(e){return e="function"==typeof t.escapeSelector?t.escapeSelector(e).substr(1):e.replace(/(:|\.|\[|\]|,|=|@)/g,"\\$1")}(n));try{return t(document).find(n).length>0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],a=e[i],u=a&&r.isElement(a)?"element":(c=a,{}.toString.call(c).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(o).test(u))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+u+'" but expected type "'+o+'".')}var c}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,r.supportsTransitionEnd()&&(t.event.special[r.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),r}($);;
! function(t) { "use strict"; var a = function(a, e) { this.options = e, this.$tabs = t(a), this._accordionVisible = !1, this._initAccordion(), this._checkStateOnResize(); var s = this;
        setTimeout(function() { s.checkState() }, 0) };
    a.DEFAULTS = { accordionClass: "d-block d-sm-none responsiveTabAccordion", tabsClass: "d-none d-sm-flex responsiveTabTab", accordionTemplate: function(t, a, e, s) { return '<div class="panel panel-default">   <div class="panel-heading">      <h4 class="panel-title">      </h4>   </div>   <div id="' + a + '" class="panel-collapse collapse ' + (s ? "in" : "") + '">       <div class="panel-body js-tabcollapse-panel-body">       </div>   </div></div>' } }, a.prototype.checkState = function() { this.$tabs.is(":visible") && this._accordionVisible ? (this.showTabs(), this._accordionVisible = !1) : this.$accordion.is(":visible") && !this._accordionVisible && (this.showAccordion(), this._accordionVisible = !0) }, a.prototype.showTabs = function() { var a = this;
        this.$tabs.trigger(t.Event("show-tabs.bs.tabcollapse")), this.$accordion.find(".js-tabcollapse-panel-heading").detach().each(function() { var e = t(this),
                s = e.data("bs.tabcollapse.parentLi"),
                o = a._panelHeadingToTabHeading(e);
            s.removeClass("active"), s.parent().hasClass("dropdown-menu") && !s.siblings("li").hasClass("active") && s.parent().parent().removeClass("active"), o.hasClass("collapsed") ? o.removeClass("collapsed") : (s.addClass("active"), s.parent().hasClass("dropdown-menu") && s.parent().parent().addClass("active")), s.append(e) }), t("li").hasClass("active") || t("li").first().addClass("active"), this.$accordion.find(".js-tabcollapse-panel-body").each(function() { var a = t(this);
            a.data("bs.tabcollapse.tabpane").append(a.contents().detach()) }), this.$accordion.html(""), this.options.updateLinks && this.getTabContentElement().find('[data-toggle-was="tab"], [data-toggle-was="pill"]').each(function() { var a = t(this),
                e = a.attr("href").replace(/-collapse$/g, "");
            a.attr({ "data-toggle": a.attr("data-toggle-was"), "data-toggle-was": "", "data-parent": "", href: e }) }), this.$tabs.trigger(t.Event("shown-tabs.bs.tabcollapse")) }, a.prototype.getTabContentElement = function() { var a = t(this.options.tabContentSelector); return 0 === a.length && (a = this.$tabs.siblings(".tab-content")), a }, a.prototype.showAccordion = function() { this.$tabs.trigger(t.Event("show-accordion.bs.tabcollapse")); var a = this; if (this.$tabs.find('li:not(.dropdown) [data-toggle="tab"], li:not(.dropdown) [data-toggle="pill"]').each(function() { var e = t(this),
                    s = e.parent();
                e.data("bs.tabcollapse.parentLi", s), a.$accordion.append(a._createAccordionGroup(a.$accordion.attr("id"), e.detach())) }), this.options.updateLinks) { var e = this.$accordion.attr("id");
            this.$accordion.find(".js-tabcollapse-panel-body").find('[data-toggle="tab"], [data-toggle="pill"]').each(function() { var a = t(this),
                    s = a.attr("href") + "-collapse";
                a.attr({ "data-toggle-was": a.attr("data-toggle"), "data-toggle": "collapse", "data-parent": "#" + e, href: s }) }) } this.$tabs.trigger(t.Event("shown-accordion.bs.tabcollapse")) }, a.prototype._panelHeadingToTabHeading = function(t) { var a = t.attr("href").replace(/-collapse$/g, ""); return t.attr({ "data-toggle": "tab", href: a, "data-parent": "" }), t }, a.prototype._tabHeadingToPanelHeading = function(t, a, e, s) { return t.addClass("js-tabcollapse-panel-heading " + (s ? "" : "collapsed")), t.attr({ "data-toggle": "collapse", "data-parent": "#" + e, href: "#" + a }), t }, a.prototype._checkStateOnResize = function() { var a = this;
        t(window).resize(function() { clearTimeout(a._resizeTimeout), a._resizeTimeout = setTimeout(function() { a.checkState() }, 100) }) }, a.prototype._initAccordion = function() { var a = this.$tabs.attr("id"),
            e = (a || function() { for (var t = "", a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", e = 0; e < 5; e++) t += a.charAt(Math.floor(Math.random() * a.length)); return t }()) + "-accordion";
        this.$accordion = t('<div class="panel-group ' + this.options.accordionClass + '" id="' + e + '"></div>'), this.$tabs.after(this.$accordion), this.$tabs.addClass(this.options.tabsClass), this.getTabContentElement().addClass(this.options.tabsClass) }, a.prototype._createAccordionGroup = function(a, e) { var s = e.attr("data-target"),
            o = e.data("bs.tabcollapse.parentLi").is(".active");
        s || (s = (s = e.attr("href")) && s.replace(/.*(?=#[^\s]*$)/, "")); var i = t(s),
            n = i.attr("id") + "-collapse",
            c = t(this.options.accordionTemplate(e, n, a, o)); return c.find(".panel-heading > .panel-title").append(this._tabHeadingToPanelHeading(e, n, a, o)), c.find(".panel-body").append(i.contents().detach()).data("bs.tabcollapse.tabpane", i), c }, t.fn.tabCollapse = function(e) { return this.each(function() { var s = t(this),
                o = s.data("bs.tabcollapse"),
                i = t.extend({}, a.DEFAULTS, s.data(), "object" == typeof e && e);
            o || s.data("bs.tabcollapse", new a(this, i)) }) }, t.fn.tabCollapse.Constructor = a }(window.jQuery);;
var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(e,t){"object"===("undefined"==typeof exports?"undefined":_typeof(exports))&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.LazyLoad=t()}(this,function(){"use strict";var e={elements_selector:"img",container:document,threshold:300,data_src:"src",data_srcset:"srcset",class_loading:"loading",class_loaded:"loaded",class_error:"error",callback_load:null,callback_error:null,callback_set:null},t=function(e,t){return e.getAttribute("data-"+t)},n=function(e,t,n){return e.setAttribute("data-"+t,n)},r=function(e){return e.filter(function(e){return!t(e,"was-processed")})},s=function(e,t){var n=new e(t),r=new CustomEvent("LazyLoad::Initialized",{detail:{instance:n}});window.dispatchEvent(r)},o=function(e,n){var r=n.data_srcset,s=e.parentElement;if("PICTURE"===s.tagName)for(var o,a=0;o=s.children[a];a+=1)if("SOURCE"===o.tagName){var i=t(o,r);i&&o.setAttribute("srcset",i)}},a=function(e,n){var r=n.data_src,s=n.data_srcset,a=e.tagName,i=t(e,r);if("IMG"===a){o(e,n);var c=t(e,s);return c&&e.setAttribute("srcset",c),void(i&&e.setAttribute("src",i))}"IFRAME"!==a?i&&(e.style.backgroundImage='url("'+i+'")'):i&&e.setAttribute("src",i)},i="classList"in document.createElement("p"),c=function(e,t){i?e.classList.add(t):e.className+=(e.className?" ":"")+t},l=function(e,t){i?e.classList.remove(t):e.className=e.className.replace(new RegExp("(^|\\s+)"+t+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")},u=function(e,t){e&&e(t)},f=function(e,t,n){e.removeEventListener("load",t),e.removeEventListener("error",n)},d=function(e,t){var n=function n(s){_(s,!0,t),f(e,n,r)},r=function r(s){_(s,!1,t),f(e,n,r)};e.addEventListener("load",n),e.addEventListener("error",r)},_=function(e,t,n){var r=e.target;l(r,n.class_loading),c(r,t?n.class_loaded:n.class_error),u(t?n.callback_load:n.callback_error,r)},v=function(e,t){["IMG","IFRAME"].indexOf(e.tagName)>-1&&(d(e,t),c(e,t.class_loading)),a(e,t),n(e,"was-processed",!0),u(t.callback_set,e)},m=function(t,n){this._settings=_extends({},e,t),this._setObserver(),this.update(n)};m.prototype={_setObserver:function(){var e=this;if("IntersectionObserver"in window){var t=this._settings;this._observer=new IntersectionObserver(function(n){n.forEach(function(n){if(n.intersectionRatio>0){var r=n.target;v(r,t),e._observer.unobserve(r)}}),e._elements=r(e._elements)},{root:t.container===document?null:t.container,rootMargin:t.threshold+"px"})}},update:function(e){var t=this,n=this._settings,s=e||n.container.querySelectorAll(n.elements_selector);this._elements=r(Array.prototype.slice.call(s)),this._observer?this._elements.forEach(function(e){t._observer.observe(e)}):(this._elements.forEach(function(e){v(e,n)}),this._elements=r(this._elements))},destroy:function(){var e=this;this._observer&&(r(this._elements).forEach(function(t){e._observer.unobserve(t)}),this._observer=null),this._elements=null,this._settings=null}};var b=window.lazyLoadOptions;return b&&function(e,t){if(t.length)for(var n,r=0;n=t[r];r+=1)s(e,n);else s(e,t)}(m,b),m});;
!function(i){"use strict";"function"==typeof define&&define.amd?define(["jquery"],i):"undefined"!=typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function(i){"use strict";var e=window.Slick||{};(e=function(){var e=0;return function(t,o){var s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(t),appendDots:i(t),arrows:!0,asNavFor:null,prevArrow:'<button class="slick-prev" aria-label="Previous" type="button">Previous</button>',nextArrow:'<button class="slick-next" aria-label="Next" type="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return i('<button type="button" />').text(t+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},n.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},i.extend(n,n.initials),n.activeBreakpoint=null,n.animType=null,n.animProp=null,n.breakpoints=[],n.breakpointSettings=[],n.cssTransitions=!1,n.focussed=!1,n.interrupted=!1,n.hidden="hidden",n.paused=!0,n.positionProp=null,n.respondTo=null,n.rowCount=1,n.shouldClick=!0,n.$slider=i(t),n.$slidesCache=null,n.transformType=null,n.transitionType=null,n.visibilityChange="visibilitychange",n.windowWidth=0,n.windowTimer=null,s=i(t).data("slick")||{},n.options=i.extend({},n.defaults,o,s),n.currentSlide=n.options.initialSlide,n.originalSettings=n.options,void 0!==document.mozHidden?(n.hidden="mozHidden",n.visibilityChange="mozvisibilitychange"):void 0!==document.webkitHidden&&(n.hidden="webkitHidden",n.visibilityChange="webkitvisibilitychange"),n.autoPlay=i.proxy(n.autoPlay,n),n.autoPlayClear=i.proxy(n.autoPlayClear,n),n.autoPlayIterator=i.proxy(n.autoPlayIterator,n),n.changeSlide=i.proxy(n.changeSlide,n),n.clickHandler=i.proxy(n.clickHandler,n),n.selectHandler=i.proxy(n.selectHandler,n),n.setPosition=i.proxy(n.setPosition,n),n.swipeHandler=i.proxy(n.swipeHandler,n),n.dragHandler=i.proxy(n.dragHandler,n),n.keyHandler=i.proxy(n.keyHandler,n),n.instanceUid=e++,n.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,n.registerBreakpoints(),n.init(!0)}}()).prototype.activateADA=function(){this.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},e.prototype.addSlide=e.prototype.slickAdd=function(e,t,o){var s=this;if("boolean"==typeof t)o=t,t=null;else if(t<0||t>=s.slideCount)return!1;s.unload(),"number"==typeof t?0===t&&0===s.$slides.length?i(e).appendTo(s.$slideTrack):o?i(e).insertBefore(s.$slides.eq(t)):i(e).insertAfter(s.$slides.eq(t)):!0===o?i(e).prependTo(s.$slideTrack):i(e).appendTo(s.$slideTrack),s.$slides=s.$slideTrack.children(this.options.slide),s.$slideTrack.children(this.options.slide).detach(),s.$slideTrack.append(s.$slides),s.$slides.each(function(e,t){i(t).attr("data-slick-index",e)}),s.$slidesCache=s.$slides,s.reinit()},e.prototype.animateHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.animate({height:e},i.options.speed)}},e.prototype.animateSlide=function(e,t){var o={},s=this;s.animateHeight(),!0===s.options.rtl&&!1===s.options.vertical&&(e=-e),!1===s.transformsEnabled?!1===s.options.vertical?s.$slideTrack.animate({left:e},s.options.speed,s.options.easing,t):s.$slideTrack.animate({top:e},s.options.speed,s.options.easing,t):!1===s.cssTransitions?(!0===s.options.rtl&&(s.currentLeft=-s.currentLeft),i({animStart:s.currentLeft}).animate({animStart:e},{duration:s.options.speed,easing:s.options.easing,step:function(i){i=Math.ceil(i),!1===s.options.vertical?(o[s.animType]="translate("+i+"px, 0px)",s.$slideTrack.css(o)):(o[s.animType]="translate(0px,"+i+"px)",s.$slideTrack.css(o))},complete:function(){t&&t.call()}})):(s.applyTransition(),e=Math.ceil(e),!1===s.options.vertical?o[s.animType]="translate3d("+e+"px, 0px, 0px)":o[s.animType]="translate3d(0px,"+e+"px, 0px)",s.$slideTrack.css(o),t&&setTimeout(function(){s.disableTransition(),t.call()},s.options.speed))},e.prototype.getNavTarget=function(){var e=this,t=e.options.asNavFor;return t&&null!==t&&(t=i(t).not(e.$slider)),t},e.prototype.asNavFor=function(e){var t=this.getNavTarget();null!==t&&"object"==typeof t&&t.each(function(){var t=i(this).slick("getSlick");t.unslicked||t.slideHandler(e,!0)})},e.prototype.applyTransition=function(i){var e=this,t={};!1===e.options.fade?t[e.transitionType]=e.transformType+" "+e.options.speed+"ms "+e.options.cssEase:t[e.transitionType]="opacity "+e.options.speed+"ms "+e.options.cssEase,!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.autoPlay=function(){var i=this;i.autoPlayClear(),i.slideCount>i.options.slidesToShow&&(i.autoPlayTimer=setInterval(i.autoPlayIterator,i.options.autoplaySpeed))},e.prototype.autoPlayClear=function(){var i=this;i.autoPlayTimer&&clearInterval(i.autoPlayTimer)},e.prototype.autoPlayIterator=function(){var i=this,e=i.currentSlide+i.options.slidesToScroll;i.paused||i.interrupted||i.focussed||(!1===i.options.infinite&&(1===i.direction&&i.currentSlide+1===i.slideCount-1?i.direction=0:0===i.direction&&(e=i.currentSlide-i.options.slidesToScroll,i.currentSlide-1==0&&(i.direction=1))),i.slideHandler(e))},e.prototype.buildArrows=function(){var e=this;!0===e.options.arrows&&(e.$prevArrow=i(e.options.prevArrow).addClass("slick-arrow"),e.$nextArrow=i(e.options.nextArrow).addClass("slick-arrow"),e.slideCount>e.options.slidesToShow?(e.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.prependTo(e.options.appendArrows),e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.appendTo(e.options.appendArrows),!0!==e.options.infinite&&e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):e.$prevArrow.add(e.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},e.prototype.buildDots=function(){var e,t,o=this;if(!0===o.options.dots){for(o.$slider.addClass("slick-dotted"),t=i("<ul />").addClass(o.options.dotsClass),e=0;e<=o.getDotCount();e+=1)t.append(i("<li />").append(o.options.customPaging.call(this,o,e)));o.$dots=t.appendTo(o.options.appendDots),o.$dots.find("li").first().addClass("slick-active")}},e.prototype.buildOut=function(){var e=this;e.$slides=e.$slider.children(e.options.slide+":not(.slick-cloned)").addClass("slick-slide"),e.slideCount=e.$slides.length,e.$slides.each(function(e,t){i(t).attr("data-slick-index",e).data("originalStyling",i(t).attr("style")||"")}),e.$slider.addClass("slick-slider"),e.$slideTrack=0===e.slideCount?i('<div class="slick-track"/>').appendTo(e.$slider):e.$slides.wrapAll('<div class="slick-track"/>').parent(),e.$list=e.$slideTrack.wrap('<div class="slick-list"/>').parent(),e.$slideTrack.css("opacity",0),!0!==e.options.centerMode&&!0!==e.options.swipeToSlide||(e.options.slidesToScroll=1),i("img[data-lazy]",e.$slider).not("[src]").addClass("slick-loading"),e.setupInfinite(),e.buildArrows(),e.buildDots(),e.updateDots(),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),!0===e.options.draggable&&e.$list.addClass("draggable")},e.prototype.buildRows=function(){var i,e,t,o,s,n,r,l=this;if(o=document.createDocumentFragment(),n=l.$slider.children(),l.options.rows>1){for(r=l.options.slidesPerRow*l.options.rows,s=Math.ceil(n.length/r),i=0;i<s;i++){var d=document.createElement("div");for(e=0;e<l.options.rows;e++){var a=document.createElement("div");for(t=0;t<l.options.slidesPerRow;t++){var c=i*r+(e*l.options.slidesPerRow+t);n.get(c)&&a.appendChild(n.get(c))}d.appendChild(a)}o.appendChild(d)}l.$slider.empty().append(o),l.$slider.children().children().children().css({width:100/l.options.slidesPerRow+"%",display:"inline-block"})}},e.prototype.checkResponsive=function(e,t){var o,s,n,r=this,l=!1,d=r.$slider.width(),a=window.innerWidth||i(window).width();if("window"===r.respondTo?n=a:"slider"===r.respondTo?n=d:"min"===r.respondTo&&(n=Math.min(a,d)),r.options.responsive&&r.options.responsive.length&&null!==r.options.responsive){s=null;for(o in r.breakpoints)r.breakpoints.hasOwnProperty(o)&&(!1===r.originalSettings.mobileFirst?n<r.breakpoints[o]&&(s=r.breakpoints[o]):n>r.breakpoints[o]&&(s=r.breakpoints[o]));null!==s?null!==r.activeBreakpoint?(s!==r.activeBreakpoint||t)&&(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):null!==r.activeBreakpoint&&(r.activeBreakpoint=null,r.options=r.originalSettings,!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e),l=s),e||!1===l||r.$slider.trigger("breakpoint",[r,l])}},e.prototype.changeSlide=function(e,t){var o,s,n,r=this,l=i(e.currentTarget);switch(l.is("a")&&e.preventDefault(),l.is("li")||(l=l.closest("li")),n=r.slideCount%r.options.slidesToScroll!=0,o=n?0:(r.slideCount-r.currentSlide)%r.options.slidesToScroll,e.data.message){case"previous":s=0===o?r.options.slidesToScroll:r.options.slidesToShow-o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide-s,!1,t);break;case"next":s=0===o?r.options.slidesToScroll:o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide+s,!1,t);break;case"index":var d=0===e.data.index?0:e.data.index||l.index()*r.options.slidesToScroll;r.slideHandler(r.checkNavigable(d),!1,t),l.children().trigger("focus");break;default:return}},e.prototype.checkNavigable=function(i){var e,t;if(e=this.getNavigableIndexes(),t=0,i>e[e.length-1])i=e[e.length-1];else for(var o in e){if(i<e[o]){i=t;break}t=e[o]}return i},e.prototype.cleanUpEvents=function(){var e=this;e.options.dots&&null!==e.$dots&&(i("li",e.$dots).off("click.slick",e.changeSlide).off("mouseenter.slick",i.proxy(e.interrupt,e,!0)).off("mouseleave.slick",i.proxy(e.interrupt,e,!1)),!0===e.options.accessibility&&e.$dots.off("keydown.slick",e.keyHandler)),e.$slider.off("focus.slick blur.slick"),!0===e.options.arrows&&e.slideCount>e.options.slidesToShow&&(e.$prevArrow&&e.$prevArrow.off("click.slick",e.changeSlide),e.$nextArrow&&e.$nextArrow.off("click.slick",e.changeSlide),!0===e.options.accessibility&&(e.$prevArrow&&e.$prevArrow.off("keydown.slick",e.keyHandler),e.$nextArrow&&e.$nextArrow.off("keydown.slick",e.keyHandler))),e.$list.off("touchstart.slick mousedown.slick",e.swipeHandler),e.$list.off("touchmove.slick mousemove.slick",e.swipeHandler),e.$list.off("touchend.slick mouseup.slick",e.swipeHandler),e.$list.off("touchcancel.slick mouseleave.slick",e.swipeHandler),e.$list.off("click.slick",e.clickHandler),i(document).off(e.visibilityChange,e.visibility),e.cleanUpSlideEvents(),!0===e.options.accessibility&&e.$list.off("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().off("click.slick",e.selectHandler),i(window).off("orientationchange.slick.slick-"+e.instanceUid,e.orientationChange),i(window).off("resize.slick.slick-"+e.instanceUid,e.resize),i("[draggable!=true]",e.$slideTrack).off("dragstart",e.preventDefault),i(window).off("load.slick.slick-"+e.instanceUid,e.setPosition)},e.prototype.cleanUpSlideEvents=function(){var e=this;e.$list.off("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.off("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.cleanUpRows=function(){var i,e=this;e.options.rows>1&&((i=e.$slides.children().children()).removeAttr("style"),e.$slider.empty().append(i))},e.prototype.clickHandler=function(i){!1===this.shouldClick&&(i.stopImmediatePropagation(),i.stopPropagation(),i.preventDefault())},e.prototype.destroy=function(e){var t=this;t.autoPlayClear(),t.touchObject={},t.cleanUpEvents(),i(".slick-cloned",t.$slider).detach(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.$prevArrow.length&&(t.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove()),t.$nextArrow&&t.$nextArrow.length&&(t.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove()),t.$slides&&(t.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){i(this).attr("style",i(this).data("originalStyling"))}),t.$slideTrack.children(this.options.slide).detach(),t.$slideTrack.detach(),t.$list.detach(),t.$slider.append(t.$slides)),t.cleanUpRows(),t.$slider.removeClass("slick-slider"),t.$slider.removeClass("slick-initialized"),t.$slider.removeClass("slick-dotted"),t.unslicked=!0,e||t.$slider.trigger("destroy",[t])},e.prototype.disableTransition=function(i){var e=this,t={};t[e.transitionType]="",!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.fadeSlide=function(i,e){var t=this;!1===t.cssTransitions?(t.$slides.eq(i).css({zIndex:t.options.zIndex}),t.$slides.eq(i).animate({opacity:1},t.options.speed,t.options.easing,e)):(t.applyTransition(i),t.$slides.eq(i).css({opacity:1,zIndex:t.options.zIndex}),e&&setTimeout(function(){t.disableTransition(i),e.call()},t.options.speed))},e.prototype.fadeSlideOut=function(i){var e=this;!1===e.cssTransitions?e.$slides.eq(i).animate({opacity:0,zIndex:e.options.zIndex-2},e.options.speed,e.options.easing):(e.applyTransition(i),e.$slides.eq(i).css({opacity:0,zIndex:e.options.zIndex-2}))},e.prototype.filterSlides=e.prototype.slickFilter=function(i){var e=this;null!==i&&(e.$slidesCache=e.$slides,e.unload(),e.$slideTrack.children(this.options.slide).detach(),e.$slidesCache.filter(i).appendTo(e.$slideTrack),e.reinit())},e.prototype.focusHandler=function(){var e=this;e.$slider.off("focus.slick blur.slick").on("focus.slick blur.slick","*",function(t){t.stopImmediatePropagation();var o=i(this);setTimeout(function(){e.options.pauseOnFocus&&(e.focussed=o.is(":focus"),e.autoPlay())},0)})},e.prototype.getCurrent=e.prototype.slickCurrentSlide=function(){return this.currentSlide},e.prototype.getDotCount=function(){var i=this,e=0,t=0,o=0;if(!0===i.options.infinite)if(i.slideCount<=i.options.slidesToShow)++o;else for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else if(!0===i.options.centerMode)o=i.slideCount;else if(i.options.asNavFor)for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else o=1+Math.ceil((i.slideCount-i.options.slidesToShow)/i.options.slidesToScroll);return o-1},e.prototype.getLeft=function(i){var e,t,o,s,n=this,r=0;return n.slideOffset=0,t=n.$slides.first().outerHeight(!0),!0===n.options.infinite?(n.slideCount>n.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,s=-1,!0===n.options.vertical&&!0===n.options.centerMode&&(2===n.options.slidesToShow?s=-1.5:1===n.options.slidesToShow&&(s=-2)),r=t*n.options.slidesToShow*s),n.slideCount%n.options.slidesToScroll!=0&&i+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(i>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(i-n.slideCount))*n.slideWidth*-1,r=(n.options.slidesToShow-(i-n.slideCount))*t*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,r=n.slideCount%n.options.slidesToScroll*t*-1))):i+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(i+n.options.slidesToShow-n.slideCount)*n.slideWidth,r=(i+n.options.slidesToShow-n.slideCount)*t),n.slideCount<=n.options.slidesToShow&&(n.slideOffset=0,r=0),!0===n.options.centerMode&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:!0===n.options.centerMode&&!0===n.options.infinite?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:!0===n.options.centerMode&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),e=!1===n.options.vertical?i*n.slideWidth*-1+n.slideOffset:i*t*-1+r,!0===n.options.variableWidth&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,!0===n.options.centerMode&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow+1),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,e+=(n.$list.width()-o.outerWidth())/2)),e},e.prototype.getOption=e.prototype.slickGetOption=function(i){return this.options[i]},e.prototype.getNavigableIndexes=function(){var i,e=this,t=0,o=0,s=[];for(!1===e.options.infinite?i=e.slideCount:(t=-1*e.options.slidesToScroll,o=-1*e.options.slidesToScroll,i=2*e.slideCount);t<i;)s.push(t),t=o+e.options.slidesToScroll,o+=e.options.slidesToScroll<=e.options.slidesToShow?e.options.slidesToScroll:e.options.slidesToShow;return s},e.prototype.getSlick=function(){return this},e.prototype.getSlideCount=function(){var e,t,o=this;return t=!0===o.options.centerMode?o.slideWidth*Math.floor(o.options.slidesToShow/2):0,!0===o.options.swipeToSlide?(o.$slideTrack.find(".slick-slide").each(function(s,n){if(n.offsetLeft-t+i(n).outerWidth()/2>-1*o.swipeLeft)return e=n,!1}),Math.abs(i(e).attr("data-slick-index")-o.currentSlide)||1):o.options.slidesToScroll},e.prototype.goTo=e.prototype.slickGoTo=function(i,e){this.changeSlide({data:{message:"index",index:parseInt(i)}},e)},e.prototype.init=function(e){var t=this;i(t.$slider).hasClass("slick-initialized")||(i(t.$slider).addClass("slick-initialized"),t.buildRows(),t.buildOut(),t.setProps(),t.startLoad(),t.loadSlider(),t.initializeEvents(),t.updateArrows(),t.updateDots(),t.checkResponsive(!0),t.focusHandler()),e&&t.$slider.trigger("init",[t]),!0===t.options.accessibility&&t.initADA(),t.options.autoplay&&(t.paused=!1,t.autoPlay())},e.prototype.initADA=function(){var e=this,t=Math.ceil(e.slideCount/e.options.slidesToShow),o=e.getNavigableIndexes().filter(function(i){return i>=0&&i<e.slideCount});e.$slides.add(e.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),null!==e.$dots&&(e.$slides.not(e.$slideTrack.find(".slick-cloned")).each(function(t){var s=o.indexOf(t);i(this).attr({role:"tabpanel",id:"slick-slide"+e.instanceUid+t,tabindex:-1}),-1!==s&&i(this).attr({"aria-describedby":"slick-slide-control"+e.instanceUid+s})}),e.$dots.attr("role","tablist").find("li").each(function(s){var n=o[s];i(this).attr({role:"presentation"}),i(this).find("button").first().attr({role:"tab",id:"slick-slide-control"+e.instanceUid+s,"aria-controls":"slick-slide"+e.instanceUid+n,"aria-label":s+1+" of "+t,"aria-selected":null,tabindex:"-1"})}).eq(e.currentSlide).find("button").attr({"aria-selected":"true",tabindex:"0"}).end());for(var s=e.currentSlide,n=s+e.options.slidesToShow;s<n;s++)e.$slides.eq(s).attr("tabindex",0);e.activateADA()},e.prototype.initArrowEvents=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},i.changeSlide),i.$nextArrow.off("click.slick").on("click.slick",{message:"next"},i.changeSlide),!0===i.options.accessibility&&(i.$prevArrow.on("keydown.slick",i.keyHandler),i.$nextArrow.on("keydown.slick",i.keyHandler)))},e.prototype.initDotEvents=function(){var e=this;!0===e.options.dots&&(i("li",e.$dots).on("click.slick",{message:"index"},e.changeSlide),!0===e.options.accessibility&&e.$dots.on("keydown.slick",e.keyHandler)),!0===e.options.dots&&!0===e.options.pauseOnDotsHover&&i("li",e.$dots).on("mouseenter.slick",i.proxy(e.interrupt,e,!0)).on("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.initSlideEvents=function(){var e=this;e.options.pauseOnHover&&(e.$list.on("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.on("mouseleave.slick",i.proxy(e.interrupt,e,!1)))},e.prototype.initializeEvents=function(){var e=this;e.initArrowEvents(),e.initDotEvents(),e.initSlideEvents(),e.$list.on("touchstart.slick mousedown.slick",{action:"start"},e.swipeHandler),e.$list.on("touchmove.slick mousemove.slick",{action:"move"},e.swipeHandler),e.$list.on("touchend.slick mouseup.slick",{action:"end"},e.swipeHandler),e.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},e.swipeHandler),e.$list.on("click.slick",e.clickHandler),i(document).on(e.visibilityChange,i.proxy(e.visibility,e)),!0===e.options.accessibility&&e.$list.on("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),i(window).on("orientationchange.slick.slick-"+e.instanceUid,i.proxy(e.orientationChange,e)),i(window).on("resize.slick.slick-"+e.instanceUid,i.proxy(e.resize,e)),i("[draggable!=true]",e.$slideTrack).on("dragstart",e.preventDefault),i(window).on("load.slick.slick-"+e.instanceUid,e.setPosition),i(e.setPosition)},e.prototype.initUI=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.show(),i.$nextArrow.show()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.show()},e.prototype.keyHandler=function(i){var e=this;i.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===i.keyCode&&!0===e.options.accessibility?e.changeSlide({data:{message:!0===e.options.rtl?"next":"previous"}}):39===i.keyCode&&!0===e.options.accessibility&&e.changeSlide({data:{message:!0===e.options.rtl?"previous":"next"}}))},e.prototype.lazyLoad=function(){function e(e){i("img[data-lazy]",e).each(function(){var e=i(this),t=i(this).attr("data-lazy"),o=i(this).attr("data-srcset"),s=i(this).attr("data-sizes")||n.$slider.attr("data-sizes"),r=document.createElement("img");r.onload=function(){e.animate({opacity:0},100,function(){o&&(e.attr("srcset",o),s&&e.attr("sizes",s)),e.attr("src",t).animate({opacity:1},200,function(){e.removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading")}),n.$slider.trigger("lazyLoaded",[n,e,t])})},r.onerror=function(){e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),n.$slider.trigger("lazyLoadError",[n,e,t])},r.src=t})}var t,o,s,n=this;if(!0===n.options.centerMode?!0===n.options.infinite?s=(o=n.currentSlide+(n.options.slidesToShow/2+1))+n.options.slidesToShow+2:(o=Math.max(0,n.currentSlide-(n.options.slidesToShow/2+1)),s=n.options.slidesToShow/2+1+2+n.currentSlide):(o=n.options.infinite?n.options.slidesToShow+n.currentSlide:n.currentSlide,s=Math.ceil(o+n.options.slidesToShow),!0===n.options.fade&&(o>0&&o--,s<=n.slideCount&&s++)),t=n.$slider.find(".slick-slide").slice(o,s),"anticipated"===n.options.lazyLoad)for(var r=o-1,l=s,d=n.$slider.find(".slick-slide"),a=0;a<n.options.slidesToScroll;a++)r<0&&(r=n.slideCount-1),t=(t=t.add(d.eq(r))).add(d.eq(l)),r--,l++;e(t),n.slideCount<=n.options.slidesToShow?e(n.$slider.find(".slick-slide")):n.currentSlide>=n.slideCount-n.options.slidesToShow?e(n.$slider.find(".slick-cloned").slice(0,n.options.slidesToShow)):0===n.currentSlide&&e(n.$slider.find(".slick-cloned").slice(-1*n.options.slidesToShow))},e.prototype.loadSlider=function(){var i=this;i.setPosition(),i.$slideTrack.css({opacity:1}),i.$slider.removeClass("slick-loading"),i.initUI(),"progressive"===i.options.lazyLoad&&i.progressiveLazyLoad()},e.prototype.next=e.prototype.slickNext=function(){this.changeSlide({data:{message:"next"}})},e.prototype.orientationChange=function(){var i=this;i.checkResponsive(),i.setPosition()},e.prototype.pause=e.prototype.slickPause=function(){var i=this;i.autoPlayClear(),i.paused=!0},e.prototype.play=e.prototype.slickPlay=function(){var i=this;i.autoPlay(),i.options.autoplay=!0,i.paused=!1,i.focussed=!1,i.interrupted=!1},e.prototype.postSlide=function(e){var t=this;t.unslicked||(t.$slider.trigger("afterChange",[t,e]),t.animating=!1,t.slideCount>t.options.slidesToShow&&t.setPosition(),t.swipeLeft=null,t.options.autoplay&&t.autoPlay(),!0===t.options.accessibility&&(t.initADA(),t.options.focusOnChange&&i(t.$slides.get(t.currentSlide)).attr("tabindex",0).focus()))},e.prototype.prev=e.prototype.slickPrev=function(){this.changeSlide({data:{message:"previous"}})},e.prototype.preventDefault=function(i){i.preventDefault()},e.prototype.progressiveLazyLoad=function(e){e=e||1;var t,o,s,n,r,l=this,d=i("img[data-lazy]",l.$slider);d.length?(t=d.first(),o=t.attr("data-lazy"),s=t.attr("data-srcset"),n=t.attr("data-sizes")||l.$slider.attr("data-sizes"),(r=document.createElement("img")).onload=function(){s&&(t.attr("srcset",s),n&&t.attr("sizes",n)),t.attr("src",o).removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading"),!0===l.options.adaptiveHeight&&l.setPosition(),l.$slider.trigger("lazyLoaded",[l,t,o]),l.progressiveLazyLoad()},r.onerror=function(){e<3?setTimeout(function(){l.progressiveLazyLoad(e+1)},500):(t.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),l.$slider.trigger("lazyLoadError",[l,t,o]),l.progressiveLazyLoad())},r.src=o):l.$slider.trigger("allImagesLoaded",[l])},e.prototype.refresh=function(e){var t,o,s=this;o=s.slideCount-s.options.slidesToShow,!s.options.infinite&&s.currentSlide>o&&(s.currentSlide=o),s.slideCount<=s.options.slidesToShow&&(s.currentSlide=0),t=s.currentSlide,s.destroy(!0),i.extend(s,s.initials,{currentSlide:t}),s.init(),e||s.changeSlide({data:{message:"index",index:t}},!1)},e.prototype.registerBreakpoints=function(){var e,t,o,s=this,n=s.options.responsive||null;if("array"===i.type(n)&&n.length){s.respondTo=s.options.respondTo||"window";for(e in n)if(o=s.breakpoints.length-1,n.hasOwnProperty(e)){for(t=n[e].breakpoint;o>=0;)s.breakpoints[o]&&s.breakpoints[o]===t&&s.breakpoints.splice(o,1),o--;s.breakpoints.push(t),s.breakpointSettings[t]=n[e].settings}s.breakpoints.sort(function(i,e){return s.options.mobileFirst?i-e:e-i})}},e.prototype.reinit=function(){var e=this;e.$slides=e.$slideTrack.children(e.options.slide).addClass("slick-slide"),e.slideCount=e.$slides.length,e.currentSlide>=e.slideCount&&0!==e.currentSlide&&(e.currentSlide=e.currentSlide-e.options.slidesToScroll),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),e.registerBreakpoints(),e.setProps(),e.setupInfinite(),e.buildArrows(),e.updateArrows(),e.initArrowEvents(),e.buildDots(),e.updateDots(),e.initDotEvents(),e.cleanUpSlideEvents(),e.initSlideEvents(),e.checkResponsive(!1,!0),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),e.setPosition(),e.focusHandler(),e.paused=!e.options.autoplay,e.autoPlay(),e.$slider.trigger("reInit",[e])},e.prototype.resize=function(){var e=this;i(window).width()!==e.windowWidth&&(clearTimeout(e.windowDelay),e.windowDelay=window.setTimeout(function(){e.windowWidth=i(window).width(),e.checkResponsive(),e.unslicked||e.setPosition()},50))},e.prototype.removeSlide=e.prototype.slickRemove=function(i,e,t){var o=this;if(i="boolean"==typeof i?!0===(e=i)?0:o.slideCount-1:!0===e?--i:i,o.slideCount<1||i<0||i>o.slideCount-1)return!1;o.unload(),!0===t?o.$slideTrack.children().remove():o.$slideTrack.children(this.options.slide).eq(i).remove(),o.$slides=o.$slideTrack.children(this.options.slide),o.$slideTrack.children(this.options.slide).detach(),o.$slideTrack.append(o.$slides),o.$slidesCache=o.$slides,o.reinit()},e.prototype.setCSS=function(i){var e,t,o=this,s={};!0===o.options.rtl&&(i=-i),e="left"==o.positionProp?Math.ceil(i)+"px":"0px",t="top"==o.positionProp?Math.ceil(i)+"px":"0px",s[o.positionProp]=i,!1===o.transformsEnabled?o.$slideTrack.css(s):(s={},!1===o.cssTransitions?(s[o.animType]="translate("+e+", "+t+")",o.$slideTrack.css(s)):(s[o.animType]="translate3d("+e+", "+t+", 0px)",o.$slideTrack.css(s)))},e.prototype.setDimensions=function(){var i=this;!1===i.options.vertical?!0===i.options.centerMode&&i.$list.css({padding:"0px "+i.options.centerPadding}):(i.$list.height(i.$slides.first().outerHeight(!0)*i.options.slidesToShow),!0===i.options.centerMode&&i.$list.css({padding:i.options.centerPadding+" 0px"})),i.listWidth=i.$list.width(),i.listHeight=i.$list.height(),!1===i.options.vertical&&!1===i.options.variableWidth?(i.slideWidth=Math.ceil(i.listWidth/i.options.slidesToShow),i.$slideTrack.width(Math.ceil(i.slideWidth*i.$slideTrack.children(".slick-slide").length))):!0===i.options.variableWidth?i.$slideTrack.width(5e3*i.slideCount):(i.slideWidth=Math.ceil(i.listWidth),i.$slideTrack.height(Math.ceil(i.$slides.first().outerHeight(!0)*i.$slideTrack.children(".slick-slide").length)));var e=i.$slides.first().outerWidth(!0)-i.$slides.first().width();!1===i.options.variableWidth&&i.$slideTrack.children(".slick-slide").width(i.slideWidth-e)},e.prototype.setFade=function(){var e,t=this;t.$slides.each(function(o,s){e=t.slideWidth*o*-1,!0===t.options.rtl?i(s).css({position:"relative",right:e,top:0,zIndex:t.options.zIndex-2,opacity:0}):i(s).css({position:"relative",left:e,top:0,zIndex:t.options.zIndex-2,opacity:0})}),t.$slides.eq(t.currentSlide).css({zIndex:t.options.zIndex-1,opacity:1})},e.prototype.setHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.css("height",e)}},e.prototype.setOption=e.prototype.slickSetOption=function(){var e,t,o,s,n,r=this,l=!1;if("object"===i.type(arguments[0])?(o=arguments[0],l=arguments[1],n="multiple"):"string"===i.type(arguments[0])&&(o=arguments[0],s=arguments[1],l=arguments[2],"responsive"===arguments[0]&&"array"===i.type(arguments[1])?n="responsive":void 0!==arguments[1]&&(n="single")),"single"===n)r.options[o]=s;else if("multiple"===n)i.each(o,function(i,e){r.options[i]=e});else if("responsive"===n)for(t in s)if("array"!==i.type(r.options.responsive))r.options.responsive=[s[t]];else{for(e=r.options.responsive.length-1;e>=0;)r.options.responsive[e].breakpoint===s[t].breakpoint&&r.options.responsive.splice(e,1),e--;r.options.responsive.push(s[t])}l&&(r.unload(),r.reinit())},e.prototype.setPosition=function(){var i=this;i.setDimensions(),i.setHeight(),!1===i.options.fade?i.setCSS(i.getLeft(i.currentSlide)):i.setFade(),i.$slider.trigger("setPosition",[i])},e.prototype.setProps=function(){var i=this,e=document.body.style;i.positionProp=!0===i.options.vertical?"top":"left","top"===i.positionProp?i.$slider.addClass("slick-vertical"):i.$slider.removeClass("slick-vertical"),void 0===e.WebkitTransition&&void 0===e.MozTransition&&void 0===e.msTransition||!0===i.options.useCSS&&(i.cssTransitions=!0),i.options.fade&&("number"==typeof i.options.zIndex?i.options.zIndex<3&&(i.options.zIndex=3):i.options.zIndex=i.defaults.zIndex),void 0!==e.OTransform&&(i.animType="OTransform",i.transformType="-o-transform",i.transitionType="OTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.MozTransform&&(i.animType="MozTransform",i.transformType="-moz-transform",i.transitionType="MozTransition",void 0===e.perspectiveProperty&&void 0===e.MozPerspective&&(i.animType=!1)),void 0!==e.webkitTransform&&(i.animType="webkitTransform",i.transformType="-webkit-transform",i.transitionType="webkitTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.msTransform&&(i.animType="msTransform",i.transformType="-ms-transform",i.transitionType="msTransition",void 0===e.msTransform&&(i.animType=!1)),void 0!==e.transform&&!1!==i.animType&&(i.animType="transform",i.transformType="transform",i.transitionType="transition"),i.transformsEnabled=i.options.useTransform&&null!==i.animType&&!1!==i.animType},e.prototype.setSlideClasses=function(i){var e,t,o,s,n=this;if(t=n.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),n.$slides.eq(i).addClass("slick-current"),!0===n.options.centerMode){var r=n.options.slidesToShow%2==0?1:0;e=Math.floor(n.options.slidesToShow/2),!0===n.options.infinite&&(i>=e&&i<=n.slideCount-1-e?n.$slides.slice(i-e+r,i+e+1).addClass("slick-active").attr("aria-hidden","false"):(o=n.options.slidesToShow+i,t.slice(o-e+1+r,o+e+2).addClass("slick-active").attr("aria-hidden","false")),0===i?t.eq(t.length-1-n.options.slidesToShow).addClass("slick-center"):i===n.slideCount-1&&t.eq(n.options.slidesToShow).addClass("slick-center")),n.$slides.eq(i).addClass("slick-center")}else i>=0&&i<=n.slideCount-n.options.slidesToShow?n.$slides.slice(i,i+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):t.length<=n.options.slidesToShow?t.addClass("slick-active").attr("aria-hidden","false"):(s=n.slideCount%n.options.slidesToShow,o=!0===n.options.infinite?n.options.slidesToShow+i:i,n.options.slidesToShow==n.options.slidesToScroll&&n.slideCount-i<n.options.slidesToShow?t.slice(o-(n.options.slidesToShow-s),o+s).addClass("slick-active").attr("aria-hidden","false"):t.slice(o,o+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"));"ondemand"!==n.options.lazyLoad&&"anticipated"!==n.options.lazyLoad||n.lazyLoad()},e.prototype.setupInfinite=function(){var e,t,o,s=this;if(!0===s.options.fade&&(s.options.centerMode=!1),!0===s.options.infinite&&!1===s.options.fade&&(t=null,s.slideCount>s.options.slidesToShow)){for(o=!0===s.options.centerMode?s.options.slidesToShow+1:s.options.slidesToShow,e=s.slideCount;e>s.slideCount-o;e-=1)t=e-1,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t-s.slideCount).prependTo(s.$slideTrack).addClass("slick-cloned");for(e=0;e<o+s.slideCount;e+=1)t=e,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t+s.slideCount).appendTo(s.$slideTrack).addClass("slick-cloned");s.$slideTrack.find(".slick-cloned").find("[id]").each(function(){i(this).attr("id","")})}},e.prototype.interrupt=function(i){var e=this;i||e.autoPlay(),e.interrupted=i},e.prototype.selectHandler=function(e){var t=this,o=i(e.target).is(".slick-slide")?i(e.target):i(e.target).parents(".slick-slide"),s=parseInt(o.attr("data-slick-index"));s||(s=0),t.slideCount<=t.options.slidesToShow?t.slideHandler(s,!1,!0):t.slideHandler(s)},e.prototype.slideHandler=function(i,e,t){var o,s,n,r,l,d=null,a=this;if(e=e||!1,!(!0===a.animating&&!0===a.options.waitForAnimate||!0===a.options.fade&&a.currentSlide===i))if(!1===e&&a.asNavFor(i),o=i,d=a.getLeft(o),r=a.getLeft(a.currentSlide),a.currentLeft=null===a.swipeLeft?r:a.swipeLeft,!1===a.options.infinite&&!1===a.options.centerMode&&(i<0||i>a.getDotCount()*a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else if(!1===a.options.infinite&&!0===a.options.centerMode&&(i<0||i>a.slideCount-a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else{if(a.options.autoplay&&clearInterval(a.autoPlayTimer),s=o<0?a.slideCount%a.options.slidesToScroll!=0?a.slideCount-a.slideCount%a.options.slidesToScroll:a.slideCount+o:o>=a.slideCount?a.slideCount%a.options.slidesToScroll!=0?0:o-a.slideCount:o,a.animating=!0,a.$slider.trigger("beforeChange",[a,a.currentSlide,s]),n=a.currentSlide,a.currentSlide=s,a.setSlideClasses(a.currentSlide),a.options.asNavFor&&(l=(l=a.getNavTarget()).slick("getSlick")).slideCount<=l.options.slidesToShow&&l.setSlideClasses(a.currentSlide),a.updateDots(),a.updateArrows(),!0===a.options.fade)return!0!==t?(a.fadeSlideOut(n),a.fadeSlide(s,function(){a.postSlide(s)})):a.postSlide(s),void a.animateHeight();!0!==t?a.animateSlide(d,function(){a.postSlide(s)}):a.postSlide(s)}},e.prototype.startLoad=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.hide(),i.$nextArrow.hide()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.hide(),i.$slider.addClass("slick-loading")},e.prototype.swipeDirection=function(){var i,e,t,o,s=this;return i=s.touchObject.startX-s.touchObject.curX,e=s.touchObject.startY-s.touchObject.curY,t=Math.atan2(e,i),(o=Math.round(180*t/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0?!1===s.options.rtl?"left":"right":o<=360&&o>=315?!1===s.options.rtl?"left":"right":o>=135&&o<=225?!1===s.options.rtl?"right":"left":!0===s.options.verticalSwiping?o>=35&&o<=135?"down":"up":"vertical"},e.prototype.swipeEnd=function(i){var e,t,o=this;if(o.dragging=!1,o.swiping=!1,o.scrolling)return o.scrolling=!1,!1;if(o.interrupted=!1,o.shouldClick=!(o.touchObject.swipeLength>10),void 0===o.touchObject.curX)return!1;if(!0===o.touchObject.edgeHit&&o.$slider.trigger("edge",[o,o.swipeDirection()]),o.touchObject.swipeLength>=o.touchObject.minSwipe){switch(t=o.swipeDirection()){case"left":case"down":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide+o.getSlideCount()):o.currentSlide+o.getSlideCount(),o.currentDirection=0;break;case"right":case"up":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide-o.getSlideCount()):o.currentSlide-o.getSlideCount(),o.currentDirection=1}"vertical"!=t&&(o.slideHandler(e),o.touchObject={},o.$slider.trigger("swipe",[o,t]))}else o.touchObject.startX!==o.touchObject.curX&&(o.slideHandler(o.currentSlide),o.touchObject={})},e.prototype.swipeHandler=function(i){var e=this;if(!(!1===e.options.swipe||"ontouchend"in document&&!1===e.options.swipe||!1===e.options.draggable&&-1!==i.type.indexOf("mouse")))switch(e.touchObject.fingerCount=i.originalEvent&&void 0!==i.originalEvent.touches?i.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,!0===e.options.verticalSwiping&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),i.data.action){case"start":e.swipeStart(i);break;case"move":e.swipeMove(i);break;case"end":e.swipeEnd(i)}},e.prototype.swipeMove=function(i){var e,t,o,s,n,r,l=this;return n=void 0!==i.originalEvent?i.originalEvent.touches:null,!(!l.dragging||l.scrolling||n&&1!==n.length)&&(e=l.getLeft(l.currentSlide),l.touchObject.curX=void 0!==n?n[0].pageX:i.clientX,l.touchObject.curY=void 0!==n?n[0].pageY:i.clientY,l.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(l.touchObject.curX-l.touchObject.startX,2))),r=Math.round(Math.sqrt(Math.pow(l.touchObject.curY-l.touchObject.startY,2))),!l.options.verticalSwiping&&!l.swiping&&r>4?(l.scrolling=!0,!1):(!0===l.options.verticalSwiping&&(l.touchObject.swipeLength=r),t=l.swipeDirection(),void 0!==i.originalEvent&&l.touchObject.swipeLength>4&&(l.swiping=!0,i.preventDefault()),s=(!1===l.options.rtl?1:-1)*(l.touchObject.curX>l.touchObject.startX?1:-1),!0===l.options.verticalSwiping&&(s=l.touchObject.curY>l.touchObject.startY?1:-1),o=l.touchObject.swipeLength,l.touchObject.edgeHit=!1,!1===l.options.infinite&&(0===l.currentSlide&&"right"===t||l.currentSlide>=l.getDotCount()&&"left"===t)&&(o=l.touchObject.swipeLength*l.options.edgeFriction,l.touchObject.edgeHit=!0),!1===l.options.vertical?l.swipeLeft=e+o*s:l.swipeLeft=e+o*(l.$list.height()/l.listWidth)*s,!0===l.options.verticalSwiping&&(l.swipeLeft=e+o*s),!0!==l.options.fade&&!1!==l.options.touchMove&&(!0===l.animating?(l.swipeLeft=null,!1):void l.setCSS(l.swipeLeft))))},e.prototype.swipeStart=function(i){var e,t=this;if(t.interrupted=!0,1!==t.touchObject.fingerCount||t.slideCount<=t.options.slidesToShow)return t.touchObject={},!1;void 0!==i.originalEvent&&void 0!==i.originalEvent.touches&&(e=i.originalEvent.touches[0]),t.touchObject.startX=t.touchObject.curX=void 0!==e?e.pageX:i.clientX,t.touchObject.startY=t.touchObject.curY=void 0!==e?e.pageY:i.clientY,t.dragging=!0},e.prototype.unfilterSlides=e.prototype.slickUnfilter=function(){var i=this;null!==i.$slidesCache&&(i.unload(),i.$slideTrack.children(this.options.slide).detach(),i.$slidesCache.appendTo(i.$slideTrack),i.reinit())},e.prototype.unload=function(){var e=this;i(".slick-cloned",e.$slider).remove(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.remove(),e.$nextArrow&&e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.remove(),e.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},e.prototype.unslick=function(i){var e=this;e.$slider.trigger("unslick",[e,i]),e.destroy()},e.prototype.updateArrows=function(){var i=this;Math.floor(i.options.slidesToShow/2),!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&!i.options.infinite&&(i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===i.currentSlide?(i.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-i.options.slidesToShow&&!1===i.options.centerMode?(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-1&&!0===i.options.centerMode&&(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},e.prototype.updateDots=function(){var i=this;null!==i.$dots&&(i.$dots.find("li").removeClass("slick-active").end(),i.$dots.find("li").eq(Math.floor(i.currentSlide/i.options.slidesToScroll)).addClass("slick-active"))},e.prototype.visibility=function(){var i=this;i.options.autoplay&&(document[i.hidden]?i.interrupted=!0:i.interrupted=!1)},i.fn.slick=function(){var i,t,o=this,s=arguments[0],n=Array.prototype.slice.call(arguments,1),r=o.length;for(i=0;i<r;i++)if("object"==typeof s||void 0===s?o[i].slick=new e(o[i],s):t=o[i].slick[s].apply(o[i].slick,n),void 0!==t)return t;return o}});;
/* global $, google, zxcvbn, LazyLoad */
function isElementInViewport(el) {

    var rect = el.getBoundingClientRect();
    // DOMRect { x: 8, y: 8, width: 100, height: 100, top: 8, right: 108, bottom: 108, left: 8 }
    var windowHeight = (window.innerHeight || document.documentElement.clientHeight);
    var windowWidth = (window.innerWidth || document.documentElement.clientWidth);


    var vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);
    var horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);

    return (vertInView && horInView);
}

if (!Array.from) {
    Array.from = (function () {
        var toStr = Object.prototype.toString;
        var isCallable = function (fn) {
            return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
        };
        var toInteger = function (value) {
            var number = Number(value);
            if (isNaN(number)) { return 0; }
            if (number === 0 || !isFinite(number)) { return number; }
            return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
        };
        var maxSafeInteger = Math.pow(2, 53) - 1;
        var toLength = function (value) {
            var len = toInteger(value);
            return Math.min(Math.max(len, 0), maxSafeInteger);
        };

        return function from(arrayLike/*, mapFn, thisArg */) {
            var C = this;

            var items = Object(arrayLike);

            if (arrayLike == null) {
                throw new TypeError('Array.from requires an array-like object - not null or undefined');
            }

            var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
            var T;
            if (typeof mapFn !== 'undefined') {
                if (!isCallable(mapFn)) {
                    throw new TypeError('Array.from: when provided, the second argument must be a function');
                }

                if (arguments.length > 2) {
                    T = arguments[2];
                }
            }

            var len = toLength(items.length);

            var A = isCallable(C) ? Object(new C(len)) : new Array(len);

            var k = 0;
            var kValue;
            while (k < len) {
                kValue = items[k];
                if (mapFn) {
                    A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
                } else {
                    A[k] = kValue;
                }
                k += 1;
            }
            A.length = len;
            return A;
        };
    }());
}

function loadVideos() {
    var allVideos = document.querySelectorAll('.autoplay');
    Array.from(allVideos).forEach(function (video) {
        if (isElementInViewport(video) && !video.getAttribute('src')) {
            // var videoUrl = video.dataset.src;
            // video.setAttribute('src', videoUrl);
            video.click();
        }
    });
}

// Test via a getter in the options object to see if the passive property is accessed
var supportsPassive = false;
try {
    var opts;
    opts = Object.defineProperty({}, 'passive', {
        get: function () {
            supportsPassive = true;
        }
    });
    window.addEventListener('testPassive', null, opts);
    window.removeEventListener('testPassive', null, opts);
} catch (e) {
    console.log('Error');
}

var Engine = {};
Engine.configs = {
    bodyElement: document.querySelector('body'),
    overlayElement: document.getElementById('menuOverlay')
};

Engine.loadScript = function (targetElement, scriptToLoad) {
    if (document.querySelector(targetElement)) {
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = scriptToLoad;
        document.body.appendChild(script);
    }
};

Engine.initMap = function () {
    var mapTarget = document.getElementById('map');
    var mapZoom = parseInt(mapTarget.dataset.zoom) || 5;
    var ralaOffice = { lat: 53.2352892, lng: -3.0190297 };
    var map = new google.maps.Map(mapTarget, {
        center: ralaOffice,
        zoom: mapZoom,
        disableDefaultUI: true,
        draggable: false,
        zoomControl: false,
        scrollwheel: false,
        disableDoubleClickZoom: true
    });
    var markers = [];
    var infoWindows = [];
    var mapLocations = document.getElementsByClassName('maplocation');
    Array.from(mapLocations).forEach(function (mapLocation, index) {
        var title = mapLocation.dataset.title,
            latLoc = Number.parseFloat(mapLocation.dataset.lat),
            lngLoc = Number.parseFloat(mapLocation.dataset.lng),
            bubbleContent = mapLocation.innerHTML;
        if (bubbleContent === '') {
            bubbleContent = '<h4>' + title + '</h4>';
        }
        var infowindow = new google.maps.InfoWindow({
            content: bubbleContent,
            maxWidth: 200
        });
        var marker = new google.maps.Marker({
            title: title,
            position: { lat: latLoc, lng: lngLoc },
            map: map
        });
        markers.push(marker);
        infoWindows.push(infowindow);
        marker.set('id', index);
        marker.addListener('click', function () {
            infowindow.open(map, marker);
        });
        var buttonStructure = '<button class="center-map btn btn-outline-dark mb-10px" data-markerid="' + marker.id + '">' + marker.title + '</button>&nbsp;';
        var buttonContainer = document.getElementById('button-container');
        buttonContainer.insertAdjacentHTML('beforeend', buttonStructure);
    });
    var centerMapButtons = document.getElementsByClassName('center-map');
    Array.from(centerMapButtons).forEach(function (centerMapButton) {
        centerMapButton.addEventListener('click', function () {
            infoWindows.forEach(function (element) {
                element.close();
            });
            var markerIndex = centerMapButton.dataset.markerid;
            map.panTo(markers[markerIndex].getPosition());
            infoWindows[markerIndex].open(map, markers[markerIndex]);
        });
    });
};

Engine.isBreakpoint = function (alias) {
    var breakpoint = document.querySelector('.device-' + alias);
    var style = window.getComputedStyle(breakpoint);
    return (style.display === 'block');
};

var scrollValue = 0,
    newScrollValue = 0;
Engine.toggleHeaderVisibility = function (scrollValue, newScrollValue) {
    var scrollDistance = newScrollValue - scrollValue,
        targetElement = document.querySelector('html');
    if (newScrollValue >= 120) {
        targetElement.classList.add('header-slim');
        // $('header').find('img').trigger('appear');
    } else {
        targetElement.classList.remove('header-slim');
    }

};

window.addEventListener('scroll', function (e) {
    // Get scroll distance once and pass into functions
    newScrollValue = window.pageYOffset;
    Engine.toggleHeaderVisibility(scrollValue, newScrollValue);
    // Engine.toggleBackToTop(newScrollValue);
    // Update global scroll value
    scrollValue = newScrollValue;
}, supportsPassive ? { passive: true } : false);



var checkboxToggler = document.body.querySelector('[data-toggle="checkboxes"]');
if (checkboxToggler) {
    checkboxToggler.addEventListener('click', function (e) {
        e.preventDefault();
        var targetCheckboxes = document.querySelectorAll(checkboxToggler.getAttribute('href'));
        var firstCheckbox = document.querySelector(checkboxToggler.getAttribute('href'));
        if (firstCheckbox.checked === true) {
            Array.from(targetCheckboxes).forEach(function (checkbox) {
                checkbox.checked = false;
            });
        } else {
            Array.from(targetCheckboxes).forEach(function (checkbox) {
                checkbox.checked = true;
            });
        }

    });
}

Engine.openOverlay = function () {
    Engine.configs.bodyElement.classList.add('overlay-open');
    Engine.configs.overlay.classList.add('open');
};
Engine.closeOverlay = function () {
    Engine.configs.bodyElement.classList.remove('overlay-open');
    Engine.configs.overlay.classList.remove('open');
};


// Open Overlay
function openOverlay() {
    $('body').addClass('overlay-open');
    $('#menuOverlay').addClass('open');
    if ($('#main-menu').find('.nav-sub-container.open').length > 0) {
        $('#main-menu').addClass('hidden-scroll');
    }
    // $('.brand-header').removeClass('sticky-top');
}
// Close Overlay
function closeOverlay() {
    $('body').removeClass('overlay-open');
    $('#menuOverlay').removeClass('open');
    //$('.ecomNavigationHeaderBlock [aria-expanded="true"]').click();
    // $('.brand-header').addClass('sticky-top');
}

function closeMobileNav() {
    $('.mobile-nav-container ').removeClass('open');
    $('#main-menu').removeClass('hidden-scroll');
}

function openSection(button, target) {

    $(button).addClass('open');
    $(target).addClass('open');
}

function closeSection(button, target) {

    $(button).removeClass('open');
    $(target).removeClass('open');
}

function closeAllSections() {
    var button = $('.toggle-section'),
        target = $('.toggle-target');
    closeSection(button, target);
}

function passwordStrength() {
    $('#password , #newPassword').on('keyup', function () {
        $('#password-indicator').fadeIn().addClass('show');
    });
    var strength = {
        0: 'Bad',
        1: 'Weak',
        2: 'Ok',
        3: 'Good',
        4: 'Strong'
    };
    var password = document.getElementById('password');
    var meter = document.getElementById('password-strength-meter');
    var text = document.getElementById('password-strength-text');
    if (password) {
        password.addEventListener('input', function () {
            var val = password.value;
            var result = zxcvbn(val);
            // Update the password strength meter
            meter.value = result.score;
            // Update the text indicator
            if (val !== '') {
                text.innerHTML = '<b>Strength:</b> ' + strength[result.score];
            } else {
                text.innerHTML = '';
            }
        });
    } else {
        return false;
    }
};

// Show/Hide Toggle

$('a[data-show], a[data-hide], button[data-hide], button[data-show]').click(function (e) {
    e.preventDefault();
});

$('[data-show]').click(function () {
    var target = $(this).data('show');
    $(target).removeClass('d-none');
});

$('[data-hide]').click(function () {
    var target = $(this).data('hide');
    $(target).addClass('d-none');
});

// Checkout Radio Toggle

$('#account').on('change', function () {
    if ($('#account').is(':checked')) {
        $('.account').removeClass('d-none');
        $('.credit-card').addClass('d-none');
        $('.paypal').addClass('d-none');
        $('.other').addClass('d-none');
    } else {
        $('.account').removeClass('d-none');
    }
});

$('#credit-card').on('change', function () {
    if ($('#credit-card').is(':checked')) {
        $('.account').addClass('d-none');
        $('.credit-card').removeClass('d-none');
        $('.paypal').addClass('d-none');
        $('.other').addClass('d-none');
    } else {
        $('.credit-card').removeClass('d-none');
    }
});


$('#paypal').on('change', function () {
    if ($('#paypal').is(':checked')) {
        $('.account').addClass('d-none');
        $('.credit-card').addClass('d-none');
        $('.paypal').removeClass('d-none');
        $('.other').addClass('d-none');
    } else {
        $('.paypal').removeClass('d-none');
    }
});

$('#other').on('change', function () {
    if ($('#other').is(':checked')) {
        $('.account').addClass('d-none');
        $('.credit-card').addClass('d-none');
        $('.paypal').addClass('d-none');
        $('.other').removeClass('d-none');
    } else {
        $('.other').removeClass('d-none');
    }
});


$('#defaultAddressCC').on('change', function () {
    if ($('#defaultAddressCC').is(':checked')) {
        $('.add-address2').addClass('d-none');
    } else {
        $('.add-address2').removeClass('d-none');
    }
});


$('#addNewAddressCC').on('change', function () {
    if ($('#addNewAddressCC').is(':checked')) {
        $('.add-address2').removeClass('d-none');
    } else {
        $('.add-address2').addClass('d-none');
    }
});


$('#defaultAddressPaypal').on('change', function () {
    if ($('#defaultAddressPaypal').is(':checked')) {
        $('.add-address3').addClass('d-none');
    } else {
        $('.add-address3').removeClass('d-none');
    }
});


$('#addNewAddressPaypal').on('change', function () {
    if ($('#addNewAddressPaypal').is(':checked')) {
        $('.add-address3').removeClass('d-none');
    } else {
        $('.add-address3').addClass('d-none');
    }
});


$('.add-address2').on('click', function () {
    $('#defaultAddressCC').prop('checked', true);
});

$('.add-address3').on('click', function () {
    $('#defaultAddressPaypal').prop('checked', true);
});


// PCA Predict

$('.pca').keyup(function () {
    if (this.value.length > 2) {
        $(this).next('.pca-show').removeClass('d-none');
    } else {
        $(this).next('.pca-show').addClass('d-none');
    }
});


function searchSuggestions() {
    $('#search').on('focus', function () {
        $('#search-suggestions').fadeIn().addClass('show');
        // openOverlay();
    });
    $('#search').on('blur', function () {
        $('#search-suggestions').fadeOut().removeClass('show');
        // closeOverlay();
    });
}

function returnSuggestions() {
    $('#return-search').on('focus', function () {
        $('#return-suggestions').fadeIn().addClass('show');
        // openOverlay();
    });
    $('#return-search').on('blur', function () {
        $('#return-suggestions').fadeOut().removeClass('show');
        // closeOverlay();
    });
}

$('.ecomNavigationHeaderBlock ').on('show.bs.dropdown',
    function () {
        openOverlay();
    });

$('.ecomNavigationHeaderBlock ').on('hidden.bs.dropdown',
    function () {

        closeOverlay();
    });

$('.ecomNavigationHeaderBlock ').on('hide.bs.dropdown',
    function () {
        return true;
    });


$('.ecomNavigationHeaderBlock .dropdown-toggle').on('touchstart',
    function () {
        $('html').addClass('usingTouch');
    });

$('.ecomNavigationHeaderBlock .dropdown-toggle').on('mouseover',
    function () {

        if (Engine.isBreakpoint('xs') || Engine.isBreakpoint('sm') || Engine.isBreakpoint('md')) {
            return;
        }
        if ($('html').hasClass('usingTouch') === false && $(this).attr('aria-expanded') === 'false') {

            $('html').addClass('usingMouse');
            (this).click();
        }

    });

$('.ecomNavigationHeaderBlock a.nav-link , .row.pull-slim').on('mouseover',
    function () {
        if (Engine.isBreakpoint('xs') || Engine.isBreakpoint('sm') || Engine.isBreakpoint('md')) {
            return;
        }
        if ($('html').hasClass('usingTouch') === false) {
            document.activeElement.blur();
            $('.ecomNavigationHeaderBlock [aria-expanded="true"]').click();
        }

    });

$('.ecomNavigationHeaderBlock button').on('mousedown', function () {

    if ($(this).attr('aria-expanded') === 'true' && $(this).data('url') !== window.undefined) {

        window.location.href = $(this).data("url");
    }

});

$('#menuOverlay').on('mouseover',
    function () {
        if (Engine.isBreakpoint('xs') || Engine.isBreakpoint('sm')) {
            return;
        }
        document.activeElement.blur();
        $('.ecomNavigationHeaderBlock [aria-expanded="true"]').click();
    });


$('#menuOverlay').click(function () {
    closeAllSections();
    $('#main-menu').removeClass('hidden-scroll');
});
// Mobile Nav Trigger
$('#mobile-menu').click(function () {
    $('.brand-header').addClass('open');
    openOverlay();
});

$('.mobile-close').click(function () {
    $('.brand-header').removeClass('open');
    closeMobileNav();
    closeOverlay();
});

// Close 'open' filter parent

$('.page-facets__close, .apply-filters').click(function (e) {

    var el = $(e.target).closest('.open');
    el.removeClass('open');
    setTimeout(function () { el.addClass('d-none') }, 300);
});

$('.page-facets__clear').click(function () {
    $('.page-facets__filters .page-facets__facet.selected').removeClass('selected');
});

$('.mobile-sidenav .closeButton').click(function () {
    $(this).parent().removeClass('open');
    closeOverlay();
});
$('#menuOverlay, .nav-close').click(function () {
    $('.mobile-sidenav').removeClass('open');
    $('.brand-header').removeClass('open');
    closeOverlay();
});
$('.sidenav-trigger').click(function () {
    var targetElement = $(this).data('target');
    openOverlay();
    $(targetElement).addClass('open');
});

$('.dropdown-link').click(function (e) {
    e.preventDefault();
    $(this).parent('li').toggleClass('open');
});

$('.sidenav a').hover(function () {
    $(this).parent().siblings().addClass('inactive');
}, function () {
    $(this).parent().siblings().removeClass('inactive');
});

$('.table-overflow .fade-overlay').click(function () {
    $(this).closest('.table-overflow').addClass('active');
});

$('#siteNavigation .has-children').bind('click', function (e) {

    // Show the submenu here
    if ((Engine.isBreakpoint('xs')) || (Engine.isBreakpoint('sm')) || (Engine.isBreakpoint('md'))) {
        e.preventDefault();
        var $this = $(this);
        // appendBacklink($this);
        $('#main-menu').addClass('hidden-scroll');
        $($this).siblings('.nav-sub-container').addClass('open');
    }
});

$(document).on('click', '.fade-collapse.collapse', function () {
    $(this).collapse('show');
});

$('#main-menu .has-children > a').click(function (e) {
    e.preventDefault();
    // console.log('Errr');
    $(this).next('.mobile-nav-container').addClass('open');
    $('#main-menu').addClass('hidden-scroll');
});

$(document).on('click', '.back-link', function () {
    $(this).closest('.mobile-nav-container ').removeClass('open');
    $('#main-menu').removeClass('hidden-scroll');
});

$(document).on('stylesheetLoaded', function () {
    // console.log('Stylesheet loaded');
});

function hideOrphanDot(carousel) {
    var dotLength = $(carousel).find('.slick-dots').children('li').length;
    if (dotLength === 1) {
        $(carousel).find('.slick-dots').addClass('d-none');
    }
}
function hidePagination(carousel) {
    var slidesToShow = carousel.slick('slickGetOption', 'slidesToShow');
    var slidesInCarousel = carousel.find('.slick-slide').length;
    // console.log(slidesToShow + ' ' + slidesInCarousel);
    var carouselPagination = carousel.closest('.block-container').siblings('.block-pagination').find('.carousel-pagination-values');
    if (slidesInCarousel <= slidesToShow) {
        carouselPagination.removeClass('d-sm-block');
    } else {
        carouselPagination.addClass('d-sm-block');
    }
}

function animateScroll(scrollTarget) {
    if ($(scrollTarget).is(':visible')) {
        $('html, body').animate({ scrollTop: $(scrollTarget).offset().top - 10 }, 400);
    }
}

// function scrollTo($this) {
// 	var scrollTarget = $this.data('scrollto');
// 	animateScroll(scrollTarget);
// }
//Scroll to for mobile
$(document).on('click', '[data-scrollto]', function (e) {
    e.preventDefault();
    var $this = $(this),
        isDisabled = $this.attr('disabled');
    //console.log(isDisabled);
    if (isDisabled !== 'disabled') {
        scrollTo($this);
    }
});

function changeTab(targetTabSet, targetTab) {
    var tabIndex = $(targetTabSet + ' ' + targetTab).index(targetTabSet + ' ' + '.tab-pane');
    $(targetTabSet + ' .nav-tabs li').eq(tabIndex).find('a').trigger('click');
}
// Change tabs from external link
$(document).on('click', '[data-tablink]', function () {
    // e.preventDefault();
    var targetTabSet = $(this).data('tablink'),
        targetTab = $(this).attr('data-target');
    changeTab(targetTabSet, targetTab);
});
// Product detail functions
$(document).on('click', '.img-gallery-thumb img', function () {
    var newImgSrc = $(this).data('full');
    $('.product-video-main').addClass('d-none').children('iframe').attr('src', '');
    $('.product-image-main').removeClass('d-none');
    $('.product-image-main img').attr('src', newImgSrc).data('zoom-image', newImgSrc);
    $('.zoomContainer').remove();
    $('#elevate-zoomr').removeData('elevateZoom');
});
$(document).on('click', '.video-thumb img', function () {
    var videoSrc = $(this).data('videoid');
    $('.product-image-main').addClass('d-none');
    $('.product-video-main').removeClass('d-none').children('iframe').attr('src', 'https://player.vimeo.com/video/' + videoSrc);
});
$(document).on('click', '.video-thumb .fa', function () {
    $('.video-thumb img').trigger('click');
});

$(document).on('click', '.btn-zoom', function () {
    if (Engine.isBreakpoint('xs') || Engine.isBreakpoint('sm')) {
        var zoomImg = $(this).siblings('#zoom1').data('zoom-image'),
            zoomOverlay = '<div class="zoomOverlayXS"><a class="btn btn-default btn-close"><span class="fa fa-close"></span></a><div class="zoomImgContainer"><img class="img-fluid" alt="Close" src="' + zoomImg + '"></div></div>';
        // console.log(zoomImg);
        $('body').append(zoomOverlay).addClass('overlay-open');
        $('#menuOverlay').addClass('open');
        $('.zoomOverlayXS .zoomImgContainer img').panzoom({
            minScale: 1,
            maxScale: 5,
            contain: 'invert'
        });
    }
    // else {
    //     $(".product-image-main img").ezPlus();
    // }
});
$(document).on('click', '.zoomOverlayXS .btn-close', function () {
    // console.log('Should close');
    $('.zoomOverlayXS img').panzoom('destroy');
    $('.zoomOverlayXS').remove();
    $('#menuOverlay').removeClass('open');
    $('body').removeClass('overlay-open');
    $('.ecomNavigationHeaderBlock [aria-expanded="true"]').click();
});


$(document).on('click', '.variantSelect', function (e) {
    e.preventDefault();
    var target = $(this).data('target');
    $('#productSelect-' + target).collapse('show');
    $('#productSelect-' + target).on('shown.bs.collapse', function () {
        var scrollTarget = '#productSelect-' + target;
        if (!Engine.isBreakpoint('xl')) {
            animateScroll(scrollTarget);
        } else {
            var sectionHeight = $(scrollTarget).height();
            var screenHeight = $(window).height();
            var difference = screenHeight - sectionHeight;
            $('html, body').animate({ scrollTop: $(scrollTarget).offset().top - difference + 10 }, 400);
        }
    });


});
$(document).on('change', '#variantDropdown', function () {
    var target = $(this).data('target');
    $('#productSelect-' + target).collapse('show');
    animateScroll('#productSelect-' + target);
});

$(document).on('click', '.custom-dropdown-finish-guide .custom-dropdown-item', function () {
    var value = $(this).val();
    // if (value == '') {
    // 	$('.finish-guide-table').removeClass('active');
    // }
    // else {
    $('.finish-guide-table').addClass('active');
    // }
});

// $('.collapseTabs').tabCollapse({
// tabsClass: 'hidden-sm',
// accordionClass: 'visible-sm'
// });

$('[data-toggle="prices"]').click(function (e) {
    e.preventDefault();
    $('.variant-options-table').toggleClass('show-prices');
});

function announcementSliderXS() {
    if ((Engine.isBreakpoint('xs')) && (!$('.slider-xs > .block-container >  .block-content > .slick-initialized').length)) {
        $('.slider-xs > .block-container >  .block-content > .row').slick({
            mobileFirst: true,
            autoplaySpeed: 5000,
            autoplay: true,
            fade: true,
            slidesToShow: 1,
            slidesToScroll: 1,
            draggable: false,
            arrows: false,
            dots: false,
            lazyLoad: 'ondemand',
            responsive: [{
                breakpoint: 768,
                settings: {
                    slidesToShow: 3
                }
            }]

        });
    } else {
        if ((!Engine.isBreakpoint('xs')) && ($('.slider-xs > .block-container >  .block-content > .slick-initialized').length)) {
            $('.slider-xs > .block-container >  .block-content > .slick-initialized').slick('destroy');
        }
    }
}

// Switch grid view

function hoverInFunc() {
    // console.log($(this));
    var button = $(this),
        target = $(button).data('target');
    openSection(button, target);
}

function hoverOutFunc() {
    // console.log(el);
    var button = $(this),
        target = $(button).data('target');
    closeSection(button, target);
}

(function () {
    'use strict';
    window.addEventListener('load', function () {
        // Fetch all the forms we want to apply custom Bootstrap validation styles to
        var forms = document.getElementsByClassName('needs-validation');
        // Loop over them and prevent submission
        var validation = Array.prototype.filter.call(forms, function (form) {
            form.addEventListener('submit', function (event) {
                if (form.checkValidity() === false) {
                    event.preventDefault();
                    event.stopPropagation();
                }
                else {
                    event.preventDefault();
                    event.stopPropagation();
                    calculateRoomSize();
                }
                form.classList.add('was-validated');
            }, false);
        });
    }, false);
})();

function calculateRoomSize() {

    var height = document.getElementById('calculate-dimensions').elements.item(0).value;
    var length = document.getElementById('calculate-dimensions').elements.item(1).value;
    var width = document.getElementById('calculate-dimensions').elements.item(2).value;

    if (height > 0 && length > 0 && width > 0) {
        var result = height * width * length;
        document.getElementById('calculated-result').innerHTML = result;
        $('.modal-wrapper').hide('slow', function () {
            setTimeout(function () {
                $('.modal-result-wrapper').show('slow', function () { });

            }, 500);
        });

    } else {
        alert('please fill in all the boxes');
    }
    //e.preventDefault();
}
// Quickshop table toggle show prices
var toggleTableButtons = document.body.querySelector('[data-toggle="collapseTable"]');
if (toggleTableButtons) {
    toggleTableButtons.onclick = function (event) {
        var toggleButton = event.target;
        var toggleTargets = document.getElementsByClassName(toggleButton.dataset.target);
        if (toggleButton.classList.contains('collapsed')) {
            for (var toggleTarget in toggleTargets) {
                $(toggleTarget).collapse('show');
            }
            toggleButton.classList.remove('collapsed');
        } else {
            for (var toggleTarget in toggleTargets) {
                $(toggleTarget).collapse('hide');
            }
            toggleButton.classList.add('collapsed');
        }
    };
}
$('.remove-from-basket').click(function () {
    $('.basket-checkout-product-block').addClass('.product-block-overlay');

    /*$( ".remove-product-item" ).show( "slow", function() {
		// Animation complete.
	});*/
});

$('.content-internal').click(function () {
    $('.basket-amend-block').show(function () {
        setTimeout(function () {
            $('.basket-amend-block').hide('slow', function () { });
        }, 2000);
    });
});

// $( ".hidden-delivery-block-header" ).click(function() {
// 	$( ".basket-delivery" ).toggle( "slow", function() {
// 		// Animation complete.
// 	});
// });

$('.reset-calculator').click(function () {
    $('.modal-result-wrapper').hide('slow', function () {
        setTimeout(function () {
            $('.modal-wrapper').show('slow', function () { });
            document.getElementById('calculate-dimensions').reset();


        }, 500);
    });
});
$('.collapse-small-trigger').click(function () {
    if (Engine.isBreakpoint('xs') || Engine.isBreakpoint('sm')) {
        $(this).toggleClass('show');
        var targetElement = $(this).siblings('.collapse-small');
        $(targetElement).collapse('toggle');
    }
});



$('.pp').click(function () {
    $('.active-paypal').hide('slow', function () { });
});

$('.cc').click(function () {
    $('.active-paypal').show('slow', function () { });
});

function setGtmCheckoutOption(step, option) {
    if (typeof window.dataLayer !== 'undefined') {
        window.dataLayer.push({
            'event': 'checkoutOption',
            'ecommerce': {
                'checkout_option': {
                    'actionField': { 'step': step, 'option': option }
                }
            }
        });
        if (step === 1) {

            var i;
            var d = 0;
            for (i = window.dataLayer.length - 1; i >= 0; i--) {
                if (window.dataLayer[i].event === "checkoutShipping") {
                    d = window.dataLayer[i];
                    break;
                }
            }

            var email = '';
            if (document.getElementById("Email") !== null) {
                email = document.getElementById("Email").value;
            } else {
                email = document.getElementById("s2sEmail").value;
            }

            window.dataLayer.push({
                'event': 'brontoShipping',
                'brontoCart': {
                    'cartUrl': window.location.origin + window.basketPageUrl,
                    'customerEmail': email,
                    'shippingDetails': option,
                    'products': d.brontoCart.products
                }
            });
        }
    }
}


$('.addToBasket').click(function (e) {
    $('.add-basket').show('slow', function (e) {
    });
    setTimeout(function (e) {
        $('.add-basket').fadeOut();
    }, 3000);
});

$('.pp').click(function (e) {
    $(this).addClass('cc-cardbox-active');
    $('.cc').removeClass('cc-cardbox-active');
    $('.hidden-if-paypal').hide('slow', function () { });
    $('.hidden-paypal-block').show('slow', function () { });

    $('.pp-wrapper').addClass('toggleActiveOpacity');
    $('.pp-wrapper').removeClass('toggleInActiveOpacity');
    $('.cc-wrapper').addClass('toggleInActiveOpacity');

    setGtmCheckoutOption(2, 'PayPal');
    e.preventDefault();
});
$('.cc').click(function (e) {
    $(this).addClass('cc-cardbox-active');
    $('.pp').removeClass('cc-cardbox-active');
    $('.hidden-if-paypal').show('slow', function () { });
    $('.hidden-paypal-block').hide('slow', function () { });

    $('.cc-wrapper').addClass('toggleActiveOpacity');
    $('.cc-wrapper').removeClass('toggleInActiveOpacity');
    $('.pp-wrapper').addClass('toggleInActiveOpacity');

    setGtmCheckoutOption(2, 'CreditCard');
    e.preventDefault();
});

$('.card.shipping').click(function (e) {

    $('.card.shipping.active').removeClass('active');
    $(this).addClass('active');

});

$('#ShipToStore').click(function (e) {
    $('#ShipToCustomerForm').addClass('d-none');
    $('#ShipToStoreForm').removeClass('d-none');
});

$('#ShipToCustomer').click(function (e) {
    $('#ShipToStoreForm').addClass('d-none');
    $('#ShipToCustomerForm').removeClass('d-none');
});

$('.pp, .cc, .select-sa-address').keypress(function (e) {

    if (e.key === ' ' || e.key === 'Spacebar' || e.which === 13) {
        // ' ' is standard, 'Spacebar' was used by IE9 and Firefox < 37
        e.preventDefault();
        $(this).click();
    }

});

/*

 show/hide checkout steps in order

*/

$('.continueStep2').click(function (e) {
    if (!$(this).hasClass('disabled')) {
        $('.step-1-wrapper').toggle('slow', function () {
        });
        $('.step-2-wrapper').toggle('slow', function () {
        });
        $('html, body').animate({ scrollTop: 0 }, 'slow');
        e.preventDefault();
    }
});

$('.continueStep3').click(function (e) {
    if (!$(this).hasClass('disabled')) {
        $('.step-1-wrapper').hide('slow', function () {
        });
        $(".step-1-wrapper, .step-2-wrapper, .paymentNew").slideUp("slow", function () {
        });
        $('.step-2-wrapper').hide('slow', function () {
        });
        $('html, body').animate({ scrollTop: 0 }, 'slow');
        e.preventDefault();
    }
});


/*
	890 - 900
	This manages the mobile menu for the blog page

 */
$('.blog-navigation-mobile-cta').click(function (e) {
    $('.blog-navigation-mobile').slideToggle('slow', function () { });
    $('.blog-navigation-mobile-cta').slideToggle('slow', function () { });
    //e.preventDefault();
});

$('.fa-close').click(function (e) {
    $('.blog-navigation-mobile-cta').slideToggle('slow', function () { });
    $('.blog-navigation-mobile').slideToggle('slow', function () { });
});
/*

 The below Functions relate to the Checkout Logged in Logic that deals
 with the show hide of the "Active" bar block on the left

*/
// TODO : This will need to be dynamic to deal with multiple address's
$('.sa-1').click(function (e) {


    //console.log('event fired');
    $('.sa-select-1').slideDown('', function () { });
    $('.sa-select-2').slideUp('slow', function () { });
    $('.sa-select-3').slideUp('slow', function () { });

    $('.sa-1').addClass('toggleActiveOpacity');
    $('.sa-2').removeClass('toggleActiveOpacity');
    $('.sa-3').removeClass('toggleActiveOpacity');

    e.preventDefault();
});

$('.sa-2').click(function (e) {

    $('.sa-select-1').slideUp('slow', function () { });
    $('.sa-select-2').slideDown('', function () { });
    $('.sa-select-3').slideUp('slow', function () { });

    $('.sa-1').removeClass('toggleActiveOpacity');
    $('.sa-2').addClass('toggleActiveOpacity');
    $('.sa-3').removeClass('toggleActiveOpacity');

    e.preventDefault();
});

$('.sa-3').click(function (e) {

    $('.sa-select-1').slideUp('slow', function () { });
    $('.sa-select-2').slideUp('slow', function () { });
    $('.sa-select-3').slideDown('', function () { });

    $('.sa-1').removeClass('toggleActiveOpacity');
    $('.sa-2').removeClass('toggleActiveOpacity');
    $('.sa-3').addClass('toggleActiveOpacity');

    e.preventDefault();
});

/*

 The below Functions relate to the Checkout Logged in Logic that deals
 with the show hide of the "Active" bar block on the left

*/
$('.select-cc-card').click(function (e) {
    if (!$(this).hasClass('toggleActiveOpacity')) {
        $('.select-cc-card').removeClass('toggleActiveOpacity');
        $('.ccv').removeClass('toggleActiveOpacity');

        $('.ccv-wrapper-span').removeClass('open');
        $('.ccv-wrapper-logo').removeClass('open');

        $('.sc-select-p').slideUp('slow', function () { });

        $('.ccv-input-control').removeAttr('data-st-field');
        $('.ccv-input-control').removeAttr('pattern');
        $('.ccv-input-control').removeClass('required');

        $('#TermsAndCond').prop("checked", false);

        $(this).addClass('toggleActiveOpacity');
        $(this).find('.sc-select-p').slideDown('slow', function () { });
        $(this).find('.ccv').addClass('toggleActiveOpacity');

        $(this).find('.ccv-wrapper-span').addClass('open');
        $(this).find('.ccv-wrapper-logo').addClass('open');

        $(this).find('.ccv-input-control').attr('data-st-field', 'securitycode');
        $(this).find('.ccv-input-control').attr('pattern', '\\d{3,4}');
        $(this).find('.ccv-input-control').addClass('required');

        setSt();


        $("element").attr("id", "newId");
        setGtmCheckoutOption(2, 'SavedCard');
    }
    e.preventDefault();
});



/*
* 	Showroom Map Key Logic - Show/hide
*/
$('.map-key').on('click', function (e) {
    $('.map-key').removeClass('activeKey');
    $(e.target).closest('.map-key').addClass('activeKey');
});

$('.showroom-button').click(function () {
    $('.ck1').removeClass('ckhide');
    $('.ck2').addClass('ckhide');
    $('.ck3').addClass('ckhide');
});

$('.fb-stockists-button').click(function () {
    $('.ck1').addClass('ckhide');
    $('.ck2').removeClass('ckhide');
    $('.ck3').addClass('ckhide');
});

$('.fb-premium').click(function () {
    $('.ck1').addClass('ckhide');
    $('.ck2').addClass('ckhide');
    $('.ck3').removeClass('ckhide');
});


/*
    Function to show a row on the quick shop page.
    Modifies the row in the table and checks/unchecks the label in the dropdown list.
*/
var showRow = function (targetRow, targetCheckbox) {
    targetRow.classList.remove('d-none');
    targetCheckbox.checked = true;
};
var hideRow = function (targetRow, targetCheckbox) {
    targetRow.classList.add('d-none');
    targetCheckbox.checked = false;
};

/*
    ** Dropdown click function **
    Adds an event to the click of a dropdown checkbox. Prevents default to stop function firing twice and stops propagation to prevent the dropdown from closing.
*/
var dropdownCheckboxes = document.querySelectorAll('.dropdown-item .custom-checkbox');
Array.from(dropdownCheckboxes).forEach(function (dropdownCheckbox, index) {
    dropdownCheckbox.addEventListener('click', function (e) {
        e.stopPropagation();
        // e.preventDefault();
        var targetRows = document.querySelectorAll('.qsTableRow');
        var targetRow = targetRows[index];
        var targetCheckbox = dropdownCheckbox.querySelector('input');
        if (targetCheckbox.checked === true) {
            hideRow(targetRow, targetCheckbox);
        } else {
            showRow(targetRow, targetCheckbox);
        }

    });
});

var checkAllButton = document.getElementById('checkAllButton');
if (checkAllButton) {
    checkAllButton.addEventListener('click', function (e) {
        e.stopPropagation();
        var targetRows = document.getElementsByClassName('qsTableRow');
        var targetCheckboxes = document.querySelectorAll('span.dropdown-item');
        Array.from(targetRows).forEach(function (targetRow, index) {
            var targetCheckbox = targetCheckboxes[index].querySelector('input');
            showRow(targetRow, targetCheckbox);
        });
    });
}

var checkNoneButton = document.getElementById('checkNoneButton');
if (checkNoneButton) {
    checkNoneButton.addEventListener('click', function (e) {
        e.stopPropagation();
        var targetRows = document.getElementsByClassName('qsTableRow');
        var targetCheckboxes = document.querySelectorAll('span.dropdown-item');
        Array.from(targetRows).forEach(function (targetRow, index) {
            var targetCheckbox = targetCheckboxes[index].querySelector('input');
            hideRow(targetRow, targetCheckbox);
        });
    });
}

// Open/Close function
var toggleOpenButtons = document.getElementsByClassName('toggle-open');
if (toggleOpenButtons) {
    Array.from(toggleOpenButtons).forEach(function (toggleButton) {
        toggleButton.addEventListener('click', function () {
            var target = document.getElementById(toggleButton.dataset.target);
            target.classList.toggle('open');
        });
    });
}


$(document).on('change', '.duplicateItem select', function () {
    $(this).closest('.duplicateItem').find('.d-unselected').addClass('d-none');
    $(this).closest('.duplicateItem').find('.d-selected').removeClass('d-none');
    $(this).closest('.duplicateItem').find('input').prop('disabled', false);
});
var cardSelect = document.getElementById('selectCard'),
    cardNewDiv = document.getElementById('cardNew');
if (cardSelect) {
    cardSelect.addEventListener('change', function (e) {
        var cardSelectValue = e.target.value;
        // console.log(cardSelectValue);
        if (cardSelectValue === 'new') {
            cardNewDiv.classList.remove('d-none');
        } else {
            cardNewDiv.classList.add('d-none');
        }
    });
}
function calculateCols() {
    if (Engine.isBreakpoint('xs')) {
        var colCountToShow = 2;
    } else if (Engine.isBreakpoint('sm') || Engine.isBreakpoint('md')) {
        colCountToShow = 3;
    } else if (Engine.isBreakpoint('lg')) {
        colCountToShow = 5;
    } else {
        colCountToShow = 6;
    }
    return colCountToShow;
}
var tableRows = document.querySelectorAll('.table-qs tr');
var startingCol = 0;
if (tableRows.length) {
    var colCountToShow = calculateCols();
    var colCount = tableRows[0].getElementsByClassName('sizeCol').length;
    var prevButton = document.getElementById('qsPrevButton');
    var nextButton = document.getElementById('qsNextButton');
}
function resetCols() {
    if (tableRows.length) {
        var allCols = document.getElementsByClassName('sizeCol');
        for (var i = 0, count = allCols.length; i < count; i++) {
            allCols[i].classList.remove('d-none');
        }
        colCountToShow = calculateCols();
        startingCol = 0;
        hideColsOnLoad();
        prevButton.setAttribute('disabled', '');
    }
}

function hideColsOnLoad() {
    if (tableRows.length) {
        for (var i = 0, len = tableRows.length; i < len; i++) {
            var rowCols = tableRows[i].getElementsByClassName('sizeCol');
            for (var n = 0, alt = rowCols.length; n < alt; n++) {
                if (n >= colCountToShow) {
                    rowCols[n].classList.add('d-none');
                }
            }
        }
        if (colCount == colCountToShow) {
            prevButton.setAttribute('disabled', '');
            nextButton.setAttribute('disabled', '');
        } else {
            nextButton.removeAttribute('disabled');
        }
    }
}


function shiftCols(direction) {
    if (tableRows) {
        if (direction == 'right') {
            startingCol = startingCol + 1;
        } else {
            startingCol = startingCol - 1;
        }
        var endingCol = startingCol + colCountToShow;

        for (var i = 0, len = tableRows.length; i < len; i++) {
            var rowCols = tableRows[i].getElementsByClassName('sizeCol');
            if ((startingCol >= 0) && endingCol <= rowCols.length) {
                for (var n = 0, alt = rowCols.length; n < alt; n++) {
                    if ((n >= startingCol) && (n < endingCol)) {
                        rowCols[n].classList.remove('d-none');
                    } else {
                        rowCols[n].classList.add('d-none');
                    }
                }
            }
        }
        if (startingCol > 0) {
            prevButton.removeAttribute('disabled');
        } else {
            prevButton.setAttribute('disabled', '');
        }
        if (endingCol == colCount) {
            nextButton.setAttribute('disabled', '');
        } else {
            nextButton.removeAttribute('disabled');
        }
    }
}

// Custom dropdown at XS/SM
var xsDropdownTriggers = document.querySelectorAll('[data-toggle="xsDropdown"]');
if (xsDropdownTriggers) {
    Array.from(xsDropdownTriggers).forEach(function (trigger) {
        trigger.addEventListener('click', function () {
            var targetDropdown = document.getElementById(trigger.getAttribute('data-target'));
            if (targetDropdown) {
                targetDropdown.classList.toggle('open');
            }
        });
    });
}

// Product zoom carousel
var productZoomItems = document.querySelectorAll('.zoomable');
if (productZoomItems) {
    // var zoomModal = document.getElementById('zoomCarousel');
    Array.from(productZoomItems).forEach(function (zoomItem) {
        zoomItem.addEventListener('click', function () {
            if (Engine.isBreakpoint('lg') || Engine.isBreakpoint('xl')) {
                $('#zoomCarousel').modal('show');
                var slideIndex = zoomItem.closest('.be-inspired-item').dataset.slickIndex;

                $('#zoomCarousel').find('.slick-slider').slick('slickGoTo', slideIndex);
            }
        });
    });
}

// Checkout form interactions
var addressOptions = document.querySelectorAll('.select-sa-address');
var deliveryDetails = document.getElementById('deliveryDetails');
var deliveryPrompt = document.getElementById('deliveryPrompt');
var addressFields = document.querySelectorAll('.manualAddressField');

// Function to reveal delivery costs
var revealDeliveryCosts = function () {
    if (deliveryDetails) {
        deliveryDetails.classList.add('show');
    }
    if (deliveryPrompt) {
        deliveryPrompt.classList.add('d-none');
    }
};

if (addressOptions) {
    Array.from(addressOptions).forEach(function (addressOption) {
        addressOption.addEventListener('click', function () {
            revealDeliveryCosts();
        });
    });
}
if (addressFields) {
    Array.from(addressFields).forEach(function (addressField) {
        addressField.addEventListener('change', function () {
            revealDeliveryCosts();
        });
    });
}

$('#deliveryDetails').find('input').on('change', function () {
    $('#deliveryCost').text('�5.00');
});

var myLazyLoad;
// Document ready function
$(function () {

    hideColsOnLoad();

    //addBackLinks();
    $('link[rel="stylesheet"]').removeAttr('disabled').trigger('stylesheetLoaded');

    myLazyLoad = new LazyLoad({
        elements_selector: '.lazy',
        callback_error: function (element) {
            element.src = 'https://placeholdit.imgix.net/~text?txtsize=21&txt=Fallback%20image&w=220&h=280';
        }
    });
    picturefill({
        reevaluate: true
    });

    if ($('.page-container').hasClass('page-container')) {
        $(".page-container").addClass("pcm0");
    }

    $("div .ctaBlock").css({ "margin-bottom": "0", "padding-left": "0", "padding-right": "0" });


    $('.videoCarouselBlock > .block-content').slick({
        centerMode: true,
        centerPadding: '0px',
        slidesToShow: 1,
        draggable: false,
        arrows: true,
        slide: '.videoBlock'
    });

    searchSuggestions();
    returnSuggestions();
    passwordStrength();


    setTimeout(function () {
        $(window).trigger('resize');
    });


    $('.section-product-thumbs .row').slick({
        slidesToShow: 5,
        slidesToScroll: 1,
        arrows: false,
        vertical: true,
        mobileFirst: false,
        responsive: [
            {
                breakpoint: 992,
                settings: {
                    vertical: false,
                    slidesToShow: 4
                }
            }
        ]
    });


    $('.carouselRV').slick({
        mobileFirst: true,
        slidesToScroll: 2,
        slidesToShow: 2,
        draggable: true,
        // infinite:false,
        arrows: true,
        dots: true,
        lazyLoad: 'ondemand',
        responsive: [
            {
                breakpoint: 767,
                settings: {
                    slidesToShow: 3,

                }
            },
            {
                breakpoint: 991,
                settings: {
                    slidesToShow: 6,
                    dots: false,
                }
            }
        ]
    });


    //Dropdown
    $('.btn-cancel').click(function () {
        event.preventDefault();
        $(this).parents('.dropdown').find('.fav-select').dropdown('toggle');
    });

    // Popover // Tooltip

    $('[data-toggle="tooltip"]').tooltip();


    // Returns show More
    $('.show-lines').click(function () {
        $('.manual-returns').addClass('active');
        $('.manual-returns .fade-overlay').hide();

    });

    // Show More / Less
    $('.show-toggle').click(function () {
        $(this).next('.card-body').toggleClass('active');

        var $this = $(this).children('.collapse').children('a');
        $this.toggleClass('show-more show-less');
        if ($this.hasClass('show-more')) {
            $this.text('Show More');
        } else {
            $this.text('Show Less');
        }
        return false;

    });

    function showHideClear(parentCard) {
        if ($(parentCard).find('.custom-control-input:checked').length) {
            $(parentCard).addClass('active');
        } else {
            $(parentCard).removeClass('active');
        }
    }

    // Refinement Clear Button Show / Hide
    $('.refinement .card input:checkbox').change(function () {
        var parentCard = $(this).closest('.card');
        showHideClear(parentCard);
    });

    $('.btn-clear').click(function () {
        var parentCard = $(this).closest('.card');
        $(parentCard).find('.custom-control-input:checked').prop('checked', false);
        showHideClear(parentCard);
    });

    // Product Ellipsis
    $('.listingPartial .product-name , .favouritePartial .product-name, .recentlyViewedPartial .product-name').each(
        function () {
            var len = $(this).text().length;
            if (len > 50) {
                $(this).text($(this).text().substr(0, 48) + '...');
            }
        });


    // Product Comparison
    // Check if all values in given array are equal
    function allAreEqual(array) {
        if (!array.length) return true;
        return array.reduce(function (a, b) { return (a === b) ? a : ('false' + b); }) === array[0];
        //console.log(array);
    }

    $('.compare-button').click(function () {
        $('.table-comparison tbody tr').each(function () {
            var cellVal = [];
            $(this).children('td').each(function () {
                cellVal.push($(this).text());
            });
            if (!allAreEqual(cellVal)) {
                $(this).addClass('bg-light');
            }
        });
    });

    function compareBanner(count, targetButton) {
        $('.compare-no').text(count);
        targetButton.toggleClass('compare-add compare-remove');
        if (count >= 1) {
            // var banner = $('.compare-cta');
            $('.compare-cta').addClass('active');
        } else {
            $('.compare-cta').removeClass('active');
        }
    }

    // Add to compare
    $(document).on('click',
        '.compare-add, .compare-remove',
        function (e) {
            e.preventDefault();
            var compareCount = parseInt($('.compare-no').text());
            if (compareCount >= 4) {
                $('.compare-cta').addClass('active');
                if ($('.compare-cta').hasClass('active')) {
                    setTimeout(function () {
                        $('.compare-no').popover('show');
                        setTimeout(function () {
                            $('.compare-no').popover('hide');
                        },
                            4500);
                    },
                        250);
                    if ($(this).hasClass('compare-remove')) {
                        compareCount = compareCount - 1;
                        $(this).parent().find('input').prop('checked', false);
                        var targetButton = $(this);
                        compareBanner(compareCount, targetButton);
                    }
                }

            } else if (compareCount <= 4) {
                if ($(this).hasClass('compare-add')) {
                    compareCount = compareCount + 1;
                    $(this).parent().find('input').prop('checked', true);
                    $('.compare-active').removeClass('active');
                } else {
                    compareCount = compareCount - 1;
                    $(this).parent().find('input').prop('checked', false);
                }
                targetButton = $(this);
                compareBanner(compareCount, targetButton);
            } else {
                return false;
            }

        });

    //Dismiss compare bar
    $('.compare-dismiss').click(function (e) {
        e.preventDefault();
        $(this).closest('.compare-cta').removeClass('active');
        $('.compare-no').popover('hide');
        $('.compare-active').addClass('active');
    });
    // Clear compare
    $('.compare-clear').click(function (e) {
        e.preventDefault();
        var allSelected = $('.compare-remove');
        allSelected.parent().find('input').prop('checked', false);
        compareBanner(0, allSelected);
        $('.compare-active').removeClass('active');
    });


    $('.compare-active').click(function () {
        $(this).removeClass('active');
        $('.compare-cta').addClass('active');
    });

    // Login Form Validation
    $('#login .btn').click(function () {
        $('#login').popover('show');
        $('#login .form-control').addClass('is-invalid');

    });


    $('iframe').on('load',
        function () {
            var videoCSS =
                '<style>video{ height: 100vh !important; object-fit: cover !important; width: 100% !important; top: 0 !important;}</style>';
            $('iframe').find('#player').append(videoCSS);
        });

    $(".accordionBlock a[data-toggle]").on("click",
        function (e) {
            e.preventDefault();
        });


    $('.toggle-section').hoverIntent({
        over: hoverInFunc,
        out: hoverOutFunc
    });
    // addBackLinks();
    $('link[rel="stylesheet"]').removeAttr('disabled').trigger('stylesheetLoaded');





    var xsCarouselBlock = $('.xsCarouselBlock > .block-container > .block-content, .carouselBlock > .block-container > .block-content, .bannerCarouselBlock > .block-content');

    $(xsCarouselBlock).each(function () {
        var $this = $(this),
            showAtXS = $(this).data('showxs') || 1,
            showAtSM = $(this).data('showsm') || 3,
            showAtMD = $(this).data('showmd') || 4,
            showAtLG = $(this).data('showlg') || 4,
            showArrows = $(this).data('arrows') || true,
            showDots = $(this).data('dots') || true;
        // console.log(showAtXS + ' ' + showAtSM + ' ' + showAtMD);
        // console.log(Engine.isBreakpoint('xs'));

        var updateProgressBar = function (event, slick) {
            // Get direct block parent
            var parentBlock = $this.closest('.block');
            // Set progress bar variables
            var progressBar = $(parentBlock).find('.carousel-status-fg');
            // Find pagination child nodes in slick object
            if (slick.$dots) {
                var pagination = slick.$dots[0].childNodes;
                // Get total number of pages in pagination
                var paginationLength = pagination.length;
                // currentIndex represents the current active page in the pagination
                var currentIndex = 0;

                // Loop through the pagination items. Update the number values (e.g. 2/5) based on these figures.
                $(pagination).each(function (i) {
                    // Add 1 to base index values to ensure values are in active literal context
                    var thisIndex = i + 1;
                    if (pagination[i].className == 'slick-active') {
                        $(parentBlock).find('.js-pagination-first').html(thisIndex);
                        currentIndex = thisIndex;
                    }
                    if (thisIndex == paginationLength) {
                        $(parentBlock).find('.js-pagination-last').html(thisIndex);
                    }
                });

                // Figure out the positioning of the progress bar
                $(progressBar).css('width', (100 / paginationLength) + '%');
                $(progressBar).css('left', ((currentIndex - 1) * (100 / paginationLength)) + '%');
            }
        };

        $(this).on('afterChange', function (event, slick) {
            updateProgressBar(event, slick);
        });

        $(this).on('init', function (event, slick) {
            updateProgressBar(event, slick);
        });

        if (!$(this).hasClass('slick-initialized')) {
            var hasArrows = false;
            var isCentered = true;
            if ($(this).closest('.xsCarouselBlock').hasClass('has-arrows')) {
                hasArrows = true;
            }

            if ($(this).parent('div').hasClass('bannerCarouselBlock')) {
                hasArrows = true;
                isCentered = false;
            }
            if ($(this).closest('.xsCarouselBlock').hasClass('swatch-carousel')) {
                isCentered = false;
            }
            $($this).slick({
                mobileFirst: true,
                slidesToShow: showAtXS,
                slidesToScroll: showAtXS,
                draggable: true,
                arrows: hasArrows,
                dots: showDots,
                centerMode: isCentered,
                infinite: false,
                lazyLoad: 'ondemand',
                responsive: [
                    {
                        breakpoint: 575,
                        settings: {
                            centerMode: false,
                            slidesToShow: showAtSM,
                            slidesToScroll: showAtSM
                        }
                    },
                    {
                        breakpoint: 767,
                        settings: {
                            centerMode: false,
                            slidesToShow: showAtMD,
                            slidesToScroll: showAtMD
                        }
                    },
                    {
                        breakpoint: 991,
                        settings: {
                            centerMode: false,
                            slidesToShow: showAtLG,
                            slidesToScroll: showAtLG
                        }
                    }
                ]
            });
        }
        hidePagination($this);
        hideOrphanDot($this);
    });


    // Click events for individual 'next' and 'previous' buttons on carousel
    $('.js-pagination-prev').click(function () {
        var parentBlockContent = $(this).closest('.block').find('.block-content');
        try {
            $(parentBlockContent).slick('slickPrev');
        }
        catch (e) { // no carousel initialised
        }
    });

    $('.js-pagination-next').click(function () {
        var parentBlockContent = $(this).closest('.block').find('.block-content');
        try {
            $(parentBlockContent).slick('slickNext');
        }

        catch (e) { // no carousel initialised
        }
    });

    searchSuggestions();
    returnSuggestions();
    passwordStrength();


    setTimeout(function () {
        $(window).trigger('resize');
    });


    $('.section-product-thumbs .row').slick({
        slidesToShow: 5,
        slidesToScroll: 1,
        arrows: false,
        vertical: true,
        mobileFirst: false,
        responsive: [{
            breakpoint: 992,
            settings: {
                vertical: false,
                slidesToShow: 4
            }
        }]
    });


    $('.carouselRV').slick({
        mobileFirst: true,
        slidesToScroll: 2,
        slidesToShow: 2,
        draggable: true,
        // infinite:false,
        arrows: true,
        dots: true,
        lazyLoad: 'ondemand',
        responsive: [{
            breakpoint: 767,
            settings: {
                slidesToShow: 3,

            }
        },
        {
            breakpoint: 991,
            settings: {
                slidesToShow: 6,
                dots: false,
            }
        },

        ]
    });


    //Dropdown
    $('.btn-cancel').click(function () {
        event.preventDefault();
        $(this).parents('.dropdown').find('.fav-select').dropdown('toggle');
    });

    // Returns show More
    $('.show-lines').click(function () {
        $('.manual-returns').addClass('active');
        $('.manual-returns .fade-overlay').hide();

    });

    // Show More / Less
    $('.show-toggle').click(function () {
        $(this).next('.card-body').toggleClass('active');

        var $this = $(this).children('.collapse').children('a');
        $this.toggleClass('show-more show-less');
        if ($this.hasClass('show-more')) {
            $this.text('Show More');
        } else {
            $this.text('Show Less');
        }
        return false;

    });

    // Product Ellipsis
    $('.listingPartial .product-name , .favouritePartial .product-name, .recentlyViewedPartial .product-name').each(function () {
        var len = $(this).text().length;
        if (len > 50) {
            $(this).text($(this).text().substr(0, 48) + '...');
        }

    });

    // Add to compare
    $(document).on('click', '.compare-add, .compare-remove', function (e) {
        e.preventDefault();
        var compareCount = parseInt($('.compare-no').text());
        if (compareCount >= 4) {
            $('.compare-cta').addClass('active');
            if ($('.compare-cta').hasClass('active')) {
                setTimeout(function () {
                    $('.compare-no').popover('show');
                    setTimeout(function () {
                        $('.compare-no').popover('hide');
                    }, 4500);
                }, 250);
                if ($(this).hasClass('compare-remove')) {
                    compareCount = compareCount - 1;
                    $(this).parent().find('input').prop('checked', false);
                    var targetButton = $(this);
                    compareBanner(compareCount, targetButton);
                }
            }

        } else if (compareCount <= 4) {
            if ($(this).hasClass('compare-add')) {
                compareCount = compareCount + 1;
                $(this).parent().find('input').prop('checked', true);
                $('.compare-active').removeClass('active');
            } else {
                compareCount = compareCount - 1;
                $(this).parent().find('input').prop('checked', false);
            }
            targetButton = $(this);
            compareBanner(compareCount, targetButton);
        } else {
            return false;
        }

    });
    //Dismiss compare bar
    $('.compare-dismiss').click(function (e) {
        e.preventDefault();
        $(this).closest('.compare-cta').removeClass('active');
        $('.compare-no').popover('hide');
        $('.compare-active').addClass('active');
    });
    // Clear compare
    $('.compare-clear').click(function (e) {
        e.preventDefault();
        var allSelected = $('.compare-remove');
        allSelected.parent().find('input').prop('checked', false);
        compareBanner(0, allSelected);
        $('.compare-active').removeClass('active');
    });


    $('.compare-active').click(function () {
        $(this).removeClass('active');
        $('.compare-cta').addClass('active');
    });

    // Login Form Validation
    $('#login .btn').click(function () {
        $('#login').popover('show');
        $('#login .form-control').addClass('is-invalid');

    });

    // Load videos so they autoplay if within the viewport
    loadVideos();


});

$(window).on('resize', function () {
    setTimeout(function () {
        $('.xsCarouselBlock > .block-container > .block-content').each(function () {
            var $this = $(this);
            hideOrphanDot($this);
            hidePagination($this);
        });
        // $('.slider-xs > .block-container >  .block-content > .row').slick('destroy');
        announcementSliderXS();
        resetCols();
    }, 10);

});

$(window).on('shown.bs.modal', function (e) {
    $('.xsCarouselBlock > .block-container > .block-content, .carouselBlock > .block-container > .block-content').each(function () {
        $(e.target).find('.hidden-fade').addClass('active');
        $(this).slick('getSlick').refresh();
    });
});

/** Nav toggle **/

$('.footerLinksBlock .footerLinks-title').on('click', function () {
    var children = $(this).siblings('ul');
    children.toggleClass('active');
    $(this).toggleClass('active');
    $(this).attr('aria-expanded', $(this).hasClass('active'));

});

/** Nav dropdowns **/

$('.nav-select').on('mouseover', function () {
    $('.mini-basket').hide();
    $('body').removeClass('no-scroll-basket');
    $('.favouritesBasket').removeClass('open');
    $(this).siblings().css('display', 'block');
    $('html').addClass('dropdown-open');
});



$('.swatch-button').click(function (e) {
    $('.blockArticle').removeClass('ziBoost');
    e.preventDefault();
    e.stopPropagation();
    $(this).toggleClass('open').siblings('.swatch-button-popup').toggleClass('open').parents('.blockArticle').addClass('ziBoost');
});
// $('.swatch-button-popup').click(function(e){
// 	e.stopPropagation();
// });

/** Height 'reveal' functionality **/
// This function reveals its target element by automating its height value. The target element is in the 'data-reveal' attribute

var revealerBtn = $('a[data-reveal]');
$(revealerBtn).on('click', function (e) {
    var revealTargetClass = ('.' + $(e.target).data('reveal'));

    if ($(revealTargetClass).hasClass('open')) {
        $(revealTargetClass).removeClass('open');
        setTimeout(function () { $(revealTargetClass).addClass('d-none'); }, 300);

    }
    else {
        $('div[class^="page-facets__"].open').addClass('d-none');
        $('div[class^="page-facets__"]').removeClass('open');
        $(revealTargetClass).removeClass('d-none');
        setTimeout(function () { $(revealTargetClass).addClass('open'); }, 300);
    }
    e.preventDefault();
});

function closeNavSection(e) {
    if ((!Engine.isBreakpoint('xs')) && (!Engine.isBreakpoint('sm')) && (!Engine.isBreakpoint('md'))) {
        $(this).siblings().removeClass('inactive');
        $(this).children('.nav-sub-container').removeClass('open');
        $('.brand-header').removeClass('open');
    }
}

/** Facet status toggle **/
// This toggles the status of each facet using the 'selected' class

var facet = $('.page-facets__facet');
var sortFacet = $('.page-facets__sort .page-facets__facet');

$(facet).on('click', function (e) {
    $(e.target).toggleClass('selected');

}).children().on('click', function (e) {
    $(e.target).parent().toggleClass('selected');
});

// this function handles the status of the sort items specifically

$(sortFacet).on('click', function (e) {
    var selectedStatus = $(e.target).hasClass('selected');
    $(sortFacet).removeClass('selected');
    if (selectedStatus == true) {
        $(e.target).addClass('selected');
    }
    else { $(e.target).removeClass('selected'); }

});

/** Product count, show/hide and 'view more' **/
// Set up shared view config object

var viewConfig = {
    initialAmount: null,
    showMoreAmount: 6,
    allProducts: null,
    displayedProducts: null
};

//var countProducts = function () {
//    // Get number of products and hidden products
//    var productPartial = $('#contentMain .productPartial');
//    var hiddenPartial = $('#contentMain .productPartial.d-none');

//    // Update viewConfig object with latest values
//    viewConfig.allProducts = productPartial.length;
//    viewConfig.displayedProducts = productPartial.length - hiddenPartial.length;
//    viewConfig.hiddenProducts = hiddenPartial.length;

//    // Update 'view more' text with latest values
//    $('.viewMore__current').html(productPartial.length - hiddenPartial.length);
//    $('.viewMore__total').html(productPartial.length);
//    $('.viewMore__additional').html(viewConfig.showMoreAmount);

//    // Hide 'view more' text if all products are shown
//    if (productPartial.length - hiddenPartial.length == productPartial.length) {
//        //$('.showMoreAction p').html('');
//    }
//};


//countProducts();

//var showProducts = function () {
//    var count = 0;
//    var hiddenPartial = $('#contentMain .productPartial.d-none');
//    var showMoreAmount = viewConfig.showMoreAmount;
//    $(hiddenPartial).each(function (index) {
//        if (count < showMoreAmount) {
//            $(hiddenPartial[index]).removeClass('d-none');
//            count++;
//        }
//        else {
//            // do nothing;
//        }
//    });
//    countProducts();
//};

//$('.showMoreAction').on('click', function () {
//    showProducts();
//});

/** Search result panels toggle **/
var searchResultsLink = $('.page-navigation a');
var searchResultsPanel = $('.search-results');
$(searchResultsLink).on('click', function (e) {
    if (!$(e.target).hasClass('toggler')) {
        $('.ecomNavigationBlock').removeClass('active');
        searchResultsLink.removeClass('active');
        $(e.target).addClass('active');
        $(e.target).parents('.ecomNavigationBlock').addClass('active');
        $('.page-navigation .nav-link').not('.toggler').toggle();
        var chosenView = ($(e.target).data('view'));
        var targetEl = '.search-results--' + chosenView;
        searchResultsPanel.removeClass('open');
        $(targetEl).addClass('open');
    }
    $('.toggler').html($(e.target).html());
    e.preventDefault();
});

/** Mobile search panel menu **/
$('.toggler').click(function () {
    $('.page-navigation .nav-link').not('.toggler').toggle();
});

/** Search dropdown functionality **/

$('.search-toggle').click(function (e) {
    $('.mobile-close').click();
    $('body').toggleClass('no-scroll-search');
    $('.search-dropdown').toggleClass('open');

    $('.search-close').focusout(function () {
        $('.search-dropdown-input').focus();
    });

    $('.search-dropdown-input').focus();
    e.preventDefault();
});

$('.search-close').blur(function () { this.click(); });

$(window).on('pagehide', function () {

    if (!Engine.isBreakpoint('lg') && !Engine.isBreakpoint('xl')) {
        $('.mobile-close').click();
    }

});

// This function shows content upon typing 'gre' or 'mid' into the dropdown searchbar

$('.search-dropdown-input').on('keyup', function (e) {
    var searchVal = $('.search-dropdown-input').val();
    if (searchVal.indexOf('gre') > -1) {
        $('.search-results-green').addClass('open');
    }
    else if (searchVal.indexOf('mid') > -1) {
        $('.search-results-mid').addClass('open');
    }
    else {
        $('.search-results-green').removeClass('open');
        $('.search-results-mid').removeClass('open');
    }
});

// This function closes the search dropdown upon clicking the 'close' button
$('.search-close').on('click', function (e) {
    $('body').removeClass('no-scroll-search');
    $('.search-dropdown').removeClass('open');
    e.preventDefault();
});

/** Manual address toggle **/

$('.manual-address-toggle').click(function (e) {
    $('.manual-address').toggleClass('open');
    $('.manual-address .form-group:nth-of-type(1) input').focus();
    e.preventDefault();
});

/** Custom dropdown toggle **/

$('.custom-dropdown-current').click(function (e) {
    var parent = $(e.target).parents('.custom-dropdown');
    $('.custom-dropdown--active').not(parent).removeClass('custom-dropdown--active');
    $(parent).toggleClass('custom-dropdown--active');
    //e.preventDefault();
});

$('.custom-dropdown-item').click(function (e) {

    var parent = $(e.target).parents('.custom-dropdown');
    $(parent).removeClass('custom-dropdown--active');
    var dropdownValueMarkup = $(e.target).closest('.custom-dropdown-item').html();
    var dropdownValueValue = $(e.target).closest('.custom-dropdown-item').data('value');
    $(parent).find('.custom-dropdown-current').html(dropdownValueMarkup).removeClass('is-invalid').addClass('is-valid');

    if (dropdownValueValue !== $(parent).find('input').val()) {
        $(parent).find('input').val(dropdownValueValue);
        $(parent).find('input').trigger("change");
    }

    //e.preventDefault();
});


$('.custom-dropdown[region-selector] input[type="hidden"]').on("change",
    function () {
        var val = $(this).val();
        if (RemoveDiacritics === window.undefined) {
            $('.custom-dropdown-item[data-value="' + val + '"]').trigger("click");
        } else {

            $('.custom-dropdown-item[data-value="' + RemoveDiacritics(val) + '"]').trigger("click");

        }

    });



/** Product information toggle **/

$('.product-information-toggle').click(function (e) {
    $(e.target).parents('.product-information').toggleClass('active');
    var ariaLabel = $(e.target).parents('.product-information').hasClass('active') ? 'expanded' : 'collapsed';
    $(e.target).parents('.product-information').attr('aria-label', ariaLabel);
});

$('.card__wishlist .collapse, .card__order-history .collapse').on('hide.bs.collapse', function () {
    $(this).siblings('.card-header').addClass('collapsed');
});
$('.card__wishlist .collapse, .card__order-history .collapse').on('show.bs.collapse', function () {
    $(this).siblings('.card-header').removeClass('collapsed');
});

/** Mobile colour selector */

$('.btn-reorder').click(function (e) {
    e.preventDefault();
    var indexChange = $(this).data('direction');
    console.log(indexChange);
});

/** Disabled button toggle functionality **/

$('#tcAgree').on('change', function () {
    $('.continueStep3').removeClass('disabled');
});

$('.select-cc-card').on('click', function () {
    $('.continueStep3').removeClass('disabled');
});

$('.select-sa-address').on('click', function () {
    $('.continueStep2').removeClass('disabled');
});

$('.tcCheck--payPal').on('change', function () {
    $('.gotopaypal').removeClass('disabled');
});

/** Swatch mask **/
$('.swatch-mask, .swatches-close').on('click', function () {
    var $container = $(this).parents('.swatch-button-container');
    $($container).find('.swatch-button-popup').removeClass('open');
    $($container).find('.swatch-button').removeClass('open');
    $('.blockArticle').removeClass('ziBoost');
});

var changeQuantity = function (direction, element) {
    var quantity = $(element).siblings('.table-quantity');
    var currentVal = parseInt($(quantity).html());
    if (direction === 'up') { $(quantity).html(currentVal + 1); }
    if (direction === 'down' && parseInt($(quantity).html()) > 0) { $(quantity).html(currentVal - 1); }
};

$(document).on('click', '.removeConfirm', function (e) {
    e.preventDefault();
    var parentProductContainer = $(this).closest('.basket-checkout-product-block');
    $(parentProductContainer).fadeOut();
});
$(document).on('click', '.removeCancel', function (e) {
    e.preventDefault();
    var parentProductContainer = $(this).closest('.basket-checkout-product-block');
    $(parentProductContainer).removeClass('removeConfirmMessage').find('.remove-product-item').remove();
});

$('.btn.disabled').click(function (e) {
    e.preventDefault();
    $(this).removeClass('disabled');
});


// Basket functions

// Voucher code
$('.voucherInputButton').click(function () {
    var voucherCodeValue = $('#voucherCode').val();
    if (voucherCodeValue.length > 0) {
        $('#voucherCode').removeClass('is-invalid').val('').attr('placeholder', 'Add another voucher code');
        var newLineMarkup = '<li class="clear">\n' +
            '<strong>' + voucherCodeValue + '</strong>\n' +
            '<a href="#" target="_self" title="Remove voucher" class="pull-right voucherRemove"><i class="fa fa-close" aria-hidden="true"></i></a>\n' +
            '</li>';
        $('.voucherList').append(newLineMarkup);
    } else {
        $('#voucherCode').addClass('is-invalid');
    }
});
$(document).on('click', '.voucherRemove', function (e) {
    e.preventDefault();
    $(this).closest('li').remove();
});

$(document).on('scroll', function () {
    loadVideos();
});

// Copy curent page: TODO: need to move to another file
$('#copy-curent-page').on('click', function (e) {
    e.preventDefault();
    var $target = this;
    var copyText = window.location.href || document.URL;
    var inputToCopy = document.getElementById('copy-text-hidden');
    inputToCopy.value = copyText;
    inputToCopy.select();
    document.execCommand("copy");
});

$('#copy-curent-page').on('mouseout', function (e) {
    e.preventDefault();
    $(this).tooltip('hide');
});

$('.inviteTeamMember').on('show.bs.modal', function () {

    $('.inviteTeamMember input.required').removeClass('is-valid');
    $('.inviteTeamMember input.required').removeClass('is-invalid');
    $('.inviteTeamMember input.required').val("");
});
/*!
 * hoverIntent v1.9.0 // 2017.09.01 // jQuery v1.7.0+
 * http://briancherne.github.io/jquery-hoverIntent/
 *
 * You may use hoverIntent under the terms of the MIT license. Basically that
 * means you are free to use hoverIntent as long as this header is left intact.
 * Copyright 2007-2017 Brian Cherne
 */
!function(factory){"use strict";"function"==typeof define&&define.amd?define(["jquery"],factory):jQuery&&!jQuery.fn.hoverIntent&&factory(jQuery)}(function($){"use strict";var cX,cY,_cfg={interval:100,sensitivity:6,timeout:0},INSTANCE_COUNT=0,track=function(ev){cX=ev.pageX,cY=ev.pageY},compare=function(ev,$el,s,cfg){if(Math.sqrt((s.pX-cX)*(s.pX-cX)+(s.pY-cY)*(s.pY-cY))<cfg.sensitivity)return $el.off(s.event,track),delete s.timeoutId,s.isActive=!0,ev.pageX=cX,ev.pageY=cY,delete s.pX,delete s.pY,cfg.over.apply($el[0],[ev]);s.pX=cX,s.pY=cY,s.timeoutId=setTimeout(function(){compare(ev,$el,s,cfg)},cfg.interval)},delay=function(ev,$el,s,out){return delete $el.data("hoverIntent")[s.id],out.apply($el[0],[ev])};$.fn.hoverIntent=function(handlerIn,handlerOut,selector){var instanceId=INSTANCE_COUNT++,cfg=$.extend({},_cfg);$.isPlainObject(handlerIn)?(cfg=$.extend(cfg,handlerIn),$.isFunction(cfg.out)||(cfg.out=cfg.over)):cfg=$.isFunction(handlerOut)?$.extend(cfg,{over:handlerIn,out:handlerOut,selector:selector}):$.extend(cfg,{over:handlerIn,out:handlerIn,selector:handlerOut});var handleHover=function(e){var ev=$.extend({},e),$el=$(this),hoverIntentData=$el.data("hoverIntent");hoverIntentData||$el.data("hoverIntent",hoverIntentData={});var state=hoverIntentData[instanceId];state||(hoverIntentData[instanceId]=state={id:instanceId}),state.timeoutId&&(state.timeoutId=clearTimeout(state.timeoutId));var mousemove=state.event="mousemove.hoverIntent.hoverIntent"+instanceId;if("mouseenter"===e.type){if(state.isActive)return;state.pX=ev.pageX,state.pY=ev.pageY,$el.off(mousemove,track).on(mousemove,track),state.timeoutId=setTimeout(function(){compare(ev,$el,state,cfg)},cfg.interval)}else{if(!state.isActive)return;$el.off(mousemove,track),state.timeoutId=setTimeout(function(){delay(ev,$el,state,cfg.out)},cfg.timeout)}};return this.on({"mouseenter.hoverIntent":handleHover,"mouseleave.hoverIntent":handleHover},cfg.selector)}});;
var targetVimeoID = null;
function logResult(result) {
    var picURL = result[0].thumbnail_large;
    var targetPic = document.getElementById('vimeoVideoBlock' + targetVimeoID);
    targetPic.setAttribute('data-src', picURL);
    return picURL;
}
function logError(error) {
    console.log('Big problemo \n', error);
}
function validateResponse(response) {
    if (!response.ok) {
        throw Error(response.statusText);
    }
    return response;
}
function readResponseAsJSON(response) {
    return response.json();
}
function fetchJSON(pathToResource, number) {
    targetVimeoID = number;
    var fullPath = 'https://vimeo.com/api/v2/video/' + pathToResource + '.json';
    fetch(fullPath)
        .then(validateResponse)
        .then(readResponseAsJSON)
        .then(logResult)
        .catch(logError);
}

var i, c, y, n, z;
var im = new Array();

z = document.getElementsByClassName('videoBlockContainer');

for (n = 0; n < z.length; n++) {
    y = z[n];
 
    i = document.createElement('img');
    i.setAttribute('data-src', im[n]);
    i.setAttribute('class', 'lazy thumb');
    if (y.classList.contains('vimeo')) {
        if (y.hasAttribute('src')) {
            im[n] = y.getAttribute('src');
            i.setAttribute('data-src', im[n]);
        } else {
            i.setAttribute('id', 'vimeoVideoBlock' + [n]);
            fetchJSON(y.id, n);
        }
    } else {
        // console.log(y.id);
        im[n] = y.hasAttribute('src') ? y.getAttribute('src') : 'https://i.ytimg.com/vi/' + y.id + '/hqdefault.jpg';
        i.setAttribute('data-src', im[n]);
    }
    c = document.createElement('div');
    c.setAttribute('class', 'play');
    y.appendChild(i);
    y.appendChild(c);
    if (z[n].classList.contains('vimeo')) {
       
        y.onclick = function () {
            var t = document.createElement('iframe');
            var title = this.getAttribute("data-title");
            t.setAttribute('src', 'https://player.vimeo.com/video/' + this.id + '?autoplay=1&loop=0&muted=0&autopause=1&title=0&byline=0&portrait=0');
            t.setAttribute('class', 'embed-responsive-item');
            t.setAttribute('title', title);
            this.parentNode.appendChild(t);
            $(this).addClass('d-none');
            };
    } else {
        y.onclick = function () {
            
            var title = this.getAttribute("data-title");
            var t = document.createElement('iframe');
            t.setAttribute('src', 'https://www.youtube.com/embed/' + this.id + '?controls=0&showinfo=0&rel=0&autoplay=1&loop=0&mute=0&playlist=' + this.id);
            t.setAttribute('class', 'embed-responsive-item');
            t.setAttribute('title', title);
            this.parentNode.appendChild(t);
            $(this).addClass('d-none');
    
        };
    }
}
;
AddAntiForgeryToken = function (data) {
    data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
    return data;
};

// Region selector
$("a[data-region-selector]").on("click", function (e) {
    var link = $(this);
    var action = link.attr("href");
    var form = link.closest("form")[0];
    form.action = action;
    form.submit();
    e.preventDefault();
    return false;
});

// Language selector
$("a[data-lang-selector]").on("click", function (e) {
    e.preventDefault();
    var link = $(this);
    var action = link.attr("href");
    var form = link.closest("form")[0];
    form.action = action;
    form.submit();

    return false;
});

// Site logout
$("[data-site-logout][data-logout-url]").on("click", function (e) {
    e.preventDefault();
    var postUrl = $(this).data("logout-url");
    $.ajax({
        dataType: "json",
        type: "POST",
        url: postUrl,
        data: AddAntiForgeryToken({ id: parseInt($(this).attr("title")) }),
        success: function (r) {
            window.location = r.url;
        }
    });
    return false;
});

$("a[data-default-address]").on("click", function () {
    var form = $(this).closest("form")[0];
    form.submit();
    e.preventDefault();
    return false;
});

$("a[data-delete-address][data-address-guid]").on("click", function () {
    $("div#deleteConfirmModal input#deleteAddressGuid").val($(this).data("address-guid"));
});

$("a[data-delete-card][data-card-guid]").on("click", function () {
    $("div#deleteConfirmModal input#cardGuid").val($(this).data("card-guid"));
});

$(document).ready(function () {
    $(".country-name").on('click',
        function (e) {
            e.preventDefault();
            var form = $(this).parent();
            $.post(form.attr("action"),
                form.serialize(),
                function (data) {
                    if (data.ok !== null && data.ok) {
                        location.reload();
                    }
                });
        });

    $("#PayByCard").show();
    $("#PayByPayPal").hide();

    $("[ShippingOptions]").on('click', '.ShippingRateRdo', function () {
        
        setGtmCheckoutOption(1, $(this).innerText);
    });

    $('[id*="_PostalCode"]').change(function (e) {
        e.preventDefault();
        var form = $(this).closest("form");
        $.post("/Services/ShippingMethod/GetShippingMethods",

            $(form).serialize(),
            function (data) {
                InitialiseShippingOptions(data);
            });
    });


    $("#UseShippingAddress").on('change',
        function (e) {

            var checked = $("#UseShippingAddress").is(":checked");
            if (checked) {
                $.get("/Services/CustomerContact/GetShippingAddress",
                    function (data) {

                        $('[id*="_Country"]').val(data.Country);
                        $('[id*="_Line1"]').val(data.Address1);
                        $('[id*="_Line2"]').val(data.Address2);
                        $('[id*="_Line3"]').val(data.Address3);
                        $('[id*="_City"]').val(data.Town);
                        $('[id*="_RegionName"]').val(data.County);
                        $('[id*="_PostalCode"]').val(data.Postcode);
                    });
            } else {

                $('[id*="_Line1"]').val("");
                $('[id*="_Line2"]').val("");
                $('[id*="_Line3"]').val("");
                $('[id*="_City"]').val("");
                $('[id*="_RegionName"]').val("");
                $('[id*="_PostalCode"]').val("");
                $('[id*="_Country"]').val("");
            }
            var form = $("#UseShippingAddress").closest("form");
            var submit = form.find('button[type="submit"]');
            if (validateForm(form, false)) {
                submit.removeAttr("disabled");
            } else {
                submit.prop("disabled", true);
            }
        });

    $("#PayByCardBtn").on('click',
        function (e) {
            $("#PayByCard").show();
            $("#PayByPayPal").hide();
            $("#paypalResult").empty();
        });

    $("#PayByPayPalBtn").on('click',
        function (e) {
            $("#PayByPayPal").show();
            $("#PayByCard").hide();
        });

    $('.select-sa-address, .select-cc-card').click(function () {
        $(this).addClass('toggleActiveOpacity').siblings().removeClass('toggleActiveOpacity');
        $(this).find('input').prop('checked', true).trigger('change');
    });

    $('.custom-dropdown input').on('update',
        function () {

            var inputValue = $(this).val();
            var dropdownItem = $(this).siblings('.custom-dropdown-items').find('[data-value="' + inputValue + '"]').html();
            if (inputValue) {
                $(this).siblings('.custom-dropdown-current').html(dropdownItem);
            } else {
                $(this).siblings('.custom-dropdown-current').html('<div class="custom-dropdown-item-label">Please select</div>');
            }
        });

    var addressCount = $('.savedaddressradio').length;
    if (addressCount > 0) {
        $('#SavedAddresses').show();
        $(".addnewaddress").show();
        $('#AddressLookup').hide();
        $(".canceladdnewaddress").hide();
    } else {
        $('#SavedAddresses').hide();
        $(".addnewaddress").hide();
        $('#AddressLookup').show();
        $(".canceladdnewaddress").show();
    }

    $(".addnewaddress").on('click',
        function (e) {
            $('#SavedAddresses').hide();
            $(".addnewaddress").hide();
            $('#AddressLookup').show();
            $(".canceladdnewaddress").show();

            $("#Shipping").empty();

            $('[id*="_Line1"]').val("");
            $('[id*="_Line2"]').val("");
            $('[id*="_Line3"]').val("");
            $('[id*="_City"]').val("");
            $('[id*="_RegionName"]').val("");
            $('[id*="_PostalCode"]').val("");
            $('[id*="_Country"]').val("");

            $('.savedaddressradio:checked').prop("checked", false).trigger("change");
            $('.savedaddressradio').parent().removeClass('toggleActiveOpacity');
        });

    $(".canceladdnewaddress").on('click',
        function (e) {
            $('#SavedAddresses').show();
            $(".addnewaddress").show();
            $('#AddressLookup').hide();
            $(".canceladdnewaddress").hide();
            $(".pca-summary").empty();
            $("input#AddressLookup_PcaSearch").val("");
            $("#Shipping").empty();

            $('[id*="_Line1"]').val("");
            $('[id*="_Line2"]').val("");
            $('[id*="_Line3"]').val("");
            $('[id*="_City"]').val("");
            $('[id*="_RegionName"]').val("");
            $('[id*="_PostalCode"]').val("");
            $('[id*="_Country"]').val("");

            $('[id*="_Line1"]').trigger("blur");
        });

    var defaultShipping = $("#SavedAddresses input[name=savedaddressradio]:checked");
    if (defaultShipping.length) {
        setTimeout(function () { defaultShipping.closest(".select-sa-address").trigger("click"); }, 0);
    }

    $(".savedaddressradio").on('change',
        function (e) {
            e.preventDefault();
            var value = $(this).val();

            $.get("/Services/ShippingMethod/GetShippingMethodsByAddresssId", { addressId: value },
                function (data) {
                    InitialiseShippingOptions(data);
                });
        });

    if ($("[ShippingOptions]").length) {
        $("#ManualAddressToggle").on("click",
            function () {
                UpdateShippingOptions(pcaCountry, "");
            });

        $("#ManualAddress input[type='text'][id$='_PostalCode']").on("keyup",
            function () {
                UpdateShippingOptions(pcaCountry, $(this).val());
            });

        $("#ManualAddress input[type='text'][id$='_postalCode']").bind("paste", function () {
            setTimeout(function () { $("#ManualAddress input[type='text'][id$='_postalCode']").trigger("keyup"); }, 0);
        });
    }

    $("[data-language-selector]").on("change",
        function () {
            var langCode = this.value;
            var parent = $(this).closest(".search-results");
            if (parent.find("article[data-language]").length) {
                parent.find("article[data-language]").not("[data-language='" + langCode + "']").addClass("d-none");
                parent.find("article[data-language='" + langCode + "']").removeClass("d-none");
            }
            if (parent.find("div[data-languages]").length) {
                parent.find("div[data-languages]").not("[data-languages*='" + langCode + "']").addClass("d-none");
                parent.find("div[data-languages] div.downloads__download-item[data-language]").not("[data-language='" + langCode + "']").addClass("d-none");
                parent.find("div[data-languages*='" + langCode + "']").removeClass("d-none");
                parent.find("div[data-languages] div.downloads__download-item[data-language='" + langCode + "']").removeClass("d-none");
            }
            if (parent.find(".downloads-letters-links a[data-languages]").length) {
                parent.find(".downloads-letters-links a[data-languages]").not("[data-languages*='" + langCode + "']").addClass("d-none");
                parent.find(".downloads-letters-links a[data-languages*='" + langCode + "']").removeClass("d-none");
            }
        });

    $(".gtmProductPartial").on('click', function (e) {
        if (typeof window.dataLayer !== 'undefined') {
            var prod = $(this).closest(".productPartial").find("[product-manipulate]");
          
            if (prod.length === 0) {
                prod = $(this).closest(".productPartial").find("[product-info]");
            }
            window.dataLayer.push({
                'event': 'productClick',
                'ecommerce': {
                    'click': {
                        'actionField':
                            { 'list': document.title }, // Optional list property.
                        'products': [{
                            'name': $(prod).attr('product-name').replace(/\'/g, ''),
                            'id': $(prod).attr('product-code').replace(/\'/g, ''),
                            'category': $(prod).attr('product-category'),
                            'brand': 'Farrow and Ball',
                            'list': document.title,
                            'position': $(prod).attr('product-list-position')
                        }]
                    }
                }
            });
        }
    });

    setTimeout(function () {
        $("form[ecom-form]").each(function () {

            if ($("#UseShippingAddress")) {
                setUseShippingAddress();
            }

            var form = $(this);
            var submit = form.find('button[type="submit"]');
            if (validateForm(form, false)) {
                submit.removeAttr("disabled");
            } else {
                submit.prop("disabled", true);
            }
        });
    }, 1);
});

function UpdateShippingOptions(countryCode, postalCode) {
    if (postalCode.length >= 2) {
        $.get("/Services/ShippingMethod/GetShippingMethods", { addressLookupCountry: countryCode, addressLookupPostcode: postalCode },
            function (data) {
                InitialiseShippingOptions(data);
            });
    }
}

function InitialiseShippingOptions(data) {
    var selectedId = $("[ShippingOptions]:visible input[type=radio]:checked").val();
    var shipping = $("[ShippingOptions]:visible");
    shipping.empty();
    shipping.append('<ul class="list-unstyled"><h5>' + data.DeliveryDetailsHeading + '</h5></ul>');
    if (data.ShippingList.length === 0) {
        shipping.append('<div class="form-group">' + data.NoShippingOptionsAvailable + '</div>');

    } else {
        $.each(data.ShippingList, function (i, val) {
            var checked = "";
            if (selectedId == val.Id) {
                checked = "checked";
            }
            var itemMarkup = '<li class="list-unstyled-item">' +
                '<label>' +
                '<input type="radio" ' +
                checked +
                ' class="ShippingRateRdo" name="shippingmethod" value="' +
                val.Id +
                '">' +
                val.Name +
                '</label>';
            shipping.find('ul').append(itemMarkup);
        });

        shipping.append('<div class="form-group">' +
            '<label for="DeliveryNotes">' + data.NotesLabel + '</label><input type="text" class="form-control" name="DeliveryNotes" maxlength="50"></div>');
        if (data.IsB2B) {
            shipping.append('<div class="form-group">' +
                '<label for="PoNumber">' + data.PoNumberLabel + '</label><input type="text" class="form-control" name="PoNumber" maxlength="50"></div>');

        }
       

    }
}

// Simple check whether an input contains any value
function checkForValue(input) {
    input = $(input);
    var type = input.attr("type");
    if (type === "radio" || type === "checkbox") {
        return ($("input[name='" + input.attr("name") + "']:checked").length > 0);
    }
    if (input.val() !== null && input.val().length) {
        return checkForLength(input);
    } else {
        if (window.chrome != null && window.navigator.vendor === "Google Inc.") {
            if (input.is(':-webkit-autofill')) {
                return true;
            }
        }
    }
    return !input.hasClass("required");
}

function checkForPattern(input) {
    input = $(input);
    var pattern = input.attr("pattern");
    if (typeof pattern !== typeof undefined && pattern !== false) {
        var re = new RegExp(pattern);
        var result = re.test(input.val());
        if (!result && !input.val().length) {
            if (window.chrome != null && window.navigator.vendor === "Google Inc.") {
                if (input.is(':-webkit-autofill')) {
                    return true;
                }
            }
        }
        return result;
    } else {
        return true;
    }
}

function checkForCustomValidation(inputField) {
    var input = $(inputField);
    var validationFunction = input.attr("custom-validation");
    if (typeof validationFunction !== typeof undefined && validationFunction !== false && validationFunction !== "") {        
        var body = "function(input){ return " + validationFunction +"(input) }"
        var wrap = s => "{ return " + body + " };"
        var func = new Function(wrap(body));
        var result = func.call(null).call(null, inputField); 
        return result;
    }
    return true;
}

// Simple check whether an input contains any value
function checkForLength(input) {

    var min = $(input).attr("data-min-length");
    var max = $(input).attr("data-max-length");

    if ((min == 0 || min === window.undefined) && (max === 0 || max === window.undefined)) {
        return true;
    }

    if (min == 0 || min === window.undefined) {
        if (input.val().length <= max) {
            return true;
        }
    }

    if (max == 0 || max === window.undefined) {
        if (input.val().length >= min) {
            return true;
        }
    }

    if (input.val().length >= min && input.val().length <= max) {
        return true;
    } else {
        return false;
    }
}
// Changes the classes on an input bases on the validitiy (true or false passed as second parameter)
function toggleValidState(input, isValid) {
    if (isValid) {
        $(input).addClass('is-valid').removeClass('is-invalid');
    } else {
        $(input).addClass('is-invalid').removeClass('is-valid');
    }
}

// Check an input for Errors and decorates classes based on the result
function checkInputForErrors(input, updateValidState) {
    if (typeof updateValidState === window.undefined || typeof updateValidState === 'undefined') { updateValidState = true; }

    var isInputValid = checkForCustomValidation(input) && checkForValue(input) && checkForPattern(input);
    if (updateValidState) {
        toggleValidState(input, isInputValid);
    }

    return isInputValid;
}

// Finds all inputs with the 'required' property and checks each to see if valid and decorates classes as appropriate
function validateForm(form, updateValidState) {
    if (typeof updateValidState === window.undefined || typeof updateValidState === 'undefined') { updateValidState = true; }
    var requiredFields = $(form).find('input.required, input[pattern] , select.required, input[custom-validation]');
    var isFormValid = true;
    $(requiredFields).each(function () {
        var input = $(this);
        if (checkInputForErrors(input, updateValidState) === false) {
            isFormValid = false;
        }
    });

    //Check for drop downs
    var requiredDd = $(form).find('.custom-dropdown.required');

    $(requiredDd).each(function () {
        var dd = $(this);
        if ($(dd).find('.is-valid').length === 0) {
            if ($(dd).find('input[type=hidden]').val() !== '') {
                if (updateValidState) {
                    $(dd).find('.custom-dropdown-current').addClass('is-valid');
                }
            } else {
                if (updateValidState) {
                    $(dd).find('.custom-dropdown-current').addClass('is-invalid');
                }
                isFormValid = false;
            }
        }
    });

    return isFormValid;
}

// Finds all inputs and clears the success states
function clearSuccessStates(form) {
    var fields = $(form).find('input, .custom-dropdown-current');
    $(fields).each(function () {
        $(this).removeClass('is-valid');
    });
}

$('input[type=checkbox]#UseShippingAddress').on('change', setUseShippingAddress);

var setUseShippingAddress = function () {

    if ($('input[type=checkbox]#UseShippingAddress').prop('checked')) {
        $('#ManualAddress input.required').prop('disabled', true).removeClass('required');
    } else {
        $('#ManualAddress input[disabled]').addClass('required').removeAttr('disabled');
    }
    $('[id*="_Line1"]').trigger('blur');

};

$('input[type=checkbox]#UseShippingAddress').on('change', setUseShippingAddress);

// When editing an input check for errors
$(document).on('blur keyup', 'input.required, input[pattern], select.required', function () {
    var input = $(this);
    var parentForm = $(this).closest("form");
    setTimeout(function () {
        checkInputForErrors(input);
        var submit = parentForm.find('button[type="submit"]');
        if (validateForm(parentForm, false)) {
            submit.removeAttr("disabled");
        } else {
            submit.prop("disabled", true);
        }
    }, 1);
}
);

// When editing an input check for errors
$('input[type=checkbox].required, input[type=radio].required, #SavedAddresses input[type=radio], .custom-dropdown.required input[type="hidden"]').on('change',
    function () {
        var input = $(this);
        var parentForm = $(this).closest("form");
        setTimeout(function () {
            checkInputForErrors(input);
            var submit = parentForm.find('button[type="submit"]');
            if (validateForm(parentForm, false)) {
                submit.removeAttr("disabled");
            } else {
                submit.prop("disabled", true);
            }
        }, 1);
    }
);

$(document).ready(function () {
    $("#PayByCard").show();
    $("#PayByPayPal").hide();

    $("#AddressLookupCountry").change(function (e) {
        e.preventDefault();

        var form = $(this).closest("form");

        $.post("/Services/ShippingMethod/GetShippingMethods",
            $(form).serialize(),
            function (data) {
                var shipping = $("[ShippingOptions]: visible");
                shipping.empty();
                shipping.append('<ul class="list-unstyled"><h5>' + data.DeliveryDetailsHeading + '</h5></ul>');
                $.each(data.ShippingList, function (i, val) {
                    shipping.find('ul').append('<li class="list-unstyled-item">' +
                        '<label">' +
                        '<input type="radio" class="ShippingRateRdo" name="shippingmethod" value="' + val.Id + '">' +
                        '' + val.Name + '</label>' +
                        '</li>');
                    if (val.Description) {
                        shipping.append('<p class="text-secondary">' + val.Description + '</p>');
                    }
                });

                shipping.append('<div class="form-group">' +
                    '<label for="DeliveryNotes">' + data.NotesLabel + '</label><input type="text" class="form-control" name="DeliveryNotes" maxlength="50"></div>');
                if (data.IsB2B) {
                    shipping.append('<div class="form-group">' +
                        '<label for="PoNumber">' + data.PoNumberLabel + '</label><input type="text" class="form-control" name="PoNumber" maxlength="50"></div>');

                }
            });
    });

    
    $("#PayByCardBtn").on('click',
        function (e) {
            $("#PayByCard").show();
            $("#PayByPayPal").hide();
        });

    $("#PayByPayPalBtn").on('click',
        function (e) {
            $("#PayByPayPal").show();
            $("#PayByCard").hide();
        });

    $('[id*="ShippingForm"]').on("submit", function (e) {
        e.preventDefault();
        var form = $(this);
        if (validateForm(form) === false) {
            return;
        }
        $.post(form.attr("action"),
            $(form).serialize(),
            function (data) {
                if (data.Success === true) {
                    document.location.href = data.Url;
                } else {
                    $("#ValidationErrors").empty();

                    if (typeof data.Message !== "undefined") {
                        $("#ValidationErrors").append('<p class="text-danger">' + data.Message + '</p>');
                        //$("#ValidationErrors").append("<br />");
                    } else {
                        $.each(data.Errors,
                            function (index, value) {
                                $("#ValidationErrors").append('<p class="text-danger">' + value + '</p>');
                                //$("#ValidationErrors").append("<br />");
                            });
                    }

                }
            });

    });

    $("#PayByCard .saveaddress").hide();

    var isGuest = $("#IsGuest").val();
    if (isGuest == 'true') {
        $(".saveaddress").hide();
    }

    $("#GuestThankYou").hide();

    $("#GuestRegister").on("submit", function (e) {
        e.preventDefault();
        var form = $(this);
        form.find('[type=submit]').prop("disabled", true);
        $.post(form.attr("action"),
            $(form).serialize(),
            function (data) {
                if (data.Success === true) {
                    $("#GuestRegistrationForm").hide();
                    $("#GuestThankYou").show();
                } else {
                    form.find('[type=submit]').removeAttr("disabled");
                    $("#ValidationErrors").empty();

                    if (typeof data.Message !== "undefined") {
                        $("#ValidationErrors").append(data.Message);
                        $("#ValidationErrors").append("<br />");
                    } else {
                        $.each(data.Errors,
                            function (index, value) {
                                $("#ValidationErrors").append(value);
                                $("#ValidationErrors").append("<br />");
                            });
                    }
                }
            }).always(function () {
                form.find('[type=submit]').removeAttr("disabled");
            });
    });

    $(".ajaxEcomFormBlock").on("submit", function (e) {
        e.preventDefault();
        var form = $(this);
        form.find('[type=submit]').prop("disabled", true);
        var validationid = "#ValidationErrors-" + form.attr('id');
        var successid = "#ValidationSuccess-" + form.attr('id');
        var successMessageid = "#Success-" + form.attr('id');
        var formId = ".form-" + form.attr('id');
        AddAntiForgeryToken(form);
        if (validateForm(form) === false) {
            form.find('[type=submit]').removeAttr("disabled");
            return;
        }
        $(successid).empty();
        $(validationid).empty();

        $.post(form.attr("action"),
            $(form).serialize(),
            function (data) {
                if (data.Success === true) {
                    if (data.Redirect !== window.undefined && data.Redirect !== '') {
                        window.location = data.Redirect;
                    } else {
                        clearSuccessStates(form);
                        switch ($(form).attr("form-sumbmission")) {
                            case "submission-Reset":
                                document.getElementById(form.attr('id')).reset();
                                break;
                            case "submission-Remove":
                                $(formId).hide();
                                break;
                            case "submission-CloseModal":
                                document.getElementById(form.attr('id')).reset();
                                $('#' + form.attr('id')).closest(".modal").find(".close").click();
                                break;
                            default:
                        }

                        $(successMessageid).show();
                    }
                } else {
                    clearSuccessStates(form);
                    if (typeof data.Message !== "undefined") {
                        $(validationid).append(data.Message);
                        $(validationid).append("<br />");
                    } else {
                        $.each(data.Errors,
                            function (index, value) {
                                $(validationid).append(value);
                                $(validationid).append("<br />");
                            }
                        );
                    }
                }
            }).always(function () {
                form.find('[type=submit]').removeAttr("disabled");
            });
    });


    $(".validateEcomFormBlock").on("submit", function (e) {
        e.preventDefault();
        var form = $(this);
        form.find(':submit').attr("disabled", true);

        if (validateForm(form) === false) {
            form.find(':submit').attr("disabled", false);
            return;
        } else {
            if (form.attr("id") !== "st-payment") {

                document.getElementById(form.attr("id")).submit();
            }
        }
    });

    var termsAndCondContent = $("#TermsAndCondPlaceHolder").html();
    $("#Content_TermsAndCond").append(termsAndCondContent);
    $("#TermsAndCondPlaceHolder").hide();

    var marketingOptInContent = $("#MarketingOptInPlaceHolder").html();
    $("#Content_MarketingOptIn").append(marketingOptInContent);
    $("#MarketingOptInPlaceHolder").hide();


    $('.select-sa-address').on('click',
        function () {
            if ($(this).attr("data-address").length) {
                var address = JSON.parse($(this).attr("data-address"));
                $(this).closest('form').find('[id*="Line1"]').val(address.Address1);
                $(this).closest('form').find('[id*="Line2"]').val(address.Address2);
                $(this).closest('form').find('[id*="Line3"]').val(address.Address3);
                $(this).closest('form').find('[id*="City"]').val(address.Town);
                $(this).closest('form').find('[id*="RegionName"]').val(address.County);
                $(this).closest('form').find('[id*="PostalCode"]').val(address.Postcode);
                $(this).closest('form').find('[id*="Country"]').val(address.CountryName);
            }
        });

    $('.custom-dropdown').keypress(function (event) {

        var dd = $(this);
        var ddcontainer = dd.find('.custom-dropdown-items');
        dd.addClass('custom-dropdown--active');
        var items = dd.find('.custom-dropdown-items .custom-dropdown-item-label');
        var selected;
        items.each(function (i, el) {
            var element = $(el);
            var text = element.text().toLowerCase();
            if (text.substr(0, 1) === event.key) {

                if (element.offset().top - ddcontainer.offset().top + ddcontainer.scrollTop() !== 0) {
                    selected = element;
                    return false;
                }

            }

        });

        if (selected !== window.undefined) {


            ddcontainer.animate({
                scrollTop: selected.offset().top - ddcontainer.offset().top + ddcontainer.scrollTop() - 49
            });

        }


    });


    $('.custom-dropdown-item').keypress(function (e) {
        switch (e.keyCode) {
            case 32:
            case 13:
                e.preventDefault();

                $(this).click();
                break;
            default:
                break;
        }
    });

    $('.inviteTeamMember').on('hidden.bs.modal');

    var allSwatches = document.querySelectorAll(".swatch");
    for (var i = 0; i < allSwatches.length; i++) {
        allSwatches[i].addEventListener('mouseover',
            function (e) {
                SwapSwatchImage(e, true);
            }
        );
        allSwatches[i].addEventListener('focus',
            function (e) {
                SwapSwatchImage(e, false);
            }
        );
        allSwatches[i].addEventListener('touchstart',
            function (e) {
                SwapSwatchImage(e, true);
                e.preventDefault();
                return false;
            }
        );
        allSwatches[i].addEventListener('touchend',
            function (e) {
                e.preventDefault();
                return false;
            }
        );
    }
});

function SwapSwatchImage(e, changeParentLinkDest) {
    var parentId = e.currentTarget.dataset.parentId;
    var imageSrc = e.currentTarget.dataset.imageSrc;
    var parent = document.getElementById(parentId);
    parent.style.backgroundImage = "url('" + imageSrc + "')";

    if (changeParentLinkDest) {
        parent.firstElementChild.setAttribute('href', e.currentTarget.getAttribute("href"));
    }
}
$('div[id^="productVideo"]').on('hidden.bs.modal', function () {
    var iframe = $('div[id^="productVideo"] iframe');
    $('.videoBlockContainer.d-none').removeClass('d-none');
    iframe.attr('src', '');
    iframe.remove();

});

function validatePostCode(postCodeField) {
    var inputPostcode = $(postCodeField)    
    //var invalidMarker = inputPostcode.siblings(".invalid-postcode");
    var invalidMarker = $(".invalid-postcode");
    //if (inputPostcode.is(":hidden")) {
    //    invalidMarker = $(".invalid-postcode-near-submit");
    //}
    invalidMarker.hide();
    var postCode = $(inputPostcode).val();
    if (postCode === "") return true;

    var defaultRegion = $("[id$=userCurrentRegion]").val(); //inputPostcode.attr("default-region");
    
   // var selectedRegion = $('[id*="_RegionName"]').val();
       
   // if (typeof selectedRegion === typeof undefined || selectedRegion === "")
    if(typeof defaultRegion === typeof undefined || defaultRegion === "")
      return true;
    var selectedRegion = defaultRegion;
    if (selectedRegion.toLocaleLowerCase() !== "ie") return true;
    result = validateEircode(postCode)
   
    if (result === "") {
        invalidMarker.show();
        return false;
    }
      
    inputPostcode.val(result);
    return true;

}



function validateEircode(eircode) {
    var pattern =
        '\\b(?:(' +
        'a(4[125s]|6[37]|7[5s]|[8b][1-6s]|9[12468b])|' +
        'c1[5s]|' +
        'd([0o][1-9sb]|1[0-8osb]|2[024o]|6w)|' +
        'e(2[15s]|3[24]|4[15s]|[5s]3|91)|' +
        'f(12|2[368b]|3[15s]|4[25s]|[5s][26]|9[1-4])|' +
        'h(1[2468b]|23|[5s][34]|6[25s]|[79]1)|' +
        'k(3[246]|4[5s]|[5s]6|67|7[8b])|' +
        'n(3[79]|[49]1)|' +
        'p(1[247]|2[45s]|3[126]|4[37]|[5s][16]|6[17]|7[25s]|[8b][15s])|' +
        'r(14|21|3[25s]|4[25s]|[5s][16]|9[35s])|' +
        't(12|23|34|4[5s]|[5s]6)|' +
        'v(1[45s]|23|3[15s]|42|9[2-5s])|' +
        'w(12|23|34|91)|' +
        'x(3[5s]|42|91)|' +
        'y(14|2[15s]|3[45s])' +
        ')\\s?[abcdefhknoprtsvwxy\\d]{4})\\b';

    var reg = new RegExp(pattern, 'i');
    //return the first Eircode
    var i = String(eircode).search(reg);
    if (i != -1)
        return (String(eircode).substring(i, i + 8).toUpperCase().replace(' ', '').replace(/O/g, 0).replace(/S/g, 5).replace(/B/g, 8));
    else
        return "";
};
$(document).ready(function() {
    if (pcaKey && $("[name$='_PcaSearch'].form-control").length) {
        $("[name$='_PcaSearch'].form-control").on("click", function () {
            $(this).val($(this).val() + " ");
            $(this).val($(this).val().slice(0, -1));
        });
        var fields = [
            { element: "_PcaSearch", field: "", mode: pca.fieldMode.SEARCH },
            { element: "_Line1", field: "Line1", mode: pca.fieldMode.POPULATE },
            { element: "_Line2", field: "Line2", mode: pca.fieldMode.POPULATE },
            { element: "_Line3", field: "Line3", mode: pca.fieldMode.POPULATE },
            { element: "_City", field: "City", mode: pca.fieldMode.POPULATE },
            { element: "_RegionName", field: "ProvinceName", mode: pca.fieldMode.POPULATE },
            { element: "_PostalCode", field: "PostalCode", mode: pca.fieldMode.POPULATE },
            { element: "_Country", field: "CountryName", mode: pca.fieldMode.POPULATE }
        ];
        var options = { key: pcaKey, search: { countries: pcaCountry } };
        var control = new pca.Address(fields, options);
       
        control.listen("populate",
    
            function (address, variations) {
               
                if ($("[ShippingOptions]:visible").length) {
                    UpdateShippingOptions(pcaCountry, address.PostalCode);
                }
                if ($('.custom-dropdown[region-selector] input[type="hidden"]').length) {
                    $('.custom-dropdown[region-selector] input[type="hidden"]').trigger("change");
                }
                if ($(".pca-summary").length) {
                    $(".pca-summary").empty();
                    var formattedAddress = address.FormattedLine1 + ", ";
                    if (address.FormattedLine2) formattedAddress += address.FormattedLine2 + ", ";
                    if (address.FormattedLine3) formattedAddress += address.FormattedLine3 + ", ";
                    formattedAddress += address.City + ", ";
                    formattedAddress += address.Province + ", ";
                    formattedAddress += address.PostalCode + ", ";
                    formattedAddress += address.CountryName;
                    var label = "<label class=\"select-sa-address sa-1 mb-2 d-block toggleActiveOpacity\">" + formattedAddress + "</label>";
                    $(".pca-summary").html(label);
                }
                $('[id*="_Line1"]').trigger("blur");
                $('[id*="_Line2"]').trigger("blur");

                setTimeout(function() { //AddressLookup
                        if ($("[id^='AddressLookup'].is-invalid").length > 0) {
                            $(".pca-summary .select-sa-address").removeClass("is-valid");
                            $(".pca-summary .select-sa-address").addClass("is-invalid");
                        } else {
                            $(".pca-summary .select-sa-address").addClass("is-valid");
                            $(".pca-summary .select-sa-address").removeClass("is-invalid");
                        }
                    },
                    0);


            });
    }

   
});

var RemoveDiacritics = function (str) {
    var diacriticsMap = {
        A: /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g,
        AA: /[\uA732]/g,
        AE: /[\u00C6\u01FC\u01E2]/g,
        AO: /[\uA734]/g,
        AU: /[\uA736]/g,
        AV: /[\uA738\uA73A]/g,
        AY: /[\uA73C]/g,
        B: /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g,
        C: /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g,
        D: /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g,
        DZ: /[\u01F1\u01C4]/g,
        Dz: /[\u01F2\u01C5]/g,
        E: /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g,
        F: /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g,
        G: /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g,
        H: /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g,
        I: /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g,
        J: /[\u004A\u24BF\uFF2A\u0134\u0248]/g,
        K: /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g,
        L: /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g,
        LJ: /[\u01C7]/g,
        Lj: /[\u01C8]/g,
        M: /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g,
        N: /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g,
        NJ: /[\u01CA]/g,
        Nj: /[\u01CB]/g,
        O: /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g,
        OI: /[\u01A2]/g,
        OO: /[\uA74E]/g,
        OU: /[\u0222]/g,
        P: /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g,
        Q: /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g,
        R: /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g,
        S: /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g,
        T: /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g,
        TZ: /[\uA728]/g,
        U: /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g,
        V: /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g,
        VY: /[\uA760]/g,
        W: /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g,
        X: /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g,
        Y: /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g,
        Z: /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g,
        a: /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g,
        aa: /[\uA733]/g,
        ae: /[\u00E6\u01FD\u01E3]/g,
        ao: /[\uA735]/g,
        au: /[\uA737]/g,
        av: /[\uA739\uA73B]/g,
        ay: /[\uA73D]/g,
        b: /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g,
        c: /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g,
        d: /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g,
        dz: /[\u01F3\u01C6]/g,
        e: /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g,
        f: /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g,
        g: /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g,
        h: /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g,
        hv: /[\u0195]/g,
        i: /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g,
        j: /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g,
        k: /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g,
        l: /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g,
        lj: /[\u01C9]/g,
        m: /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g,
        n: /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g,
        nj: /[\u01CC]/g,
        o: /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g,
        oi: /[\u01A3]/g,
        ou: /[\u0223]/g,
        oo: /[\uA74F]/g,
        p: /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g,
        q: /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g,
        r: /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g,
        s: /[\u0073\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g,
        ss: /[\u00DF]/g,
        t: /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g,
        tz: /[\uA729]/g,
        u: /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g,
        v: /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g,
        vy: /[\uA761]/g,
        w: /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g,
        x: /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g,
        y: /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g,
        z: /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g
    };
    for (var x in diacriticsMap) {
        // Iterate through each keys in the above object and perform a replace
        str = str.replace(diacriticsMap[x], x);
    }
    return str;
};
(function (d) {
    
    var style_element = d.createElement('STYLE'),
        dom_events = 'addEventListener' in d,
        add_event_listener = function (type, callback) {
            // Basic cross-browser event handling
            if (dom_events) {
                d.addEventListener(type, callback);
            } else {
                d.attachEvent('on' + type, callback);
            }
        },
        set_css = function (css_text) {
            // Handle setting of <style> element contents in IE8
            !!style_element.styleSheet ? style_element.styleSheet.cssText = css_text : style_element.innerHTML = css_text;
        }
    ;

    d.setcss = set_css;
    d.getElementsByTagName('HEAD')[0].appendChild(style_element);

    add_event_listener('mousedown', function () {
        $('.header-transparent').removeClass('hovered');
        $('html').removeClass('usingKeys');
        $('html').addClass('usingMouse');

    });

    add_event_listener('keydown', function () {
        set_css('');
        $('.header-transparent').addClass('hovered');
        $('html').removeClass('usingMouse');
        $('html').addClass('usingKeys');
    });

    function onElementFocused(e) {
        if (e && e.target)
            document.activeElement = e.target == document ? null : e.target;
    }



    if (document.addEventListener)
        document.addEventListener("focus", onElementFocused, true);

})(document);

;
/**
 * @namespace aria
 */

var aria = aria || {};

/**
 * @desc
 *  Key code constants
 */
aria.KeyCode = {
    BACKSPACE: 8,
    TAB: 9,
    RETURN: 13,
    ESC: 27,
    SPACE: 32,
    PAGE_UP: 33,
    PAGE_DOWN: 34,
    END: 35,
    HOME: 36,
    LEFT: 37,
    UP: 38,
    RIGHT: 39,
    DOWN: 40,
    DELETE: 46
};

aria.Utils = aria.Utils || {};

// Polyfill src https://developer.mozilla.org/en-US/docs/Web/API/Element/matches
aria.Utils.matches = function (element, selector) {
    if (!Element.prototype.matches) {
        Element.prototype.matches =
          Element.prototype.matchesSelector ||
          Element.prototype.mozMatchesSelector ||
          Element.prototype.msMatchesSelector ||
          Element.prototype.oMatchesSelector ||
          Element.prototype.webkitMatchesSelector ||
          function (s) {
              var matches = element.parentNode.querySelectorAll(s);
              var i = matches.length;
              while (--i >= 0 && matches.item(i) !== this) { }
              return i > -1;
          };
    }

    return element.matches(selector);
};

aria.Utils.remove = function (item) {
    if (item.remove && typeof item.remove === 'function') {
        return item.remove();
    }
    if (item.parentNode &&
        item.parentNode.removeChild &&
        typeof item.parentNode.removeChild === 'function') {
        return item.parentNode.removeChild(item);
    }
    return false;
};

aria.Utils.isFocusable = function (element) {
    if (element.tabIndex > 0 || (element.tabIndex === 0 && element.getAttribute('tabIndex') !== null)) {
        return true;
    }

    if (element.disabled) {
        return false;
    }

    switch (element.nodeName) {
        case 'A':
            return !!element.href && element.rel != 'ignore';
        case 'INPUT':
            return element.type != 'hidden' && element.type != 'file';
        case 'BUTTON':
        case 'SELECT':
        case 'TEXTAREA':
            return true;
        default:
            return false;
    }
};

aria.Utils.getAncestorBySelector = function (element, selector) {
    if (!aria.Utils.matches(element, selector + ' ' + element.tagName)) {
        // Element is not inside an element that matches selector
        return null;
    }

    // Move up the DOM tree until a parent matching the selector is found
    var currentNode = element;
    var ancestor = null;
    while (ancestor === null) {
        if (aria.Utils.matches(currentNode.parentNode, selector)) {
            ancestor = currentNode.parentNode;
        }
        else {
            currentNode = currentNode.parentNode;
        }
    }

    return ancestor;
};

aria.Utils.hasClass = function (element, className) {
    return (new RegExp('(\\s|^)' + className + '(\\s|$)')).test(element.className);
};

aria.Utils.addClass = function (element, className) {
    if (!aria.Utils.hasClass(element, className)) {
        element.className += ' ' + className;
    }
};

aria.Utils.removeClass = function (element, className) {
    var classRegex = new RegExp('(\\s|^)' + className + '(\\s|$)');
    element.className = element.className.replace(classRegex, ' ').trim();
};

aria.Utils.bindMethods = function (object /* , ...methodNames */) {
    var methodNames = Array.prototype.slice.call(arguments, 1);
    methodNames.forEach(function (method) {
        object[method] = object[method].bind(object);
    });
};;
/*
*   This content is licensed according to the W3C Software License at
*   https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
*/
/**
 * @namespace aria
 */
var aria = aria || {};

/**
 * @constructor
 *
 * @desc
 *  Listbox object representing the state and interactions for a listbox widget
 *
 * @param listboxNode
 *  The DOM node pointing to the listbox
 */
aria.Listbox = function (listboxNode) {
    this.listboxNode = listboxNode;
    this.activeDescendant = this.listboxNode.getAttribute('aria-activedescendant');
    this.multiselectable = this.listboxNode.hasAttribute('aria-multiselectable');
    this.moveUpDownEnabled = false;
    this.siblingList = null;
    this.upButton = null;
    this.downButton = null;
    this.moveButton = null;
    this.keysSoFar = '';
    this.handleFocusChange = function () { };
    this.handleItemChange = function (event, items) { };
    this.registerEvents();
};

/**
 * @desc
 *  Register events for the listbox interactions
 */
aria.Listbox.prototype.registerEvents = function () {
    this.listboxNode.addEventListener('focus', this.setupFocus.bind(this));
    this.listboxNode.addEventListener('keydown', this.checkKeyPress.bind(this));
    this.listboxNode.addEventListener('click', this.checkClickItem.bind(this));
};

/**
 * @desc
 *  If there is no activeDescendant, focus on the first option
 */
aria.Listbox.prototype.setupFocus = function () {
    if (this.activeDescendant) {
        return;
    }

    this.focusFirstItem();
};

/**
 * @desc
 *  Focus on the first option
 */
aria.Listbox.prototype.focusFirstItem = function () {
    var firstItem;

    firstItem = this.listboxNode.querySelector('[role="option"]');

    if (firstItem) {
        this.focusItem(firstItem);
        if (this.listboxNode.querySelectorAll('[role="option"]').length === 1) {
           
        }
       
    }
};

/**
 * @desc
 *  Focus on the last option
 */
aria.Listbox.prototype.focusLastItem = function () {
    var itemList = this.listboxNode.querySelectorAll('[role="option"]');

    if (itemList.length) {
        this.focusItem(itemList[itemList.length - 1]);
    }
};

/**
 * @desc
 *  Handle various keyboard controls; UP/DOWN will shift focus; SPACE selects
 *  an item.
 *
 * @param evt
 *  The keydown event object
 */
aria.Listbox.prototype.checkKeyPress = function (evt) {
    var key = evt.which || evt.keyCode;
    var nextItem = document.getElementById(this.activeDescendant);

    if (!nextItem) {
        return;
    }

    switch (key) {
        case aria.KeyCode.PAGE_UP:
        case aria.KeyCode.PAGE_DOWN:
            if (this.moveUpDownEnabled) {
                evt.preventDefault();

                if (key === aria.KeyCode.PAGE_UP) {
                    this.moveUpItems();
                }
                else {
                    this.moveDownItems();
                }
            }

            break;
        case aria.KeyCode.UP:
        case aria.KeyCode.DOWN:
            evt.preventDefault();

            if (this.moveUpDownEnabled && evt.altKey) {
                if (key === aria.KeyCode.UP) {
                    this.moveUpItems();
                }
                else {
                    this.moveDownItems();
                }
                return;
            }

            if (key === aria.KeyCode.UP) {
                nextItem = nextItem.previousElementSibling;
            }
            else {
                nextItem = nextItem.nextElementSibling;
            }

            if (nextItem) {
                this.focusItem(nextItem);
            }

            break;
        case aria.KeyCode.HOME:
            evt.preventDefault();
            this.focusFirstItem();
            break;
        case aria.KeyCode.END:
            evt.preventDefault();
            this.focusLastItem();
            break;
        case aria.KeyCode.SPACE:
            evt.preventDefault();
            this.toggleSelectItem(nextItem);
            break;
        case aria.KeyCode.BACKSPACE:
        case aria.KeyCode.DELETE:
        case aria.KeyCode.RETURN:
            if (!this.moveButton) {
                return;
            }

            var keyshortcuts = this.moveButton.getAttribute('aria-keyshortcuts');
            if (key === aria.KeyCode.RETURN && keyshortcuts.indexOf('Enter') === -1) {
                return;
            }
            if (
              (key === aria.KeyCode.BACKSPACE || key === aria.KeyCode.DELETE) &&
              keyshortcuts.indexOf('Delete') === -1
            ) {
                return;
            }

            evt.preventDefault();

            var nextUnselected = nextItem.nextElementSibling;
            while (nextUnselected) {
                if (nextUnselected.getAttribute('aria-selected') != 'true') {
                    break;
                }
                nextUnselected = nextUnselected.nextElementSibling;
            }
            if (!nextUnselected) {
                nextUnselected = nextItem.previousElementSibling;
                while (nextUnselected) {
                    if (nextUnselected.getAttribute('aria-selected') != 'true') {
                        break;
                    }
                    nextUnselected = nextUnselected.previousElementSibling;
                }
            }

            this.moveItems();

            if (!this.activeDescendant && nextUnselected) {
                this.focusItem(nextUnselected);
            }
            break;
        default:
            var itemToFocus = this.findItemToFocus(key);
            if (itemToFocus) {
                this.focusItem(itemToFocus);
            }
            break;
    }
};

aria.Listbox.prototype.findItemToFocus = function (key) {
    var itemList = this.listboxNode.querySelectorAll('[role="option"]');
    var character = String.fromCharCode(key);

    if (!this.keysSoFar) {
        for (var i = 0; i < itemList.length; i++) {
            if (itemList[i].getAttribute('id') == this.activeDescendant) {
                this.searchIndex = i;
            }
        }
    }
    this.keysSoFar += character;
    this.clearKeysSoFarAfterDelay();

    var nextMatch = this.findMatchInRange(
      itemList,
      this.searchIndex + 1,
      itemList.length
    );
    if (!nextMatch) {
        nextMatch = this.findMatchInRange(
          itemList,
          0,
          this.searchIndex
        );
    }
    return nextMatch;
};

aria.Listbox.prototype.clearKeysSoFarAfterDelay = function () {
    if (this.keyClear) {
        clearTimeout(this.keyClear);
        this.keyClear = null;
    }
    this.keyClear = setTimeout((function () {
        this.keysSoFar = '';
        this.keyClear = null;
    }).bind(this), 500);
};

aria.Listbox.prototype.findMatchInRange = function (list, startIndex, endIndex) {
    // Find the first item starting with the keysSoFar substring, searching in
    // the specified range of items
    for (var n = startIndex; n < endIndex; n++) {
        var label = list[n].innerText;
        if (label && label.toUpperCase().indexOf(this.keysSoFar) === 0) {
            return list[n];
        }
    }
    return null;
};

/**
 * @desc
 *  Check if an item is clicked on. If so, focus on it and select it.
 *
 * @param evt
 *  The click event object
 */
aria.Listbox.prototype.checkClickItem = function (evt) {
    if (evt.target.getAttribute('role') === 'option') {
        this.focusItem(evt.target);
        this.toggleSelectItem(evt.target);
    } else {
        if ($(evt.target).parent().attr('role') === 'option') {
            this.focusItem($(evt.target).parent()[0]);
            this.toggleSelectItem($(evt.target).parent()[0]);
        }
    }
};

/**
 * @desc
 *  Toggle the aria-selected value
 *
 * @param element
 *  The element to select
 */
aria.Listbox.prototype.toggleSelectItem = function (element) {
    if (this.multiselectable) {
        element.setAttribute(
          'aria-selected',
          element.getAttribute('aria-selected') === 'true' ? 'false' : 'true'
        );

        if (this.moveButton) {
            if (this.listboxNode.querySelector('[aria-selected="true"]')) {
                this.moveButton.setAttribute('aria-disabled', 'false');
            }
            else {
                this.moveButton.setAttribute('aria-disabled', 'true');
            }
        }
    }
};

/**
 * @desc
 *  Defocus the specified item
 *
 * @param element
 *  The element to defocus
 */
aria.Listbox.prototype.defocusItem = function (element) {
    if (!element) {
        return;
    }
    if (!this.multiselectable) {
        element.removeAttribute('aria-selected');
    }
    aria.Utils.removeClass(element, 'focused');
};

/**
 * @desc
 *  Focus on the specified item
 *
 * @param element
 *  The element to focus
 */
aria.Listbox.prototype.focusItem = function (element) {
    this.defocusItem(document.getElementById(this.activeDescendant));
    if (!this.multiselectable) {
        element.setAttribute('aria-selected', 'true');
    }
    aria.Utils.addClass(element, 'focused');
    this.listboxNode.setAttribute('aria-activedescendant', element.id);
    this.activeDescendant = element.id;

    if (this.listboxNode.scrollHeight > this.listboxNode.clientHeight) {
        var scrollBottom = this.listboxNode.clientHeight + this.listboxNode.scrollTop;
        var elementBottom = element.offsetTop + element.offsetHeight;
        if (elementBottom > scrollBottom) {
            this.listboxNode.scrollTop = elementBottom - this.listboxNode.clientHeight;
        }
        else if (element.offsetTop < this.listboxNode.scrollTop) {
            this.listboxNode.scrollTop = element.offsetTop;
        }
    }

    if (!this.multiselectable && this.moveButton) {
        this.moveButton.setAttribute('aria-disabled', false);
    }

    this.checkUpDownButtons();
    this.handleFocusChange(element);
};

/**
 * @desc
 *  Enable/disable the up/down arrows based on the activeDescendant.
 */
aria.Listbox.prototype.checkUpDownButtons = function () {
    var activeElement = document.getElementById(this.activeDescendant);

    if (!this.moveUpDownEnabled) {
        return false;
    }

    if (!activeElement) {
        this.upButton.setAttribute('aria-disabled', 'true');
        this.downButton.setAttribute('aria-disabled', 'true');
        return;
    }

    if (this.upButton) {
        if (activeElement.previousElementSibling) {
            this.upButton.setAttribute('aria-disabled', false);
        }
        else {
            this.upButton.setAttribute('aria-disabled', 'true');
        }
    }

    if (this.downButton) {
        if (activeElement.nextElementSibling) {
            this.downButton.setAttribute('aria-disabled', false);
        }
        else {
            this.downButton.setAttribute('aria-disabled', 'true');
        }
    }
};

/**
 * @desc
 *  Add the specified items to the listbox. Assumes items are valid options.
 *
 * @param items
 *  An array of items to add to the listbox
 */
aria.Listbox.prototype.addItems = function (items) {
    if (!items || !items.length) {
        return false;
    }

    items.forEach((function (item) {
        this.defocusItem(item);
        this.toggleSelectItem(item);
        this.listboxNode.append(item);
    }).bind(this));

    if (!this.activeDescendant) {
        this.focusItem(items[0]);
    }

    this.handleItemChange('added', items);
};

/**
 * @desc
 *  Remove all of the selected items from the listbox; Removes the focused items
 *  in a single select listbox and the items with aria-selected in a multi
 *  select listbox.
 *
 * @returns items
 *  An array of items that were removed from the listbox
 */
aria.Listbox.prototype.deleteItems = function () {
    var itemsToDelete;

    if (this.multiselectable) {
        itemsToDelete = this.listboxNode.querySelectorAll('[aria-selected="true"]');
    }
    else if (this.activeDescendant) {
        itemsToDelete = [document.getElementById(this.activeDescendant)];
    }

    if (!itemsToDelete || !itemsToDelete.length) {
        return [];
    }

    itemsToDelete.forEach((function (item) {
        item.remove();

        if (item.id === this.activeDescendant) {
            this.clearActiveDescendant();
        }
    }).bind(this));

    this.handleItemChange('removed', itemsToDelete);

    return itemsToDelete;
};

aria.Listbox.prototype.clearActiveDescendant = function () {
    this.activeDescendant = null;
    this.listboxNode.setAttribute('aria-activedescendant', null);

    if (this.moveButton) {
        this.moveButton.setAttribute('aria-disabled', 'true');
    }

    this.checkUpDownButtons();
};

/**
 * @desc
 *  Shifts the currently focused item up on the list. No shifting occurs if the
 *  item is already at the top of the list.
 */
aria.Listbox.prototype.moveUpItems = function () {
    var previousItem;

    if (!this.activeDescendant) {
        return;
    }

    currentItem = document.getElementById(this.activeDescendant);
    previousItem = currentItem.previousElementSibling;

    if (previousItem) {
        this.listboxNode.insertBefore(currentItem, previousItem);
        this.handleItemChange('moved_up', [currentItem]);
    }

    this.checkUpDownButtons();
};

/**
 * @desc
 *  Shifts the currently focused item down on the list. No shifting occurs if
 *  the item is already at the end of the list.
 */
aria.Listbox.prototype.moveDownItems = function () {
    var nextItem;

    if (!this.activeDescendant) {
        return;
    }

    currentItem = document.getElementById(this.activeDescendant);
    nextItem = currentItem.nextElementSibling;

    if (nextItem) {
        this.listboxNode.insertBefore(nextItem, currentItem);
        this.handleItemChange('moved_down', [currentItem]);
    }

    this.checkUpDownButtons();
};

/**
 * @desc
 *  Delete the currently selected items and add them to the sibling list.
 */
aria.Listbox.prototype.moveItems = function () {
    if (!this.siblingList) {
        return;
    }

    var itemsToMove = this.deleteItems();
    this.siblingList.addItems(itemsToMove);
};

/**
 * @desc
 *  Enable Up/Down controls to shift items up and down.
 *
 * @param upButton
 *   Up button to trigger up shift
 *
 * @param downButton
 *   Down button to trigger down shift
 */
aria.Listbox.prototype.enableMoveUpDown = function (upButton, downButton) {
    this.moveUpDownEnabled = true;
    this.upButton = upButton;
    this.downButton = downButton;
    upButton.addEventListener('click', this.moveUpItems.bind(this));
    downButton.addEventListener('click', this.moveDownItems.bind(this));
};

/**
 * @desc
 *  Enable Move controls. Moving removes selected items from the current
 *  list and adds them to the sibling list.
 *
 * @param button
 *   Move button to trigger delete
 *
 * @param siblingList
 *   Listbox to move items to
 */
aria.Listbox.prototype.setupMove = function (button, siblingList) {
    this.siblingList = siblingList;
    this.moveButton = button;
    button.addEventListener('click', this.moveItems.bind(this));
};

aria.Listbox.prototype.setHandleItemChange = function (handlerFn) {
    this.handleItemChange = handlerFn;
};

aria.Listbox.prototype.setHandleFocusChange = function (focusChangeHandler) {
    this.handleFocusChange = focusChangeHandler;
};;
/**
 * ARIA Collapsible Dropdown Listbox Example
 * @function onload
 * @desc Initialize the listbox example once the page has loaded
 */

window.addEventListener('load', function () {

    $('.custom-listbox [role="listbox"]').each(function () {
        var button = $(this).parent().find('button')[0];
        var exListbox = new aria.Listbox($(this)[0]);
        var listboxButton = new aria.ListboxButton(button, exListbox);
    });
});

var aria = aria || {};

aria.ListboxButton = function (button, listbox) {
    this.button = button;
    this.listbox = listbox;
    this.registerEvents();
};

aria.ListboxButton.prototype.registerEvents = function () {
    this.button.addEventListener('click', this.showListbox.bind(this));
    this.button.addEventListener('keyup', this.checkShow.bind(this));
    this.listbox.listboxNode.addEventListener('blur', this.hideListbox.bind(this));
    this.listbox.listboxNode.addEventListener('keydown', this.checkHide.bind(this));
    this.listbox.listboxNode.addEventListener('mouseup', this.checkMouseupItem.bind(this));
   this.listbox.setHandleFocusChange(this.onFocusChange.bind(this));
};

aria.ListboxButton.prototype.checkShow = function (evt) {
    var key = evt.which || evt.keyCode;

    switch (key) {
        case aria.KeyCode.UP:
        case aria.KeyCode.DOWN:
            evt.preventDefault();
            this.showListbox();
            this.listbox.checkKeyPress(evt);
            break;
    }
};

aria.ListboxButton.prototype.checkHide = function (evt) {
    var key = evt.which || evt.keyCode;

    switch (key) {
        case aria.KeyCode.RETURN:
        case aria.KeyCode.ESC:
            evt.preventDefault();
            this.hideListbox();
            this.button.focus();
            break;
    }
};


aria.ListboxButton.prototype.showListbox = function () {
    
    aria.Utils.removeClass(this.listbox.listboxNode, 'hidden');
    this.button.setAttribute('aria-expanded', 'true');
    this.listbox.listboxNode.focus();
};

aria.ListboxButton.prototype.checkMouseupItem = function (evt) {
    if (evt.target.tagName === 'UL') return;
    this.listbox.checkClickItem(evt);
    this.hideListbox();
};

aria.ListboxButton.prototype.hideListbox = function () {
    $(this.listbox.listboxNode.querySelectorAll('[aria-selected="true"]')[0]).click();
    aria.Utils.addClass(this.listbox.listboxNode, 'hidden');
    this.button.removeAttribute('aria-expanded');
};

aria.ListboxButton.prototype.onFocusChange = function (focusedItem) {
  
    this.button.innerHTML = focusedItem.innerHTML;
    aria.Utils.addClass(this.button, 'is-valid');
};;
//global app
var app = angular.module("app", ["ngSanitize", 'ui.bootstrap', 'ngCookies', 'ngAnimate'],
    function() {
        // configure new 'compile' directive by passing a directive
        // factory function. The factory function injects the '$compile'

    });

app.directive('compile', ["$compile",
    function($compile) {
        // directive factory creates a link function
        return function(scope, element, attrs) {
            scope.$watch(
                function(scope) {
                    // watch the 'compile' expression for changes
                    return scope.$eval(attrs.compile);
                },
                function(value) {
                    // when the 'compile' expression changes
                    // assign it into the current DOM
                    element.html(value);

                    // compile the new DOM and link it to the current
                    // scope.
                    // NOTE: we only compile .childNodes so that
                    // we don't get into infinite loop compiling ourselves
                    $compile(element.contents())(scope);
                }
            );
        };
    }
]);

app.constant("siteConfig",
    {
        baseUrl: window.location.origin,
        langCode: document.getElementsByTagName("html")[0].getAttribute("lang"),
        isAuthenticated: isAuthenticated,
        currentUserId: currentUserId,
        rootUrl: baseUrl,
        getTimeStamp: function () { return "time=" + new Date().getTime() },
        expireTime: expireTime,
        isB2B: isB2B,
		wishlistUrl: wishlistUrl
    });

app.run(['$anchorScroll', function($anchorScroll) {
    $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels
}]);

app.service("sharedState", function() {
    return {
        loading: true,
        loadingUrls: {}
    }
});

app.factory('loadingInterceptor', ['$log', 'sharedState', function($log, sharedState) {
    function hashUrl(config) {
        var hashedUrl = config.url.split('?')[0];
        return hashedUrl;
    }
    var myInterceptor = {
        request: function(config) {
            $log.debug('start loading:');
            $log.debug(config.url);

            sharedState.loading = true;
            sharedState.loadingUrls[hashUrl(config)] = true;
            return config;
        },
        requestError: function(config) {
            $log.debug('request error');
            sharedState.loading = false;
            if (sharedState.loadingUrls[hashUrl(config)])
                delete sharedState.loadingUrls[hashUrl(config)];
            return config;
        },
        response: function(response) {
            $log.debug('Loading end:');
            $log.debug(response.config);
            sharedState.loading = false;
            if (sharedState.loadingUrls[hashUrl(response.config)])
                delete sharedState.loadingUrls[hashUrl(response.config)];
            return response;
        },
        responseError: function(response) {
            $log.debug('Loading end: ');
            $log.debug(response.config);
            sharedState.loading = false;
            if (sharedState.loadingUrls[hashUrl(response.config)])
                delete sharedState.loadingUrls[hashUrl(response.config)];
            return response;;
        }
    };

    return myInterceptor;
}]);

app.config(['$httpProvider', function($httpProvider) {
    $httpProvider.interceptors.push('loadingInterceptor');
}]);;
app.constant("apiUrl", {
    //--Wishlist
    wishListGetAll: '/api/WishList/GetAllName',
    wishListGetProductVariantByCodes: '/api/WishList/GetProductVariantByCodes',
    wishListRemoveProject: '/api/WishList/RemoveProject',
    wishListUpdateProjectName: '/api/WishList/UpdateName',
    wishListReorderProject: '/api/WishList/ReOrder',
    addProductToWishList: '/api/WishList/AddToWishList',
    removeProductToWishList: '/api/WishList/RemoveCode',

    //--PDP
    pdpGetFinishDropdownBySurface: '/Services/PaintProduct/GetFinishesDdl',
    pdpGetFinishWithVariantsDropdownBySurface: '/Services/PaintProduct/GetFinishesWithVariantsDdl',
    pdpGetFinishesListBySurface: '/Services/PaintProduct/GetFinishesList',
    pdpGetVariantForFinish: '/Services/PaintProduct/GetVariantForFinish',
    pdpGetWallpaperCalculator: '/Services/Calculator/WallpaperCalculator',
    pdpGetPaintCalculator: '/Services/Calculator/PaintCalculator',
    pdpGetWallpayperCalculator: '/Services/Calculator/WallpaperCalculator',
    pdpWallpayperGetViewUpdatedOnColorChanging: '/Services/WallpaperProduct/GetViewUpdatedOnColorChanging',
    pdpGetPaintQuickView: '/Services/PaintProduct/GetPaintQuickView',
    pdpWallpaperGetWallpaperQuickView: '/Services/WallpaperProduct/GetWallpaperQuickView',

    //--Basket
    bspGetCarts: '/api/CartServices/Get',
    bspDeleteItemCarts: '/api/CartServices/DeleteItem',
    bspAddOrUpdateLineItem: '/api/CartServices/AddOrUpdateLineItem',
	bspAddItemToBasket: '/api/CartServices/AddOrUpdateLineItems',
	bspApplyPromotion: '/api/CartServices/ApplyPromotion',
	bspRemovePromotion: '/api/CartServices/RemovePromotion',
	bspResetRemovedItemsInCart: '/api/CartServices/ResetRemovedItemsInCart',
    bspEmptyBasket: '/api/CartServices/Clear',
	
    //--Article page
	atcGetArticlesByCategory: '/Services/ArticleListingPage/GetArticlesByCategory',

	//--Order history page
	odhFilterOrder: '/Services/OrderHistoryPage/FilterOrder',

    //--Invoice and Credit Note page
    icnFilterInvoiceCreditNote: '/Services/InvoiceAndCreditNotePage/FilterList',
    icnDownloadInvoiceCreditNote: '/Services/InvoiceAndCreditNotePage/DownloadDocument',

    //--Colour compare
    GetColourCompareItems: '/Services/ColourCompare/GetColourCompareItems',
    colourCompareGetWallpaperVariants: '/Services/ColourCompare/GetWallPaperVariantItems',

    //--Quick order
    BulkBuyingByFileInput: '/Services/QuickOrderBlock/BulkBuyingByFileInput',
    BulkCheckout: '/Services/QuickOrderBlock/BulkCheckout'

});;
app.directive('articleContent', ['$animate', '$compile', '$templateCache', function ($animate, $compile, $templateCache) {
    return {
        restrict: 'AE',
        replace: false,
        scope: {
            categoryId: '=',
            isLoadContent: '=',
            pageSize: '=',
        },
        bindToController: {
            categoryId: '=',
            isLoadContent: '=',
            pageSize: '=',
        },
        controller: ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'EventBindingService',
            function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, EventBindingService) {
                var atc = this;
                $scope.articles = null;
                $scope.articleListingView = "";
                $scope.pagerStatusMessage = "";
                $scope.viewMoreMessage = "";
                $scope.shouldDisplayViewMore = false;
                $scope.currentPageNumber = 1;
                $scope.loading = false;

                atc.$onInit = function () {
                    $scope.$watch(
                        "isLoadContent",
                        function handleChange(newValue, oldValue) {
                            if ((newValue !== oldValue || oldValue === true) && newValue === true) {
                                if (!$scope.articleListingView && $scope.categoryId) {
                                    $scope.onLoadArticles($scope.currentPageNumber);
                                }
                            }
                        }
                    );
                }

                $scope.onLoadArticles = function (currentPageNumber, isloadMore) {
                    $scope.loading = true;
                    $http.get(apiUrl.atcGetArticlesByCategory + '?categoryId=' + $scope.categoryId + '&currentPageNumber=' + currentPageNumber + '&pageSize=' + $scope.pageSize + '&' + siteConfig.getTimeStamp()).then(function (response) {
                        if (response && response.data) {
                            $scope.articleListingView += response.data.ArticleListingView;
                            $scope.pagerStatusMessage = response.data.PagerStatusMessage;
                            $scope.shouldDisplayViewMore = response.data.ShouldDisplayViewMore;
                            $scope.viewMoreMessage = response.data.ViewMoreMessage;

                            $timeout(function () {
                                atc.onReloadImage();
                                atc.onRebindSwatchEvent();
                                atc.onRebindCarouselEvent();
                                $scope.loading = false;
                            }, 500);
                        }
                    }).catch(function (err) {
                        console.log(err);
                        $scope.loading = false;
                    });
                };

                $scope.onLoadMoreArticle = function () {
                    $scope.currentPageNumber += 1;
                    $scope.onLoadArticles($scope.currentPageNumber);
                }

                atc.onRebindSwatchEvent = function () {
                    EventBindingService.onRebindSwatchEvent($scope.categoryId);
                }

                atc.onReloadImage = function () {
                    EventBindingService.onReloadImage();
                }

                atc.onRebindCarouselEvent = function () {
                    var $articleListingPage = $(".article-listing-page");
                    EventBindingService.onRebindCarousel($articleListingPage);
                }

                $scope.trustAsHtml = function (string) {
                    return $sce.trustAsHtml(string);
                };

            }],
        templateUrl: "articlecontent.html",
        link: {
            post: function (scope, element, attrs) {
                //element.on("click", function (event) {
                //    scope.elementClicked = event.target;
                //    $(document).on("click", onDocumentClick);
                //    $('.mini-basket').toggle('slow', function() {});
                //});

                //var onDocumentClick = function (event) {
                //    if (scope.elementClicked === event.target) {
                //        return;
                //    }
                //    scope.$apply(function () {
                //        scope.isShowCart = false;
                //        scope.isShowAddToBasketInform = false;
                //    });
                //    $(document).off("click", onDocumentClick);
                //};
            }
        }
    };
}]);;
app.controller('ArticleListingContainer', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'EventBindingService',
    function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService, EventBindingService) {
        var atr = this;
        atr.categories = categories;
        atr.pageSize = pageSize;
        atr.currentPageNumber = 1;
        atr.articleListingViewMore = "";
        atr.pagerStatusMessage = "";
        atr.shouldDisplayViewMore = true;
        atr.viewMoreMessage = "";

        atr.isloadMore = false;
        atr.loading = false;
		atr.tab = activeCategoryId || 0;
		atr.isFirstLoad = true;
		atr.isLoadFromActiveCategory = activeCategoryId != 0;

        atr.$onInit = function () {
            $timeout(function () {
                atr.onRebindSwatchEvent();
            }, 500);
        }

		atr.onSelectCategory = function (categoryId, categoryValue) {
			if (activeCategoryId != 0 && atr.isLoadFromActiveCategory && atr.isFirstLoad) {
				atr.isloadMore = true;
				atr.shouldDisplayViewMore = false;
				atr.onLoadArticles(atr.currentPageNumber);
			}
            atr.tab = categoryId;
        }

        atr.onLoadMoreArticle = function () {
            atr.currentPageNumber += 1;
            atr.onLoadArticles(atr.currentPageNumber);
        }

        atr.onLoadArticles = function (currentPageNumber, isloadMore) {
            atr.loading = true;
            $http.get(apiUrl.atcGetArticlesByCategory + '?categoryId=' + null + '&currentPageNumber=' + currentPageNumber + '&pageSize=' + atr.pageSize + '&' + siteConfig.getTimeStamp()).then(function (response) {
                if (response && response.data) {
                    atr.articleListingViewMore += response.data.ArticleListingView;
                    atr.pagerStatusMessage = response.data.PagerStatusMessage;
                    atr.shouldDisplayViewMore = response.data.ShouldDisplayViewMore;
                    atr.viewMoreMessage = response.data.ViewMoreMessage;
					atr.isloadMore = true;
					atr.isFirstLoad = false;
                    $timeout(function () {
                        atr.onReloadImage();
                        atr.onRebindSwatchEvent();
                        atr.onRebindCarouselEvent();
                        atr.loading = false;
                    }, 500);
                }
            }).catch(function (err) {
                console.log(err);
                atr.loading = false;
            });
        };

        atr.onReloadImage = function () {
            EventBindingService.onReloadImage();
        }

        atr.onRebindCarouselEvent = function () {
            var $articleListingPage = $(".article-listing-page");
            EventBindingService.onRebindCarousel($articleListingPage);
        }

        atr.onRebindSwatchEvent = function () {
            EventBindingService.onRebindSwatchEvent(0);
        }
    }
]);;
app.directive('changeBackground', ['$animate', function ($animate) {
    return {
        restrict: 'EA',
        scope: {
            bgtype: '=bgtype',
            bgchange: '=bgchange',
            bgdefault: '=bgdefault',
            bgfallback: '=bgfallback'
        },
        link: function ($scope, element, attr) {
            element.on('mouseenter', function () {
       
                if ($scope.bgtype == 'img' || $scope.bgtype == 'image') {
                    element.css({
                        'background': 'url(' + $scope.bgchange + ') 55%/110%',
                        'background-color': ''
                    });
                } else if ($scope.bgtype == 'color') {
                    element.css('background-image', $scope.bgchange);
                }
            });
            element.on('mouseleave', function () {
                if ($scope.bgfallback == 'img' || $scope.bgfallback == 'image') {
                    element.css({
                        'background': 'url(' + $scope.bgdefault + ') 55%/110%',
                        'background-color': ''
                    });
                } else if ($scope.bgfallback == 'color') {
                    element.css('background-color', $scope.bgdefault);
                    element.css('background-image', '');
                }
            });
        }
    };
}]);;
app.controller('ColourCompareController', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', 'siteConfig', 'apiUrl', 'EventBindingService','$cookies',
	function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, siteConfig, apiUrl, EventBindingService, $cookies) {
	    var clc = this;
	    $scope.Id = 0;
		$scope.isloading = false;
		$scope.isLoadingVariant = false;
		$scope.isOpenCompareMenu = false;
		$scope.swatchIndex = 0;
		$scope.selectedFacet = null;
		$scope.selectedPattern = null;
		$scope.selectedWallpaper = null;
		$scope.productCompares = [{}, {}, {}];
		$scope.Variants = [];
		$scope.productCategories = productCategories || [];
		$scope.categoryTypes = {
			Paint: 0,
			WallPaper: 1,
			WishList: 2,
			Recommended: 3
		}
		$scope.isActiveSubMenu = false;

	    $scope.onInit = function (id) {
	        $scope.Id = id;
	        var productCompares = $cookies.getObject('productCompare' + $scope.Id);

	        if (productCompares != window.undefined) {
	            $scope.productCompares = productCompares;
	        }
	    };

		$scope.onOpenCompareMenu = function (swatchIndex) {
			$scope.swatchIndex = swatchIndex;
			$scope.isOpenCompareMenu = !$scope.isOpenCompareMenu;
		}

		$scope.onCloseCompareMenu = function () {
			$scope.isOpenCompareMenu = false;
		}

		$scope.onOpenSubNavigation = function (category) {
			$scope.onSetActiveCategoryNavigation(category);
			if (category.Type == "Recommended" || category.Type == "WishList") {
				var categoryCompareModel = {
					ID: category.ID,
					Type: category.Type,
				};

				$scope.onGetProductCompareItems(categoryCompareModel, category);
			}
		}

		$scope.onCloseCategory = function (category) {
			$scope.productCategories.map(function (ctg) {
				ctg.Active = false;
			});
			$scope.isActiveSubMenu = false;
		}

		$scope.onSetActiveCategoryNavigation = function (category) {
			$scope.productCategories.map(function (ctg) {
				ctg.Active = ctg.ID == category.ID || false;
				if (ctg.Active) {
					$scope.isActiveSubMenu = true;
				}
			});
		}

		$scope.onGetProductCompareItems = function (categoryCompareModel, category) {
			category.Items = [];
			$scope.isloading = true;
			$http.post(apiUrl.GetColourCompareItems, categoryCompareModel).then(function (response) {
				category.Items = response && response.data || [];
				$scope.isloading = false;
			}).catch(function (err) {
				console.log(err);
				$scope.isloading = false;
			});
		}

		$scope.onSelectedFacet = function (facet, category) {
			$scope.selectedFacet = facet;
			var categoryCompareModel = {
				ID: category.ID,
				Type: category.Type,
				ColourGroup: facet.Key.Key
			};

			$scope.onGetProductCompareItems(categoryCompareModel, category);
		}

		$scope.onCloseFacetSelected = function () {
			$scope.selectedFacet = null;
		}

		$scope.onSelectedPattern = function (pattern, category) {
			$scope.selectedPattern = pattern;
			var categoryCompareModel = {
				ID: category.ID,
				Type: category.Type,
				PatternGroup: pattern.Key
			};

			$scope.onGetProductCompareItems(categoryCompareModel, category);
		}

		$scope.onClosePatternSelected = function () {
			$scope.selectedPattern = null;
		}

		$scope.onSelectedWallpaper = function (wallpaper) {
			$scope.selectedWallpaper = wallpaper;
			if (wallpaper.Type == "WallpaperVariant") {
				$scope.onSelectProductCompare(wallpaper);
			} else {
				$scope.Variants = [];
				$scope.isLoadingVariant = true;
				$http.get(apiUrl.colourCompareGetWallpaperVariants + '?code=' + wallpaper.Code + '&' + siteConfig.getTimeStamp()).then(function (response) {
					$scope.Variants = response && response.data || [];
					$scope.isLoadingVariant = false;
				}).catch(function (err) {
					console.log(err);
					$scope.isLoadingVariant = false;
				});
			}
		}

		$scope.onCloseWallpaperSelected = function () {
			$scope.selectedWallpaper = null;
		}

		$scope.onSelectProductCompare = function (product) {
		    var productToCompare = {
		        WishlistCode: product.Code,
                ProductCode: product && product.Type == 'PaintProduct' ? product.SampleCode : product.Code,
				ImageUrl: product && product.ImageUrl,
				DisplayName: product && product.Name,
				TagLine: product && product.TagLine,
				ColourHex: product && product.ColorHex,
				Type: product && product.Type,
				ContentType: product && product.Type,
				AvailableSample: product && product.AvailableSample,
				AvailableToBuy: product && product.AvailableToBuy,
				Link: product && product.Link
			};
			$scope.productCompares[$scope.swatchIndex - 1] = productToCompare;
			$scope.onCloseAllCompareNavigations();
			$cookies.remove('productCompare' + $scope.Id, { 'path': '/' });
		    $cookies.putObject('productCompare' + $scope.Id, $scope.productCompares, { 'path': '/' });
		}

		$scope.onCloseAllCompareNavigations = function () {
			$scope.onCloseCompareMenu();
			$scope.onCloseCategory();
			$scope.onCloseFacetSelected();
			$scope.onClosePatternSelected();
			$scope.onCloseWallpaperSelected();
		}

		$scope.onRemoveProductCompare = function (index) {
			var newProductCompares = $scope.productCompares.slice();
			newProductCompares.splice(index, 1);
			newProductCompares.splice(3, 0, {});
			$scope.productCompares = newProductCompares;
			$scope.onCloseAllCompareNavigations();
		    $cookies.remove('productCompare' + $scope.Id, { 'path': '/' });
		    $cookies.putObject('productCompare' + $scope.Id, $scope.productCompares, { 'path': '/' });
		}

		$scope.emptyObject = function (object) {
			return typeof object == "object" && angular.equals({}, object);
		}

		clc.trustAsHtml = function (string) {
			return $sce.trustAsHtml(string);
		};
	}
]);;
app.controller('ConfirmDialogController', ['$scope', '$uibModalInstance', 'actionName', 'actionTitle', function ($scope, $uibModalInstance, actionName, actionTitle) {

    $scope.actionTitle = actionTitle;
    $scope.actionName = actionName;

    $scope.onClose = function () {
        $uibModalInstance.close();
    };

    $scope.onConfirm = function () {
        $uibModalInstance.close(true);
    };

    $scope.onCancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

}]);;
app.controller('cookieController', ['$scope', '$cookies', function ($scope, $cookies) {
    var scope = $scope;
    // Check cookie value
    scope.cookiePolicy = function() {
        var policy = $cookies.get('cookiePolicy');
        if (policy !== 'true') {
            $('body').addClass('cookieBannerActive');
        }
        return policy;
    }
    // Set cookie
    scope.setCookie = function () {
        var expireDate = new Date();
        expireDate.setFullYear(expireDate.getFullYear() + 2);
        $cookies.put('cookiePolicy', 'true', { 'path': '/', 'expires': expireDate });
        $('body').removeClass('cookieBannerActive');
    }
    // Remove cookie
    scope.removeCookie = function () {
        $cookies.remove('cookiePolicy', { 'path': '/' });
    }
}]);;
app.service('CookieService', function() {

    this.onGetCookie = function(cname) {
        var name = cname + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') {
                c = c.substring(1);
            }
            if (c.indexOf(name) == 0) {
                return c.substring(name.length, c.length);
            }
        }
        return "";
    };


});;
app.service('CoreService', function () {

	this.isMobileOrTablet = function () {
		return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
	};

	this.isIOSDevice = function () {
		return /iPad | iPhone | iPod /.test(navigator.userAgent) && !window.MSStream;
	};

	this.getMobileOperatingSystem = function () {
		var userAgent = navigator.userAgent || navigator.vendor || window.opera;

		// Windows Phone must come first because its UA also contains "Android"
		if (/windows phone/i.test(userAgent)) {
			return "Windows Phone";
		}

		if (/android/i.test(userAgent)) {
			return "Android";
		}

		// iOS detection from: http://stackoverflow.com/a/9039885/177710
		if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {
			return "iOS";
		}

		return "unknown";
	}

	this.getParameterByName = function (name, url) {
		if (!url) url = window.location.href;
		name = name.replace(/[\[\]]/g, '\\$&');
		var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
			results = regex.exec(url);
		if (!results) return null;
		if (!results[2]) return '';
		return decodeURIComponent(results[2].replace(/\+/g, ' '));
	}

	this.isIEBrowser = function () {
		return this.detectIE() && this.detectIE() < 12;
	}

	this.isEdgeBrowser = function () {
		return this.detectIE() && this.detectIE() >= 12;
	}

	this.detectIE = function () {
		var ua = window.navigator.userAgent;

		var msie = ua.indexOf('MSIE ');
		if (msie > 0) {
			// IE 10 or older => return version number
			return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
		}

		var trident = ua.indexOf('Trident/');
		if (trident > 0) {
			// IE 11 => return version number
			var rv = ua.indexOf('rv:');
			return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
		}

		var edge = ua.indexOf('Edge/');
		if (edge > 0) {
			// Edge (IE 12+) => return version number
			return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
		}

		// other browser
		return false;
	}

});;
app.factory('debounce', ['$timeout','$q', function ($timeout, $q) {
    return function (func, wait, immediate) {
        var timeout;
        var deferred = $q.defer();
        return function () {
            var context = this, args = arguments;
            var later = function () {
                timeout = null;
                if (!immediate) {
                    deferred.resolve(func.apply(context, args));
                    deferred = $q.defer();
                }
            };
            var callNow = immediate && !timeout;
            if (timeout) {
                $timeout.cancel(timeout);
            }
            timeout = $timeout(later, wait);
            if (callNow) {
                deferred.resolve(func.apply(context, args));
                deferred = $q.defer();
            }
            return deferred.promise;
        };
    };
}]);;
app.directive("whenScrolled",
    function () {
        function link(scope, $elm) {
            var previousYOffset = 0;
            window.angular.element(window).bind("scroll",
                function (e) {
                    if (previousYOffset < e.currentTarget.pageYOffset && e.currentTarget.pageYOffset + e.currentTarget.innerHeight >=
                        ($elm.prop("offsetTop") + $elm.prop("offsetHeight"))) {
                        if (scope.enabled) {
                            scope.$apply(scope.whenScrolled);
                        }
                    }
                    previousYOffset = e.currentTarget.pageYOffset;
                });
        }

        return {
            link: link,
            scope: {
                enabled: "=",
                whenScrolled: "="
            }
        }
    });

app.directive('fallbackSrc', function () {
    var fallbackSrc = {
        link: function postLink(scope, iElement, iAttrs) {
            iElement.bind('error', function () {                
                var currentSrc = angular.element(this).attr("src");                
                if (currentSrc !== iAttrs.fallbackSrc) {
                    angular.element(this).attr("src", iAttrs.fallbackSrc);                    
                }
            });
        },
    }
    return fallbackSrc;
});

app.directive('onErrorState', function () {
    var onErrorState = {
        link: function postLink(scope, iElement, iAttrs) {
            var item = scope.onErrorState;            
            iElement.bind('error', function () {
                scope.$apply(function () {
                    item.hasError = true;
                });                           
            });
        },
        scope: {         
            onErrorState: "="
        }
    }
    return onErrorState;
});

app.directive('ngOnload', ['$parse', function ($parse) {
	return {
		restrict: 'A',
		link: function (scope, elem, attrs) {
			var fn = $parse(attrs.ngOnload);
			elem.on('load', function (event) {
				scope.$apply(function () {
					fn(scope, { $event: event });
				});
			});
		}
	};
}]);;
app.service('EventBindingService', ['CoreService', function (CoreService) {

	this.onRebindCarousel = function ($target) {
		$($target).find('.block-container > .block-content').each(function () {
			var  $this = $(this),
				showAtXS = $(this).data('showxs') || 1,
				showAtSM = $(this).data('showsm') || 3,
				showAtMD = $(this).data('showmd') || 4,
				showAtLG = $(this).data('showlg') || 4,
				showArrows = $(this).data('arrows') || true,
				showDots = $(this).data('dots') || true;

			var  updateProgressBar = function (event, slick) {
				// Get direct block parent
			    var  parentBlock = $this.closest('.block');
				// Set progress bar variables
				var progressBar = $(parentBlock).find('.carousel-status-fg');
				// Find pagination child nodes in slick object
				if (slick.$dots) {
					var pagination = slick.$dots[0].childNodes;
					// Get total number of pages in pagination
					var  paginationLength = pagination.length;
					// currentIndex represents the current active page in the pagination
					var currentIndex = 0;

					// Loop through the pagination items. Update the number values (e.g. 2/5) based on these figures.
					$(pagination).each(function (i) {
						// Add 1 to base index values to ensure values are in active literal context
						var  thisIndex = i + 1;
						if (pagination[i].className == 'slick-active') {
							$(parentBlock).find('.js-pagination-first').html(thisIndex);
							currentIndex = thisIndex;
						}
						if (thisIndex == paginationLength) {
							$(parentBlock).find('.js-pagination-last').html(thisIndex);
						}
					});

					// Figure out the positioning of the progress bar
					$(progressBar).css('width', (100 / paginationLength) + '%');
					$(progressBar).css('left', ((currentIndex - 1) * (100 / paginationLength)) + '%');
				}
			};

			$(this).on('afterChange', function (event, slick) {
				updateProgressBar(event, slick);
			});

			$(this).on('init', function (event, slick) {
				updateProgressBar(event, slick);
			});

			if (!$(this).hasClass('slick-initialized')) {
				var hasArrows = false;
				var isCentered = true;
				if ($(this).closest('.xsCarouselBlock').hasClass('has-arrows')) {
					hasArrows = true;
				}
				if ($(this).closest('.xsCarouselBlock').hasClass('swatch-carousel')) {
					isCentered = false;
				}

				if ($(this).parent('div').hasClass('bannerCarouselBlock')) {
				    hasArrows = true;
				    isCentered = false;
			    }

				$($this).slick({
					mobileFirst: true,
					slidesToShow: showAtXS,
					slidesToScroll: showAtXS,
					draggable: true,
					arrows: hasArrows,
					dots: showDots,
					centerMode: isCentered,
					infinite: false,
					lazyLoad: 'ondemand',
					useTransform: false,
					speed: 300,
					responsive: [
						{
							breakpoint: 575,
							settings: {
								centerMode: false,
								slidesToShow: showAtSM,
								slidesToScroll: showAtSM
							}
						},
						{
							breakpoint: 767,
							settings: {
								centerMode: false,
								slidesToShow: showAtMD,
								slidesToScroll: showAtMD
							}
						},
						{
							breakpoint: 991,
							settings: {
								centerMode: false,
								slidesToShow: showAtLG,
								slidesToScroll: showAtLG
							}
						}
					]
				});
			}

			hidePagination($this);
			hideOrphanDot($this);
		});
		// Click events for individual 'next' and 'previous' buttons on carousel
		$('.js-pagination-prev').click(function () {
		    var  parentBlockContent = $(this).closest('.block').find('.block-content');
			try { $(parentBlockContent).slick('slickPrev'); }
			catch (e) { // no carousel initialised
			}
		});

		$('.js-pagination-next').click(function () {
			var  parentBlockContent = $(this).closest('.block').find('.block-content');
			try { $(parentBlockContent).slick('slickNext'); }
			catch (e) { // no carousel initialised
			}
		});
	};

	this.onRebindSwatchEvent = function (targetContainer) {
		var $containerName = '.c-' + targetContainer;
		var $container = $($containerName);

		$($container).find('.swatch-button').click(function (e) {
			$('.blockArticle').removeClass('ziBoost');
			e.preventDefault();
			e.stopPropagation();
			$(this).toggleClass('open').siblings('.swatch-button-popup').toggleClass('open').parents('.blockArticle').addClass('ziBoost');
		});

		$('.swatch-mask, .swatches-close').on('click', function () {
			var $container = $(this).parents('.swatch-button-container');
			$($container).find('.swatch-button-popup').removeClass('open');
			$($container).find('.swatch-button').removeClass('open');
			$('.blockArticle').removeClass('ziBoost');
		});
	}

	this.onReloadImage = function () {
		var myLazyLoad = new LazyLoad({
			elements_selector: '.lazy',
			callback_error: function (element) {
				element.src = 'https://placeholdit.imgix.net/~text?txtsize=21&txt=Fallback%20image&w=220&h=280';
			}
		});
	}

	this.calculateTimeout = null;

	this.reCalculatePopoverPosition = function ($container, $target, $offsetTopElementTrigger) {
		//--Recalculate position of popover when it's on top
		if (this.calculateTimeout) { clearTimeout(this.calculateTimeout) }

		var contentHeightBeforeRender = 0;
		var contentHeightAfterRender = 0;
		var $targetElement = $($target).length > 1 ? $($target[1]) : $($target);
		var $containerOfTarget = $($container).length > 1 ? $($container[1]) : $($container);
		$($containerOfTarget).parents('.popover').removeClass('open');
		$($containerOfTarget).parents('.popover-body').css('padding-bottom', '0px');
		contentHeightBeforeRender = $($targetElement).outerHeight();
		$($containerOfTarget).height(contentHeightBeforeRender);

		this.calculateTimeout = setTimeout(function () {
			var offsetTopContainer = $($containerOfTarget).offset().top;
			var isTop = $offsetTopElementTrigger && offsetTopContainer < $offsetTopElementTrigger;
			contentHeightAfterRender = $($targetElement).outerHeight();
			var contentHeightBias = contentHeightBeforeRender - contentHeightAfterRender;
			var contentTransform = $($containerOfTarget).parents('.popover').css('transform');
			var contentTransformObj = contentTransform.replace('(', '').replace(')', '').split(',');
			var contentTransformHeight = CoreService.isIEBrowser() ? parseFloat(contentTransformObj[13]) : parseFloat(contentTransformObj[5]);
			var newContentTransformH = isTop ? (contentTransformHeight + contentHeightBias) : contentTransformHeight;
			var newContentTransform = contentTransform.replace('' + contentTransformHeight + '', '' + newContentTransformH + '');

			$($containerOfTarget).height(contentHeightAfterRender);
			$($containerOfTarget).parents('.popover').css('transform', newContentTransform);
			$($containerOfTarget).parents('.popover').addClass('open');
		}, 250)
	}

	this.onRebindFilterAndSortingEvent = function () {
		var  revealerBtn = $('a[data-reveal]');
		$(revealerBtn).on('click', function (e) {
			var  revealTargetClass = ('.' + $(e.target).data('reveal'));

			if ($(revealTargetClass).hasClass('open')) {
				$(revealTargetClass).removeClass('open');
			}
			else {
				$('div[class^="page-facets__"]').removeClass('open');
				setTimeout(function () { $(revealTargetClass).addClass('open'); }, 300);
			}
			e.preventDefault();
		});

		/** Facet status toggle **/
		// This toggles the status of each facet using the 'selected' class

		var  facet = $('.page-facets__facet');
		var  sortFacet = $('.page-facets__sort .page-facets__facet');

		$(facet).on('click', function (e) {
			$(e.target).toggleClass('selected');

		}).children().on('click', function (e) {
			$(e.target).parent().toggleClass('selected');
		});

		// this function handles the status of the sort items specifically

		$(sortFacet).on('click', function (e) {
			var  selectedStatus = $(e.target).hasClass('selected');
			$(sortFacet).removeClass('selected');
			if (selectedStatus == true) {
				$(e.target).addClass('selected');
			}
			else { $(e.target).removeClass('selected'); }

		});

		// Close 'open' filter parent
		$('.page-facets__close, .apply-filters').click(function (e) {
			$(e.target).closest('.open').removeClass('open');
		});

		$('.page-facets__clear').click(function () {
			$('.page-facets__filters .page-facets__facet.selected').removeClass('selected');
		});
	}

	this.onFixBodyScrolling = function () {
		$('body').css({
			'position': 'fixed',
			'right': 0,
			'bottom': 0,
			'left': 0,
			'top': 0,
			'overflow-y': 'scroll'
		});
		$('.custom-dropdown-items').css({
			'-webkit-transform': 'translateZ(0)'
		});
	}

	this.onRebindLoadMore = function () {
	  
        $('.showMoreAction').keypress(function (e) {
           
            if (e.key === ' ' || e.key === 'Spacebar' || e.which === 13) {
                // ' ' is standard, 'Spacebar' was used by IE9 and Firefox < 37
                e.preventDefault();
                $(this).click();
            }

        });
    }

    this.onRemoveBodyScrolling = function () {
		$(".custom-dropdown-items").removeAttr("style");
		$("body").removeAttr("style");
	}

	this.onRebindCollapseEvent = function () {
		$('.card__order-history .collapse').on('hidden.bs.collapse', function () {
			$(this).siblings('.card-header').addClass('collapsed');
		});
		$('.card__wishlist .collapse, .collapse').on('shown.bs.collapse', function () {
			$(this).siblings('.card-header').removeClass('collapsed');
		});

	}

    this.onReBindFinishes = function(focus) {
        $('.custom-listbox.finishes [role="listbox"]').each(function () {
			var button = $(this).parent().find('button')[0];
			var exListbox = new aria.Listbox($(this)[0]);
			var listboxButton = new aria.ListboxButton(button, exListbox);
            if (focus && focus === true) $(button).focus();
        });
    }
}]);;
app.directive("floatingNumberOnly", function () {
    return {
        require: 'ngModel',
        link: function (scope, ele, attr, ctrl) {

            ctrl.$parsers.push(function (inputValue) {
                var pattern = new RegExp("(^[0-9]{1,9})+(\.[0-9]{1,4})?$", "g");
                if (inputValue == '')
                    return '';
                var dotPattern = /^[.]*$/;

                if (dotPattern.test(inputValue)) {
                    ctrl.$setViewValue('');
                    ctrl.$render();
                    return '';
                }

                var newInput = inputValue.replace(/[^0-9.]/g, '');
                // newInput=inputValue.replace(/.+/g,'.');

                if (newInput != inputValue) {
                    ctrl.$setViewValue(newInput);
                    ctrl.$render();
                }
                //******************************************
                //***************Note***********************
                /*** If a same function call made twice,****
                 *** erroneous result is to be expected ****/
                //******************************************
                //******************************************

                var result;
                var dotCount;
                var newInputLength = newInput.length;
                if (result = (pattern.test(newInput))) {
                    console.log("pattern " + result);
                    dotCount = newInput.split(".").length - 1; // count of dots present
                    if (dotCount == 0 && newInputLength > 9) { //condition to restrict "integer part" to 9 digit count
                        newInput = newInput.slice(0, newInputLength - 1);
                        ctrl.$setViewValue(newInput);
                        ctrl.$render();
                    }
                } else { //pattern failed
                    dotCount = newInput.split(".").length - 1; // count of dots present
                    if (newInputLength > 0 && dotCount > 1) { //condition to accept min of 1 dot
                        newInput = newInput.slice(0, newInputLength - 1);
                    }
                    if ((newInput.slice(newInput.indexOf(".") + 1).length) > 4) { //condition to restrict "fraction part" to 4 digit count only.
                        newInput = newInput.slice(0, newInputLength - 1);
                    }
                    ctrl.$setViewValue(newInput);
                    ctrl.$render();
                }
                return newInput;
            });
        }
    };
});;
app.service('GoogleService', [function () {

    this.gtmIsActive = function () {
        
            return typeof window.dataLayer !== 'undefined';
        };

        this.brandForGtm = function () {
            return 'Farrow and Ball';
        };


        this.setAddToCartTracking = function (data, add) {

            if (this.gtmIsActive()) {
                
                
                var gtmData = JSON.parse(JSON.stringify(data));
                gtmData[0].quantity = 1;

                window.dataLayer.push({
                    'event': 'addToCart',
                    'ecommerce': {
                        'add': {
                            'products': gtmData
                        }
                    }
                });

                var d = this.getBrontoCart();
                if (d === window.undefined) return;

                this.addToBrontoCart(data, d, add);

                window.dataLayer.push({
                    'event': 'brontoShopping',
                    'brontoCart': {
                        'cartUrl': window.location.origin + window.basketPageUrl,
                        'products': d.products

                    }
                });
            }
        };

        this.setRemoveFromCartTracking = function (data, remove) {
            
            if (this.gtmIsActive()) {

                var gtmData = JSON.parse(JSON.stringify(data));
                gtmData[0].quantity = 1;
                window.dataLayer.push({
                    'event': 'removeFromCart',
                    'ecommerce': {
                        'remove': {
                            'products': gtmData
                        }
                    }
                });

                var d = this.getBrontoCart();
                if (d === window.undefined) return;
                this.removeFromBrontoCart(data, d,remove);

                window.dataLayer.push({
                    'event': 'brontoShopping',
                    'brontoCart': {
                        'cartUrl': window.location.origin + window.basketPageUrl,
                        'products': d.products
                    }
                });
            }
        };
       
        this.deleteItemFromCart = function (item)
        {
            this.setRemoveFromCartTracking([this.ExtractGoogleObjectFromBasket(item, item.Qty)], true);
        };

        this.changeCartQuantity = function(item, quantityIncreased)
        {
            if (this.gtmIsActive()) {
                if (quantityIncreased) {
                    this.setAddToCartTracking([this.ExtractGoogleObjectFromBasket(item, item.Qty)], false);
                } else {
                    this.setRemoveFromCartTracking([this.ExtractGoogleObjectFromBasket(item, item.Qty)], false);
                }
            }
        };

        this.SetAddToBasketTrackingFromProductInfo = function(productInfo) {
            if (this.gtmIsActive()) {
                
                var priceValue = typeof productInfo.Price === "undefined" ? 0 : productInfo.Price;
                var productName = typeof productInfo.ProductName === "undefined" ? productInfo.DisplayName : productInfo.ProductName;
                var variantName = typeof productInfo.ProductName === "undefined" ? "Sample" : productInfo.DisplayName;
                var dimension3 = typeof productInfo.Finish === "undefined" ? '' : productInfo.Finish;
                var sample = typeof productInfo.Sample === "undefined" ? '' : productInfo.Sample;
                this.setAddToCartTracking([{
                    name: productName,
                    id: productInfo.EntryCode,
                    price: parseFloat(priceValue),
                    brand: this.brandForGtm(),
                    category: productInfo.ContentType.replace('Variant', '') + sample,
                    variant: variantName,
                    dimension2: productInfo.Amount,
                    dimension3: dimension3,
                    quantity: 1,
                    imageUrl: productInfo.ImageUrl,
                    productUrl: productInfo.ProductUrl,
                    parentId: productInfo.ParentId,
                    metric1: productInfo.Size
                }], true);
            }
        };

        this.setProductImpressionTracking = function() {

        };

        this.ExtractGoogleObjectFromBasket = function(item, quantity) {
            if (item.VariantViewModel.ContentType === 'WallpaperVariant') {
                return {
                    name: item.VariantViewModel.Product.DisplayName,
                    id: item.Code,
                    price: item.PlacedPrice.Amount,
                    brand: this.brandForGtm(),
                    category: 'Wallpaper',
                    variant: item.VariantViewModel.Colour,
                    quantity: quantity
                };
            }
            if (item.VariantViewModel.ContentType === 'PaintVariant') {
                return {
                    name: item.VariantViewModel.Product.DisplayName,
                    id: item.Code,
                    price: item.PlacedPrice.Amount,
                    brand: this.brandForGtm(),
                    category: 'Paint',
                    dimension2: item.Name,
                    metric1: item.VariantViewModel.Size,
                    quantity: quantity
                };
            }
            if (item.VariantViewModel.ContentType === 'AccessoryVariant') {
                return {
                    name: item.Name,
                    id: item.Code,
                    price: item.PlacedPrice.Amount,
                    brand: this.brandForGtm(),
                    category: 'Accessory',
                    dimension2: item.Name,
                    metric1: item.Size,
                    quantity: quantity
                };
            }

            return {};
        };

        this.getBrontoCart = function() {
            var i;
            var d = 0;
            for (i = window.dataLayer.length - 1; i >= 0 ; i--) {
                if (window.dataLayer[i].event === "brontoShopping") {
                    d = window.dataLayer[i];
                    break;
                }
            }


            return d.brontoCart;
        }

        this.addToBrontoCart = function (data, cart, add) {
            if (cart === window.undefined) return;
            var a;
            for (a = 0; a < data.length; a++) {
                var i;
                var found = false;
                for (i = 0; i < cart.products.length; i++) {
                    if (cart.products[i].id === data[a].id) {
                        if (add) {
                            cart.products[i].quantity += data[a].quantity;
                        } else {
                            cart.products[i].quantity = data[a].quantity;
                        }
                     
                        found = true;
                        break;
                    }
                }
                if (found === false) {
                    cart.products.push(data[a]);
                }
            }

        }

        this.removeFromBrontoCart = function (data, cart, remove) {
            if (cart === window.undefined) return;
            var i;
            for (i = 0; i < cart.products.length ; i++) {
                if (cart.products[i].id === data[0].id) {
                   
                    if (remove) {
                        cart.products[i].quantity -= data[0].quantity;
                    } else {
                        cart.products[i].quantity = data[0].quantity;
                    }

                    if (cart.products[i].quantity <= 0) {
                        cart.products.splice(i, 1);
                    }

                    continue;
                }
            }
           

        }
    }
]);;
app.controller('InformDialogController', ['$scope', '$uibModalInstance', 'actionName', 'messages', function ($scope, $uibModalInstance, actionName, messages) {

    $scope.actionName = actionName;
    $scope.messages = messages;

    $scope.onClose = function () {
        $uibModalInstance.close();
    };

    $scope.onConfirm = function () {
        $uibModalInstance.close(true);
    };

    $scope.onCancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

}]);;
app.controller('InvoiceAndCreditNoteContainer', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'EventBindingService',
	function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService, EventBindingService) {
		var icn = this;
		icn.pageSize = pageSize;
		icn.currentPageNumber = 1;
		icn.invoiceAndCreditNotePageViewMore = "";
		icn.pagerStatusMessage = "";
		icn.shouldDisplayViewMore = true;
		icn.viewMoreMessage = "";
		icn.keyword = "";
		icn.isloadMore = false;
		icn.loading = false;
        icn.loadingDoc = false;
		icn.isEmptyView = false;
		icn.isSearchingOrFiltering = false;
		icn.filterOptions = filterOptions;
        icn.sortOptions = sortOptions;
		icn.filterBy = icn.filterOptions[0].value;

		icn.sortBy = icn.sortOptions[0].value;

        icn.$onInit = function() {
            $timeout(function() {
                    EventBindingService.onRebindCollapseEvent();
                },
                500);
        };

        icn.onLoadMoreInvoicesOrCreditNotes = function() {
            icn.currentPageNumber += 1;
            icn.onLoadInvoicesOrCreditNotes(icn.currentPageNumber, true);
        };

        icn.onSearchOrFilterInvoicesOrCreditNotes = function() {
            if (icn.currentPageNumber > 1) {
                icn.currentPageNumber = 1;
            }
            icn.isSearchingOrFiltering = true;
            icn.onLoadInvoicesOrCreditNotes(icn.currentPageNumber, false);
        };

		icn.onLoadInvoicesOrCreditNotes = function (currentPageNumber, isloadMore) {
		
			var filterOption = {
				Keyword: icn.keyword,
				OrderByRecent: true,
				FilterBy: icn.filterBy,
                SortBy:icn.sortBy,
				PageSize: icn.pageSize,
				Page: currentPageNumber || icn.currentPageNumber,
			};

			icn.loading = true;
			$http.post(apiUrl.icnFilterInvoiceCreditNote, filterOption).then(function (response) {
                
				if (response && response.data) {
					if (!response.data.InvoiceAndCreditNoteView) {
						icn.isEmptyView = true;
					} else {
						icn.isEmptyView = false;
					}
					icn.invoiceAndCreditNotePageViewMore = isloadMore ? (icn.invoiceAndCreditNotePageViewMore + response.data.InvoiceAndCreditNoteView) : response.data.InvoiceAndCreditNoteView;
					icn.pagerStatusMessage = response.data.PagerStatusMessage;
					icn.shouldDisplayViewMore = response.data.ShouldDisplayViewMore;
					icn.viewMoreMessage = response.data.ViewMoreMessage;
					icn.isloadMore = true;
					icn.loading = false;
                    $timeout(function() {
                            EventBindingService.onRebindCollapseEvent();
                        },
                        500);
                }
			}).catch(function (err) {
				console.log(err);
				icn.loading = false;
			});
		};

		icn.displayDocument = function (documentId) {
			if (icn.loadingDoc === true) {
                return;
            }
            icn.loadingDoc = true;
            var option = {
                documentId: documentId
            };
			$http.post(apiUrl.icnDownloadInvoiceCreditNote, option).then(function(response) {
                if (response && response.data && response.data.Success) {
                    icn.loadingDoc = false;
                    var pdfWindow = window.open("");
                    pdfWindow.document.write("<iframe width='100%' height='100%' src='data:application/pdf;base64, " +
                        encodeURI(response.data.DocumentBytes) +
                        "'></iframe>");
				} else {
                   
                        var modelInstance = $uibModal.open({
                            animation: true,
                            windowClass: 'text-center',
                            templateUrl: 'informdialog.html',
                            controller: 'InformDialogController',
                            resolve: {
                                actionName: function () { return ""; },
                                messages: function () { return [response.data.Message]; },
                            }
                        });
                        modelInstance.result.then(function (isConfirm) {
                           
                        }, function () {
                        });
                    
                }
                icn.loadingDoc = false;
            }).catch(function (err) {
                console.log(err);
                icn.loadingDoc = false;
            });
        };
    }
]);;
app.directive('ngEnter', function () {
    return function (scope, element, attrs) {
        element.bind("keydown keypress", function (event) {
            if (event.which === 13) {
                scope.$apply(function () {
                    scope.$eval(attrs.ngEnter, { $event: event });
                });

                event.preventDefault();
            }
        });
    };
});;
app.directive('miniWishlist', ['$animate', '$compile', '$templateCache', function ($animate, $compile, $templateCache) {
	return {
		restrict: 'E',
		replace: false,
		scope: {
			wrapClass: '='
		},
		bindToController: {
			wrapClass: '='
		},
		controller: ['$scope', '$rootScope', '$attrs', '$element', '$compile', '$http', '$uibModal', '$timeout', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService',
			function ($scope, $rootScope, $attrs, $element, $compile, $http, $uibModal, $timeout, siteConfig, apiUrl, storageKey, StorageService) {
				var mini = this;
				$scope.visible = false;
				$scope.isAuthenticated = false;
				$scope.projects = [];
				$scope.storagedProjects = [];
				$scope.isB2B = siteConfig.isB2B;
				$scope.wishListProjects = wishListProjects;
				$scope.isFirstLoad = true;
			   
				mini.$onInit = function () {
				    if ($scope.isB2B) {
				        $element.remove();
				        return;
				    }
					$scope.onCheckAuthentication();
					if ($scope.isAuthenticated) {
						$scope.onLoadProjects();
					}
				}

				$scope.onCheckAuthentication = function () {
					$scope.isAuthenticated = siteConfig.isAuthenticated && siteConfig.currentUserId !== "undefined";
				}

				$scope.onFetchProjects = function () {
					$http.get(apiUrl.wishListGetAll + '?' + siteConfig.getTimeStamp()).then(function (response) {
						var projectDatas = response.data && response.data.Model && response.data.Model.Projects || $scope.projects;
						$scope.projects = projectDatas;
						if (projectDatas && projectDatas.length > 0) {
							StorageService.onSetToken(storageKey.wishlist + siteConfig.currentUserId, projectDatas);
						}
					}).catch(function (err) {
						console.log(err);
					});
				}

				$scope.onLoadProjects = function () {
					if ($scope.isFirstLoad) {
						var wishListProjects = JSON.parse($scope.wishListProjects);
						if (wishListProjects) {
							$scope.projects = wishListProjects;
							StorageService.onSetToken(storageKey.wishlist + siteConfig.currentUserId, $scope.projects);
							$scope.isFirstLoad = false;
							return;
						}
					}

					var projectsFromToken = StorageService.onGetToken(storageKey.wishlist + siteConfig.currentUserId);

					if (projectsFromToken && !StorageService.isTokenExpired(storageKey.wishlist + siteConfig.currentUserId)) {
						$timeout(function () {
							var jsonData = JSON.parse(projectsFromToken);
							$scope.storagedProjects = JSON.parse(jsonData.value);
							$scope.projects = $scope.storagedProjects;
						}, 0);
					} else {
						$scope.onFetchProjects();
					}
				};


				$scope.onToggleVisible = function () {
				    $('.mini-basket').hide();
				    $scope.visible = !$scope.visible;
				   
				}

				$scope.onClosePopup = function () {
					$scope.visible = false;
				}

				$scope.openCreateProject = function (templateId) {
					$scope.onClosePopup();
					var modelInstance = $uibModal.open({
						animation: true,
						windowClass: 'text-center',
						templateUrl: templateId,
						controller: 'WishListCreateProjectController',
						controllerAs: 'wlc',
						resolve: {
							projectSortOrder: function () { return $scope.projects.length == 0 ? 1 : Math.max.apply(Math, $scope.projects.map(function (project) { return project.SortOrder })) + 1; },
						}
					});

					modelInstance.result.then(function (isSuccess) {
						if (isSuccess) {
							$scope.onFetchProjects();
						}
					}, function () {
					});
				};

				$scope.onFetchParentProject = function (projectId) {
					$timeout(function () {
						$rootScope.$emit("FetchParentProjects", { projectId: projectId });
					}, 20);
				}

				$rootScope.$on("FetchMiniWishlist", function (event, data) {
					$scope.onLoadProjects();
				});

				$scope.onViewProject = function (project) {
					$scope.onClosePopup();
					$scope.onFetchParentProject(project.ID);
					window.location.href = siteConfig.wishlistUrl + '#project-' + project.ID;
					$timeout(function () {
						$rootScope.$emit("FetchParentProduct", { projectId: project.ID });
					}, 50);
				}
			}
		],
		templateUrl: "miniwishlist.html",
		link: {
			post: function (scope, element, attrs) {
				element.on("click", function (event) {
					scope.elementClicked = event.target;
					$(document).on("click", onDocumentClick);
					if (!$(event.target).parents('.mini-basket').length) {
						scope.visible = true;
						$('.mini-wishlist').toggleClass('open', function () { });
					}
				});

				var onDocumentClick = function (event) {
					if (scope.elementClicked === event.target) {
						return;
					}
					scope.$apply(function () {
						scope.onClosePopup();
						scope.visible = false;
						$('.mini-wishlist').removeClass('open');
					});
					$(document).off("click", onDocumentClick);
				};
			}
		}
	};
}]);;
app.directive('numbersOnly', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attr, ngModelCtrl) {
            function fromUser(text) {
                if (text) {
                    var transformedInput = text.replace(/[^0-9]/g, '');

                    if (transformedInput !== text) {
                        ngModelCtrl.$setViewValue(transformedInput);
                        ngModelCtrl.$render();
                    }
                    return transformedInput;
                }
                return undefined;
            }
            ngModelCtrl.$parsers.push(fromUser);
        }
    };
});;
app.controller('OrderHistoryContainer', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'EventBindingService',
	function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService, EventBindingService) {
		var odh = this;
		odh.pageSize = pageSize;
		odh.currentPageNumber = 1;
		odh.orderHistoryPageViewMore = "";
		odh.pagerStatusMessage = "";
		odh.shouldDisplayViewMore = true;
		odh.viewMoreMessage = "";
		odh.keyword = "";
		odh.isloadMore = false;
		odh.loading = false;
		odh.isEmptyView = false;
		odh.isSearchingOrFiltering = false;
		odh.filterOptions = filterOptions;
	    odh.sortOptions = sortOptions;
	    odh.filterBy = odh.filterOptions[0].value;

	    odh.sortBy = odh.sortOptions[0].value;

		odh.$onInit = function () {
		    $timeout(function() {
		            EventBindingService.onRebindCollapseEvent();
		        },
		        500);
		}

		odh.onLoadMoreOrderHistory = function () {
			odh.currentPageNumber += 1;
			odh.onLoadOrderHistories(odh.currentPageNumber, true);
		}

		odh.onSearchOrFilterOrderHistory = function () {
			if (odh.currentPageNumber > 1) {
				odh.currentPageNumber = 1;
			}
			odh.isSearchingOrFiltering = true;
			odh.onLoadOrderHistories(odh.currentPageNumber, false);
		}

		odh.onLoadOrderHistories = function (currentPageNumber, isloadMore) {
		    
			var filterOption = {
				Keyword: odh.keyword,
				OrderByRecent: true,
				FilterBy: odh.filterBy,
                SortBy:odh.sortBy,
				PageSize: odh.pageSize,
				Page: currentPageNumber || odh.currentPageNumber,
			};

			odh.loading = true;
			$http.post(apiUrl.odhFilterOrder, filterOption).then(function (response) {
				if (response && response.data) {
					if (!response.data.OrderHistoryPageView) {
						odh.isEmptyView = true;
					} else {
						odh.isEmptyView = false;
					}
					odh.orderHistoryPageViewMore = isloadMore ? (odh.orderHistoryPageViewMore + response.data.OrderHistoryPageView) : response.data.OrderHistoryPageView;
					odh.pagerStatusMessage = response.data.PagerStatusMessage;
					odh.shouldDisplayViewMore = response.data.ShouldDisplayViewMore;
					odh.viewMoreMessage = response.data.ViewMoreMessage;
					odh.isloadMore = true;
					odh.loading = false;
					$timeout(function () {
						EventBindingService.onRebindCollapseEvent();
					}, 500)
				}
			}).catch(function (err) {
				console.log(err);
				odh.loading = false;
			});
		};
	}
]);;
 app.controller('PaintQuickViewController', ['$http', '$scope', '$rootScope', '$uibModalInstance', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'EventBindingService', 'productInfo', 'finishFacet',
	function ($http, $scope, $rootScope, $uibModalInstance, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService, EventBindingService, productInfo, finishFacet) {
		var pqv = this;
		$scope.loading = false;
		$scope.productInfo = productInfo;
		$scope.finishFacetSelected = finishFacet;
		$scope.finishes = [];
		$scope.isToggleDropdown = false;
		$scope.finishSelected = null;
		$scope.sample = null;
		$scope.variants = [];
		$scope.totalPrice = 0;
		$scope.totalPriceFormat = "";
		$scope.currencySymbol = "";

		pqv.$onInit = function () {
           
			$scope.onLoadDatas();
		};

		$scope.onLoadDatas = function () {
			if (!$scope.productInfo) {
				return;
			}

			if ($scope.finishFacetSelected) {
				$scope.finishSelected = $scope.finishFacetSelected;
			}

			$scope.loading = true;
			$http.get(apiUrl.pdpGetPaintQuickView + '?productCode=' + $scope.productInfo.ProductCode + '&finish=' + $scope.finishFacetSelected + '&' + siteConfig.getTimeStamp()).then(function (response) {
				$scope.finishes = response && response.data && response.data.FinishDtos || [];
				$scope.sample = response && response.data && response.data.Sample || null;
				$scope.variants = response && response.data && response.data.Variants || [];
				$scope.currencySymbol = response && response.data && response.data.CurrencySymbol;
				$scope.onCalculateTotalPrice();
                $scope.loading = false;

                $timeout(function () {
                    $('.modal-dialog  [role="listbox"]').each(function () {
                        var button = $(this).parent().find('button')[0];
                        var exListbox = new aria.Listbox($(this)[0]);
                        var listboxButton = new aria.ListboxButton(button, exListbox);
                        if ($scope.finishSelected && $('span:contains(' + $scope.finishSelected + ')', exListbox.listboxNode.children).length) {
                            $('span', button).text($scope.finishSelected);
                        }
                    });
                }, 0);

				}).catch(function (err) {
				console.log(err);
                    $scope.loading = false;


			});
		};

		$scope.onLoadVariantByFinish = function (finish) {
			if (!finish) { return; }

			$scope.finishSelected = finish;
			
		};

        $scope.onChangeItemQuantity = function(item, isSample) {
            item.TotalPrice = isSample
                ? item.Price * parseInt(item.Quantity)
                : item.PriceDto.Amount * parseInt(item.Quantity);
            $scope.onCalculateTotalPrice();
        };

        $scope.onCalculateTotalPrice = function() {
            $scope.totalPrice = ($scope.variants &&
                    $scope.variants.length > 0 &&
                    $scope.variants.reduce(function(prev, next) { return prev + (next.TotalPrice || 0) }, 0) ||
                    0) +
                ($scope.sample && $scope.sample.TotalPrice || 0);
            $scope.totalPriceFormat = $scope.currencySymbol + $scope.totalPrice.toFixed(2);
        };

        $scope.addToBasket = function () {

           
            var itemToBasket = [];

            if ($scope.sample && $scope.sample.Quantity > 0) {
                itemToBasket.push({
                    Code: $scope.sample.Code,
                    Quantity: $scope.sample.Quantity,
                    IsUpdateOrAdd: false,
                    Name: $scope.sample.DisplayName
                });
            }

            $scope.variants.map(function(item) {
                if (item.Quantity && item.Quantity > 0) {
                    itemToBasket.push({
                        Code: item.EntryCode,
                        Quantity: item.Quantity,
                        IsUpdateOrAdd: false,
                        Name: item.DisplayName
                    });
                }
            });

            if (!Array.isArray(itemToBasket) || !itemToBasket.length) {
                return;
            }
            $scope.loading = true;
            $http.post(apiUrl.bspAddItemToBasket, itemToBasket).then(function(res) {

                if (res.data && res.data.Success) {
                    $scope.onCloseModal();
                    $rootScope.$emit("ShowAddToBasketInform", { productInfo: $scope.productInfo });
                    $rootScope.$emit("FetchCartsOnHearder", {});
                } else {
                    var messages = [];

                    itemToBasket.map(function(item) {
                        if (res.data.Model[item.Code]) {
                            messages.push(item.Name +
                                ' ' +
                                (res.data.Model[item.Code] && res.data.Model[item.Code].toString()));
                        }
                    });

                    if (messages && messages.length > 0) {
                        $scope.onOpenMessageDialog('', messages);
                    }
                }

                $scope.loading = false;

            }).catch(function(err) {
                $scope.loading = false;
            });
        };

        $scope.onOpenMessageDialog = function(actionName, messages) {
            $scope.onCloseModal();

            var modelInstance = $uibModal.open({
                animation: true,
                windowClass: 'text-center',
                templateUrl: 'informdialog.html',
                controller: 'InformDialogController',
                resolve: {
                    actionName: function() { return actionName; },
                    messages: function() { return messages; },
                }
            });
           
            modelInstance.result.then(function(isConfirm) {
                    if (isConfirm) {
                        return;
                    }
                },
                function() {
                });
        };

		$scope.onCloseModal = function () {
			$uibModalInstance.close();
		};
	}
]);;
app.controller('PDPPaintCalculatorController', ['$scope', '$rootScope', '$timeout', '$http', '$uibModalInstance',
	'apiUrl', 'siteConfig', 'storageKey', 'StorageService', 'EventBindingService', 'productType', 'finish', 'finishCoverage', 'variants', 'wallpayperHeight', 'wallpayperWidth', 'pattRepeat', 'isAdjustRepeat',
	function ($scope, $rootScope, $timeout, $http, $uibModalInstance, apiUrl, siteConfig, storageKey, StorageService, EventBindingService, productType, finish, finishCoverage, variants, wallpayperHeight, wallpayperWidth, pattRepeat, isAdjustRepeat) {
	    var pc = this;
	    pc.finishCoverage = finishCoverage;
	    pc.finish = finish;
	    pc.productType = productType;
	    pc.variants = variants;
	    pc.variantsCalculated = [];
	    pc.isToggleDropdown = false;
	    pc.surfaceSelected = "";
	    pc.finishesList = null;
	    pc.wallpayperHeight = wallpayperHeight;
	    pc.wallpayperWidth = wallpayperWidth;
	    pc.pattRepeat = pattRepeat;
	    pc.isAdjustRepeat = isAdjustRepeat;
	    pc.loading = false;
	    pc.calculated = false;
	    pc.calculator = {};
	    pc.UnitType = {
	        Metric: 1,
	        Imperial: 2
	    }
	    pc.oneFootInMetre = 0.3048;
	    pc.sizeModel = {
	        unit: pc.UnitType.Metric,
	        length: null,
	        width: null,
	        height: null
	    }
	    pc.size = null;

	    pc.sizeInMetreModel = {
	        length: null,
	        width: null,
	        height: null
	    }

	    pc.amount = 0;

	    // Roome dimension definition
	    pc.$onInit = function () {
	        if (pc.productType == "PaintProduct") {
	            pc.onLoadPaintCalculator();
	        } else if (pc.productType == "WallpayperProduct") {
	            pc.onLoadWallpayperCalculator();
	        }
	    }

	    pc.getValueOnBaseUnit = function (value) {
	        if (pc.sizeModel.unit == pc.UnitType.Imperial) {
	            return (value / pc.oneFootInMetre).toFixed(5);
	        }
	        return value;
	    }

	    pc.getFtToMeters = function (value) {
	        if (pc.sizeModel.unit == pc.UnitType.Imperial) {
	            return (value / 3.281).toFixed(5);
	        }
	        return value;
	    }

	    pc.onParseValueToUnit = function (value) {
	        if (pc.sizeModel.unit == 2) {
	            return value * pc.oneFootInMetre;
	        }
	        return value;
	    }

	    pc.parseFloatValue = function (value) {
	        return parseFloat(value);
	    }

	    pc.getArea = function (length, width, height) {
	        var s = (pc.parseFloatValue(length) + pc.parseFloatValue(width)) * pc.parseFloatValue(height) * 2;
	        if (pc.sizeModel.unit == 2) {
	            s = s * pc.oneFootInMetre * pc.oneFootInMetre;
	        }
	        return s;
	    }

	    pc.getFloorAreaOnUnit = function (length, width, height) {
	        var s = pc.parseFloatValue(length) * pc.parseFloatValue(width);
	        return s;
	    }

	    pc.onCalculatePaint = function ($form) {
	        if ($form && $form.$invalid) { return; }

	        pc.onCalculateSize(pc.sizeModel.length, pc.sizeModel.width, pc.sizeModel.height)
	        $form.$setUntouched();
	    }

	    pc.onFormatDescription = function (size) {
	        if (!size) { return; }

	        var area = pc.getFloorAreaOnUnit(pc.getValueOnBaseUnit(size.Length), pc.getValueOnBaseUnit(size.Width), pc.getValueOnBaseUnit(size.Height)).toFixed(2);

	        return size.ShortDescription && size.ShortDescription.replace("{0}", area + (pc.sizeModel.unit == 1 ? "m" : "ft"));
	    }

	    pc.onCalculateSize = function (length, width, height) {
	        //var lengthInMetre = pc.onParseValueToUnit(pc.getValueOnBaseUnit(length));
	        //var widthtInMetre = pc.onParseValueToUnit(pc.getValueOnBaseUnit(width));
	        //var heightInMetre = pc.onParseValueToUnit(pc.getValueOnBaseUnit(height));

	        //pc.sizeInMetreModel = {
	        //    unit: pc.sizeModel.unit,
	        //    length: lengthInMetre,
	        //    width: widthtInMetre,
	        //    height: heightInMetre
	        //}
	        if (pc.productType == "PaintProduct") {
	            pc.size = pc.calculatePaintLitres(length, width, height);
	        } else if (pc.productType == "WallpayperProduct") {
	           
	            pc.size = pc.calculateWallpaperNew(pc.getFtToMeters(length), pc.getFtToMeters(width), pc.getFtToMeters(height));
	            
	        }
	        pc.calculated = true;
	    }

	    pc.calculatePaintLitres = function (length, width, height) {
	        var coverage = 0;
			if (pc.finishCoverage != undefined) {
                var finishCoverage = pc.parseFloatValue(pc.finishCoverage);
	            var s = pc.getArea(length, width, height);
	            if (finishCoverage > 0) {
	                coverage = 2 * (1.1) * s / finishCoverage;
	            }
	        }
	        return Math.ceil(coverage);
	    }

	    pc.calculateWallpaper = function (length, width, height) {
	        var rolls = 0;
	        if (pc.wallpayperHeight != undefined &&
				pc.wallpayperWidth != undefined &&
				pc.pattRepeat != undefined) {
	            var N = ((pc.wallpayperHeight / pc.pattRepeat) - 1);
	            var O = (pc.onParseValueToUnit(pc.parseFloatValue(height)) / pc.pattRepeat);
	            var P = ((pc.onParseValueToUnit(pc.parseFloatValue(width)) + pc.onParseValueToUnit(pc.parseFloatValue(length))) / pc.wallpayperWidth);
	            rolls = 2 * (P * O / N);

	        }
	        return rolls.toFixed(2);
	    }

	    pc.calculateWallpaperNew = function (length, width, height) {
	        var rolls = 0;

	        var prPerDr = 0;
	        var drPerRl = 0;
	        var drInRm = 0;

	        if (pc.pattRepeat > 0) {
	            prPerDr = Math.ceil(height / pc.pattRepeat);
	            drPerRl = Math.floor((pc.wallpayperHeight - pc.pattRepeat) / (pc.pattRepeat * prPerDr));
	        } else {
	            drPerRl = Math.floor(pc.wallpayperHeight / height);
	        }

	        var totalWidth = length * 2 + width * 2;

	        drInRm = Math.ceil(totalWidth / pc.wallpayperWidth);

	        rolls = Math.ceil(drInRm / drPerRl);

	        return rolls;
	    }

	    pc.calculateWallpaperForHelleborus = function (length, width, height) {
	        var rolls = 0;
	        if (pc.wallpayperHeight != undefined &&
				pc.wallpayperWidth != undefined &&
				pc.pattRepeat != undefined) {
	            var N = ((pc.wallpayperHeight / pc.pattRepeat));
	            var O = (pc.onParseValueToUnit(pc.parseFloatValue(height)) / pc.pattRepeat);
	            var P = ((pc.onParseValueToUnit(pc.parseFloatValue(width)) + pc.onParseValueToUnit(pc.parseFloatValue(length))) / pc.wallpayperWidth);

	            rolls = 2 * (P * O / N);

	        }
	        return rolls.toFixed(2);
	    }

	    pc.onClose = function () {
	        $uibModalInstance.close();
	    }

	    pc.onLoadPaintCalculator = function () {
	        pc.loading = true;
	        $http.get(apiUrl.pdpGetPaintCalculator + '?' + siteConfig.getTimeStamp()).then(function (response) {
	            pc.calculator = response && response.data;
	            pc.loading = false;
	            $timeout(function () {
	                pc.reBindCarousel();
	            }, 0)
	        }).catch(function (err) {
	            console.log(err);
	            pc.loading = false;
	        });
	    }

	    pc.onLoadWallpayperCalculator = function () {
	        pc.loading = true;
	        $http.get(apiUrl.pdpGetWallpayperCalculator + '?' + siteConfig.getTimeStamp()).then(function (response) {
	            pc.calculator = response && response.data;
	            console.log(pc.calculator)
	            pc.loading = false;
	            $timeout(function () {
	                pc.reBindCarousel();
	            }, 0)
	        }).catch(function (err) {
	            console.log(err);
	            pc.loading = false;
	        });
	    }

	    pc.reBindCarousel = function () {
	        EventBindingService.onRebindCarousel($('#room-popup'));
	    }

	    pc.onChooseProductSize = function (size) {
	        pc.onCalculateSize(pc.getValueOnBaseUnit(size.Length), pc.getValueOnBaseUnit(size.Width), pc.getValueOnBaseUnit(size.Height));
	    }

	    pc.onResetCalculator = function () {
	        pc.calculated = false;
	        pc.sizeModel = {
	            unit: pc.UnitType.Metric,
	            length: null,
	            width: null,
	            height: null
	        };
	        pc.reBindCarousel();
	    }

	    pc.coverageComparerVariants = function (a, b) {
	        return a.Coverage - b.Coverage;
	    }

	    pc.sizeComparerVariants = function (a, b) {
	        return a.Size - b.Size;
	    }

	    pc.onSelectAmount = function () {
	        var variantItems = pc.variants && pc.variants.slice();

	        if (pc.productType == "PaintProduct") {
	            pc.choosePaintAmount(variantItems, pc.size);
	            $rootScope.$emit("CalculateParentVariants", { variantsCalculated: pc.variantsCalculated });
	        } else if (pc.productType == "WallpayperProduct") {
	            pc.chooseAmount(variantItems, pc.size);
	            $rootScope.$emit("CalculateWallpayperVariantQuantity", { quantity: pc.variantsCalculated[0] && pc.variantsCalculated[0].Quantity });
	        }
	        $uibModalInstance.close(true);
	    }

	    pc.choosePaintAmount = function (items, amount, sorted) {
	        var nextElement = pc.getClosestBiggerThanItem(items, amount);

	        if (pc.isCloestElement(items, nextElement, amount)) {
	            nextElement.Quantity = 1;
	            pc.variantsCalculated.push(nextElement);
	            if (items && items.length > 0) {
	                var otherItems = items.filter(function (i) { return i.EntryCode != nextElement.EntryCode; })
	                otherItems.map(function (i) {
	                    i.Quantity = 0;
	                    pc.variantsCalculated.push(i);
	                });
	            }
	            return;
	        }

	        if (sorted === undefined || sorted === false) {
	            items.sort(pc.sizeComparerVariants);
	            sorted = true;
	        }
	        var item = items.pop();
	        var itemAmount = item.Size;
	        var no = amount / itemAmount;

	        if (items.length === 0) {
	            amount = 0;
	            no = Math.ceil(no);
	        } else {
	            no = Math.floor(no);
	            amount = amount - (no * itemAmount);
	        }

	        item.Quantity = no;
	        pc.variantsCalculated.push(item);
	        if (amount <= 0) {
	            if (items && items.length > 0) {
	                items.map(function (i) {
	                    i.Quantity = 0;
	                    pc.variantsCalculated.push(i);
	                });
	            }
	            return;
	        };

	        //continue choose Amount
	        pc.choosePaintAmount(items, amount, sorted);
	    }

	    pc.chooseAmount = function (items, amount, sorted) {
	        if (sorted === undefined || sorted === false) {
	            items.sort(pc.coverageComparerVariants);
	            sorted = true;
	        }
	        var item = items.pop();
	        var itemAmount = item.Coverage;
	        var no = amount / itemAmount;

	        if (items.length === 0) {
	            amount = 0;
	            no = Math.ceil(no);
	        } else {
	            no = Math.floor(no);
	            amount = amount - (no * itemAmount);
	        }

	        item.Quantity = no;
	        pc.variantsCalculated.push(item);
	        if (amount <= 0) {
	            return;
	        };

	        //continue choose Amount
	        pc.chooseAmount(items, amount, sorted);
	    }

	    pc.getClosestBiggerThanItem = function (arr, amount) {
	        var arrBiggerElements = arr.filter(function (item) { return item.Size >= amount; });
	        var arrSizes = arrBiggerElements.map(function (item) { return item.Size; })
	        var minSize = Math.min.apply(null, arrSizes);

	        var nextElement = arr.filter(function (item) { return item.Size == minSize })[0];
	        return nextElement;
	    }

	    pc.isCloestElement = function (arr, nextElement, amount) {
	        var indexOfElement = -1;
	        arr.some(function (item, i) {
	            if (item == nextElement) {
	                indexOfElement = i;
	                return true;
	            }
	        });

	        if (indexOfElement == 0) {
	            return true;
	        }

	        var beforeElement = arr[indexOfElement - 1];
	        if (beforeElement && (beforeElement.Size * 2) > amount) {
	            return true;
	        }

	        return false;
	    }
	}]);;
app.controller('PDPFinishGuideController', ['$scope', '$rootScope', '$timeout', '$http', '$uibModalInstance', 'apiUrl', 'siteConfig', 'storageKey', 'StorageService', 'CoreService', 'EventBindingService',
	function ($scope, $rootScope, $timeout, $http, $uibModalInstance, apiUrl, siteConfig, storageKey, StorageService, CoreService, EventBindingService) {
		var fl = this;
		fl.isToggleDropdown = false;
		fl.surfaceSelected = "";
		fl.finishesList = null;
		fl.loading = false;
		var isIOSDevice = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;

		// add style fix scroll popup for IOS device
		if (CoreService.isIOSDevice) {
			EventBindingService.onFixBodyScrolling();
		}

		fl.onClose = function () {
			fl.isPopUpOpen = false;
			EventBindingService.onRemoveBodyScrolling();
			$uibModalInstance.close();
		};

		//check event click outside popup
		$(document).mouseup(function (e) {
			var container = $(".modal-dialog");
			// if the target of the click isn't the container nor a descendant of the container
			if (!container.is(e.target) && container.has(e.target).length === 0) {
				EventBindingService.onRemoveBodyScrolling();
			}
		});

		fl.onSurfaceChanged = function () {
			fl.onLoadFinishesListBySurface(fl.surfaceSelected);
		};

		fl.onLoadFinishesListBySurface = function (surface) {
			if (!surface) { return; }
			fl.surfaceSelected = surface;
			
			fl.loading = true;
			$http.get(apiUrl.pdpGetFinishesListBySurface + '?surface=' + surface + '&' + siteConfig.getTimeStamp()).then(function (response) {
				fl.finishesList = response && response.data;
				fl.loading = false;

			}).catch(function (err) {
				console.log(err);
				fl.loading = false;
			});
		}

        fl.onSelectFinish = function (finish, finishCoverage) {
            if (!finish || !finishCoverage) { return; }

            $timeout(function () {
                    
				var surfaceId = fl.surfaceSelected.replace(new RegExp(" ", "g"), '-');
				$('#surface-' + surfaceId).click();
                    $timeout(function () {
						var finishId = finish.replace(new RegExp(" ", "g"), '-');
						$('#' + finishId).click();
                            EventBindingService.onRemoveBodyScrolling();
                            fl.onClose();
                        },
                        500);
                },
                0);


        }
    }]);;
app.controller('PDPSurfaceController', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', '$compile', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'GoogleService','EventBindingService',
    function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, $compile, siteConfig, apiUrl, storageKey, StorageService, GoogleService, EventBindingService) {
        var pdp = this;
        pdp.productCode = productCode;
        pdp.finishDropdown = null;
        pdp.finishList = null;
        pdp.variants = null;
        pdp.isToggleDropdown = false;
        pdp.finishSelected = "";
        pdp.surfaceSelected = "";
        pdp.finishCoverageSelected = null;
        pdp.currencySymbol = "";
        pdp.totalItemsPrice = 0;
        $scope.initVariants = [];
        pdp.loading = false;
        pdp.isNoFinish = false;
        pdp.validCart = false;

        pdp.init = function (sku, surface, finish) {
            if (sku && surface && finish) {
                pdp.surfaceSelected = surface;
                pdp.finishSelected = finish;
                if (pdp.surfaceSelected) {
                    $http.get(apiUrl.pdpGetFinishWithVariantsDropdownBySurface + '?productCode=' + pdp.productCode + '&surface=' + pdp.surfaceSelected + '&' + siteConfig.getTimeStamp()).then(function (response) {
                        pdp.finishDropdown = response && response.data;
                        pdp.surfaceSelected = $('li#surface-' + surface.replace(/ /g, '-') + ' span').text() || surface;
                        $timeout(function () {
                                EventBindingService.onReBindFinishes();
                            },
                            50);

                    }).catch(function (err) {
                        console.log(err);
                    });
                }
                if (pdp.finishSelected) {
                    $http.get(apiUrl.pdpGetVariantForFinish + '?productCode=' + pdp.productCode + '&finish=' + escape(pdp.finishSelected) + '&' + siteConfig.getTimeStamp()).then(function (response) {
                        if (response && !response.data) {
                            pdp.isNoFinish = true;
                        }
                        pdp.variants = response && response.data;
                        $scope.initVariants = pdp.variants && pdp.variants.slice();
                        pdp.currencySymbol = pdp.variants && pdp.variants.length > 0 && pdp.variants[0].PriceDto && pdp.variants[0].PriceDto.CurrencySymbol;

                        if (sku && (pdp.variants !== null && pdp.variants.length > 0)) {
                            for (let i = 0; i < pdp.variants.length; i++) {
                                if (pdp.variants[i].EntryCode === sku) {
                                    pdp.increaseItem(pdp.variants[i]);
                                    break;
                                }
                            }
                        }
                    }).catch(function (err) {
                        console.log(err);
                    });
                }
            }
        };

        pdp.onLoadFinishDropdownBySurface = function (surface) {
            
            if (!pdp.productCode || !surface || pdp.surfaceSelected == surface) {
                return;
            }
            pdp.totalItemsPrice = 0;
            pdp.surfaceSelected = surface;
            pdp.finishSelected = "";
            pdp.variants = [];
            $http.get(apiUrl.pdpGetFinishWithVariantsDropdownBySurface +
                '?productCode=' +
                pdp.productCode +
                '&surface=' +
                surface +
                '&' +
                siteConfig.getTimeStamp()).then(function(response) {
                pdp.finishDropdown = response && response.data;

                $timeout(function() {
                        EventBindingService.onReBindFinishes();
                    },
                    50);

            }).catch(function(err) {
                console.log(err);
            });
        };

        pdp.onGetVariantForFinish = function(finish, finishCoverage) {
            if (!pdp.productCode || !finish || pdp.finishSelected == finish) {
                return;
            }
            pdp.totalItemsPrice = 0;
            pdp.finishSelected = finish;
            pdp.finishCoverageSelected = finishCoverage;
            pdp.isNoFinish = false;

            $http.get(apiUrl.pdpGetVariantForFinish +
                '?productCode=' +
                pdp.productCode +
                '&finish=' +
                escape(finish) +
                '&' +
                siteConfig.getTimeStamp()).then(function(response) {
                if (response && !response.data) {
                    pdp.isNoFinish = true;
                }
                pdp.variants = response && response.data;
                $scope.initVariants = pdp.variants && pdp.variants.slice();
                pdp.currencySymbol =
                    pdp.variants &&
                    pdp.variants.length > 0 &&
                    pdp.variants[0].PriceDto &&
                    pdp.variants[0].PriceDto.CurrencySymbol;

            }).catch(function(err) {
                console.log(err);
            });
        };

        pdp.increaseItem = function(variant) {
            variant.Quantity = variant.Quantity || 0;
            variant.Quantity += 1;
            variant.TotalPrice = variant.PriceDto.Amount * variant.Quantity;
            pdp.onCalculateTotalPrice();
        };

        pdp.decreaseItem = function(variant) {
            variant.Quantity = variant.Quantity || 0;
            if (variant.Quantity == 0) {
                return;
            }
            variant.Quantity -= 1;
            variant.TotalPrice = variant.PriceDto.Amount * variant.Quantity;
            pdp.onCalculateTotalPrice();
        };

        pdp.updateVariantQuantity = function (variant) {
            variant.Quantity = variant.Quantity || 0;
            if (variant.Quantity > 0) {
                variant.TotalPrice = variant.PriceDto.Amount * variant.Quantity;
                pdp.onCalculateTotalPrice();
            }
        };

        pdp.onAddPaintToBasket = function() {
            var itemToBasket = [];
            var gtmItemsToBasket = [];

            pdp.variants.map(function(item) {
                if (item.Quantity && item.Quantity > 0) {
                    itemToBasket.push({
                        Code: item.EntryCode,
                        Quantity: item.Quantity,
                        IsUpdateOrAdd: false,
                        Name: item.DisplayName
                    });

                    if (GoogleService.gtmIsActive()) {
                        gtmItemsToBasket.push({
                            id: item.EntryCode,
                            quantity: item.Quantity,
                            brand: GoogleService.brandForGtm(),
                            category: 'Paint',
                            name: item.Product.DisplayName,
                            price: item.PriceDto.Amount,
                            dimension2: item.Size + item.SizeUnit,
                            dimension3: item.Finish,
                            metric1: item.Size,
                            imageUrl: item.ImageUrl,
                            productUrl: item.ProductUrl,
                            parentId: item.Product.EntryCode,
                            variant: item.DisplayName
                        });
                    }
                }
            });

            if (!Array.isArray(itemToBasket) || !itemToBasket.length) {
                return;
            }
            pdp.loading = true;
            $http.post(apiUrl.bspAddItemToBasket, itemToBasket).then(function(res) {

                if (res.data && res.data.Success) {
                    var productInfo = {
                        ColourHex: pdp.variants[0].ColourHex,
                        ContentType: pdp.variants[0].ContentType,
                        TagLine: pdp.variants[0].Product.TagLine,
                        EntryCode: pdp.variants[0].Product.EntryCode,
                        DisplayName: pdp.variants[0].Product.DisplayName
                    };

                    $rootScope.$emit("ShowAddToBasketInform", { productInfo: productInfo });
                    $rootScope.$emit("FetchCartsOnHearder", {});

                    GoogleService.setAddToCartTracking(gtmItemsToBasket, true);
                } else {
                    var messages = [];

                    itemToBasket.map(function(item) {
                        if (res.data.Model[item.Code]) {
                            messages.push(item.Name +
                                ' ' +
                                (res.data.Model[item.Code] && res.data.Model[item.Code].toString()));
                        }
                    });

                    if (messages && messages.length > 0) {
                        var modelInstance = $uibModal.open({
                            animation: true,
                            windowClass: 'text-center',
                            templateUrl: 'informdialog.html',
                            controller: 'InformDialogController',
                            resolve: {
                                actionName: function() { return ""; },
                                messages: function() { return messages; },
                            }
                        });
                        modelInstance.result.then(function(isConfirm) {
                                if (isConfirm) {
                                }
                            },
                            function() {
                            });
                    }
                }

                pdp.loading = false;

            }).catch(function(err) {
                pdp.loading = false;
            });

        };

        pdp.onCalculateTotalPrice = function () {
            pdp.totalItemsPrice = pdp.variants &&
                pdp.variants.length > 0 &&
                pdp.variants.reduce(function(prev, next) { return prev + (next.TotalPrice || 0) }, 0) ||
                0;

            var itemsInCart = pdp.variants &&
                pdp.variants.length > 0 &&
                pdp.variants.reduce(function (prev, next) { return prev + (next.Quantity || 0) }, 0) ||
                0;

            pdp.validCart = itemsInCart > 0;
        };

        pdp.onFinishGuide = function(templateId) {
            var modelInstance = $uibModal.open({
                animation: true,
                windowClass: 'finish-guide-modal text-center',
                size: 'xl',
                templateUrl: templateId,
                controller: 'PDPFinishGuideController',
                controllerAs: 'fl',
                resolve: {}
            });

            modelInstance.result.then(function(isConfirm) {
                    if (isConfirm) {

                    }
                },
                function() {});
        };

        $rootScope.$on("SelectParentFinish", function (event, data) {
            
            pdp.onGetVariantForFinish(data.finish, data.finishCoverage);
        });

        $rootScope.$on("CalculateParentVariants", function (event, data) {

            data.variantsCalculated && data.variantsCalculated.map(function (v) {
                var variants = pdp.variants.filter(function (vr) { return vr.EntryCode == v.EntryCode });
                var variant = variants[0];
                if (variant) {
                    variant.Quantity = v.Quantity;
                }
            });

            pdp.variants.map(function (v) {
                if (v.Quantity > 0) {
                    pdp.updateVariantQuantity(v);
                }
            });
        });


        pdp.onOpenPaintCalculator = function(templateId) {
            var modelInstance = $uibModal.open({
                animation: true,
                windowClass: 'calculator-modal prevent-pointer',
                size: 'lg',
                templateUrl: templateId,
                controller: 'PDPPaintCalculatorController',
                controllerAs: 'pc',
                resolve: {
                    productType: function() { return "PaintProduct"; },
                    finish: function() { return pdp.finishSelected; },
                    finishCoverage: function() { return pdp.finishCoverageSelected; },
                    variants: function() { return $scope.initVariants; },
                    wallpayperHeight: function() { return null; },
                    wallpayperWidth: function() { return null; },
                    pattRepeat: function() { return null; },
                    isAdjustRepeat: function() { return null; },
                }
            });
            $timeout(function() {
                    $('.calculator-modal').removeClass('prevent-pointer');
                },
                500);
            modelInstance.result.then(function(isConfirm) {
                    if (isConfirm) {
                    }
                },
                function() {});
        };
        pdp.loadAllFinishes = function () {
          
            pdp.totalItemsPrice = 0;
            pdp.surfaceSelected = "*";
            pdp.finishSelected = "";
            pdp.variants = [];
            $http.get(apiUrl.pdpGetFinishWithVariantsDropdownBySurface +
                '?productCode=' +
                pdp.productCode +
                '&surface=*' + 
                '&' +
                siteConfig.getTimeStamp()).then(function (response) {
                pdp.finishDropdown = response && response.data;

                $timeout(function () {
                        EventBindingService.onReBindFinishes(true);
                    },
                    50);

            }).catch(function (err) {
                console.log(err);
            });
        };

        pdp.loadSingleVariant = function(variant) {
            pdp.surfaceSelected = "*";
            pdp.finishSelected = "*";
            pdp.variants = [];
            variant.Quantity = 1;
            variant.TotalPrice = variant.PriceDto.Amount * variant.Quantity;
            pdp.currencySymbol = variant.PriceDto.CurrencySymbol;

            pdp.variants.push(variant);
            pdp.onCalculateTotalPrice();
  
        };

    }
]);;
app.controller('PDPVariantController', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', '$compile', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'GoogleService',
    function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, $compile, siteConfig, apiUrl, storageKey, StorageService, GoogleService) {
        var pdv = this;
        pdv.loading = false;
        pdv.priceInfo = priceInfo;
        pdv.product = productEntry;


        pdv.increaseItem = function () {
            pdv.priceInfo.Quantity = pdv.priceInfo.Quantity || 1;
            pdv.priceInfo.Quantity += 1;
            pdv.priceInfo.TotalPrice = pdv.priceInfo.Amount * pdv.priceInfo.Quantity;
            pdv.onCalculateTotalPrice();
        }

        pdv.decreaseItem = function () {
            pdv.priceInfo.Quantity = pdv.priceInfo.Quantity || 0;
            if (pdv.priceInfo.Quantity == 0) { return; }
            pdv.priceInfo.Quantity -= 1;
            pdv.priceInfo.TotalPrice = pdv.priceInfo.Amount * pdv.priceInfo.Quantity;
            pdv.onCalculateTotalPrice();
        }

        pdv.updateVariantQuantity = function (variant) {
            variant.Quantity = variant.Quantity || 0;
            if (variant.Quantity > 0) {
                variant.TotalPrice = variant.PriceDto.Amount * variant.Quantity;
                pdv.onCalculateTotalPrice();
            }
        }

        pdv.onAddToBasket = function () {
            var itemToBasket = [];
            var gtmItemsToBasket = [];
            var initialBasketQuantity = itemToBasket.length;

            if (pdv.priceInfo.Quantity && pdv.priceInfo.Quantity > 0) {
                itemToBasket.push({
                    Code: pdv.product.EntryCode,
                    Quantity: pdv.priceInfo.Quantity,
                    IsUpdateOrAdd: false,
                    Name: pdv.product.DisplayName
                });

                if (GoogleService.gtmIsActive()) {
                    gtmItemsToBasket.push({

                        id: pdv.product.EntryCode,
                        quantity: pdv.priceInfo.Quantity,
                        brand: GoogleService.brandForGtm(),
                        category: 'Accessory',
                        name: pdv.product.DisplayName,
                        price: pdv.priceInfo.Amount,
                        dimension2: '',
                        dimension3: '',
                        imageUrl: pdv.product.ImageUrl,
                        productUrl: pdv.product.ProductUrl
                    });
                }
            }
            if (!Array.isArray(itemToBasket) || !itemToBasket.length) { return; }
            pdv.loading = true;
            $http.post(apiUrl.bspAddItemToBasket, itemToBasket).then(function (res) {
                if (res.data && res.data.Success) {
                    var productInfo = {
                        ColourHex: "",
                        ContentType: pdv.product.ContentType,
                        TagLine: pdv.product.TagLine,
                        EntryCode: pdv.product.EntryCode,
                        DisplayName: pdv.product.DisplayName,
                        ImageUrl: pdv.product.ImageUrl,
                    };
                    $rootScope.$emit("ShowAddToBasketInform", { productInfo: productInfo });
                    $rootScope.$emit("FetchCartsOnHearder", {});

                    GoogleService.setAddToCartTracking(gtmItemsToBasket, true);
                } else {
                    var messages = [];

                    itemToBasket.map(function (item) {
                        if (res.data.Model[item.Code]) {
                            messages.push(item.Name + ' ' + (res.data.Model[item.Code] && res.data.Model[item.Code].toString()));
                        }
                    });

                    // covers scenario where an unsuccessful POST call still adds something to the basket
                    if (initialBasketQuantity < itemToBasket.length) {
                        $rootScope.$emit("FetchCartsOnHearder", {});
                        GoogleService.setAddToCartTracking(gtmItemsToBasket, true);
                    }
                    
                    if (messages && messages.length > 0) {
                        var modelInstance = $uibModal.open({
                            animation: true,
                            windowClass: 'text-center',
                            templateUrl: 'informdialog.html',
                            controller: 'InformDialogController',
                            resolve: {
                                actionName: function () { return ""; },
                                messages: function () { return messages; },
                            }
                        });
                        modelInstance.result.then(function (isConfirm) {
                            if (isConfirm) {
                            }
                        }, function () {
                        });
                    }
                }

                pdv.loading = false;
            }).catch(function (err) {
                console.log(err);
                pdv.loading = false;
            });
        }

        pdv.onCalculateTotalPrice = function () {
            pdv.totalItemsPrice = pdv.priceInfos && pdv.priceInfos.length > 0 &&
                pdv.priceInfos.reduce(function (prev, next) { return prev + (next.TotalPrice || 0) }, 0) || 0
        }

        pdv.onCalculateTotalPrice();
    }]);;
app.controller('PDPWallpayperVariantController', ['$scope', '$rootScope', '$uibModal', '$timeout', '$http', '$compile', 'apiUrl', 'siteConfig', 'storageKey', 'GoogleService', 'StorageService', 'EventBindingService', 'CoreService',
    function ($scope, $rootScope, $uibModal, $timeout, $http, $compile, apiUrl, siteConfig, storageKey, GoogleService, StorageService, EventBindingService, CoreService) {
        var wpv = this;
        wpv.loading = false;
        wpv.QuantityPriceView = null;
        wpv.quantityPriceInfo = null;
        wpv.showCal = false;
        wpv.product = productEntry;
        wpv.selectedVariantCode = null;
        wpv.selectedVariantName = null;
        wpv.selectedVariantImageUrl = "";

        wpv.$onInit = function () {
            var activeWallPaperVariant = CoreService.getParameterByName("activeWallPaperVariant");
            var $variantElement;

            if (activeWallPaperVariant) {
                $variantElement = $(".custom-listbox li[data-code='" + activeWallPaperVariant + "']").click();

                $(".custom-listbox button").html($variantElement.html());
                wpv.onChangeColor(activeWallPaperVariant,
                    $variantElement.data('name'),
                    $variantElement.data('imageurl'));
            } else {
                var activeSku = CoreService.getParameterByName("sku");

                if (activeSku) {
                    $variantElement = $(".custom-listbox li[data-code='" + activeSku + "']").click();

                    $(".custom-listbox button").html($variantElement.html());

                    $("#product-wallpayper-image").addClass("d-none");
                    $("#product-image-carousel").addClass("d-none");
                    wpv.onChangeColor(activeSku, $variantElement.data('name'), $variantElement.data('imageurl'));
                }
            }

        }

        wpv.onChangeColor = function (variantCode, variantName, variantImageUrl) {

            if (!variantCode || this.selectedVariantCode == variantCode) { return; }
            wpv.selectedVariantCode = variantCode;
            wpv.selectedVariantName = variantName;
            wpv.selectedVariantImageUrl = variantImageUrl;

            wpv.loading = true;
            $http.get(apiUrl.pdpWallpayperGetViewUpdatedOnColorChanging + '?variantCode=' + variantCode + '&languageCode=' + siteConfig.langCode + '&' + siteConfig.getTimeStamp()).then(function (response) {
                if (!response.data.IsValid) {
                    $("#product-wallpayper-image").removeClass("d-none");
                    $("#product-image-carousel").removeClass("d-none");
                    return;
                }
                wpv.QuantityPriceView = response.data.QuantityPriceView;
                wpv.showCal = response.data.ShowCalculator;
                if (response.data.BannerUrl) {
                    $("#buttonColourSelected").find('img').attr('src', response.data.BannerUrl + '?w=150');

                    $('#buttonColourUnselected').addClass('d-none');
                    $('#buttonColourSelected').removeClass('d-none');
                }

                if (response.data.BannerImageView) {
                    $("#product-wallpayper-image").html(response.data.BannerImageView);
                    if (myLazyLoad != null) myLazyLoad.update();
                    picturefill({
                        reevaluate: true
                    });
                } else {
                    $("#product-wallpayper-image").html("");
                }

                if (response.data.EntryNumber) {
                    $("#product-number").text(response.data.EntryNumber);
                }

                if (response.data.EntryCode && response.data.EntryNumber) {
                    $("#product-manipulate").attr('product-name', response.data.EntryNumber);
                    $("#product-manipulate").attr('product-code', response.data.EntryCode);
                    $rootScope.$emit("UpdateProductInfo", {
                        productCode: response.data.EntryCode,
                        productName: response.data.EntryNumber,
                    });
                }

                if (response.data.ImageCarouselView) {
                    var $prodctImageCarousel = $("#product-image-carousel");
                    $prodctImageCarousel.html(response.data.ImageCarouselView);
                    $timeout(function () {
                        wpv.reBindCarousel($prodctImageCarousel);
                    }, 0);
                }

                var $prodctColorScheme = $("#product-color-scheme");
                if (response.data.ColorSchemesView) {
                    $prodctColorScheme.html(response.data.ColorSchemesView);
                    $timeout(function () {
                        wpv.reBindCarousel($prodctColorScheme);
                    }, 0);
                } else { $prodctColorScheme.empty(); }

                var $prodctBuySample = $("#product-buy-sample");
                if (response.data.BuySampleView) {
                    $prodctBuySample.empty();
                    var eliment = $compile(response.data.BuySampleView)($scope);
                    $timeout(function () { $prodctBuySample.html(eliment) }, 0);
                } else {
                    $timeout(function () { $rootScope.$apply($prodctBuySample.html("")) }, 0);
                }

                var $prodctSampleInfo = $("#product-sample-info");
                if (response.data.BuySampleInfo) {
                    $prodctSampleInfo.html(response.data.BuySampleInfo);
                } else {
                    $prodctSampleInfo.html("");
                }

                var $inspirationContainer = $("#inspiration-container");
                if (response.data.InspirationView) {
                    $inspirationContainer.empty();
                    $inspirationContainer.html((response.data.InspirationView));
                    $timeout(function () {
                        wpv.reBindCarousel($inspirationContainer);
                    }, 0);
                } else { $inspirationContainer.empty(); }

                var $variantDescription = $("#product-variant-description");
                if (response.data.VariantDescription) {
                    $variantDescription.empty();
                    $variantDescription.html(response.data.VariantDescription);
                } else { $variantDescription.empty(); }


                $("#product-wallpayper-image").removeClass("d-none");
                $("#product-image-carousel").removeClass("d-none");
                wpv.loading = false;
                $timeout(function () {
                    wpv.quantityPriceInfo = quantityPriceInfo;
                }, 0);

            }).catch(function (err) {
                console.log(err);
                wpv.loading = false;
            });
        }

        wpv.reBindCarousel = function ($target) {
            EventBindingService.onRebindCarousel($target);
        }

        wpv.increaseItem = function () {
            wpv.quantityPriceInfo.Quantity = wpv.quantityPriceInfo.Quantity || 0;
            wpv.quantityPriceInfo.Quantity += 1;
            if (wpv.quantityPriceInfo.MinQuantity > wpv.quantityPriceInfo.Quantity) {
                wpv.quantityPriceInfo.Quantity = wpv.quantityPriceInfo.MinQuantity;
            }
            if (wpv.quantityPriceInfo.MaxQuantity < wpv.quantityPriceInfo.Quantity) {
                wpv.quantityPriceInfo.Quantity = wpv.quantityPriceInfo.MaxQuantity;
            }
            wpv.quantityPriceInfo.TotalPrice = wpv.quantityPriceInfo.Amount * wpv.quantityPriceInfo.Quantity;
            wpv.onCalculateTotalPrice();
        }

        wpv.decreaseItem = function () {
            wpv.quantityPriceInfo.Quantity = wpv.quantityPriceInfo.Quantity || 0;
            if (wpv.quantityPriceInfo.Quantity == 0) { return; }
            wpv.quantityPriceInfo.Quantity -= 1;
            if (wpv.quantityPriceInfo.Quantity < wpv.quantityPriceInfo.MinQuantity) {
                wpv.quantityPriceInfo.Quantity = 0;
            }
            wpv.quantityPriceInfo.TotalPrice = wpv.quantityPriceInfo.Amount * wpv.quantityPriceInfo.Quantity;
            wpv.onCalculateTotalPrice();
        }

        wpv.onCalculateTotalPrice = function () {
            wpv.totalItemsPrice = wpv.quantityPriceInfos && wpv.quantityPriceInfos.length > 0 &&
                wpv.quantityPriceInfos.reduce(function (prev, next) { return prev + (next.TotalPrice || 0) }, 0) || 0
        }

        wpv.onAddToBasket = function () {
            var itemToBasket = [];
            if (wpv.quantityPriceInfo.Quantity && wpv.quantityPriceInfo.Quantity > 0) {
                itemToBasket.push({
                    Code: wpv.selectedVariantCode,
                    Quantity: wpv.quantityPriceInfo.Quantity,
                    IsUpdateOrAdd: false,
                    Name: wpv.selectedVariantName
                });
            }
            if (!Array.isArray(itemToBasket) || !itemToBasket.length) { return; }
            wpv.loading = true;

            $http.post(apiUrl.bspAddItemToBasket, itemToBasket).then(function (res) {
                if (res.data && res.data.Success) {
                    var productInfo = {
                        ColourHex: "",
                        ContentType: "WallpaperVariant",
                        TagLine: wpv.selectedVariantName,
                        EntryCode: wpv.product.EntryCode,
                        DisplayName: wpv.product.DisplayName,
                        ImageUrl: wpv.selectedVariantImageUrl
                    };
                    $rootScope.$emit("ShowAddToBasketInform", { productInfo: productInfo });
                    $rootScope.$emit("FetchCartsOnHearder", {});

                    if (GoogleService.gtmIsActive()) {
                        GoogleService.setAddToCartTracking([{
                            id: wpv.selectedVariantCode,
                            quantity: wpv.quantityPriceInfo.Quantity,
                            brand: GoogleService.brandForGtm(),
                            category: 'Wallpaper',
                            name: wpv.product.DisplayName,
                            price: wpv.quantityPriceInfo.Amount,
                            dimension2: wpv.product.Size + wpv.product.SizeUnit,
                            dimension3: wpv.selectedVariantName,
                            imageUrl: wpv.selectedVariantImageUrl,
                            productUrl: window.location.href,
                            parentId: wpv.product.ParentId,
                            variant: wpv.selectedVariantName,
                            metric1: wpv.product.Size

                        }], true);
                    }
                } else {
                    var messages = [];

                    itemToBasket.map(function (item) {
                        if (res.data.Model[item.Code]) {
                            messages.push(item.Name + ' ' + (res.data.Model[item.Code] && res.data.Model[item.Code].toString()));
                        }
                    });

                    if (messages && messages.length > 0) {
                        var modelInstance = $uibModal.open({
                            animation: true,
                            windowClass: 'text-center',
                            templateUrl: 'informdialog.html',
                            controller: 'InformDialogController',
                            resolve: {
                                actionName: function () { return ""; },
                                messages: function () { return messages; },
                            }
                        });
                        modelInstance.result.then(function (isConfirm) {
                            if (isConfirm) {
                            }
                        }, function () {
                        });
                    }
                }

                wpv.loading = false;
            }).catch(function (err) {
                console.log(err);
                wpv.loading = false;
            });
        }

        $rootScope.$on("CalculateWallpayperVariantQuantity", function (event, data) {
            wpv.quantityPriceInfo.Quantity = data.quantity || 0;
            wpv.quantityPriceInfo.TotalPrice = wpv.quantityPriceInfo.Amount * wpv.quantityPriceInfo.Quantity;
        });

        wpv.onOpenPaintCalculator = function (templateId) {
            var variants = [];
            wpv.quantityPriceInfo.Quantity = 0;
            wpv.quantityPriceInfo.Coverage = 1;
            variants.push(wpv.quantityPriceInfo);
            var modelInstance = $uibModal.open({
                animation: true,
                windowClass: 'calculator-modal',
                size: 'lg',
                templateUrl: templateId,
                controller: 'PDPPaintCalculatorController',
                controllerAs: 'pc',
                resolve: {
                    productType: function () { return "WallpayperProduct"; },
                    finish: function () { return wpv.product && wpv.product.DisplayName; },
                    finishCoverage: function () { return null; },
                    variants: function () { return variants; },
                    wallpayperHeight: function () { return wallpayperHeight; },
                    wallpayperWidth: function () { return wallpayperWidth; },
                    pattRepeat: function () { return pattRepeat; },
                    isAdjustRepeat: function () { return isAdjustRepeat; },
                }
            });

            modelInstance.result.then(function (isConfirm) {
                if (isConfirm) {
                }
            }, function () {
            });
        }
    }]);;
app.directive('productManipulate', ['$animate', '$compile', '$templateCache', function ($animate, $compile, $templateCache) {
    return {
        restrict: 'AE',
        scope: {
            productCode: '=',
            productName: '=',
        },
        bindToController: {
            productCode: '=',
            productName: '=',
        },
        controller: ['$scope', '$rootScope', '$attrs', '$element', '$compile', '$http', '$uibModal', '$timeout', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'EventBindingService', 'CookieService',
			function ($scope, $rootScope, $attrs, $element, $compile, $http, $uibModal, $timeout, siteConfig, apiUrl, storageKey, StorageService, EventBindingService, CookieService) {
				var prd = this;
				$scope.projects = [];
				$scope.storagedProjects = [];
				$scope.stateTitle = wishListProductManipulateTexts.addTo;;
				$scope.stateAction = false;
				$scope.errorAction = false;
				$scope.stateActionType = "";
				$scope.projectSelected = {};
				$scope.baseUrl = siteConfig.baseUrl;
				$scope.isAuthenticated = false;
				$scope.offsetTopOfElement = 0;
				$scope.isShowPopup = false;
				$scope.isInformState = false;
				$scope.wishListProjects = wishListProjects;
				$scope.isFirstLoad = true;
			    $scope.isB2B = siteConfig.isB2B;

			    prd.$onInit = function () {
			       
			        if ($scope.isB2B) {
			            $element.remove();
			            return;
			        }
					$scope.onCheckAuthentication();
					$scope.onLoadProjects();
					$scope.html = $templateCache.get("productmanipulate.html");
					var $popover = $element.popover({
						html: true,
						trigger: 'manual',
						content: function () { return $compile($scope.html)($scope); },
						placement: 'top',
					});
				    if ($scope.projects.some(function (prj) { return prj.Codes.some(function (c) { return c == $scope.productCode.toString() }) })) {
				        $element.addClass('active');
				    }
					$popover.on("hidden.bs.popover", function (e) {
						e.stopPropagation();
						$scope.onResetPopover();
					});
				};

			    $scope.onCheckAuthentication = function () {
			        $timeout(function () {
			            $scope.isAuthenticated = siteConfig.isAuthenticated && siteConfig.currentUserId != "undefined";
			        }, 0);
			    }

			    $scope.onFetchProjects = function () {
			        $http.get(apiUrl.wishListGetAll + '?' + siteConfig.getTimeStamp()).then(function (response) {
			            var projectDatas = response.data && response.data.Model && response.data.Model.Projects || $scope.projects;
			            $scope.projects = projectDatas;
			            if (projectDatas && projectDatas.length > 0) {
			                StorageService.onSetToken(storageKey.wishlist + siteConfig.currentUserId, projectDatas);
			                $scope.onToggleHeartState();
			            }
			            $rootScope.$emit("FetchMiniWishlist", {});
			        }).catch(function (err) {
			            console.log(err);
			        });
			    }

			    $scope.onToggleHeartState = function () {
			        if ($scope.projects.some(function (prj) { return prj.Codes.some(function (c) { return c == $scope.productCode.toString() }) })) {
			            $element.addClass('active');
			        } else {
			            $element.removeClass('active');
			        }
			    }

			    $rootScope.$on("UpdateProductInfo", function (event, data) {
			        if (data.productCode && data.productName) {
			            $scope.productCode = data.productCode;
			            $scope.productName = data.productName;
			            $scope.onToggleHeartState();
			        }
			    });

			    $scope.onLoadProjects = function () {
			        if ($scope.isFirstLoad) {
			            var wishListProjects = JSON.parse($scope.wishListProjects);
			            if (wishListProjects) {
			                $scope.projects = wishListProjects;
			                StorageService.onSetToken(storageKey.wishlist + siteConfig.currentUserId, $scope.projects);
			                $scope.isFirstLoad = false;
			                return;
			            }
			        }

			        var projectsFromToken = StorageService.onGetToken(storageKey.wishlist + siteConfig.currentUserId);

			        if (projectsFromToken && !StorageService.isTokenExpired(storageKey.wishlist + siteConfig.currentUserId)) {
			            $timeout(function () {
			                var jsonData = JSON.parse(projectsFromToken);
			                $scope.storagedProjects = JSON.parse(jsonData.value);
			                $scope.projects = $scope.storagedProjects;
			                if ($scope.projects.some(function (prj) { return prj.Codes.some(function (c) { return c == $scope.productCode.toString() }) })) {
			                    $element.addClass('active');
			                } else {
			                    $element.removeClass('active');
			                }
			            }, 0);
			        } else {
			            $scope.onFetchProjects();
			        }
			    };

			    $scope.closePopup = function () {
			        $timeout(function () {
			            $element.popover('hide');
			            $scope.onResetPopover();
			        }, 0)
			    };

			    $scope.onResetPopover = function () {
			        $scope.stateAction = false;
			        $scope.errorAction = false;
			        $scope.stateTitle = wishListProductManipulateTexts.addTo;;
			        $scope.isShowPopup = false;
			        var $popoverContainer = $('.bs-product-container');
			        $($popoverContainer).parents('.popover').removeClass('open');
			    }

			    $scope.showPopup = function () {
			        $element.popover('show');
			        $scope.isShowPopup = true;


                     $timeout(function () {
				        
				        $('.bs-product-container a')[0].focus();
				    }, 0);
			    };

			    $scope.openCreateProject = function (templateId) {
			        $element.popover('hide');
			        var modelInstance = $uibModal.open({
			            animation: true,
			            windowClass: 'text-center',
			            templateUrl: templateId,
			            controller: 'WishListCreateProjectController',
			            controllerAs: 'wlc',
			            resolve: {
			                projectSortOrder: function () { return $scope.projects.length == 0 ? 1 : Math.max.apply(Math, $scope.projects.map(function (project) { return project.SortOrder })) + 1; },
			            }
			        });

			        modelInstance.result.then(function (isSuccess) {
			            if (isSuccess) {
			                $scope.onFetchProjects();
			            }
			        }, function () { });
			    };

			    $scope.onToggleProduct = function (project) {
			        $scope.projectSelected = project;
			        var $projectTargetElm = $($scope.elementClicked).parents('.project-target');
			        var projectTargetId = $projectTargetElm && $($projectTargetElm).data('project-target');
			        var isActionInSameProject = projectTargetId && projectTargetId == project.ID;
			        var currencyCode = CookieService.onGetCookie(storageKey.currencyCode);
			        var isLastItem = window.location.pathname.indexOf(siteConfig.wishlistUrl) != -1 && project && project.Codes.length == 1;
			        if (project && project.Codes.indexOf($scope.productCode.toString()) != -1) {
			            $http.delete(apiUrl.removeProductToWishList + '?projectID=' + project.ID + '&code=' + $scope.productCode + '&isVariant=true').then(function (res) {
			                $scope.onFetchProjects();
			                $scope.stateAction = true;
			                $scope.stateTitle = wishListProductManipulateTexts.productRemoved;
			                $scope.stateActionType = "remove";
			                StorageService.onRemoveToken(storageKey.productVariants + '__' + project.ID + '__' + currencyCode);
			                $scope.reCalculatePopoverPosition();
			                $timeout(function () {
			                    if (isLastItem || isActionInSameProject) { $scope.closePopup(); }
			                    $rootScope.$emit("UpdateParentProject", { projectId: res.data.Model.ID, projectCodes: res.data.Model.Codes });
			                    $rootScope.$emit("FetchMiniWishlist", {});
			                }, 1500)

			            }).catch(function (err) {
			                console.log(err);
			            });
			        } else {
			            if (project && project.Codes.length >= 20) {
			                $timeout(function () {
			                    $scope.errorAction = true;
			                    $scope.reCalculatePopoverPosition();
			                }, 0);
			                return;
			            }

			            $http.post(apiUrl.addProductToWishList + '?code=' + $scope.productCode + '&isVariant=true', project).then(function (response) {
			                $scope.onFetchProjects();
			                $scope.stateAction = true;
			                $scope.stateTitle = wishListProductManipulateTexts.productAdded;
			                $scope.stateActionType = "add";
			                StorageService.onRemoveToken(storageKey.productVariants + '__' + project.ID + '__' + currencyCode);
			                $scope.reCalculatePopoverPosition();
			                $timeout(function () {
			                    $rootScope.$emit("UpdateParentProject", { projectId: response.data.Model.ID, projectCodes: response.data.Model.Codes });
			                    $rootScope.$emit("FetchMiniWishlist", {});
			                }, 0)
			            }).catch(function (err) {
			                console.log(err);
			            });
			        }
			    }

			    $scope.onFetchParentProject = function (projectId) {
			        $timeout(function () {
			            $rootScope.$emit("FetchParentProjects", { projectId: projectId });
			        }, 20);
			    }

			    $scope.onViewProject = function () {
			        $element.popover('hide');
			        $scope.stateAction = false;
			        $scope.onFetchParentProject($scope.projectSelected.ID);
			        window.location.href = siteConfig.wishlistUrl + '#project-' + $scope.projectSelected.ID;
			        $timeout(function () {
			            $rootScope.$emit("FetchParentProduct", { projectId: $scope.projectSelected.ID });
			        }, 50);
			    }

			    $scope.reCalculatePopoverPosition = function () {
			        //--Recalculate position of popover when it's on top
			        var $popoverContainer = $('.bs-product-container');
			        if ($scope.isAuthenticated) {
			            var $popoverTarget = $('.bs-product-authen');
			            EventBindingService.reCalculatePopoverPosition($popoverContainer, $popoverTarget, $scope.offsetTopOfElement);
			        } else {
			            var $popoverTarget = $('.bs-product-unauthen');
			            EventBindingService.reCalculatePopoverPosition($popoverContainer, $popoverTarget, $scope.offsetTopOfElement);
			        }
			    }
			}
        ],
        controllerAs: 'prd',
        link: {
            post: function (scope, element, attrs) {
                element.on("click", function (event) {
                    event.preventDefault();
                    if (scope.isShowPopup) {
                        scope.closePopup();
                        return;
                    }
                    var $popoverContainer = $('.bs-product-container');
                    $($popoverContainer).parents('.popover').removeClass('open');
                    $($popoverContainer).parents('.popover').remove();

                    scope.offsetTopOfElement = $(this).offset().top;
                    scope.showPopup();
                    scope.reCalculatePopoverPosition();
                    scope.elementClicked = event.target;
                    $(document).on("click", onDocumentClick);
                    $(this).parents('.block-container > .block-content').on('swipe', function (event, slick, direction) {
                        scope.closePopup();
                    });
                });

                var onDocumentClick = function (event) {
                    if (scope.elementClicked === event.target || $(event.target).parents('.bs-product').length) {
                        return;
                    }
                    scope.$apply(function () {
                        scope.closePopup();
                    });
                    $(document).off("click", onDocumentClick);
                };
            }
        }
    };
}]);;
app.directive('productQuickview', ['$animate', '$compile', '$templateCache', function ($animate, $compile, $templateCache) {
	return {
		restrict: 'AE',
		replace: false,
		scope: {
			isWallpaper: '=',
			productInfo: '='
		},
		bindToController: {
			isWallpaper: '=',
			productInfo: '='
		},
		controller: ['$http', '$scope', '$rootScope', '$element', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService',
			function ($http, $scope, $rootScope, $element, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService) {
				var prdQV = this;
				$scope.isLoading = false;
				$scope.isB2B = siteConfig.isB2B;
				prdQV.$onInit = function () {
				    if (!$scope.isB2B) {
					    $element.remove();
						return;
					} else {
						var $ctaSeparator = $element.parents('.productPartial__footer').find('.cta-separator');
						$ctaSeparator && $ctaSeparator.removeClass('d-inline-block');
						$ctaSeparator && $ctaSeparator.css('display', 'none');
					}
				}

				$scope.onOpenQuickView = function () {
				    if (!$scope.isB2B) {
						return;
					}

					if ($scope.isWallpaper) {
						$scope.onOpenWallpaperQuickView();
					} else {
						$scope.onOpenPaintQuickView();
					}
				}

				$scope.onOpenPaintQuickView = function () {
					if (!$scope.productInfo) {
						return;
					}

					var finishFacetSelected = $("a.page-facets__facet.selected").length >= 1 && $("a.page-facets__facet.selected").first().data('master') || '';

					var modelInstance = $uibModal.open({
						animation: true,
						windowClass: 'b2b-product-detail',
						templateUrl: 'paintsharemodal.html',
						controller: 'PaintQuickViewController',
						resolve: {
							productInfo: function () { return $scope.productInfo; },
							finishFacet: function () { return finishFacetSelected; },
						}
					});
					
					modelInstance.result.then(function (isConfirm) {
						if (isConfirm) {
                            return;
                        }
					}, function () {
					});
				}

				$scope.onOpenWallpaperQuickView = function () {
					var modelInstance = $uibModal.open({
						animation: true,
						windowClass: 'b2b-product-detail-wallpaper',
						templateUrl: 'wallpapersharemodal.html',
						controller: 'WallpaperQuickViewController',
						resolve: {
							productInfo: function () { return $scope.productInfo; },
						}
					});
					modelInstance.result.then(function (isConfirm) {
						if (isConfirm) {
						}
					}, function () {
					});
				}

				$scope.trustAsHtml = function (string) {
					return $sce.trustAsHtml(string);
				};

			}],
		link: {
			post: function (scope, element, attrs) {
				element.on("click", function (event) {
					scope.onOpenQuickView();
				});
			}
		}
	};
}]);;
app.controller('QuickOrderController', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', 'siteConfig', 'apiUrl', 'EventBindingService',
	function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, siteConfig, apiUrl, EventBindingService) {
		var qod = this;
		$scope.loading = false;
		$scope.quickOrderModels = [];
		$scope.isValidToCheckOut = false;
		$scope.isSubmittedData = false;
		$scope.isCheckoutSuccess = false;
		$scope.validateErrorMessage = "";
		$scope.isRequestSuccess = false;
		$scope.itemCountToAddMore = itemCountToAddMore || 3;
		$scope.CSVMaximumQuickOrderLines = CSVMaximumQuickOrderLines || 100;
		$scope.maximumSize = 4000 * 1000000;
		$scope.isValidFileUpload;
		$scope.fileAllowToUploads = ['csv'];
		$scope.totalDisplayed = 20;
		$scope.isFetchData = false;
		$scope.isManual = false;
		$scope.canAddMore = false;


		qod.$onInit = function () {
			$scope.onInitQuickOrderItems();
			$scope.onCanAddMore();
			//$timeout(function () {
			//	EventBindingService.onFixFocusInputOnEdge();
			//}, 300);
		};

		$scope.onInitQuickOrderItems = function () {
			$scope.quickOrderModels = [{ Code: '', Quantity: '' }, { Code: '', Quantity: '' }];
			$scope.onValidateToCheckout();
		}

		$scope.onGetFile = function (element) {
			$scope.$apply(function (scope) {
				var csvFile = element.files[0];
				var reader = new FileReader();
				reader.onload = function (e) {
					// handle onload
				};
				reader.readAsDataURL(csvFile);
				$scope.isValidFileUpload = $scope.onValidateFileUpload(csvFile);
				if (!$scope.isValidFileUpload) {
					return;
				}
				// handle upload file
				var data = new FormData();
				data.append('CSVUploadFile', csvFile);
				data.append('CSVMaximumQuickOrderLines', $scope.CSVMaximumQuickOrderLines);
				$scope.isValidFileUpload == true;
				$scope.loading = true;
				$http.post(apiUrl.BulkBuyingByFileInput, data, {
					transformRequest: angular.identity,
					headers: { 'Content-Type': undefined }
				}).then(function (res) {
					if (res.data.BuyingItems && res.data.BuyingItems.length > 0) {

						if (res.data.IsSuccess) {
							window.location = res.data.RedirectUrl;
							return;
						}

						$scope.quickOrderModels = res.data.BuyingItems.map(function (item) {
							$scope.onValidateCode(item, false, true);
							$scope.onValidateQuantity(item, false, true);
							return item;
						});
						$scope.isSubmittedData = true;
						$scope.onValidateToCheckout();
						$scope.onCanAddMore();
					};

					$scope.validateErrorMessage = res && res.data && res.data.ValidateErrorMessage;
					$scope.isRequestSuccess = res && res.data && res.data.IsSuccess;
					$scope.loading = false;
					$timeout(function () {
						$('html, body').animate({
							scrollTop: ($('.is-invalid:first').offset().top - $('.is-invalid:first').height() -36 )
						},
							300);
					}, 10);
					$timeout(function () {

						$scope.isRequestSuccess = true;
						$scope.validateErrorMessage = "";
					}, 5000);
				}).catch(function (err) {
					console.log(err);
					$scope.loading = false;
				});;
			});
			element.value = '';
		}

        $scope.onValidateFileUpload = function(file) {
            if (!file)
                return false;

            var fileExtension = $scope.onGetFileExtension(file.name);
            if (!fileExtension || !$scope.fileAllowToUploads.some(function(ext) { return ext == fileExtension }))
                return false;

            if (file.size > $scope.maximumSize)
                return false;

            return true;
        };

        $scope.onGetFileExtension = function(fileName) {
            return (/[.]/.exec(fileName)) ? /[^.]+$/.exec(fileName)[0] : undefined;
        };

		$scope.onValidateCode = function (item, isManual, isSubmitted) {
			$scope.isManual = isManual;
			if ((item.IsValid == false && !isManual) || !item.Code) {
				item.ValidCode = false;
			} else {
				item.ValidCode = true;
				if (isNaN(parseInt(item.Quantity)) || parseInt(item.Quantity) <= 0) {
					item.ValidQuantity = false;
				}
			}

			if (!isSubmitted) {
				$scope.onValidateToCheckout();
			}
		};

        $scope.onValidateQuantity = function(item, isManual, isSubmitted) {
            $scope.isManual = isManual;

            if (!parseInt(item.Quantity)) {
                item.ValidQuantity = false;
            } else {
                item.ValidQuantity = true;
                if ((item.IsValid == false && !isManual) || !item.Code) {
                    item.ValidCode = false;
                }
            }

            if (!isSubmitted) {
                $scope.onValidateToCheckout();
            }
        };

        $scope.onValidateToCheckout = function() {
            if ($scope.isSubmittedData &&
                $scope.isManual &&
                $scope.quickOrderModels.some(function(item) {
                    return !!item.Code && parseInt(item.Quantity) > 0;
                }) &&
                !$scope.quickOrderModels.some(function(item) {
                    return (!item.Code && parseInt(item.Quantity) > 0) ||
                        (!!item.Code && (isNaN(parseInt(item.Quantity)) || parseInt(item.Quantity) <= 0));
                })) {
                $scope.isValidToCheckOut = true;
            } else if (!$scope.isSubmittedData &&
                $scope.isManual &&
                $scope.quickOrderModels.some(function(item) {
                    return (!item.Code && parseInt(item.Quantity) > 0) ||
                        (!!item.Code && (isNaN(parseInt(item.Quantity)) || parseInt(item.Quantity) <= 0));
                })) {
                $scope.isValidToCheckOut = false;
            } else {
                $scope.isValidToCheckOut = $scope.quickOrderModels.some(function(item) {
                        return item.ValidCode && item.ValidQuantity;
                    }) &&
                    $scope.isValidAfterSubmitted();
            }
        };

        $scope.isValidAfterSubmitted = function() {
            if (!$scope.isSubmittedData) return true;

            return ($scope.isSubmittedData) &&
                !$scope.quickOrderModels.some(function(item) {
                    return (!item.Code && parseInt(item.Quantity) > 0) ||
                        (!!item.Code && (isNaN(parseInt(item.Quantity)) || parseInt(item.Quantity) <= 0));
                });
        };

		$scope.onAddMoreItem = function () {
			if ($scope.quickOrderModels.length >= $scope.CSVMaximumQuickOrderLines) {
				return;
			}

			for (var i = 0; i < $scope.itemCountToAddMore; i++) {
				$scope.quickOrderModels.push({ Code: '', Quantity: '' });
			}

			if ($scope.quickOrderModels.length > $scope.CSVMaximumQuickOrderLines) {
				$scope.quickOrderModels.splice($scope.CSVMaximumQuickOrderLines);
			}

			$scope.onCanAddMore(true);
		};


		$scope.onCanAddMore = function (isAddManual) {
			$scope.canAddMore = $scope.quickOrderModels.length < $scope.CSVMaximumQuickOrderLines;
			if (isAddManual && !$scope.canAddMore) {
				$scope.isShowCanAddMessage = true;
				$timeout(function () {
					$scope.isShowCanAddMessage = false;
				},
					5000);
			}
		};


		$scope.onCheckOut = function () {

			var itemToCheckouts = [];
			$scope.quickOrderModels.map(function (item) {
				var quantity = parseInt(item.Quantity);
				if (item.Code) {
					itemToCheckouts.push({ Code: item.Code, Quantity: quantity });
				}
			});

			if (itemToCheckouts.length > 0) {
				$scope.loading = true;
				$http.post(apiUrl.BulkCheckout, itemToCheckouts).then(function (res) {
					if (res && res.data && !res.data.IsSuccess) {

						if (res.data.BuyingItems && res.data.BuyingItems.length > 0) {
							$scope.quickOrderModels = res.data.BuyingItems.map(function (item) {
								$scope.onValidateCode(item, false, true);
								$scope.onValidateQuantity(item, false, true);
								return item;
							});
							$scope.onValidateToCheckout();
							$scope.onCanAddMore();

                            $timeout(function () {
                                $('html, body').animate({
									scrollTop: ($('.is-invalid:first').offset().top - $('.is-invalid:first').height() - 36 )
                                    },
                                    300);
                            }, 10);

						}
					} else {
                        $scope.isCheckoutSuccess = true;
                        $rootScope.$emit("FetchCartsOnHearder", {});
                        $scope.onInitQuickOrderItems();
                    }
					$scope.isSubmittedData = true;
					$scope.validateErrorMessage = res && res.data && res.data.ValidateErrorMessage;
					$scope.isRequestSuccess = res && res.data && res.data.IsSuccess;
                    $timeout(function () {
						$scope.isCheckoutSuccess = false;
						$scope.isRequestSuccess = true;
						$scope.validateErrorMessage = "";
					}, 5000);
					$scope.loading = false;
				}).catch(function (err) {
					$scope.loading = false;
				});
			}
		}

		$scope.onOpenMessageDialog = function (actionName, messages) {
			var modelInstance = $uibModal.open({
				animation: true,
				windowClass: 'text-center',
				templateUrl: 'informdialog.html',
				controller: 'InformDialogController',
				resolve: {
					actionName: function () { return actionName; },
					messages: function () { return messages; },
				}
			});
			modelInstance.result.then(function (isConfirm) {
				if (isConfirm) {
					return;
				}
			},
				function () {
				});
		};

		qod.trustAsHtml = function (string) {
			return $sce.trustAsHtml(string);
		};
	}
]);;
app.controller('RecentlyBlockController', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService',
    function($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService) {
        var rb = this;
        rb.entries = [];
        rb.error = '';
        rb.maximumItem = 0;
        rb.isloading = false;

        rb.$onInit = function() {};

        rb.onLoadEntries = function() {

            var entries = StorageService.onGetToken(storageKey.entryContentBase);
            rb.isloading = true;
            if (entries) {
                var jsonData = JSON.parse(entries);
                rb.entries = jsonData.slice(0, rb.maximumItem);
                rb.isloading = false;
            }
        };

        rb.getMaximumItem = function(maximumItem) {
            rb.maximumItem = maximumItem;
            rb.onLoadEntries();
        }
    }
]);;
app.controller("SLiSearchController", ["$scope", "$log", "$location", "$timeout", "sliService", "facetUtility", "EventBindingService", "sharedState", "CoreService", "siteConfig", function ($scope, $log, $location, $timeout, sliService, facetUtility, EventBindingService, sharedState, CoreService, siteConfig) {
    var productTab = "products";
    $scope.showTab = false;
    $scope.isShowFilter = false;
    $scope.isShowSort = false;
    $scope.sharedState = sharedState;
    $scope.preChangeTab = function () {
        $scope.showTab = !$scope.showTab;
    }
    $scope.isProductTab = function () {
        return $scope.currentTabId === productTab;
    }
    $scope.isArticlesTab = function () {
        return $scope.currentTabId === "articles";
    }
    $scope.isYoutubeTab = function () {
        return $scope.currentTabId === "youtube";
    }
    $scope.isOtherTab = function () {
        return (!$scope.isProductTab() && !$scope.isArticlesTab());
    }

    $scope.isOtherNotYoutubeTab = function () {
        return (!$scope.isProductTab() && !$scope.isArticlesTab() && !$scope.isYoutubeTab());
    }

    $scope.currentTab = function () {
        if ($scope.searchResult && $scope.searchResult.tabs && $scope.searchResult.tabs[0] && $scope.searchResult.tabs[0].values) {
            for (var i = 0; i < $scope.searchResult.tabs[0].values.length; i++) {
                if ($scope.searchResult.tabs[0].values[i].id === $scope.currentTabId) {
                    return $scope.searchResult.tabs[0].values[i];
                }
            }
        }
        return {};
    }
    $scope.search = function (updateSearchResult, isLoadMore) {
        var facets = [];
        if ($scope.isProductTab()) {
            facets = $scope.filterfacets;
        }

        if (!updateSearchResult) {
            updateSearchResult = $scope.updateFirstLoad;
        }

        if (isLoadMore && $scope.searchResult) {
            $scope.start = $scope.searchResult.pages.next.start;
        } else {
            $scope.start = 0;
        }

        sliService.getSearch($scope.searchWord,
            facets,
            $scope.currentTabId,
            $scope.sort,
            $scope.start,
            $scope.count, updateSearchResult);
    }

    $scope.updateFirstLoad = function (data) {
        $scope.searchResult = data;
        if ($scope.searchResult.results) {
            $scope.noResult = !$scope.searchResult.results.length;
            $timeout(function () {
                $scope.rebindImage();
            }, 50)
        } else {
            $scope.noResult = true;
        }

        if (!$scope.currentTabId && $scope.searchResult.tabs && $scope.searchResult.tabs[0].values) {
            var firstTab = $scope.searchResult.tabs[0].values[0];
            firstTab.selected = true;
            $scope.currentTabId = firstTab.id;
        }
        if ($scope.isArticlesTab()) {
            $timeout(function () {
                $scope.onReloadImage();
                $scope.onRebindSwatchEvent();
                $scope.onRebindCarouselEvent();
            }, 1000);
        }

        $timeout(function() {
                EventBindingService.onRebindLoadMore();
            },
            50);


    }

    $scope.onRebindSwatchEvent = function () {
        EventBindingService.onRebindSwatchEvent(0);
    }

    $scope.onReloadImage = function () {
        EventBindingService.onReloadImage();
    }

    $scope.onRebindCarouselEvent = function () {
        var $articleListingPage = $(".search-results--articles");
        EventBindingService.onRebindCarousel($articleListingPage);
    }

    $scope.getSuffixLanguage = function () {
        return siteConfig.langCode && siteConfig.langCode != "fr-FR" ? "s" : "";
    }

    var isLoading = false;
    $scope.loadMore = function () {
        if (isLoading) return;
        isLoading = true;
        $scope.hasMoreData = false;
        $scope.search(function (data) {
            $scope.searchResult.results = $scope.searchResult.results.concat(data.results);
            $scope.searchResult.pages = data.pages;
            if (data.results) {
                $scope.hasMoreData = true;
                isLoading = false;
                $timeout(function () {
                    $scope.rebindImage();
                    EventBindingService.onRebindLoadMore();
                }, 50)
            }
        }, true);
    }

    $scope.moreItems = function () {
        if ($scope.searchResult && $scope.searchResult.result_meta) {
            var remain = $scope.searchResult.result_meta.total - $scope.searchResult.results.length;
            return remain > $scope.count ? $scope.count : remain;
        }
        return 0;
    }

    $scope.rebindImage = function () {
        EventBindingService.onReloadImage();
    }

    $scope.rebindFilterAndSortingEvent = function () {
        EventBindingService.onRebindFilterAndSortingEvent();
    }

    function init() {
        $scope.noResult = false;

        var searchWord = angular.element("#searchWord").val();
        var pageSize = document.getElementById("PageSize").value;

        $scope.sort = $location.search().sort;
        if (!$scope.sort) $scope.sort = 0;

        $scope.hasMoreData = true;
        $scope.searchWord = searchWord;
        $scope.start = 0;
        $scope.count = pageSize;
        $scope.filterfacets = sliService.parseFacets($location.search().af);
        if ($location.path().length > 0) {
            $scope.currentTabId = $location.path().substring(1);
        } else {
            //$scope.currentTabId = productTab;
        }
        $scope.search();
    }

    $scope.getTabUrl = function (tab) {
        return $scope.getUrl(tab.id, $scope.filterfacets, $scope.sort);
    }

    $scope.getSortUrl = function (sort) {
        return $scope.getUrl($scope.currentTabId, $scope.filterfacets, sort);
    }

    $scope.getFacetUrl = function (facet, value) {
        var facets = $scope.filterfacets ? $scope.filterfacets.slice(0) : [];
        facetUtility.addSingle(facets, { id: facet.id, name: value.id }, value);
        return $scope.getUrl($scope.currentTabId, facets, $scope.sort);
    }

    $scope.getUrl = function (tab, facets, sort) {
        var urlBuilder = "";
        urlBuilder += "/" + tab + "?";
        if (productTab === tab) {
            urlBuilder += sliService.buildFacetsUrl(facets);
            urlBuilder += "&sort=" + sort;
        }

        return urlBuilder;
    }
    $scope.udpateUrl = function () {

        $location.url($scope.getUrl($scope.currentTabId, $scope.filterfacets, $scope.sort));
    }

    $scope.setFacets = function (facets) {
        $scope.filterfacets = facets;
    }

    $scope.chooseTab = function (tab, isReload) {
        $scope.showTab = false;

        if ($scope.currentTabId === tab.id) {
            return;
        }
        $scope.currentTabId = tab.id;
        $scope.updateSearch();
    }
    $scope.changeSort = function (sort) {
        $scope.sort = sort;
        $scope.updateSearch();
    }
    $scope.resetSort = function () {
        if ($scope.sort === 0) { return; }
        $scope.sort = 0;
        $scope.updateSearch();
    }
    $scope.applySearch = function () {
        $timeout(function () {
            $scope.isShowFilter = false;
            $scope.isShowSort = false;
        }, 300);
    }
    $scope.showOrHideSort = function () {
        $scope.isShowFilter = false;
        $('.page-facets__filters').addClass('d-none');
        if ($scope.isShowSort === window.undefined || $scope.isShowSort === false) {
           $('.page-facets__sort').removeClass('d-none');
        }
        $timeout(function () {
            $scope.isShowSort = !$scope.isShowSort;
            $timeout(function () {
                if (!$scope.isShowSort) {
                  $('.page-facets__sort').addClass('d-none');
                }
              

            }, 0);
        }, 300);
    }
    $scope.showOrHideFilter = function () {
        $scope.isShowSort = false;
        $('.page-facets__sort').addClass('d-none');
        if ($scope.isShowFilter === window.undefined || $scope.isShowFilter === false) {
            $('.page-facets__filters').removeClass('d-none');
        }
        $timeout(function () {
            $scope.isShowFilter = !$scope.isShowFilter;
            $timeout(function () {
                if (!$scope.isShowFilter) {
                    $('.page-facets__filters').addClass('d-none');
                }


            }, 0);
        }, 300);
    }
    $scope.onFacetFilter = function (facet, value) {
        if (!$scope.filterfacets) {
            $scope.filterfacets = [];
        }

        facetUtility.addSingle($scope.filterfacets, { id: facet.id, name: value.id }, value);

        $scope.updateSearch();
    }

    $scope.resetSearch = function () {
        $scope.filterfacets = [];
        $scope.sort = 0;
        $scope.updateSearch();
    }
    $scope.updateSearch = function () {
        $scope.udpateUrl();
        $scope.search();
    }
    init();
}]);

app.controller("SLiSearchSuggestionController", ["$scope", "$http", "sliService", "$window", function ($scope, $http, sliService, $window) {
    var enterKeyCode = 13;
    $scope.querystringMaxLength = 2000;
    $scope.timeStamp = 0;
    $scope.minimumSearchKeyword = 3;
    $scope.hideResult = true;
    $scope.onKeyUp = function (event) {
        $scope.timeStamp = new Date().getTime();
        if (event.keyCode === enterKeyCode) {
            if ($scope.keyword) {

                if ($scope.keyword.length < $scope.minimumSearchKeyword) {
                    return;
                }

                var searchWords = encodeURI($scope.keyword);
                if (searchWords.length > $scope.querystringMaxLength) {
                    searchWords = searchWords.substring(0, $scope.querystringMaxLength);
                }
                $window.location.href = $scope.searchUrl + "?w=" + searchWords;
            }
        }
    }
    $scope.getSuggestion = function () {
        if (!$scope.keyword || $scope.keyword.length < $scope.minimumSearchKeyword) {
            return;
        }

        sliService.getAutocomplete($scope.keyword,
            function (response) {
                $scope.hideResult = false;
                $scope.results = response.data.Model;
            });
    };
}]);;
/*===========Start of SLi Search Integration=============*/
app.service("facetUtility",
    function () {
        var self = this;
        self.remove = function (array, value) {
            for (var i = 0; i < array.length; i++) {
                if (array[i].name === value.name && array[i].id === value.id) {
                    return array.splice(i, 1);
                }
            }
            return -1;
        }

        self.removeFacetType = function (array, id) {
            for (var i = 0; i < array.length; i++) {
                if (array[i].id === id) {
                    return array.splice(i, 1);
                }
            }
            return -1;
        }

        self.addSingle = function (array, value, term) {
            self.removeFacetType(array, value.id);
            if(!term.selected)array.push(value);
            return -1;
        }
    });

app.service("sliService", ["$http", "siteConfig", "$q", function ($http, siteConfig, $q) {
    var self = this;
    var facetSeperator = " ";
    function mapFacets(facets) {
        return facets.map(function (fc) {
            return  fc.id + ":" + fc.name + " ";
        }).join("");
    }
    self.buildFacetsUrl = function (facets) {
        var facetsUrl = '';
        if (facets !== null && facets !== window.undefined && facets.length > 0 ) {

            facetsUrl += 'af=' + mapFacets(facets);
        }
        return facetsUrl;
    }

    self.parseFacets = function (af) {
        if (af) {
            var facets = [];
            var facetsParams = af.split(facetSeperator);
            angular.forEach(facetsParams,
                function (value) {
                    var facetSeg = value.split(":");
                    if (facetSeg.length === 2) {
                        facets.push({ id: facetSeg[0], name: facetSeg[1] });
                    }
                });
            return facets;
        }
    }

    self.getSearch = function (searchWord, facets, tab, sort, start, count, success, fail) {
        var url = siteConfig.rootUrl + "api/search/GetSearchResult/?term=" + searchWord;
        //tab and facets
        url += "&af=";
        if (tab) {
            url += "pagetype:" + tab;
            if (facets && facets.length > 0) {
                url += " " + mapFacets(facets);
            }

            if (tab === "products") {
                url += "&sort=" + sort;

            } else {
                url += "&sort=" + 0;
            }
        }
        url += "&langcode=" + siteConfig.langCode;
        url += "&start=" + start + "&count=" + count;
        $http({ method: "GET", url: url })
            .then(function (data) {
                success(data.data.Model);
            }, fail);
    }

    var racCanceller = null;
    self.getAutocomplete = function (term, success) {
        if (racCanceller != null) {
            racCanceller.resolve();
        }
        racCanceller = $q.defer();
        $http({
            method: 'GET',
            url: siteConfig.rootUrl + 'api/Search/GetSuggestions',
            params: { term: term, langCode: siteConfig.langCode },
            timeout: racCanceller.promise
        }).then(function (response) {
            if (response) {
                if (response.status === 200) {
                    success(response);
                }
            }
        }, function (error) {
        });
    }

}]);
/*===========End of SLi Search Integration=============*/;
app.constant("storageKey", {
    wishlist: 'wishlist__',
    productVariants: 'productVariants__',
    basketItemAmended: 'basketItemAmended__',
    entryContentBase: 'EntryContentBase',
    currencyCode: 'currencyCode_'
});;
app.service('StorageService', ['siteConfig', function (siteConfig) {
        this.onSetToken = function (tokenKey, jsonData, expirationMin) {
            var expirationMS = expirationMin ? expirationMin * 60 * 1000 : siteConfig.expireTime * 60 * 1000;
            var record = { value: JSON.stringify(jsonData), timestamp: (new Date().getTime() + expirationMS) }
            localStorage.setItem(tokenKey, JSON.stringify(record));
        };

        this.onGetToken = function (tokenKey) {
            return localStorage.getItem(tokenKey);
        };

        this.onRemoveToken = function (tokenKey) {
            localStorage.removeItem(tokenKey);
        };

        this.onSetTokenString = function (tokenKey, value) {
            localStorage.setItem(tokenKey, value);
        };

        this.isTokenExpired = function (tokenKey) {
            var tokenData = localStorage.getItem(tokenKey);
            if (!!tokenData) {
                var jsonData = JSON.parse(tokenData);
                if (!jsonData) return false;

                return new Date().getTime() - jsonData.timestamp >= 0;
            }
            return false;
        };
    }
]);;
app.controller('VideoPlayerController', ['$http', '$scope', '$rootScope', '$window', '$timeout',
    function ($http, $scope, $rootScope, $window, $timeout) {
        $scope.videoId = null;
        $scope.videoSource = null;
        $scope.linkToPath = null;
        $scope.scrollDebounceDelay = 600;
        $scope.inactivityTimeout = null;
        $scope.inactivityDelay = 5000;
        $scope.player = null;
        $scope.playerReady = false;
        $scope.isWaiting = false;
        $scope.activePlayerStateClass = 'video-controls-icon--play';
        $scope.playerState = 1; // 1 = playing, 2 = paused
        $scope.muted = true;
        $scope.volume = null;
        $scope.volumeControlsVisible = false;
        $scope.volumeControlValue = null;

        $scope.init = function (videoId, videoSource, url) {
            $scope.videoId = videoId;
            $scope.linkToPath = url;
            $scope.videoSource = videoSource;
            $scope.volume == $scope.videoSource == 'Vimeo' ? 0 : 300;
            $scope.volumeControlValue = $scope.volume;
            $scope.videoControlPanelElement = document.getElementById((videoSource + '_controls_' + videoId));

            let debounceTimeoutId;

            $window.onscroll = function () {
                clearTimeout(debounceTimeoutId);
                debounceTimeoutId = setTimeout(function () { 

                    $rootScope.$broadcast('scroll-event');
                }, $scope.scrollDebounceDelay );
            };

            $scope.$on('scroll-event', function (event, args) {
                $scope.handleControlPanelPosition();
            });

            if ($scope.videoSource == 'Vimeo') {
                //$window.onload = function() {
                    if ($window.Vimeo) {
                        $scope.player = new Vimeo.Player('vimeoplayer_' + $scope.videoId);
                        $scope.player.on('loaded', function() {
                            $scope.player.setVolume(0); // override default volume, there's no specific mute method
                            $scope.volumeControlValue = 0;
                            $scope.playerState = 1;
                            $scope.playerReady = true;
                            
                        });
                    }
                //};
            } else {
                $window.onload = function () {

                    if ($window.YT) {

                        $scope.player = new YT.Player('youtubeplayer_' + $scope.videoId, {
                            height: '390',
                            width: '640',
                            videoId: $scope.videoId,
                            playerVars: {
                                'autoplay': 1,
                                'controls': 0,
                                'loop': 1,
                                'mute': 1,
                                'playlist': $scope.videoId,
                                'rel': 0,
                                'showinfo': 0
                            },
                            events: {
                                'onReady': onPlayerReady,
                                'onStateChange': onPlayerStateChange,
                            }
                        });
                    }
                };
            }
        }

        $scope.handleFocusClick = function ($event) {
            var isSelfTriggered = ($event.target == $event.currentTarget || $event.target.classList.contains('video-foreground')) ? true : false;
            if ($scope.linkToPath && isSelfTriggered) {
                window.location.href = $scope.linkToPath;
            }
        }

        $scope.containBubbling = function ($event) {
            if (!$event.currentTarget.contains($event.target)) {
                $event.stopPropagation();
            }
        }

        $scope.handleVolumeControl = function(value) {
            $scope.volume = value;
            $scope.volumeControlValue = value;

            if (!$scope.player) {
                return;
            }

            if (value == 0) {
                $scope.muted = true;

                if ($scope.videoSource == 'Vimeo') {
                    $scope.player.setVolume(0);
                } else {
                    $scope.player.mute();
                }
            } else {
                $scope.muted = false;

                if ($scope.videoSource == 'Vimeo') {
                    var value = Number($scope.volume) / 100;
                    $scope.player.setVolume(value);
                } else {
                    $scope.player.setVolume($scope.volume);           
                    $scope.player.unMute();
                }
            }

            $scope.inactivityTimer();

        }

        $scope.$watch('playerState', function (newValue, oldValue) {
            switch (newValue) {
                case 1:
                    $scope.activePlayerStateClass = 'video-controls-icon--paused';
                    break;
                case 2:
                    $scope.activePlayerStateClass = 'video-controls-icon--play';
                    break;
                default:
                    $scope.activePlayerStateClass = 'video-controls-icon--waiting';
            }

        });

        $scope.handleControlPanelPosition = function () {

            var navModuleBottomY = document.getElementById('main-menu').getBoundingClientRect().bottom;
            var navModuleTopY = document.getElementById('main-menu').getBoundingClientRect().top;
            var videoModule = document.querySelectorAll('[data-id="' + $scope.videoId + '"]')[0];
            var videoModuleTopY = videoModule.getBoundingClientRect().top;
            var videoModuleBottomY = videoModule.getBoundingClientRect().bottom;
            var bottomLimitY = 200;
            var expandedNavPadding = 160;
            var stickNavPadding = 70;
            var topLimitY = (navModuleTopY > videoModuleTopY) ? bottomLimitY : 0;

            if (videoModuleTopY <= topLimitY && videoModuleBottomY > bottomLimitY) {
                var padding = (navModuleTopY > 0) ? expandedNavPadding : stickNavPadding;
                
                $scope.videoControlPanelElement.style.top = (Math.abs(videoModuleTopY) + padding) + 'px';
            }
            else {
                $scope.videoControlPanelElement.style.removeProperty('top');
            }

        }

        $scope.handleMuteControl = function ($event) {
            
            if (!$scope.player) {
                return;
            }

            if ($scope.videoSource == 'Vimeo') {
                    if ($scope.volume == 0) { // if muted
                        $scope.player.setVolume(1);
                        $scope.volume = 1;
                        $scope.volumeControlValue = 100;
                        $scope.muted = false;
                    } else {
                        $scope.player.setVolume(0);
                        $scope.volumeControlValue = 0;
                        $scope.muted = true;
                }
            } else {
                    if ($scope.player.isMuted()) {
                        $scope.player.setVolume($scope.volume);
                        $scope.player.unMute();
                        $scope.volumeControlValue = $scope.volume;
                        $scope.muted = false;
                    } else {
                        $scope.player.mute();
                        $scope.volumeControlValue = 0;
                        $scope.muted = true;
                    }   
            }

            $scope.inactivityTimer();

        }

        $scope.handlePlayControl = function () {
            
            if (!$scope.player) {
                return;
            }
            $scope.activePlayerStateClass = 'video-controls-icon--waiting';

            if ($scope.videoSource == 'Vimeo') {
                $scope.player.getPaused().then(function(paused) {
                    if (paused) { // if player is currently paused
                        $scope.player.play();
                        $scope.playerState = 1;
                    } else {
                        $scope.player.pause();
                        $scope.playerState = 2;
                    }
                });
            } else {
                $scope.playerState = $scope.player.getPlayerState();

                if ($scope.playerState == 2) { // if player is currently paused
                    $scope.player.playVideo();
                } else {
                    $scope.player.pauseVideo();
                }
            }

            $scope.inactivityTimer();

        }

        function onPlayerReady() {
            $scope.playerReady = true;
        }

        function onPlayerStateChange(event) {
            $scope.playerState = event.data;
        }

        $scope.handleVolumeToggle = function ($event) {
            $event.stopPropagation();
            $scope.volumeControlsVisible = !$scope.volumeControlsVisible;

            $scope.inactivityTimer();
        };

        $scope.inactivityTimer = function () {

            $timeout.cancel($scope.inactivityTimeout);

            $scope.inactivityTimeout = $timeout(function () {
                
                $timeout.cancel($scope.inactivityTimeout);
                $scope.volumeControlsVisible = false;

            }, $scope.inactivityDelay);

        }
    }
]);;
app.controller('WallpaperQuickViewController', ['$http', '$scope', '$rootScope', '$uibModalInstance', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'EventBindingService', 'productInfo',
	function ($http, $scope, $rootScope, $uibModalInstance, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService, EventBindingService, productInfo) {
		var wqv = this;
		$scope.productInfo = productInfo;
		$scope.loading = false;
		$scope.wallpaperEntries = [];
		$scope.totalPrice = 0;
		$scope.totalPriceFormat = "";
		$scope.currencySymbol = "";
		$scope.totalQty = 0;
		$scope.limitWallpaper = false;
	
		wqv.$onInit = function () {
			$scope.onLoadEntries();
		};

		$scope.onLoadEntries = function () {
			if (!$scope.productInfo) {
				return;
			}
			$scope.loading = true;
			$http.get(apiUrl.pdpWallpaperGetWallpaperQuickView + '?productCode=' + $scope.productInfo.ProductCode + '&' + siteConfig.getTimeStamp()).then(function (response) {
                $scope.wallpaperEntries = response.data && response.data && response.data.Items || [];	
				$scope.limitWallpaper = response.data && response.data.LimitWallpaperProducts || false;
				$scope.currencySymbol = $scope.wallpaperEntries && $scope.wallpaperEntries[0] && $scope.wallpaperEntries[0].CurrencySymbol || response.data && response.data.CurrencySymbol;
				if ($scope.wallpaperEntries && $scope.currencySymbol) {
					$scope.onCalculateTotalPrice();
				}
				$scope.loading = false;
			}).catch(function (err) {
				console.log(err);
				$scope.loading = false;
			});		
		};

        $scope.onChangeItemQuantity = function(item, isSample) {
            item.TotalPrice = item.Price * parseInt(item.Quantity);
            $scope.onCalculateTotalPrice();
            $scope.onCalculateQty();
        };

	    $scope.onCalculateQty = function() {
	        $scope.totalQty = 0;
	        if ($scope.wallpaperEntries && $scope.wallpaperEntries.length > 0) {
				var i;
	            for (i = 0; i < $scope.wallpaperEntries.length; ++i) {
	                if ($scope.wallpaperEntries[i].Quantity) $scope.totalQty += parseInt($scope.wallpaperEntries[i].Quantity);
	                if ($scope.wallpaperEntries[i].Sample && $scope.wallpaperEntries[i].Sample.Quantity) $scope.totalQty += parseInt($scope.wallpaperEntries[i].Sample.Quantity);
	            };
            };
	    };
        
	    $scope.onCalculateTotalPrice = function () {
			$scope.totalPrice = $scope.wallpaperEntries && $scope.wallpaperEntries.length > 0 &&
				$scope.wallpaperEntries.reduce(function (prev, next) { return prev + ((next.Sample && next.Sample.TotalPrice || 0) + (next.TotalPrice || 0)) }, 0) || 0;
			$scope.totalPriceFormat = $scope.currencySymbol + $scope.totalPrice.toFixed(2);
		}

		$scope.addToBasket = function () {

			var itemToBasket = [];
			$scope.wallpaperEntries.map(function (item) {
				if (item.Quantity && item.Quantity > 0) {
					itemToBasket.push({
						Code: item.Code,
						Quantity: item.Quantity,
						IsUpdateOrAdd: false,
						Name: item.DisplayName
					});
				}

				if (item.HasSample && item.Sample.Quantity > 0) {
					itemToBasket.push({
						Code: item.Sample.Code,
						Quantity: item.Sample.Quantity,
						IsUpdateOrAdd: false,
						Name: item.Sample.DisplayName
					});
				}
			});

			if (!Array.isArray(itemToBasket) || !itemToBasket.length) { return; }
			$scope.loading = true;
			$http.post(apiUrl.bspAddItemToBasket, itemToBasket).then(function (res) {

				if (res.data && res.data.Success) {
					$scope.onCloseModal();
					$rootScope.$emit("ShowAddToBasketInform", { productInfo: $scope.productInfo });
					$rootScope.$emit("FetchCartsOnHearder", {});
				} else {
					var messages = [];

					itemToBasket.map(function (item) {
						if (res.data.Model[item.Code]) {
							messages.push(item.Name + ' ' + (res.data.Model[item.Code] && res.data.Model[item.Code].toString()));
						}
					});

					if (messages && messages.length > 0) {
						$scope.onOpenMessageDialog('', messages);
					}
				}

				$scope.loading = false;

			}).catch(function (err) {
				$scope.loading = false;
			});
		}

		$scope.onOpenMessageDialog = function (actionName, messages) {
			$scope.onCloseModal();

			var modelInstance = $uibModal.open({
				animation: true,
				windowClass: 'text-center',
				templateUrl: 'informdialog.html',
				controller: 'InformDialogController',
				resolve: {
					actionName: function () { return actionName; },
					messages: function () { return messages; },
				}
			});
			modelInstance.result.then(function (isConfirm) {
				if (isConfirm) {
				}
			}, function () {
			});
		}

		$scope.onCloseModal = function () {
			$uibModalInstance.close();
		};
	}
]);;
app.controller('WishListCreateProjectController', ['$scope', '$rootScope', '$http', '$uibModalInstance', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'projectSortOrder',
    function ($scope, $rootScope, $http, $uibModalInstance, siteConfig, apiUrl, storageKey, StorageService, projectSortOrder) {
        var wlc = this;
        wlc.error = '';
        wlc.storagedProjects = [];
		wlc.isLoading = false;

        wlc.$onInit = function () {
            var projectStoraged = StorageService.onGetToken(storageKey.wishlist + siteConfig.currentUserId);
            if (projectStoraged) {
                var jsonData = JSON.parse(projectStoraged);
                var projects = jsonData.value;
                this.storagedProjects = JSON.parse(projects);
            }
        }

        wlc.projectModel = {
            Name: '',
            SortOrder: projectSortOrder
        };

        wlc.onClose = function () {
            $uibModalInstance.close();
        }

		wlc.onFetchProjects = function () {
			wlc.isLoading = true;
            $http.get(apiUrl.wishListGetAll + '?' + siteConfig.getTimeStamp()).then(function (response) {
                var projectDatas = response.data && response.data.Model && response.data.Model.Projects || $scope.projects;
                if (projectDatas && projectDatas.length > 0) {
                    StorageService.onSetToken(storageKey.wishlist + siteConfig.currentUserId, projectDatas);
                }
				$rootScope.$emit("FetchParentProjects");
				$rootScope.$emit("FetchMiniWishlist", {});
				$uibModalInstance.close(true);
				wlc.isLoading = false;
            }).catch(function (err) {
				console.log(err);
				wlc.isLoading = false;
            });
        }

        wlc.onCreateProject = function ($form) {
            if ($form && $form.$invalid) { return; }

            if (wlc.storagedProjects && wlc.storagedProjects.length >= 10) {
                wlc.error = 'You can only create maximum 10 projects';
                return;
            }

            if (wlc.projectModel.Name && wlc.projectModel.Name.length > 35) {
                wlc.error = 'Project name must not exceed 100 characters';
                return;
            }
            var projectExisting = "";
            if (wlc.storagedProjects && wlc.storagedProjects.some(function (prj) {
                projectExisting = prj.Name;
                return prj.Name.toLowerCase() == wlc.projectModel.Name.toLowerCase();
            })) {
                wlc.error = 'Project name ' + projectExisting + ' already existed';
                return;
			}

			wlc.isLoading = true;
            $http.post('/api/WishList/Create', wlc.projectModel).then(function (res) {
				wlc.onFetchProjects();
				wlc.isLoading = false;
            }).catch(function (err) {
				console.log(err);
				wlc.isLoading = false;
            });
        };
    }]);;
app.controller('WishListPopulated', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'EventBindingService', 'CookieService',
    function($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService, EventBindingService, CookieService) {
        var wlp = this;
        wlp.projects = [];
        wlp.storagedProjects = [];
        wlp.error = '';
        wlp.isloading = false;

        wlp.$onInit = function() {
            wlp.onLoadProject();

            if ($location.hash()) {
                try {
                    var projectIdInHash = parseInt($location.hash().replace('project-', ''));
                    var projectInHashs = this.projects && this.projects.filter(function(p) { return p.ID == projectIdInHash; });
                    var projectInHash = projectInHashs[0];

                    if (!projectInHash) { return; }
                    projectInHash.isToggle = false;
                    $timeout(function() {
                        $('#toggle-' + projectIdInHash).trigger('click');
                        $anchorScroll();
                    }, 0)
                } catch (err) {
                    console.log(err);
                }
            }
        };
        $rootScope.$on("FetchParentProjects", function(event, data) {
            wlp.onLoadProject();
        });

        $rootScope.$on("FetchParentProduct", function(event, data) {
            $timeout(function() {
                $('#toggle-' + data.projectId).trigger('click');
                $anchorScroll();
            }, 0)
        });

        $rootScope.$on("UpdateParentProject", function(event, data) {
            var projectToUpdate = wlp.projects.filter(function(p) { return p.ID == data.projectId; });

            if (!projectToUpdate || !projectToUpdate[0]) {
                return;
            }
            projectToUpdate[0].Codes = data.projectCodes;
            StorageService.onSetToken(storageKey.wishlist + siteConfig.currentUserId, wlp.projects);
            wlp.onLoadProductVariantByCodes(projectToUpdate[0].ID)
        });

        wlp.onLoadProject = function() {
            var projectsFromToken = StorageService.onGetToken(storageKey.wishlist + siteConfig.currentUserId);
            wlp.isloading = true;
            if (projectsFromToken && !StorageService.isTokenExpired(storageKey.wishlist + siteConfig.currentUserId)) {
                var jsonData = JSON.parse(projectsFromToken);
                wlp.storagedProjects = JSON.parse(jsonData.value);
                this.projects = wlp.storagedProjects;
                wlp.isloading = false;
            } else {
                wlp.onFetchProjects();
            }
        };

        wlp.onFetchProjects = function() {
            wlp.isloading = true;

            $http.get(apiUrl.wishListGetAll + "?" + siteConfig.getTimeStamp()).then(function(response) {
                var projectDatas = response.data && response.data.Model && response.data.Model.Projects || wlp.projects;
                wlp.projects = projectDatas;
                wlp.storagedProjects = projectDatas;
                if (projectDatas && projectDatas.length > 0) {
                    StorageService.onSetToken(storageKey.wishlist + siteConfig.currentUserId, projectDatas);
                }

                $rootScope.$emit("FetchMiniWishlist", {});
                wlp.isloading = false;
            }).catch(function(err) {
                console.log(err);
                wlp.isloading = false;
            });
        };

        wlp.onChangeSortOrder = function(projectId, isUp) {
            var indexProject = -1;
            wlp.projects.some(function(prj, i) {
                if (prj.ID == projectId) {
                    indexProject = i;
                    return true;
                }
            });
            var current = wlp.projects[indexProject];
            var other = wlp.projects[isUp ? indexProject - 1 : indexProject + 1];
            var temp = current.SortOrder;
            current.SortOrder = other.SortOrder;
            other.SortOrder = temp;

            wlp.projects.sort(function(a, b) {
                return a.SortOrder - b.SortOrder;
            });

            wlp.isloading = true;
            $http.put(apiUrl.wishListReorderProject, wlp.projects).then(function(res) {
                wlp.onFetchProjects();
                wlp.isloading = false;
            }).catch(function(err) {
                console.log(err);
                wlp.isloading = false;
            });
        };

        wlp.productTimeout = null;

        wlp.onGetProductVariantByCodes = function(projectId) {
            if (wlp.productTimeout) {
                $timeout.cancel(wlp.productTimeout)
            }
            wlp.productTimeout = $timeout(function(params) {
                var currencyCode = CookieService.onGetCookie(storageKey.currencyCode);
                var projectInList = wlp.projects.filter(function(prj) { return prj.ID == projectId; });
                var project = projectInList && projectInList[0];
                if (!project) {
                    return;
                }
                project.isToggle = !project.isToggle;
                if (!project.isToggle) return;
                var productsFromStorage = StorageService.onGetToken(storageKey.productVariants + '__' + projectId + '__' + currencyCode);
                if (productsFromStorage && !StorageService.isTokenExpired(storageKey.productVariants + '__' + projectId + '__' + currencyCode)) {
                    var jsonData = JSON.parse(productsFromStorage);
                    project.Products = JSON.parse(jsonData.value);
                    $timeout(function() {
                        wlp.onRebindLazyImage();
                    }, 0)
                    return;
                } else {
                    project.Products = null;
                }

                if (project.Codes && project.Codes.length > 0) {
					wlp.isloading = true;
					$http.post(apiUrl.wishListGetProductVariantByCodes + '?langCode=' + siteConfig.langCode + '&projectID=' + project.ID, project.Codes).then(function (response) {
                        project.Products = response.data && response.data.Model;
                        if (project.Products && project.Products.length > 0) {
                            StorageService.onSetToken(storageKey.productVariants + '__' + projectId + '__' + currencyCode, project.Products);
                            $timeout(function() {
                                wlp.onRebindLazyImage();
                            }, 0)
                        }
                        wlp.isloading = false;
                    }).catch(function(err) {
                        console.log(err);
                        wlp.isloading = false;
                    });
                }
            }, 200)
        };

        wlp.onRebindLazyImage = function() {
            EventBindingService.onReloadImage();
        }

        wlp.onLoadProductVariantByCodes = function(projectId) {
            var currencyCode = CookieService.onGetCookie(storageKey.currencyCode);
            var projectInList = wlp.projects.filter(function(prj) { return prj.ID == projectId; });
            var project = projectInList && projectInList[0];
            if (!project) {
                return;
			}

            if (project.Codes && project.Codes.length > 0) {
                wlp.isloading = true;
				$http.post(apiUrl.wishListGetProductVariantByCodes + '?langCode=' + siteConfig.langCode + '&projectID=' + project.ID, project.Codes).then(function(response) {
                    project.Products = response.data && response.data.Model;
                    if (project.Products && project.Products.length > 0) {
                        StorageService.onSetToken(storageKey.productVariants + '__' + projectId + '__' + currencyCode, project.Products);
                    }

                    wlp.isloading = false;
                }).catch(function(err) {
                    console.log(err);
                    wlp.isloading = false;
                });
            } else {
                project.Products = [];
                StorageService.onRemoveToken(storageKey.productVariants + '__' + projectId + '__' + currencyCode);
            }
        };

        wlp.onDeleteProject = function(project) {
            var projectsStoraged = [];
            var projectsFromToken = StorageService.onGetToken(storageKey.wishlist + siteConfig.currentUserId);

            if (projectsFromToken && !StorageService.isTokenExpired(storageKey.wishlist + siteConfig.currentUserId)) {
                var jsonData = JSON.parse(projectsFromToken);
                projectsStoraged = JSON.parse(jsonData.value);
            }
            if (projectsStoraged && projectsStoraged.some(function (prj) { return prj.ID == project.ID; })) {
                var currencyCode = CookieService.onGetCookie(storageKey.currencyCode);

                var modelInstance = $uibModal.open({
                    animation: true,
                    windowClass: 'text-center',
                    templateUrl: 'confirmdialog.html',
                    controller: 'ConfirmDialogController',
                    resolve: {
                        actionName: function () { return wishListProductManipulateTexts.deleteProjectConfirm + ': ' + project.Name; },
                        actionTitle: function () { return ''; }
                    }
                });

                modelInstance.result.then(function(isConfirm) {
                    if (isConfirm) {
                        $http.delete(apiUrl.wishListRemoveProject + '?projectId=' + project.ID).then(function(res) {
                            StorageService.onRemoveToken(storageKey.productVariants + '__' + project.ID + '__' + currencyCode);
                            StorageService.onRemoveToken(storageKey.wishlist + siteConfig.currentUserId);
                            wlp.onFetchProjects();
                            $rootScope.$emit("FetchMiniWishlist", {});
                        }).catch(function(err) {
                            console.log(err);
                        });
                    }
                }, function() {});
            } else {
                var modelInstance = $uibModal.open({
                    animation: true,
                    windowClass: 'text-center',
                    templateUrl: 'informdialog.html',
                    controller: 'InformDialogController',
                    resolve: {
                        actionName: function () { return wishListProductManipulateTexts.deletedProjectInform.replace('{0}', project.Name); },
                        messages: function() { return []; }
                    }
                });
                modelInstance.result.then(function(isConfirm) {
                    if (isConfirm) {
                        wlp.onLoadProject();
                    }
                }, function() {
                    wlp.onLoadProject();
                });
            }
        };

        wlp.onShareProject = function(templateId, project) {
            var modelInstance = $uibModal.open({
                animation: true,
                windowClass: 'text-center',
                templateUrl: templateId,
                controller: 'WishlistSharingController',
                resolve: {
                    projectID: function() { return project.ID },
                    projectName: function() { return project.Name },
                }
            });

            modelInstance.result.then(function(isSuccess) {
                if (isSuccess) {
                    console.log('Shared!')
                }
            }, function() {});
        }

        wlp.onOpenCreateWishListPopup = function(templateId) {
            var modelInstance = $uibModal.open({
                animation: true,
                windowClass: 'text-center',
                templateUrl: templateId,
                controller: 'WishListCreateProjectController',
                controllerAs: 'wlc',
                resolve: {
                    projectSortOrder: function() { return wlp.projects.length == 0 ? 1 : Math.max.apply(Math, wlp.projects.map(function(project) { return project.SortOrder })) + 1; },
                }
            });

            modelInstance.result.then(function(isSuccess) {
                if (isSuccess) {
                    wlp.onFetchProjects();
                }
            }, function() {});
        };

        wlp.onProjectChange = function(project) {
            if (project.Name && project.Name.trim() == '') return;
            project.TempName = project.Name;
            project.Error = '';
        };

        wlp.onUpdateProjectName = function($event, project) {
            if (project && project.Name && project.Name != project.TempName && project.Name.trim() != '') {
                var projectExisting = "";

                if (wlp.storagedProjects && wlp.storagedProjects.some(function(prj) {
                        projectExisting = prj.Name;
                        return prj.ID != project.ID && prj.Name.toLowerCase() == project.Name.toLowerCase();
                    })) {
                    project.Error = 'Project name ' + projectExisting + ' already existed.';
                    project.Name = project.TempName;
                    $timeout(function() {
                        project.Error = '';
                    }, 5000);
                    return;
                }
                $http.put(apiUrl.wishListUpdateProjectName, project).then(function(res) {
                    wlp.onFetchProjects();
                }).catch(function(err) {
                    console.log(err);
                });
            } else {
                project.Name = project.TempName.trim();
                var target = $event.target;
                target.blur();
            }
        };

        wlp.trustAsHtml = function(string) {
            return $sce.trustAsHtml(string);
        };
    }
]);;
app.controller('WishlistSharingController', ['$http', '$scope', '$uibModalInstance', 'siteConfig', 'projectID', 'projectName',
    function ($http, $scope, $uibModalInstance, siteConfig, projectID, projectName) {

        $scope.ProjectID = projectID;
        $scope.ProjectName = projectName;

        $scope.loading = false;

        $scope.projectSharingModel = {
            ProjectID: projectID,
            Email: '',
            LanguageCode: siteConfig.langCode
        };


        $scope.onClose = function () {
            $uibModalInstance.close();
        };

        $scope.onConfirm = function () {
            $uibModalInstance.close(true);
        };

        $scope.onCancel = function () {
            $uibModalInstance.dismiss('cancel');
        };

        $scope.onShareProject = function ($form) {
            if ($form && $form.$invalid) { return; }
            $scope.loading = true;
            $http.post('/api/WishList/ShareProject', $scope.projectSharingModel).then(function (res) {
                $uibModalInstance.close(true);
                $scope.loading = false;
            }).catch(function (err) {
                console.log(err);
                $scope.loading = false;
            });
        };
    }]);;
function RoomDimensions() {
    var oneFootInMetre = 0.3048;
    var self = this;
    var lengthKey = "#txtLength";
    var widthKey = "#txtWidth";
    var heighthKey = "#txtHeight";
    self.unit = function () {
        return $('input[name="SizeUnit"]:checked').val();
    }
    function getValueOnBaseUnit(value) {
        if (self.unit() === "Imperial") {
            return (value / oneFootInMetre).toFixed(5);
        }

        return value;
    }
    self.setLength = function (value) { //value is in met
        value = getValueOnBaseUnit(value);
        $(lengthKey).val(value);
    }
    self.setWidth = function (value) {
        value = getValueOnBaseUnit(value);
        $(widthKey).val(value);
    }
    self.setHeight = function (value) {
        value = getValueOnBaseUnit(value);
        $(heighthKey).val(value);
    }
    self.lengthInMetre = function () {
        if (self.unit() === "Imperial") {
            return self.length() * oneFootInMetre;
        } else {
            return self.length();
        }
    }
    self.widthInMetre = function () {
        if (self.unit() === "Imperial") {
            return self.width() * oneFootInMetre;
        } else {
            return self.width();
        }
    }
    self.heightInMetre = function () {
        if (self.unit() === "Imperial") {
            return self.height() * oneFootInMetre;
        } else {
            return self.height();
        }
    }
    self.length = function () {
        return parseFloat($(lengthKey).val());
    }
    self.width = function () {
        return parseFloat($(widthKey).val());
    }
    self.height = function () {
        return parseFloat($(heighthKey).val());
    }
    self.getArea = function () {
        var s = (self.length() + self.width()) * self.height() * 2;
        if (self.unit() === 'Imperial') {
            s = s * oneFootInMetre * oneFootInMetre;
        }
        return s;
    }
}

function CalculationTool() {
    var self = this;
    self.roomSize = new RoomDimensions();
    self.calculatePaint = function (finish) {
        var coverage = 0;
        if (finish != undefined) {
            var s = self.roomSize.getArea();
            if (finish > 0) {
                coverage = 2 * (1.1) * s / finish;
            }
        }
        return coverage.toFixed(2);
    }

    self.calculateWallpaper = function (wW, wH, pattRepeat) {
        var rolls = 0;
        if (wH != undefined &&
            wW != undefined &&
            pattRepeat != undefined) {
            var N = ((wH / pattRepeat) - 1);
            var O = (self.roomSize.heightInMetre() / pattRepeat);
            var P = ((self.roomSize.widthInMetre() + self.roomSize.lengthInMetre()) / wW);
            rolls = 2 * (P * O / N);

        }
        return rolls.toFixed(2);
    }

    self.calculateWallpaperForHelleborus = function (wW, wH, pattRepeat) {
        var rolls = 0;
        if (wH != undefined &&
            wW != undefined &&
            pattRepeat != undefined) {
            var N = ((wH / pattRepeat));
            var O = (self.roomSize.heightInMetre() / pattRepeat);
            var P = ((self.roomSize.widthInMetre() + self.roomSize.lengthInMetre()) / wW);
            rolls = 2 * (P * O / N);

        }
        return rolls.toFixed(2);
    }

    self.coverageComparer = function(a, b) {
        return self.getCoverage(a) - self.getCoverage(b);
    }

    self.getCoverage = function(item) {
        return parseFloat($(item).data('volume'));
    }

    self.selectAmount = function(item, amount) {
        $(item).val(amount);
    }

    self.selectVariants = function() {
        var items = $('[data-volume]').toArray();
        var amount = parseFloat($('#Amount').val());
        self.chooseAmount(items, amount);
    }

    self.chooseAmount = function (items, amount, sorted) {
        if (sorted === undefined || sorted === false) {
            items.sort(self.coverageComparer);            
            sorted = true;
        }
        var item = items.pop();
        var itemAmount = self.getCoverage(item);
        var no = amount / itemAmount;
        
        if (items.length === 0) {
            amount = 0;
            no = Math.ceil(no);
        } else {
            no = Math.floor(no);
            amount = amount - (no * itemAmount);
        }

        self.selectAmount(item, no);               

        if (amount <= 0) return;

        //continue choose Amount
        self.chooseAmount(items, amount, sorted);
    }
}

var calculationTool = new CalculationTool();;
app.directive('addToBasket', ['$animate', '$compile', '$templateCache', function ($animate, $compile, $templateCache) {
    return {
        restrict: 'AE',
        replace: false,
        scope: {
            productCode: '@',
            productInfo: '=',
        },
        bindToController: {
            productCode: '@',
            productInfo: '=',
        },
        controller: ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'GoogleService',
            function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService, GoogleService) {
                var addToBasket = this;
                $scope.isLoading = false;
                addToBasket.$onInit = function () {
                }

                $scope.onAddToBasket = function () {
                    var itemToBasket = [];
                    if ($scope.productInfo) {

                        var itemCode = $scope.productCode;

                        if (itemCode === window.undefined) {
                            itemCode = $scope.productInfo.EntryCode;
                        }
                        itemToBasket.push({
                            Code: itemCode,
                            Quantity: 1,
                            IsUpdateOrAdd: false,
                            Name: $scope.productInfo.DisplayName
                        });
                    }

                    if (!itemToBasket.length) {
                        return;
                    }

                    $scope.isLoading = true;
                    $http.post(apiUrl.bspAddItemToBasket, itemToBasket).then(function (res) {
                        if (res.data && res.data.Success) {
                            $rootScope.$emit("FetchCartsOnHearder", {});
                            $rootScope.$emit("ShowAddToBasketInform", { productInfo: $scope.productInfo });

                            GoogleService.SetAddToBasketTrackingFromProductInfo($scope.productInfo);
                        } else {
                            var messages = [];

                            itemToBasket.map(function (item) {
                                if (res.data.Model[item.Code]) {
                                    messages.push(item.Name + ' ' + (res.data.Model[item.Code] && res.data.Model[item.Code].toString()));
                                }
                            });

                            if (messages && messages.length > 0) {
                                var modelInstance = $uibModal.open({
                                    animation: true,
                                    windowClass: 'text-center',
                                    templateUrl: 'informdialog.html',
                                    controller: 'InformDialogController',
                                    resolve: {
                                        actionName: function () { return ""; },
                                        messages: function () { return messages; },
                                    }
                                });
                                modelInstance.result.then(function (isConfirm) {
                                    if (isConfirm) {
                                    }
                                }, function () {
                                });
                            }
                        }
                        $scope.isLoading = false;
                    }).catch(function (err) {
                        console.log(err);
                        $scope.isLoading = false;
                    });
                }

                $scope.trustAsHtml = function (string) {
                    return $sce.trustAsHtml(string);
                };

            }],
        link: {
            post: function (scope, element, attrs) {
                element.on("click", function (event) {
                    scope.onAddToBasket();
                });
            }
        }
    };
}]);;
app.controller('BasketPageController', ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl', 'storageKey', 'StorageService', 'GoogleService', 'debounce',
    function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl, storageKey, StorageService, GoogleService, debounce) {
		var bsp = this;
		bsp.error = '';
		bsp.isloading = false;
		bsp.cartItems = [];
		bsp.cartTotalItems;
		bsp.cartTotalLitreage = "";
		bsp.cartTotalItemsCount = 0;
		bsp.isOpenConfirmDelete = false;
		bsp.delayToUpdate = delayToUpdate || 1000;
		bsp.isShowNotify = false;
		bsp.productAmended = "";
		bsp.promotionCode = "";
		bsp.promotionError = false;
		bsp.CouponCodes = [];
		bsp.itemsRemovedDueToRegionMessage = "";
		bsp.isShowNotifyItemRemoved = false;

		bsp.notifyTimeout = null;

		bsp.$onInit = function () {
			bsp.onLoadCarts();
		};

		bsp.onLoadCarts = function () {
			bsp.isloading = true;
			$http.get(apiUrl.bspGetCarts + '?isBasketPage=true&' + siteConfig.getTimeStamp()).then(function (response) {
				bsp.cartItems = response.data && response.data.Model && response.data.Model.Items || [];
				bsp.cartTotalItems = response.data && response.data.Model && response.data.Model.Totals || [];
				bsp.CouponCodes = response.data && response.data.Model && response.data.Model.CouponCodes || [];
				bsp.itemsRemovedDueToRegionMessage = response.data && response.data.Model && response.data.Model.ItemsRemovedDueToRegionMessage || "";
				bsp.cartTotalLitreage = response.data && response.data.Model && response.data.Model.TotalLitreage || "";
				bsp.HasShippingMethod = response.data && response.data.Model && response.data.Model.HasShippingMethod || false;
				bsp.cartTotalItemsCount = bsp.calculateTotalItemCount();
				bsp.isloading = false;
				if (!!bsp.itemsRemovedDueToRegionMessage) {
					bsp.onShowBasketNotification();
				}
			}).catch(function (err) {
				console.log(err);
				bsp.isloading = false;
			});
		};


		bsp.onShowBasketNotification = function () {
			bsp.isShowNotifyItemRemoved = true;
			$timeout(function () {
				bsp.itemsRemovedDueToRegionMessage = "";
				bsp.isShowNotifyItemRemoved = false;
				bsp.isloading = true;
				$http.post(apiUrl.bspResetRemovedItemsInCart).then(function (res) {
					bsp.isloading = false;
				}).catch(function (err) {
					console.log(err);
					bsp.isloading = false;
				});
			}, 5000);
		}

		bsp.onConfirmToDeleteItem = function (item) {
			if (!item) { return; }
		    
		    item.isOpenConfirmDelete = true;

		    $timeout(function () {
		        $("#item-"+ item.Code +' .remove-product-item button')[0].focus();
		    }, 50);
		   
		}

		bsp.onDeleteItem = function (item) {
			if (!item) { return; }

			bsp.isloading = true;
			$http.delete(apiUrl.bspDeleteItemCarts + '?code=' + item.Code).then(function (res) {
				bsp.onLoadCarts();
				bsp.isloading = false;
                $rootScope.$emit("FetchCartsOnHearder", {});
			    GoogleService.deleteItemFromCart(item);
			}).catch(function (err) {
				console.log(err);
				bsp.isloading = false;
			});
		}

        bsp.onChangeItemQuantity = function (item, quantityWasIncreased) {
			if (!item) { return; }
			var itemToUpdate = {
				Code: item.Code,
				Quantity: item.Qty,
				IsUpdateOrAdd: true
			};
			bsp.isloading = true;
			$http.post(apiUrl.bspAddOrUpdateLineItem, itemToUpdate).then(function (res) {
				if (res.data.Success) {
					bsp.onManipulateNotify(item.Name);
                    $rootScope.$emit("FetchCartsOnHearder", {});
				    GoogleService.changeCartQuantity(item, quantityWasIncreased);
				} else {

					var productName = item.VariantViewModel && item.VariantViewModel.DisplayName || item.Name;
					var modelInstance = $uibModal.open({
						animation: true,
						windowClass: 'empty-basket-modal',
						templateUrl: 'informdialog.html',
						controller: 'InformDialogController',
						resolve: {
							actionName: function () { return productName + ' ' + (res.data.Model[item.Code] && res.data.Model[item.Code].toString()); },
							messages: function () { return []; }
						}
					});
					modelInstance.result.then(function (isConfirm) {
						if (isConfirm) {
						}
					}, function () {
					});
				}
				bsp.isloading = false;
				bsp.onLoadCarts();
			}).catch(function (err) {
				console.log(err);
				bsp.isloading = false;
			});
		}

		bsp.onManipulateNotify = function (itemName) {
			bsp.productAmended = itemName;
			bsp.isShowNotify = true;
			if (bsp.notifyTimeout) {
				$timeout.cancel(bsp.notifyTimeout);
			}

			bsp.notifyTimeout = $timeout(function () {
				bsp.productAmended = "";
				bsp.isShowNotify = false;
			}, 3000);
		}

		var runDebounce = debounce(bsp.onChangeItemQuantity, bsp.delayToUpdate, false);

		bsp.onIncreaseItem = function (item) {
			if (!item) { return; }
			item.Qty += 1;
            runDebounce(item, true);
		}

		bsp.onDecreaseItem = function (item) {
			if (!item || item.Qty == 0) { return; }
			item.Qty -= 1;
            runDebounce(item, false);
		}

		bsp.onApplyPromotion = function () {
			if (!bsp.promotionCode) {
				return;
			}

			bsp.promotionError = false;
			bsp.isloading = true;
			$http.post(apiUrl.bspApplyPromotion + '?couponCode=' + bsp.promotionCode).then(function (response) {
				if (response.data.Success) {
					bsp.cartItems = response.data && response.data.Model && response.data.Model.Items || [];
					bsp.cartTotalItems = response.data && response.data.Model && response.data.Model.Totals || [];
					bsp.CouponCodes = response.data && response.data.Model && response.data.Model.CouponCodes || [];
					bsp.promotionCode = "";
				} else {
					bsp.promotionError = true;
				}
				bsp.isloading = false;
			}).catch(function (err) {
				console.log(err);
				bsp.isloading = false;
				bsp.promotionError = false;
			});
		}

		bsp.onRemovePromotion = function (coupon) {
			if (!coupon) {
				return;
			}

			bsp.isloading = true;
			$http.post(apiUrl.bspRemovePromotion + '?couponCode=' + coupon).then(function (response) {
				if (response.data.Success) {
					bsp.cartItems = response.data && response.data.Model && response.data.Model.Items || [];
					bsp.cartTotalItems = response.data && response.data.Model && response.data.Model.Totals || [];
					bsp.CouponCodes = response.data && response.data.Model && response.data.Model.CouponCodes || [];
				}
				bsp.isloading = false;
			}).catch(function (err) {
				console.log(err);
				bsp.isloading = false;
				bsp.promotionError = false;
			});
		}

		bsp.onCreateBVEvent = function (string) {
			BV.pixel.trackConversion({
				"type": "BuyNow",
				"label": "BasketPage",
			});
		};
	
		bsp.openEmptyBasketModal = function(title, content) {
			// open the empty basket confirmation modal
			var modelInstance = $uibModal.open({
				animation: true,
				windowClass: 'text-center empty-basket-modal',
				templateUrl: 'confirmdialog.html',
				controller: 'ConfirmDialogController',
				resolve: {
					actionName: function () { return content || '' },
					actionTitle: function () { return title || '' },
					messages: function () { return []; }
				}
			});
			modelInstance.result.then(function (isConfirm) {
				if (isConfirm) {
					bsp.removeAllBasketItems();
				}
			}, function () {
			});
		};

		bsp.removeAllBasketItems = function() {
			// remove all items from basket
			bsp.isloading = true;

			$http.post(apiUrl.bspEmptyBasket).then(function (response) {
				if (response.data.Success) {
					bsp.cartItems = response.data && response.data.Model && response.data.Model.Items || [];
					bsp.cartTotalItems = response.data && response.data.Model && response.data.Model.Totals || [];
					bsp.CouponCodes = response.data && response.data.Model && response.data.Model.CouponCodes || [];
					bsp.itemsRemovedDueToRegionMessage = response.data && response.data.Model && response.data.Model.ItemsRemovedDueToRegionMessage || "";
					bsp.HasShippingMethod = response.data && response.data.Model && response.data.Model.HasShippingMethod || false;
				}

				$rootScope.$emit("FetchCartsOnHearder", {});
				bsp.isloading = false;
			}).catch(function (err) {
				console.log(err);
				bsp.isloading = false;
			});
		};

		bsp.trustAsHtml = function (string) {
			return $sce.trustAsHtml(string);
		};

		bsp.addPrintDetails = function() {
			var now = new Date();
			var dateString = now.toLocaleDateString('en-GB', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
			var timeString = now.toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit', hour12: true });
			var userNameEl = document.getElementById('account-menu');
			var parentEl = document.getElementsByClassName('print-logo-img')[0];
			var contentWrapperEl = document.getElementsByClassName('print-basket-details')[0];

			if (!contentWrapperEl) {
				var contentWrapper = document.createElement('div');
				contentWrapper.className = 'print-basket-details';

				if (userNameEl) {
					var userName = userNameEl.getAttribute('data-login-mail');
					if (userName !== '') contentWrapper.innerHTML += '<span><strong>' + userName + '</strong></span>';
				}

				contentWrapper.innerHTML += '<span><strong>' + dateString + ' ' + timeString + '</strong></span>';

				if (parentEl) {
					parentEl.appendChild(contentWrapper);
				}
			}
		};

		bsp.printBasket = function () {
			window.print();
		};

		bsp.calculateTotalItemCount = function () {
			var total = 0;
			for (count = 0; count < bsp.cartItems.length; count++) {
				total += bsp.cartItems[count].Qty || 0;
			}
			return total;
		};

	}]);;
app.directive('miniBasket', ['$animate', '$compile', '$templateCache', function ($animate, $compile, $templateCache) {
    return {
        restrict: 'AE',
        replace: false,
        scope: {
            wrapClass: '='
        },
        bindToController: {
            wrapClass: '='
        },
        controller: ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl',
            function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl) {
                var miniBasket = this;

                $scope.isShowCart = false;

				miniBasket.$onInit = function () {
					if (!!$scope.wrapClass) {
						$rootScope.$on("FetchCartDatas", function (event, data) {
							$scope.cart = data && data.cart;
						});
					} else {
						$scope.onLoadCarts();
					}
                }
                $scope.onLoadCarts = function () {
                    $http.get(apiUrl.bspGetCarts + '?isBasketPage=false&' + siteConfig.getTimeStamp()).then(function (response) {
						$scope.cart = response.data.Model;
						$rootScope.$emit("FetchCartDatas", { cart: response.data.Model });
                    }).catch(function (err) {
                        console.log(err);
                    });
                };

                $rootScope.$on("FetchCartsOnHearder", function (event, data) {
                    $scope.onLoadCarts();
                });

                $scope.trustAsHtml = function (string) {
                    return $sce.trustAsHtml(string);
                };

            }],
        templateUrl: "minibasket.html",
        link: {
            post: function (scope, element, attrs) {
                element.on("click", function (event) {
                    scope.elementClicked = event.target;
                    $(document).on("click", onDocumentClick);
                    if (!$(event.target).parents('.mini-basket').length) {
                        $('body').toggleClass("no-scroll-basket");
                        $('.mini-basket').toggle('slow', function () { });
                    }
                });

                var onDocumentClick = function (event) {
                    if (scope.elementClicked === event.target || $(event.target).parents('.mini-basket').length) {
                        return;
                    }
                    scope.$apply(function () {
                        scope.isShowCart = false;
                        scope.isShowAddToBasketInform = false;
                        $('body').removeClass("no-scroll-basket");
                        $('.mini-basket').hide('slow', function () { });
                    });
                    $(document).off("click", onDocumentClick);
                };
            }
        }
    };
}]);;
app.directive('miniBasketInform', ['$animate', '$compile', '$templateCache', function ($animate, $compile, $templateCache) {
    return {
        restrict: 'AE',
        replace: false,
        scope: {
            wrapClass: '='
        },
        bindToController: {
            wrapClass: '='
        },
        controller: ['$http', '$scope', '$rootScope', '$uibModal', '$timeout', '$sce', '$anchorScroll', '$location', 'siteConfig', 'apiUrl',
			function ($http, $scope, $rootScope, $uibModal, $timeout, $sce, $anchorScroll, $location, siteConfig, apiUrl) {
			    var miniBasketInform = this;
			    $scope.productInfo = {};
			    $scope.isShowAddToBasketInform = false;
			    $scope.isLoadImageSuccess = false;

			    miniBasketInform.$onInit = function () {
			    }

			    $rootScope.$on("ShowAddToBasketInform", function (event, data) {
			        $scope.productInfo = data.productInfo;
			        if ($scope.showTimeout) { $timeout.cancel($scope.showTimeout) }
			        if ($scope.hiddenTimeout) { $timeout.cancel($scope.hiddenTimeout) }
					if (!$scope.productInfo.ContentType.includes('Paint')) {
			            $scope.$watch("isLoadImageSuccess", function (newValue, oldValue) {
			                if (newValue != oldValue && newValue == true || (newValue == oldValue && oldValue == true)) {
			                    $scope.onShowBasketInfo();
			                }
			            });
			        } else {
			            $scope.onShowBasketInfo();
			        }
			    });

			    $scope.onShowBasketInfo = function (isLoadImageSuccess) {
			        $scope.isShowAddToBasketInform = true;
			        $scope.showTimeout = $timeout(function () {
			            var $inFormContainer = $('.add-basket-inform');
			            $($inFormContainer).show(300);
			        });

			        $scope.hiddenTimeout = $timeout(function () {
			            var $inFormContainer = $('.add-basket-inform');
			            $($inFormContainer).hide(300);
			            $scope.isShowAddToBasketInform = false;
			            $scope.productInfo = {};
			            $scope.isLoadImageSuccess = false;
			        }, 3000);

			    }

			    $scope.onLoadImageSuccess = function () {
			        $scope.isLoadImageSuccess = true;
			    }

			    $scope.trustAsHtml = function (string) {
			        return $sce.trustAsHtml(string);
			    };

			}],
        templateUrl: "minibasketinform.html",
    };
}]);
;
