1; 2(()=>{const e=document.querySelectorAll(".coblocks-animate");if("IntersectionObserver"in window){const t=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting&&(e.target.classList.add(e.target.dataset.coblocksAnimation),t.unobserve(e.target))}))}),{threshold:[.15]});e.forEach((e=>{t.observe(e)}))}else e.forEach((e=>{e.classList.remove("coblocks-animate"),delete e.dataset.coblocksAnimation}))})();; 3(()=>{var e={2590:function(e){e.exports=function(){"use strict";function e(){return e=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e},e.apply(this,arguments)}function t(e,t){void 0===t&&(t=[]),Array.isArray(t)||(t=[t]),t.forEach((function(t){return!e.classList.contains(t)&&e.classList.add(t)}))}function n(e,t,n,i){e.addEventListener(t,n,i)}function i(e,t,n){e.removeEventListener(t,n)}function r(e,t,n){return void 0===n&&(n=""),e.setAttribute(t,n),e}function o(e,t,n){return Object.keys(t).forEach((function(n){e.style[n]=t[n]})),n&&getComputedStyle(e),e}var a={direction:"horizontal",touchRatio:1,touchAngle:45,longSwipesRatio:.5,initialSlide:0,loop:!1,freeMode:!1,passiveListeners:!0,resistance:!0,resistanceRatio:.85,speed:300,longSwipesMs:300,spaceBetween:0,slidesPerView:1,centeredSlides:!1,slidePrevClass:"swiper-slide-prev",slideNextClass:"swiper-slide-next",slideActiveClass:"swiper-slide-active",slideClass:"swiper-slide",wrapperClass:"swiper-wrapper",touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchMoveStopPropagation:!1,excludeElements:[],injections:{translate:function(e,t,n,i){o(t.element.$wrapper,{transition:e.isStart?"none":"transform ease "+i+"ms",transform:n.isHorizontal?"translate3d("+e.transforms+"px, 0, 0)":"translate3d(0, "+e.transforms+"px, 0)"})}}};var s="before-init",c="after-init",u="before-slide",l="scroll",f="after-slide",p="before-destroy",d="after-destroy";var m=180/Math.PI;function v(){var t=[];return{getDuration:function(){var e=t[0],n=t[t.length-1];return e?n.time-e.time:0},getOffset:function(){var e=t[0],n=t[t.length-1];return e?{x:n.x-e.x,y:n.y-e.y}:{x:0,y:0}},getLogs:function(){return t},vector:function(){return function(t,n){var i=t[n],r=t[n-1]||i,o={x:i.x-r.x,y:i.y-r.y},a=i.time-r.time,s=o.x/a||0,c=o.y/a||0;return e({},o,{angle:Math.atan2(Math.abs(o.y),Math.abs(o.x))*m,velocityX:s,velocityY:c})}(t,t.length-1)},clear:function(){t=[]},push:function(n){t.push(e({time:Date.now()},n))}}}function h(){return performance?performance.now():Date.now()}var x=requestAnimationFrame||webkitRequestAnimationFrame||setTimeout,g=cancelAnimationFrame||webkitCancelAnimationFrame||clearTimeout;function S(){var e,t,n={run:function(n){e=void 0===e?h():e,t=x((function(){var t=h(),i=t-e;e=t,n(i)}))},stop:function(){e=void 0,g(t)}};return{run:function e(t){n.run((function(n){e(t),t(n)}))},stop:function(){n.stop()}}}function w(e,t){var n=e.tracker,i=t.initStatus;n.clear(),i()}function y(e,t,r,o){var a=e.touchable,s=["INPUT","SELECT","OPTION","TEXTAREA","BUTTON","VIDEO"],c=function(e,t,n,i){var r=i.initLayout,o=i.initStatus,a=i.render,s=i.scrollPixel,c=i.slideTo,u=i.getOffsetSteps,l=S();return{preheat:function(e,t){var i=n.tracker;l.stop(),i.clear(),i.push(e),r(t),o(t),n.isStart=!0,a()},move:function(t){var i=n.tracker,r=e.touchRatio,o=e.touchAngle,c=e.isHorizontal;if(n.isStart&&!n.isScrolling){i.push(t);var u=i.vector(),l=i.getOffset();if(l.x||l.y)if(c&&u.angle<o||!c&&90-u.angle<o||n.isTouching){var f=u[c?"x":"y"]*r;n.isTouching=!0,s(f),a()}else n.isScrolling=!0,i.clear()}},stop:function(){var r=n.index,o=n.tracker,f=t.measure;if(n.isStart)if(n.isStart=!1,e.freeMode){var p=o.vector()[e.isHorizontal?"velocityX":"velocityY"];l.run((function(e){var t=p*e;p*=.98,Math.abs(t)<.01?(l.stop(),w(n,i)):(s(t),a(0))}))}else{var d=o.getDuration(),m=o.getOffset()[e.isHorizontal?"x":"y"],v=Math.ceil(Math.abs(m)/f.boxSize),h=u(m);d>e.longSwipesMs?c(r+h*(m>0?-1:1)):c(m>0?r-v:r+v),w(n,i)}}}}(r,e,t,o),u=c.preheat,l=c.move,f=c.stop;function p(e){var t=a?e.changedTouches[0]:e;return{x:t.pageX,y:t.pageY}}function d(t){for(var n=0;n<r.excludeElements.length;n++)if(r.excludeElements[n].contains(t.target))return;
3var i,o,c,l,f=e.element.$wrapper,d=r.touchStartPreventDefault&&-1===s.indexOf(t.target.nodeName)||r.touchStartForcePreventDefault;!a&&d&&t.preventDefault(),u(p(t),(i=f,o=r.isHorizontal,c=getComputedStyle(i).transform.replace(/[a-z]|\(|\)|\s/g,"").split(",").map(parseFloat),l=[],16===c.length?l=c.slice(12,14):6===c.length&&(l=c.slice(4,6)),l[o?0:1]||0))}function m(e){r.touchMoveStopPropagation&&e.stopPropagation(),l(p(e)),t.isTouching&&!1!==e.cancelable&&e.preventDefault()}function v(){f()}return{attach:function(){var t=e.element.$el;a?(n(t,"touchstart",d,{passive:r.passiveListeners,capture:!1}),n(t,"touchmove",m),n(t,"touchend",v),n(t,"touchcancel",v)):(n(t,"mousedown",d),n(document,"mousemove",m),n(document,"mouseup",v))},detach:function(){var t=e.element.$el;i(t,"touchstart",d),i(t,"touchmove",m),i(t,"touchend",v),i(t,"touchcancel",v),i(t,"mousedown",d),i(document,"mousemove",m),i(document,"mouseup",v)}}}function b(e,t,n){var i=e.$list,r=t.viewSize,o=t.slideSize,a=t.boxSize,s=function(e){return e.loop?Math.ceil(e.slidesPerView):0}(n),c=s*a,u=-c+(n.centeredSlides?(r-o)/2:0);return{max:u,min:n.spaceBetween+(n.loop?o:r)+u-a*i.length,base:u,expand:s,buffer:c,minIndex:0,maxIndex:i.length-(n.centeredSlides||n.loop?1:Math.ceil(n.slidesPerView))}}function z(e,t){var n={};function i(e){var i=function(e,t){var n=t.$el,i=e.isHorizontal?n.offsetWidth:n.offsetHeight,r=(i-Math.ceil(e.slidesPerView-1)*e.spaceBetween)/e.slidesPerView;return{boxSize:r+e.spaceBetween,viewSize:i,slideSize:r}}(t,e),r=b(e,i,t),o=Boolean("ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0||window.DocumentTouch&&document instanceof DocumentTouch);Object.assign(n,{touchable:o,element:e,measure:i,limitation:r})}return n.update=i,i(e),n}var T="data-shallow-slider",P="data-slider";function E(e,n){function i(i){var r=e.element.$wrapper,o=i.index;r.querySelectorAll("["+P+"]").forEach((function(e){var i,r,a=~~e.getAttribute(P);i=e,void 0===(r=[n.slidePrevClass,n.slideNextClass,n.slideActiveClass])&&(r=[]),Array.isArray(r)||(r=[r]),r.forEach((function(e){return i.classList.contains(e)&&i.classList.remove(e)})),a===o&&t(e,n.slideActiveClass),a===o-1&&t(e,n.slidePrevClass),a===o+1&&t(e,n.slideNextClass)}))}function a(){e.element.$wrapper.querySelectorAll("["+T+"]").forEach((function(t){return e.element.$wrapper.removeChild(t)}))}function s(){e.element.$list.forEach((function(e,t){return r(e,P,t)})),a(),function(){if(n.loop){var t=e.element,i=e.limitation,o=t.$list,a=t.$wrapper,s=i.expand,c=o.slice(-s).map((function(e){return e.cloneNode(!0)})),u=o.slice(0,s).map((function(e){return e.cloneNode(!0)}));c.forEach((function(e,t){a.appendChild(r(u[t],T)),a.insertBefore(r(c[t],T),o[0])}))}}()}function c(){var t,i=e.element,r=e.measure,a=i.$wrapper,s={display:"flex",willChange:"transform",flexDirection:n.isHorizontal?"row":"column"},c=((t={})[n.isHorizontal?"width":"height"]=r.slideSize+"px",t[n.isHorizontal?"margin-right":"margin-bottom"]=n.spaceBetween+"px",t);o(a,s),a.querySelectorAll("["+P+"]").forEach((function(e){return o(e,c)}))}return{init:function(){s(),c()},render:function(t,r,o,a){var s=e.element.$wrapper,c=void 0===r?n.speed:r;n.injections.translate(t,e,n,c),t.isStart||i(t),a&&getComputedStyle(s).transform,o&&setTimeout(o,c)},destroy:function(){var t=e.element,i=t.$list,r=t.$wrapper,o=n.isHorizontal?"margin-right":"margin-bottom";["display","will-change","flex-direction"].forEach((function(e){r.style.removeProperty(e)})),i.forEach((function(e){return e.style.removeProperty(o)})),a()},updateSize:c}}function M(e,t){var n=e-t.max,i=e-t.min;return n>0?n:i<0?i:0}function A(t,n,i,r,o){function a(e){var n=t.measure;return Math.ceil(Math.abs(e)/n.boxSize-i.longSwipesRatio)}function s(e,t,i){r.render(n,e,t,i)}function c(r){var a,s=t.limitation,c=s.min,u=s.max,f=u-c+(i.loop?t.measure.boxSize:0),p=f+1;n.transforms=r,i.loop?(a=(u-r)%p/f,n.progress=a<0?1+a:a>1?a-1:a):(a=(u-r)/f,n.progress=a<0?0:a>1?1:a),o.emit(l,e({},n))}function p(e,r){var l=t.measure,p=t.limitation,d=p.maxIndex-p.minIndex+1,m=i.loop?(e%d+d)%d:e>p.maxIndex?p.maxIndex:e<p.minIndex?p.minIndex:e,v=-m*l.boxSize+p.base;if(0!==a(v-n.transforms)&&i.loop){var h=M(n.transforms,p),x=m-n.index,g=function(e,t,n,i){var r=n.maxIndex,o=(i>0?1:-1)*(n.minIndex-r-1)+t-e;return Math.abs(i)>Math.abs(o)?o:i}(n.index,m,p,x);g===x||h?n.index===m&&c(h>0?p.min-l.boxSize+h:p.max+l.boxSize+h):c(g<0?p.min-l.boxSize:p.max+l.boxSize),s(0,void 0,!0)}
3o.emit(u,n.index,n,m),n.index=m,c(v),s(r,(function(){o.emit(f,m,n)}))}return{update:function(){p(n.index,0),r.updateSize()},render:s,transform:c,slideTo:p,scrollPixel:function(e){var r=n.transforms,o=t.measure,a=t.limitation,s=Number(e.toExponential().split("e")[1]),u=s<=0?Math.pow(10,-(s-1)):1,l=r;if(i.resistance&&!i.loop&&(e>0&&r>=a.max?e-=Math.pow(e*u,i.resistanceRatio)/u:e<0&&r<=a.min&&(e+=Math.pow(-e*u,i.resistanceRatio)/u)),l+=e,i.loop){var f=n.tracker.vector(),p=i.isHorizontal?f.velocityX:f.velocityY,d=M(r,a);d&&function(e,t,n){return e>0&&t>n.max||e<0&&t<n.min}(p,r,a)&&(l=d>0?a.min-o.boxSize+d:a.max+o.boxSize+d)}c(l)},initStatus:function(e){void 0===e&&(e=0),n.startTransform=e,n.isStart=!1,n.isScrolling=!1,n.isTouching=!1},initLayout:function(e){c(e)},getOffsetSteps:a}}function C(e,t){var n="string"==typeof e?document.body.querySelector(e):e,i=n.querySelector("."+t.wrapperClass),r=[].slice.call(n.getElementsByClassName(t.slideClass));return{$el:n,$wrapper:i,$list:r=r.filter((function(e){return null===e.getAttribute("data-shallow-slider")}))}}var $=function t(n,i){var r,o=function(t){var n=e({},a,t);return e({},n,{isHorizontal:"horizontal"===n.direction})}(i),u=(r={},{on:function(e,t){r[e]?r[e].push(t):r[e]=[t]},off:function(e,t){if(r[e]){var n=r[e].indexOf(t);n>-1&&r[e].splice(n,1)}},emit:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];r[e]&&r[e].forEach((function(e){return e.apply(void 0,n)}))},clear:function(){r={}}}),l=z(C(n,o),o),f={tracker:v(),index:0,startTransform:0,isStart:!1,isScrolling:!1,isTouching:!1,transforms:0,progress:0},m=u.on,h=u.off,x=u.emit,g={on:m,off:h,env:l,state:f,options:o};(o.plugins||t.plugins||[]).forEach((function(e){return e(g,o)})),x(s,g);var S=E(l,o),w=A(l,f,o,S,u),b=y(l,f,o,w);var T=w.slideTo;return Object.assign(g,{update:function(){S.destroy(),l.update(C(n,o)),S.init(),w.update()},destroy:function(){x(p,g),b.detach(),S.destroy(),x(d,g),u.clear()},slideTo:T,updateSize:function(){l.update(C(n,o)),w.update()}}),S.init(),b.attach(),T(o.initialSlide,0),x(c,g),g};return $.use=function(e){$.plugins=e},$}()}},t={};!function n(i){var r=t[i];if(void 0!==r)return r.exports;var o=t[i]={exports:{}};return e[i].call(o.exports,o,o.exports,n),o.exports}(2590)})();; 4(()=>{var e={7152:function(e){e.exports=function(){"use strict";function e(){return(e=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n,i=arguments[t];for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n])}return e}).apply(this,arguments)}function t(e,t){void 0===t&&(t=[]),Array.isArray(t)||(t=[t]),t.forEach((function(t){return!e.classList.contains(t)&&e.classList.add(t)}))}function n(e,t,n,i){e.addEventListener(t,n,i)}function i(e,t,n){e.removeEventListener(t,n)}function o(e,t,n){return void 0===n&&(n=""),e.setAttribute(t,n),e}function r(e,t,n){return Object.keys(t).forEach((function(n){e.style[n]=t[n]})),n&&getComputedStyle(e),e}var a={direction:"horizontal",touchRatio:1,touchAngle:45,longSwipesRatio:.5,initialSlide:0,loop:!1,freeMode:!1,passiveListeners:!0,resistance:!0,resistanceRatio:.85,speed:300,longSwipesMs:300,spaceBetween:0,slidesPerView:1,centeredSlides:!1,slidePrevClass:"swiper-slide-prev",slideNextClass:"swiper-slide-next",slideActiveClass:"swiper-slide-active",slideClass:"swiper-slide",wrapperClass:"swiper-wrapper",touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchMoveStopPropagation:!1,excludeElements:[],injections:{translate:function(e,t,n,i){r(t.element.$wrapper,{transition:e.isStart?"none":"transform ease "+i+"ms",transform:n.isHorizontal?"translate3d("+e.transforms+"px, 0, 0)":"translate3d(0, "+e.transforms+"px, 0)"})}}},s="before-slide",l="scroll",c="after-slide";var u=180/Math.PI;function d(){var t=[];return{getDuration:function(){var e=t[0],n=t[t.length-1];return e?n.time-e.time:0},getOffset:function(){var e=t[0],n=t[t.length-1];return e?{x:n.x-e.x,y:n.y-e.y}:{x:0,y:0}},getLogs:function(){return t},vector:function(){return i=(n=t).length-1,o=n[i],n=n[i-1]||o,i={x:o.x-n.x,y:o.y-n.y},o=o.time-n.time,n=i.x/o||0,o=i.y/o||0,e({},i,{angle:Math.atan2(Math.abs(i.y),Math.abs(i.x))*u,velocityX:n,velocityY:o});var n,i,o},clear:function(){t=[]},push:function(n){t.push(e({time:Date.now()},n))}}}function p(){return(performance||Date).now()}var f=requestAnimationFrame||webkitRequestAnimationFrame||setTimeout,m=cancelAnimationFrame||webkitCancelAnimationFrame||clearTimeout;function v(){var e=function(){var e,t;return{run:function(n){e=void 0===e?p():e,t=f((function(){var t=p(),i=t-e;e=t,n(i)}))},stop:function(){e=void 0,m(t)}}}();return{run:function t(n){e.run((function(e){t(n),n(e)}))},stop:function(){e.stop()}}}function x(e,t){e=e.tracker,t=t.initStatus,e.clear(),t()}function h(e,t,n,i){var o=i.initLayout,r=i.initStatus,a=i.render,s=i.scrollPixel,l=i.slideTo,c=i.getOffsetSteps,u=v();return{preheat:function(e,t){var i=n.tracker;u.stop(),i.clear(),i.push(e),o(t),r(t),n.isStart=!0,a()},move:function(t){var i,o=n.tracker,r=e.touchRatio,l=e.touchAngle,c=e.isHorizontal;n.isStart&&!n.isScrolling&&(o.push(t),i=o.vector(),((t=o.getOffset()).x||t.y)&&(c&&i.angle<l||!c&&90-i.angle<l||n.isTouching?(r=i[c?"x":"y"]*r,n.isTouching=!0,s(r),a()):(n.isScrolling=!0,o.clear())))},stop:function(){var o,r,d,p=n.index,f=n.tracker,m=t.measure;n.isStart&&(n.isStart=!1,e.freeMode?(o=f.vector()[e.isHorizontal?"velocityX":"velocityY"],u.run((function(e){e*=o,o*=.98,Math.abs(e)<.01?(u.stop(),x(n,i)):(s(e),a(0))}))):(r=f.getDuration(),d=f.getOffset()[e.isHorizontal?"x":"y"],f=Math.ceil(Math.abs(d)/m.boxSize),m=c(d),r>e.longSwipesMs?l(p+m*(0<d?-1:1)):l(0<d?p-f:p+f),x(n,i)))}}}function g(e,t){var n={};return(n.update=function(e){var i,o=function(e,t,n){var i=e.$list,o=t.viewSize,r=t.slideSize,a=t.boxSize,s=-(t=(e=(s=n).loop?Math.
4ceil(s.slidesPerView):0)*a)+(n.centeredSlides?(o-r)/2:0);return{max:s,min:n.spaceBetween+(n.loop?r:o)+s-a*i.length,base:s,expand:e,buffer:t,minIndex:0,maxIndex:i.length-(n.centeredSlides||n.loop?1:Math.ceil(n.slidesPerView))}}(e,(i=t,r=(o=e).$el,i={boxSize:(r=((o=i.isHorizontal?r.offsetWidth:r.offsetHeight)-Math.ceil(i.slidesPerView-1)*i.spaceBetween)/i.slidesPerView)+i.spaceBetween,viewSize:o,slideSize:r}),t),r=Boolean("ontouchstart"in window||0<navigator.maxTouchPoints||0<navigator.msMaxTouchPoints||window.DocumentTouch&&document instanceof DocumentTouch);Object.assign(n,{touchable:r,element:e,measure:i,limitation:o})})(e),n}var b="data-shallow-slider",y="data-slider";function S(e,n){function i(){e.element.$wrapper.querySelectorAll("["+b+"]").forEach((function(t){return e.element.$wrapper.removeChild(t)}))}function a(){var t=e.element,i=e.measure,o=t.$wrapper,a={display:"flex",willChange:"transform",flexDirection:n.isHorizontal?"row":"column"},s=((t={})[n.isHorizontal?"width":"height"]=i.slideSize+"px",t[n.isHorizontal?"margin-right":"margin-bottom"]=n.spaceBetween+"px",t);r(o,a),o.querySelectorAll("["+y+"]").forEach((function(e){return r(e,s)}))}return{init:function(){(function(){var t,r,a,s,l,c;e.element.$list.forEach((function(e,t){return o(e,y,t)})),i(),n.loop&&(t=e.element,s=e.limitation,r=t.$list,a=t.$wrapper,s=s.expand,l=r.slice(-s).map((function(e){return e.cloneNode(!0)})),c=r.slice(0,s).map((function(e){return e.cloneNode(!0)})),l.forEach((function(e,t){a.appendChild(o(c[t],b)),a.insertBefore(o(l[t],b),r[0])})))})(),a()},render:function(i,o,r,a){var s=e.element.$wrapper;o=void 0===o?n.speed:o,n.injections.translate(i,e,n,o),i.isStart||function(i){var o=e.element.$wrapper,r=i.index;o.querySelectorAll("["+y+"]").forEach((function(e){var i,o,a=~~e.getAttribute(y);i=e,void 0===(o=[n.slidePrevClass,n.slideNextClass,n.slideActiveClass])&&(o=[]),Array.isArray(o)||(o=[o]),o.forEach((function(e){return i.classList.contains(e)&&i.classList.remove(e)})),a===r&&t(e,n.slideActiveClass),a==r-1&&t(e,n.slidePrevClass),a===r+1&&t(e,n.slideNextClass)}))}(i),a&&getComputedStyle(s).transform,r&&setTimeout(r,o)},destroy:function(){var t=e.element,o=t.$list,r=t.$wrapper,a=n.isHorizontal?"margin-right":"margin-bottom";["display","will-change","flex-direction"].forEach((function(e){r.style.removeProperty(e)})),o.forEach((function(e){return e.style.removeProperty(a)})),i()},updateSize:a}}function w(e,t){var n=e-t.max;return t=e-t.min,0<n?n:t<0?t:0}function E(t,n,i,o,r){function a(e){var n=t.measure;return Math.ceil(Math.abs(e)/n.boxSize-i.longSwipesRatio)}function u(e,t,i){o.render(n,e,t,i)}function d(o){var a,s,c=(s=t.limitation).min,u=s.max;c=(s=u-c+(i.loop?t.measure.boxSize:0))+1,n.transforms=o,i.loop?(a=(u-o)%c/s,n.progress=a<0?1+a:1<a?a-1:a):(a=(u-o)/s,n.progress=a<0?0:1<a?1:a),r.emit(l,e({},n))}function p(e,o){var l,p,f,m,v,x=t.measure,h=t.limitation,g=h.maxIndex-h.minIndex+1,b=i.loop?(e%g+g)%g:e>h.maxIndex?h.maxIndex:e<h.minIndex?h.minIndex:e,y=-b*x.boxSize+h.base;0!==a(y-n.transforms)&&i.loop&&(l=w(n.transforms,h),p=b-n.index,f=n.index,m=b,v=p,e=(g=h).maxIndex,f=(0<v?1:-1)*(g.minIndex-e-1)+m-f,(v=Math.abs(v)>Math.abs(f)?f:v)===p||l?n.index===b&&d(0<l?h.min-x.boxSize+l:h.max+x.boxSize+l):d(v<0?h.min-x.boxSize:h.max+x.boxSize),u(0,void 0,!0)),r.emit(s,n.index,n,b),n.index=b,d(y),u(o,(function(){r.emit(c,b,n)}))}return{update:function(){p(n.index,0),o.updateSize()},render:u,transform:d,slideTo:p,scrollPixel:function(e){var o,r=n.transforms,a=t.measure,s=t.limitation,l=(o=Number(e.toExponential().split("e")[1]))<=0?Math.pow(10,-(o-1)):1,c=r;i.resistance&&!i.loop&&(0<e&&r>=s.max?e-=Math.pow(e*l,i.resistanceRatio)/l:e<0&&r<=s.min&&(e+=Math.pow(-e*l,i.resistanceRatio)/l)),c+=e,i.loop&&(o=n.tracker.vector(),l=i.isHorizontal?o.velocityX:o.velocityY,(e=w(r,s))&&(o=r,r=s,0<l&&o>r.max||l<0&&o<r.min)&&(c=0<e?s.min-a.boxSize+e:s.max+a.boxSize+e)),d(c)},initStatus:function(e){void 0===e&&(e=0),n.startTransform=e,n.isStart=!1,n.isScrolling=!1,n.isTouching=!1},initLayout:function(e){d(e)},getOffsetSteps:a}}function z(e,t){var n="string"==typeof e?document.body.querySelector(e):e;return e=n.querySelector("."+t.wrapperClass),t=[].slice.call(n.getElementsByClassName(t.slideClass)),{$el:n,$wrapper:e,$list:t=t.filter((function(e){return null===e.getAttribute("data-shallow-slider")}))}}function L(t,o){var r=(u=e({},a,u=o),e({},u,{isHorizontal:"horizontal"===u.direction})),s=function(){var e={};return{on:function(t,n){e[t]?e[t].push(n):e[t]=[n]},off:function(t,n){!e[t]||-1<(n=e[t].indexOf(n))&&e[t].splice(n,1)},emit:function(t){for(var n=arguments.length,i=new Array(1<n?n-1:0),o=1;o<n;o++)i[o-1]=arguments[o];e[t]&&e[t].forEach((function(e){return e.apply(void 0,i)}))},clear:function(){e={}}}}(),l=g(z(t,r),r),c={tracker:d(),index:0,startTransform:0,isStart:!1,isScrolling:!1,isTouching:!1,transforms:0,progress:0},u=(o=s.on,s.off),p=s.emit,f={on:o,off:u,env:l,state:c,options:r};
4(r.plugins||L.plugins||[]).forEach((function(e){return e(f,r)})),p("before-init",f);var m=S(l,r),v=E(l,c,r,m,s),x=function(e,t,o,r){var a=e.touchable,s=["INPUT","SELECT","OPTION","TEXTAREA","BUTTON","VIDEO"],l=(r=h(o,e,t,r)).preheat,c=r.move,u=r.stop;function d(e){return{x:(e=a?e.changedTouches[0]:e).pageX,y:e.pageY}}function p(t){for(var n=0;n<o.excludeElements.length;n++)if(o.excludeElements[n].contains(t.target))return;var i,r=e.element.$wrapper,c=o.touchStartPreventDefault&&-1===s.indexOf(t.target.nodeName)||o.touchStartForcePreventDefault;!a&&c&&t.preventDefault(),l(d(t),(i=r,c=o.isHorizontal,r=getComputedStyle(i).transform.replace(/[a-z]|\(|\)|\s/g,"").split(",").map(parseFloat),i=[],16===r.length?i=r.slice(12,14):6===r.length&&(i=r.slice(4,6)),i[c?0:1]||0))}function f(e){o.touchMoveStopPropagation&&e.stopPropagation(),c(d(e)),t.isTouching&&!1!==e.cancelable&&e.preventDefault()}function m(){u()}return{attach:function(){var t=e.element.$el;a?(n(t,"touchstart",p,{passive:o.passiveListeners,capture:!1}),n(t,"touchmove",f),n(t,"touchend",m),n(t,"touchcancel",m)):(n(t,"mousedown",p),n(document,"mousemove",f),n(document,"mouseup",m))},detach:function(){var t=e.element.$el;i(t,"touchstart",p),i(t,"touchmove",f),i(t,"touchend",m),i(t,"touchcancel",m),i(t,"mousedown",p),i(document,"mousemove",f),i(document,"mouseup",m)}}}(l,c,r,v);return c=v.slideTo,Object.assign(f,{update:function(){m.destroy(),l.update(z(t,r)),m.init(),v.update()},destroy:function(){p("before-destroy",f),x.detach(),m.destroy(),p("after-destroy",f),s.clear()},slideTo:c,updateSize:function(){l.update(z(t,r)),v.update()}}),m.init(),x.attach(),c(r.initialSlide,0),p("after-init",f),f}return L.use=function(e){L.plugins=e},L}()},3266:function(e){e.exports=function(){"use strict";function e(e,t,n,i){e.addEventListener(t,n,i)}function t(e,t,n){e.removeEventListener(t,n)}return function(n,i){function o(e){c(e.target,"next")}function r(e){c(e.target,"prev")}var a=Boolean(i.navigation),s={nextEl:null,prevEl:null},l=Object.assign({disabledClass:"swiper-button-disabled"},i.navigation),c=function(e,t){u(e)&&!n.options.loop||(e=n.state.index,"next"===t&&n.slideTo(e+1),"prev"===t&&n.slideTo(e-1))},u=function(e){return e.classList.contains(l.disabledClass)};n.on("before-slide",(function(e,t,i){var o,r;n.options.loop||(o=i,i=(r=n.env.limitation).minIndex,r=r.maxIndex,s&&s.prevEl&&s.nextEl&&(s.nextEl.classList.contains(l.disabledClass)&&i<=o&&s.nextEl.classList.remove(l.disabledClass),s.prevEl.classList.contains(l.disabledClass)&&o<=r&&s.prevEl.classList.remove(l.disabledClass),o===i&&s.prevEl.classList.add(l.disabledClass),o===r&&s.nextEl.classList.add(l.disabledClass)))})),n.on("after-init",(function(){var t,i,c;a&&(s.nextEl="string"==typeof l.nextEl?document.body.querySelector(l.nextEl):l.nextEl,s.prevEl="string"==typeof l.prevEl?document.body.querySelector(l.prevEl):l.prevEl,n.options.loop||(t=n.state.index,i=n.env.element.$list,t===(c=n.env.limitation.minIndex)&&s.prevEl&&s.prevEl.classList.add(l.disabledClass),i.length===c&&s.nextEl&&s.nextEl.classList.add(l.disabledClass)),e(s.nextEl,"click",o),e(s.prevEl,"click",r))})),n.on("after-destroy",(function(){s&&s.prevEl&&s.nextEl&&(t(s.nextEl,"click",o),t(s.prevEl,"click",r),delete s.nextEl,delete s.prevEl)}))}}()}},t={};function n(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={exports:{}};return e[i].call(r.exports,r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(7152),t=n.n(e),i=n(3266),o=n.n(i);!function(){const e=document.querySelectorAll(".wp-block-coblocks-gallery-carousel");for(let n=0;n<e.length;n++){let i=null,r=0,a=!1;const s=e[n],l=e=>{const t=s.querySelector(`.wp-block-coblocks-gallery-carousel-thumbnail-${r}`);if(t){t.classList.remove("is-active");const n=s.querySelector(`.wp-block-coblocks-gallery-carousel-thumbnail-${e}`);n&&n.classList.add("is-active")}},c=e=>{i?.slideTo(e),l(e),r=e},u=e=>{e!==r&&(l(e),r=e)},d=s.querySelector(".swiper-container");if(d){const e=d.getAttribute("data-swiper");if(e){const n=JSON.parse(e),r=s.querySelector(".nav-button__prev"),l=s.querySelector(".nav-button__next");r&&r.setAttribute("aria-label",coblocksTinyswiper.carouselPrevButtonAriaLabel),l&&l.setAttribute("aria-label",coblocksTinyswiper.carouselNextButtonAriaLabel);const p=s.querySelectorAll("img");for(let e=0;e<p.length;++e)p[e].alt||(p[e].alt=coblocksTinyswiper.sliderImageAriaLabel);const f={centeredSlides:!1,freeMode:!1,longSwipesRatio:.8,loop:!1,passiveListeners:!0,plugins:[],slidesPerView:1};if(!0===n.loop&&(f.loop=n.loop),n.slidesPerView&&(f.slidesPerView=n.slidesPerView),n.navigation&&(f.plugins=[...f.plugins,o()],f.navigation={nextEl:l,prevEl:r}),i=new(t())(d,f),new ResizeObserver((()=>{i.update()})).observe(d),n.thumbnails){const e=s.querySelectorAll(".wp-block-coblocks-gallery-carousel-thumbnail");for(const[t,n]of Object.entries(e))n.addEventListener("click",(()=>c(t)));const t=s.querySelector(".wp-block-coblocks-gallery-carousel-thumbnail-0");t&&t.classList.add("is-active")}if(!n.thumbnails&&n.pageDots){const e=s.querySelectorAll(".wp-block-coblocks-gallery-carousel-page-dot-pagination");for(const[t,n]of Object.entries(e))n.addEventListener("click",(()=>c(t)));const t=s.querySelector(".wp-block-coblocks-gallery-carousel-page-dot--0");t&&t.classList.add("is-active")}if(!0!==n.draggable){const e=s.querySelector(".swiper-wrapper");e?.addEventListener("mousedown",(e=>{e.stopPropagation()}))}!0===n.autoPlay&&n.autoPlaySpeed&&(!0===n.pauseHover&&(d.addEventListener("mouseenter",(()=>{a=!0})),d.addEventListener("mouseleave",(()=>{a=!1}))),setInterval((()=>{!0===n.pauseHover&&!0===a||i?.slideTo(i.state.index+1)}),n.autoPlaySpeed)),i.on("after-slide",u)}}}}()})()})();; 5/* global document */ 6/* global jQuery */ 7 8(function ($) { 9 10 'use strict'; 11 12 var loadYoutube = function() { 13 $('.mace-youtube').each(function() { 14 var $youtube = $(this); 15 16 if($youtube.is('.mace-youtube-loaded')) { 17 return; 18 } 19 20 var videoUrl = $youtube.attr('data-mace-video'); 21 var thumbUrl = $youtube.attr('data-mace-video-thumb'); 22 23 var image = $('<img />'); 24 image.attr('src', thumbUrl); 25 26 // Lazy loading. 27 image.attr({ 28 'width': 1600, 29 'height': 900, 30 'src': 'data:image/svg+xml;charset=utf-8,%3Csvg xmlns%3D\'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg\' viewBox%3D\'0 0 1600 900\'%2F%3
30E', 31 'data-src': thumbUrl, 32 'data-expand': 600 33 }); 34 35 image.addClass('lazyload'); 36 37 image.on('load', function() { 38 $youtube.append( image ); 39 }()); 40 41 // Click to play YT. 42 $youtube.on('click', function() { 43 $youtube.find('iframe').remove(); 44 45 var $iframe = $('<iframe>'); 46 47 $iframe.on('load', function() { 48 $youtube.trigger('maceIframeLoaded', [$iframe]); 49 50 // Play video. 51 $iframe[0].contentWindow.postMessage(JSON.stringify({ 52 'event': 'command', 53 'func': 'playVideo', 54 'args': ''}), 55 '*'); 56 }); 57 58 $iframe.attr('frameborder', '0'); 59 $iframe.attr('allowfullscreen', ''); 60 $iframe.attr('src', videoUrl); 61 62 $youtube.empty().append($iframe); 63 }); 64 65 $youtube.addClass('mace-youtube-loaded'); 66 }); 67 }; 68 69 $(document).ready(function() { 70 71 loadYoutube(); 72 73 $('body').on('maceLoadYoutube', loadYoutube); 74 75 }); 76 77})(jQuery); 78 79; 80!function(a,b){var c=function(a,b,c){"use strict";var d,e;if(function(){var b,c={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:!0,expFactor:1.5,hFac:.8,loadMode:2,loadHidden:!0,ricTimeout:0,throttleDelay:125};e=a.lazySizesConfig||a.lazysizesConfig||{};for(b in c)b in e||(e[b]=c[b])}(),!b||!b.getElementsByClassName)return{init:function(){},cfg:e,noSupport:!0};var f=b.documentElement,g=a.HTMLPictureElement,h=a.addEventListener.bind(a),i=a.setTimeout,j=a.requestAnimationFrame||i,k=a.requestIdleCallback,l=/^picture$/i,m=["load","error","lazyincluded","_lazyloaded"],n={},o=Array.prototype.forEach,p=function(a,b){return n[b]||(n[b]=new RegExp("(\\s|^)"+b+"(\\s|$)")),n[b].test(a.getAttribute("class")||"")&&n[b]},q=function(a,b){p(a,b)||a.setAttribute("class",(a.getAttribute("class")||"").trim()+" "+b)},r=function(a,b){var c;(c=p(a,b))&&a.setAttribute("class",(a.getAttribute("class")||"").replace(c," "))},s=function(a,b,c){var d=c?"addEventListener":"removeEventListener";c&&s(a,b),m.forEach(function(c){a[d](c,b)})},t=function(a,c,e,f,g){var h=b.createEvent("Event");return e||(e={}),e.instance=d,h.initEvent(c,!f,!g),h.detail=e,a.dispatchEvent(h),h},u=function(b,c){var d;!g&&(d=a.picturefill||e.pf)?(c&&c.src&&!b.getAttribute("srcset")&&b.setAttribute("srcset",c.src),d({reevaluate:!0,elements:[b]})):c&&c.src&&(b.src=c.src)},v=function(a,b){return(getComputedStyle(a,null)||{})[b]},w=function(a,b,c){for(c=c||a.offsetWidth;c<e.minSize&&b&&!a._lazysizesWidth;)c=b.offsetWidth,b=b.parentNode;return c},x=function(){var a,c,d=[],e=[],f=d,g=function(){var b=f;for(f=d.length?e:d,a=!0,c=!1;b.length;)b.shift()();a=!1},h=function(d,e){a&&!e?d.apply(this,arguments):(f.push(d),c||(c=!0,(b.hidden?i:j)(g)))};return h._lsFlush=g,h}(),y=function(a,b){return b?function(){x(a)}:function(){var b=this,c=arguments;x(function(){a.apply(b,c)})}},z=function(a){var b,d=0,f=e.throttleDelay,g=e.ricTimeout,h=function(){b=!1,d=c.now(),a()},j=k&&g>49?function(){k(h,{timeout:g}),g!==e.ricTimeout&&(g=e.ricTimeout)}:y(function(){i(h)},!0);return function(a){var e;(a=!0===a)&&(g=33),b||(b=!0,e=f-(c.now()-d),e<0&&(e=0),a||e<9?j():i(j,e))}},A=function(a){var b,d,e=function(){b=null,a()},f=function(){var a=c.now()-d;a<99?i(f,99-a):(k||e)(e)};return function(){d=c.now(),b||(b=i(f,99))}},B=function(){var g,k,m,n,w,B,D,E,F,G,H,I,J=/^img$/i,K=/^iframe$/i,L="onscroll"in a&&!/(gle|ing)bot/.test(navigator.userAgent),M=0,N=0,O=-1,P=function(a){N--,(!a||N<0||!a.target)&&(N=0)},Q=function(a){return null==I&&(I="hidden"==v(b.body,"visibility")),I||!("hidden"==v(a.parentNode,"visibility")&&"hidden"==v(a,"visibility"))},R=function(a,c){var d,e=a,g=Q(a);for(E-=c,H+=c,F-=c,G+=c;g&&(e=e.offsetParent)&&e!=b.body&&e!=f;)(g=(v(e,"opacity")||1)>
800)&&"visible"!=v(e,"overflow")&&(d=e.getBoundingClientRect(),g=G>d.left&&F<d.right&&H>d.top-1&&E<d.bottom+1);return g},S=function(){var a,c,h,i,j,l,m,o,p,q,r,s,t=d.elements;if((n=e.loadMode)&&N<8&&(a=t.length)){for(c=0,O++;c<a;c++)if(t[c]&&!t[c]._lazyRace)if(!L||d.prematureUnveil&&d.prematureUnveil(t[c]))$(t[c]);else if((o=t[c].getAttribute("data-expand"))&&(l=1*o)||(l=M),q||(q=!e.expand||e.expand<1?f.clientHeight>500&&f.clientWidth>500?500:370:e.expand,d._defEx=q,r=q*e.expFactor,s=e.hFac,I=null,M<r&&N<1&&O>2&&n>2&&!b.hidden?(M=r,O=0):M=n>1&&O>1&&N<6?q:0),p!==l&&(B=innerWidth+l*s,D=innerHeight+l,m=-1*l,p=l),h=t[c].getBoundingClientRect(),(H=h.bottom)>=m&&(E=h.top)<=D&&(G=h.right)>=m*s&&(F=h.left)<=B&&(H||G||F||E)&&(e.loadHidden||Q(t[c]))&&(k&&N<3&&!o&&(n<3||O<4)||R(t[c],l))){if($(t[c]),j=!0,N>9)break}else!j&&k&&!i&&N<4&&O<4&&n>2&&(g[0]||e.preloadAfterLoad)&&(g[0]||!o&&(H||G||F||E||"auto"!=t[c].getAttribute(e.sizesAttr)))&&(i=g[0]||t[c]);i&&!j&&$(i)}},T=z(S),U=function(a){var b=a.target;if(b._lazyCache)return void delete b._lazyCache;P(a),q(b,e.loadedClass),r(b,e.loadingClass),s(b,W),t(b,"lazyloaded")},V=y(U),W=function(a){V({target:a.target})},X=function(a,b){try{a.contentWindow.location.replace(b)}catch(c){a.src=b}},Y=function(a){var b,c=a.getAttribute(e.srcsetAttr);(b=e.customMedia[a.getAttribute("data-media")||a.getAttribute("media")])&&a.setAttribute("media",b),c&&a.setAttribute("srcset",c)},Z=y(function(a,b,c,d,f){var g,h,j,k,n,p;(n=t(a,"lazybeforeunveil",b)).defaultPrevented||(d&&(c?q(a,e.autosizesClass):a.setAttribute("sizes",d)),h=a.getAttribute(e.srcsetAttr),g=a.getAttribute(e.srcAttr),f&&(j=a.parentNode,k=j&&l.test(j.nodeName||"")),p=b.firesLoad||"src"in a&&(h||g||k),n={target:a},q(a,e.loadingClass),p&&(clearTimeout(m),m=i(P,2500),s(a,W,!0)),k&&o.call(j.getElementsByTagName("source"),Y),h?a.setAttribute("srcset",h):g&&!k&&(K.test(a.nodeName)?X(a,g):a.src=g),f&&(h||k)&&u(a,{src:g})),a._lazyRace&&delete a._lazyRace,r(a,e.lazyClass),x(function(){var b=a.complete&&a.naturalWidth>1;p&&!b||(b&&q(a,"ls-is-cached"),U(n),a._lazyCache=!0,i(function(){"_lazyCache"in a&&delete a._lazyCache},9)),"lazy"==a.loading&&N--},!0)}),$=function(a){if(!a._lazyRace){var b,c=J.test(a.nodeName),d=c&&(a.getAttribute(e.sizesAttr)||a.getAttribute("sizes")),f="auto"==d;(!f&&k||!c||!a.getAttribute("src")&&!a.srcset||a.complete||p(a,e.errorClass)||!p(a,e.lazyClass))&&(b=t(a,"lazyunveilread").detail,f&&C.updateElem(a,!0,a.offsetWidth),a._lazyRace=!0,N++,Z(a,b,f,d,c))}},_=A(function(){e.loadMode=3,T()}),aa=function(){3==e.loadMode&&(e.loadMode=2),_()},ba=function(){if(!k){if(c.now()-w<999)return void i(ba,999);k=!0,e.loadMode=3,T(),h("scroll",aa,!0)}};return{_:function(){w=c.now(),d.elements=b.getElementsByClassName(e.lazyClass),g=b.getElementsByClassName(e.lazyClass+" "+e.preloadClass),h("scroll",T,!0),h("resize",T,!0),h("pageshow",function(a){if(a.persisted){var c=b.querySelectorAll("."+e.loadingClass);c.length&&c.forEach&&j(function(){c.forEach(function(a){a.complete&&$(a)})})}}),a.MutationObserver?new MutationObserver(T).observe(f,{childList:!0,subtree:!0,attributes:!0}):(f.addEventListener("DOMNodeInserted",T,!0),f.addEventListener("DOMAttrModified",T,!0),setInterval(T,999)),h("hashchange",T,!0),["focus","mouseover","click","load","transitionend","animationend"].forEach(function(a){b.addEventListener(a,T,!0)}),/d$|^c/.test(b.readyState)?ba():(h("load",ba),b.addEventListener("DOMContentLoaded",T),i(ba,2e4)),d.elements.length?(S(),x._lsFlush()):T()},checkElems:T,unveil:$,_aLSL:aa}}(),C=function(){var a,c=y(function(a,b,c,d){var e,f,g;if(a._lazysizesWidth=d,d+="px",a.setAttribute("sizes",d),l.test(b.nodeName||""))for(e=b.getElementsByTagName("source"),f=0,g=e.length;f<g;f++)e[f].setAttribute("sizes",d);c.detail.dataAttr||u(a,c.detail)}),d=function(a,b,d){var e,f=a.parentNode;f&&(d=w(a,f,d),e=t(a,"lazybeforesizes",{width:d,dataAttr:!!b}),e.defaultPrevented||(d=e.detail.width)&&d!==a._lazysizesWidth&&c(a,f,e,d))},f=function(){var b,c=a.length;if(c)for(b=0;b<c;b++)d(a[b])},g=A(f);return{_:function(){a=b.getElementsByClassName(e.autosizesClass),h("resize",g)},checkElems:g,updateElem:d}}(),D=function(){!D.i&&b.getElementsByClassName&&(D.i=!0,C._(),B._())};return i(function(){e.init&&D()}),d={cfg:e,autoSizer:C,loader:B,init:D,uP:u,aC:q,rC:r,hC:p,fire:t,gW:w,rAF:x}}(a,a.document,Date);a.lazySizes=c,"object"==typeof module&&module.exports&&(module.exports=c)}("undefined"!=typeof window?window:{});; 81/*! lazysizes - v5.2.0 */ 82!function(a,b){var c=function(){b(a.lazySizes),a.removeEventListener("lazyunveilread",c,!0)};b=b.bind(null,a,a.document),"object"==typeof module&&module.exports?b(require("lazysizes")):a.lazySizes?c():a.addEventListener("lazyunveilread",c,!0)}(window,function(a,b,c){"use strict";function d(a,c){if(!g[a]){var d=b.createElement(c?"link":"script"),e=b.getElementsByTagName("script")[0];c?(d.rel="stylesheet",d.href=a):d.src=a,g[a]=!0,g[d.src||d.href]=!0,e.parentNode.insertBefore(d,e)}}var e,f,g={};b.addEventListener&&(f=/\(|\)|\s|'/,e=function(a,c){var d=b.createElement("img");d.onload=function(){d.onload=null,d.onerror=null,d=null,c()},d.onerror=d.onload,d.src=a,d&&d.complete&&d.onload&&d.onload()}
82,addEventListener("lazybeforeunveil",function(a){if(a.detail.instance==c){var b,g,h,i;if(!a.defaultPrevented){var j=a.target;if("none"==j.preload&&(j.preload=j.getAttribute("data-preload")||"auto"),null!=j.getAttribute("data-autoplay"))if(j.getAttribute("data-expand")&&!j.autoplay)try{j.play()}catch(a){}else requestAnimationFrame(function(){j.setAttribute("data-expand","-10"),c.aC(j,c.cfg.lazyClass)});b=j.getAttribute("data-link"),b&&d(b,!0),b=j.getAttribute("data-script"),b&&d(b),b=j.getAttribute("data-require"),b&&(c.cfg.requireJs?c.cfg.requireJs([b]):d(b)),h=j.getAttribute("data-bg"),h&&(a.detail.firesLoad=!0,g=function(){j.style.backgroundImage="url("+(f.test(h)?JSON.stringify(h):h)+")",a.detail.firesLoad=!1,c.fire(j,"_lazyloaded",{},!0,!0)},e(h,g)),i=j.getAttribute("data-poster"),i&&(a.detail.firesLoad=!0,g=function(){j.poster=i,a.detail.firesLoad=!1,c.fire(j,"_lazyloaded",{},!0,!0)},e(i,g))}}},!1))});; 83/* global document */ 84/* global window */ 85/* global jQuery */ 86/* global macegallery */ 87 88(function ($) { 89 90 'use strict'; 91 92 var config = $.parseJSON(macegallery); 93 var template = config.html; 94 var sharesTemplate = config.shares; 95 96 var Gallery = function($gallery) { 97 var data = $gallery.attr('data-g1-gallery'); 98 var galleryId = $gallery.attr('id'); 99 var items = $.parseJSON(data); 100 var galleryLength = items.length; 101 var imagesLength = 0; 102 103 items.forEach(function(item) { 104 if (item.type === 'image') { 105 imagesLength++; 106 } 107 }); 108 109 var galleryTitle = $gallery.attr('data-g1-gallery-title'); 110 var ShareUrl = $gallery.attr('data-g1-share-shortlink'); 111 var currentIndex = 0; 112 var currentImageIndex = 0; 113 var isGalleryVisible = false; 114 var currentSidebarCollectionOffset = 0; 115 var maxSidebarCollectionOffset = Math.ceil((imagesLength - 9) / 3); 116 var html = template; 117 118 var init = function() { 119 captureLightbox(); 120 bindEvents(); 121 122 var hash = window.location.hash; 123 124 hash = hash.replace('#',''); 125 126 if( hash === galleryId ) { 127 $gallery.trigger('click'); 128 } 129 }; 130 131 var bindEvents = function() { 132 $gallery.on('click', function(){ 133 var $appendedElements = $(html); 134 135 // Don't load ad until we can check whether the sidebar is visible or not. 136 var $sidebarAd = $appendedElements.find('.g1-gallery-sidebar .g1-gallery-ad'); 137 var sidebarAdHTML = $sidebarAd.html(); 138 $sidebarAd.html(''); 139 140 $appendedElements.appendTo("body"); 141 $appendedElements.append(buildStyle()); 142 $('.g1-gallery-thumbnail-1').addClass('g1-gallery-thumbnail-active'); 143 bindLightboxEvents($appendedElements); 144 hideThumbnailsIfTooSmall(); 145 $('body').addClass('g1-gallery-visible'); 146 isGalleryVisible = true; 147 switchToIndex(0, true); 148 149 // Load ad is the sidebar is visible. 150 if ( $sidebarAd.is(':visible') ) { 151 $sidebarAd.html(sidebarAdHTML); 152 } 153 }); 154 }; 155 156 var bindLightboxEvents = function($appendedElements) { 157 $( window ).resize(function() { 158 hideThumbnailsIfTooSmall(); 159 }); 160 $('.g1-gallery-close-button').on('click', function(){ 161 $('body').removeClass('g1-gallery-visible'); 162 setTimeout(function() { 163 setSidebarThumbnailsOffset(0); 164 $appendedElements.remove(); 165 currentSidebarCollectionOffset = 0; 166 isGalleryVisible = false; 167 }, 375); 168 }); 169 170 $('.g1-gallery-thumbs-button, .g1-gallery-back-to-slideshow').on('click', function(){ 171 $appendedElements.toggleClass('g1-gallery-thumbnails-mode'); 172 });
173 $('.g1-gallery-thumbnail').on('click', function(){ 174 var index = parseInt($(this).attr('data-g1-gallery-index'), 10); 175 switchToIndex(index); 176 }); 177 178 $('.g1-gallery-previous-frame').on('click', function(){ 179 handlePrevFrame(); 180 }); 181 $('.g1-gallery-next-frame').on('click', function(){ 182 handleNextFrame(); 183 }); 184 185 $(document).keydown(function (e){ 186 if (isGalleryVisible) { 187 if(e.keyCode == 37){ 188 handlePrevFrame(); 189 } 190 if(e.keyCode == 39){ 191 handleNextFrame(); 192 } 193 } 194 }); 195 196 $('.g1-gallery-thumbnails-up').on('click', function(){ 197 if (currentSidebarCollectionOffset > 0) { 198 setSidebarThumbnailsOffset(currentSidebarCollectionOffset-1); 199 } 200 }); 201 $('.g1-gallery-thumbnails-down').on('click', function(){ 202 if (currentSidebarCollectionOffset < maxSidebarCollectionOffset) { 203 setSidebarThumbnailsOffset(currentSidebarCollectionOffset+1); 204 } 205 }); 206 }; 207 208 var hideThumbnailsIfTooSmall = function() { 209 $('.g1-gallery-thumbnails').show(); 210 if($('.g1-gallery-thumbnails').height() < 200){ 211 $('.g1-gallery-thumbnails').hide(); 212 } 213 }; 214 215 var handleNextFrame = function() { 216 if (currentIndex === galleryLength - 1){ 217 return; 218 } 219 220 switchToIndex(currentIndex + 1); 221 }; 222 223 var handlePrevFrame = function () { 224 if (currentIndex === 0){ 225 return; 226 } 227 228 switchToIndex(currentIndex - 1); 229 }; 230 231 var switchToIndex = function(index, delay){ 232 var item = items[index]; 233 currentIndex = index; 234 235 updateImageIndex(); 236 237 $('.g1-gallery-frame-visible').removeClass('g1-gallery-frame-visible'); 238 $('.g1-gallery-wrapper').removeClass('g1-gallery-ad-mode'); 239 240 if (item.type === 'image') { 241 $('.g1-gallery-thumbnail').removeClass('g1-gallery-thumbnail-active'); 242 $('.g1-gallery-thumbnail-' + currentIndex).addClass('g1-gallery-thumbnail-active'); 243 $('.g1-gallery-frame-' + currentIndex).addClass('g1-gallery-frame-visible'); 244 $('.g1-gallery-wrapper').removeClass('g1-gallery-thumbnails-mode'); 245 $('.g1-gallery-numerator-current').html(currentImageIndex); 246 247 var imageUrl = $('.g1-gallery-frame-visible').attr('data-g1-share-image'); 248 249 // Check why calling setupShares() affects slide switching speed. 250 if (delay) { 251 setTimeout(function() { 252 setupShares(imageUrl); 253 }, 500); 254 } else { 255 setupShares(imageUrl); 256 } 257 258 // set up sidebar thumbs. 259 var row = Math.ceil((currentIndex - 1)/3); 260 var newOffset = row - 1; 261 if (newOffset > maxSidebarCollectionOffset){ 262 newOffset = maxSidebarCollectionOffset; 263 } 264 if (newOffset < 0 ){ 265 newOffset = 0; 266 } 267 268 setSidebarThumbnailsOffset(newOffset); 269 } 270 271 if (item.type === 'ad') { 272 var $adFrame = $('.g1-gallery-frame-ad-' + index); 273 274 $('.g1-gallery-frame-' + currentIndex).removeClass('g1-gallery-frame-visible'); 275 $('.g1-gallery-thumbnail').removeClass('g1-gallery-thumbnail-active'); 276 $adFrame.addClass('g1-gallery-frame-visible'); 277 $('.g1-gallery-wrapper').addClass('g1-gallery-ad-mode'); 278 279 // Ad not loaded? 280 if ($adFrame.find('.g1-gallery-ad:not(.g1-ad-loaded)').length > 0) { 281 $adFrame.find('.g1-gallery-ad').append(items[index].html).addClass('g1-ad-loaded'); 282 } 283 } 284 }; 285 286 var updateImageIndex = function() { 287 currentImageIndex = 0; 288 289 for (var index in items) { 290 if (items[index].type === 'image') { 291 currentImageIndex++; 292 } 293 294 if (index == currentIndex) { 295 break; 296 } 297 } 298 }; 299 300 var setupShares = function(imageUrl) { 301 var shareHtml = sharesTemplate; 302 shareHtml = shareHtml.replace(new RegExp(/mace_replace_shortlink/g), encodeURIComponent(ShareUrl)); 303 shareHtml = shareHtml.replace(new RegExp(/mace_replace_title/g), encodeURIComponent(galleryTitle)); 304 shareHtml = shareHtml.replace(new RegExp(/mace_replace_image_url/g), encodeURIComponent(imageUrl)); 305 shareHtml = shareHtml.replace(new RegExp(/mace_replace_noesc_shortlink/g), ShareUrl); 306 shareHtml = shareHtml.replace(new RegExp(/mace_replace_noesc_title/g), galleryTitle); 307 shareHtml = shareHtml.replace(new RegExp(/mace_replace_noesc_image_url/g), imageUrl); 308 shareHtml = shareHtml.replace(new RegExp(/mace_replace_unique/g), Math.random().toString(36).substr(2, 16)); 309 310 $('.g1-gallery-shares').html(shareHtml); 311 312 // Remove this one as it forces entire FB SDK to reload! 313 jQuery('body').trigger('maceGalleryItemChanged'); 314 }; 315
316 var setSidebarThumbnailsOffset = function(offset){ 317 $('.g1-gallery-sidebar .g1-gallery-thumbnail').css('top', offset * - 108); 318 currentSidebarCollectionOffset = offset; 319 }; 320 321 var captureLightbox = function() { 322 var frames = buildFrames(); 323 var thumbnails = buildThumbnails('thumbnail'); 324 var thumbnails32 = buildThumbnails('3-2-thumbnail'); 325 var numerator = buildNumerator(); 326 var title = galleryTitle; 327 html = html.replace( '{frames}', frames); 328 html = html.replace( '{thumbnails}', thumbnails); 329 html = html.replace( '{thumbnails32}', thumbnails32); 330 html = html.replace( '{numerator}', numerator); 331 html = html.replace( '{title}', title); 332 }; 333 334 var buildStyle = function() { 335 var out = '<style>'; 336 items.forEach( function(item) { 337 if(item.type === 'image'){ 338 out += '.g1-gallery-image-' + item.id + '{ background-image:url(' + item.full +'); }'; 339 } 340 }); 341 return out; 342 }; 343 344 var buildFrames = function() { 345 var out = ''; 346 var index = 0; 347 items.forEach( function(item) { 348 if (item.type === 'image') { 349 out += '<div class="g1-gallery-frame g1-gallery-frame-' + index + '" data-g1-share-image="' + item.full + '">'; 350 out += '<div class="g1-gallery-image g1-gallery-image-' + item.id + ' ">'; 351 out += '<a class="g1-gallery-previous-frame"></a>'; 352 out += '<a class="g1-gallery-next-frame"></a>'; 353 out += '</div>'; 354 out += '<div class="g1-gallery-image-title">' + item.title + '</div></div>' 355 } 356 if (item.type === 'ad') { 357 out += '<div class="g1-gallery-frame g1-gallery-frame-' + index + ' g1-gallery-frame-ad g1-gallery-frame-ad-' + index + '">'; 358 out += '<div class="g1-gallery-ad">'; 359 out += '<a class="g1-gallery-previous-frame"></a>'; 360 out += '<a class="g1-gallery-next-frame"></a>'; 361 out += '</div></div>'; 362 } 363 364 index += 1; 365 }); 366 return out; 367 }; 368 369 var buildThumbnails = function(size) { 370 var out = ''; 371 for (var index in items) { 372 var item = items[index]; 373 374 if (item.type === 'image') { 375 out += '<div class="g1-gallery-thumbnail g1-gallery-thumbnail-' + index + '" data-g1-gallery-index="' + index + '">'; 376 out += '<img src="' + item[size] + '">'; 377 out += '</div>'; 378 } 379 } 380 381 return out; 382 }; 383 384 var buildNumerator = function() { 385 return '<span class="g1-gallery-numerator-current">1</span> ' + config.i18n.of + ' <span class="g1-gallery-numerator-max">' + imagesLength + '</span>'; 386 }; 387 388 return init(); 389 }; 390 391 // Fire. 392 $(document).ready(function() { 393 setupGalleries($('body')); 394 }); 395 396 $('body').on('g1NewContentLoaded', function( e, $newContent ){ 397 setupGalleries($newContent); 398 }); 399 400 var setupGalleries = function($scope) { 401 $('.mace-gallery-teaser', $scope).each(function() { 402 new Gallery($(this)); 403 }); 404 }; 405 406})(jQuery); 407; 408"undefined"==typeof window.snax_collections&&(window.snax_collections={}),function(a,b){"use strict";b.AddPopup=function(){var c,d,e={},f={},g={},h={popup:"#snax-popup-add-to-collection",popupInner:".snax-add-to-collection",leading:".snax-collections-leading",searchInput:"input[name=snax-collection-search]",searchSubmit:"input[name=snax-collection-save]",searchForm:"form.snax-form-collection-search",items:".snax-collections-items",item:".snax-collections-item",itemTitle:".snax-collection-title",itemTitleLink:".snax-collection-title > a",publicItemTpl:".snax-collections-item >
408 .snax-collection-public",privateItemTpl:".snax-collections-item > .snax-collection-private"},i={popupLoading:"snax-add-to-collection-loading"};e.open=function(a,b){if(g={postId:a,nonce:b},"function"!=typeof snax.openPopup)throw new Error("openPopup() not defined!");d.find(h.searchInput).val(""),snax.openPopup(d);var c=d.find(h.popupInner),e=d.find(h.leading);c.addClass(i.popupLoading),e.hide(),j(function(a,b){c.removeClass(i.popupLoading),0===b&&e.show()})},e.close=function(){snax.closePopup()};var j=function(b){var e=a.ajax({type:"GET",url:c.ajax_url,dataType:"json",data:{action:"snax_get_user_collections"}});e.done(function(a){var c="success"===a.status;if(c){var e=d.find(h.items);e.empty();for(var g in a.args.list){var i=a.args.list[g],j=f[i.visibility].clone(),k='<a href="#" data-snax-collection="'+i.ID+'">'+i.post_title+"</a>";j.find(h.itemTitle).html(k),e.append(j)}}"function"==typeof b&&b(c,a.args.list.length)})},k=function(b,d){var e=a.ajax({type:"POST",url:c.ajax_url,dataType:"json",data:{action:"snax_save_collection",security:g.nonce,snax_title:b}});e.done(function(a){var b="success"===a.status;d(!!b&&a.args.collection_id)})},l=function(){a(h.searchForm,d).on("submit",function(c){c.preventDefault();var d=a(this).find(h.searchInput).val();e.close(),k(d,function(a){if(!1===a)throw new Error("Collection not saved!");b.addToCollection(a,g.postId,g.nonce)})})},m=function(){d.on("click",h.item,function(c){c.preventDefault();var d=a(this).find("a").data("snax-collection");e.close(),b.addToCollection(d,g.postId,g.nonce)})},n=function(){var b=function(b){var c=d.find(h.itemTitleLink);d.find(h.item).show(),0!==b.length&&(b=b.toLowerCase(),c.each(function(){var c=a(this).text().toLowerCase();-1===c.indexOf(b)&&a(this).parents(h.item).hide()}))};d.find(h.searchInput).on("keyup",function(){var c=a(this).val(),e=d.find(h.searchSubmit);c.length>0?e.removeAttr("disabled"):e.attr("disabled","disabled"),b(c)})},o=function(){l(),m(),n()},p=function(){if(d=a(h.popup),0===d.length)throw new Error("Add collection popup not found!");return c=a.parseJSON(snax_collections_js_config),f.public=d.find(h.publicItemTpl).parent().detach(),f.private=d.find(h.privateItemTpl).parent().detach(),o(),e};return p()}}(jQuery,snax_collections),function(a,b){"use strict";var c,d,e={postContainer:".snax-post-container",collectionItems:".snax-collection-items",collectionItem:".snax-collection-item",actions:".snax-collection-actions",addAction:".snax-action-add-to-collection",clearAllAction:".snax-collection-action-clear-all",removeCollectionAction:".snax-collection-action-delete",removePostAction:".snax-collection-action-remove-post",itemCount:".snax-collection-item-count",featuredMedia:".snax-collection-essentials .entry-featured-media .g1-frame-inner",meta:".snax-collection-essentials .snax-collection-meta",editForm:"form.snax-edit-collection",cancelAction:".snax-edit-collection-actions > a",mediaForm:".snax-media-upload-form",titleField:"input[name=snax-title]",descriptionField:"textarea[name=snax-description]",visibilityField:"input[name=snax-visibility]",featuredMediaField:"input[name=snax-featured-image]"},f={itemAdded:"snax-collection-item-added",itemAdding:"snax-collection-item-adding",itemRemoved:"snax-collection-item-removed",itemRemoving:"snax-collection-item-removing"};b.addToCollection=function(b,d,e,f){var g=a.ajax({type:"POST",url:c.ajax_url,dataType:"json",data:{action:"snax_add_to_collection",security:e,snax_collection:b,snax_post_id:d}});g.done(function(a){var b="success"===a.status;b&&snax.notifications&&snax.notifications.add(a.args.html),"function"==typeof f&&f(b)})},b.removeCollection=function(b,d,e){var f=a.ajax({type:"POST",url:c.ajax_url,dataType:"json",data:{action:"snax_remove_collection",security:d,snax_collection_id:b}});f.done(function(a){var b="success"===a.status;e(b)})},b.removePost=function(b,d,e,f){var g=a.ajax({type:"POST",url:c.ajax_url,dataType:"json",data:{action:"snax_remove_post_from_collection",security:e,snax_post_id:b,snax_collection_id:d}});g.done(function(a){var b="success"===a.status;f(b)})},b.clearAll=function(b,d){var e=a.ajax({type:"POST",url:c.ajax_url,dataType:"json",data:{action:"snax_remove_all_from_collection",security:d,snax_collection_id:b}});e.done(function(a){var b="success"===a.status;b&&(window.location.href=a.args.redirect_to)})},b.updateCollectionFeaturedImage=function(b){var d=a.ajax({type:"GET",url:c.ajax_url,dataType:"json",data:{action:"snax_get_collection_featured_media",snax_collection_id:b}});d.done(function(b){var c="success"===b.status;if(c){var d=a(e.featuredMedia),f=d.find("img"),g=a(b.args.html);f.attr("src")!==g.attr("src")&&d.html(g)}})},b.updateCollectionMeta=function(b){var d=a.ajax({type:"GET",url:c.ajax_url,dataType:"json",data:{action:"snax_get_collection_meta",snax_collection_id:b}});d.done(function(b){var c="success"===b.status;c&&a(e.meta).replaceWith(b.args.html)})},b.saveCollection=function(b,d,e){var f=a.ajax({type:"POST",url:c.ajax_url,dataType:"json",data:{action:"snax_save_collection",security:c.nonce,snax_collection_id:b,snax_title:d.title||"",snax_description:d.description||"",snax_visibility:d.visibility||"private",snax_featured_media:d.featuredMedia||""}});f.done(function(a){var b="success"===a.status;e&&e(b,a.args.collection_url)})},b.addToCollectionEvent=function(){a("body").on("click",e.addAction,function(){var e=a(this),g=parseInt(c.user_id,10);if(!g)return void(window.location.href=e.data("snax-redirect"));var h=e.data("snax-collection"),i=e.data("snax-post"),j=e.data("snax-nonce");h&&i&&j&&("custom"===h?(d||(d=b.AddPopup()),d.open(i,j)):(e.addClass(f.itemAdding),b.addToCollection(h,i,j,function(a){a&&(e.addClass(f.itemAdded),e.prop("disabled",!0))})))})},b.removeCollectionEvent=function(){a("body").on("click",e.removeCollectionAction,function(){if(confirm(c.i18n.are_you_sure_remove)){var d=a(this),f=parseInt(c.user_id,10);if(0!==f){var g=d.parents(e.actions),h=g.data("snax-collection"),i=g.data("snax-nonce");h&&i&&(snax.notifications&&snax.notifications.add(c.i18n.removed),b.removeCollection(h,i,function(a){a&&(window.location.href=c.home_url)}))}}})},b.removeFromCollectionEvent=function(){a("body").on("click",e.removePostAction,function(){var d=a(this),g=parseInt(c.user_id,10);if(0!==g){var h=d.data("snax-post"),i=d.parents(e.collectionItems).data("snax-collection"),j=d.data("snax-nonce");if(h&&i&&j){var k=d.parents(e.collectionItem);k.addClass(f.itemRemoving),b.removePost(h,i,j,function(a){a&&(k.addClass(f.itemRemoved),k.slideToggle(375),setTimeout(function(){var a=d.parents(e.postContainer).find(e.itemCount);a.text(parseInt(a.text(),10)-1)},375),b.updateCollectionFeaturedImage(i),b.updateCollectionMeta(i))})}}})},b.clearAllEvent=function(){a("body").on("click",e.clearAllAction,function(){if(confirm(c.i18n.are_you_sure_clear_all)){var d=parseInt(c.user_id,10);if(0!==d){var f=a(this).parents(e.actions),g=f.data("snax-collection"),h=f.data("snax-nonce");g&&h&&(snax.notifications&&snax.notifications.add(c.i18n.removing_items),b.clearAll(g,h))}}})},b.clearPreviewEvent=function(){var b=a(e.editForm);b.find("a.snax-media-action-delete-featured").parents(".snax-object-actions").remove();var c=b.find("a.snax-delete-collection-image").parents(".snax-object-actions").hide(),d=b.find("#snax-featured-image");if(d.length>0){var f=c.clone();f.insertAfter(d.find(".snax-object-container")).show(),f.on("click","a.snax-delete-collection-image",function(c){c.preventDefault(),b.find(e.featuredMediaField).val(""),a("#snax-featured-image").empty(),b.find(".snax-tab-content-featured-image").addClass("snax-tab-content-visible").removeClass("snax-tab-content-hidden")})}},b.editFormEvents=function(){var c=a(e.editForm),d=c.find(e.mediaForm);d.on("snaxFileUploaded",function(a,b){c.find(e.featuredMediaField).val(b)}),b.clearPreviewEvent(),d.on("snaxPreviewLoaded",function(a,c){b.clearPreviewEvent()}),c.on("submit",function(a){a.preventDefault();var d=c.data("snax-collection"),f=c.find(e.titleField).val();if(0===f.length)return void alert("Please fill in the title");var g=c.find(e.descriptionField).val(),h=c.find(e.visibilityField+":checked").val(),i=c.find(e.featuredMediaField).val(),j={title:f,description:g,visibility:h,featuredMedia:i},k=c.find("input[type=submit]");k.attr("disabled","disabled"),b.saveCollection(d,j,function(a,b){a?window.location.href=b:k.removeAttr("disabled")})}),c.on("click",e.cancelAction,function(){a(this).css("pointerEvents","none")})},b.bindEvents=function(){b.addToCollectionEvent(),b.removeCollectionEvent(),b.removeFromCollectionEvent(),b.clearAllEvent(),b.editFormEvents()},b.storeInHistory=function(b){c.user_id<=0||a.ajax({type:"POST",url:c.ajax_url,dataType:"json",data:{action:"snax_add_to_collection",security:c.nonce,snax_post_id:b,snax_collection:"history"}})},b.init=function(){c=a.parseJSON(snax_collections_js_config),b.bindEvents(),"on"===c.history&&c.post_id>0&&b.storeInHistory(c.post_id)},a(document).ready(function(){b.init()})}(jQuery,snax_collections);; 409/*! Magnific Popup - v1.1.0 - 2016-02-20
410* http://dimsemenov.com/plugins/magnific-popup/ 411* Copyright (c) 2016 Dmitry Semenov; */ 412!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):window.jQuery||window.Zepto)}(function(a){var b,c,d,e,f,g,h="Close",i="BeforeClose",j="AfterClose",k="BeforeAppend",l="MarkupParse",m="Open",n="Change",o="mfp",p="."+o,q="mfp-ready",r="mfp-removing",s="mfp-prevent-close",t=function(){},u=!!window.jQuery,v=a(window),w=function(a,c){b.ev.on(o+a+p,c)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(c,d){b.ev.triggerHandler(o+c,d),b.st.callbacks&&(c=c.charAt(0).toLowerCase()+c.slice(1),b.st.callbacks[c]&&b.st.callbacks[c].apply(b,a.isArray(d)?d:[d]))},z=function(c){return c===g&&b.currTemplate.closeBtn||(b.currTemplate.closeBtn=a(b.st.closeMarkup.replace("%title%",b.st.tClose)),g=c),b.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(b=new t,b.init(),a.magnificPopup.instance=b)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(void 0!==a.transition)return!0;for(;b.length;)if(b.pop()+"Transition"in a)return!0;return!1};t.prototype={constructor:t,init:function(){var c=navigator.appVersion;b.isLowIE=b.isIE8=document.all&&!document.addEventListener,b.isAndroid=/android/gi.test(c),b.isIOS=/iphone|ipad|ipod/gi.test(c),b.supportsTransition=B(),b.probablyMobile=b.isAndroid||b.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),d=a(document),b.popupsCache={}},open:function(c){var e;if(c.isObj===!1){b.items=c.items.toArray(),b.index=0;var g,h=c.items;for(e=0;e<h.length;e++)if(g=h[e],g.parsed&&(g=g.el[0]),g===c.el[0]){b.index=e;break}}else b.items=a.isArray(c.items)?c.items:[c.items],b.index=c.index||0;if(b.isOpen)return void b.updateItemHTML();b.types=[],f="",c.mainEl&&c.mainEl.length?b.ev=c.mainEl.eq(0):b.ev=d,c.key?(b.popupsCache[c.key]||(b.popupsCache[c.key]={}),b.currTemplate=b.popupsCache[c.key]):b.currTemplate={},b.st=a.extend(!0,{},a.magnificPopup.defaults,c),b.fixedContentPos="auto"===b.st.fixedContentPos?!b.probablyMobile:b.st.fixedContentPos,b.st.modal&&(b.st.closeOnContentClick=!1,b.st.closeOnBgClick=!1,b.st.showCloseBtn=!1,b.st.enableEscapeKey=!1),b.bgOverlay||(b.bgOverlay=x("bg").on("click"+p,function(){b.close()}),b.wrap=x("wrap").attr("tabindex",-1).on("click"+p,function(a){b._checkIfClose(a.target)&&b.close()}),b.container=x("container",b.wrap)),b.contentContainer=x("content"),b.st.preloader&&(b.preloader=x("preloader",b.container,b.st.tLoading));var i=a.magnificPopup.modules;for(e=0;e<i.length;e++){var j=i[e];j=j.charAt(0).toUpperCase()+j.slice(1),b["init"+j].call(b)}y("BeforeOpen"),b.st.showCloseBtn&&(b.st.closeBtnInside?(w(l,function(a,b,c,d){c.close_replaceWith=z(d.type)}),f+=" mfp-close-btn-in"):b.wrap.append(z())),b.st.alignTop&&(f+=" mfp-align-top"),b.fixedContentPos?b.wrap.css({overflow:b.st.overflowY,overflowX:"hidden",overflowY:b.st.overflowY}):b.wrap.css({top:v.scrollTop(),position:"absolute"}),(b.st.fixedBgPos===!1||"auto"===b.st.fixedBgPos&&!b.fixedContentPos)&&b.bgOverlay.css({height:d.height(),position:"absolute"}),b.st.enableEscapeKey&&d.on("keyup"+p,function(a){27===a.keyCode&&b.close()}),v.on("resize"+p,function(){b.updateSize()}),b.st.closeOnContentClick||(f+=" mfp-auto-cursor"),f&&b.wrap.addClass(f);var k=b.wH=v.height(),n={};if(b.fixedContentPos&&b._hasScrollBar(k)){var o=b._getScrollbarSize();o&&(n.marginRight=o)}b.fixedContentPos&&(b.isIE7?a("body, html").css("overflow","hidden"):n.overflow="hidden");var r=b.st.mainClass;return b.isIE7&&(r+=" mfp-ie7"),r&&b._addClassToMFP(r),b.updateItemHTML(),y("BuildControls"),a("html").css(n),b.bgOverlay.add(b.wrap).prependTo(b.st.prependTo||a(document.body)),b._lastFocusedEl=document.activeElement,setTimeout(function(){b.content?(b._addClassToMFP(q),b._setFocus()):b.bgOverlay.addClass(q),d.on("focusin"+p,b._onFocusIn)},16),b.isOpen=!0,b.updateSize(k),y(m),c},close:function(){b.isOpen&&(y(i),b.isOpen=!1,b.st.removalDelay&&!b.isLowIE&&b.supportsTransition?(b._addClassToMFP(r),setTimeout(function(){b._close()},b.st.removalDelay)):b._close())},_close:function(){y(h);var c=r+" "+q+" ";if(b.bgOverlay.detach(),b.wrap.detach(),b.container.empty(),b.st.mainClass&&(c+=b.st.mainClass+" "),b._removeClassFromMFP(c),b.fixedContentPos){var e={marginRight:""};b.isIE7?a("body, html").css("overflow",""):e.overflow="",a("html").css(e)}d.off("keyup"+p+" focusin"+p),b.ev.off(p),b.wrap.attr("class","mfp-wrap").removeAttr("style"),b.bgOverlay.attr("class","mfp-bg"),b.container.attr("class","mfp-container"),!b.st.showCloseBtn||b.st.closeBtnInside&&b.currTemplate[b.currItem.type]!==!0||b.currTemplate.closeBtn&&b.currTemplate.closeBtn.detach(),b.st.autoFocusLast&&b._lastFocusedEl&&a(b._lastFocusedEl).focus(),b.currItem=null,b.content=null,b.currTemplate=null,b.prevHeight=0,y(j)}
412,updateSize:function(a){if(b.isIOS){var c=document.documentElement.clientWidth/window.innerWidth,d=window.innerHeight*c;b.wrap.css("height",d),b.wH=d}else b.wH=a||v.height();b.fixedContentPos||b.wrap.css("height",b.wH),y("Resize")},updateItemHTML:function(){var c=b.items[b.index];b.contentContainer.detach(),b.content&&b.content.detach(),c.parsed||(c=b.parseEl(b.index));var d=c.type;if(y("BeforeChange",[b.currItem?b.currItem.type:"",d]),b.currItem=c,!b.currTemplate[d]){var f=b.st[d]?b.st[d].markup:!1;y("FirstMarkupParse",f),f?b.currTemplate[d]=a(f):b.currTemplate[d]=!0}e&&e!==c.type&&b.container.removeClass("mfp-"+e+"-holder");var g=b["get"+d.charAt(0).toUpperCase()+d.slice(1)](c,b.currTemplate[d]);b.appendContent(g,d),c.preloaded=!0,y(n,c),e=c.type,b.container.prepend(b.contentContainer),y("AfterChange")},appendContent:function(a,c){b.content=a,a?b.st.showCloseBtn&&b.st.closeBtnInside&&b.currTemplate[c]===!0?b.content.find(".mfp-close").length||b.content.append(z()):b.content=a:b.content="",y(k),b.container.addClass("mfp-"+c+"-holder"),b.contentContainer.append(b.content)},parseEl:function(c){var d,e=b.items[c];if(e.tagName?e={el:a(e)}:(d=e.type,e={data:e,src:e.src}),e.el){for(var f=b.types,g=0;g<f.length;g++)if(e.el.hasClass("mfp-"+f[g])){d=f[g];break}e.src=e.el.attr("data-mfp-src"),e.src||(e.src=e.el.attr("href"))}return e.type=d||b.st.type||"inline",e.index=c,e.parsed=!0,b.items[c]=e,y("ElementParse",e),b.items[c]},addGroup:function(a,c){var d=function(d){d.mfpEl=this,b._openClick(d,a,c)};c||(c={});var e="click.magnificPopup";c.mainEl=a,c.items?(c.isObj=!0,a.off(e).on(e,d)):(c.isObj=!1,c.delegate?a.off(e).on(e,c.delegate,d):(c.items=a,a.off(e).on(e,d)))},_openClick:function(c,d,e){var f=void 0!==e.midClick?e.midClick:a.magnificPopup.defaults.midClick;if(f||!(2===c.which||c.ctrlKey||c.metaKey||c.altKey||c.shiftKey)){var g=void 0!==e.disableOn?e.disableOn:a.magnificPopup.defaults.disableOn;if(g)if(a.isFunction(g)){if(!g.call(b))return!0}else if(v.width()<g)return!0;c.type&&(c.preventDefault(),b.isOpen&&c.stopPropagation()),e.el=a(c.mfpEl),e.delegate&&(e.items=d.find(e.delegate)),b.open(e)}},updateStatus:function(a,d){if(b.preloader){c!==a&&b.container.removeClass("mfp-s-"+c),d||"loading"!==a||(d=b.st.tLoading);var e={status:a,text:d};y("UpdateStatus",e),a=e.status,d=e.text,b.preloader.html(d),b.preloader.find("a").on("click",function(a){a.stopImmediatePropagation()}),b.container.addClass("mfp-s-"+a),c=a}},_checkIfClose:function(c){if(!a(c).hasClass(s)){var d=b.st.closeOnContentClick,e=b.st.closeOnBgClick;if(d&&e)return!0;if(!b.content||a(c).hasClass("mfp-close")||b.preloader&&c===b.preloader[0])return!0;if(c===b.content[0]||a.contains(b.content[0],c)){if(d)return!0}else if(e&&a.contains(document,c))return!0;return!1}},_addClassToMFP:function(a){b.bgOverlay.addClass(a),b.wrap.addClass(a)},_removeClassFromMFP:function(a){this.bgOverlay.removeClass(a),b.wrap.removeClass(a)},_hasScrollBar:function(a){return(b.isIE7?d.height():document.body.scrollHeight)>(a||v.height())},_setFocus:function(){(b.st.focus?b.content.find(b.st.focus).eq(0):b.wrap).focus()},_onFocusIn:function(c){return c.target===b.wrap[0]||a.contains(b.wrap[0],c.target)?void 0:(b._setFocus(),!1)},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(l,[b,c,d]),a.each(c,function(c,d){if(void 0===d||d===!1)return!0;if(e=c.split("_"),e.length>1){var f=b.find(p+"-"+e[0]);if(f.length>0){var g=e[1];"replaceWith"===g?f[0]!==d[0]&&f.replaceWith(d):"img"===g?f.is("img")?f.attr("src",d):f.replaceWith(a("<img>").attr("src",d).attr("class",f.attr("class"))):f.attr(e[1],d)}}else b.find(p+"-"+c).html(d)})},_getScrollbarSize:function(){if(void 0===b.scrollbarSize){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),b.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return b.scrollbarSize}},a.magnificPopup={instance:null,proto:t.prototype,modules:[],open:function(b,c){return A(),b=b?a.extend(!0,{},b):{},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'<button title="%title%" type="button" class="mfp-close">×</button>',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1
412));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("<div>");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I="ajax",J=function(){H&&a(document.body).removeClass(H)},K=function(){J(),b.req&&b.req.abort()};a.magnificPopup.registerModule(I,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'<a href="%url%">The content</a> could not be loaded.'},proto:{initAjax:function(){b.types.push(I),H=b.st.ajax.cursor,w(h+"."+I,K),w("BeforeChange."+I,K)},getAjax:function(c){H&&a(document.body).addClass(H),b.updateStatus("loading");var d=a.extend({url:c.src,success:function(d,e,f){var g={data:d,xhr:f};y("ParseAjax",g),b.appendContent(a(g.data),I),c.finished=!0,J(),b._setFocus(),setTimeout(function(){b.wrap.addClass(q)},16),b.updateStatus("ready"),y("AjaxContentAdded")},error:function(){J(),c.finished=c.loadError=!0,b.updateStatus("error",b.st.ajax.tError.replace("%url%",c.src))}},b.st.ajax.settings);return b.req=a.ajax(d),""}}});var L,M=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;
412var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'<div class="mfp-figure"><div class="mfp-close"></div><figure><div class="mfp-img"></div><figcaption><div class="mfp-bottom-bar"><div class="mfp-title"></div><div class="mfp-counter"></div></div></figcaption></figure></div>',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'<a href="%url%">The image</a> could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,L&&clearInterval(L),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){L&&clearInterval(L),L=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(L),c++,void(3===c?e(10):40===c?e(50):100===c&&e(500)))},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:M(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(L&&clearInterval(L),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var N,O=function(){return void 0===N&&(N=void 0!==document.createElement("p").style.MozTransform),N};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return O()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});
412var P="iframe",Q="//about:blank",R=function(a){if(b.currTemplate[P]){var c=b.currTemplate[P].find("iframe");c.length&&(a||(c[0].src=Q),b.isIE8&&c.css("display",a?"block":"none"))}};a.magnificPopup.registerModule(P,{options:{markup:'<div class="mfp-iframe-scaler"><div class="mfp-close"></div><iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe></div>',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){b.types.push(P),w("BeforeChange",function(a,b,c){b!==c&&(b===P?R():c===P&&R(!0))}),w(h+"."+P,function(){R()})},getIframe:function(c,d){var e=c.src,f=b.st.iframe;a.each(f.patterns,function(){return e.indexOf(this.index)>-1?(this.id&&(e="string"==typeof this.id?e.substr(e.lastIndexOf(this.id)+this.id.length,e.length):this.id.call(this,e)),e=this.src.replace("%id%",e),!1):void 0});var g={};return f.srcAction&&(g[f.srcAction]=e),b._parseMarkup(d,g,c),b.updateStatus("ready"),d}}});var S=function(a){var c=b.items.length;return a>c-1?a-c:0>a?c+a:a},T=function(a,b,c){return a.replace(/%curr%/gi,b+1).replace(/%total%/gi,c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=b.st.gallery,e=".mfp-gallery";return b.direction=!0,c&&c.enabled?(f+=" mfp-gallery",w(m+e,function(){c.navigateByImgClick&&b.wrap.on("click"+e,".mfp-img",function(){return b.items.length>1?(b.next(),!1):void 0}),d.on("keydown"+e,function(a){37===a.keyCode?b.prev():39===a.keyCode&&b.next()})}),w("UpdateStatus"+e,function(a,c){c.text&&(c.text=T(c.text,b.currItem.index,b.items.length))}),w(l+e,function(a,d,e,f){var g=b.items.length;e.counter=g>1?T(c.tCounter,f.index,g):""}),w("BuildControls"+e,function(){if(b.items.length>1&&c.arrows&&!b.arrowLeft){var d=c.arrowMarkup,e=b.arrowLeft=a(d.replace(/%title%/gi,c.tPrev).replace(/%dir%/gi,"left")).addClass(s),f=b.arrowRight=a(d.replace(/%title%/gi,c.tNext).replace(/%dir%/gi,"right")).addClass(s);e.click(function(){b.prev()}),f.click(function(){b.next()}),b.container.append(e.add(f))}}),w(n+e,function(){b._preloadTimeout&&clearTimeout(b._preloadTimeout),b._preloadTimeout=setTimeout(function(){b.preloadNearbyImages(),b._preloadTimeout=null},16)}),void w(h+e,function(){d.off(e),b.wrap.off("click"+e),b.arrowRight=b.arrowLeft=null})):!1},next:function(){b.direction=!0,b.index=S(b.index+1),b.updateItemHTML()},prev:function(){b.direction=!1,b.index=S(b.index-1),b.updateItemHTML()},goTo:function(a){b.direction=a>=b.index,b.index=a,b.updateItemHTML()},preloadNearbyImages:function(){var a,c=b.st.gallery.preload,d=Math.min(c[0],b.items.length),e=Math.min(c[1],b.items.length);for(a=1;a<=(b.direction?e:d);a++)b._preloadItem(b.index+a);for(a=1;a<=(b.direction?d:e);a++)b._preloadItem(b.index-a)},_preloadItem:function(c){if(c=S(c),!b.items[c].preloaded){var d=b.items[c];d.parsed||(d=b.parseEl(c)),y("LazyLoad",d),"image"===d.type&&(d.img=a('<img class="mfp-img" />').on("load.mfploader",function(){d.hasSize=!0}).on("error.mfploader",function(){d.hasSize=!0,d.loadError=!0,y("LazyLoadError",d)}).attr("src",d.src)),d.preloaded=!0}}}});var U="retina";a.magnificPopup.registerModule(U,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+U,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+U,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),A()});; 413/** 414 * Timeago is a jQuery plugin that makes it easy to support automatically 415 * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). 416 * 417 * @name timeago 418 * @version 1.5.2 419 * @requires jQuery v1.2.3+ 420 * @author Ryan McGeary 421 * @license MIT License - http://www.opensource.org/licenses/mit-license.php 422 * 423 * For usage and examples, visit: 424 * http://timeago.yarp.com/ 425 * 426 * Copyright (c) 2008-2015, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org) 427 */ 428 429(function (factory) { 430 if (typeof define === 'function' && define.amd) { 431 // AMD. Register as an anonymous module. 432 define(['jquery'], factory); 433 } else if (typeof module === 'object' && typeof module.exports === 'object') { 434 factory(require('jquery')); 435 } else { 436 // Browser globals 437 factory(jQuery); 438 } 439}(function ($) { 440 $.timeago = function(timestamp) { 441 if (timestamp instanceof Date) { 442 return inWords(timestamp); 443 } else if (typeof timestamp === "string") {
vendor: 4,288 bytes, lines 444-565
444 return inWords($.timeago.parse(timestamp)); 445 } else if (typeof timestamp === "number") { 446 return inWords(new Date(timestamp)); 447 } else { 448 return inWords($.timeago.datetime(timestamp)); 449 } 450 }; 451 var $t = $.timeago; 452 453 $.extend($.timeago, { 454 settings: { 455 refreshMillis: 60000, 456 allowPast: true, 457 allowFuture: false, 458 localeTitle: false, 459 cutoff: 0, 460 autoDispose: true, 461 strings: { 462 prefixAgo: null, 463 prefixFromNow: null, 464 suffixAgo: "ago", 465 suffixFromNow: "from now", 466 inPast: 'any moment now', 467 seconds: "less than a minute", 468 minute: "about a minute", 469 minutes: "%d minutes", 470 hour: "about an hour", 471 hours: "about %d hours", 472 day: "a day", 473 days: "%d days", 474 month: "about a month", 475 months: "%d months", 476 year: "about a year", 477 years: "%d years", 478 wordSeparator: " ", 479 numbers: [] 480 } 481 }, 482 483 inWords: function(distanceMillis) { 484 if (!this.settings.allowPast && ! this.settings.allowFuture) { 485 throw 'timeago allowPast and allowFuture settings can not both be set to false.'; 486 } 487 488 var $l = this.settings.strings; 489 var prefix = $l.prefixAgo; 490 var suffix = $l.suffixAgo; 491 if (this.settings.allowFuture) { 492 if (distanceMillis < 0) { 493 prefix = $l.prefixFromNow; 494 suffix = $l.suffixFromNow; 495 } 496 } 497 498 if (!this.settings.allowPast && distanceMillis >= 0) { 499 return this.settings.strings.inPast; 500 } 501 502 var seconds = Math.abs(distanceMillis) / 1000; 503 var minutes = seconds / 60; 504 var hours = minutes / 60; 505 var days = hours / 24; 506 var years = days / 365; 507 508 function substitute(stringOrFunction, number) { 509 var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; 510 var value = ($l.numbers && $l.numbers[number]) || number; 511 return string.replace(/%d/i, value); 512 } 513 514 var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || 515 seconds < 90 && substitute($l.minute, 1) || 516 minutes < 45 && substitute($l.minutes, Math.round(minutes)) || 517 minutes < 90 && substitute($l.hour, 1) || 518 hours < 24 && substitute($l.hours, Math.round(hours)) || 519 hours < 42 && substitute($l.day, 1) || 520 days < 30 && substitute($l.days, Math.round(days)) || 521 days < 45 && substitute($l.month, 1) || 522 days < 365 && substitute($l.months, Math.round(days / 30)) || 523 years < 1.5 && substitute($l.year, 1) || 524 substitute($l.years, Math.round(years)); 525 526 var separator = $l.wordSeparator || ""; 527 if ($l.wordSeparator === undefined) { separator = " "; } 528 return $.trim([prefix, words, suffix].join(separator)); 529 }, 530 531 parse: function(iso8601) { 532 var s = $.trim(iso8601); 533 s = s.replace(/\.\d+/,""); // remove milliseconds 534 s = s.replace(/-/,"/").replace(/-/,"/"); 535 s = s.replace(/T/," ").replace(/Z/," UTC"); 536 s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400 537 s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900 538 return new Date(s); 539 }, 540 datetime: function(elem) { 541 var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title"); 542 return $t.parse(iso8601); 543 }, 544 isTime: function(elem) { 545 // jQuery's `is()` doesn't play well with HTML5 in IE 546 return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); 547 } 548 }); 549 550 // functions that can be called via $(el).timeago('action') 551 // init is default when no action is given 552 // functions are called with context of a single element 553 var functions = { 554 init: function() { 555 var refresh_el = $.proxy(refresh, this); 556 refresh_el(); 557 var $s = $t.settings; 558 if ($s.refreshMillis > 0) { 559 this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis); 560 } 561 }, 562 update: function(timestamp) { 563 var date = (timestamp instanceof Date) ? timestamp : $t.parse(timestamp); 564 $(this).data('timeago', { datetime: date }); 565 if ($t.settings.localeTitle) $(this).attr("title", date.toLocaleStr
565ing()); 566 refresh.apply(this); 567 }, 568 updateFromDOM: function() { 569 $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) }); 570 refresh.apply(this); 571 }, 572 dispose: function () { 573 if (this._timeagoInterval) { 574 window.clearInterval(this._timeagoInterval); 575 this._timeagoInterval = null; 576 } 577 } 578 }; 579 580 $.fn.timeago = function(action, options) { 581 var fn = action ? functions[action] : functions.init; 582 if (!fn) { 583 throw new Error("Unknown function name '"+ action +"' for timeago"); 584 } 585 // each over objects here and call the requested function 586 this.each(function() { 587 fn.call(this, options); 588 }); 589 return this; 590 }; 591 592 function refresh() { 593 var $s = $t.settings; 594 595 //check if it's still visible 596 if ($s.autoDispose && !$.contains(document.documentElement,this)) { 597 //stop if it has been removed 598 $(this).timeago("dispose"); 599 return this; 600 } 601 602 var data = prepareData(this); 603 604 if (!isNaN(data.datetime)) { 605 if ( $s.cutoff == 0 || Math.abs(distance(data.datetime)) < $s.cutoff) { 606 $(this).text(inWords(data.datetime)); 607 } 608 } 609 return this; 610 } 611 612 function prepareData(element) { 613 element = $(element); 614 if (!element.data("timeago")) { 615 element.data("timeago", { datetime: $t.datetime(element) }); 616 var text = $.trim(element.text()); 617 if ($t.settings.localeTitle) { 618 element.attr("title", element.data('timeago').datetime.toLocaleString()); 619 } else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) { 620 element.attr("title", text); 621 } 622 } 623 return element.data("timeago"); 624 } 625 626 function inWords(date) { 627 return $t.inWords(distance(date)); 628 } 629 630 function distance(date) { 631 return (new Date().getTime() - date.getTime()); 632 } 633 634 // fix for IE6 suckage 635 document.createElement("abbr"); 636 document.createElement("time"); 637}));; 638// English (Template) 639jQuery.timeago.settings.strings = { 640 prefixAgo: null, 641 prefixFromNow: null, 642 suffixAgo: "ago", 643 suffixFromNow: "from now", 644 seconds: "less than a minute", 645 minute: "about a minute", 646 minutes: "%d minutes", 647 hour: "about an hour", 648 hours: "about %d hours", 649 day: "a day", 650 days: "%d days", 651 month: "about a month", 652 months: "%d months", 653 year: "about a year", 654 years: "%d years", 655 wordSeparator: " ", 656 numbers: [] 657}; 658; 659/* global document */ 660/* global jQuery */ 661/* global snax */ 662/* global alert */ 663/* global confirm */ 664/* global console */ 665/* global grecaptcha */ 666 667// globa namespace 668if ( typeof window.snax === 'undefined' ) { 669 window.snax = {}; 670} 671 672/******** 673 * 674 * Core 675 * 676 *******/ 677 678(function ($, ctx) { 679 680 'use strict'; 681 682 /** VARS *************************/ 683 684 ctx.config = $.parseJSON(window.snax_front_config); 685 686 if (!ctx.config) { 687 throw 'Snax Error: Global config is not defined!'; 688 } 689 690 /** FUNCTIONS ********************/ 691 692 ctx.log = function(msg) { 693 if (typeof console !== 'undefined') { 694 console.log(msg); 695 } 696 }; 697 698 ctx.inDebugMode = function() { 699 return (typeof ctx.config.debug_mode !== 'undefined' && ctx.config.debug_mode); 700 }; 701 702 ctx.isTouchDevice = function () { 703 return ('ontouchstart' in window) || navigator.msMaxTouchPoints; 704 }; 705 706 ctx.createCookie = function (name, value, hours) { 707 var expires; 708 709 if (hours) { 710 var date = new Date(); 711 date.setTime(date.getTime() + (hours * 60 * 60 * 1000)); 712 expires = '; expires=' + date.toUTCString(); 713 } 714 else { 715 expires = ''; 716 } 717 718 document.cookie = name.concat('=', value, expires, '; path=/'); 719 }; 720 721 ctx.readCookie = function (name) { 722 var nameEQ = name + '='; 723 var ca = document.cookie.split(';'); 724 725 for(var i = 0; i < ca.length; i += 1) { 726 var c = ca[i]; 727 while (c.charAt(0) === ' ') { 728 c = c.substring(1,c.length); 729 } 730 731 if (c.indexOf(nameEQ) === 0) { 732 return c.substring(nameEQ.length,c.length); 733 } 734 } 735 736 return null; 737 }; 738 739 ctx.deleteCookie = function (name) { 740 ctx.createCookie(name, '', -1); 741 }; 742 743 ctx.getUrlParameter = function (param) { 744 var sPageURL = decodeURIComponent(window.location.search.substring(1)), 745 sURLVariables = sPageURL.split('&'), 746 sParameterName, 747 i; 748 749 for (i = 0; i < sURLVariables.length; i++) { 750 sParameterName = sURLVariables[i].split('='); 751 752 if (sParameterName[0] === param) { 753 return sParameterName[1] === undefined ? true : sParameterName[1]; 754 } 755 } 756}; 757 758})(jQuery, snax); 759 760 761/*********** 762 * 763 * Helpers 764 * 765 ***********/ 766 767(function ($, ctx) { 768 769 /* Media Item Class (image, audio, video) */ 770 771 ctx.MediaItem = function (data) { 772 // Public scope. 773 var instance = {}; 774 775 // Constructor.
776 function init() { 777 data = data || {}; 778 779 data = $.extend({ 780 'type': 'image', 781 'title': '', 782 'source': '', 783 'refLink': '', 784 'description': '', 785 'mediaId': '', 786 'postId': 0, 787 'authorId': '', 788 'status': '', 789 'parentFormat': 'list', 790 'origin': 'post', 791 'legal': false, 792 'memeTemplate': '' 793 }, data); 794 795 return instance; 796 } 797 798 instance.save = function(callback) { 799 callback = callback || function() {}; 800 801 var ajaxData = { 802 'action': 'snax_add_media_item', 803 'security': $('input[name=snax-add-media-item-nonce]').val(), 804 'snax_title': data.title, 805 'snax_source': data.source, 806 'snax_ref_link': data.refLink, 807 'snax_description': data.description, 808 'snax_media_id': data.mediaId, 809 'snax_post_id': data.postId, 810 'snax_author_id': data.authorId, 811 'snax_status': data.status, 812 'snax_parent_format': data.parentFormat, 813 'snax_origin': data.origin, 814 'snax_legal': data.legal ? 'accepted' : '', 815 'snax_type': data.type, 816 'snax_meme_template': data.memeTemplate 817 }; 818 819 if (typeof ctx.saveItemImageDataFilter === 'function') { 820 ajaxData = ctx.saveItemImageDataFilter(ajaxData, data); 821 } 822 823 var xhr = $.ajax({ 824 'type': 'POST', 825 'url': ctx.config.ajax_url, 826 'dataType': 'json', 827 'data': ajaxData 828 }); 829 830 xhr.done(function (res) { 831 callback(res); 832 }); 833 }; 834 835 return init(); 836 }; 837 838 /* Embed Item Class */ 839 840 ctx.EmbedItem = function (data) { 841 // Public scope. 842 var instance = {}; 843 844 // Constructor. 845 function init() { 846 data = data || {}; 847 848 data = $.extend({ 849 'type': 'embed', 850 'title': '', 851 'source': '', 852 'refLink': '', 853 'description': '', 854 'embedCode': '', 855 'postId': 0, 856 'authorId': '', 857 'status': '', 858 'parentFormat': 'list', 859 'origin': 'post', 860 'legal': false 861 }, data); 862 863 return instance; 864 } 865 866 instance.save = function(callback) { 867 callback = callback || function() {}; 868 869 var ajaxData = { 870 'action': 'snax_add_embed_item', 871 'security': $('input[name=snax-add-embed-item-nonce]').val(), 872 'snax_title': data.title, 873 'snax_source': data.source, 874 'snax_ref_link': data.refLink, 875 'snax_embed_code': data.embedCode, 876 'snax_description': data.description, 877 'snax_post_id': data.postId, 878 'snax_author_id': data.authorId, 879 'snax_status': data.status, 880 'snax_parent_format': data.parentFormat, 881 'snax_origin': data.origin, 882 'snax_legal': data.legal ? 'accepted' : '' 883 }; 884 885 if (typeof ctx.saveItemEmbedDataFilter === 'function') { 886 ajaxData = ctx.saveItemEmbedDataFilter(ajaxData, data); 887 } 888 889 var xhr = $.ajax({ 890 'type': 'POST', 891 'url': ctx.config.ajax_url, 892 'dataType': 'json', 893 'data': ajaxData 894 }); 895 896 xhr.done(function (res) { 897 callback(res); 898 }); 899 }; 900 901 return init(); 902 }; 903 904 /* Embed Item Class */ 905 906 ctx.TextItem = function (data) { 907 // Public scope. 908 var instance = {}; 909 910 // Constructor.
911 function init() { 912 data = data || {}; 913 914 data = $.extend({ 915 'type': 'text', 916 'title': '', 917 'refLink': '', 918 'description': '', 919 'postId': 0, 920 'authorId': '', 921 'status': '', 922 'parentFormat': 'list', 923 'origin': 'post', 924 'legal': false 925 }, data); 926 927 return instance; 928 } 929 930 instance.save = function(callback) { 931 callback = callback || function() {}; 932 933 var ajaxData = { 934 'action': 'snax_add_text_item', 935 'security': $('input[name=snax-add-text-item-nonce]').val(), 936 'snax_title': data.title, 937 'snax_ref_link': data.refLink, 938 'snax_description': data.description, 939 'snax_post_id': data.postId, 940 'snax_author_id': data.authorId, 941 'snax_status': data.status, 942 'snax_parent_format': data.parentFormat, 943 'snax_origin': data.origin, 944 'snax_legal': data.legal ? 'accepted' : '' 945 }; 946 947 if (typeof ctx.saveItemTextDataFilter === 'function') { 948 ajaxData = ctx.saveItemTextDataFilter(ajaxData, data); 949 } 950 951 var xhr = $.ajax({ 952 'type': 'POST', 953 'url': ctx.config.ajax_url, 954 'dataType': 'json', 955 'data': ajaxData 956 }); 957 958 xhr.done(function (res) { 959 callback(res); 960 }); 961 }; 962 963 return init(); 964 }; 965 966 ctx.deleteItem = function($link, callback) { 967 callback = callback || function() {}; 968 969 var nonce = $.trim($link.attr('data-snax-nonce')); 970 var itemId = parseInt($link.attr('data-snax-item-id'), 10); 971 var userId = snax.currentUserId; 972 973 var xhr = $.ajax({ 974 'type': 'POST', 975 'url': ctx.config.ajax_url, 976 'dataType': 'json', 977 'data': { 978 'action': 'snax_delete_item', 979 'security': nonce, 980 'snax_item_id': itemId, 981 'snax_user_id': userId 982 } 983 }); 984 985 xhr.done(function (res) { 986 callback(res); 987 }); 988 }; 989 990 ctx.setItemAsFeatured = function($link, callback) { 991 callback = callback || function() {}; 992 993 var nonce = $.trim($link.attr('data-snax-nonce')); 994 var itemId = parseInt($link.attr('data-snax-item-id'), 10); 995 var userId = snax.currentUserId; 996 997 var xhr = $.ajax({ 998 'type': 'POST', 999 'url': ctx.config.ajax_url, 1000 'dataType': 'json', 1001 'data': { 1002 'action': 'snax_set_item_as_featured', 1003 'security': nonce, 1004 'snax_item_id': itemId, 1005 'snax_user_id': userId 1006 } 1007 }); 1008 1009 xhr.done(function (res) { 1010 callback(res); 1011 }); 1012 }; 1013 1014 ctx.updateItems = function(items, callback) { 1015 callback = callback || function() {}; 1016 1017 var xhr = $.ajax({ 1018 'type': 'POST', 1019 'url': ctx.config.ajax_url, 1020 'dataType': 'json', 1021 'data': { 1022 'action': 'snax_update_items', 1023 'security': $('input[name=snax-frontend-submission-nonce]').val(), 1024 'snax_items': items 1025 } 1026 }); 1027 1028 xhr.done(function (res) { 1029 callback(res); 1030 }); 1031 }; 1032 1033 ctx.deletePost = function($link, callback) { 1034 callback = callback || function() {}; 1035 1036 var nonce = $.trim($link.attr('data-snax-nonce')); 1037 var postId = parseInt($link.attr('data-snax-post-id'), 10); 1038 1039 var xhr = $.ajax({ 1040 'type': 'POST', 1041 'url': ctx.config.ajax_url, 1042 'dataType': 'json', 1043 'data': { 1044 'action': 'snax_delete_post', 1045 'security': nonce, 1046 'snax_post_id': postId 1047 } 1048 }); 1049 1050 xhr.done(function (res) { 1051 callback(res); 1052 }); 1053 }; 1054 1055 ctx.loginRequired = function(blocked) { 1056 $('body').trigger('snaxLoginRequired', [blocked]); 1057 }; 1058 1059 ctx.getMediaHtmlTag = function(data, callback) { 1060 var xhr = $.ajax({ 1061 'type': 'GET', 1062 'url': ctx.config.ajax_url, 1063 'dataType': 'json', 1064 'data': { 1065 'action': 'snax_load_media_tpl', 1066 'snax_media_id': data.mediaId, 1067 'snax_post_id': data.postId, 1068 'snax_type': data.type 1069 } 1070 }); 1071 1072 xhr.done(function (res) { 1073 callback(res); 1074 }); 1075 }; 1076 1077 ctx.deleteMedia = function(data, callback) { 1078 callback = callback || function() {}; 1079 1080 var xhr = $.ajax({ 1081 'type': 'POST', 1082 'url': ctx.config.ajax_url, 1083 'dataType': 'json', 1084 'data': { 1085 'action': 'snax_delete_media', 1086 'security': $('input[name=snax-delete-media-nonce]').val(), 1087 'snax_media_id': data.mediaId, 1088 'snax_author_id': data.authorId 1089 } 1090 }); 1091 1092 xhr.done(function (res) { 1093 callback(res); 1094 }); 1095 }; 1096 1097 ctx.updateMediaMetadata = function(data, callback) { 1098 callback = callback || function() {}; 1099 1100 var xhr = $.ajax({ 1101 'type': 'POST', 1102 'url': ctx.config.ajax_url, 1103 'dataType': 'json', 1104 'data': { 1105 'action': 'snax_update_media_meta', 1106 // @todo - use separate nonce or use generic one. 1107 'security': $('input[name=snax-delete-media-nonce]').val(), 1108 'snax_media_id': data.mediaId, 1109 'snax_parent_format': data.parentFormat 1110 } 1111 }); 1112 1113 xhr.done(function (res) { 1114 callback(res); 1115 }); 1116 }; 1117 1118 ctx.getEmbedPreview = function(embed_code, callback) { 1119 var xhr = $.ajax({ 1120 'type': 'POST', 1121 'url': ctx.config.ajax_url, 1122 'dataType': 'json', 1123 'data': { 1124 'action': 'snax_load_embed_tpl', 1125 'snax_embed_code': embed_code 1126 } 1127 }); 1128 1129 xhr.done(function (res) { 1130 callback(res); 1131 }); 1132 }; 1133 1134 ctx.displayFeedback = function(type) { 1135 var feedbackTypeClass = 'snax-feedback-' + type; 1136 1137 // Try to get type specific feedback first. 1138 var $feedback = $('.' + feedbackTypeClass); 1139 1140 if ($feedback.length === 0) { 1141 return; 1142 } 1143 1144 ctx.hideFeedback(); 1145 1146 // Activate. 1147 $feedback.toggleClass('snax-feedback-off snax-feedback-on'); 1148 1149 // Show. 1150 $('body').addClass('snax-show-feedback'); 1151 }; 1152 1153 ctx.hideFeedback = function() { 1154 // Deactivate all. 1155 $('.snax-feedback-on').toggleClass('snax-feedback-on snax-feedback-off'); 1156 1157 // Hide all. 1158 $('body').removeClass('snax-show-feedback'); 1159 }; 1160 1161 ctx.isValidUrl = function(url) { 1162 return url.match(/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;
1162:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/); 1163 }; 1164 1165})(jQuery, snax); 1166 1167 1168/********* 1169 * 1170 * Common 1171 * 1172 *********/ 1173 1174(function ($, ctx) { 1175 1176 'use strict'; 1177 1178 var selectors = { 1179 'feedbackCloseButton': '.snax-close-button' 1180 }; 1181 1182 // fire 1183 $(document).ready(function () { 1184 1185 /* 1186 * Close feedback button. 1187 */ 1188 $(selectors.feedbackCloseButton).on('click', function(e) { 1189 e.preventDefault(); 1190 1191 snax.hideFeedback(); 1192 }); 1193 }); 1194 1195})(jQuery, snax); 1196 1197 1198/**************** 1199 * 1200 * Facebook SDK 1201 * 1202 ****************/ 1203 1204(function ($, ctx) { 1205 1206 'use strict'; 1207 1208 ctx.resetFacebookSDK = function () { 1209 $('script#facebook-jssdk').remove(); 1210 $('#fb-root').remove(); 1211 if (window.FB) { 1212 delete window.FB; 1213 } 1214 }; 1215 1216 $('body').on( 'snaxBeforeNewContentReady', function ( e, $newContent ) { 1217 if ($newContent.find('.fb-video')) { 1218 ctx.resetFacebookSDK(); 1219 } 1220 } ); 1221 1222})(jQuery, snax); 1223 1224/**************************** 1225 * 1226 * Module: Media upload form 1227 * 1228 ***************************/ 1229 1230(function ($, ctx) { 1231 1232 'use strict'; 1233 1234 var selectors = { 1235 'form': '.snax-media-upload-form', 1236 'pluploadForm': '.snax-plupload-upload-ui', 1237 'loadFormButton': '.snax-load-form-button' 1238 }; 1239 1240 ctx.mediaUploadForm = function () { 1241 if (typeof snaxPlupload === 'undefined') { 1242 return; 1243 } 1244 1245 $(selectors.form).each(function() { 1246 var $form = $(this); 1247 1248 var formInsideInactiveTab = $form.parents('.snax-tab-content:not(.snax-tab-content-current)').length > 0; 1249 1250 if (!formInsideInactiveTab) { 1251 snaxPlupload.initUploader($form); 1252 } 1253 }); 1254 1255 $('body').on('snaxTabContentActive', function (e, $tabContent) { 1256 $tabContent.find(selectors.form).each(function () { 1257 snaxPlupload.initUploader($(this)); 1258 }); 1259 } ); 1260 1261 $(selectors.loadFormButton).on('click',function() { 1262 var $link = $(this); 1263 var $form = $link.parents(selectors.form); 1264 var formClass = $link.attr('data-snax-rel-class'); 1265 1266 $form.find('.' + formClass).toggle(); 1267 1268 var $pluploadForm = $form.find(selectors.pluploadForm); 1269 1270 $pluploadForm.toggle(); 1271 1272 if ($pluploadForm.is(':visible')) { 1273 $form.removeClass('snax-custom-form'); 1274 } else { 1275 $form.addClass('snax-custom-form'); 1276 } 1277 }); 1278 }; 1279 1280 // fire 1281 $(document).ready(function () { 1282 ctx.mediaUploadForm(); 1283 }); 1284 1285})(jQuery, snax); 1286 1287 1288/************************* 1289 * 1290 * Module: Date > Time ago 1291 * 1292 *************************/ 1293 1294(function ($, ctx) { 1295 1296 'use strict'; 1297 1298 var selectors = { 1299 'wrapper': '.snax-time-left', 1300 'dateWrapper': '> .snax-date-wrapper', 1301 'date': '> .snax-date', 1302 'timeWrapper': '> .snax-time-wrapper', 1303 'time': '> .snax-time' 1304 }; 1305 1306 ctx.timeagoSelectors = selectors; 1307 1308 ctx.dateConstans = { 1309 'day_ms': 1000 * 60 * 60 * 24, 1310 'month_ms': 1000 * 60 * 60 * 24 * 30, 1311 'year_ms': 1000 * 60 * 60 * 24 * 356 1312 }; 1313 1314 ctx.dateToTimeago = function () { 1315 if (!$.fn.timeago) { 1316 return; 1317 } 1318 1319 // store current settings, thanks to $.extend we have a copy without reference to original object 1320 var origSettings = $.extend(true, {} , $.timeago.settings); 1321 1322 // override 1323 $.extend($.timeago.settings, { 1324 cutoff: ctx.dateConstans.year_ms, 1325 allowFuture: true 1326 }); 1327 1328 $.extend($.timeago.settings.strings, { 1329 suffixFromNow: '' 1330 }); 1331 1332 // apply 1333 $(selectors.wrapper).each(function () { 1334 var $wrapper = $(this); 1335 var $dateWrapper = $wrapper.find(selectors.dateWrapper); 1336 var $date = $dateWrapper.find(selectors.date); 1337 var $timeWrapper = $wrapper.find(selectors.timeWrapper); 1338 var $time = $timeWrapper.find(selectors.time); 1339 1340 var timeLeftText = $.timeago($date.text()); 1341 1342 $time.text(timeLeftText); 1343 1344 $dateWrapper.removeClass( '.snax-date-wrapper-unfriendly' ); 1345 $timeWrapper.removeClass( 'snax-time-wrapper-unfriendly' ); 1346 }); 1347 1348 // restore 1349 $.timeago.settings = origSettings; 1350 }; 1351 1352 // fire 1353 $(document).ready(function () { 1354 ctx.dateToTimeago(); 1355 }); 1356 1357})(jQuery, snax); 1358 1359 1360/************************** 1361 * 1362 * Module: Upvote/Downvote 1363 * 1364 *************************/ 1365 1366(function ($, ctx) { 1367 1368 'use strict'; 1369 1370 var locked = false;
1371 1372 var selectors = { 1373 'wrapper': '.snax-voting', 1374 'upvoteLink': '.snax-voting-upvote', 1375 'downvoteLink': '.snax-voting-downvote', 1376 'guestVoting': '.snax-guest-voting', 1377 'voted': '.snax-user-voted', 1378 'scoreWrapper': '.snax-voting-score', 1379 'scoreValue': '.snax-voting-score strong' 1380 }; 1381 1382 var classes = { 1383 'voted': 'snax-user-voted' 1384 }; 1385 1386 ctx.votesSelectors = selectors; 1387 ctx.votesClasses = classes; 1388 1389 ctx.votes = function () { 1390 // Catch event on wrapper to keep it working after box content reloading 1391 $('body').on('click', selectors.upvoteLink + ', ' + selectors.downvoteLink, function (e) { 1392 e.preventDefault(); 1393 1394 if (locked) { 1395 return; 1396 } 1397 1398 locked = true; 1399 1400 var $link = $(this); 1401 1402 var voteType = $link.is(selectors.upvoteLink) ? 'upvote' : 'downvote'; 1403 var $wrapper = $link.parents(selectors.wrapper); 1404 var nonce = $.trim($link.attr('data-snax-nonce')); 1405 var itemId = parseInt($link.attr('data-snax-item-id'), 10); 1406 var authorId = parseInt($link.attr('data-snax-author-id'), 10); 1407 1408 ctx.vote({ 1409 'itemId': itemId, 1410 'authorId': authorId, 1411 'type': voteType 1412 }, nonce, $wrapper); 1413 }); 1414 1415 // Iterate over all voting boxes and update them based on cookie states. 1416 $(selectors.wrapper).each(function () { 1417 var $this = $(this); 1418 var id = parseInt($this.attr('data-snax-item-id'), 10); 1419 1420 if (id <= 0) { 1421 return; 1422 } 1423 1424 var typeCookie = 'snax_vote_type_' + id; 1425 var scoreCookie = 'snax_vote_score_' + id; 1426 1427 var type = ctx.readCookie(typeCookie); 1428 var score = ctx.readCookie(scoreCookie); 1429 1430 1431 if (!type && !score) { 1432 return; 1433 } 1434 1435 if (score) { 1436 ctx.updateVoteScore($this.find(selectors.scoreWrapper), score); 1437 } 1438 1439 if (type) { 1440 var $upVoteLink = $this.find(selectors.upvoteLink); 1441 var $downVoteLink = $this.find(selectors.downvoteLink); 1442 1443 if ('upvote' === type) {
1444 $upVoteLink.addClass(classes.voted); 1445 $downVoteLink.removeClass(classes.voted); 1446 } else { 1447 $downVoteLink.addClass(classes.voted); 1448 $upVoteLink.removeClass(classes.voted); 1449 } 1450 } 1451 }); 1452 }; 1453 1454 ctx.vote = function (data, nonce, $box) { 1455 var config = $.parseJSON(window.snax_front_config); 1456 if ( $box.find('.snax-login-required').length > 0 ){ 1457 return; 1458 } 1459 1460 if (!config) { 1461 ctx.log('Item voting failed. Global config is not defined!'); 1462 return; 1463 } 1464 1465 /* 1466 * Apply new voting box state before ajax response. 1467 */ 1468 var $userVoted = $box.find('.snax-user-voted'); 1469 var userUpvoted = $userVoted.length > 0 && $userVoted.is('.snax-voting-upvote'); 1470 var userDownvoted = $userVoted.length > 0 && $userVoted.is('.snax-voting-downvote'); 1471 var score = parseInt( $box.find('.snax-voting-score').data('snax-voting-score'), 10); 1472 var diff = 'upvote' === data.type ? 1 : -1; 1473 1474 // Remove all bubbles. 1475 $box.find('.snax-voting-bubble').remove(); 1476 1477 // User reverted his vote. 1478 if (userUpvoted && 'upvote' === data.type || userDownvoted && 'downvote' === data.type) { 1479 diff *= -1; 1480 1481 $box.find('.snax-user-voted').removeClass('snax-user-voted'); 1482 1483 if ( 'upvote' === data.type ) { 1484 $box.find('.snax-voting-upvote').append('<span class="snax-voting-bubble snax-voting-bubble-minus-back">-1</span>'); 1485 } else { 1486 $box.find('.snax-voting-downvote').append('<span class="snax-voting-bubble snax-voting-bubble-plus-back">+1</span>'); 1487 } 1488 1489 // User voted opposite. 1490 } else if (userUpvoted && 'downvote' === data.type || userDownvoted && 'upvote' === data.type) { 1491 diff *= 2; 1492 1493 $box.find('.snax-user-voted').removeClass('snax-user-voted'); 1494 $box.find('.snax-voting-' + data.type).addClass('snax-user-voted'); 1495 1496 if ( 'upvote' === data.type ) { 1497 $box.find('.snax-voting-upvote').append('<span class="snax-voting-bubble snax-voting-bubble-plus">+2</span>'); 1498 } else { 1499 $box.find('.snax-voting-downvote').append('<span class="snax-voting-bubble snax-voting-bubble-minus">-2</span>'); 1500 } 1501 // User added new vote. 1502 } else { 1503 if ( 'upvote' === data.type ) { 1504 $box.find('.snax-voting-upvote').addClass('snax-user-voted').append('<span class="snax-voting-bubble snax-voting-bubble-plus">+1</span>'); 1505 } else { 1506 $box.find('.snax-voting-downvote').addClass('snax-user-voted').append('<span class="snax-voting-bubble snax-voting-bubble-minus">-1</span>'); 1507 } 1508 } 1509 1510 // Update score. 1511 ctx.updateVoteScore($box.find(selectors.scoreWrapper), score + diff); 1512 1513 // Send ajax. 1514 var xhr = $.ajax({ 1515 'type': 'POST', 1516 'url': config.ajax_url, 1517 'dataType': 'json', 1518 'data': { 1519 'action': 'snax_vote_item', 1520 'security': nonce, 1521 'snax_item_id': data.itemId, 1522 'snax_author_id': data.authorId, 1523 'snax_vote_type': data.type, 1524 'snax_user_voted': ctx.readCookie( 'snax_vote_type_' + data.itemId ) 1525 } 1526 }); 1527 1528 // Update state immediately after sending ajax. Don't wait for response. 1529 ctx.updateVoteState(data.itemId, data.type, $box); 1530 1531 xhr.done(function (res) { 1532 locked = false; 1533 }); 1534 }; 1535 1536 ctx.updateVoteState = function(itemId, type, $box) { 1537 var typeCookie = 'snax_vote_type_' + itemId; 1538 var scoreCookie = 'snax_vote_score_' + itemId; 1539 1540 var currentValue = ctx.readCookie(typeCookie); 1541 1542 // Cookie can't be read immediately so we need to update CSS classes manually.
1543 $box.find(selectors.voted).removeClass(classes.voted); 1544 1545 // User voted and now he wants to remove the vote. 1546 if (currentValue === type) { 1547 ctx.deleteCookie(typeCookie); 1548 } else { 1549 ctx.createCookie(typeCookie, type, 1); 1550 1551 // Cookie can't be read immediately so we need to update CSS classes manually. 1552 $box.find('.snax-voting-' + type).addClass(classes.voted); 1553 } 1554 1555 // Update score. 1556 var score = parseInt($box.find(selectors.scoreWrapper).data('snax-voting-score'), 10); 1557 1558 ctx.createCookie(scoreCookie, score, 1); 1559 }; 1560 1561 ctx.updateVoteScore = function($wrapper, score) { 1562 var $container = $wrapper.parents('.snax-voting'); 1563 score = parseInt(score, 10); 1564 var scoreShort = score; 1565 var units = ['', 'k', 'M']; 1566 var i; 1567 for (i = 0; scoreShort >= 1000; i++) { 1568 scoreShort /= 1000; 1569 } 1570 1571 var scoreHtml = +scoreShort.toFixed(1) + units[i]; 1572 1573 // Singular? 1574 if (1 === Math.abs(score)) { 1575 scoreHtml = ctx.config.i18n.points_singular_short_tpl.replace('%s', scoreHtml); 1576 } else { 1577 scoreHtml = ctx.config.i18n.points_plural_short_tpl.replace('%s', scoreHtml); 1578 } 1579 1580 // Remove all score related classes. 1581 $container.removeClass('snax-voting-0 snax-voting-negative snax-voting-positive'); 1582 1583 // Add score related classes. 1584 if (0 < score) { 1585 $container.addClass( 'snax-voting-positive' ); 1586 } else if (0 > score) { 1587 $container.addClass( 'snax-voting-negative' ); 1588 } else { 1589 $container.addClass( 'snax-voting-0' ); 1590 } 1591 1592 $wrapper.data('snax-voting-score', score); 1593 $wrapper.html(scoreHtml); 1594 }; 1595 1596 // fire 1597 $(document).ready(function () { 1598 ctx.votes(); 1599 }); 1600 1601})(jQuery, snax); 1602 1603/********************* 1604 * 1605 * Module: Login form 1606 * 1607 ********************/ 1608 1609(function ($, ctx) { 1610 1611 'use strict'; 1612 1613 var selectors = { 1614 'loginTab': '.snax-login-tab', 1615 'loginFormWrapper': '.snax-login-form', 1616 'loginForm': '.snax-login-form #loginform-in-popup', 1617 'forgotTab': '.snax-forgot-pass-tab', 1618 'forgotFormWrapper': '.snax-forgot-pass-form', 1619 'forgotForm': '.snax-forgot-pass-form #lostpasswordform', 1620 'gdprTab': '.snax-gdpr-tab', 1621 'backToLoginTab': '.snax-back-to-login-tab', 1622 'loginErrorMessage': '.snax-login-form .snax-login-error-message', 1623 'forgotErrorMessage': '.snax-forgot-pass-form .snax-forgot-pass-error-message', 1624 'forgotSuccessMessage': '.snax-forgot-pass-form .snax-forgot-pass-success-message', 1625 'user': { 1626 'loginInput': '#user_login', 1627 'emailInput': '#user_email', 1628 'passwordInput': '#user_pass' 1629 }, 1630 'forgotPasswordLink': '#snax-popup-content .snax-link-forgot-pass', 1631 'passwordWrapper': '#snax-popup-content .login-password', 1632 'connectWithLabel': '#snax-popup-content .wp-social-login-connect-with', 1633 'resetTab': '.snax-reset-tab' 1634 }; 1635 1636 ctx.loginFormSelectors = selectors; 1637 1638 var useReCaptcha; 1639 var reCaptchaToken; 1640 var urlAction = ctx.getUrlParameter(ctx.config.login_popup_url_var); 1641 1642 ctx.loginForm = function () { 1643 useReCaptcha = ctx.config.use_login_recaptcha; 1644 1645 // Add input placeholders. 1646 $.each(selectors.user, function (id, selector) { 1647 var $input = $(selector); 1648 var $label = $input.prev('label'); 1649 1650 if ($label.length > 0) { 1651 $input.attr('placeholder', $label.text()); 1652 } 1653 }); 1654 1655 // Move forgot link after password field. 1656 $(selectors.passwordWrapper + ' input').after( $(selectors.forgotPasswordLink) ); 1657 1658 // Wrap label with <h4> tag. 1659 $(selectors.connectWithLabel).wrapInner( '<h4>' ); 1660 1661 $('.wp-social-login-provider').on('click', function(e) { 1662 var $that = $(this); 1663 if ($('.snax-wpsl-gdpr-consent input').length > 0) { 1664 if (!$('.snax-wpsl-gdpr-consent input').is(':checked')) { 1665 e.stopPropagation(); 1666 e.stopImmediatePropagation(); 1667 e.preventDefault(); 1668 handleLoginGDPR($that); 1669 } 1670 } 1671 }); 1672 1673 handleLoginAction(); 1674 handleForgotPassAction(); 1675 handleTabsSwitch(); 1676 1677 if (urlAction==='reset_password'){ 1678 $(selectors.loginTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); 1679 $(selectors.resetTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); 1680 } 1681 1682 if (urlAction==='forgot_password'){ 1683 $(selectors.loginTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); 1684 $(selectors.forgotTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); 1685 } 1686 1687 $('body').on('snaxPopupOpened', function(e, action) { 1688 if (useReCaptcha && 'login' === action) { 1689 loadReCaptcha(); 1690 } 1691 }); 1692 }; 1693 1694 var handleLoginGDPR = function($clickedProvider) { 1695 $(selectors.loginTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); 1696 $(selectors.gdprTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); 1697 $('.snax-login-gdpr-accept').on('click', function() { 1698 $('.snax-wpsl-gdpr-consent input').prop('checked', true); 1699 $(selectors.gdprTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); 1700 $(selectors.loginTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); 1701 var redirectTo = $clickedProvider.attr('href'); 1702 window.location.href = redirectTo; 1703 }); 1704 }; 1705 1706 var handleLoginAction = function() { 1707 $(selectors.loginForm).on('submit', function(e) { 1708 e.preventDefault(); 1709 1710 var $form = $(this); 1711 var $errorMessage = $(selectors.loginErrorMessage); 1712 1713 var requestData = { 1714 'action': 'snax_login' 1715 }; 1716 1717 $.each($form.serializeArray(), function(i, field) { 1718 requestData[field.name] = field.value; 1719 }); 1720 1721 // Read config directly, DO NOT use any reference. We change the value while auto logging. 1722 if (ctx.config.use_login_recaptcha) { 1723 if (!reCaptchaToken) { 1724 $errorMessage.html( '<p class="snax-validation-tip">' + ctx.config.i18n.recaptcha_invalid + '</p>'); 1725 return; 1726 } 1727 } 1728 1729 // Clear error message. 1730 $errorMessage.html('<p>' + ctx.config.i18n.user_is_logging + '</p>'); 1731 1732 var xhr = $.ajax({ 1733 'type': 'POST', 1734 'url': ctx.config.ajax_url, 1735 'dataType': 'json', 1736 'data': requestData 1737 }); 1738 1739 xhr.done(function (res) { 1740 if ('success' === res.status) { 1741 var redirectTo = res.args.redirect_url; 1742 1743 if (!redirectTo) { 1744 redirectTo = window.location.href; 1745 } 1746 1747 if (redirectTo.indexOf('?') > 0){ 1748 redirectTo += '&' + ctx.config.login_success_var + '=true'; 1749 }else{ 1750 redirectTo += '?' + ctx.config.login_success_var + '=true'; 1751 } 1752 1753 window.location.href = redirectTo; 1754 } else { 1755 if (res.message) { 1756 $errorMessage.html( '<p class="snax-validation-tip">' + res.message + '</p>'); 1757 } 1758 1759 if (useReCaptcha) { 1760 grecaptcha.reset(); 1761 } 1762 } 1763 }); 1764 1765 // Reload page if failed. 1766 xhr.fail(function() { 1767 var reloadUrl = window.location.href; 1768 1769 if (reloadUrl.indexOf('?') > 0){ 1770 reloadUrl += '&' + ctx.config.login_success_var + '=false'; 1771 }else{ 1772 reloadUrl += '?' + ctx.config.login_success_var + '=false'; 1773 } 1774 1775 window.location.href = reloadUrl; 1776 }); 1777 }); 1778 }; 1779 1780 var handleForgotPassAction = function() { 1781 $(selectors.forgotForm).on('submit', function(e) { 1782 e.preventDefault(); 1783 1784 var $form = $(this); 1785 var $errorMessage = $(selectors.forgotErrorMessage); 1786 var $successMessage = $(selectors.forgotSuccessMessage); 1787 1788 var requestData = { 1789 'action': 'snax_forgot_pass' 1790 }; 1791 1792 $.each($form.serializeArray(), function(i, field) { 1793 requestData[field.name] = field.value; 1794 }); 1795 1796 // Clear messages. 1797 $errorMessage.text(''); 1798 $successMessage.text(''); 1799 1800 var xhr = $.ajax({ 1801 'type': 'POST', 1802 'url': ctx.config.ajax_url, 1803 'dataType': 'json', 1804 'data': requestData 1805 }); 1806 1807 xhr.done(function (res) { 1808 if ('success' === res.status) { 1809 if (res.message) { 1810 $successMessage.html( '<p class="snax-validation-tip">' + res.message + '</p>'); 1811 } 1812 } else { 1813 if (res.message) { 1814 $errorMessage.html( '<p class="snax-validation-tip">' + res.message + '</p>'); 1815 } 1816 } 1817 }); 1818 }); 1819 }; 1820 1821 var handleTabsSwitch = function() { 1822 $(selectors.forgotPasswordLink).on('click', function(e) { 1823 e.preventDefault(); 1824 1825 $(selectors.loginTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); 1826 $(selectors.forgotTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); 1827 }); 1828 1829 $(selectors.backToLoginTab).on('click', function(e) { 1830 e.preventDefault(); 1831 1832 $(selectors.resetTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); 1833 $(selectors.forgotTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); 1834 $(selectors.loginTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); 1835 }); 1836 }; 1837 1838 var loadReCaptcha = function() { 1839 var apiUrl = ctx.config.recaptcha_api_url; 1840 var ver = ctx.config.recaptcha_version; 1841 var siteKey = ctx.config.recaptcha_site_key; 1842 1843 if (!siteKey || !apiUrl) { 1844 return; 1845 } 1846 1847 var renderLoginReCaptcha = function() { 1848 try { 1849 1850 if ('30' === ver) { 1851 grecaptcha.execute( 1852 siteKey, 1853 { action: 'login' } 1854 ).then( function( token ) { 1855 $('#snax-login-recaptcha').html('<input type="hidden" name="g-recaptcha-response" value="'+ token +'">'); 1856 reCaptchaEnteredCorrectly(token); 1857 } ); 1858 } else { 1859 grecaptcha.render('snax-login-recaptcha', { 1860 'sitekey' : siteKey, 1861 'callback': reCaptchaEnteredCorrectly 1862 }); 1863 } 1864 1865 } catch (error) {} 1866 1867 }; 1868 1869 // Google reCaptcha API loaded. 1870 if (typeof grecaptcha !== 'undefined') { 1871 renderLoginReCaptcha(); 1872 } else { 1873 // API not loaded. Register callback and load script. 1874 window.snaxReCaptchaOnloadCallback = function() { 1875 renderLoginReCaptcha(); 1876 }; 1877 1878 if ('30' === ver) { 1879 $('head').append('<script src="' + apiUrl + '?onload=snaxReCaptchaOnloadCallback&render='+siteKey+'" async defer>'); 1880 } else { 1881 $('head').append('<script src="' + apiUrl + '?onload=snaxReCaptchaOnloadCallback&render=explicit" async defer>'); 1882 } 1883 } 1884 }; 1885 1886 var reCaptchaEnteredCorrectly = function(response) { 1887 reCaptchaToken = response; 1888 }; 1889 1890 // Fire. 1891 $(document).ready(function () { 1892 ctx.loginForm(); 1893 }); 1894 1895})(jQuery, snax); 1896 1897/**************** 1898 * 1899 * Module: Popup 1900 * 1901 ****************/ 1902 1903(function ($, ctx) { 1904 1905 'use strict'; 1906 1907 ctx.openPopup = function ($content, args, action) { 1908 if (!$.fn.magnificPopup) { 1909 return; 1910 } 1911 1912 args = args || {}; 1913 1914 // Set translatable label. 1915 if (!args.tClose) { 1916 args.tClose = ctx.config.i18n.popup_close_label; 1917 } 1918 1919 args.items = { 1920 src: $content, 1921 type: 'inline' 1922 }; 1923 1924 args.callbacks = { 1925 'open': function () { 1926 $('body').trigger('snaxPopupOpened', [ action ]); 1927 } 1928 }; 1929 1930 $.magnificPopup.open(args); 1931 1932 // Override the Close action. 1933 if (typeof args.onClose === 'function') { 1934 $.magnificPopup.instance.close = args.onClose; 1935 } 1936 }; 1937 1938 ctx.closePopup = function () { 1939 if (!$.fn.magnificPopup) { 1940 return; 1941 } 1942 1943 $.magnificPopup.close(); 1944 }; 1945 1946})(jQuery, snax); 1947 1948/*********************** 1949 * 1950 * Module: Login Popup 1951 * 1952 **********************/ 1953 1954(function ($, ctx) { 1955 1956 'use strict'; 1957 1958 var selectors = { 1959 'popupContent': '#snax-popup-content', 1960 'usernameField': '#user_login' 1961 }; 1962 1963 ctx.openLoginPopup = function (onClose) { 1964 var $content = $(selectors.popupContent); 1965 1966 var args = {}; 1967 1968 if (typeof onClose === 'function') { 1969 args.onClose = onClose; 1970 } 1971 1972 ctx.openPopup($content, args, 'login'); 1973 1974 // Delay till popup opens. 1975 setTimeout(function() { 1976 $content.find(selectors.usernameField).focus(); 1977 }, 100); 1978 }; 1979 1980 ctx.redirectToLoginPage = function () { 1981 window.location.href = ctx.config.login_url; 1982 }; 1983 1984 // fire 1985 $(document).ready(function () { 1986 $('body').on('snaxLoginRequired', function(e, blocked) { 1987 var onClose = false;
1988 1989 if (blocked) { 1990 onClose = function() { 1991 window.location.href = ctx.config.site_url; 1992 }; 1993 } 1994 1995 // Snax Login Popup is ON. 1996 if (ctx.config.enable_login_popup) { 1997 ctx.openLoginPopup(onClose); 1998 1999 // Custom handler is defined. 2000 } else if ( typeof snaxLoginRequiredHandler === 'function' ) { 2001 snaxLoginRequiredHandler(onClose); 2002 2003 // Redirect as a fallback. 2004 } else { 2005 ctx.redirectToLoginPage(); 2006 } 2007 }); 2008 }); 2009 2010})(jQuery, snax); 2011 2012/******************************** 2013 * 2014 * Module: Login Required Action 2015 * 2016 *******************************/ 2017 2018(function ($, ctx) { 2019 2020 'use strict'; 2021 2022 $(document).ready(function () { 2023 var $body = $('body'); 2024 2025 // Login requested by clicking link with the URL containing the login trigger. 2026 $body.on('click', 'a', function (e) { 2027 var $link = $(e.currentTarget); 2028 var url = $link.attr('href'); 2029 2030 // Skip, URL not specified. 2031 if (!url || url.length === 0) { 2032 return; 2033 } 2034 2035 // Skip, URL doesn't contain the popup trigger. 2036 if (-1 === url.indexOf(ctx.config.login_popup_url_var)) { 2037 return; 2038 } 2039 2040 // Skip, other handler will be used. 2041 if ($link.hasClass('snax-login-required')) { 2042 return; 2043 } 2044 2045 e.stopImmediatePropagation(); 2046 e.preventDefault(); 2047 2048 ctx.loginRequired(); 2049 2050 return false; 2051 }); 2052 2053 // Login requested by CSS class. 2054 $body.on('click', '.snax-login-required', function (e) { 2055 e.preventDefault(); 2056 2057 ctx.loginRequired(); 2058 2059 return false; 2060 }); 2061 2062 // Login requested by URL. 2063 if (ctx.getUrlParameter(ctx.config.login_popup_url_var) && !ctx.config.logged_in){ 2064 ctx.loginRequired(); 2065 } 2066 2067 // Login requested by setting var. 2068 if (ctx.forceLoginPopup) { 2069 ctx.loginRequired(ctx.forceLoginPopup.blocked); 2070 } 2071 }); 2072 2073})(jQuery, snax); 2074 2075/************************* 2076 * 2077 * Module: Actions Menu 2078 * 2079 ************************/ 2080 2081(function ($, ctx) { 2082 2083 'use strict'; 2084 2085 var selectors = { 2086 'actions' : '.snax-actions', 2087 'actionsToggle': '.snax-actions-toggle', 2088 'actionsExpanded': '.snax-actions-expanded' 2089 }; 2090 2091 var classes = { 2092 'expanded': 'snax-actions-expanded' 2093 }; 2094 2095 ctx.actionsMenuSelectors = selectors; 2096 ctx.actionsMenuClasses = classes; 2097 2098 ctx.actionsMenu = function () { 2099 var $body = $('body'); 2100 2101 $('body').on('click', selectors.actionsToggle, function(e) { 2102 e.preventDefault(); 2103 2104 var $toggle = $(e.target); 2105 2106 $toggle.parents(selectors.actions).toggleClass(classes.expanded); 2107 }); 2108 2109 // Hide on focus out. 2110 $body.on('click touchstart', function (e) { 2111 var $activeMenu = $(e.target).parents(selectors.actions); 2112 2113 // Collapse all expanded menus except active one. 2114 $(selectors.actionsExpanded).not($activeMenu).removeClass(classes.expanded); 2115 }); 2116 }; 2117 2118 // Fire. 2119 $(document).ready(function () { 2120 ctx.actionsMenu(); 2121 }); 2122 2123})(jQuery, snax); 2124 2125 2126/************************* 2127 * 2128 * Module: Item Share 2129 * 2130 ************************/ 2131 2132(function ($, ctx) { 2133 2134 'use strict'; 2135 2136 var selectors = { 2137 'wrapper' : '.snax-item-share', 2138 'toggle': '.snax-item-share-toggle', 2139 'expandedState': '.snax-item-share-expanded' 2140 }; 2141 2142 var classes = { 2143 'expanded': 'snax-item-share-expanded' 2144 }; 2145 2146 ctx.itemShareSelectors = selectors; 2147 ctx.itemShareClasses = classes; 2148 2149 ctx.itemShare = function () { 2150 // On none touchable devices, shares visibility is handled via css :hover. 2151 // On touch devices there is no "hover", so we emulate hover via CSS class toggle on click. 2152 $(selectors.toggle).on('click touchstart', function (e) { 2153 e.preventDefault(); 2154
2155 $(this).parents(selectors.wrapper).addClass(classes.expanded); 2156 }); 2157 2158 // Hide shares on focus out. 2159 $('body').on('click touchstart', function (e) { 2160 var $activeElem = $(e.target).parents(selectors.expandedState); 2161 2162 // Collapse all expanded micro shares except active one. 2163 $(selectors.expandedState).not($activeElem).removeClass(classes.expanded); 2164 }); 2165 }; 2166 2167 // Fire. 2168 $(document).ready(function () { 2169 if (ctx.isTouchDevice()) { 2170 $('body').removeClass('snax-hoverable'); 2171 2172 } 2173 2174 ctx.itemShare(); 2175 }); 2176 2177})(jQuery, snax); 2178 2179 2180/************************* 2181 * 2182 * Module: Delete Item 2183 * 2184 ************************/ 2185 2186(function ($, ctx) { 2187 2188 'use strict'; 2189 2190 /** CONFIG *******************************************/ 2191 2192 // Register new component. 2193 ctx.deleteItemModule = {}; 2194 2195 // Component namespace shortcut. 2196 var c = ctx.deleteItemModule; 2197 2198 // CSS selectors. 2199 var selectors = { 2200 'deleteLink': '.snax-delete-item' 2201 }; 2202 2203 var i18n = { 2204 'confirm': 'Are you sure?' 2205 }; 2206 2207 // Allow accessing 2208 c.selectors = selectors; 2209 c.i18n = i18n; 2210 2211 /** INIT *******************************************/ 2212 2213 c.init = function () { 2214 c.attachEventHandlers(); 2215 }; 2216 2217 /** EVENTS *****************************************/ 2218 2219 c.attachEventHandlers = function() { 2220 2221 /* Delete item */ 2222 2223 $(selectors.deleteLink).on('click', function (e) { 2224 e.preventDefault(); 2225 2226 if (!confirm(i18n.confirm)) { 2227 return; 2228 } 2229 2230 ctx.deleteItem($(this), function(res) { 2231 if (res.status === 'success') { 2232 location.href = res.args.redirect_url; 2233 } else { 2234 alert(res.message); 2235 } 2236 }); 2237 }); 2238 }; 2239 2240 // Fire. 2241 $(document).ready(function () { 2242 c.init(); 2243 }); 2244 2245})(jQuery, snax); 2246 2247 2248/******************************* 2249 * 2250 * Module: Set Item as Featured 2251 * 2252 ******************************/ 2253 2254(function ($, ctx) { 2255 2256 'use strict'; 2257 2258 /** CONFIG *******************************************/ 2259 2260 // Register new component. 2261 ctx.setItemAsFeaturedModule = {}; 2262 2263 // Component namespace shortcut. 2264 var c = ctx.setItemAsFeaturedModule; 2265 2266 // CSS selectors. 2267 var selectors = { 2268 'link': '.snax-set-item-as-featured' 2269 }; 2270 2271 // Allow accessing 2272 c.selectors = selectors; 2273 2274 /** INIT *******************************************/ 2275 2276 c.init = function () { 2277 c.attachEventHandlers(); 2278 }; 2279 2280 /** EVENTS *****************************************/ 2281 2282 c.attachEventHandlers = function() { 2283 2284 /* Delete item */ 2285 2286 $(selectors.link).on('click', function (e) { 2287 e.preventDefault(); 2288 2289 ctx.setItemAsFeatured($(this), function(res) { 2290 if (res.status === 'success') { 2291 location.reload(); 2292 } else { 2293 alert(res.message); 2294 } 2295 }); 2296 }); 2297 }; 2298 2299 // Fire. 2300 $(document).ready(function () { 2301 c.init(); 2302 }); 2303 2304})(jQuery, snax); 2305 2306/******************************* 2307 * 2308 * Module: Froala for items 2309 * 2310 ******************************/ 2311 2312(function ($, ctx) { 2313 2314 'use strict'; 2315 2316 /** CONFIG *******************************************/ 2317 2318 // Register new component. 2319 ctx.froalaSimple = {}; 2320 2321 // Component namespace shortcut. 2322 var c = ctx.froalaSimple; 2323 2324 // CSS selectors. 2325 var selectors = { 2326 'froalaEditor': '.froala-editor-simple' 2327 }; 2328 2329 // Allow accessing 2330 c.selectors = selectors; 2331 2332 /** INIT *******************************************/ 2333 2334 c.init = function () { 2335 c.attachEventHandlers(); 2336 c.applyFroala(); 2337 }; 2338 2339 /** EVENTS *****************************************/ 2340 2341 c.attachEventHandlers = function() { 2342 $( 'body' ).on( 'snaxNewCardAdded', function($card) { 2343 c.applyFroala(); 2344 }); 2345 }; 2346 2347 c.renderFroala = function() { 2348 var $textarea = $(this); 2349 var config = { 2350 'key': 'CMFIZJNKLDXIREJI==', 2351 'language': c.getFroalaEditorConfig('language'), 2352 'heightMin': 200, 2353 // Sticky toolbar. 2354 'toolbarSticky': true, 2355 'toolbarStickyOffset': $('body').hasClass('admin-bar') ? 32 : 0, 2356 // Toolbar buttons on large devices (≥ 1200px). 2357 'toolbarButtons': ['bold', 'italic', 'insertLink', '|', 'undo', 'redo'], 2358 // On medium devices (≥ 992px). 2359 toolbarButtonsMD: ['bold', 'italic', 'insertLink', '|', 'undo', 'redo'], 2360 // On small devices (≥ 768px). 2361 toolbarButtonsSM: ['bold', 'italic', 'insertLink', '|', 'undo', 'redo'], 2362 // On extra small devices (< 768px). 2363 toolbarButtonsXS: ['bold', 'italic', 'insertLink', '|', 'undo', 'redo'], 2364 charCounterMax: c.getFroalaEditorMaxCharacters($textarea) 2365 }; 2366 // Override Froala's config using this filter function. 2367 if (typeof c.froalaEditorConfig === 'function') { 2368 config = c.froalaEditorConfig(config); 2369 } 2370 if (snax.inDebugMode()) { 2371 snax.log(config); 2372 } 2373 // Init. 2374 $textarea.froalaEditor(config); 2375 }; 2376 2377 c.getFroalaEditorConfig = function(id) { 2378 var config = c.config.froala; 2379 2380 if (typeof config[id] !== 'undefined') { 2381 return config[id]; 2382 } 2383 2384 return null; 2385 }; 2386 2387 c.getFroalaEditorMaxCharacters = function($editor) { 2388 var maxCharacters = parseInt($editor.attr('maxlength'), 10); 2389 2390 return maxCharacters > 0 ? maxCharacters : -1; 2391 }; 2392 2393 c.applyFroala = function () { 2394 2395 // Check if Froals script is loaded. 2396 if (!$.fn.froalaEditor) { 2397 return; 2398 } 2399 $(selectors.froalaEditor).each(c.renderFroala); 2400 }; 2401 2402 // Fire. 2403 $(document).ready(function () { 2404 if (snax.frontendSubmission) { 2405 c.config = snax.frontendSubmission.config; 2406 } 2407 if (snax.post) { 2408 c.config = snax.post.config; 2409 } 2410 if (typeof c.config === 'undefined') { 2411 return; 2412 } 2413 c.init(); 2414 }); 2415 2416})(jQuery, snax); 2417 2418/******************************* 2419 * 2420 * Module: Single item comments 2421 * 2422 ******************************/ 2423 2424(function ($, ctx) { 2425 2426 'use strict'; 2427 2428 /** CONFIG *******************************************/ 2429 2430 // Register new component. 2431 ctx.singleItemComments = {}; 2432 2433 // Component namespace shortcut. 2434 var c = ctx.singleItemComments; 2435 2436 var seeMoreHtml = '<a class="snax-see-all-replies">' + ctx.config.i18n.see_all_replies + '</a>'; 2437 2438 // CSS selectors. 2439 var selectors = { 2440 'section': '.snax-item-comments', 2441 'topLevelComment': '.snax-item-comments .depth-1', 2442 'moreCommentsLink': '.snax-item-comments-more-link', 2443 'allRepliesLink': '.snax-see-all-replies', 2444 'list': '.comment-list', 2445 'commentForm': '.snax-item-comments .comment-form', 2446 'textarea': '.snax-item-comments .comment-form textarea', 2447 'submitButton': '.submit', 2448 'cancelReply': '#cancel-comment-reply-link', 2449 'respondSection': '#respond', 2450 'replyLogin': '.comment-reply-login', 2451 'respondLogin': '.snax-comment-login', 2452 'authorFields': '.snax-item-comment-autor', 2453 }; 2454
2455 var $spinner = $('<div class="snax-upload-icon"></div>'); 2456 2457 // Allow accessing 2458 c.selectors = selectors; 2459 2460 /** INIT *******************************************/ 2461 2462 c.init = function () { 2463 $(selectors.submitButton, selectors.commentForm).attr('disabled', true); 2464 c.renderSeeMore(); 2465 c.attachEventHandlers(); 2466 }; 2467 2468 /** EVENTS *****************************************/ 2469 2470 c.renderSeeMore = function() { 2471 $(selectors.topLevelComment).each(function( index ) { 2472 if($('.children li', this).length>1 && $(this).attr('appendedSeeMoreLink')!== 'true'){ 2473 $(this).append(seeMoreHtml); 2474 $(this).attr('appendedSeeMoreLink','true'); 2475 } 2476 }); 2477 $(selectors.allRepliesLink).on('click', function (e) { 2478 var $parent = $(this).closest(selectors.topLevelComment); 2479 $('.children', $parent).addClass('children-visible'); 2480 $(this).remove(); 2481 }); 2482 }; 2483 2484 //overrides core comment-reply.js to handle multiple forms 2485 c.overrideDefaultHandler = function() { 2486 if (typeof addComment === 'undefined') { 2487 return; 2488 } 2489 2490 addComment.moveForm = function( commId, parentId, respondId, postId ) { 2491 var div, 2492 element, 2493 style, 2494 cssHidden, 2495 t = this, 2496 comm = t.I( commId ), 2497 respond = $('.snax-item.post-' + postId).find('.comment-respond').get(0), 2498 cancel = respond.querySelector( '#cancel-comment-reply-link' ), 2499 parent = respond.querySelector( '#comment_parent' ), 2500 post = respond.querySelector( '#comment_post_ID' ), 2501 commentForm = respond.getElementsByTagName( 'form' )[0]; 2502 2503 if ( ! comm || ! respond || ! cancel || ! parent || ! commentForm ) { 2504 return; 2505 } 2506 2507 t.respondId = respondId; 2508 postId = postId || false; 2509 2510 if ( ! t.I( 'wp-temp-form-div' ) ) { 2511 div = document.createElement( 'div' ); 2512 div.id = 'wp-temp-form-div'; 2513 div.style.display = 'none'; 2514 respond.parentNode.insertBefore( div, respond ); 2515 } 2516 2517 comm.parentNode.insertBefore( respond, comm.nextSibling ); 2518 if ( post && postId ) { 2519 post.value = postId; 2520 } 2521 parent.value = parentId; 2522 cancel.style.display = ''; 2523 2524 cancel.onclick = function() { 2525 var t = addComment, 2526 temp = t.I( 'wp-temp-form-div' ); 2527 2528 if ( ! temp ) { 2529 return; 2530 } 2531 2532 parent.value = '0'; 2533 temp.parentNode.insertBefore( respond, temp ); 2534 temp.parentNode.removeChild( temp ); 2535 this.style.display = 'none'; 2536 this.onclick = null; 2537 2538 $(respond).find('.comment-form').trigger('snaxFormInactive'); 2539 2540 return false; 2541 }; 2542 2543 /* 2544 * Set initial focus to the first form focusable element. 2545 * Try/catch used just to avoid errors in IE 7- which return visibility 2546 * 'inherit' when the visibility value is inherited from an ancestor. 2547 */ 2548 try { 2549 for ( var i = 0; i < commentForm.elements.length; i++ ) { 2550 element = commentForm.elements[i]; 2551 cssHidden = false; 2552 2553 // Modern browsers. 2554 if ( 'getComputedStyle' in window ) { 2555 style = window.getComputedStyle( element ); 2556 // IE 8. 2557 } else if ( document.documentElement.currentStyle ) { 2558 style = element.currentStyle; 2559 } 2560 2561 /* 2562 * For display none, do the same thing jQuery does. For visibility, 2563 * check the element computed style since browsers are already doing 2564 * the job for us. In fact, the visibility computed style is the actual 2565 * computed value and already takes into account the element ancestors. 2566 */ 2567 if ( ( element.offsetWidth <= 0 && element.offsetHeight <= 0 ) || style.visibility === 'hidden' ) { 2568 cssHidden = true; 2569 } 2570 2571 // Skip form elements that are hidden or disabled. 2572 if ( 'hidden' === element.type || element.disabled || cssHidden ) { 2573 continue; 2574 } 2575 2576 element.focus(); 2577 // Stop after the first focusable element. 2578 break; 2579 } 2580 2581 } catch( er ) {} 2582 2583 return false;
2584 }; 2585 2586 addComment.I = function( id ) { 2587 return document.getElementById( id ); 2588 }; 2589 }; 2590 2591 c.attachEventHandlers = function() { 2592 2593 var loadMoreComments = function($section) { 2594 let $commentList = $section.find(selectors.list); 2595 let $nextCommentsLink = $section.find('.g1-comment-pagination .next'); 2596 2597 if ($nextCommentsLink.length === 0) { 2598 return; 2599 } 2600 2601 $spinner.appendTo($commentList); 2602 2603 $.get($nextCommentsLink.attr('href'), function (data) { 2604 $spinner.remove(); 2605 2606 let $page = $(data); 2607 2608 // Load new comments. 2609 let $newComments = $page.find('#comments-wp .comment-list .comment'); 2610 $section.find('.comment-list').append($newComments); 2611 2612 // Update pagination for further calls. 2613 let $newPagination = $page.find('#comments-wp .g1-comment-pagination'); 2614 $section.find('.g1-comment-pagination').html($newPagination); 2615 2616 // Hide "View most comments" button. 2617 if ($newPagination.find('.next').length === 0) { 2618 $section.find(selectors.moreCommentsLink).hide(); 2619 } 2620 2621 addComment.init(); 2622 }); 2623 }; 2624 2625 $(selectors.moreCommentsLink).on('click', function (e) { 2626 e.preventDefault(); 2627 var $section = $(this).closest(selectors.section); 2628 loadMoreComments($section); 2629 }); 2630 2631 $(selectors.commentForm).on('submit', function(e) { 2632 e.preventDefault(); 2633 var $form = $(this); 2634 var url = $form.attr('action'); 2635 var commentParent = '0'; 2636 var $textarea = $('textarea', $form); 2637 var $section = $form.closest(selectors.section); 2638 var $list = $(selectors.list, $section); 2639 var $respondSection = $form.closest(selectors.respondSection); 2640 var $cancelButton = $(selectors.cancelReply, $respondSection); 2641 var $submitButton = $(selectors.submitButton, $form); 2642 var requestData = {}; 2643 2644 $.each($form.serializeArray(), function(i, field) { 2645 requestData[field.name] = field.value; 2646 }); 2647 2648 requestData['is_ajax_item_comment_form'] = true; 2649 commentParent = requestData['comment_parent']; 2650 2651 if (commentParent === '0') { 2652 $spinner.prependTo($list); 2653 } else { 2654 var $commentParent = $('#comment-' + commentParent); 2655 var $commentParentChildren = $('#comment-' + commentParent + '> .children'); 2656 if (! $commentParentChildren.length) { 2657 $commentParent.append('<ul class="children"></ul>'); 2658 $commentParentChildren = $('#comment-' + commentParent + '> .children'); 2659 } 2660 $spinner.prependTo($commentParentChildren); 2661 } 2662 2663 var xhr = $.ajax({ 2664 'type': 'POST', 2665 'url': url, 2666 'data': requestData 2667 }); 2668 2669 xhr.done(function (res) { 2670 $textarea.val(''); 2671 $cancelButton.trigger('click'); 2672 $submitButton.attr('disabled', true); 2673 if (res.indexOf('<body id="error-page">') != -1){ 2674 res = $(res).filter('p')[1]; 2675 } 2676 $spinner.replaceWith(res); 2677 if (commentParent !== '0') { 2678 var $parent = $commentParentChildren.closest(selectors.topLevelComment); 2679 $('.children', $parent).addClass('children-visible'); 2680 } 2681 2682 $form.trigger('snaxFormInactive'); 2683 }); 2684 2685 xhr.fail(function( jqXHR, textStatus ) { 2686 if(jqXHR.status===409){ 2687 alert(ctx.config.i18n.duplicate_comment); 2688 }else{ 2689 alert(ctx.config.i18n.comment_fail); 2690 } 2691 $spinner.remove(); 2692 }); 2693 }); 2694
2695 var validateForm = function( $form ) { 2696 var $submitButton = $(selectors.submitButton, $form); 2697 var $author = $(selectors.authorFields, $form); 2698 var $input = $('textarea', $form); 2699 var disable = false; 2700 if ( $author.length > 0 ){ 2701 var $authorName = $('#author', $author); 2702 var $authorMail = $('#email', $author); 2703 if ( $authorName.val() === '' || $authorMail.val() === '' ) { 2704 disable = true; 2705 } 2706 } 2707 if ($input.val() === '') { 2708 disable = true; 2709 } 2710 $submitButton.attr('disabled', disable); 2711 }; 2712 2713 $(selectors.textarea).keyup(function() { 2714 var $parent = $(this).closest(selectors.commentForm); 2715 var $author = $(selectors.authorFields, $parent); 2716 while($(this).outerHeight() < this.scrollHeight + parseFloat($(this).css('borderTopWidth')) + parseFloat($(this).css('borderBottomWidth'))) { 2717 $(this).height($(this).height()+1); 2718 } 2719 if ($(this).val()){ 2720 $author.show(); 2721 $parent.removeClass('snax-comment-form-collapsed').addClass('snax-comment-form-extended'); 2722 } else { 2723 $author.hide(); 2724 $parent.removeClass('snax-comment-form-extended').addClass('snax-comment-form-collapsed'); 2725 } 2726 validateForm($parent); 2727 }); 2728 2729 $(selectors.authorFields).keyup(function() { 2730 var $parent = $(this).closest(selectors.commentForm); 2731 validateForm($parent); 2732 }); 2733 2734 $(selectors.replyLogin).click(function(e){ 2735 e.preventDefault(); 2736 ctx.loginRequired(); 2737 }); 2738 $(selectors.respondLogin).click(function(e){ 2739 e.preventDefault(); 2740 ctx.loginRequired(); 2741 }); 2742 }; 2743 2744 // Fire. 2745 $(document).ready(function () { 2746 c.init(); 2747 c.overrideDefaultHandler(); 2748 }); 2749 2750})(jQuery, snax); 2751 2752/************************* 2753 * 2754 * Module: Delete Post 2755 * 2756 ************************/ 2757 2758(function ($, ctx) { 2759 2760 'use strict'; 2761 2762 /** CONFIG *******************************************/ 2763 2764 // Register new component. 2765 ctx.deletePostModule = {}; 2766 2767 // Component namespace shortcut. 2768 var c = ctx.deletePostModule; 2769 2770 // CSS selectors. 2771 var selectors = { 2772 'deleteLink': '.snax-delete-post' 2773 }; 2774 2775 // Allow accessing 2776 c.selectors = selectors; 2777 2778 /** INIT *******************************************/ 2779 2780 c.init = function () { 2781 c.attachEventHandlers(); 2782 }; 2783 2784 /** EVENTS *****************************************/ 2785 2786 c.attachEventHandlers = function() { 2787 2788 /* Delete item */ 2789 2790 $(selectors.deleteLink).on('click', function (e) { 2791 e.preventDefault(); 2792 var $link = $(this); 2793 2794 if (!confirm(ctx.config.i18n.are_you_sure)) { 2795 return; 2796 } 2797 2798 var $item = $link.parents('.g1-collection-item'); 2799 2800 if ( $item.length === 0 ) { 2801 var $item = $link.parents('article.post'); 2802 } 2803 2804 $item.addClass('snax-post-removing'); 2805 2806 ctx.deletePost($link, function(res) { 2807 if (res.status === 'success') { 2808 var redirectUrl = $link.attr('href'); 2809 2810 // Redirect and show status note on top of a target page. 2811 if (redirectUrl.length > 0) { 2812 var queryVarDelimiter = redirectUrl.indexOf('?') === -1 ? '?' : '&'; 2813 2814 window.location.href = redirectUrl + queryVarDelimiter + ctx.config.delete_status_var + '=success'; 2815 // Remove DOM element and show notification. 2816 } else { 2817 $item.addClass('snax-post-removed'); 2818 $item.slideToggle(750); 2819 2820 setTimeout(function() { 2821 snax.notifications.add(res.message); 2822 }, 1500); 2823 } 2824 2825 } else { 2826 ctx.notifications.add(res.message); 2827 } 2828 }); 2829 }); 2830 }; 2831 2832 // Fire. 2833 $(document).ready(function () { 2834 c.init(); 2835 }); 2836 2837})(jQuery, snax); 2838 2839/******************************* 2840 * 2841 * Module: Password Reset 2842 * 2843 ******************************/ 2844 2845(function ($, ctx) { 2846 2847 'use strict'; 2848 2849 /** CONFIG *******************************************/ 2850 2851 // Register new component. 2852 ctx.passwordReset = {}; 2853 2854 // Component namespace shortcut. 2855 var c = ctx.passwordReset; 2856 2857 // CSS selectors. 2858 var selectors = { 2859 'resetPasswordForm': '#snax_reset_password_form', 2860 'newPassword': '#snax_reset_password_form #new_password', 2861 'repeatPassword': '#snax_reset_password_form #repeat_password',
2862 'cookieName': '#snax_reset_password_form .rp-cookie-name', 2863 'cookieValue': '#snax_reset_password_form .rp-cookie_value', 2864 'resetErrorMessage': '#snax_reset_password_form .snax-reset-pass-error-message', 2865 'resetSuccessMessage': '#snax_reset_password_form .snax-reset-pass-success-message', 2866 }; 2867 2868 // Allow accessing 2869 c.selectors = selectors; 2870 2871 /** INIT *******************************************/ 2872 2873 c.init = function () { 2874 c.attachEventHandlers(); 2875 }; 2876 2877 /** EVENTS *****************************************/ 2878 2879 c.attachEventHandlers = function() { 2880 c.matchPasswords(); 2881 c.handleForm(); 2882 }; 2883 2884 c.matchPasswords = function() { 2885 var $newPassword = $(selectors.newPassword), 2886 $repeatPassword = $(selectors.repeatPassword); 2887 2888 $repeatPassword.on('change', function(e) { 2889 if ($newPassword.val() !== $repeatPassword.val()){ 2890 $repeatPassword.get(0).setCustomValidity( ctx.config.i18n.passwords_dont_match); 2891 } else { 2892 $repeatPassword.get(0).setCustomValidity(''); 2893 } 2894 }); 2895 } 2896 2897 c.handleForm = function() { 2898 var $form = $(selectors.resetPasswordForm), 2899 $cookieName = $(selectors.cookieName), 2900 $cookieValue = $(selectors.cookieValue), 2901 $newPassword = $(selectors.newPassword), 2902 $errorMessage = $(selectors.resetErrorMessage), 2903 $successMessage = $(selectors.resetSuccessMessage); 2904 2905 $form.on('submit', function(e) { 2906 2907 e.preventDefault(); 2908 e.stopPropagation(); 2909 e.stopImmediatePropagation(); 2910 2911 $errorMessage.text(''); 2912 $successMessage.text(''); 2913 2914 ctx.createCookie($cookieName.val(), $cookieValue.val(), 24); 2915 2916 var xhr = $.ajax({ 2917 'type': 'POST', 2918 'url': $form.attr('action') + '?action=resetpass', 2919 'data': $form.serialize(), 2920 }); 2921 2922 xhr.done(function (res) { 2923 if ($('.reset-pass', res).length){ 2924 $successMessage.html( '<p class="snax-validation-tip">' + ctx.config.i18n.password_set + '</p>' ); 2925 } 2926 if ($('#login_error', res).length){ 2927 $errorMessage.html( '<p class="snax-validation-tip">' + ctx.config.i18n.link_invalid + '</p>' ); 2928 } 2929 }); 2930 2931 return false; 2932 }); 2933 }; 2934 2935 // Fire. 2936 $(document).ready(function () { 2937 if ($(selectors.resetPasswordForm).length){ 2938 c.init(); 2939 } 2940 }); 2941 2942})(jQuery, snax); 2943 2944/******************************* 2945 * 2946 * Module: BuddyPress registration captcha 2947 * 2948 ******************************/ 2949 2950(function ($, ctx) { 2951 2952 'use strict'; 2953 2954 var useReCaptcha; 2955 var reCaptchaToken; 2956 2957 ctx.registerForm = function () { 2958 useReCaptcha = ctx.config.use_login_recaptcha; 2959 if (useReCaptcha && $('#buddypress #register-page').length >0) { 2960 loadReCaptcha(); 2961 $('#signup_submit').attr('disabled', true); 2962 } 2963 }; 2964 2965 var loadReCaptcha = function() { 2966 var apiUrl = ctx.config.recaptcha_api_url; 2967 var ver = ctx.config.recaptcha_version; 2968 var siteKey = ctx.config.recaptcha_site_key; 2969 2970 if (!siteKey || !apiUrl) { 2971 return; 2972 } 2973 2974 var renderLoginReCaptcha = function() { 2975 if ('30' === ver) { 2976 grecaptcha.execute( 2977 siteKey, 2978 { action: 'login' } 2979 ).then( function( token ) { 2980 $('#snax-register-recaptcha').html('<input type="hidden" name="g-recaptcha-response" value="'+ token +'">'); 2981 reCaptchaEnteredCorrectly(token); 2982 } ); 2983 } else { 2984 grecaptcha.render('snax-register-recaptcha', { 2985 'sitekey' : siteKey, 2986 'callback': reCaptchaEnteredCorrectly 2987 }); 2988 } 2989 }; 2990 2991 // Google reCaptcha API loaded. 2992 if (typeof grecaptcha !== 'undefined') { 2993 renderLoginReCaptcha(); 2994 } else { 2995 // API not loaded. Register callback and load script. 2996 window.snaxReCaptchaOnloadCallback = function() { 2997 renderLoginReCaptcha(); 2998 }; 2999 3000 if ('30' === ver) { 3001 $('head').append('<script src="' + apiUrl + '?onload=snaxReCaptchaOnloadCallback&render='+siteKey+'" async defer>'); 3002 } else { 3003 $('head').append('<script src="' + apiUrl + '?onload=snaxReCaptchaOnloadCallback&render=explicit" async defer>'); 3004 } 3005 } 3006 }; 3007 3008 var reCaptchaEnteredCorrectly = function(response) { 3009 reCaptchaToken = response; 3010 $('#signup_submit').attr('disabled', false); 3011 }; 3012 3013 // Fire. 3014 $(document).ready(function () { 3015 ctx.registerForm(); 3016 }); 3017 3018})(jQuery, snax); 3019 3020/******************************* 3021 * 3022 * Module: Notifications 3023 * 3024 ******************************/ 3025 3026(function ($, ctx) { 3027 3028 'use strict'; 3029 3030 var api = {}; // Public API. 3031 var timeout = 5000; 3032 var $notifications = false;
3033 var $notificationTpl = false; 3034 3035 var selectors = { 3036 'notifications': '.snax-notifications', 3037 'notification': '.snax-notification', 3038 'notificationText': '.snax-notification-text', 3039 'notificationClose':'.snax-notification-close' 3040 }; 3041 3042 var classes = { 3043 'on': 'snax-notifications-on', 3044 'off': 'snax-notifications-off', 3045 }; 3046 3047 api.add = function(html) { 3048 var $notification = $notificationTpl.clone(true); 3049 $notification.find(selectors.notificationText).html(html); 3050 3051 $notification.on('click', selectors.notificationClose, function() { 3052 api.remove($notification); 3053 }); 3054 3055 // Auto-remove. 3056 setTimeout(function() { 3057 api.remove($notification); 3058 }, timeout); 3059 3060 $notifications.prepend($notification); 3061 $notifications.removeClass(classes.off).addClass(classes.on); 3062 }; 3063 3064 api.remove = function($notification) { 3065 $notification.addClass('snax-notification-removed'); 3066 setTimeout(function() { 3067 $notification.remove(); 3068 3069 if (api.isQueueEmpty()) { 3070 $notifications.removeClass(classes.on).addClass(classe
3070s.off); 3071 } 3072 }, 5000); 3073 }; 3074 3075 api.isQueueEmpty = function() { 3076 return $notifications.find(selectors.notification).length === 0; 3077 }; 3078 3079 var initNotifications = function() { 3080 $notifications = $(selectors.notifications); 3081 3082 if ($notifications.length === 0) { 3083 return; 3084 } 3085 3086 // Store notification template and rmeove it from DOM. 3087 $notificationTpl = $notifications.find(selectors.notification).detach(); 3088 3089 // Enable API. 3090 ctx.notifications = api; 3091 }; 3092 3093 // Fire. 3094 $(document).ready(function () { 3095 initNotifications(); 3096 }); 3097 3098})(jQuery, snax); 3099 3100/******************************** 3101 * 3102 * Social Login GDPR integration 3103 * 3104 *******************************/ 3105 3106(function ($, ctx) { 3107 3108 'use strict'; 3109 3110 var storeCurrentURL = function() { 3111 var url = window.location.href; 3112 3113 ctx.createCookie('snax_social_login_redirect_url', url, 1); 3114 }; 3115 3116 $(document).ready(function () { 3117 var $gdpr = $('.snax-gdpr-consent-form'); 3118 3119 if ($gdpr.length > 0) { 3120 $gdpr.each(function() { 3121 var $form = $(this); 3122 var $links = $form.parent().find('.snax-social-login-links'); 3123 var $link; // A requested social login link. 3124 3125 // Toggle GDPR and Social Links visibility. 3126 var toggleVisiblity = function() { 3127 $form.toggleClass('snax-gdpr-consent-form-hidden snax-gdpr-consent-form-visible'); 3128 $links.toggleClass('snax-social-login-links-visible snax-social-login-links-hidden'); 3129 }; 3130 3131 // Social login link requested. 3132 $links.on('click', 'a.snax-social-login', function(e) { 3133 e.preventDefault(); 3134 3135 $link = $(this); 3136 3137 toggleVisiblity(); 3138 }); 3139 3140 // Accept GDPR. 3141 $form.on('click', '.snax-slog-gdpr-accept', function(e) { 3142 e.preventDefault(); 3143 3144 storeCurrentURL(); 3145 3146 window.location.href = $link.attr('href'); 3147 }); 3148 3149 // Cancel GDPR. 3150 $form.on('click', '.snax-slog-gdpr-cancel', function(e) { 3151 e.preventDefault(); 3152 3153 toggleVisiblity(); 3154 }); 3155 }); 3156 } else { 3157 // Social login link requested. 3158 $('.snax-social-login-links').on('click', 'a.snax-social-login', function(e) { 3159 storeCurrentURL(); 3160 }); 3161 } 3162 }); 3163 3164})(jQuery, snax); 3165; 3166jQuery(function($) { 3167 $('[data-opinionstage-embed-url]').each(function( ) { 3168 var $widgetEmbedded = $(this) 3169 var url = $widgetEmbedded.data('opinionstage-embed-url') 3170 3171 $.getJSON( url ). 3172 done( function( data ) { 3173 $widgetEmbedded.after(data.code) 3174 }) 3175 .fail(function(jqxhr, textStatus, error) { 3176 console.error( "[social-polls-by-opinionstage] can't load widget embed code" ) 3177 }) 3178 }) 3179}) 3180; 3181/* global document */ 3182/* global jQuery */ 3183/* global wyr */ 3184 3185// global namespace 3186if ( typeof window.wyr === 'undefined' ) { 3187 window.wyr = {}; 3188} 3189 3190/******** 3191 * 3192 * Core 3193 * 3194 *******/ 3195 3196(function ($, ctx) { 3197 3198 'use strict'; 3199 3200 /** VARS *************************/ 3201 3202 ctx.config = $.parseJSON(window.wyr_front_config); 3203 3204 if (!ctx.config) { 3205 throw 'WYR Error: Global config is not defined!'; 3206 } 3207 3208 /** FUNCTIONS ********************/ 3209 3210 ctx.isTouchDevice = function () { 3211 return ('ontouchstart' in window) || navigator.msMaxTouchPoints; 3212 }; 3213 3214 ctx.createCookie = function (name, value, hours) { 3215 var expires; 3216 3217 if (hours) { 3218 var date = new Date(); 3219 date.setTime(date.getTime() + (hours * 60 * 60 * 1000)); 3220 expires = '; expires=' + date.toUTCString(); 3221 } 3222 else { 3223 expires = ''; 3224 } 3225 3226 document.cookie = name.concat('=', value, expires, '; path=/'); 3227 }; 3228 3229 ctx.readCookie = function (name) { 3230 var nameEQ = name + '='; 3231 var ca = document.cookie.split(';'); 3232 3233 for(var i = 0; i < ca.length; i += 1) { 3234 var c = ca[i]; 3235 while (c.charAt(0) === ' ') { 3236 c = c.substring(1,c.length); 3237 } 3238 3239 if (c.indexOf(nameEQ) === 0) { 3240 return c.substring(nameEQ.length,c.length); 3241 } 3242 } 3243 3244 return null; 3245 }; 3246 3247 ctx.deleteCookie = function (name) { 3248 ctx.createCookie(name, '', -1); 3249 }; 3250 3251})(jQuery, wyr); 3252 3253/********************* 3254 * 3255 * Module: Reactions 3256 * 3257 ********************/ 3258 3259(function ($, ctx) { 3260 3261 'use strict'; 3262 3263 var config; 3264 3265 var selectors = { 3266 'wrapper': '.wyr-reaction-items', 3267 'link': '.wyr-reaction', 3268 'voted': '.wyr-reaction-voted', 3269 'value': '.wyr-reaction-value', 3270 'bar': '.wyr-reaction-bar' 3271 }; 3272 3273 var classes = { 3274 'voted': 'wyr-reaction-voted' 3275 }; 3276 3277 ctx.reactionsSelectors = selectors;
3278 ctx.reactionsClasses = classes; 3279 3280 ctx.reactions = function () { 3281 config = $.parseJSON(window.wyr_front_config); 3282 var $body = $('body'); 3283 3284 // Catch event on wrapper to keep it working after box content reloading 3285 $body.on('click', selectors.link, function (e) { 3286 e.preventDefault(); 3287 3288 var $link = $(this); 3289 var $wrapper = $link.parents(selectors.wrapper); 3290 var nonce = $.trim($link.attr('data-wyr-nonce')); 3291 var postId = parseInt($link.attr('data-wyr-post-id'), 10); 3292 var authorId = parseInt($link.attr('data-wyr-author-id'), 10); 3293 var type = $.trim($link.attr('data-wyr-reaction')); 3294 3295 if ($link.is(selectors.voted)) { 3296 return; 3297 } 3298 3299 ctx.reactionVote({ 3300 'postId': postId, 3301 'authorId': authorId, 3302 'type': type 3303 }, nonce, $wrapper); 3304 }); 3305 3306 // Update reactions for guests. 3307 if (!$body.is('.logged-in')) { 3308 $(selectors.link).each(function () { 3309 var $link = $(this); 3310 var postId = parseInt($link.attr('data-wyr-post-id'), 10); 3311 var type = $.trim($link.attr('data-wyr-reaction')); 3312 var reactionVoted = ctx.readCookie('wyr_vote_'+ type +'_' + postId); 3313 3314 if (reactionVoted) {
3315 $link.addClass(classes.voted); 3316 3317 var value = parseInt(reactionVoted, 10); 3318 3319 if (value && value > 0) { 3320 $link.find(selectors.value).attr('data-raw-value', reactionVoted); 3321 $link.find(selectors.value).text(numberFormat(reactionVoted, config.number_format.decimals, config.number_format.dec_point, config.number_format.thousands_sep)); 3322 } 3323 } else { 3324 $link.removeClass(classes.voted); 3325 } 3326 }); 3327 } 3328 if ($body.is('.logged-in')) { 3329 $(selectors.link).each(function () { 3330 var $link = $(this); 3331 var postId = parseInt($link.attr('data-wyr-post-id'), 10); 3332 var type = $.trim($link.attr('data-wyr-reaction')); 3333 var reactionVoted = ctx.readCookie('wyr_vote_'+ type +'_' + postId); 3334 3335 if (reactionVoted) { 3336 $link.addClass(classes.voted); 3337 } 3338 3339 var value = parseInt(reactionVoted, 10); 3340 3341 if (value && value > 0) { 3342 $link.find(selectors.value).attr('data-raw-value', reactionVoted); 3343 $link.find(selectors.value).text(numberFormat(reactionVoted, config.number_format.decimals, config.number_format.dec_point, config.number_format.thousands_sep)); 3344 } 3345 }); 3346 } 3347 }; 3348 3349 ctx.reactionVote = function (data, nonce, $box) { 3350 if (!config) { 3351 ctx.log('Post voting failed. Global config is not defined!'); 3352 return; 3353 } 3354 3355 var xhr = $.ajax({ 3356 'type': 'POST', 3357 'url': config.ajax_url, 3358 'dataType': 'json', 3359 'data': { 3360 'action': 'wyr_vote_post', 3361 'security': nonce, 3362 'wyr_post_id': data.postId, 3363 'wyr_author_id': data.authorId, 3364 'wyr_vote_type': data.type 3365 } 3366 }); 3367 setTimeout(function(){ 3368 // Update state, without waiting for ajax response. 3369 var $reactions = $box.find(selectors.link); 3370 var reactions = ctx.getNewState($reactions, data.type); 3371 3372 ctx.reactionVoted(data.postId, data.type, $box); 3373 3374 // Update states. 3375 $reactions.each(function () { 3376 var $this = $(this); 3377 3378 var type = $.trim($this.attr('data-wyr-reaction')); 3379 3380 if (typeof reactions[type] !== 'undefined') { 3381 $this.find(selectors.value).attr('data-raw-value', reactions[type].count); 3382 $this.find(selectors.value).text(reactions[type].formatted_count); 3383 $this.find(selectors.bar).css('height', reactions[type].percentage + '%'); 3384 } 3385 }); 3386 }, 200); 3387 3388 xhr.done(function (res) { 3389 if (res.status !== 'success') { 3390 alert(config.error_msg); 3391 } 3392 }); 3393 }; 3394 3395 ctx.getNewState = function($reactions, votedType) { 3396 var state = {}; 3397 var total = 0; 3398 3399 $reactions.each(function () { 3400 var $this = $(this); 3401 var type = $.trim($this.attr('data-wyr-reaction')); 3402 var count = parseInt($this.find(selectors.value).attr('data-raw-value'), 10); 3403 3404 state[type] = { 3405 'count': count, 3406 'formatted_count': numberFormat(count, config.number_format.decimals, config.number_format.dec_point, config.number_format.thousands_sep), 3407 'percentage': '' 3408 }; 3409 3410 total += count; 3411 }); 3412 3413 if (typeof state[votedType] !== 'undefined') { 3414 state[votedType]['count']++; 3415 state[votedType]['formatted_count'] = numberFormat(state[votedType]['count'], config.number_format.decimals, config.number_format.dec_point, config.number_format.thousands_sep); 3416 total++; 3417 } 3418 3419 // Recalculate percentages. 3420 for (var type in state) { 3421 state[type]['percentage'] = Math.round( ( 100 * state[type]['count'] ) / total ); 3422 } 3423 3424 return state; 3425 }; 3426 3427 ctx.reactionVoted = function(postId, type, $box) { 3428 var cookieName = 'wyr_vote_'+ type +'_' + postId; 3429 3430 var $reaction = $box.find('.wyr-reaction-' + type); 3431 var currValue = parseInt($reaction.find(selectors.value).attr('data-raw-value'), 10); 3432 var newValue = currValue + 1; 3433 3434 ctx.createCookie(cookieName, newValue, 12); 3435 3436 // Cookie can't be read immediately so we need to update CSS classes manually.
3437 $reaction.addClass(classes.voted); 3438 }; 3439 3440 var numberFormat = function(number, decimals, decPoint, thousandsSep) { 3441 number = (number + '').replace(/[^0-9+\-Ee.]/g, ''); 3442 var n = !isFinite(+number) ? 0 : +number; 3443 var prec = !isFinite(+decimals) ? 0 : Math.abs(decimals); 3444 var sep = (typeof thousandsSep === 'undefined') ? ',' : thousandsSep; 3445 var dec = (typeof decPoint === 'undefined') ? '.' : decPoint; 3446 var s = ''; 3447 3448 var toFixedFix = function (n, prec) { 3449 if (('' + n).indexOf('e') === -1) { 3450 return +(Math.round(n + 'e+' + prec) + 'e-' + prec); 3451 } else { 3452 var arr = ('' + n).split('e'); 3453 var sig = ''; 3454 if (+arr[1] + prec > 0) { 3455 sig = '+'; 3456 } 3457 3458 return (+(Math.round(+arr[0] + 'e' + sig + (+arr[1] + prec)) + 'e-' + prec)).toFixed(prec); 3459 } 3460 }; 3461 3462 // @todo: for IE parseFloat(0.55).toFixed(0) = 0; 3463 s = (prec ? toFixedFix(n, prec).toString() : '' + Math.round(n)).split('.'); 3464 if (s[0].length > 3) { 3465 s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); 3466 } 3467 if ((s[1] || '').length < prec) { 3468 s[1] = s[1] || ''; 3469 s[1] += new Array(prec - s[1].length + 1).join('0'); 3470 } 3471 3472 return s.join(dec); 3473 }; 3474 3475 // fire 3476 $(document).ready(function () { 3477 ctx.reactions(); 3478 }); 3479 3480})(jQuery, wyr); 3481 3482/******************** 3483 * 3484 * Load More Button 3485 * 3486 ********************/ 3487 3488(function ($, ctx) { 3489 3490 'use strict'; 3491 3492 // prevent triggering the action more than once at the time 3493 var loading = false; 3494 3495 ctx.loadMoreButton = function () { 3496 $('.wyr-load-more').on('click', function (e) { 3497 if (loading) { 3498 return; 3499 } 3500 3501 loading = true; 3502 3503 e.preventDefault(); 3504 3505 var $button = $(this); 3506 var $collectionMore = $button.prev('.wyr-links'); 3507 var url = $button.attr('href'); 3508 3509 // load page 3510 var xhr = $.get(url); 3511 3512 // on success 3513 xhr.done(function (data) { 3514 loading = false; 3515 var collectionSelector = '.wyr-links'; 3516 3517 var $resCollectionItems = $(data).find(collectionSelector).find('li'); 3518 var $newButton = $(data).find('.wyr-load-more'); 3519 $collectionMore.append($resCollectionItems); 3520 $button.after($newButton); 3521 $button.remove(); 3522 ctx.loadMoreButton(); 3523 }); 3524 3525 }); 3526 }; 3527 3528 $(document).ready(function () { 3529 ctx.loadMoreButton(); 3530 }); 3531 3532 })(jQuery, wyr); 3533;
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.