1 2 3/* ==== INCLUDE: /js/blocks.js ==== */ 4 5LazyLoad=function(a){function h(b,c){var e,d=a.createElement(b);for(e in c)c.hasOwnProperty(e)&&d.setAttribute(e,c[e]);return d}function i(a){var c,g,b=d[a];b&&(c=b.callback,g=b.urls,g.shift(),e=0,g.length||(c&&c.call(b.context,b.obj),d[a]=null,f[a].length&&k(a)))}function j(){var c=navigator.userAgent;b={async:a.createElement("script").async===!0},(b.webkit=/AppleWebKit\//.test(c))||(b.ie=/MSIE|Trident/.test(c))||(b.opera=/Opera/.test(c))||(b.gecko=/Gecko\//.test(c))||(b.unknown=!0)}function k(e,g,k,n,o){var s,t,u,v,w,x,p=function(){i(e)},q="css"===e,r=[];if(b||j(),g)if(g="string"==typeof g?[g]:g.concat(),q||b.async||b.gecko||b.opera)f[e].push({urls:g,callback:k,obj:n,context:o});else for(s=0,t=g.length;s<t;++s)f[e].push({urls:[g[s]],callback:s===t-1?k:null,obj:n,context:o});if(!d[e]&&(v=d[e]=f[e].shift())){for(c||(c=a.head||a.getElementsByTagName("head")[0]),w=v.urls.concat(),s=0,t=w.length;s<t;++s)x=w[s],q?u=b.gecko?h("style"):h("link",{href:x,rel:"stylesheet"}):(u=h("script",{src:x}),u.async=!1),u.className="lazyload",u.setAttribute("charset","utf-8"),b.ie&&!q&&"onreadystatechange"in u&&!("draggable"in u)?u.onreadystatechange=function(){/loaded|complete/.test(u.readyState)&&(u.onreadystatechange=null,p())}:q&&(b.gecko||b.webkit)?b.webkit?(v.urls[s]=u.href,m()):(u.innerHTML='@import "'+x+'";',l(u)):u.onload=u.onerror=p,r.push(u);for(s=0,t=r.length;s<t;++s)c.appendChild(r[s])}}function l(a){var b;try{b=!!a.sheet.cssRules}catch(c){return e+=1,void(e<200?setTimeout(function(){l(a)},50):b&&i("css"))}i("css")}function m(){var b,a=d.css;if(a){for(b=g.length;--b>=0;)if(g[b].href===a.urls[0]){i("css");break}e+=1,a&&(e<200?setTimeout(m,50):i("css"))}}var b,c,d={},e=0,f={css:[],js:[]},g=a.styleSheets;return{css:function(a,b,c,d){k("css",a,b,c,d)},js:function(a,b,c,d){k("js",a,b,c,d)}}}(this.document); 6 7window.nanoid=(t=21)=>{let e="",r=crypto.getRandomValues(new Uint8Array(t));for(;t--;){let n=63&r[t];e+=n<36?n.toString(36):n<62?(n-26).toString(36).toUpperCase():n<63?"_":"-"}return e}; 8 9!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(n=n||self).TypeIt=t()}(this,(function(){"use strict";function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n})(t)}var t={strings:[],speed:100,cursor:!0,cursorChar:"|",cursorSpeed:1e3,deleteSpeed:null,lifeLike:!0,breakLines:!0,startDelay:250,startDelete:!1,nextStringDelay:750,loop:!1,loopDelay:750,html:!0,waitUntilVisible:!1,beforeString:function(){},afterString:function(){},beforeStep:function(){},afterStep:function(){},afterComplete:function(){}},e=function(n){return n.map((function(n){return void 0===n[1]&&n.push(null),void 0===n[2]&&n.push({}),n}))},r=function(n,t){return Object.assign({},n,t)},i=function(n){return Array.isArray(n)},o=function(n,t){return n[2]=r(n[2],t)||t,n},u=function(n,t){return i(n[0])?n.map((function(n){return o(n,t)})):o(n,t)},c=function(n,t,e,r){r=r||!1,e=e||{};var o=!i(n),c=n.length;return(n=o?new Array(n).fill(0):n).map((function(n,i){if(o)return t;var a=[t,n,e];return r&&(0===i&&(a=u(a,{isFirst:!0})),i+1===c&&(a=u(a,{isLast:!0}))),a}))};function a(n){this.insert=function(n,e){t.splice(n,0,e)},this.add=function(n,u,a){return n=i(n)?n:[n,null],a=a||!1,u=u||1,i(n[0])||(n=c(u,n)),n=e(n).map((function(n){return n[2]=r(n[2],{id:o}),o++,n})),t=a?n.concat(t):t.concat(n),this},this.set=function(n,e){t[n]=e},this.reset=function(){t=t.map((function(n){return n[2].executed=!1,n}))},this.getItems=function(){return(t=e(t)).filter((function(n){return!n[2].executed}))},this.setMeta=function(n,e){var i=t.findIndex((function(t){return t[2].id===n}));t[i][2]=r(t[i][2],e)};var t=[],o=0;this.add(n)}var f=function(n){return Array.from(n)},s=function(n){var t=[];return t.concat.apply(t,n)},l=function(n){var t=document.implementation.createHTMLDocument("");return t.body.innerHTML=n,t.body},d=function n(t,e,r){e=e||null,r=void 0!==r&&r;var i=f(t.childNodes).map((function(t){return 3===(e=t).nodeType||"BR"===e.tagName?t:n(t);var e}));return i=s(i),e&&(i=i.filter((function(n){return!e.contains(n)}))),r?i.reverse():i},p=function(n){return"BODY"===n.tagName},h=function(n,t){t=t||null;var e=n instanceof HTMLElement;return{node:t,isTopLevelText:(!t||p(t.parentNode))&&!e,isHTMLElement:e,content:n}};function v(n){var t,e=l(n);return t=d(e).map((function(n){return n.nodeValue?f(n.nodeValue).map((function(t){return h(t,n)})):h(n)})),s(t)}function y(n,t){return(t=void 0===t||t)?v(n):f(n).map((function(n){return h(n)}))}var m=function(n){return document.createElement(n)},g=function(n,t){var e=m("style");e.id=t||"",e.appendChild(document.createTextNode(n)),document.head.appendChild(e)},b=function(n){return i(n)||(n=[n/2,n/2]),{before:n[0],after:n[1],total:n[0]+n[1]}},S=function(n,t){return Math.abs(Math.random()*(n+t-(n-t))+(n-t))};var N=function(n){return["textarea","input"].indexOf(n.tagName.toLowerCase())>-1},T=function(n,t){var e=t.querySelectorAll("*");return[t].concat(f(e).reverse()).find((function(t){return t.cloneNode().outerHTML===n.outerHTML}))},L=function(n,t,e,r){e=e||null;var i=t.isHTMLElement,o=i?t.content:document.createTextNode(t.content);if(N(n))n.value="".concat(n.value).concat(t.content);else{if(!t.isTopLevelText&&!i){var u=t.node.parentNode,c=T(u.cloneNode(),n);if(function(n,t){if(!n)return!1;var e=n.nextSibling;return!e||e.isEqualNode(t)}(c,e))n=c;else if((o=u.cloneNode()).innerText=t.content,!p(u.parentNode)){for(var a=u.parentNode,f=a.cloneNode(),s=T(f,n);!s&&!p(a);)f.innerHTML=o.outerHTML,o=f,f=a.parentNode.cloneNode(),a=a.parentNode,s=T(f,n);n=s||n}}var l=d(n,e,!0)[r-1],h=l?l.parentNode:n;h.insertBefore(o,h.contains(e)?e:null)}},M=function(n){var t;return null==n||null===(t=n.parentNode)||void 0===t?void 0:t.removeChild(n)};var x=function(n,t,e){var r,i="string"==typeof n,o=!1,u=-1*n;return i&&(u=(r="END"===n.toUpperCase())?-1:1,o=r?t+u>0:t+u<e.length),{isString:i,numberOfSteps:u,canKeepMoving:o}},w=function(n){var t,e=["font","lineHeight","color"],r=m("SPAN"),i=(t=n,window.getComputedStyle(t,null));for(var o in i)e.indexOf(o)>-1&&i[o]&&(r.style[o]=i[o]);return r.style.cssText};
9function D(n,t,e){return e?t?t(n):n:(n&&n.then||(n=Promise.resolve(n)),t?n.then(t):n)}function H(n){return function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];try{return Promise.resolve(n.apply(this,t))}catch(n){return Promise.reject(n)}}}function E(){}function C(n,t){if(!t)return n&&n.then?n.then(E):Promise.resolve()}function A(n,t){var e=n();return e&&e.then?e.then(t):t(e)}function k(n,t,e){if(!n.s){if(e instanceof O){if(!e.s)return void(e.o=k.bind(null,n,t));1&t&&(t=e.s),e=e.v}if(e&&e.then)return void e.then(k.bind(null,n,t),k.bind(null,n,2));n.s=t,n.v=e;var r=n.o;r&&r(n)}}var O=function(){function n(){}return n.prototype.then=function(t,e){var r=new n,i=this.s;if(i){var o=1&i?t:e;if(o){try{k(r,1,o(this.v))}catch(n){k(r,2,n)}return r}return this}return this.o=function(n){try{var i=n.v;1&n.s?k(r,1,t?t(i):i):e?k(r,1,e(i)):k(r,2,i)}catch(n){k(r,2,n)}},r},n}();function P(n,t){return n&&n.then?n.then(t):t(n)}return function(e,o){var u=this,s=this;o=o||{};var p=function(n,t,e){return n=i(n[0])?n:[n],an.add(n,t),function(n){var t=(n=n||{}).delay;t&&an.add([U,t])}(e),s},T=function(t){return t="object"===n(t)?t:{},[[Q,t,{force:!0}],[Q,en,{force:!0}]]},z=function(){return X?f(W.value):d(W,fn,!0)},B=function(n,t){t=t||1;var e=en.nextStringDelay;an.insert(n,[U,e.before]),an.insert(n+t+1,[U,e.after])},I=H((function(){if(fn){var n="[data-typeit-id='".concat(cn,"'] .ti-cursor");g("@keyframes blink-".concat(cn," { 0% {opacity: 0} 49% {opacity: 0} 50% {opacity: 1} } ").concat(n," { animation: blink-").concat(cn," ").concat(en.cursorSpeed/1e3,"s infinite; } ").concat(n,".with-delay { animation-delay: 500ms; } ").concat(n,".disabled { animation: none; }"),cn),W.appendChild(fn);var t="loaded"===document.fonts.status;return D(t||document.fonts.ready,(function(n){var t=fn.getBoundingClientRect().width/2;fn.style.margin="0 -".concat(t+2,"px 0 -").concat(t-2,"px")}),t)}})),R=function(n){fn&&(fn.classList.toggle("disabled",n),fn.classList.toggle("with-delay",!n))},q=H((function(n,t){return $.push(setTimeout(n,t)),D()})),j=H((function(n){var t=_;return D(t&&F(_),(function(t){return an.reset(),an.set(0,[U,n.before]),C(G(!0))}),!t)})),V=H((function(){tn.started=!0;var n,t=an.getItems();return P(function(n,t){try{var e=n()}catch(n){return t(n)}return e&&e.then?e.then(void 0,t):e}((function(){return P(function(n,t,e){var r,i,o=-1;return function u(c){try{for(;++o<n.length&&(!e||!e());)if((c=t(o))&&c.then){if(!((a=c)instanceof O&&1&a.s))return void c.then(u,i||(i=k.bind(null,r=new O,2)));c=c.v}r?k(r,1,c):r=c}catch(n){k(r||(r=new O),2,n)}var a}(),r}(t,(function(e){if(tn.frozen||tn.destroyed)throw"";var r,i,o,c,a=t[e],f=a[2];return n=[a,u],f.freezeCursor&&R(!0),r=en.speed,i=en.deleteSpeed,o=en.lifeLike,c=(i=null!==i?i:r/3)/2,Z=o?[S(r,r/2),S(i,c)]:[r,i],A((function(){var t;if(null==f?void 0:f.isFirst)return C((t=en).beforeString.apply(t,n))}),(function(){var t;return D((t=en).beforeStep.apply(t,n),(function(){return D(a[0].call(u,a[1],f),(function(){return A((function(){var t,e;if(null===(t=a[2])||void 0===t?void 0:t.isLast)return C((e=en).afterString.apply(e,n))}),(function(){var t;return D((t=en).afterStep.apply(t,n),(function(){an.setMeta(f.id,{executed:!0}),R(!1)}))}))}))}))}))}),(function(){return!1})),(function(t){var e;return tn.completed=!0,D((e=en).afterComplete.apply(e,n),(function(){if(!en.loop)throw"";var n=en.loopDelay;q((function(){return D(j(n),(function(){V()}))}),n.after)}))}))}),E),(function(n){return u}))})),U=function(n){return new Promise((function(t){q((function(){return t()}),n||0)}))},F=function n(t){var e=z(),r=x(t,_,e);return _+=r.numberOfSteps,new Promise((function(t){q(H((function(){return function(n,t,e,r){if(e){var i=r,o=t[(i=i>t.length?t.length:i)-1];(n=o?o.parentNode:n).insertBefore(e,o||null)}}(W,z(),fn,_),A((function(){if(r.isString&&r.canKeepMoving)return C(n(r.numberOfSteps>0?"START":"END"))}),(function(){return t()}))})),Z[0])}))},K=function(n){return new Promise((function(t){q((function(){return L(W,n,fn,_),t()}),Z[0])}))},Q=H((function(n){en=r(en,n)})),Y=H((function(){X?W.value="":z().forEach((function(n){M(n)}))})),G=function n(t){return t=!0===t,new Promise((function(e){q(H((function(){var r=!1,i=z();return i.length&&(X?W.value=W.value.slice(0,-1):M(i[_])),f(W.querySelectorAll("*")).forEac
9h((function(n){if(!n.innerHTML&&"BR"!==n.tagName){for(var t=n;1===t.parentNode.childNodes.length&&t.parentNode.childNodes[0].isEqualNode(t);)t=t.parentNode;M(t)}})),A((function(){if(t&&i.length-1>0)return D(n(!0),(function(){return r=!0,e()}))}),(function(n){return r?n:e()}))})),Z[1])}))};this.break=function(n){return p([K,h(m("BR"))],1,n)},this.delete=function(n,t){var e=T(t);return p([e[0]].concat([].concat(Array(Math.abs(n)||1)).fill().map((function(){return[G,!n,nn]})),[e[1]]),1,t)},this.empty=function(){return p(Y,1,arguments)},this.exec=function(n,t){var e=T(t);return p([e[0],[n,null],e[1]],1,t)},this.move=function(n,t){var e=x(n,_,z()),r=T(t),i=e.isString?n:Math.sign(n);return p([r[0]].concat([].concat(Array(Math.abs(n)||1)).fill().map((function(){return[F,i,nn]})),[r[1]]),1,t)},this.options=function(n){return p([Q,n],1,n)},this.pause=function(n,t){return p([U,n],1,t)},this.type=function(n,t){var e=T(t),r=y(n,en.html),i=[e[0]].concat(c(r,K,nn,!0),[e[1]]);return p(i,1,t)},this.is=function(n){return tn[n]},this.destroy=function(n){n=void 0===n||n,$.forEach((function(n){clearTimeout(n)})),$=[],n&&M(fn),tn.destroyed=!0},this.freeze=function(){tn.frozen=!0},this.unfreeze=function(){tn.frozen=!1,V()},this.reset=function(){for(var n in!this.is("destroyed")&&this.destroy(),an.reset(),_=0,tn)tn[n]=!1;return X?W.value="":W.innerHTML="",this},this.go=function(){return tn.started?this:(I(),en.waitUntilVisible?(function(n,t){new IntersectionObserver((function(e,r){e.forEach((function(e){e.isIntersecting&&(t(),r.unobserve(n))}))}),{threshold:1}).observe(n)}(W,V.bind(this)),this):(V(),this))},this.getQueue=function(){return an},this.getOptions=function(){return en},this.getElement=function(){return W};var J,W="string"==typeof(J=e)?document.querySelector(J):J,X=N(W),Z=[],$=[],_=0,nn={freezeCursor:!0},tn={started:!1,completed:!1,frozen:!1,destroyed:!1},en=r(t,o);en=r(en,{html:!X&&en.html,nextStringDelay:b(en.nextStringDelay),loopDelay:b(en.loopDelay)});var rn,on,un,cn=Math.random().toString().substring(2,9),an=new a([U,en.startDelay]);W.setAttribute("data-typeit-id",cn),g("[data-typeit-id]:before {content: '.'; display: inline-block; width: 0; visibility: hidden;}[data-typeit-id]"),en.strings=(un=en.strings,rn=i(un)?un:[un],(on=function(n){return n.innerHTML.replace(/<\!--.*?-->/g,"").trim()}(W))?(W.innerHTML="",en.startDelete?(v(on).forEach((function(n){L(W,n,fn,_)})),an.add([G,!0]),B(1),rn):[on.trim()].concat(rn)):rn);var fn=function(){if(X||!en.cursor)return null;var n=m("span");return n.innerHTML=l(en.cursorChar).innerHTML,n.className="ti-cursor",n.style.cssText="display:inline;".concat(w(W)),n}();en.strings.length&&function(){var n=en.strings.filter((function(n){return!!n}));n.forEach((function(t,e){var r=y(t,en.html);an.add(c(r,K,nn,!0));var i=an.getItems().length;if(e+1!==n.length){if(en.breakLines){var o=h(m("BR"));return an.add([K,o,nn]),void B(i)}an.add(c(r,G,nn)),B(i,t.length)}}))}()}})); 10 11!function(){"use strict";function o(){var o=window,t=document;if(!("scrollBehavior"in t.documentElement.style&&!0!==o.__forceSmoothScrollPolyfill__)){var l,e=o.HTMLElement||o.Element,r=468,i={scroll:o.scroll||o.scrollTo,scrollBy:o.scrollBy,elementScroll:e.prototype.scroll||n,scrollIntoView:e.prototype.scrollIntoView},s=o.performance&&o.performance.now?o.performance.now.bind(o.performance):Date.now,c=(l=o.navigator.userAgent,new RegExp(["MSIE ","Trident/","Edge/"].join("|")).test(l)?1:0);o.scroll=o.scrollTo=function(){void 0!==arguments[0]&&(!0!==f(arguments[0])?h.call(o,t.body,void 0!==arguments[0].left?~~arguments[0].left:o.scrollX||o.pageXOffset,void 0!==arguments[0].top?~~arguments[0].top:o.scrollY||o.pageYOffset):i.scroll.call(o,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:o.scrollX||o.pageXOffset,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:o.scrollY||o.pageYOffset))},o.scrollBy=function(){void 0!==arguments[0]&&(f(arguments[0])?i.scrollBy.call(o,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:0,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:0):h.call(o,t.body,~~arguments[0].left+(o.scrollX||o.pageXOffset),~~arguments[0].top+(o.scrollY||o.pageYOffset)))},e.prototype.scroll=e.prototype.scrollTo=function(){if(void 0!==arguments[0])if(!0!==f(arguments[0])){var o=arguments[0].left,t=arguments[0].top;h.call(this,this,void 0===o?this.scrollLeft:~~o,void 0===t?this.scrollTop:~~t)}else{if("number"==typeof arguments[0]&&void 0===arguments[1])throw new SyntaxError("Value could not be converted");i.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left:"object"!=typeof arguments[0]?~~arguments[0]:this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top:void 0!==arguments[1]?~~arguments[1]:this.scrollTop)}},e.prototype.scrollBy=function(){void 0!==arguments[0]&&(!0!==f(arguments[0])?this.scroll({left:~~arguments[0].left+this.scrollLeft,top:~~arguments[0].top+this.scrollTop,behavior:arguments[0].behavior}):i.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left+this.scrollLeft:~~arguments[0]+this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top+this.scrollTop:~~arguments[1]+this.scrollTop))},e.prototype.scrollIntoView=function(){if(!0!==f(arguments[0])){var l=function(o){for(;o!==t.body&&!1===(e=p(l=o,"Y")&&a(l,"Y"),r=p(l,"X")&&a(l,"X"),e||r);)o=o.parentNode||o.host;var l,e,r;return o}(this),e=l.getBoundingClientRect(),r=this.getBoundingClientRect();l!==t.body?(h.call(this,l,l.scrollLeft+r.left-e.left,l.scrollTop+r.top-e.top),"fixed"!==o.getComputedStyle(l).position&&o.scrollBy({left:e.left,top:e.top,behavior:"smooth"})):o.scrollBy({left:r.left,top:r.top,behavior:"smooth"})}else i.scrollIntoView.call(this,void 0===arguments[0]||arguments[0])}}function n(o,t){this.scrollLeft=o,this.scrollTop=t}function f(o){if(null===o||"object"!=typeof o||void 0===o.behavior||"auto"===o.behavior||"instant"===o.behavior)return!0;
11if("object"==typeof o&&"smooth"===o.behavior)return!1;throw new TypeError("behavior member of ScrollOptions "+o.behavior+" is not a valid value for enumeration ScrollBehavior.")}function p(o,t){return"Y"===t?o.clientHeight+c<o.scrollHeight:"X"===t?o.clientWidth+c<o.scrollWidth:void 0}function a(t,l){var e=o.getComputedStyle(t,null)["overflow"+l];return"auto"===e||"scroll"===e}function d(t){var l,e,i,c,n=(s()-t.startTime)/r;c=n=n>1?1:n,l=.5*(1-Math.cos(Math.PI*c)),e=t.startX+(t.x-t.startX)*l,i=t.startY+(t.y-t.startY)*l,t.method.call(t.scrollable,e,i),e===t.x&&i===t.y||o.requestAnimationFrame(d.bind(o,t))}function h(l,e,r){var c,f,p,a,h=s();l===t.body?(c=o,f=o.scrollX||o.pageXOffset,p=o.scrollY||o.pageYOffset,a=i.scroll):(c=l,f=l.scrollLeft,p=l.scrollTop,a=n),d({scrollable:c,method:a,startTime:h,startX:f,startY:p,x:e,y:r})}}"object"==typeof exports&&"undefined"!=typeof module?module.exports={polyfill:o}:o()}(); 12/** 13 * @popperjs/core v2.4.4 - MIT License 14 */ 15 16"use strict";!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).Popper={})}(this,(function(e){function t(e){return{width:(e=e.getBoundingClientRect()).width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function n(e){return"[object Window]"!==e.toString()?(e=e.ownerDocument)?e.defaultView:window:e}function r(e){return{scrollLeft:(e=n(e)).pageXOffset,scrollTop:e.pageYOffset}}function o(e){return e instanceof n(e).Element||e instanceof Element}function i(e){return e instanceof n(e).HTMLElement||e instanceof HTMLElement}function a(e){return e?(e.nodeName||"").toLowerCase():null}function s(e){return(o(e)?e.ownerDocument:e.document).documentElement}function f(e){return t(s(e)).left+r(e).scrollLeft}function c(e){return n(e).getComputedStyle(e)}function p(e){return e=c(e),/auto|scroll|overlay|hidden/.test(e.overflow+e.overflowY+e.overflowX)}function l(e,o,c){void 0===c&&(c=!1);var l=s(o);e=t(e);var u=i(o),d={scrollLeft:0,scrollTop:0},m={x:0,y:0};return(u||!u&&!c)&&(("body"!==a(o)||p(l))&&(d=o!==n(o)&&i(o)?{scrollLeft:o.scrollLeft,scrollTop:o.scrollTop}:r(o)),i(o)?((m=t(o)).x+=o.clientLeft,m.y+=o.clientTop):l&&(m.x=f(l))),{x:e.left+d.scrollLeft-m.x,y:e.top+d.scrollTop-m.y,width:e.width,height:e.height}}function u(e){return{x:e.offsetLeft,y:e.offsetTop,width:e.offsetWidth,height:e.offsetHeight}}function d(e){return"html"===a(e)?e:e.assignedSlot||e.parentNode||e.host||s(e)}function m(e,t){void 0===t&&(t=[]);var r=function e(t){return 0<=["html","body","#document"].indexOf(a(t))?t.ownerDocument.body:i(t)&&p(t)?t:e(d(t))}(e);e="body"===a(r);var o=n(r);return r=e?[o].concat(o.visualViewport||[],p(r)?r:[]):r,t=t.concat(r),e?t:t.concat(m(d(r)))}function h(e){if(!i(e)||"fixed"===c(e).position)return null;if(e=e.offsetParent){var t=s(e);if("body"===a(e)&&"static"===c(e).position&&"static"!==c(t).position)return t}return e}function g(e){for(var t=n(e),r=h(e);r&&0<=["table","td","th"].indexOf(a(r))&&"static"===c(r).position;)r=h(r);if(r&&"body"===a(r)&&"static"===c(r).position)return t;if(!r)e:{for(e=d(e);i(e)&&0>["html","body"].indexOf(a(e));){if("none"!==(r=c(e)).transform||"none"!==r.perspective||r.willChange&&"auto"!==r.willChange){r=e;break e}e=e.parentNode}r=null}return r||t}function b(e){var t=new Map,n=new Set,r=[];return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||function e(o){n.add(o.name),[].concat(o.requires||[],o.requiresIfExists||[]).forEach((function(r){n.has(r)||(r=t.get(r))&&e(r)})),r.push(o)}(e)})),r}function v(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}function y(e){return e.split("-")[0]}function O(e,t){var n=!(!t.getRootNode||!t.getRootNode().host);if(e.contains(t))return!0;if(n)do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function x(e){return Object.assign(Object.assign({},e),{},{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function w(e,o){if("viewport"===o){o=n(e);var a=s(e);
16o=o.visualViewport;var p=a.clientWidth;a=a.clientHeight;var l=0,u=0;o&&(p=o.width,a=o.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(l=o.offsetLeft,u=o.offsetTop)),e=x(e={width:p,height:a,x:l+f(e),y:u})}else i(o)?((e=t(o)).top+=o.clientTop,e.left+=o.clientLeft,e.bottom=e.top+o.clientHeight,e.right=e.left+o.clientWidth,e.width=o.clientWidth,e.height=o.clientHeight,e.x=e.left,e.y=e.top):(u=s(e),e=s(u),l=r(u),o=u.ownerDocument.body,p=Math.max(e.scrollWidth,e.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),a=Math.max(e.scrollHeight,e.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),u=-l.scrollLeft+f(u),l=-l.scrollTop,"rtl"===c(o||e).direction&&(u+=Math.max(e.clientWidth,o?o.clientWidth:0)-p),e=x({width:p,height:a,x:u,y:l}));return e}function j(e,t,n){return t="clippingParents"===t?function(e){var t=m(d(e)),n=0<=["absolute","fixed"].indexOf(c(e).position)&&i(e)?g(e):e;return o(n)?t.filter((function(e){return o(e)&&O(e,n)&&"body"!==a(e)})):[]}(e):[].concat(t),(n=(n=[].concat(t,[n])).reduce((function(t,n){return n=w(e,n),t.top=Math.max(n.top,t.top),t.right=Math.min(n.right,t.right),t.bottom=Math.min(n.bottom,t.bottom),t.left=Math.max(n.left,t.left),t}),w(e,n[0]))).width=n.right-n.left,n.height=n.bottom-n.top,n.x=n.left,n.y=n.top,n}function M(e){return 0<=["top","bottom"].indexOf(e)?"x":"y"}function E(e){var t=e.reference,n=e.element,r=(e=e.placement)?y(e):null;e=e?e.split("-")[1]:null;var o=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2;switch(r){case"top":o={x:o,y:t.y-n.height};break;case"bottom":o={x:o,y:t.y+t.height};break;case"right":o={x:t.x+t.width,y:i};break;case"left":o={x:t.x-n.width,y:i};break;default:o={x:t.x,y:t.y}}if(null!=(r=r?M(r):null))switch(i="y"===r?"height":"width",e){case"start":o[r]=Math.floor(o[r])-Math.floor(t[i]/2-n[i]/2);break;case"end":o[r]=Math.floor(o[r])+Math.ceil(t[i]/2-n[i]/2)}return o}function D(e){return Object.assign(Object.assign({},{top:0,right:0,bottom:0,left:0}),e)}function P(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function k(e,n){void 0===n&&(n={});var r=n;n=void 0===(n=r.placement)?e.placement:n;var i=r.boundary,a=void 0===i?"clippingParents":i,f=void 0===(i=r.rootBoundary)?"viewport":i;i=void 0===(i=r.elementContext)?"popper":i;var c=r.altBoundary,p=void 0!==c&&c;r=D("number"!=typeof(r=void 0===(r=r.padding)?0:r)?r:P(r,q));var l=e.elements.reference;c=e.rects.popper,a=j(o(p=e.elements[p?"popper"===i?"reference":"popper":i])?p:p.contextElement||s(e.elements.popper),a,f),p=E({reference:f=t(l),element:c,strategy:"absolute",placement:n}),c=x(Object.assign(Object.assign({},c),p)),f="popper"===i?c:f;
16var u={top:a.top-f.top+r.top,bottom:f.bottom-a.bottom+r.bottom,left:a.left-f.left+r.left,right:f.right-a.right+r.right};if(e=e.modifiersData.offset,"popper"===i&&e){var d=e[n];Object.keys(u).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";u[e]+=d[n]*t}))}return u}function L(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function B(e){void 0===e&&(e={});var t=e.defaultModifiers,n=void 0===t?[]:t,r=void 0===(e=e.defaultOptions)?V:e;return function(e,t,i){function a(){f.forEach((function(e){return e()})),f=[]}void 0===i&&(i=r);var s={placement:"bottom",orderedModifiers:[],options:Object.assign(Object.assign({},V),r),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},f=[],c=!1,p={state:s,setOptions:function(i){return a(),s.options=Object.assign(Object.assign(Object.assign({},r),s.options),i),s.scrollParents={reference:o(e)?m(e):e.contextElement?m(e.contextElement):[],popper:m(t)},i=function(e){var t=b(e);return N.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}(function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign(Object.assign(Object.assign({},n),t),{},{options:Object.assign(Object.assign({},n.options),t.options),data:Object.assign(Object.assign({},n.data),t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}([].concat(n,s.options.modifiers))),s.orderedModifiers=i.filter((function(e){return e.enabled})),s.orderedModifiers.forEach((function(e){var t=e.name,n=e.options;n=void 0===n?{}:n,"function"==typeof(e=e.effect)&&(t=e({state:s,name:t,instance:p,options:n}),f.push(t||function(){}))})),p.update()},forceUpdate:function(){if(!c){var e=s.elements,t=e.reference;if(L(t,e=e.popper))for(s.rects={reference:l(t,g(e),"fixed"===s.options.strategy),popper:u(e)},s.reset=!1,s.placement=s.options.placement,s.orderedModifiers.forEach((function(e){return s.modifiersData[e.name]=Object.assign({},e.data)})),t=0;t<s.orderedModifiers.length;t++)if(!0===s.reset)s.reset=!1,t=-1;else{var n=s.orderedModifiers[t];e=n.fn;var r=n.options;r=void 0===r?{}:r,n=n.name,"function"==typeof e&&(s=e({state:s,options:r,name:n,instance:p})||s)}}},update:v((function(){return new Promise((function(e){p.forceUpdate(),e(s)}))})),destroy:function(){a(),c=!0}};return L(e,t)?(p.setOptions(i).then((function(e){!c&&i.onFirstUpdate&&i.onFirstUpdate(e)})),p):p}}function W(e){var t,r=e.popper,o=e.popperRect,i=e.placement,a=e.offsets,f=e.position,c=e.gpuAcceleration,p=e.adaptive,l=window.devicePixelRatio||1;e=Math.round(a.x*l)/l||0,l=Math.round(a.y*l)/l||0;var u=a.hasOwnProperty("x");a=a.hasOwnProperty("y");var d,m="left",h="top",b=window;if(p){var v=g(r);v===n(r)&&(v=s(r)),"top"===i&&(h="bottom",l-=v.clientHeight-o.height,l*=c?1:-1),"left"===i&&(m="right",e-=v.clientWidth-o.width,e*=c?1:-1)}return r=Object.assign({position:f},p&&_),c?Object.assign(Object.assign({},r),{},((d={})[h]=a?"0":"",d[m]=u?"0":"",d.transform=2>(b.devicePixelRatio||1)?"translate("+e+"px, "+l+"px)":"translate3d("+e+"px, "+l+"px, 0)",d)):Object.assign(Object.assign({},r),{},((t={})[h]=a?l+"px":"",t[m]=u?e+"px":"",t.transform="",t))}function A(e){return e.replace(/left|right|bottom|top/g,(function(e){return U[e]}))}function H(e){return e.replace(/start|end/g,(function(e){return z[e]}))}function T(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function R(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var q=["top","bottom","right","left"],C=q.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),S=[].concat(q,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),N="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),V={placement:"bottom",modifiers:[],strategy:"absolute"},I={passive:!0},_={top:"auto",right:"auto",bottom:"auto",left:"auto"}
16,U={left:"right",right:"left",bottom:"top",top:"bottom"},z={start:"end",end:"start"},F=[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,r=e.instance,o=(e=e.options).scroll,i=void 0===o||o,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",r.update,I)})),a&&s.addEventListener("resize",r.update,I),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",r.update,I)})),a&&s.removeEventListener("resize",r.update,I)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=E({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e,n=void 0===(n=n.adaptive)||n,e={placement:y(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign(Object.assign({},t.styles.popper),W(Object.assign(Object.assign({},e),{},{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign(Object.assign({},t.styles.arrow),W(Object.assign(Object.assign({},e),{},{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1})))),t.attributes.popper=Object.assign(Object.assign({},t.attributes.popper),{},{"data-popper-placement":t.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];i(o)&&a(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(r)&&a(r)&&(Object.assign(r.style,e),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,r=void 0===(e=e.options.offset)?[0,0]:e,o=(e=S.reduce((function(e,n){var o=t.rects,i=y(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof r?r(Object.assign(Object.assign({},o),{},{placement:n})):r;return o=(o=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:o}:{x:o,y:s},e[n]=i,e}),{}))[t.placement],i=o.x;o=o.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=o),t.modifiersData[n]=e}},{name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var r=n.mainAxis;r=void 0===r||r;var o=n.altAxis;o=void 0===o||o;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,c=n.altBoundary,p=n.flipVariations,l=void 0===p||p,u=n.allowedAutoPlacements;p=y(n=t.options.placement),i=i||(p!==n&&l?function(e){if("auto"===y(e))return[];var t=A(e);return[H(e),t,H(t)]}(n):[A(n)]);var d=[n].concat(i).reduce((function(e,n){return e.concat("auto"===y(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,r=t.rootBoundary,o=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?S:a,f=t.placement.split("-")[1];0===(i=(t=f?i?C:C.filter((function(e){return e.split("-")[1]===f})):q).filter((function(e){return 0<=s.indexOf(e)}))).length&&(i=t);var c=i.reduce((function(t,i){return t[i]=k(e,{placement:i,boundary:n,rootBoundary:r,padding:o})[y(i)],t}),{});return Object.keys(c).sort((function(e,t){return c[e]-c[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:l,allowedAutoPlacements:u}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;p=!0;for(var h=d[0],g=0;g<d.length;g++){var b=d[g],v=y(b),O="start"===b.split("-")[1],x=0<=["top","bottom"].indexOf(v),w=x?"width":"height",j=k(t,{placement:b,boundary:s,rootBoundary:f,altBoundary:c,padding:a});if(O=x?O?"right":"left":O?"bottom":"top",n[w]>i[w]&&(O=A(O)),w=A(O),x=[],r&&x.push(0>=j[v]),o&&x.push(0>=j[O],0>=j[w]),x.every((function(e){return e}))){h=b,p=!1;break}m.set(b,x)}if(p)for(r=function(e){var t=d.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},o=l?3:1;0<o&&"break"!==r(o);o--);t.placement!==h&&(t.modifiersData[e]._skip=!0,t.placement=h,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},{name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;e=e.name;var r=n.mainAxis,o=void 0===r||r;r=void 0!==(r=n.altAxis)&&r;var i=n.tether;i=void 0===i||i;var a=n.tetherOffset,s=void 0===a?0:a;n=k(t,{boundary:n.boundary,rootBoundary:n.rootBoundary,padding:n.padding,altBoundary:n.altBoundary}),a=y(t.placement);var f=t.placement.split("-")[1],c=!f,p=M(a);a="x"===p?"y":"x";var l=t.modifiersData.popperOffsets,d=t.rects.reference,m=t.rects.popper,h="function"==typeof s?s(Object.assign(Object.assign({},t.rects),{},{placement:t.placement})):s;if(s={x:0,y:0}
16,l){if(o){var b="y"===p?"top":"left",v="y"===p?"bottom":"right",O="y"===p?"height":"width";o=l[p];var x=l[p]+n[b],w=l[p]-n[v],j=i?-m[O]/2:0,E="start"===f?d[O]:m[O];f="start"===f?-m[O]:-d[O],m=t.elements.arrow,m=i&&m?u(m):{width:0,height:0};var D=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0};b=D[b],v=D[v],m=Math.max(0,Math.min(d[O],m[O])),E=c?d[O]/2-j-m-b-h:E-m-b-h,c=c?-d[O]/2+j+m+v+h:f+m+v+h,h=t.elements.arrow&&g(t.elements.arrow),d=t.modifiersData.offset?t.modifiersData.offset[t.placement][p]:0,h=l[p]+E-d-(h?"y"===p?h.clientTop||0:h.clientLeft||0:0),c=l[p]+c-d,i=Math.max(i?Math.min(x,h):x,Math.min(o,i?Math.max(w,c):w)),l[p]=i,s[p]=i-o}r&&(r=l[a],i=Math.max(r+n["x"===p?"top":"left"],Math.min(r,r-n["x"===p?"bottom":"right"])),l[a]=i,s[a]=i-r),t.modifiersData[e]=s}},requiresIfExists:["offset"]},{name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state;e=e.name;var r=n.elements.arrow,o=n.modifiersData.popperOffsets,i=y(n.placement),a=M(i);if(i=0<=["left","right"].indexOf(i)?"height":"width",r&&o){var s=n.modifiersData[e+"#persistent"].padding,f
16=u(r),c="y"===a?"top":"left",p="y"===a?"bottom":"right",l=n.rects.reference[i]+n.rects.reference[a]-o[a]-n.rects.popper[i];o=o[a]-n.rects.reference[a],l=(r=(r=g(r))?"y"===a?r.clientHeight||0:r.clientWidth||0:0)/2-f[i]/2+(l/2-o/2),i=Math.max(s[c],Math.min(l,r-f[i]-s[p])),n.modifiersData[e]=((t={})[a]=i,t.centerOffset=i-l,t)}},effect:function(e){var t=e.state,n=e.options;e=e.name;var r=n.element;if(r=void 0===r?"[data-popper-arrow]":r,n=void 0===(n=n.padding)?0:n,null!=r){if("string"==typeof r&&!(r=t.elements.popper.querySelector(r)))return;O(t.elements.popper,r)&&(t.elements.arrow=r,t.modifiersData[e+"#persistent"]={padding:D("number"!=typeof n?n:P(n,q))})}},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state;e=e.name;var n=t.rects.reference,r=t.rects.popper,o=t.modifiersData.preventOverflow,i=k(t,{elementContext:"reference"}),a=k(t,{altBoundary:!0});n=T(i,n),r=T(a,r,o),o=R(n),a=R(r),t.modifiersData[e]={referenceClippingOffsets:n,popperEscapeOffsets:r,isReferenceHidden:o,hasPopperEscaped:a},t.attributes.popper=Object.assign(Object.assign({},t.attributes.popper),{},{"data-popper-reference-hidden":o,"data-popper-escaped":a})}}],X=B({defaultModifiers:F});e.createPopper=X,e.defaultModifiers=F,e.detectOverflow=k,e.popperGenerator=B,Object.defineProperty(e,"__esModule",{value:!0})})); 17; 18 19window.mrp_open_new_window = function( url, width, height, name ) { 20 21 function optimalWindowHeight( desired ) 22 { 23 if( desired && desired < screen.availHeight ) { 24 return desired; 25 } 26 27 var h = 500; 28 if( screen.availHeight > 600 ) { 29 h = 700; 30 } 31 if( screen.availHeight > 800 ) { 32 h = 800; 33 } 34 return h; 35 } 36 37 if( !height ) { 38 height = optimalWindowHeight(); 39 } 40 41 var left = parseInt((screen.availWidth/2) - (width/2)); 42 var top = parseInt((screen.availHeight/2) - (height/2)); 43 44 if( !name ) { 45 name = "" + parseInt( ( Math.random() * 100000 ) ); 46 } 47 var w = window.open( url, name, "width=" + width + ",height=" + height + 48 ",scrollbars=1,location=1,left=" + left + ",top=" + top + ",screenX=" + left + ",screenY=" + top ); 49 50 if( w == null ) { 51 alert( "Please enable popups in your browser" ); 52 } 53 else { 54 w.focus(); 55 } 56 57 return w; 58}; 59 60// DOMParser patch for IOS Safari 61(function(DOMParser) { 62 "use strict"; 63 64 var proto = DOMParser.prototype, 65 nativeParse = proto.parseFromString; 66 67 // Firefox/Opera/IE throw errors on unsupported types 68 try { 69 // WebKit returns null on unsupported types 70 if ((new DOMParser()).parseFromString("", "text/html")) { 71 // text/html parsing is natively supported 72 return; 73 } 74 } catch (ex) {} 75 76 proto.parseFromString = function(markup, type) { 77 if (/^\s*text\/html\s*(?:;|$)/i.test(type)) { 78 var doc = document.implementation.createHTMLDocument(""); 79 if (markup.toLowerCase().indexOf('<!doctype') > -1) { 80 doc.documentElement.innerHTML = markup; 81 } else { 82 doc.body.innerHTML = markup; 83 } 84 return doc; 85 } else { 86 return nativeParse.apply(this, arguments); 87 } 88 }; 89}(DOMParser)); 90 91function get_if_exist(obj){ 92 if( !obj ) { 93 return undefined; 94 } 95 return arguments.length==1 || (obj[arguments[1]] && get_if_exist.apply(this,[obj[arguments[1]]].concat([].slice.call(arguments,2)))); 96} 97 98const _G = { 99 reinitHandlers: [], 100 isMobile: () => /iPhone|iPad|iPod|Android/i.test(navigator.userAgent), 101} 102 103;(function() { 104 _G.visibilityService = (function() { 105 106 const options = { 107 threshold: [0,0.1,0.2,0.4,0.6,0.8] 108 } 109 110 const observer = new IntersectionObserver( entries => { 111 (entries || []).forEach( entry => { 112 if( typeof entry.target.__visibility === 'function' ) { 113 114 const isLikelyMobile = window.innerWidth < window.innerHeight 115 const defaultVisibilityRatio = isLikelyMobile ? 0.01 : 0.2; 116 117 const ratio = getComputedStyle(entry.target) 118 .getPropertyValue('--visibility-ratio') || defaultVisibilityRatio; 119 120 if( entry.intersectionRatio >= ratio /* && !document.querySelector('html').classList.contains('editing') */ ) { 121 entry.target.__visibility(entry) 122 } 123 } 124 }) 125 }, options ) 126 127 const observe = ( el, callback ) => { 128 el.__visibility = callback 129 observer.observe(el) 130 } 131 132 const unobserve = ( el ) => { 133 observer.unobserve(el) 134 } 135 136 return { 137 observe, 138 unobserve, 139 } 140 })() 141})() 142 143 144function _initBlocks() { 145 for (let m of (window.block_code_modules || [])) { 146 try { 147 m && m.init && m.init(m.id, m) 148 } catch (err) { 149 console.log('Error initing module', m.id, err) 150 } 151 } 152} 153 154function _destroyBlocks() { 155 for (let m of (window.block_code_modules || [])) { 156 try { 157 m && m.destroy && m.destroy() 158 } catch (err) { 159 console.log('Error destroying module', m.id, err) 160 } 161 } 162} 163 164_G.parallaxService = (function () { 165 166 const BASE_SPEED = 0.7 167 168 let stopped = false 169 const elements = [] 170 const observer = new IntersectionObserver((entries) => {
171 entries.forEach(entry => { 172 entry.target._parallaxVisible = entry.isIntersecting 173 recalc(entry.target) 174 }) 175 }, { 176 // blank options 177 }) 178 179 window.addEventListener('scroll', (ev) => { 180 requestAnimationFrame(() => { 181 recalcAll() 182 }) 183 184 }, { passive: true }) 185 186 const calcShift = (elem) => { 187 /* 188 * calculates a number -1..0..1 where 0 is dead center of the element in viewport 189 * -1 is when the element touches with its top the top edge of the viewport 190 * 1 is when the element touches with its bottom the bottom edge of the viewport 191 * 192 * */ 193 const rect = elem.parentElement.getBoundingClientRect() 194 const bgRect = elem.getBoundingClientRect() 195 const elemFreeHeight = window.innerHeight - rect.height 196 const bgFreeHeight = window.innerHeight - bgRect.height 197 const shapeCenterY = rect.top + (rect.height / 2) 198 const viewportCenterY = window.innerHeight / 2 199 const delta = viewportCenterY - shapeCenterY 200 201 // adjusting speed is necessary for containers that are shorter than 202 // viewport height and have bg element with some spare space top and 203 // bottom to allow for differential scroll speeds. If these conditions 204 // are not met, we fall back to the base speed. Otherwise, we calculate the 205 // ideal speed based on the amount of spare image space and size of 206 // container. The idea is that the top of bg image reach the top 207 // of the viewport at exactly the same time as the container to avoid exposing 208 // any areas uncovered by the image. 209 const shouldAdjustSpeed = bgRect.height < window.innerHeight 210 && rect.height < window.innerHeight 211 && bgRect.height >= rect.height 212 213 const baseSpeed = shouldAdjustSpeed 214 ? bgFreeHeight / elemFreeHeight 215 : BASE_SPEED 216 217 const translateValue = ( 1 - baseSpeed ) * delta 218 219 // console.log( delta, acceleration, adjustedRatio, translateValue ) 220 221 return translateValue.toFixed(4) 222 } 223 224 const recalcAll = () => { 225 if( stopped ) { 226 return 227 } 228 elements.forEach(elem => { 229 recalc(elem) 230 }) 231 } 232 233 const recalc = (elem) => { 234 if( stopped ) { 235 return 236 } 237 if (elem._parallaxVisible) { 238 elem.style.transform = 'translate(0,' + calcShift(elem) + 'px)' + 239 (elem.classList.contains('blur') ? ' scale(1.1)' : '' ) 240 } 241 } 242 243 const add = (elem) => { 244 if (!elem) { 245 return 246 } 247 elem._parallaxVisible = false 248 elements.push(elem) 249 observer.observe(elem) 250 recalc(elem) 251 } 252 253 const remove = (elem) => { 254 const index = elements.indexOf(elem) 255 if (index !== -1) { 256 elements.splice(index, 1) 257 } 258 observer.unobserve(elem) 259 } 260 261 const setStopped = (flag) => { 262 stopped = flag 263 } 264 265 const refresh = () => { 266 recalcAll() 267 } 268 269 const cleanup = () => { 270 // cleanup potentially stale elements, i.e. detached from DOM 271 // may happen after a block was re-inserted in the editor 272 elements.slice().filter(elem => { 273 if (!document.body.contains(elem)) { 274 remove(elem) 275 } 276 }) 277 } 278 279 return { 280 setStopped, 281 refresh, 282 add, 283 remove, 284 cleanup, 285 } 286})() 287 288_G.fxService = (function() { 289 290 let queue = [] 291 let revealLaunched = null 292 293 function cleanupFastScrolled() { 294 // const snapshot = queue.map( el => { 295 // let rect = el.getBoundingClientRect() 296 // let top = rect.top 297 // let bottom = rect.bottom 298 // return { 299 // el, 300 // top, 301 // bottom, 302 // scrolledOutOfView: bottom < 0, 303 // } 304 // }) 305 // console.log( 'REVEAL', snapshot ) 306 while(queue.length > 0) { 307 let el = queue.at(0) 308 if( !el ) { 309 break; 310 } 311 let rect = el.getBoundingClientRect() 312 if( rect.bottom < 0 ) { 313 queue.shift().classList.remove('fx') 314 } 315 else { 316 break; 317 } 318 } 319 } 320 321 function revealStaggered() { 322 if( revealLaunched !== null ) { 323 return 324 } 325 if( queue.length === 0 ) { 326 return 327 } 328 revealLaunched = setInterval( () => { 329 if( queue.length === 0 ) { 330 clearInterval( revealLaunched ) 331 revealLaunched = null 332 return 333 } 334 cleanupFastScrolled() 335 queue.shift().classList.remove( 'fx' ) 336 }, 100 ) 337 } 338 339 function initElem( el ) { 340 if( !el || el.__fx_inited ) { 341 return 342 } 343 344 if( el.closest('.managed-fx')) { 345 return 346 } 347 348 el.__fx_inited = true 349 _G.visibilityService.observe( el, result => { 350 351 if( !el.classList.contains('fx')) { 352 return // probably already revealed 353 } 354 queue.push(el) 355 revealStaggered() 356 _G.visibilityService.unobserve(el) 357 }) 358 } 359
360 function init() { 361 document.querySelectorAll('.fx' ).forEach( initElem ) 362 } 363 364 return { 365 init, 366 initElem 367 } 368})() 369 370 371document.addEventListener('DOMContentLoaded', () => { 372 373 if( window.customOnLoads ) { 374 window.customOnLoads.forEach( f => { 375 try { 376 if( typeof f === 'function' ) { 377 f() 378 } 379 } 380 catch( ex ) { 381 console.error( 'ERROR: failed to run customOnLoad: ', ex ); 382 } 383 }) 384 } 385 386 function initVideo( v ) { 387 if( v.__videoInited ) { 388 return 389 } 390 v.__videoInited = true 391 v.addEventListener('pause', () => { 392 v.__paused = true 393 }) 394 _G.visibilityService.observe(v, result => { 395 if( result.isIntersecting ) { 396 if( v.__paused ) { 397 return 398 } 399 v.muted = true 400 v.play() 401 if(v.getAttribute("data-speed")) { 402 v.playbackRate = parseFloat(v.getAttribute("data-speed")) 403 } 404 // if( document.querySelector('html').classList.contains('editing') ) { 405 //v.pause() 406 // } 407 } 408 }) 409 } 410 411 _G.fxService.init() 412 _G.reinitHandlers.push( id => { 413 document.getElementById(id).querySelectorAll('.fx').forEach( el => { 414 _G.fxService.initElem(el) 415 }) 416 document.querySelectorAll('video[data-autoplay="true"]').forEach(initVideo ) 417 }) 418 419 420 document.querySelectorAll('.with-scroll-parallax').forEach(elem => { 421 _G.parallaxService.add(elem) 422 }) 423 document.querySelectorAll( '.with-smart-bg.with-bg-video video' ).forEach(( v => { 424 v.muted = true 425 v.play() 426 })) 427 428 document.querySelectorAll('video.video[data-autoplay="true"]').forEach(initVideo ) 429 430 document.addEventListener( 'editor.on', () => { 431 }) 432 433 _G.quickMessage = ( msg, options={} ) => { 434 const m = document.createElement('div') 435 m.classList.add('quick-message') 436 if( options.error ) { 437 m.classList.add( 'error' ) 438 } 439 m.style.opacity = '0' 440 m.innerText = msg 441 document.body.appendChild( m ) 442 setTimeout( () => { 443 m.style.opacity = '1' 444 }, 10 ) 445 setTimeout( () => { 446 m.style.opacity = '0' 447 m.addEventListener( 'transitionend', () => { 448 m.remove() 449 },{once:true}) 450 }, 3000 ) 451 m.addEventListener('click', ev => { 452 m.style.opacity = '0' 453 m.addEventListener( 'transitionend', () => { 454 m.remove() 455 },{once:true}) 456 }, {once: true}) 457 } 458 459 _G.applyRipple = function( event, button ) { 460 461 const circle = document.createElement("span") 462 const diameter = Math.max(button.clientWidth, button.clientHeight) 463 const radius = diameter / 2; 464 465 circle.style.width = circle.style.height = `${diameter}px` 466 const rect = button.getBoundingClientRect() 467 circle.style.left = `${event.clientX - (rect.left + radius)}px` 468 circle.style.top = `${event.clientY - (rect.top + radius)}px` 469 circle.classList.add("ripple") 470 471 const ripple = button.getElementsByClassName("ripple")[0] 472 if (ripple) { 473 ripple.remove() 474 } 475 476 button.appendChild(circle) 477 478 circle.addEventListener( 'animationend', () => { 479 circle.remove() 480 }, { once: true }) 481 } 482 483 _G.createFragment = htmlStr => { 484 var frag = document.createDocumentFragment(), temp = document.createElement('div'); 485 temp.innerHTML = htmlStr; 486 while (temp.firstChild) { 487 frag.appendChild(temp.firstChild); 488 } 489 return frag; 490 } 491 492 function scrollToBlock( id ) { 493 console.log( 'will scroll to ', id ) 494 const elem = document.querySelector(id) 495 if( elem ) { 496 elem.scrollIntoView({ 497 behavior: 'smooth', 498 block: 'start',
499 inline: 'nearest', 500 }) 501 history.pushState({}, '', id) 502 // window.location.hash = id 503 } 504 } 505 506 document.addEventListener( 'click', event => { 507 if( event.target && ( event.target.matches( '.block-layout .button' ) || event.target.matches( '.block-layout .button *' ))) { 508 const button = event.target.closest('.button') 509 if( button ) { 510 _G.applyRipple(event, button ) 511 if( button.tagName === 'BUTTON' ) { 512 const form = button.closest('form') 513 if( form && form.getAttribute('action') && 514 form.getAttribute('action').indexOf('#bid_') === 0 ) { 515 event.stopPropagation() 516 event.preventDefault() 517 scrollToBlock(form.getAttribute('action')) 518 } 519 } 520 } 521 } 522 if( event.target && ( event.target.matches( '.block-layout a' ) || event.target.matches('.block-layout a *'))) { 523 const link = event.target.closest('a') 524 if( link && link.getAttribute('href') && link.getAttribute('href').indexOf('#bid_') === 0 ) { 525 event.stopPropagation() 526 event.preventDefault() 527 scrollToBlock(link.getAttribute('href')) 528 } 529 } 530 }) 531}) 532 533function debounce(func, wait, immediate) { 534 var timeout; 535 return function() { 536 var context = this, args = arguments; 537 var later = function() { 538 timeout = null; 539 if (!immediate) func.apply(context, args); 540 }; 541 var callNow = immediate && !timeout; 542 clearTimeout(timeout); 543 timeout = setTimeout(later, wait); 544 if (callNow) func.apply(context, args); 545 }; 546} 547 548function openTranslate( toLang ) { 549 toLang = toLang || "en"; 550 window.open("https://" + window.location.hostname.replaceAll("-","--") 551 .replaceAll(".","-") + ".translate.goog" + window.location.pathname + 552 "?_x_tr_sl=auto&_x_tr_tl=" + toLang + "&_x_tr_hl=en&_x_tr_pto=wapp' target='_blank'>Translate Page") 553} 554 555function mrp_basic_auth_logout( safelocation ) { 556 const c = ''; 557 var a, b = "You should be logged out now."; 558 try { 559 a = document.execCommand("ClearAuthenticationCache", 'false') 560 } catch (d) { 561 } 562 a || ((a = window.XMLHttpRequest ? new window.XMLHttpRequest : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : void 0) ? 563 (a.open("HEAD", c || location.href, !0, "logout", (new Date).getTime().toString()), a.send(""), a = 1) : a = void 0); 564 a || (b = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."); 565 // alert(b) 566 document.body.innerHTML = ''; 567 setTimeout(() => { 568 const url = window.location.href; 569 const fake = btoa('logout:logout') 570 // history.replaceState({}, '', url + '?t' + Date.now() ); 571 window.location = safelocation || 'https://private-office.myrealpage.com' 572 // fetch( url, { 573 // headers: { 574 // 'Authorization': 'Basic fake' 575 // } 576 // }) 577 // .finally( () => { 578 // 579 // }); 580 }, 1000 ) 581} 582 583/* ==== INCLUDE: /js/responsive-containers-mod.js ==== */ 584 585/* 586MIT Licensed. 587Copyright (c) 2011 Andy Hume (http://andyhume.net, [email protected]). 588 589Permission is hereby granted, free of charge, to any person obtaining a copy 590of this software and associated documentation files (the "Software"), to deal 591in the Software without restriction, including without limitation the rights 592to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 593copies of the Software, and to permit persons to whom the Software is 594furnished to do so, subject to the following conditions: 595 596The above copyright notice and this permission notice shall be included in 597all copies or substantial portions of the Software. 598 599THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 600IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 601FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 602AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 603LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 604OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 605THE SOFTWARE. 606*/ 607 608(function(win) { 609 610 if( window.responsiveContainersLoaded ) { 611 return; 612 } 613 614 window.responsiveContainersLoaded = true; 615 616 var doc = win.document, 617 els = [], 618 check_data_attributes = true, 619 loaded = false;
620 621 622 if( window.mrp_v2_ready ) { 623 window.mrp_v2_ready( function() { 624 _gmrp.$( document ).on( "mrp.responsify.containers mrp.popup.close", 625 function(e) { 626 //console.log( "mrp.ajax-idx.show" ); 627 for( var i=0; i<els.length; ++i ) { 628 delete els[i].cq_rules; 629 } 630 els = []; 631 //var b = new Date().getTime(); 632 findContainerQueries(); 633 applyRules(); 634 //console.log( ( new Date().getTime() - b ) + "ms" ); 635 } 636 ); 637 }); 638 } 639 640 function add(elements, query, value, class_name) { 641 var split_value = /([0-9]*)(px|em)/.exec(value); 642 for (var i = 0, j = elements.length; i<j; ++i) { 643 var el = elements[i]; 644 el.cq_rules = el.cq_rules || []; 645 el.cq_rules.push([null, query, split_value[1], split_value[2], class_name]); 646 els.push(el); 647 } 648 if (loaded) { // if we're not 'loaded' yet, domLoaded will run applyRules() for us. 649 applyRules(); 650 } 651 } 652 653 function ignoreDataAttributes() { 654 check_data_attributes = false; 655 } 656 657 function findContainerQueries() { 658 if (check_data_attributes) { 659 // Find data-squery attributes. 660 var nodes = []; 661 if (doc.querySelectorAll) { 662 var nodes = doc.querySelectorAll("[data-squery]"); 663 } else { 664 // If no query selectors. 665 var e = doc.getElementsByTagName("*"); 666 for (var i = 0, j = e.length; i<j; ++i) { 667 if (e[i].getAttribute("data-squery")) { 668 nodes.push(e[i]); 669 } 670 } 671 } 672 // Parse the data-squery attribute and store resulting rules on the element. 673 for (var i = 0, j = nodes.length; i<j; ++i) { 674 var el = nodes[i]; 675 if( el.cq_rules && el.cq_rules.length > 0 ) { 676 continue; 677 } 678 var cq_rules = []; 679 var raw_rules = el.getAttribute("data-squery").split(" "); 680 for (var k = 0, l = raw_rules.length; k<l; ++k) { 681 var rule = /(.*):([0-9]*)(px|em)=(.*)/.exec(raw_rules[k]); 682 if (rule) { 683 cq_rules.push(rule); 684 } 685 } 686 el.cq_rules = el.cq_rules || []; 687 el.cq_rules = el.cq_rules.concat(cq_rules); 688 els.push(el); 689 } 690 } 691 } 692 693 function applyRules() { 694 // For each element, apply the rules to the class name. 695 console.log( "els:", els.length ); 696 for (var i = 0, j = els.length; i<j; ++i) { 697 el = els[i]; 698 console.log( "els.cq_rules:",el.cq_rules.length ); 699 for (var k = 0, l = el.cq_rules.length; k<l; ++k) { 700 var rule = el.cq_rules[k]; 701 702 // Get a target width value in pixels. 703 var width = parseInt(rule[2]); 704 if (rule[3] === "em") { 705 width = emsToPixels(parseFloat(rule[2]), el); 706 } 707 708 // Calculate the width of the target without the class added. 709 var defaultWidth = getDefaultWidth(el, rule[4]); 710 // Test current width against target width and add/remove class values. 711 if ( compareFunction[rule[1]](defaultWidth, width) ) { 712 window._gmrp && _gmrp.$ && _gmrp.$( document ).trigger( "mrp.resp.container.change", "+" + rule[4] ); 713 if (el.className.indexOf(rule[4]) < 0) { 714 el.className += " " + rule[4]; 715 } 716 } else { 717 window._gmrp && _gmrp.$ && _gmrp.$( document ).trigger( "mrp.resp.container.change", "-" + rule[4] ); 718 var class_name = el.className.replace(new RegExp('(^| )'+rule[4]+'( |$)'), '$1'); 719 class_name = class_name.replace(/ $/, ''); 720 el.className = class_name; 721 } 722 } 723 } 724 } 725 726 var compareFunction = { 727 "min-width": function(a, b) { 728 return a > b; 729 }, 730 "max-width": function(a, b) { 731 return a < b; 732 } 733 } 734 735 function contentReady() { 736 if (loaded) { 737 return; 738 } 739 loaded = true; 740 findContainerQueries(); 741 applyRules(); 742 if (win.addEventListener) { 743 win.addEventListener("resize", applyRules, false); 744 745 } 746 // Allow for resizing text after the page has loaded. 747 var current_em = emsToPixels(1, doc.body); 748 win.setInterval(function() { 749 var new_em = emsToPixels(1, doc.body); 750 if (new_em !== current_em) { 751 applyRules(); 752 current_em = new_em; 753 } 754 }, 2000); 755 } 756 757 function memoize( f ) { 758 return function () { 759 var args = Array.prototype.slice.call(arguments); 760 f.memoize = f.memoize || {}; 761 return (args in f.memoize) ? f.memoize[args] : f.memoize[args] = f.apply(this, args); 762 }; 763 } 764 765 var emsToPixels = memoize(function(em, scope) { 766 var test = doc.createElement("div"); 767 test.style.fontSize = "1em"; 768 test.style.margin = "0"; 769 test.style.padding = "0"; 770 test.style.border = "none"; 771 test.style.width = "1em"; 772 scope.appendChild(test); 773 var val = test.offsetWidth; 774 scope.removeChild(test); 775 return Math.round(val * em); 776 }); 777 778 var getDefaultWidth = function(el, class_name) { 779 if( true ) { 780 // we don't need to be fancy, simple width is ok, all the resp containers are flexible 781 return el.offsetWidth; 782 } 783 //console.log( "hit width", el ); 784 var test = el.cloneNode(true); 785 test.className = (" " + test.className + " ").replace(" " + class_name + " ", " "); 786 test.style.height = 0; 787 test.style.visibility = "hidden"; 788 test.style.overflow = "hidden"; 789 test.style.clear = "both"; 790 var parent = el.parentNode; 791 parent.insertBefore(test, el); 792 var val = test.offsetWidth; 793 parent.removeChild(test); 794 return val; 795 } 796 797 if( window.addEventListener ) { 798 console.log( "installing mrpRescanResponsifyContainers listener" ); 799 window.addEventListener("mrpRescanResponsifyContainers", function() { 800 console.log( "mrpRescanResponsifyContainers" ); 801 findContainerQueries(); 802 applyRules(); 803 }, false); 804 } 805 else if (window.attachEvent) { 806 window.attachEvent("mrpRescanResponsifyContainers", function() { 807 findContainerQueries(); 808 applyRules(); 809 }); 810 } 811 812 if( /loaded|complete|interactive/.test(doc.readyState) ) { 813 contentReady(); 814 } 815 else if (doc.addEventListener) { 816 doc.addEventListener("DOMContentLoaded", contentReady, false); 817 // or 818 win.addEventListener("load", contentReady, false); 819 } 820 // If old IE 821 else if (doc.attachEvent) { 822 doc.attachEvent("onreadystatechange", contentReady); 823 // or 824 win.attachEvent("onload", contentReady); 825 } 826 827 828 win["SelectorQueries"] = { 829 "add": add, 830 "ignoreDataAttributes": ignoreDataAttributes 831 } 832 833})(this); 834 835 836 837/* ==== INCLUDE: /js/blocks/sticky-menu.js ==== */ 838 839 840document.addEventListener( 'DOMContentLoaded', function() { 841 842 function initBlock(id) { 843 const block = document.getElementById(id) 844 if( block.querySelector('.sticky-menu')) { 845 init( block.querySelector( '.sticky-menu' ) ) 846 } 847 } 848 849 function isMenuVisible (el) { 850 var rect = el.getBoundingClientRect(); 851 852 if( rect.top < 0 ) { 853 return false;
854 } 855 else { 856 return true; 857 } 858 } 859 860 function floatMenu( el ) { 861 if( el.querySelector('.sticky' ).classList.contains( 'floated')) { 862 return 863 } 864 if( document.querySelector('html').classList.contains('editing') ) { 865 return unfloatMenu(el) 866 } 867 el.querySelector('.sticky' ).style.opacity = '1' 868 el.querySelector('.sticky' ).classList.add( 'floating', 'floated', 'elevation3' ) 869 el.classList.add( 'sticky-on' ) 870 } 871 872 function unfloatMenu( el ) { 873 if( !el.querySelector('.sticky' ).classList.contains( 'floated')) { 874 return 875 } 876 el.querySelector('.sticky' ).classList.remove( 'floating', 'floated', 'elevation3' ) 877 el.classList.remove( 'sticky-on' ) 878 } 879 880 function init( el ) { 881 if( !el || !el.querySelector( '.sticky' )) { 882 return 883 } 884 885 window.addEventListener( 'scroll', function() { 886 isMenuVisible( el ) ? unfloatMenu(el) : floatMenu(el) 887 }, { passive: true }) 888 889 890 if( !isMenuVisible(el) ) { 891 floatMenu(el) 892 } 893 894 document.addEventListener( 'editor.on', function() { 895 unfloatMenu( el ) 896 }) 897 document.addEventListener( 'editor.off', function() { 898 if( !isMenuVisible( el ) ) { 899 floatMenu( el ) 900 } 901 }) 902 } 903 904 document.querySelectorAll( '.sticky-menu' ).forEach( function(el) { 905 init( el ) 906 }) 907 908 _G.reinitHandlers.push(initBlock) 909}) 910 911 912/* ==== INCLUDE: /js/blocks/hmenu.js ==== */ 913 914document.addEventListener( 'DOMContentLoaded', ev => { 915 916 document.body.addEventListener( 'click', ev => { 917 918 if( document.querySelector('html').classList.contains('editing')) { 919 return 920 } 921 if( !ev.target.matches( '.hmenu li.has-submenu, .hmenu li.has-submenu > *' ) ) { 922 return 923 } 924 const el = ev.target.closest( 'li' ) 925 ev.preventDefault() 926 ev.stopPropagation() 927 928 document.querySelectorAll( '.hmenu li.open' ).forEach( open => { 929 if( open.contains(el) ) { 930 return 931 } 932 open.classList.remove('open') 933 open.classList.remove('visible') 934 }) 935 if( el.classList.contains('open')) { 936 // toggle 937 el.classList.remove('open'); 938 el.classList.remove('visible'); 939 return; 940 } 941 // open -> does display: block which acquires dimension for popper 942 el.classList.add( 'open' ) 943 setTimeout( () => { 944 // then we fade it in 945 el.classList.add( 'visible' ) 946 }, 100 ) 947 948 if( el.__popper ) { 949 el.__popper.update() 950 return 951 } 952 953 console.log( 'placement', el.closest('ul' ).classList.contains('mrp-menu-level-0') ? 'bottom-start' : 'right-start' ) 954 955 el.__popper = Popper.createPopper( el, el.querySelector( 'ul'), { 956 placement: el.closest('ul' ).classList.contains('mrp-menu-level-0') ? 'bottom-start' : 'right-start', 957 }) 958 }) 959 960 document.body.addEventListener('keydown', ev => { 961 if( ev.key === 'Enter' ) { 962 if( !ev.target.closest( 'li.has-submenu') ) { 963 return 964 } 965 ev.stopPropagation() 966 ev.preventDefault() 967 ev.target.closest( 'li.has-submenu').click() 968 } 969 else if( ev.key === 'Escape' ) { 970 document.querySelectorAll( '.hmenu li.open' ).forEach( el => { 971 el.classList.remove('open') 972 el.classList.remove('visible') 973 }) 974 } 975 }) 976 977 document.body.addEventListener('click', ev => { 978 if( ev.target.closest( 'li.has-submenu') ) { 979 return 980 } 981 document.querySelectorAll( '.hmenu li.open' ).forEach( el => { 982 el.classList.remove('open') 983 el.classList.remove('visible') 984 }) 985 }) 986 987 document.querySelectorAll('.hmenu').forEach( menu => { 988 menu.querySelectorAll( '.hmenu li.has-submenu' ).forEach( item => { 989 item.addEventListener('click', ev => { 990 991 }) 992 993 }) 994 }) 995}) 996 997 998/* ==== INCLUDE: /js/blocks/vmenu.js ==== */ 999
1000/*! 1001 * Mmenu Light 1002 * mmenujs.com/mmenu-light 1003 * 1004 * Copyright (c) Fred Heusschen 1005 * www.frebsite.nl 1006 * 1007 * License: CC-BY-4.0 1008 * http://creativecommons.org/licenses/by/4.0/ 1009 */ 1010 1011!function(t){var e={};function n(i){if(e[i])return e[i].exports;var s=e[i]={i:i,l:!1,exports:{}};return t[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)n.d(i,s,function(e){return t[e]}.bind(null,s));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";n.r(e);var i=function(){function t(t){var e=this;this.listener=function(t){(t.matches?e.matchFns:e.unmatchFns).forEac
1011h((function(t){t()}))},this.toggler=window.matchMedia(t),this.toggler.addListener(this.listener),this.matchFns=[],this.unmatchFns=[]}return t.prototype.add=function(t,e){this.matchFns.push(t),this.unmatchFns.push(e),(this.toggler.matches?t:e)()},t}(),s=function(t){return Array.prototype.slice.call(t)},o=function(t,e){return s((e||document).querySelectorAll(t))},r=("ontouchstart"in window||navigator.msMaxTouchPoints,navigator.userAgent.indexOf("MSIE")>-1||navigator.appVersion.indexOf("Trident/")>-1),a="mm-spn",c=function(){function t(t,e,n,i,s){this.node=t,this.title=e,this.slidingSubmenus=i,this.selectedClass=n,this.node.classList.add(a),r&&(this.slidingSubmenus=!1),this.node.classList.add(a+"--"+s),this.node.classList.add(a+"--"+(this.slidingSubmenus?"navbar":"vertical")),this._setSelectedl(),this._initAnchors()}return Object.defineProperty(t.prototype,"prefix",{get:function(){return a},enumerable:!1,configurable:!0}),t.prototype.openPanel=function(t){var e=t.parentElement;if(this.slidingSubmenus){var n=t.dataset.mmSpnTitle;e===this.node?this.node.classList.add(a+"--main"):(this.node.classList.remove(a+"--main"),n||s(e.children).forEach((function(t){t.matches("a, span")&&(n=t.textContent)}))),n||(n=this.title),this.node.dataset.mmSpnTitle=n,o(".mm-spn--open",this.node).forEach((function(t){t.classList.remove(a+"--open"),t.classList.remove(a+"--parent")})),t.classList.add(a+"--open"),t.classList.remove(a+"--parent");for(var i=t.parentElement.closest("ul");i;)i.classList.add(a+"--open"),i.classList.add(a+"--parent"),i=i.parentElement.closest("ul")}else{var r=t.matches(".mm-spn--open");r?e.classList.remove(a+"--open-parent"):e.classList.add(a+"--open-parent"),t.classList[r?"remove":"add"](a+"--open");for(var c=t.parentElement.closest("ul");c;)c.classList.add(a+"--open"),c=c.parentElement.closest("ul")}},t.prototype._setSelectedl=function(){var t=o("."+this.selectedClass,this.node),e=t[t.length-1],n=null;e&&(n=e.closest("ul")),n||(n=this.node.querySelector("ul")),this.openPanel(n)},t.prototype._initAnchors=function(){var t=this;this.node.addEventListener("click",(function(e){var n=e.target,i=!1;(i=(i=(i=i||function(t){return!!t.matches("a")}(n))||function(e){var n;return!!(n=e.closest("span")?e.parentElement:!!e.closest("li")&&e)&&(s(n.children).forEach((function(e){e.matches("ul")&&t.openPanel(e)})),!0)}(n))||function(e){var n=o(".mm-spn--open",e),i=n[n.length-1];if(i){var s=i.parentElement.closest("ul");
1011if(s)return t.openPanel(s),!0}return!1}(n))&&e.stopImmediatePropagation()}))},t}(),d=function(){function t(t,e){var n=this;void 0===t&&(t=null),this.wrapper=document.createElement("div"),this.wrapper.classList.add("mm-ocd"),this.wrapper.classList.add("mm-ocd--"+e),this.content=document.createElement("div"),this.content.classList.add("mm-ocd__content"),this.wrapper.append(this.content),this.backdrop=document.createElement("div"),this.backdrop.classList.add("mm-ocd__backdrop"),this.wrapper.append(this.backdrop),document.body.append(this.wrapper),t&&this.content.append(t);var i=function(t){n.close(),t.stopImmediatePropagation()};this.backdrop.addEventListener("touchstart",i,{passive:!0}),this.backdrop.addEventListener("mousedown",i,{passive:!0})}return Object.defineProperty(t.prototype,"prefix",{get:function(){return"mm-ocd"},enumerable:!1,configurable:!0}),t.prototype.open=function(){this.wrapper.classList.add("mm-ocd--open"),document.querySelector('html').classList.add("mm-ocd-opened")},t.prototype.close=function(){this.wrapper.classList.remove("mm-ocd--open"),document.querySelector('html').classList.remove("mm-ocd-opened")},t}(),l=function(){function t(t,e){void 0===e&&(e="all"),this.menu=t,this.toggler=new i(e)}return t.prototype.navigation=function(t){var e=this;if(!this.navigator){var n=(t=t||{}).title,i=void 0===n?"Menu":n,s=t.selectedClass,o=void 0===s?"Selected":s,r=t.slidingSubmenus,a=void 0===r||r,d=t.theme,l=void 0===d?"light":d;this.navigator=new c(this.menu,i,o,a,l),this.toggler.add((function(){return e.menu.classList.add(e.navigator.prefix)}),(function(){return e.menu.classList.remove(e.navigator.prefix)}))}return this.navigator},t.prototype.offcanvas=function(t){var e=this;if(!this.drawer){var n=(t=t||{}).position,i=void 0===n?"left":n;this.drawer=new d(null,i);var s=document.createComment("original menu location");this.menu.after(s),this.toggler.add((function(){e.drawer.content.append(e.menu)}),(function(){e.drawer.close(),s.after(e.menu)}))}return this.drawer},t}();e.default=l;window.MmenuLight=l}]); 1012 1013;(function () { 1014 1015 const menus = {} 1016 1017 const init = (id) => { 1018 // re-entrant 1019 1020 if( id ) { 1021 // re-init 1022 // first destroy all existing (after apply in-place changes) constructs 1023 document.querySelectorAll( '[data-rel="' + id + '"]').forEach( existing => { 1024 existing.remove() 1025 }) 1026 } 1027 1028 document.querySelectorAll( '.vmenu').forEach( (el, index) => { 1029 if( el.classList.contains('inited')) { 1030 return 1031 } 1032 el.classList.add('inited') 1033 1034 const blockId = el.closest( '.block-layout' ).getAttribute('id') 1035 1036 1037 1038 const menu = new MmenuLight( el, 'all' ) 1039 const navigation = menu.navigation({ 1040 selected: 'selected', 1041 slidingSubmenus: 'true' === el.getAttribute('data-slide'), 1042 theme: 'true' === el.getAttribute('data-dark') ? 'dark' : 'light', 1043 title: '' 1044 }) 1045 1046 const drawer = menu.offcanvas({ 1047 position: 'right' === el.getAttribute('data-position') ? 'right' : 'left', 1048 }) 1049 1050 drawer.wrapper.setAttribute( 'data-rel', blockId ) 1051 1052 el.classList.remove('initial') 1053 1054 // if id was given to us in init(id), then we are reiniting 1055 if( id && index === 0 ) { 1056 menus[blockId] = [] 1057 } 1058 if( !menus[blockId] ) { 1059 // array for potentially multiple per block 1060 menus[blockId] = [] 1061 } 1062 menus[blockId].push({ navigation, drawer }) 1063 }) 1064 } 1065 1066 document.addEventListener('DOMContentLoaded', () => { 1067 init() 1068 1069 document.addEventListener('editor.on', () => { 1070 Reflect.ownKeys(menus).forEach( m => { 1071 const handlers = menus[m] 1072 handlers.forEach( h => { 1073 try { 1074 h.drawer.close() 1075 } 1076 catch( e ) {} 1077 }) 1078 }) 1079 }) 1080 1081 document.addEventListener('keydown', ev => { 1082 if( ev.key === 'Escape' ) {
1083 Reflect.ownKeys(menus).forEach( m => { 1084 const handlers = menus[m] 1085 handlers.forEach( h => { 1086 try { 1087 h.drawer.close() 1088 } 1089 catch( e ) {} 1090 }) 1091 }) 1092 } 1093 }) 1094 1095 document.addEventListener('click', ev => { 1096 if( ev.target && ev.target && 1097 ev.target.closest('.vmenu-opener')) { 1098 1099 if( document.querySelector('html').classList.contains('editing')) { 1100 return 1101 } 1102 const blockId = ev.target.closest('.block-layout').getAttribute('id') 1103 const index = parseInt(ev.target.closest('.vmenu-opener').getAttribute( 'data-index')) || 0 1104 const handlers = menus[blockId] 1105 if( Array.isArray(handlers) && handlers[index]) { 1106 handlers[index].drawer.open() 1107 if( handlers[index].navigation.slidingSubmenus ) { 1108 handlers[index].navigation.openPanel(handlers[index].navigation.node.querySelector('ul')) 1109 } 1110 handlers[index].drawer.content.querySelector('.vmenu').focus() 1111 } 1112 } 1113 }) 1114 }) 1115 1116 _G.reinitHandlers.push(init) 1117 1118})() 1119 1120 1121/* ==== INCLUDE: /js/blocks/vmenu-fix.js ==== */ 1122 1123document.addEventListener("DOMContentLoaded", function () { 1124 const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent); 1125 if (!isIOS) return; 1126 1127 const html = document.documentElement; 1128 1129 const syncViewport = () => { 1130 // Force Safari to sync visual + layout viewport 1131 window.scrollTo(0, 1); 1132 window.scrollTo(0, 0); 1133 1134 // Force reflow 1135 html.style.transform = "translateZ(0)"; 1136 void html.offsetHeight; 1137 html.style.transform = ""; 1138 }; 1139 1140 // Watch for mmenu open class on <html> 1141 const obs = new MutationObserver(() => { 1142 if (html.classList.contains("mm-ocd-opened")) { 1143 syncViewport(); 1144 } 1145 }); 1146 1147 obs.observe(html, { attributes: true, attributeFilter: ["class"] }); 1148}); 1149 1150/* ==== INCLUDE: /js/blocks/omnibox-v2_1.js ==== */ 1151 1152;(function () { 1153 1154 function Typeahead(el, accountId) { 1155 1156 if (el.__typeahead) { 1157 // already inited 1158 return 1159 } 1160 1161 el.__typeahead = true 1162 1163 const MIN_CHARS_MSG = 'Enter at least 3 characters...' 1164 1165 // const typeaheadURL = el.getAttribute('data-typeahead') 1166 const typeaheadURL = '/wps/rest/api/' + accountId + '/typeahead?' 1167 1168 el.getAttribute('data-with-ticker') === 'true' && (function () { 1169 1170 const text = el.getAttribute('placeholder') || '' 1171 if (!text) { 1172 return 1173 } 1174 1175 const ticker = document.createElement('div') 1176 ticker.style.position = 'absolute' 1177 ticker.style.width = ticker.style.height = '0' 1178 ticker.style.overflow = 'hidden' 1179 ticker.setAttribute('data-ticker', text) 1180 ticker.innerText = '' 1181 el.setAttribute('placeholder', '') 1182 const typing = window.TypeIt && new window.TypeIt(ticker, { 1183 //waitUntilVisible: true, 1184 cursor: '', 1185 speed: 50, 1186 afterStep: (step, queue, instance) => { 1187 el.setAttribute('placeholder', ticker.textContent) 1188 } 1189 }) 1190 _G.visibilityService.observe(el, result => { 1191 if (result.isIntersecting && !document.querySelector('html').classList.contains('editing')) { 1192 typing.pause(1000).type(text).go() 1193 _G.visibilityService.unobserve(el) 1194 } 1195 }) 1196 1197 })() 1198 1199 const popup = document.createElement("div") 1200 popup.setAttribute("class", "typeahead elevation8") 1201 el.parentElement.appendChild(popup) 1202 1203 const popper = Popper.createPopper(el, popup, { 1204 placement: 'bottom-start', 1205 modifiers: [ 1206 { 1207 name: 'offset', 1208 options: { 1209 offset: [0, 8], 1210 }, 1211 }, 1212 ], 1213 }) 1214 1215 const doFetch = debounce((val, onData, onError) => { 1216 1217 let soldCheckbox = el.form.querySelector('input[name=solds]') 1218 if(!soldCheckbox) { 1219 soldCheckbox = el.form.querySelector('input[name=ibf_solds]') 1220 } 1221 const isForSolds = soldCheckbox && soldCheckbox.checked || false 1222 const listingType = isForSolds ? 'AUTO_SOLD' : 1223 (el.form.querySelector('input[name=listingType]').value || 'AUTO') 1224 1225 1226 fetch(typeaheadURL + 'listingType=' + encodeURIComponent(listingType) + 1227 '&q=' + encodeURIComponent(val)) 1228 .then(response => response.json()) 1229 .then(json => { 1230 onData(json) 1231 }) 1232 .catch(err => { 1233 onError(err) 1234 }) 1235 }, 300) 1236 1237 const createTypeaheadMessage = msg => { 1238 popup.innerHTML = '' 1239 const out = document.createElement('div') 1240 out.setAttribute('class', 'message') 1241 out.innerText = msg 1242 popup.appendChild(out) 1243 showTypeahead() 1244 } 1245 1246 const createTypeaheadEntry = row => { 1247 const out = document.createElement('div') 1248 out.setAttribute('class', 'entry') 1249 out.setAttribute('data-value', row[0]) 1250 out.setAttribute('data-label', row[1]) 1251 1252 out.addEventListener('mouseenter', () => { 1253 focusEntry(out) 1254 }) 1255 out.innerText = row[1] 1256 return out 1257 } 1258 1259 const createTypeahead = data => { 1260 popup.innerHTML = '' 1261 if (data.length === 0) { 1262 return createTypeaheadMessage('Hm, nothing found...') 1263 } 1264 data.forEach(record => { 1265 popup.appendChild(createTypeaheadEntry(record)) 1266 }) 1267 if (!popup.classList.contains('visible')) { 1268 showTypeahead() 1269 } 1270 focusFirst() 1271 } 1272 1273 const showTypeahead = () => { 1274 popup.classList.add('visible') 1275 popper.forceUpdate() 1276 } 1277 1278 const hideTypeahead = () => { 1279 popup.classList.remove('visible') 1280 } 1281 1282 const currentSelection = () => { 1283 return popup.querySelector('.focused') 1284 } 1285 1286 const focusFirst = () => { 1287 const first = popup.firstElementChild 1288 if (first && first.classList.contains('entry')) { 1289 return first.classList.add('focused') 1290 } 1291 } 1292 1293 const focusNext = () => { 1294 const current = currentSelection() 1295 if (!current) { 1296 focusFirst() 1297 } else { 1298 current.classList.remove('focused') 1299 const next = current.nextElementSibling 1300 if (!next) { 1301 focusFirst() 1302 } else if (next.classList.contains('entry')) { 1303 next.classList.add('focused') 1304 } 1305 } 1306 } 1307 1308 const focusPrev = () => { 1309 const current = currentSelection() 1310 if (!current) { 1311 return 1312 } 1313 current.classList.remove('focused') 1314 const prev = current.previousElementSibling 1315 if (!prev) { 1316 const last = popup.lastElementChild 1317 if (last && last.classList.contains('entry')) { 1318 last.classList.add('focused') 1319 } 1320 } else if (prev.classList.contains('entry')) { 1321 prev.classList.add('focused') 1322 } 1323 } 1324 1325 const focusEntry = entry => { 1326 const current = currentSelection() 1327 current && current.classList.remove('focused') 1328 entry.classList.add('focused') 1329 } 1330 1331 const isValueAddressOrMlsNum = value => { 1332 return value && (value.startsWith('addr:') || value.startsWith('mls:')) 1333 } 1334 1335 const selectItem = item => { 1336 if (!item || !item.classList.contains('entry')) { 1337 return 1338 } 1339 1340 el.value = '' 1341 1342 const label = item.getAttribute('data-label') 1343 const value = item.getAttribute('data-value') 1344 const isAddressOrMlsNum = isValueAddressOrMlsNum(value) 1345 1346 const data = { 1347 label, 1348 value, 1349 isAddressOrMlsNum, 1350 }
1351 listeners.forEach(l => { 1352 try { 1353 l(data) 1354 } catch (e) { 1355 console.warn('WARNING: error in listener', e) 1356 } 1357 }) 1358 1359 item.remove() 1360 } 1361 1362 // event handling 1363 1364 popup.addEventListener('click', ev => { 1365 if (ev.target && ev.target.classList.contains('entry')) { 1366 selectItem(ev.target) 1367 hideTypeahead() 1368 // setTimeout(() => { 1369 el.focus() 1370 // }, 100) 1371 } 1372 }) 1373 1374 const processKey = ev => { 1375 if (ev.key === 'Escape') { 1376 el.value = '' 1377 return hideTypeahead() 1378 } else if (ev.key === 'ArrowDown') { 1379 ev.preventDefault() 1380 if (popup.classList.contains('visible')) { 1381 focusNext() 1382 } else { 1383 if (popup.querySelectorAll('.entry').length === 0) { 1384 return createTypeaheadMessage(MIN_CHARS_MSG) 1385 } 1386 showTypeahead() 1387 } 1388 } else if (ev.key === 'ArrowUp') { 1389 ev.preventDefault() 1390 focusPrev() 1391 } else if (ev.key === 'Enter') { 1392 ev.preventDefault() 1393 ev.stopPropagation() 1394 if (!popup.classList.contains('visible')) { 1395 // popup is not visible, submit the form 1396 return ev.target.form.submit() 1397 } 1398 const sel = currentSelection() 1399 if (sel) { 1400 selectItem(sel) 1401 hideTypeahead() 1402 } 1403 else { 1404 return ev.target.form.submit() 1405 } 1406 } 1407 } 1408 el.addEventListener('keydown', processKey) 1409 1410 const submitButton = el.closest('form').querySelector('[type=submit]') 1411 if( submitButton ) { 1412 submitButton.addEventListener('click', ev => { 1413 ev.preventDefault(); 1414 ev.stopPropagation(); 1415 if (!popup.classList.contains('visible') && el.value ) { 1416 // popup is not visible, submit the form 1417 // if no suggestion was found (perhaps, due to latency) 1418 // but the text was entered, assume it was an MLS number 1419 const mlsNum = document.createElement('div') 1420 mlsNum.setAttribute('data-value', 'mls:' + el.value ) 1421 mlsNum.setAttribute('data-label', el.value ) 1422 mlsNum.classList.add('entry') 1423 selectItem(mlsNum) 1424 hideTypeahead() 1425 return ev.target.closest('[type=submit]').form.submit() 1426 } 1427 const sel = currentSelection() 1428 if (sel) { 1429 selectItem(sel) 1430 hideTypeahead() 1431 } 1432 else if( el.value ) { 1433 // if no suggestion was found (perhaps, due to latency) 1434 // but the text was entered, assume it was an MLS number 1435 const mlsNum = document.createElement('div') 1436 mlsNum.setAttribute('data-value', 'mls:' + el.value ) 1437 mlsNum.setAttribute('data-label', el.value ) 1438 mlsNum.classList.add('entry') 1439 selectItem(mlsNum) 1440 hideTypeahead() 1441 } 1442 return ev.target.closest('[type=submit]').form.submit() 1443 }) 1444 } 1445 1446 const processInput = ev => { 1447 1448 const val = ev.target.value 1449 if (val && val.length > 2) { 1450 doFetch(val, data => { 1451 createTypeahead(data) 1452 }, err => { 1453 console.log('err', err) 1454 }) 1455 } else { 1456 createTypeaheadMessage(MIN_CHARS_MSG) 1457 //hideTypeahead() 1458 } 1459 } 1460 1461 el.addEventListener('input', processInput) 1462 1463 const click = ev => { 1464 if (!popup.classList.contains('visible') && popup.children.length > 0) { 1465 popup.classList.add('visible') 1466 popper.forceUpdate() 1467 } 1468 } 1469 el.addEventListener('mousedown', click) 1470 1471 1472 const clickAway = ev => { 1473 if (ev.target && ev.target.contains(el)) { 1474 return 1475 } 1476 if (ev.target && ev.target.contains(popup)) { 1477 return 1478 } 1479 if (ev.target && ev.target.closest('.typeahead')) { 1480 return 1481 } 1482 if (ev.target && ev.target.closest('[type=submit]')) { 1483 return 1484 } 1485 hideTypeahead() 1486 } 1487 document.querySelector('html').addEventListener('mousedown', clickAway) 1488 1489 1490 // exported 1491 1492 const listeners = [] 1493 1494 function onSelect(callback) { 1495 callback && (typeof callback === 'function') && listeners.push(callback) 1496 } 1497 1498 function destroy() { 1499 el.__typeahead = false 1500 popper.destroy() 1501 el.removeEventListener('keydown', processKey) 1502 el.removeEventListener('input', processInput) 1503 el.removeEventListener('mousedown', click) 1504 document.removeEventListener('mousedown', clickAway) 1505 } 1506 1507 return { 1508 destroy, 1509 onSelect, 1510 } 1511 } 1512 1513 function Selections(el) { 1514 1515 let selections = [] 1516 1517 el.querySelectorAll('input[type=hidden]').forEach(preset => { 1518 const name = preset.getAttribute('name') 1519 const value = preset.getAttribute('value') 1520 const label = preset.getAttribute('data-label') 1521 1522 selections.push({ 1523 name, 1524 value, 1525 label 1526 }) 1527 1528 preset.remove() 1529 }) 1530 1531 const render = () => { 1532 el.innerHTML = '' 1533 selections.forEach(s => { 1534 const pill = document.createElement('span')
1535 pill.classList.add('selection-pill') 1536 const cancel = document.createElement('img') 1537 cancel.src = 'data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' width=\'24\' height=\'24\' viewBox=\'0 0 24 24\'%3e%3cpath d=\'M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12z\'/%3e%3c/svg%3e' 1538 cancel.setAttribute('aria-role', 'button') 1539 cancel.classList.add('cancel') 1540 cancel.innerText = '×' 1541 pill.appendChild(cancel) 1542 1543 cancel.addEventListener('click', ev => { 1544 ev.preventDefault() 1545 remove(s.name, s.value) 1546 }) 1547 const label = document.createElement('span') 1548 label.classList.add('label') 1549 label.innerText = s.label 1550 pill.appendChild(label) 1551 1552 const hidden = document.createElement('input') 1553 hidden.setAttribute('type', 'hidden') 1554 hidden.setAttribute('name', s.name) 1555 hidden.setAttribute('value', s.value) 1556 el.appendChild(hidden) 1557 el.appendChild(pill) 1558 }) 1559 1560 if( selections.length > 3 ) { 1561 const pill = document.createElement('span') 1562 pill.classList.add('selection-pill','clear-all') 1563 const cancel = document.createElement('img') 1564 cancel.src = 'data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' width=\'24\' height=\'24\' viewBox=\'0 0 24 24\'%3e%3cpath d=\'M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12z\'/%3e%3c/svg%3e' 1565 cancel.setAttribute('aria-role', 'button') 1566 cancel.classList.add('cancel') 1567 cancel.innerText = '×' 1568 pill.appendChild(cancel) 1569 1570 pill.addEventListener('click', ev => { 1571 ev.preventDefault() 1572 clear() 1573 }) 1574 const label = document.createElement('span') 1575 label.classList.add('label') 1576 label.innerText = 'Clear all' 1577 pill.appendChild(label) 1578 1579 el.appendChild( pill ) 1580 } 1581 } 1582 1583 const clear = () => { 1584 selections = [] 1585 render() 1586 } 1587 1588 const clearNonMlsOrAddress = () => { 1589 selections = selections.filter(s => { 1590 return s.name === 'omni' && s.isAddressOrMlsNum === true 1591 }) 1592 } 1593 1594 const find = (name, value) => { 1595 return selections.find(s => ( 1596 s.name === name && s.value === value 1597 )) 1598 } 1599 1600 const add = (name, data) => { 1601 if (find(name, data.value)) { 1602 return 1603 } 1604 let label = data.label 1605 if (data.isAddressOrMlsNum === true) { 1606 label = label.replace(/,.+$/, '') 1607 } 1608 selections.push({ 1609 name, 1610 ...data, 1611 label, 1612 }) 1613 render() 1614 } 1615 1616 const remove = (name, value=null) => { 1617 selections = selections.filter(s => { 1618 return !(s.name === name && ( value === null ? true : s.value === value )) 1619 }) 1620 render() 1621 } 1622 1623 const change = ( data, multipleOk=false ) => { 1624 1625 if( data.value === null ) { 1626 selections = selections.filter(s => { 1627 return s.name !== data.name 1628 }) 1629 return render() 1630 } 1631 1632 const found = selections.find( s => ( s.name === data.name && ( multipleOk ? s.value === data.value: true ))) 1633 if( found ) { 1634 found.value = data.value 1635 found.label = data.label 1636 render() 1637 } 1638 else { 1639 add( data.name, data ) 1640 } 1641 } 1642 1643 const unset = ( name, value ) => { 1644 1645 } 1646 1647 const values = () => { 1648 return JSON.parse(JSON.stringify(selections)) 1649 } 1650 1651 render() 1652 1653 return { 1654 clear, 1655 clearNonMlsOrAddress, 1656 add, 1657 remove, 1658 change, 1659 values, 1660 } 1661 } 1662 1663 let meta 1664 let metaPromise 1665 1666 function Metadata(accountId, listingType, context) {
1667 if (metaPromise) { 1668 return metaPromise 1669 } 1670 if (meta) { 1671 return Promise.resolve(meta) 1672 } 1673 return new Promise((resolve, reject) => { 1674 const url = '/wps/-/noframe~true/' + context + '/' + accountId + '/idx.browse?ibf_json=true&' 1675 1676 setTimeout(() => { 1677 1678 fetch(url + '&listingType=' + encodeURIComponent(listingType)) 1679 .then(response => response.json()) 1680 .then(json => { 1681 meta = json 1682 metaPromise = null 1683 resolve(json) 1684 }) 1685 .catch(err => { 1686 metaPromise = null 1687 reject(err) 1688 }) 1689 1690 }, 0) 1691 }) 1692 } 1693 1694 function BaseControl(meta) { 1695 const out = document.createElement('div') 1696 out.classList.add('control') 1697 const heading = document.createElement('div') 1698 heading.classList.add('heading') 1699 const title = document.createElement('div') 1700 title.classList.add('title') 1701 const expandToggle = document.createElement('div') 1702 expandToggle.classList.add('toggle') 1703 const icon = document.createElement('img') 1704 icon.src = 'data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 512 512\'%3e %3cpolygon fill=\'var(--ci-primary-color%2c currentColor)\' points=\'440 240 272 240 272 72 240 72 240 240 72 240 72 272 240 272 240 440 272 440 272 272 440 272 440 240\' class=\'ci-primary\'/%3e %3c/svg%3e' 1705 icon.setAttribute('aria-label', 'Show/Hide control') 1706 icon.setAttribute('aria-role', 'button') 1707 icon.setAttribute('alt', 'Show/Hide control') 1708 expandToggle.appendChild(icon) 1709 1710 heading.appendChild(title) 1711 heading.appendChild(expandToggle) 1712 1713 const contentOuter = document.createElement('div') 1714 contentOuter.classList.add('content-outer') 1715 const contentInner = document.createElement('div') 1716 contentInner.classList.add('content-inner') 1717 1718 contentOuter.appendChild(contentInner) 1719 1720 out.appendChild(heading) 1721 out.appendChild(contentOuter) 1722 1723 out.querySelector('.title').innerText = meta.label 1724 1725 heading.addEventListener('click', () => { 1726 if( heading.classList.contains('fixed')) { 1727 return 1728 } 1729 if (icon.classList.contains('expanded')) { 1730 icon.classList.remove('expanded') 1731 contentOuter.style.height = '0px' 1732 } else { 1733 icon.classList.add('expanded') 1734 const h = contentInner.getBoundingClientRect().height 1735 contentOuter.style.height = h + 'px' 1736 } 1737 // setTimeout(() => { 1738 // contentOuter.closest('.control-panel').popper.update() 1739 // }, 100 ) 1740 }) 1741 1742 return out 1743 } 1744 1745 function nFormatter(num, digits) { 1746 var si = [ 1747 {value: 1, symbol: ""}, 1748 {value: 1E3, symbol: "K"}, 1749 {value: 1E6, symbol: "M"}, 1750 ]; 1751 var rx = /\.0+$|(\.[0-9]*[1-9])0+$/; 1752 var i; 1753 for (i = si.length - 1; i > 0; i--) { 1754 if (num >= si[i].value) { 1755 break; 1756 } 1757 } 1758 return (num / si[i].value).toFixed(digits).replace(rx, "$1") + si[i].symbol; 1759 } 1760 1761 function PriceControl(meta, values, onChange, onClear ) { 1762 1763 const out = BaseControl( meta ) 1764 1765 const min = 0 1766 const max = 10000000 1767 let initialFrom = min 1768 let initialTo = max 1769 1770 if( values ) { 1771 const found = values.find( s => s.name === 'ibf_price') 1772 if( found ) { 1773 const v = found.value 1774 if( v ) { 1775 const parsed = v.split("|") 1776 initialFrom = parseInt(parsed[0]) || initialFrom 1777 initialTo = parseInt(parsed[1]) || initialTo 1778 } 1779 } 1780 } 1781 1782 const content = out.querySelector('.content-inner') 1783 1784 const bar = document.createElement('div') 1785 bar.classList.add( 'slider' ) 1786 1787 const formatter = { 1788 to: val => { 1789 return '$' + new Intl.NumberFormat().format(val.toFixed(0)) 1790 }, 1791 from: str => { 1792 return parseInt( val ) 1793 } 1794 } 1795 1796 1797 noUiSlider.create(bar, { 1798 start: [initialFrom, initialTo], 1799 connect: true, 1800 range: { 1801 'min': [0,1000], 1802 // '5%': [1000,1000], 1803 '5%': [100000,10000], 1804 '70%': [1000000,100000], 1805 '80%': [2000000,500000], 1806 'max': [(initialTo || 10000000)], 1807 }, 1808 ariaFormat: formatter, 1809 }) 1810 1811 const labels = document.createElement('div') 1812 labels.classList.add( 'labels' ) 1813 1814 const from = document.createElement('div') 1815 from.classList.add('value') 1816 labels.appendChild(from) 1817 1818 const to = document.createElement('div') 1819 to.classList.add('value') 1820 labels.appendChild(to) 1821 1822 bar.noUiSlider.on( 'update', values => { 1823 const fromVal = parseInt(values[0]) 1824 const toVal = parseInt(values[1]) 1825 if( fromVal === min ) { 1826 from.innerText = 'Any' 1827 } 1828 else { 1829 from.innerText = formatter.to(fromVal) 1830 } 1831 if( toVal === max ) { 1832 to.innerText = 'Any' 1833 } 1834 else{ 1835 to.innerText = formatter.to(toVal) 1836 } 1837 1838 if( fromVal === min && toVal === max ) { 1839 // console.log( 'onChange null' ) 1840 onClear( 'ibf_price') 1841 } 1842 else { 1843 // console.log( 'onChange', fromVal + '-' + toVal ) 1844 onChange({ 1845 name: 'ibf_price', 1846 value: fromVal + '|' + toVal, 1847 // label: 'Price: ' + nFormatter(fromVal,2) + '-' + nFormatter(toVal, 1) 1848 label: formatter.to(fromVal) + ' - ' + formatter.to(toVal) 1849 }, false ) // multipleOk=false 1850 } 1851 1852 }) 1853 1854 content.appendChild(bar) 1855 content.appendChild(labels) 1856 1857 return out 1858 } 1859 1860 function MixedOptionsControl( meta, values, onChange, onClear ) { 1861 const out = BaseControl( meta ) 1862 const content = out.querySelector('.content-inner') 1863 1864 const name = 'ibf_' + meta.name.toLowerCase() 1865 1866 for( let i = 0; i<meta.groups.length; ++i ) { 1867 1868 const group = meta.groups[i] 1869 1870 if( i > 0 ) { 1871 const subhead = document.createElement('div') 1872 subhead.classList.add( 'subhead' ) 1873 subhead.innerText = group.label 1874 content.appendChild(subhead) 1875 } 1876 1877 const pane = document.createElement('div') 1878 pane.classList.add( 'checkbox-pane') 1879 content.appendChild(pane) 1880 1881 for( const option of group.options ) { 1882 const label = document.createElement('label') 1883 const checkbox = document.createElement('input') 1884 checkbox.setAttribute('type', 'checkbox') 1885 checkbox.setAttribute('value', option[0]) 1886 const text = document.createElement('span') 1887 text.innerText = option[1] 1888 label.appendChild(checkbox) 1889 label.appendChild(text) 1890 pane.appendChild(label) 1891 1892 const found = values.find( v => { 1893 return v.name === name && v.value === option[0] 1894 }) 1895 found && ( checkbox.checked = true ) 1896 1897 checkbox.addEventListener( 'change', ev => { 1898 if( ev.target.checked ) { 1899 onChange( { 1900 name, 1901 label: option[1], 1902 value: option[0], 1903 }, true ) 1904 } 1905 }) 1906 } 1907 } 1908 1909 return out 1910 } 1911 1912 function SingleOptionControl( meta, values, onChange, onClear ) { 1913 const out = BaseControl( meta ) 1914 const content = out.querySelector('.content-inner') 1915 1916 const name = 'ibf_' + meta.name.toLowerCase() 1917 1918 const pane = document.createElement('div') 1919 pane.classList.add( 'checkbox-pane') 1920 content.appendChild(pane) 1921 1922 for( const option of meta.options ) { 1923 1924 if( !option[0] ) { 1925 continue; 1926 } 1927 const label = document.createElement('label') 1928 const checkbox = document.createElement('input') 1929 checkbox.setAttribute('type', 'radio') 1930 checkbox.setAttribute('value', option[0]) 1931 const text = document.createElement('span') 1932 text.innerText = option[1] 1933 label.appendChild(checkbox) 1934 label.appendChild(text) 1935 pane.appendChild(label) 1936 1937 const found = values.find( v => { 1938 return v.name === name && v.value === option[0] 1939 }) 1940 found && ( checkbox.checked = true ) 1941 1942 checkbox.addEventListener( 'change', ev => { 1943 1944 pane.querySelectorAll('input[type=radio]').forEach( r => { 1945 if( r.getAttribute('value') !== ev.target.value ) { 1946 r.checked = false 1947 } 1948 }) 1949 1950 if( ev.target.checked ) { 1951 onChange( { 1952 name, 1953 label: meta.label + ': ' + option[1], 1954 value: option[0], 1955 }, false ) 1956 } 1957 }) 1958 } 1959 1960 return out 1961 } 1962 1963 function Control(meta, values, onChange, onClear ) { 1964 1965 if( meta.type === 'PriceControl' ) { 1966 return PriceControl(meta, values, onChange, onClear) 1967 } 1968 else if( meta.type === 'MixedOptionsControl' ) { 1969 return MixedOptionsControl(meta, values, onChange, onClear) 1970 } 1971 else if( meta.type === 'SingleOptionControl' ) { 1972 return SingleOptionControl( meta, values, onChange, onClear) 1973 } 1974 1975 return null 1976 } 1977 1978 function ControlPanel(el, metadataFetcher, selections ) { 1979 const what = el.getAttribute('data-omni-trigger'); 1980 if (!what) { 1981 return 1982 } 1983 1984 const popup = document.createElement("div") 1985 popup.setAttribute("class", "control-panel elevation8")
1986 el.parentElement.appendChild(popup) 1987 1988 // popup.innerHTML = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris tempor ultricies interdum. Suspendisse potenti. Sed consectetur, odio eget mattis commodo, metus massa tincidunt sapien, quis tincidunt sapien mi sed ipsum. Suspendisse eleifend sodales nulla, sit amet vehicula mauris bibendum vitae. Integer condimentum suscipit libero ac pharetra. In eget viverra felis. Cras odio nisi, lacinia eget semper ut, dictum vitae odio. Pellentesque at suscipit justo, id sagittis nisl.' 1989 1990 const popper = Popper.createPopper(el, popup, { 1991 placement: 'bottom', 1992 modifiers: [ 1993 { 1994 name: 'offset', 1995 options: { 1996 offset: [0, 0], 1997 }, 1998 }, 1999 { 2000 name: 'flip', 2001 options: { 2002 // flipVariations: false, // true by default 2003 // allowedAutoPlacements: ['bottom'], 2004 fallbackPlacements: ['bottom'], 2005 }, 2006 }, 2007 ], 2008 }) 2009 2010 popup.popper = popper 2011 2012 window.addEventListener( 'resize', () => { 2013 if( !_G.isMobile() ) { 2014 hidePopup() 2015 } 2016 }, {passive: true}) 2017 2018 const showPopup = () => { 2019 popup.classList.add('visible') 2020 popup.classList.add('becoming') 2021 popper.forceUpdate() 2022 setTimeout(() => { 2023 popup.classList.remove('becoming') 2024 }, 10) 2025 } 2026 2027 const hidePopup = () => { 2028 if (!isVisible()) { 2029 return 2030 } 2031 popup.addEventListener('transitionend', () => { 2032 popup.classList.remove('visible') 2033 popup.classList.remove('becoming') 2034 }, {once: true}) 2035 popup.classList.add('becoming') 2036 } 2037 2038 const isVisible = () => { 2039 return popup.classList.contains('visible') 2040 } 2041 2042 const renderProgress = () => { 2043 const loading = document.createElement('div') 2044 loading.classList.add('progress') 2045 const ind = document.createElement('img') 2046 ind.setAttribute('src', 'data:image/svg+xml,%3c%3fxml version=\'1.0\' encoding=\'UTF-8\'%3f%3e%3c!DOCTYPE svg PUBLIC \'-//W3C//DTD SVG 1.1//EN\' \'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\'%3e%3csvg xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\' version=\'1.1\' id=\'mdi-refresh-circle\' width=\'24\' height=\'24\' viewBox=\'0 0 24 24\'%3e%3cpath d=\'M12 2A10 10 0 1 0 22 12A10 10 0 0 0 12 2M18 11H13L14.81 9.19A3.94 3.94 0 0 0 12 8A4 4 0 1 0 15.86 13H17.91A6 6 0 1 1 12 6A5.91 5.91 0 0 1 16.22 7.78L18 6Z\' /%3e%3c/svg%3e') 2047 ind.classList.add('indicator') 2048 loading.appendChild(ind) 2049 popup.innerHTML = '' 2050 popup.appendChild(loading) 2051 } 2052 2053 const renderError = err => { 2054 const error = document.createElement('div') 2055 error.classList.add('error') 2056 2057 const msg = document.createElement('div') 2058 msg.classList.add('message') 2059 msg.innerText = 'Sorry, an unexpected error occurred: ' 2060 2061 const details = document.createElement('div') 2062 details.classList.add('message') 2063 details.innerText = err.toString() 2064 2065 error.appendChild(msg) 2066 error.appendChild(details) 2067 2068 const reload = document.createElement('button') 2069 reload.classList.add('button') 2070 reload.classList.add('small') 2071 reload.innerText = 'Try again' 2072 2073 reload.addEventListener('click', ev => { 2074 ev.preventDefault() 2075 hidePopup() 2076 setTimeout(() => { 2077 render() 2078 }, 200) 2079 }) 2080 2081 error.appendChild(reload) 2082 2083 popup.innerHTML = '' 2084 popup.appendChild(error) 2085 } 2086 2087 const renderControls = meta => { 2088 2089 const filterProp = getComputedStyle(el).getPropertyValue('--OMNI-CONTROLS') 2090 let filters = [] 2091 if( filterProp ) { 2092 filters = filterProp.split(',') 2093 filters = filters.map( f => f.trim() ) 2094 } 2095 if( filters.length == 1 && ( filters[0] === '' || filters[0] === 'all' )) { 2096 filters = [] 2097 } 2098 2099 popup.innerHTML = '' 2100 let numControls = 0
2101 meta.controls.forEach(c => { 2102 const skip = filters.length > 0 && filters.find( f => { 2103 if( !f ) return false 2104 if( f.startsWith('-') && f.substring(1) === c.name ) { 2105 return true // skip 2106 } 2107 else if( f === c.name ) { 2108 return false 2109 } 2110 else { 2111 if( filters[0].startsWith('-')) { 2112 return false 2113 } 2114 else { 2115 return true 2116 } 2117 } 2118 }) 2119 2120 if( skip ) { 2121 return 2122 } 2123 2124 const control = Control(c, selections.values(), selections.change, selections.remove) 2125 if( control ) { 2126 popup.appendChild(control) 2127 numControls++ 2128 } 2129 }) 2130 if( numControls === 1 ) { 2131 popup.querySelector('.content-outer').style.height = 'auto' 2132 popup.querySelector( '.heading' ).classList.add('fixed'); 2133 } 2134 } 2135 2136 const render = () => { 2137 2138 let timer = setTimeout(() => { 2139 renderProgress() 2140 showPopup() 2141 popper.forceUpdate() 2142 timer = null 2143 }, 300) 2144 2145 metadataFetcher().then(meta => { 2146 renderControls(meta) 2147 }).catch(err => { 2148 console.error( err ) 2149 renderError(err) 2150 }).finally(() => { 2151 if (timer) { 2152 clearTimeout(timer) 2153 timer = null 2154 showPopup() 2155 } 2156 else { 2157 popper.forceUpdate() 2158 } 2159 }) 2160 } 2161 2162 2163 el.addEventListener('click', () => { 2164 isVisible() ? hidePopup() : render() 2165 }) 2166 2167 const clickAway = ev => { 2168 // const html = document.querySelector('html') 2169 console.log( 'clickaway', ev.target ) 2170 if( popup.contains(ev.target) ) { 2171 return 2172 } 2173 // if (ev.target && ev.target.closest('.control-panel')) { 2174 // return 2175 // } 2176 hidePopup() 2177 } 2178 document.querySelector('html').addEventListener('mousedown', clickAway) 2179 2180 const debug = (event) => { 2181 console.log( 'fired', event ) 2182 } 2183 document.addEventListener('touchstart', debug) 2184 document.addEventListener('touchmove', debug) 2185 document.addEventListener('touchend', debug) 2186 document.addEventListener('touchcancel', debug) 2187 } 2188 2189 function OmniboxForm(el) { 2190 2191 if (el.__omniInited) { 2192 return 2193 } 2194 2195 el.__omniInited = true 2196 el.classList.add('inited') 2197 2198 const accountId = parseInt(el.getAttribute('data-account')) || 0 2199 const context = el.getAttribute('data-context') || 'recip' 2200 const listingType = el.querySelector('input[name=listingType]').value || 'AUTO' 2201 2202 const isImmediateSearch = el.getAttribute('data-immediate') === 'true' 2203 2204 const metadataFetcher = () => { 2205 return Metadata(accountId, listingType, context ) 2206 } 2207 // prime the meta 2208 metadataFetcher() 2209 2210 const selections = Selections(el.querySelector('[data-rel=selections]')) 2211 2212 const omniElem = el.querySelector('[data-rel=omni]') 2213 if (omniElem) { 2214 const typeahead = Typeahead(omniElem, accountId) 2215 typeahead.onSelect(data => { 2216 const toadd = { 2217 ...data, 2218 label: data.label, 2219 value: data.value + '[' + data.label + ']', 2220 } 2221 if (data.isAddressOrMlsNum) { 2222 selections.clearNonMlsOrAddress() 2223 selections.add('omni', toadd) 2224 } else { 2225 selections.add('omni', toadd) 2226 } 2227 2228 if( isImmediateSearch ) { 2229 const submitButton = el.closest('form').querySelector('[type=submit]') 2230 if (submitButton) { 2231 submitButton.click() 2232 } 2233 } 2234 }) 2235 } 2236 2237 const triggers = el.querySelectorAll('[data-omni-trigger]:not([data-omni-trigger=\"\"])').forEach(t => { 2238 ControlPanel(t, metadataFetcher, selections ) 2239 }) 2240 2241 return {} 2242 } 2243
2244 function init() { 2245 document.querySelectorAll('.omnibox-form').forEach(el => { 2246 OmniboxForm(el) 2247 }) 2248 } 2249 2250 document.addEventListener('DOMContentLoaded', init) 2251 2252 _G.reinitHandlers.push(init) 2253})(); 2254 2255/* ==== INCLUDE: /js/blocks/nouislider.14.6.2.min.js ==== */ 2256 2257/*! nouislider - 14.6.2 - 9/16/2020 */ 2258!function(t){"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?module.exports=t():window.noUiSlider=t()}(function(){"use strict";var lt="14.6.2";function ut(t){t.parentElement.removeChild(t)}function a(t){return null!=t}function ct(t){t.preventDefault()}function o(t){return"number"==typeof t&&!isNaN(t)&&isFinite(t)}function pt(t,e,r){0<r&&(ht(t,e),setTimeout(function(){mt(t,e)},r))}function ft(t){return Math.max(Math.min(t,100),0)}function dt(t){return Array.isArray(t)?t:[t]}function e(t){var e=(t=String(t)).split(".");return 1<e.length?e[1].length:0}function ht(t,e){t.classList&&!/\s/.test(e)?t.classList.add(e):t.className+=" "+e}function mt(t,e){t.classList&&!/\s/.test(e)?t.classList.remove(e):t.className=t.className.replace(new RegExp("(^|\\b)"+e.split(" ").join("|")+"(\\b|$)","gi")," ")}function gt(t){var e=void 0!==window.pageXOffset,r="CSS1Compat"===(t.compatMode||"");return{x:e?window.pageXOffset:r?t.documentElement.scrollLeft:t.body.scrollLeft,y:e?window.pageYOffset:r?t.documentElement.scrollTop:t.body.scrollTop}}function c(t,e){return 100/(e-t)}function p(t,e,r){return 100*e/(t[r+1]-t[r])}function f(t,e){for(var r=1;t>=e[r];)r+=1;return r}function r(t,e,r){if(r>=t.slice(-1)[0])return 100;var n,i,o=f(r,t),s=t[o-1],a=t[o],l=e[o-1],u=e[o];return l+(i=r,p(n=[s,a],n[0]<0?i+Math.abs(n[0]):i-n[0],0)/c(l,u))}function n(t,e,r,n){if(100===n)return n;var i,o,s=f(n,t),a=t[s-1],l=t[s];return r?(l-a)/2<n-a?l:a:e[s-1]?t[s-1]+(i=n-t[s-1],o=e[s-1],Math.round(i/o)*o):n}function s(t,e,r){var n;if("number"==typeof e&&(e=[e]),!Array.isArray(e))throw new Error("noUiSlider ("+lt+"): 'range' contains invalid value.");if(!o(n="min"===t?0:"max"===t?100:parseFloat(t))||!o(e[0]))throw new Error("noUiSlider ("+lt+"): 'range' value isn't numeric.");r.xPct.push(n),r.xVal.push(e[0]),n?r.xSteps.push(!isNaN(e[1])&&e[1]):isNaN(e[1])||(r.xSteps[0]=e[1]),r.xHighestCompleteStep.push(0)}function l(t,e,r){if(e)if(r.xVal[t]!==r.xVal[t+1]){r.xSteps[t]=p([r.xVal[t],r.xVal[t+1]],e,0)/c(r.xPct[t],r.xPct[t+1]);var n=(r.xVal[t+1]-r.xVal[t])/r.xNumSteps[t],i=Math.ceil(Number(n.toFixed(3))-1),o=r.xVal[t]+r.xNumSteps[t]*i;r.xHighestCompleteStep[t]=o}else r.xSteps[t]=r.xHighestCompleteStep[t]=r.xVal[t]}function i(t,e,r){var n;this.xPct=[],this.xVal=[],this.xSteps=[r||!1],this.xNumSteps=[!1],this.xHighestCompleteStep=[],this.snap=e;var i=[];for(n in t)t.hasOwnProperty(n)&&i.push([t[n],n]);for(i.length&&"object"==typeof i[0][0]?i.sort(function(t,e){return t[0][0]-e[0][0]}):i.sort(function(t,e){return t[0]-e[0]}),n=0;n<i.length;n++)s(i[n][1],i[n][0],this);for(this.xNumSteps=this.xSteps.slice(0),n=0;n<this.xNumSteps.length;n++)l(n,this.xNumSteps[n],this)}i.prototype.getDistance=function(t){var e,r=[];for(e=0;e<this.xNumSteps.length-1;e++){var n=this.xNumSteps[e];if(n&&t/n%1!=0)throw new Error("noUiSlider ("+lt+"): 'limit', 'margin' and 'padding' of "+this.xPct[e]+"% range must be divisible by step.");r[e]=p(this.xVal,t,e)}return r},i.prototype.getAbsoluteDistance=function(t,e,r){var n,i=0;if(t<this.xPct[this.xPct.length-1])for(;t>this.xPct[i+1];)i++;else t===this.xPct[this.xPct.length-1]&&(i=this.xPct.length-2);r||t!==this.xPct[i+1]||i++;var o=1,s=e[i],a=0,l=0,u=0,c=0;for(n=r?(t-this.xPct[i])/(this.xPct[i+1]-this.xPct[i]):(this.xPct[i+1]-t)/(this.xPct[i+1]-this.xPct[i]);0<s;)a=this.xPct[i+1+c]-this.xPct[i+c],100<e[i+c]*o+100-100*n?(l=a*n,o=(s-100*n)/e[i+c],n=1):(l=e[i+c]*a/100*o,o=0),r?(u-=l,1<=this.xPct.length+c&&c--):(u+=l,1<=this.xPct.length-c&&c++),s=e[i+c]*o;return t+u},i.prototype.toStepping=function(t){return t=r(this.xVal,this.xPct,t)},i.prototype.fromStepping=function(t){return function(t,e,r){if(100<=r)return t.slice(-1)[0];var n,i=f(r,e),o=t[i-1],s=t[i],a=e[i-1],l=e[i];return n=[o,s],(r-a)*c(a,l)*(n[1]-n[0])/100+n[0]}(this.xVal,this.xPct,t)},i.prototype.getStep=function(t){return t=n(this.xPct,this.xSteps,this.snap,t)},i.prototype.getDefaultStep=function(t,e,r){var n=f(t,this.xPct);return(100===t||e&&t===this.xPct[n-1])&&(n=Math.max(n-1,1)),(this.xVal[n]-this.xVal[n-1])/r},i.prototype.getNearbySteps=function(t){var e=f(t,this.xPct);return{stepBefore:{startValue:this.xVal[e-2],step:this.xNumSteps[e-2],highestStep:this.xHighestCompleteStep[e-2]},thisStep:{startValue:this.xVal[e-1],step:this.xNumSteps[e-1],highestStep:this.xHighestCompleteStep[e-1]},stepAfter:{startValue:this.xVal[e],step:this.xNumSteps[e],highestStep:this.xHighestCompleteStep[e]}}},i.prototype.countStepDecimals=function(){var t=this.xNumSteps.map(e);return Math.max.apply(null,t)}
2258,i.prototype.convert=function(t){return this.getStep(this.toStepping(t))};var u={to:function(t){return void 0!==t&&t.toFixed(2)},from:Number},d={target:"target",base:"base",origin:"origin",handle:"handle",handleLower:"handle-lower",handleUpper:"handle-upper",touchArea:"touch-area",horizontal:"horizontal",vertical:"vertical",background:"background",connect:"connect",connects:"connects",ltr:"ltr",rtl:"rtl",textDirectionLtr:"txt-dir-ltr",textDirectionRtl:"txt-dir-rtl",draggable:"draggable",drag:"state-drag",tap:"state-tap",active:"active",tooltip:"tooltip",pips:"pips",pipsHorizontal:"pips-horizontal",pipsVertical:"pips-vertical",marker:"marker",markerHorizontal:"marker-horizontal",markerVertical:"marker-vertical",markerNormal:"marker-normal",markerLarge:"marker-large",markerSub:"marker-sub",value:"value",valueHorizontal:"value-horizontal",valueVertical:"value-vertical",valueNormal:"value-normal",valueLarge:"value-large",valueSub:"value-sub"};function h(t){if("object"==typeof(e=t)&&"function"==typeof e.to&&"function"==typeof e.from)return!0;var e;throw new Error("noUiSlider ("+lt+"): 'format' requires 'to' and 'from' methods.")}function m(t,e){if(!o(e))throw new Error("noUiSlider ("+lt+"): 'step' is not numeric.");t.singleStep=e}function g(t,e){if(!o(e))throw new Error("noUiSlider ("+lt+"): 'keyboardPageMultiplier' is not numeric.");t.keyboardPageMultiplier=e}function v(t,e){if(!o(e))throw new Error("noUiSlider ("+lt+"): 'keyboardDefaultStep' is not numeric.");t.keyboardDefaultStep=e}function b(t,e){if("object"!=typeof e||Array.isArray(e))throw new Error("noUiSlider ("+lt+"): 'range' is not an object.");if(void 0===e.min||void 0===e.max)throw new Error("noUiSlider ("+lt+"): Missing 'min' or 'max' in 'range'.");if(e.min===e.max)throw new Error("noUiSlider ("+lt+"): 'range' 'min' and 'max' cannot be equal.");t.spectrum=new i(e,t.snap,t.singleStep)}function x(t,e){if(e=dt(e),!Array.isArray(e)||!e.length)throw new Error("noUiSlider ("+lt+"): 'start' option is incorrect.");t.handles=e.length,t.start=e}function S(t,e){if("boolean"!=typeof(t.snap=e))throw new Error("noUiSlider ("+lt+"): 'snap' option must be a boolean.")}function w(t,e){if("boolean"!=typeof(t.animate=e))throw new Error("noUiSlider ("+lt+"): 'animate' option must be a boolean.")}function y(t,e){if("number"!=typeof(t.animationDuration=e))throw new Error("noUiSlider ("+lt+"): 'animationDuration' option must be a number.")}function E(t,e){var r,n=[!1];if("lower"===e?e=[!0,!1]:"upper"===e&&(e=[!1,!0]),!0===e||!1===e){for(r=1;r<t.handles;r++)n.push(e);n.push(!1)}else{if(!Array.isArray(e)||!e.length||e.length!==t.handles+1)throw new Error("noUiSlider ("+lt+"): 'connect' option doesn't match handle count.");n=e}t.connect=n}function C(t,e){switch(e){case"horizontal":t.ort=0;break;case"vertical":t.ort=1;break;default:throw new Error("noUiSlider ("+lt+"): 'orientation' option is invalid.")}}function P(t,e){if(!o(e))throw new Error("noUiSlider ("+lt+"): 'margin' option must be numeric.");0!==e&&(t.margin=t.spectrum.getDistance(e))}function N(t,e){if(!o(e))throw new Error("noUiSlider ("+lt+"): 'limit' option must be numeric.");if(t.limit=t.spectrum.getDistance(e),!t.limit||t.handles<2)throw new Error("noUiSlider ("+lt+"): 'limit' option is only supported on linear sliders with 2 or more handles.")}function k(t,e){var r;if(!o(e)&&!Array.isArray(e))throw new Error("noUiSlider ("+lt+"): 'padding' option must be numeric or array of exactly 2 numbers.");if(Array.isArray(e)&&2!==e.length&&!o(e[0])&&!o(e[1]))throw new Error("noUiSlider ("+lt+"): 'padding' option must be numeric or array of exactly 2 numbers.");if(0!==e){for(Array.isArray(e)||(e=[e,e]),t.padding=[t.spectrum.getDistance(e[0]),t.spectrum.getDistance(e[1])],r=0;r<t.spectrum.xNumSteps.length-1;r++)if(t.padding[0][r]<0||t.padding[1][r]<0)throw new Error("noUiSlider ("+lt+"): 'padding' option must be a positive number(s).");var n=e[0]+e[1],i=t.spectrum.xVal[0];if(1<n/(t.spectrum.xVal[t.spectrum.xVal.length-1]-i))throw new Error("noUiSlider ("+lt+"): 'padding' option must not exceed 100% of the range.")}}function U(t,e){switch(e){case"ltr":t.dir=0;break;case"rtl":t.dir=1;break;default:throw new Error("noUiSlider ("+lt+"): 'direction' option was not recognized.")}}function A(t,e){if("string"!=typeof e)throw new Error("noUiSlider ("+lt+"): 'behaviour' must be a string containing options.");var r=0<=e.indexOf("tap"),n=0<=e.indexOf("drag"),i=0<=e.indexOf("fixed"),o=0<=e.indexOf("snap"),s=0<=e.indexOf("hover"),a=0<=e.indexOf("unconstrained");if(i){if(2!==t.handles)throw new Error("noUiSlider ("+lt+"): 'fixed' behaviour must be used with 2 handles");P(t,t.start[1]-t.start[0])}if(a&&(t.margin||t.limit))throw new Error("noUiSlider ("+lt+"): 'unconstrained' behaviour cannot be used with margin or limit");t.events={tap:r||o,drag:n,fixed:i,snap:o,hover:s,unconstrained:a}}function V(t,e){if(!1!==e)if(!0===e){t.tooltips=[];for(var r=0;r<t.handles;r++)t.tooltips.push(!0)}else{if(t.tooltips=dt(e),t.tooltips.length!==t.handles)throw new Error("noUiSlider ("+lt+"): must pass a formatter for all handles.");t.tooltips.forEach(function(t){if("boolean"!=typeof t&&("object"!=typeof t||"function"!=typeof t.to))throw new Error("noUiSlider ("+lt+"): 'tooltips' must be passed a formatter or 'false'.")})}}function D(t,e){h(t.ariaFormat=e)}function M(t,e){h(t.format=e)}function O(t,e){if("boolean"!=typeof(t.keyboardSupport=e))throw new Error("noUiSlider ("+lt+"): 'keyboardSupport' option must be a boolean.")}function L(t,e){t.documentElement=e}function z(t,e){if("string"!=typeof e&&!1!==e)throw new Error("noUiSlider ("+lt+"): 'cssPrefix' must be a string or `false`.");t.cssPrefix=e}function H(t,e){if("object"!=typeof e)throw new Error("noUiSlider ("+lt+"): 'cssClasse
2258s' must be an object.");if("string"==typeof t.cssPrefix)for(var r in t.cssClasses={},e)e.hasOwnProperty(r)&&(t.cssClasses[r]=t.cssPrefix+e[r]);else t.cssClasses=e}function vt(e){var r={margin:0,limit:0,padding:0,animate:!0,animationDuration:300,ariaFormat:u,format:u},n={step:{r:!1,t:m},keyboardPageMultiplier:{r:!1,t:g},keyboardDefaultStep:{r:!1,t:v},start:{r:!0,t:x},connect:{r:!0,t:E},direction:{r:!0,t:U},snap:{r:!1,t:S},animate:{r:!1,t:w},animationDuration:{r:!1,t:y},range:{r:!0,t:b},orientation:{r:!1,t:C},margin:{r:!1,t:P},limit:{r:!1,t:N},padding:{r:!1,t:k},behaviour:{r:!0,t:A},ariaFormat:{r:!1,t:D},format:{r:!1,t:M},tooltips:{r:!1,t:V},keyboardSupport:{r:!0,t:O},documentElement:{r:!1,t:L},cssPrefix:{r:!0,t:z},cssClasses:{r:!0,t:H}},i={connect:!1,direction:"ltr",behaviour:"tap",orientation:"horizontal",keyboardSupport:!0,cssPrefix:"noUi-",cssClasses:d,keyboardPageMultiplier:5,keyboardDefaultStep:10};e.format&&!e.ariaFormat&&(e.ariaFormat=e.format),Object.keys(n).forEach(function(t){if(!a(e[t])&&void 0===i[t]){if(n[t].r)throw new Error("noUiSlider ("+lt+"): '"+t+"' is required.");return!0}n[t].t(r,a(e[t])?e[t]:i[t])}),r.pips=e.pips;var t=document.createElement("div"),o=void 0!==t.style.msTransform,s=void 0!==t.style.transform;r.transformRule=s?"transform":o?"msTransform":"webkitTransform";return r.style=[["left","top"],["right","bottom"]][r.dir][r.ort],r}function j(t,b,o){var l,u,s,c,i,a,e,p,f=window.navigator.pointerEnabled?{start:"pointerdown",move:"pointermove",end:"pointerup"}:window.navigator.msPointerEnabled?{start:"MSPointerDown",move:"MSPointerMove",end:"MSPointerUp"}:{start:"mousedown touchstart",move:"mousemove touchmove",end:"mouseup touchend"},d=window.CSS&&CSS.supports&&CSS.supports("touch-action","none")&&function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("test",null,e)}catch(t){}return t}(),h=t,y=b.spectrum,x=[],S=[],m=[],g=0,v={},w=t.ownerDocument,E=b.documentElement||w.documentElement,C=w.body,P=-1,N=0,k=1,U=2,A="rtl"===w.dir||1===b.ort?0:100;function V(t,e){var r=w.createElement("div");return e&&ht(r,e),t.appendChild(r),r}function D(t,e){var r=V(t,b.cssClasses.origin),n=V(r,b.cssClasses.handle);return V(n,b.cssClasses.touchArea),n.setAttribute("data-handle",e),b.keyboardSupport&&(n.setAttribute("tabindex","0"),n.addEventListener("keydown",function(t){return function(t,e){if(O()||L(e))return!1;var r=["Left","Right"],n=["Down","Up"],i=["PageDown","PageUp"],o=["Home","End"];b.dir&&!b.ort?r.reverse():b.ort&&!b.dir&&(n.reverse(),i.reverse());var s,a=t.key.replace("Arrow",""),l=a===i[0],u=a===i[1],c=a===n[0]||a===r[0]||l,p=a===n[1]||a===r[1]||u,f=a===o[0],d=a===o[1];if(!(c||p||f||d))return!0;if(t.preventDefault(),p||c){var h=b.keyboardPageMultiplier,m=c?0:1,g=at(e),v=g[m];if(null===v)return!1;!1===v&&(v=y.getDefaultStep(S[e],c,b.keyboardDefaultStep)),(u||l)&&(v*=h),v=Math.max(v,1e-7),v*=c?-1:1,s=x[e]+v}else s=d?b.spectrum.xVal[b.spectrum.xVal.length-1]:b.spectrum.xVal[0];return rt(e,y.toStepping(s),!0,!0),J("slide",e),J("update",e),J("change",e),J("set",e),!1}(t,e)})),n.setAttribute("role","slider"),n.setAttribute("aria-orientation",b.ort?"vertical":"horizontal"),0===e?ht(n,b.cssClasses.handleLower):e===b.handles-1&&ht(n,b.cssClasses.handleUpper),r}function M(t,e){return!!e&&V(t,b.cssClasses.connect)}function r(t,e){return!!b.tooltips[e]&&V(t.firstChild,b.cssClasses.tooltip)}function O(){return h.hasAttribute("disabled")}function L(t){return u[t].hasAttribute("disabled")}function z(){i&&(G("update.tooltips"),i.forEach(function(t){t&&ut(t)}),i=null)}function H(){z(),i=u.map(r),$("update.tooltips",function(t,e,r){if(i[e]){var n=t[e];!0!==b.tooltips[e]&&(n=b.tooltips[e].to(r[e])),i[e].innerHTML=n}})}function j(e,i,o){var s=w.createElement("div"),a=[];a[N]=b.cssClasses.valueNormal,a[k]=b.cssClasses.valueLarge,a[U]=b.cssClasses.valueSub;var l=[];l[N]=b.cssClasses.markerNormal,l[k]=b.cssClasses.markerLarge,l[U]=b.cssClasses.markerSub;var u=[b.cssClasses.valueHorizontal,b.cssClasses.valueVertical],c=[b.cssClasses.markerHorizontal,b.cssClasses.markerVertical];
2258function p(t,e){var r=e===b.cssClasses.value,n=r?a:l;return e+" "+(r?u:c)[b.ort]+" "+n[t]}return ht(s,b.cssClasses.pips),ht(s,0===b.ort?b.cssClasses.pipsHorizontal:b.cssClasses.pipsVertical),Object.keys(e).forEach(function(t){!function(t,e,r){if((r=i?i(e,r):r)!==P){var n=V(s,!1);n.className=p(r,b.cssClasses.marker),n.style[b.style]=t+"%",N<r&&((n=V(s,!1)).className=p(r,b.cssClasses.value),n.setAttribute("data-value",e),n.style[b.style]=t+"%",n.innerHTML=o.to(e))}}(t,e[t][0],e[t][1])}),s}function F(){c&&(ut(c),c=null)}function R(t){F();var m,g,v,b,e,r,x,S,w,n=t.mode,i=t.density||1,o=t.filter||!1,s=function(t,e,r){if("range"===t||"steps"===t)return y.xVal;if("count"===t){if(e<2)throw new Error("noUiSlider ("+lt+"): 'values' (>= 2) required for mode 'count'.");var n=e-1,i=100/n;for(e=[];n--;)e[n]=n*i;e.push(100),t="positions"}return"positions"===t?e.map(function(t){return y.fromStepping(r?y.getStep(t):t)}):"values"===t?r?e.map(function(t){return y.fromStepping(y.getStep(y.toStepping(t)))}):e:void 0}(n,t.values||!1,t.stepped||!1),a=(m=i,g=n,v=s,b={},e=y.xVal[0],r=y.xVal[y.xVal.length-1],S=x=!1,w=0,(v=v.slice().sort(function(t,e){return t-e}).filter(function(t){return!this[t]&&(this[t]=!0)},{}))[0]!==e&&(v.unshift(e),x=!0),v[v.length-1]!==r&&(v.push(r),S=!0),v.forEach(function(t,e){var r,n,i,o,s,a,l,u,c,p,f=t,d=v[e+1],h="steps"===g;if(h&&(r=y.xNumSteps[e]),r||(r=d-f),!1!==f)for(void 0===d&&(d=f),r=Math.max(r,1e-7),n=f;n<=d;n=(n+r).toFixed(7)/1){for(u=(s=(o=y.toStepping(n))-w)/m,p=s/(c=Math.round(u)),i=1;i<=c;i+=1)b[(a=w+i*p).toFixed(5)]=[y.fromStepping(a),0];l=-1<v.indexOf(n)?k:h?U:N,!e&&x&&n!==d&&(l=0),n===d&&S||(b[o.toFixed(5)]=[n,l]),w=o}}),b),l=t.format||{to:Math.round};return c=h.appendChild(j(a,o,l))}function T(){var t=l.getBoundingClientRect(),e="offset"+["Width","Height"][b.ort];return 0===b.ort?t.width||l[e]:t.height||l[e]}function B(n,i,o,s){var e=function(t){return!!(t=function(t,e,r){var n,i,o=0===t.type.indexOf("touch"),s=0===t.type.indexOf("mouse"),a=0===t.type.indexOf("pointer");0===t.type.indexOf("MSPointer")&&(a=!0);if("mousedown"===t.type&&!t.buttons&&!t.touches)return!1;if(o){var l=function(t){return t.target===r||r.contains(t.target)||t.target.shadowRoot&&t.target.shadowRoot.contains(r)};if("touchstart"===t.type){var u=Array.prototype.filter.call(t.touches,l);if(1<u.length)return!1;n=u[0].pageX,i=u[0].pageY}else{var c=Array.prototype.find.call(t.changedTouches,l);if(!c)return!1;n=c.pageX,i=c.pageY}}e=e||gt(w),(s||a)&&(n=t.clientX+e.x,i=t.clientY+e.y);return t.pageOffset=e,t.points=[n,i],t.cursor=s||a,t}(t,s.pageOffset,s.target||i))&&(!(O()&&!s.doNotReject)&&(e=h,r=b.cssClasses.tap,!((e.classList?e.classList.contains(r):new RegExp("\\b"+r+"\\b").test(e.className))&&!s.doNotReject)&&(!(n===f.start&&void 0!==t.buttons&&1<t.buttons)&&((!s.hover||!t.buttons)&&(d||t.preventDefault(),t.calcPoint=t.points[b.ort],void o(t,s))))));var e,r},r=[];return n.split(" ").forEach(function(t){i.addEventListener(t,e,!!d&&{passive:!0}),r.push([t,e])}),r}function q(t){var e,r,n,i,o,s,a=100*(t-(e=l,r=b.ort,n=e.getBoundingClientRect(),i=e.ownerDocument,o=i.documentElement,s=gt(i),/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)&&(s.x=0),r?n.top+s.y-o.clientTop:n.left+s.x-o.clientLeft))/T();return a=ft(a),b.dir?100-a:a}function X(t,e){"mouseout"===t.type&&"HTML"===t.target.nodeName&&null===t.relatedTarget&&_(t,e)}function Y(t,e){if(-1===navigator.appVersion.indexOf("MSIE 9")&&0===t.buttons&&0!==e.buttonsProperty)return _(t,e);var r=(b.dir?-1:1)*(t.calcPoint-e.startCalcPoint);Z(0<r,100*r/e.baseSize,e.locations,e.handleNumbers)}function _(t,e){e.handle&&(mt(e.handle,b.cssClasses.active),g-=1),e.listeners.forEach(function(t){E.removeEventListener(t[0],t[1])}),0===g&&(mt(h,b.cssClasses.drag),et(),t.cursor&&(C.style.cursor="",C.removeEventListener("selectstart",ct))),e.handleNumbers.forEach(function(t){J("change",t),J("set",t),J("end",t)})}function I(t,e){if(e.handleNumbers.some(L))return!1;var r;1===e.handleNumbers.length&&(r=u[e.handleNumbers[0]].children[0],g+=1,ht(r,b.cssClasses.active));t.stopPropagation();var n=[],i=B(f.move,E,Y,{target:t.target,handle:r,listeners:n,startCalcPoint:t.calcPoint,baseSize:T(),pageOffset:t.pageOffset,handleNumbers:e.handleNumbers,buttonsProperty:t.buttons,locations:S.slice()}),o=B(f.end,E,_,{target:t.target,handle:r,listeners:n,doNotReject:!0,handleNumbers:e.handleNumbers}),s=B("mouseout",E,X,{target:t.target,handle:r,listeners:n,doNotReject:!0,handleNumbers:e.handleNumbers});n.push.apply(n,i.concat(o,s)),t.cursor&&(C.style.cursor=getComputedStyle(t.target).cursor,1<u.length&&ht(h,b.cssClasse
2258s.drag),C.addEventListener("selectstart",ct,!1)),e.handleNumbers.forEach(function(t){J("start",t)})}function n(t){t.stopPropagation();var i,o,s,e=q(t.calcPoint),r=(i=e,s=!(o=100),u.forEach(function(t,e){if(!L(e)){var r=S[e],n=Math.abs(r-i);(n<o||n<=o&&r<i||100===n&&100===o)&&(s=e,o=n)}}),s);if(!1===r)return!1;b.events.snap||pt(h,b.cssClasses.tap,b.animationDuration),rt(r,e,!0,!0),et(),J("slide",r,!0),J("update",r,!0),J("change",r,!0),J("set",r,!0),b.events.snap&&I(t,{handleNumbers:[r]})}function W(t){var e=q(t.calcPoint),r=y.getStep(e),n=y.fromStepping(r);Object.keys(v).forEach(function(t){"hover"===t.split(".")[0]&&v[t].forEach(function(t){t.call(a,n)})})}function $(t,e){v[t]=v[t]||[],v[t].push(e),"update"===t.split(".")[0]&&u.forEach(function(t,e){J("update",e)})}function G(t){var n=t&&t.split(".")[0],i=n&&t.substring(n.length);Object.keys(v).forEach(function(t){var e=t.split(".")[0],r=t.substring(e.length);n&&n!==e||i&&i!==r||delete v[t]})}function J(r,n,i){Object.keys(v).forEach(function(t){var e=t.split(".")[0];r===e&&v[t].forEach(function(t){t.call(a,x.map(b.format.to),n,x.slice(),i||!1,S.slice(),a)})})}function K(t,e,r,n,i,o){var s;return 1<u.length&&!b.events.unconstrained&&(n&&0<e&&(s=y.getAbsoluteDistance(t[e-1],b.margin,0),r=Math.max(r,s)),i&&e<u.length-1&&(s=y.getAbsoluteDistance(t[e+1],b.margin,1),r=Math.min(r,s))),1<u.length&&b.limit&&(n&&0<e&&(s=y.getAbsoluteDistance(t[e-1],b.limit,0),r=Math.min(r,s)),i&&e<u.length-1&&(s=y.getAbsoluteDistance(t[e+1],b.limit,1),r=Math.max(r,s))),b.padding&&(0===e&&(s=y.getAbsoluteDistance(0,b.padding[0],0),r=Math.max(r,s)),e===u.length-1&&(s=y.getAbsoluteDistance(100,b.padding[1],1),r=Math.min(r,s))),!((r=ft(r=y.getStep(r)))===t[e]&&!o)&&r}function Q(t,e){var r=b.ort;return(r?e:t)+", "+(r?t:e)}function Z(t,n,r,e){var i=r.slice(),o=[!t,t],s=[t,!t];e=e.slice(),t&&e.reverse(),1<e.length?e.forEach(function(t,e){var r=K(i,t,i[t]+n,o[e],s[e],!1);!1===r?n=0:(n=r-i[t],i[t]=r)}):o=s=[!0];var a=!1;e.forEach(function(t,e){a=rt(t,r[t]+n,o[e],s[e])||a}),a&&e.forEach(function(t){J("update",t),J("slide",t)})}function tt(t,e){return b.dir?100-t-e:t}function et(){m.forEach(function(t){var e=50<S[t]?-1:1,r=3+(u.length+e*t);u[t].style.zIndex=r})}function rt(t,e,r,n,i){return i||(e=K(S,t,e,r,n,!1)),!1!==e&&(function(t,e){S[t]=e,x[t]=y.fromStepping(e);var r="translate("+Q(10*(tt(e,0)-A)+"%","0")+")";u[t].style[b.transformRule]=r,nt(t),nt(t+1)}(t,e),!0)}function nt(t){if(s[t]){var e=0,r=100;0!==t&&(e=S[t-1]),t!==s.length-1&&(r=S[t]);var n=r-e,i="translate("+Q(tt(e,n)+"%","0")+")",o="scale("+Q(n/100,"1")+")";s[t].style[b.transformRule]=i+" "+o}}function it(t,e){return null===t||!1===t||void 0===t?S[e]:("number"==typeof t&&(t=String(t)),t=b.format.from(t),!1===(t=y.toStepping(t))||isNaN(t)?S[e]:t)}function ot(t,e,r){var n=dt(t),i=void 0===S[0];e=void 0===e||!!e,b.animate&&!i&&pt(h,b.cssClasses.tap,b.animationDuration),m.forEach(function(t){rt(t,it(n[t],t),!0,!1,r)});for(var o=1===m.length?0:1;o<m.length;++o)m.forEach(function(t){rt(t,S[t],!0,!0,r)});et(),m.forEach(function(t){J("update",t),null!==n[t]&&e&&J("set",t)})}function st(){var t=x.map(b.format.to);return 1===t.length?t[0]:t}function at(t){var e=S[t],r=y.getNearbySteps(e),n=x[t],i=r.thisStep.step,o=null;if(b.snap)return[n-r.stepBefore.startValue||null,r.stepAfter.startValue-n||null];!1!==i&&n+i>r.stepAfter.startValue&&(i=r.stepAfter.startValue-n),o=n>r.thisStep.startValue?r.thisStep.step:!1!==r.stepBefore.step&&n-r.stepBefore.highestStep,100===e?i=null:0===e&&(o=null);var s=y.countStepDecimals();return null!==i&&!1!==i&&(i=Number(i.toFixed(s))),null!==o&&!1!==o&&(o=Number(o.toFixed(s))),[o,i]}return ht(e=h,b.cssClasses.target),0===b.dir?ht(e,b.cssClasses.ltr):ht(e,b.cssClasses.rtl),0===b.ort?ht(e,b.cssClasses.horizontal):ht(e,b.cssClasses.vertical),ht(e,"rtl"===getComputedStyle(e).direction?b.cssClasses.textDirectionRtl:b.cssClasses.textDirectionLtr),l=V(e,b.cssClasses.base),function(t,e){var r=V(e,b.cssClasses.connects);u=[],(s=[]).push(M(r,t[0]));for(var n=0;n<b.handles;n++)u.push(D(e,n)),m[n]=n,s.push(M(r,t[n+1]))}(b.connect,l),(p=b.events).fixed||u.forEach(function(t,e){B(f.start,t.children[0],I,{handleNumbers:[e]})}),p.tap&&B(f.start,l,n,{}),p.hover&&B(f.move,l,W,{hover:!0}
2258),p.drag&&s.forEach(function(t,e){if(!1!==t&&0!==e&&e!==s.length-1){var r=u[e-1],n=u[e],i=[t];ht(t,b.cssClasses.draggable),p.fixed&&(i.push(r.children[0]),i.push(n.children[0])),i.forEach(function(t){B(f.start,t,I,{handles:[r,n],handleNumbers:[e-1,e]})})}}),ot(b.start),b.pips&&R(b.pips),b.tooltips&&H(),$("update",function(t,e,s,r,a){m.forEach(function(t){var e=u[t],r=K(S,t,0,!0,!0,!0),n=K(S,t,100,!0,!0,!0),i=a[t],o=b.ariaFormat.to(s[t]);r=y.fromStepping(r).toFixed(1),n=y.fromStepping(n).toFixed(1),i=y.fromStepping(i).toFixed(1),e.children[0].setAttribute("aria-valuemin",r),e.children[0].setAttribute("aria-valuemax",n),e.children[0].setAttribute("aria-valuenow",i),e.children[0].setAttribute("aria-valuetext",o)})}),a={destroy:function(){for(var t in b.cssClasses)b.cssClasses.hasOwnProperty(t)&&mt(h,b.cssClasses[t]);for(;h.firstChild;)h.removeChild(h.firstChild);delete h.noUiSlider},steps:function(){return m.map(at)},on:$,off:G,get:st,set:ot,setHandle:function(t,e,r,n){if(!(0<=(t=Number(t))&&t<m.length))throw new Error("noUiSlider ("+lt+"): invalid handle number, got: "+t);rt(t,it(e,t),!0,!0,n),J("update",t),r&&J("set",t)},reset:function(t){ot(b.start,t)},__moveHandles:function(t,e,r){Z(t,e,S,r)},options:o,updateOptions:function(e,t){var r=st(),n=["margin","limit","padding","range","animate","snap","step","format","pips","tooltips"];n.forEach(function(t){void 0!==e[t]&&(o[t]=e[t])});var i=vt(o);n.forEach(function(t){void 0!==e[t]&&(b[t]=i[t])}),y=i.spectrum,b.margin=i.margin,b.limit=i.limit,b.padding=i.padding,b.pips?R(b.pips):F(),b.tooltips?H():z(),S=[],ot(e.start||r,t)},target:h,removePips:F,removeTooltips:z,getTooltips:function(){return i},getOrigins:function(){return u},pips:R}}return{__spectrum:i,version:lt,cssClasses:d,create:function(t,e){if(!t||!t.nodeName)throw new Error("noUiSlider ("+lt+"): create requires a single element, got: "+t);if(t.noUiSlider)throw new Error("noUiSlider ("+lt+"): Slider was already initialized.");var r=j(t,vt(e),e);return t.noUiSlider=r}}}); 2259 2260/* ==== INCLUDE: /js/blocks/listings-v2.5.js ==== */ 2261 2262;(function() { 2263 // Function to move elements only if they haven't been moved already 2264 2265 function moveElements() { 2266 const elem = document.querySelector('.mrp-weblet-listings, .mrp-weblet-listing-areas'); 2267 2268 if (elem != null) { 2269 2270 2271// Filtering adjustments 2272const controls = document.querySelectorAll('.idx-basic-control, .basic-control'); 2273 2274// Function to close all collapsible contents 2275function closeAllControls() { 2276 controls.forEach(control => { 2277 const controlContent = control.querySelector('.collapsible-content'); 2278 if (controlContent) { 2279 controlContent.style.display = 'none'; 2280 } 2281 // Remove the active-filter class 2282 control.classList.remove('active-filter'); 2283 }); 2284} 2285 2286// Set up each control 2287controls.forEach(control => { 2288 // Check if .collapsible-content already exists 2289 if (!control.querySelector('.collapsible-content')) { 2290 const label = control.querySelector('label'); 2291 const controlContent = document.createElement('div'); 2292 controlContent.className = 'collapsible-content'; 2293 2294 // Move all elements except the label into the collapsible content 2295 Array.from(control.children).forEach(child => { 2296 if (child !== label) { 2297 controlContent.appendChild(child); 2298 } 2299 }); 2300 2301 // Append the collapsible content back to the control 2302 control.appendChild(controlContent); 2303 2304 // Initially hide the control content 2305 controlContent.style.display = 'none'; 2306 2307 // Event listener to toggle visibility of control content on label click 2308 label.addEventListener('click', (event) => { 2309 event.stopPropagation(); // Prevents the document click from immediately closing the control 2310 2311 // Close all other open controls 2312 controls.forEach(otherControl => { 2313 if (otherControl !== control) { 2314 const otherContent = otherControl.querySelector('.collapsible-content'); 2315 if (otherContent) { 2316 otherContent.style.display = 'none'; 2317 } 2318 otherControl.classList.remove('active-filter'); // Remove active class from other controls 2319 } 2320 }); 2321 2322 // Toggle the clicked control's visibility 2323 const isVisible = controlContent.style.display === 'block'; 2324 controlContent.style.display = isVisible ? 'none' : 'block'; 2325 2326 // Toggle the active-filter class 2327 if (!isVisible) { 2328 control.classList.add('active-filter'); 2329 } else { 2330 control.classList.remove('active-filter'); 2331 } 2332 }); 2333 } 2334 2335 // Detect clicks within the selectize-control dropdown 2336 const selectizeControl = control.querySelector('.selectize-control'); 2337 if (selectizeControl) { 2338 selectizeControl.addEventListener('click', (event) => { 2339 event.stopPropagation(); // Prevent global click listener 2340 2341 // Close all other controls except the one containing the dropdown 2342 closeAllControls(control); 2343 2344 // Ensure the active-filter class is added 2345 control.classList.add('active-filter'); 2346 2347 // Ensure collapsible content stays open 2348 collapsibleContent.style.display = 'block'; 2349 }); 2350 } 2351 2352}); 2353 2354// Global click listener to close all controls when clicking outside 2355document.addEventListener('click', (event) => { 2356 // Check if the click is outside any of the controls 2357 if (![...controls].some(control => control.contains(event.target))) { 2358 closeAllControls(); 2359 } 2360}); 2361 2362 // Function to move price and favorites 2363 function movePriceAndFavorites(container) { 2364 const listingResults = container.querySelectorAll('.mrp-listing-result'); 2365
2366 listingResults.forEach(result => { 2367 if (!result.querySelector('.price-container')) { 2368 const imageAndToolbarWrapper = result.querySelector('.listing-image-and-toolbar-wrapper'); 2369 const priceContainer = document.createElement('div'); 2370 priceContainer.className = 'price-container'; 2371 2372 const priceElement = result.querySelector('.mrp-listing-price-container'); 2373 const topMenuElement = result.querySelector('.listing-item-top-menu'); 2374 2375 if (imageAndToolbarWrapper) { 2376 imageAndToolbarWrapper.insertAdjacentElement('afterend', priceContainer); 2377 } 2378 2379 if (priceElement) { 2380 priceContainer.appendChild(priceElement); 2381 } 2382 if (topMenuElement) { 2383 priceContainer.appendChild(topMenuElement); 2384 } 2385 } 2386 }); 2387 } 2388 2389 // Function to move ribbon 2390 function moveRibbon(container) { 2391 const imageContainers = container.querySelectorAll('.mrp-listing-main-image-container'); 2392 2393 imageContainers.forEach(container => { 2394 const resultsRibbon = container.querySelector('.results-ribbon'); 2395 const innerElement = container.querySelector('.inner'); 2396 2397 if (resultsRibbon && innerElement && resultsRibbon.parentNode !== innerElement) { 2398 innerElement.appendChild(resultsRibbon); 2399 console.log('Moved results ribbon to inner element for a listing'); 2400 } 2401 }); 2402 } 2403 2404 // Apply actions to the .mrp-weblet-listings container 2405 const webletListings = document.querySelector('.mrp-weblet-listings, .mrp-weblet-listing-areas'); 2406 if (webletListings) { 2407 movePriceAndFavorites(webletListings); 2408 moveRibbon(webletListings); 2409 } 2410 2411 // Apply actions to the .mrp-idx-panel-contents container 2412 const idxPanelContents = document.querySelector('.mrp-idx-panel-contents'); 2413 if (idxPanelContents) { 2414 movePriceAndFavorites(idxPanelContents); 2415 moveRibbon(idxPanelContents); 2416 } 2417 2418 2419 // For Listings Details Pages 2420 2421 // Function to process details in a specific parent container
2422function processDetails(parentContainer) { 2423 const detailsElement = parentContainer.querySelector('.listing-details-view'); 2424 2425 if (detailsElement != null) { 2426 2427 2428 // Need to look for inline height variable for menu to align sticky sidebar top height 2429 const variableNames = ['--menu-height-fixed', '--top-bar-height-fixed']; 2430 2431 // Function to find and set the global variable within #mrp-header 2432 function findAndSetGlobalVariableInHeader(variableNames) { 2433 const root = document.documentElement; // `:root` element for global variables 2434 const header = document.querySelector('#mrp-header'); // Narrow search to #mrp-header 2435 2436 if (!header) { 2437 console.warn('Element with ID "mrp-header" not found.'); 2438 return; 2439 } 2440 2441 // Loop through the variable names 2442 for (const variableName of variableNames) { 2443 // Loop through all child elements within #mrp-header 2444 for (const element of header.querySelectorAll('*')) { 2445 const variableValue = getComputedStyle(element).getPropertyValue(variableName).trim(); 2446 2447 if (variableValue) { 2448 // If the variable is found, set it globally on `:root` 2449 root.style.setProperty(variableName, variableValue); 2450 console.log(`Set ${variableName} with value ${variableValue} globally.`); 2451 return; // Exit once a match is found 2452 } 2453 } 2454 } 2455 2456 console.warn('No matching variables were found in #mrp-header.'); 2457 } 2458 2459 // Run the function 2460 findAndSetGlobalVariableInHeader(variableNames); 2461 2462 // Find the main image with the class 'mrp-listing-main-image-container' 2463 const mainImage = detailsElement.querySelector('.mrp-listing-main-image-container'); 2464 2465 if (mainImage) { 2466 const listingDetailsContainer = detailsElement.querySelector('.mrp-details-listing-container'); 2467 const imageThumbnails = detailsElement.querySelector('.mrp-listing-photo-other'); 2468 2469 let mainImageOuter; 2470 2471 if (!detailsElement.querySelector('.main-image-outer')) { 2472 mainImageOuter = document.createElement('div'); 2473 mainImageOuter.className = 'main-image-outer'; 2474 listingDetailsContainer.prepend(mainImageOuter); 2475 2476 mainImageOuter.append(mainImage); 2477 if (imageThumbnails) { 2478 mainImageOuter.append(imageThumbnails); 2479 } 2480 } else { 2481 mainImageOuter = detailsElement.querySelector('.main-image-outer'); 2482 } 2483 2484 2485 // Observe for digitally modified photos warning (late-loaded) 2486function observeModifiedPhotosWarning() { 2487 if (!mainImageOuter) return; 2488 2489 const warningObserver = new MutationObserver(() => { 2490 const warning = detailsElement.querySelector('.has-digitally-modified-photos-warning'); 2491 2492 if (warning) { 2493 if (warning.parentNode !== mainImageOuter) { 2494 mainImageOuter.appendChild(warning); 2495 } 2496 2497 // Stop observing once moved 2498 warningObserver.disconnect(); 2499 } 2500 }); 2501 2502 warningObserver.observe(detailsElement, { 2503 childList: true, 2504 subtree: true 2505 }); 2506} 2507 2508// Run observer 2509observeModifiedPhotosWarning(); 2510 2511 2512 if (!detailsElement.querySelector('.main-listing-content')) { 2513 const mainListingContent = document.createElement('div'); 2514 mainListingContent.className = 'main-listing-content'; 2515 mainImageOuter.insertAdjacentElement('afterend', mainListingContent); 2516 2517 const listingTopContent = detailsElement.querySelector('.top-content'); 2518 const listingTabContent = detailsElement.querySelector('.mrp-listing-details-tab-content'); 2519 const largeSidebar = detailsElement.querySelector('.large-sidebar'); 2520 2521 mainListingContent.append(listingTopContent); 2522 mainListingContent.append(listingTabContent); 2523 mainListingContent.append(largeSidebar); 2524 } 2525 2526 const subInfoElement = detailsElement.querySelector('.sub-info'); 2527 const detailsTabsElement = detailsElement.querySelector('.mrp-listing-details-tabs'); 2528 2529 if (subInfoElement && detailsTabsElement) { 2530 detailsTabsElement.parentNode.insertBefore(subInfoElement, detailsTabsElement); 2531 } 2532 2533 const openHouseDetails = detailsElement.querySelector('.mrp-open-house-full-section'); 2534 if (openHouseDetails && subInfoElement) { 2535 subInfoElement.append(openHouseDetails); 2536 } 2537 2538 const detailsRibbon = detailsElement.querySelector('.mrp-listing-quick-actions .details-ribbon'); 2539 const mainImageInner = detailsElement.querySelector('.mrp-listing-main-image-container .inner'); 2540 2541 if (detailsRibbon && mainImageInner) { 2542 mainImageInner.appendChild(detailsRibbon); 2543 console.log('Moved details ribbon to inner element for a listing'); 2544 } 2545 2546 const subLocation = detailsElement.querySelector('.sub-location'); 2547 const actionRoom = detailsElement.querySelector('.mrp-listing-quick-actions .map'); 2548 2549 if (subLocation && actionRoom) { 2550 subLocation.addEventListener('click', function(event) { 2551 event.preventDefault(); 2552 actionRoom.click(); 2553 }); 2554 } 2555 2556 const priceInfo = detailsElement.querySelector('.mrp-listing-price-info');
2557 if (!detailsElement.querySelector('.calculate-mortgage-link')) { 2558 const actionMortgage = detailsElement.querySelector('.mrp-listing-quick-actions .mortgage'); 2559 const calculateMortgage = document.createElement('div'); 2560 calculateMortgage.className = 'calculate-mortgage-link'; 2561 calculateMortgage.textContent = 'Calculate Mortgage'; 2562 priceInfo.append(calculateMortgage); 2563 2564 if (priceInfo && actionMortgage) { 2565 calculateMortgage.addEventListener('click', function(event) { 2566 event.preventDefault(); 2567 actionMortgage.click(); 2568 }); 2569 } 2570 } 2571 2572 const addressInfo = detailsElement.querySelector('.mrp-listing-title'); 2573 if (!detailsElement.querySelector('.address-price-container')) { 2574 if (addressInfo && priceInfo) { 2575 const addressPriceWrapper = document.createElement('div'); 2576 addressPriceWrapper.className = 'address-price-container'; 2577 addressInfo.parentNode.insertBefore(addressPriceWrapper, addressInfo); 2578 2579 addressPriceWrapper.appendChild(addressInfo); 2580 addressPriceWrapper.appendChild(priceInfo); 2581 } 2582 } 2583 2584 const listingInfoContainer = detailsElement.querySelector('.mrp-listing-info-container'); 2585 const mainSummary = detailsElement.querySelector('.mrp-details-main-summary'); 2586 2587 if (listingInfoContainer && mainSummary) { 2588 listingInfoContainer.append(mainSummary); 2589 } 2590 2591 const areaStats = detailsElement.querySelector('.mrp-area-stats'); 2592 if (listingInfoContainer && areaStats) { 2593 listingInfoContainer.append(areaStats); 2594 } 2595 2596 if (!detailsElement.querySelector('.listing-toolbar-container')) { 2597 const listingToolbarWrapper = document.createElement('div'); 2598 listingToolbarWrapper.className = 'listing-toolbar-container'; 2599 listingDetailsContainer.parentNode.insertBefore(listingToolbarWrapper, listingDetailsContainer); 2600 2601 const listingActions = detailsElement.querySelector('.mrp-listing-quick-actions'); 2602 const listingLogin = detailsElement.querySelector('.mrp-details-vow-toolbar-wrapper'); 2603 2604 if (listingActions) { 2605 listingToolbarWrapper.appendChild(listingActions); 2606 } 2607 if (listingLogin) { 2608 listingToolbarWrapper.appendChild(listingLogin); 2609 } 2610 } 2611 2612 // Function to update the favorite-listing-true class based on the presence of the target class 2613 function updateFavoriteClass() { 2614 const favElement = document.querySelector('.mrp-vow-listing-toolbar-container .mrp-vow-listing-is-fav'); 2615 const listingContent = document.querySelector('.mrp-listing-content'); 2616 2617 if (listingContent) { 2618 if (favElement) { 2619 // Add the favorite-listing-true class if the target class exists 2620 listingContent.classList.add('favorite-listing-true'); 2621 } else { 2622 // Remove the favorite-listing-true class if the target class is removed 2623 listingContent.classList.remove('favorite-listing-true'); 2624 } 2625 } 2626 } 2627 2628 // Move Fav and Category container 2629 2630 const vowFavContainer = detailsElement.querySelector('.mrp-vow-listing-toolbar-container'); 2631 const listingToolbarWrapper = detailsElement.querySelector('.listing-toolbar-container'); 2632 2633 if (vowFavContainer && listingToolbarWrapper) { 2634 listingToolbarWrapper.parentNode.insertBefore(vowFavContainer, listingToolbarWrapper.nextSibling); 2635 } 2636 2637 // Set up a MutationObserver to monitor changes in the target element's parent container 2638 const toolbarContainer = document.querySelector('.mrp-vow-listing-toolbar-container'); 2639 2640 if (toolbarContainer) { 2641 const observer = new MutationObserver(() => { 2642 // Update the favorite-listing-true class whenever mutations are detected 2643 updateFavoriteClass(); 2644 }); 2645 2646 // Observe child list changes and attribute modifications 2647 observer.observe(toolbarContainer, { 2648 childList: true, // Detect when children are added or removed 2649 attributes: true, // Detect attribute changes 2650 subtree: true // Include all descendants in the observation 2651 }); 2652 2653 // Perform an initial check 2654 updateFavoriteClass(); 2655 } 2656 2657 2658 // Check and set up the side form 2659 2660 function setupContactForm() { 2661 const formParent = document.querySelector(".large-sidebar .listing-inquiry-form"); 2662 if (!formParent) return; // Ensure the form is present before proceeding 2663 2664 // Add placeholders to form 2665 const inputName = formParent.querySelector(".mrp-listing-inquiry-name input"); 2666 if (inputName) inputName.setAttribute("placeholder", "Your name *"); 2667 2668 const inputEmail = formParent.querySelector(".mrp-listing-inquiry-email input"); 2669 if (inputEmail) inputEmail.setAttribute("placeholder", "Your email *"); 2670 2671 const inputPhone = formParent.querySelector(".mrp-listing-inquiry-phone-number input"); 2672 if (inputPhone) inputPhone.setAttribute("placeholder", "Your phone # *"); 2673 2674 const inputSubject = formParent.querySelector(".mrp-listing-inquiry-subject input"); 2675 if (inputSubject) inputSubject.setAttribute("placeholder", "Subject"); 2676 2677 const inputMessage = formParent.querySelector(".mrp-listing-inquiry-text textarea"); 2678 if (inputMessage) inputMessage.setAttribute("placeholder", "Message"); 2679 2680 // Add highlight div to labels in viewing-type 2681 const labels = formParent.querySelectorAll(".viewing-type label:not([data-processed])");
2682 labels.forEach(label => { 2683 const highlightDiv = document.createElement("div"); 2684 highlightDiv.className = "viewing-type-highlight"; 2685 label.appendChild(highlightDiv); 2686 label.setAttribute("data-processed", "true"); 2687 }); 2688 2689 // Modify suggested-dates if present 2690 const suggestedDates = formParent.querySelector(".suggested-dates"); 2691 if (!suggestedDates || suggestedDates.parentElement.classList.contains("suggested-dates-wrapper")) return; 2692 2693 const wrapper = document.createElement("div"); 2694 wrapper.classList.add("suggested-dates-wrapper"); 2695 2696 const prevButton = document.createElement("div"); 2697 prevButton.classList.add("scroll-btn", "cal-prev"); 2698 prevButton.innerHTML = "<"; 2699 2700 const nextButton = document.createElement("div"); 2701 nextButton.classList.add("scroll-btn", "cal-next"); 2702 nextButton.innerHTML = ">"; 2703 2704 const navMessage = document.createElement("div"); 2705 navMessage.classList.add("cal-nav-message"); 2706 navMessage.innerHTML = "Change Dates"; 2707 2708 const navContainer = document.createElement("div"); 2709 navContainer.classList.add("cal-nav-container"); 2710 2711 suggestedDates.parentNode.insertBefore(wrapper, suggestedDates); 2712 wrapper.appendChild(suggestedDates); 2713 wrapper.appendChild(navContainer); 2714 navContainer.appendChild(prevButton); 2715 navContainer.appendChild(navMessage); 2716 navContainer.appendChild(nextButton); 2717 2718 // Apply scrolling functionality 2719 const scrollAmount = 150; 2720 prevButton.addEventListener("click", () => suggestedDates.scrollBy({ left: -scrollAmount, behavior: "smooth" })); 2721 nextButton.addEventListener("click", () => suggestedDates.scrollBy({ left: scrollAmount, behavior: "smooth" })); 2722 2723 // Swipe functionality 2724 let startX; 2725 suggestedDates.addEventListener("touchstart", (e) => startX = e.touches[0].clientX); 2726 suggestedDates.addEventListener("touchmove", (e) => { 2727 if (!startX) return; 2728 const deltaX = startX - e.touches[0].clientX; 2729 if (Math.abs(deltaX) > 50) { 2730 suggestedDates.scrollBy({ left: deltaX > 0 ? scrollAmount : -scrollAmount, behavior: "smooth" }); 2731 startX = null; 2732 } 2733 }); 2734 } 2735 2736 // Observe for the form to appear 2737 const observer = new MutationObserver((mutations, obs) => { 2738 if (document.querySelector(".large-sidebar .listing-inquiry-form")) { 2739 setupContactForm(); 2740 obs.disconnect(); // Stop observing once form is found and processed 2741 } 2742 }); 2743 2744 observer.observe(document.body, { childList: true, subtree: true }); 2745 2746 2747 } 2748 } 2749 } 2750 2751// Run the function for each container 2752const detailsWebletListings = document.querySelector('.listings-refresh'); 2753const detailsIdxPanelContents = document.querySelector('.mrp-idx-listing-details'); 2754 2755if (detailsWebletListings) {
2756 processDetails(detailsWebletListings); 2757} 2758 2759if (detailsIdxPanelContents) { 2760 processDetails(detailsIdxPanelContents); 2761} 2762 2763 } 2764 } // End Move 2765 2766 2767 2768 // Function to observe the listings container 2769 function observeListingsContainer() { 2770 const listingsContainer = document.querySelector('body'); 2771 2772 if (listingsContainer) { 2773 const observer = new MutationObserver((mutationsList, observer) => { 2774 // Disconnect observer temporarily 2775 observer.disconnect(); 2776 2777 // Run the move elements function when changes are detected 2778 moveElements(); 2779 2780 // Reconnect after a small delay 2781 setTimeout(() => { 2782 observer.observe(listingsContainer, { childList: true, subtree: true }); 2783 }, 50); // Adds a small delay to prevent excessive callback 2784 }); 2785 2786 // Start observing for changes 2787 observer.observe(listingsContainer, { childList: true, subtree: true }); 2788 2789 // Run initially in case content is already loaded 2790 moveElements(); 2791 } 2792 } 2793 2794 // Initialize observation 2795 observeListingsContainer(); 2796 2797 2798})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.