; (()=>{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}))})();; (()=>{var e={2590:function(e){e.exports=function(){"use strict";function e(){return e=Object.assign||function(e){for(var t=1;te.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;n0||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:e0?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)}o.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&&t0?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{var e={7152:function(e){e.exports=function(){"use strict";function e(){return(e=Object.assign||function(e){for(var t=1;te.longSwipesMs?l(p+m*(0h.maxIndex?h.maxIndex:eMath.abs(f)?f:v)===p||l?n.index===b&&d(0=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,0r.max||l<0&&o{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{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{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)}}}}()})()})();; /* global document */ /* global jQuery */ (function ($) { 'use strict'; var loadYoutube = function() { $('.mace-youtube').each(function() { var $youtube = $(this); if($youtube.is('.mace-youtube-loaded')) { return; } var videoUrl = $youtube.attr('data-mace-video'); var thumbUrl = $youtube.attr('data-mace-video-thumb'); var image = $(''); image.attr('src', thumbUrl); // Lazy loading. image.attr({ 'width': 1600, 'height': 900, '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%3E', 'data-src': thumbUrl, 'data-expand': 600 }); image.addClass('lazyload'); image.on('load', function() { $youtube.append( image ); }()); // Click to play YT. $youtube.on('click', function() { $youtube.find('iframe').remove(); var $iframe = $('',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:'',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('').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()});; /** * Timeago is a jQuery plugin that makes it easy to support automatically * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). * * @name timeago * @version 1.5.2 * @requires jQuery v1.2.3+ * @author Ryan McGeary * @license MIT License - http://www.opensource.org/licenses/mit-license.php * * For usage and examples, visit: * http://timeago.yarp.com/ * * Copyright (c) 2008-2015, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org) */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof module === 'object' && typeof module.exports === 'object') { factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { $.timeago = function(timestamp) { if (timestamp instanceof Date) { return inWords(timestamp); } else if (typeof timestamp === "string") { return inWords($.timeago.parse(timestamp)); } else if (typeof timestamp === "number") { return inWords(new Date(timestamp)); } else { return inWords($.timeago.datetime(timestamp)); } }; var $t = $.timeago; $.extend($.timeago, { settings: { refreshMillis: 60000, allowPast: true, allowFuture: false, localeTitle: false, cutoff: 0, autoDispose: true, strings: { prefixAgo: null, prefixFromNow: null, suffixAgo: "ago", suffixFromNow: "from now", inPast: 'any moment now', seconds: "less than a minute", minute: "about a minute", minutes: "%d minutes", hour: "about an hour", hours: "about %d hours", day: "a day", days: "%d days", month: "about a month", months: "%d months", year: "about a year", years: "%d years", wordSeparator: " ", numbers: [] } }, inWords: function(distanceMillis) { if (!this.settings.allowPast && ! this.settings.allowFuture) { throw 'timeago allowPast and allowFuture settings can not both be set to false.'; } var $l = this.settings.strings; var prefix = $l.prefixAgo; var suffix = $l.suffixAgo; if (this.settings.allowFuture) { if (distanceMillis < 0) { prefix = $l.prefixFromNow; suffix = $l.suffixFromNow; } } if (!this.settings.allowPast && distanceMillis >= 0) { return this.settings.strings.inPast; } var seconds = Math.abs(distanceMillis) / 1000; var minutes = seconds / 60; var hours = minutes / 60; var days = hours / 24; var years = days / 365; function substitute(stringOrFunction, number) { var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; var value = ($l.numbers && $l.numbers[number]) || number; return string.replace(/%d/i, value); } var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || seconds < 90 && substitute($l.minute, 1) || minutes < 45 && substitute($l.minutes, Math.round(minutes)) || minutes < 90 && substitute($l.hour, 1) || hours < 24 && substitute($l.hours, Math.round(hours)) || hours < 42 && substitute($l.day, 1) || days < 30 && substitute($l.days, Math.round(days)) || days < 45 && substitute($l.month, 1) || days < 365 && substitute($l.months, Math.round(days / 30)) || years < 1.5 && substitute($l.year, 1) || substitute($l.years, Math.round(years)); var separator = $l.wordSeparator || ""; if ($l.wordSeparator === undefined) { separator = " "; } return $.trim([prefix, words, suffix].join(separator)); }, parse: function(iso8601) { var s = $.trim(iso8601); s = s.replace(/\.\d+/,""); // remove milliseconds s = s.replace(/-/,"/").replace(/-/,"/"); s = s.replace(/T/," ").replace(/Z/," UTC"); s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400 s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900 return new Date(s); }, datetime: function(elem) { var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title"); return $t.parse(iso8601); }, isTime: function(elem) { // jQuery's `is()` doesn't play well with HTML5 in IE return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); } }); // functions that can be called via $(el).timeago('action') // init is default when no action is given // functions are called with context of a single element var functions = { init: function() { var refresh_el = $.proxy(refresh, this); refresh_el(); var $s = $t.settings; if ($s.refreshMillis > 0) { this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis); } }, update: function(timestamp) { var date = (timestamp instanceof Date) ? timestamp : $t.parse(timestamp); $(this).data('timeago', { datetime: date }); if ($t.settings.localeTitle) $(this).attr("title", date.toLocaleString()); refresh.apply(this); }, updateFromDOM: function() { $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) }); refresh.apply(this); }, dispose: function () { if (this._timeagoInterval) { window.clearInterval(this._timeagoInterval); this._timeagoInterval = null; } } }; $.fn.timeago = function(action, options) { var fn = action ? functions[action] : functions.init; if (!fn) { throw new Error("Unknown function name '"+ action +"' for timeago"); } // each over objects here and call the requested function this.each(function() { fn.call(this, options); }); return this; }; function refresh() { var $s = $t.settings; //check if it's still visible if ($s.autoDispose && !$.contains(document.documentElement,this)) { //stop if it has been removed $(this).timeago("dispose"); return this; } var data = prepareData(this); if (!isNaN(data.datetime)) { if ( $s.cutoff == 0 || Math.abs(distance(data.datetime)) < $s.cutoff) { $(this).text(inWords(data.datetime)); } } return this; } function prepareData(element) { element = $(element); if (!element.data("timeago")) { element.data("timeago", { datetime: $t.datetime(element) }); var text = $.trim(element.text()); if ($t.settings.localeTitle) { element.attr("title", element.data('timeago').datetime.toLocaleString()); } else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) { element.attr("title", text); } } return element.data("timeago"); } function inWords(date) { return $t.inWords(distance(date)); } function distance(date) { return (new Date().getTime() - date.getTime()); } // fix for IE6 suckage document.createElement("abbr"); document.createElement("time"); }));; // English (Template) jQuery.timeago.settings.strings = { prefixAgo: null, prefixFromNow: null, suffixAgo: "ago", suffixFromNow: "from now", seconds: "less than a minute", minute: "about a minute", minutes: "%d minutes", hour: "about an hour", hours: "about %d hours", day: "a day", days: "%d days", month: "about a month", months: "%d months", year: "about a year", years: "%d years", wordSeparator: " ", numbers: [] }; ; /* global document */ /* global jQuery */ /* global snax */ /* global alert */ /* global confirm */ /* global console */ /* global grecaptcha */ // globa namespace if ( typeof window.snax === 'undefined' ) { window.snax = {}; } /******** * * Core * *******/ (function ($, ctx) { 'use strict'; /** VARS *************************/ ctx.config = $.parseJSON(window.snax_front_config); if (!ctx.config) { throw 'Snax Error: Global config is not defined!'; } /** FUNCTIONS ********************/ ctx.log = function(msg) { if (typeof console !== 'undefined') { console.log(msg); } }; ctx.inDebugMode = function() { return (typeof ctx.config.debug_mode !== 'undefined' && ctx.config.debug_mode); }; ctx.isTouchDevice = function () { return ('ontouchstart' in window) || navigator.msMaxTouchPoints; }; ctx.createCookie = function (name, value, hours) { var expires; if (hours) { var date = new Date(); date.setTime(date.getTime() + (hours * 60 * 60 * 1000)); expires = '; expires=' + date.toUTCString(); } else { expires = ''; } document.cookie = name.concat('=', value, expires, '; path=/'); }; ctx.readCookie = function (name) { var nameEQ = name + '='; var ca = document.cookie.split(';'); for(var i = 0; i < ca.length; i += 1) { var c = ca[i]; while (c.charAt(0) === ' ') { c = c.substring(1,c.length); } if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); } } return null; }; ctx.deleteCookie = function (name) { ctx.createCookie(name, '', -1); }; ctx.getUrlParameter = function (param) { var sPageURL = decodeURIComponent(window.location.search.substring(1)), sURLVariables = sPageURL.split('&'), sParameterName, i; for (i = 0; i < sURLVariables.length; i++) { sParameterName = sURLVariables[i].split('='); if (sParameterName[0] === param) { return sParameterName[1] === undefined ? true : sParameterName[1]; } } }; })(jQuery, snax); /*********** * * Helpers * ***********/ (function ($, ctx) { /* Media Item Class (image, audio, video) */ ctx.MediaItem = function (data) { // Public scope. var instance = {}; // Constructor. function init() { data = data || {}; data = $.extend({ 'type': 'image', 'title': '', 'source': '', 'refLink': '', 'description': '', 'mediaId': '', 'postId': 0, 'authorId': '', 'status': '', 'parentFormat': 'list', 'origin': 'post', 'legal': false, 'memeTemplate': '' }, data); return instance; } instance.save = function(callback) { callback = callback || function() {}; var ajaxData = { 'action': 'snax_add_media_item', 'security': $('input[name=snax-add-media-item-nonce]').val(), 'snax_title': data.title, 'snax_source': data.source, 'snax_ref_link': data.refLink, 'snax_description': data.description, 'snax_media_id': data.mediaId, 'snax_post_id': data.postId, 'snax_author_id': data.authorId, 'snax_status': data.status, 'snax_parent_format': data.parentFormat, 'snax_origin': data.origin, 'snax_legal': data.legal ? 'accepted' : '', 'snax_type': data.type, 'snax_meme_template': data.memeTemplate }; if (typeof ctx.saveItemImageDataFilter === 'function') { ajaxData = ctx.saveItemImageDataFilter(ajaxData, data); } var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': ajaxData }); xhr.done(function (res) { callback(res); }); }; return init(); }; /* Embed Item Class */ ctx.EmbedItem = function (data) { // Public scope. var instance = {}; // Constructor. function init() { data = data || {}; data = $.extend({ 'type': 'embed', 'title': '', 'source': '', 'refLink': '', 'description': '', 'embedCode': '', 'postId': 0, 'authorId': '', 'status': '', 'parentFormat': 'list', 'origin': 'post', 'legal': false }, data); return instance; } instance.save = function(callback) { callback = callback || function() {}; var ajaxData = { 'action': 'snax_add_embed_item', 'security': $('input[name=snax-add-embed-item-nonce]').val(), 'snax_title': data.title, 'snax_source': data.source, 'snax_ref_link': data.refLink, 'snax_embed_code': data.embedCode, 'snax_description': data.description, 'snax_post_id': data.postId, 'snax_author_id': data.authorId, 'snax_status': data.status, 'snax_parent_format': data.parentFormat, 'snax_origin': data.origin, 'snax_legal': data.legal ? 'accepted' : '' }; if (typeof ctx.saveItemEmbedDataFilter === 'function') { ajaxData = ctx.saveItemEmbedDataFilter(ajaxData, data); } var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': ajaxData }); xhr.done(function (res) { callback(res); }); }; return init(); }; /* Embed Item Class */ ctx.TextItem = function (data) { // Public scope. var instance = {}; // Constructor. function init() { data = data || {}; data = $.extend({ 'type': 'text', 'title': '', 'refLink': '', 'description': '', 'postId': 0, 'authorId': '', 'status': '', 'parentFormat': 'list', 'origin': 'post', 'legal': false }, data); return instance; } instance.save = function(callback) { callback = callback || function() {}; var ajaxData = { 'action': 'snax_add_text_item', 'security': $('input[name=snax-add-text-item-nonce]').val(), 'snax_title': data.title, 'snax_ref_link': data.refLink, 'snax_description': data.description, 'snax_post_id': data.postId, 'snax_author_id': data.authorId, 'snax_status': data.status, 'snax_parent_format': data.parentFormat, 'snax_origin': data.origin, 'snax_legal': data.legal ? 'accepted' : '' }; if (typeof ctx.saveItemTextDataFilter === 'function') { ajaxData = ctx.saveItemTextDataFilter(ajaxData, data); } var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': ajaxData }); xhr.done(function (res) { callback(res); }); }; return init(); }; ctx.deleteItem = function($link, callback) { callback = callback || function() {}; var nonce = $.trim($link.attr('data-snax-nonce')); var itemId = parseInt($link.attr('data-snax-item-id'), 10); var userId = snax.currentUserId; var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': { 'action': 'snax_delete_item', 'security': nonce, 'snax_item_id': itemId, 'snax_user_id': userId } }); xhr.done(function (res) { callback(res); }); }; ctx.setItemAsFeatured = function($link, callback) { callback = callback || function() {}; var nonce = $.trim($link.attr('data-snax-nonce')); var itemId = parseInt($link.attr('data-snax-item-id'), 10); var userId = snax.currentUserId; var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': { 'action': 'snax_set_item_as_featured', 'security': nonce, 'snax_item_id': itemId, 'snax_user_id': userId } }); xhr.done(function (res) { callback(res); }); }; ctx.updateItems = function(items, callback) { callback = callback || function() {}; var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': { 'action': 'snax_update_items', 'security': $('input[name=snax-frontend-submission-nonce]').val(), 'snax_items': items } }); xhr.done(function (res) { callback(res); }); }; ctx.deletePost = function($link, callback) { callback = callback || function() {}; var nonce = $.trim($link.attr('data-snax-nonce')); var postId = parseInt($link.attr('data-snax-post-id'), 10); var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': { 'action': 'snax_delete_post', 'security': nonce, 'snax_post_id': postId } }); xhr.done(function (res) { callback(res); }); }; ctx.loginRequired = function(blocked) { $('body').trigger('snaxLoginRequired', [blocked]); }; ctx.getMediaHtmlTag = function(data, callback) { var xhr = $.ajax({ 'type': 'GET', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': { 'action': 'snax_load_media_tpl', 'snax_media_id': data.mediaId, 'snax_post_id': data.postId, 'snax_type': data.type } }); xhr.done(function (res) { callback(res); }); }; ctx.deleteMedia = function(data, callback) { callback = callback || function() {}; var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': { 'action': 'snax_delete_media', 'security': $('input[name=snax-delete-media-nonce]').val(), 'snax_media_id': data.mediaId, 'snax_author_id': data.authorId } }); xhr.done(function (res) { callback(res); }); }; ctx.updateMediaMetadata = function(data, callback) { callback = callback || function() {}; var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': { 'action': 'snax_update_media_meta', // @todo - use separate nonce or use generic one. 'security': $('input[name=snax-delete-media-nonce]').val(), 'snax_media_id': data.mediaId, 'snax_parent_format': data.parentFormat } }); xhr.done(function (res) { callback(res); }); }; ctx.getEmbedPreview = function(embed_code, callback) { var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': { 'action': 'snax_load_embed_tpl', 'snax_embed_code': embed_code } }); xhr.done(function (res) { callback(res); }); }; ctx.displayFeedback = function(type) { var feedbackTypeClass = 'snax-feedback-' + type; // Try to get type specific feedback first. var $feedback = $('.' + feedbackTypeClass); if ($feedback.length === 0) { return; } ctx.hideFeedback(); // Activate. $feedback.toggleClass('snax-feedback-off snax-feedback-on'); // Show. $('body').addClass('snax-show-feedback'); }; ctx.hideFeedback = function() { // Deactivate all. $('.snax-feedback-on').toggleClass('snax-feedback-on snax-feedback-off'); // Hide all. $('body').removeClass('snax-show-feedback'); }; ctx.isValidUrl = function(url) { return url.match(/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/); }; })(jQuery, snax); /********* * * Common * *********/ (function ($, ctx) { 'use strict'; var selectors = { 'feedbackCloseButton': '.snax-close-button' }; // fire $(document).ready(function () { /* * Close feedback button. */ $(selectors.feedbackCloseButton).on('click', function(e) { e.preventDefault(); snax.hideFeedback(); }); }); })(jQuery, snax); /**************** * * Facebook SDK * ****************/ (function ($, ctx) { 'use strict'; ctx.resetFacebookSDK = function () { $('script#facebook-jssdk').remove(); $('#fb-root').remove(); if (window.FB) { delete window.FB; } }; $('body').on( 'snaxBeforeNewContentReady', function ( e, $newContent ) { if ($newContent.find('.fb-video')) { ctx.resetFacebookSDK(); } } ); })(jQuery, snax); /**************************** * * Module: Media upload form * ***************************/ (function ($, ctx) { 'use strict'; var selectors = { 'form': '.snax-media-upload-form', 'pluploadForm': '.snax-plupload-upload-ui', 'loadFormButton': '.snax-load-form-button' }; ctx.mediaUploadForm = function () { if (typeof snaxPlupload === 'undefined') { return; } $(selectors.form).each(function() { var $form = $(this); var formInsideInactiveTab = $form.parents('.snax-tab-content:not(.snax-tab-content-current)').length > 0; if (!formInsideInactiveTab) { snaxPlupload.initUploader($form); } }); $('body').on('snaxTabContentActive', function (e, $tabContent) { $tabContent.find(selectors.form).each(function () { snaxPlupload.initUploader($(this)); }); } ); $(selectors.loadFormButton).on('click',function() { var $link = $(this); var $form = $link.parents(selectors.form); var formClass = $link.attr('data-snax-rel-class'); $form.find('.' + formClass).toggle(); var $pluploadForm = $form.find(selectors.pluploadForm); $pluploadForm.toggle(); if ($pluploadForm.is(':visible')) { $form.removeClass('snax-custom-form'); } else { $form.addClass('snax-custom-form'); } }); }; // fire $(document).ready(function () { ctx.mediaUploadForm(); }); })(jQuery, snax); /************************* * * Module: Date > Time ago * *************************/ (function ($, ctx) { 'use strict'; var selectors = { 'wrapper': '.snax-time-left', 'dateWrapper': '> .snax-date-wrapper', 'date': '> .snax-date', 'timeWrapper': '> .snax-time-wrapper', 'time': '> .snax-time' }; ctx.timeagoSelectors = selectors; ctx.dateConstans = { 'day_ms': 1000 * 60 * 60 * 24, 'month_ms': 1000 * 60 * 60 * 24 * 30, 'year_ms': 1000 * 60 * 60 * 24 * 356 }; ctx.dateToTimeago = function () { if (!$.fn.timeago) { return; } // store current settings, thanks to $.extend we have a copy without reference to original object var origSettings = $.extend(true, {} , $.timeago.settings); // override $.extend($.timeago.settings, { cutoff: ctx.dateConstans.year_ms, allowFuture: true }); $.extend($.timeago.settings.strings, { suffixFromNow: '' }); // apply $(selectors.wrapper).each(function () { var $wrapper = $(this); var $dateWrapper = $wrapper.find(selectors.dateWrapper); var $date = $dateWrapper.find(selectors.date); var $timeWrapper = $wrapper.find(selectors.timeWrapper); var $time = $timeWrapper.find(selectors.time); var timeLeftText = $.timeago($date.text()); $time.text(timeLeftText); $dateWrapper.removeClass( '.snax-date-wrapper-unfriendly' ); $timeWrapper.removeClass( 'snax-time-wrapper-unfriendly' ); }); // restore $.timeago.settings = origSettings; }; // fire $(document).ready(function () { ctx.dateToTimeago(); }); })(jQuery, snax); /************************** * * Module: Upvote/Downvote * *************************/ (function ($, ctx) { 'use strict'; var locked = false; var selectors = { 'wrapper': '.snax-voting', 'upvoteLink': '.snax-voting-upvote', 'downvoteLink': '.snax-voting-downvote', 'guestVoting': '.snax-guest-voting', 'voted': '.snax-user-voted', 'scoreWrapper': '.snax-voting-score', 'scoreValue': '.snax-voting-score strong' }; var classes = { 'voted': 'snax-user-voted' }; ctx.votesSelectors = selectors; ctx.votesClasses = classes; ctx.votes = function () { // Catch event on wrapper to keep it working after box content reloading $('body').on('click', selectors.upvoteLink + ', ' + selectors.downvoteLink, function (e) { e.preventDefault(); if (locked) { return; } locked = true; var $link = $(this); var voteType = $link.is(selectors.upvoteLink) ? 'upvote' : 'downvote'; var $wrapper = $link.parents(selectors.wrapper); var nonce = $.trim($link.attr('data-snax-nonce')); var itemId = parseInt($link.attr('data-snax-item-id'), 10); var authorId = parseInt($link.attr('data-snax-author-id'), 10); ctx.vote({ 'itemId': itemId, 'authorId': authorId, 'type': voteType }, nonce, $wrapper); }); // Iterate over all voting boxes and update them based on cookie states. $(selectors.wrapper).each(function () { var $this = $(this); var id = parseInt($this.attr('data-snax-item-id'), 10); if (id <= 0) { return; } var typeCookie = 'snax_vote_type_' + id; var scoreCookie = 'snax_vote_score_' + id; var type = ctx.readCookie(typeCookie); var score = ctx.readCookie(scoreCookie); if (!type && !score) { return; } if (score) { ctx.updateVoteScore($this.find(selectors.scoreWrapper), score); } if (type) { var $upVoteLink = $this.find(selectors.upvoteLink); var $downVoteLink = $this.find(selectors.downvoteLink); if ('upvote' === type) { $upVoteLink.addClass(classes.voted); $downVoteLink.removeClass(classes.voted); } else { $downVoteLink.addClass(classes.voted); $upVoteLink.removeClass(classes.voted); } } }); }; ctx.vote = function (data, nonce, $box) { var config = $.parseJSON(window.snax_front_config); if ( $box.find('.snax-login-required').length > 0 ){ return; } if (!config) { ctx.log('Item voting failed. Global config is not defined!'); return; } /* * Apply new voting box state before ajax response. */ var $userVoted = $box.find('.snax-user-voted'); var userUpvoted = $userVoted.length > 0 && $userVoted.is('.snax-voting-upvote'); var userDownvoted = $userVoted.length > 0 && $userVoted.is('.snax-voting-downvote'); var score = parseInt( $box.find('.snax-voting-score').data('snax-voting-score'), 10); var diff = 'upvote' === data.type ? 1 : -1; // Remove all bubbles. $box.find('.snax-voting-bubble').remove(); // User reverted his vote. if (userUpvoted && 'upvote' === data.type || userDownvoted && 'downvote' === data.type) { diff *= -1; $box.find('.snax-user-voted').removeClass('snax-user-voted'); if ( 'upvote' === data.type ) { $box.find('.snax-voting-upvote').append('-1'); } else { $box.find('.snax-voting-downvote').append('+1'); } // User voted opposite. } else if (userUpvoted && 'downvote' === data.type || userDownvoted && 'upvote' === data.type) { diff *= 2; $box.find('.snax-user-voted').removeClass('snax-user-voted'); $box.find('.snax-voting-' + data.type).addClass('snax-user-voted'); if ( 'upvote' === data.type ) { $box.find('.snax-voting-upvote').append('+2'); } else { $box.find('.snax-voting-downvote').append('-2'); } // User added new vote. } else { if ( 'upvote' === data.type ) { $box.find('.snax-voting-upvote').addClass('snax-user-voted').append('+1'); } else { $box.find('.snax-voting-downvote').addClass('snax-user-voted').append('-1'); } } // Update score. ctx.updateVoteScore($box.find(selectors.scoreWrapper), score + diff); // Send ajax. var xhr = $.ajax({ 'type': 'POST', 'url': config.ajax_url, 'dataType': 'json', 'data': { 'action': 'snax_vote_item', 'security': nonce, 'snax_item_id': data.itemId, 'snax_author_id': data.authorId, 'snax_vote_type': data.type, 'snax_user_voted': ctx.readCookie( 'snax_vote_type_' + data.itemId ) } }); // Update state immediately after sending ajax. Don't wait for response. ctx.updateVoteState(data.itemId, data.type, $box); xhr.done(function (res) { locked = false; }); }; ctx.updateVoteState = function(itemId, type, $box) { var typeCookie = 'snax_vote_type_' + itemId; var scoreCookie = 'snax_vote_score_' + itemId; var currentValue = ctx.readCookie(typeCookie); // Cookie can't be read immediately so we need to update CSS classes manually. $box.find(selectors.voted).removeClass(classes.voted); // User voted and now he wants to remove the vote. if (currentValue === type) { ctx.deleteCookie(typeCookie); } else { ctx.createCookie(typeCookie, type, 1); // Cookie can't be read immediately so we need to update CSS classes manually. $box.find('.snax-voting-' + type).addClass(classes.voted); } // Update score. var score = parseInt($box.find(selectors.scoreWrapper).data('snax-voting-score'), 10); ctx.createCookie(scoreCookie, score, 1); }; ctx.updateVoteScore = function($wrapper, score) { var $container = $wrapper.parents('.snax-voting'); score = parseInt(score, 10); var scoreShort = score; var units = ['', 'k', 'M']; var i; for (i = 0; scoreShort >= 1000; i++) { scoreShort /= 1000; } var scoreHtml = +scoreShort.toFixed(1) + units[i]; // Singular? if (1 === Math.abs(score)) { scoreHtml = ctx.config.i18n.points_singular_short_tpl.replace('%s', scoreHtml); } else { scoreHtml = ctx.config.i18n.points_plural_short_tpl.replace('%s', scoreHtml); } // Remove all score related classes. $container.removeClass('snax-voting-0 snax-voting-negative snax-voting-positive'); // Add score related classes. if (0 < score) { $container.addClass( 'snax-voting-positive' ); } else if (0 > score) { $container.addClass( 'snax-voting-negative' ); } else { $container.addClass( 'snax-voting-0' ); } $wrapper.data('snax-voting-score', score); $wrapper.html(scoreHtml); }; // fire $(document).ready(function () { ctx.votes(); }); })(jQuery, snax); /********************* * * Module: Login form * ********************/ (function ($, ctx) { 'use strict'; var selectors = { 'loginTab': '.snax-login-tab', 'loginFormWrapper': '.snax-login-form', 'loginForm': '.snax-login-form #loginform-in-popup', 'forgotTab': '.snax-forgot-pass-tab', 'forgotFormWrapper': '.snax-forgot-pass-form', 'forgotForm': '.snax-forgot-pass-form #lostpasswordform', 'gdprTab': '.snax-gdpr-tab', 'backToLoginTab': '.snax-back-to-login-tab', 'loginErrorMessage': '.snax-login-form .snax-login-error-message', 'forgotErrorMessage': '.snax-forgot-pass-form .snax-forgot-pass-error-message', 'forgotSuccessMessage': '.snax-forgot-pass-form .snax-forgot-pass-success-message', 'user': { 'loginInput': '#user_login', 'emailInput': '#user_email', 'passwordInput': '#user_pass' }, 'forgotPasswordLink': '#snax-popup-content .snax-link-forgot-pass', 'passwordWrapper': '#snax-popup-content .login-password', 'connectWithLabel': '#snax-popup-content .wp-social-login-connect-with', 'resetTab': '.snax-reset-tab' }; ctx.loginFormSelectors = selectors; var useReCaptcha; var reCaptchaToken; var urlAction = ctx.getUrlParameter(ctx.config.login_popup_url_var); ctx.loginForm = function () { useReCaptcha = ctx.config.use_login_recaptcha; // Add input placeholders. $.each(selectors.user, function (id, selector) { var $input = $(selector); var $label = $input.prev('label'); if ($label.length > 0) { $input.attr('placeholder', $label.text()); } }); // Move forgot link after password field. $(selectors.passwordWrapper + ' input').after( $(selectors.forgotPasswordLink) ); // Wrap label with

tag. $(selectors.connectWithLabel).wrapInner( '

' ); $('.wp-social-login-provider').on('click', function(e) { var $that = $(this); if ($('.snax-wpsl-gdpr-consent input').length > 0) { if (!$('.snax-wpsl-gdpr-consent input').is(':checked')) { e.stopPropagation(); e.stopImmediatePropagation(); e.preventDefault(); handleLoginGDPR($that); } } }); handleLoginAction(); handleForgotPassAction(); handleTabsSwitch(); if (urlAction==='reset_password'){ $(selectors.loginTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); $(selectors.resetTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); } if (urlAction==='forgot_password'){ $(selectors.loginTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); $(selectors.forgotTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); } $('body').on('snaxPopupOpened', function(e, action) { if (useReCaptcha && 'login' === action) { loadReCaptcha(); } }); }; var handleLoginGDPR = function($clickedProvider) { $(selectors.loginTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); $(selectors.gdprTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); $('.snax-login-gdpr-accept').on('click', function() { $('.snax-wpsl-gdpr-consent input').prop('checked', true); $(selectors.gdprTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); $(selectors.loginTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); var redirectTo = $clickedProvider.attr('href'); window.location.href = redirectTo; }); }; var handleLoginAction = function() { $(selectors.loginForm).on('submit', function(e) { e.preventDefault(); var $form = $(this); var $errorMessage = $(selectors.loginErrorMessage); var requestData = { 'action': 'snax_login' }; $.each($form.serializeArray(), function(i, field) { requestData[field.name] = field.value; }); // Read config directly, DO NOT use any reference. We change the value while auto logging. if (ctx.config.use_login_recaptcha) { if (!reCaptchaToken) { $errorMessage.html( '

' + ctx.config.i18n.recaptcha_invalid + '

'); return; } } // Clear error message. $errorMessage.html('

' + ctx.config.i18n.user_is_logging + '

'); var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': requestData }); xhr.done(function (res) { if ('success' === res.status) { var redirectTo = res.args.redirect_url; if (!redirectTo) { redirectTo = window.location.href; } if (redirectTo.indexOf('?') > 0){ redirectTo += '&' + ctx.config.login_success_var + '=true'; }else{ redirectTo += '?' + ctx.config.login_success_var + '=true'; } window.location.href = redirectTo; } else { if (res.message) { $errorMessage.html( '

' + res.message + '

'); } if (useReCaptcha) { grecaptcha.reset(); } } }); // Reload page if failed. xhr.fail(function() { var reloadUrl = window.location.href; if (reloadUrl.indexOf('?') > 0){ reloadUrl += '&' + ctx.config.login_success_var + '=false'; }else{ reloadUrl += '?' + ctx.config.login_success_var + '=false'; } window.location.href = reloadUrl; }); }); }; var handleForgotPassAction = function() { $(selectors.forgotForm).on('submit', function(e) { e.preventDefault(); var $form = $(this); var $errorMessage = $(selectors.forgotErrorMessage); var $successMessage = $(selectors.forgotSuccessMessage); var requestData = { 'action': 'snax_forgot_pass' }; $.each($form.serializeArray(), function(i, field) { requestData[field.name] = field.value; }); // Clear messages. $errorMessage.text(''); $successMessage.text(''); var xhr = $.ajax({ 'type': 'POST', 'url': ctx.config.ajax_url, 'dataType': 'json', 'data': requestData }); xhr.done(function (res) { if ('success' === res.status) { if (res.message) { $successMessage.html( '

' + res.message + '

'); } } else { if (res.message) { $errorMessage.html( '

' + res.message + '

'); } } }); }); }; var handleTabsSwitch = function() { $(selectors.forgotPasswordLink).on('click', function(e) { e.preventDefault(); $(selectors.loginTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); $(selectors.forgotTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); }); $(selectors.backToLoginTab).on('click', function(e) { e.preventDefault(); $(selectors.resetTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); $(selectors.forgotTab).removeClass('snax-tab-active').addClass('snax-tab-inactive'); $(selectors.loginTab).removeClass('snax-tab-inactive').addClass('snax-tab-active'); }); }; var loadReCaptcha = function() { var apiUrl = ctx.config.recaptcha_api_url; var ver = ctx.config.recaptcha_version; var siteKey = ctx.config.recaptcha_site_key; if (!siteKey || !apiUrl) { return; } var renderLoginReCaptcha = function() { try { if ('30' === ver) { grecaptcha.execute( siteKey, { action: 'login' } ).then( function( token ) { $('#snax-login-recaptcha').html(''); reCaptchaEnteredCorrectly(token); } ); } else { grecaptcha.render('snax-login-recaptcha', { 'sitekey' : siteKey, 'callback': reCaptchaEnteredCorrectly }); } } catch (error) {} }; // Google reCaptcha API loaded. if (typeof grecaptcha !== 'undefined') { renderLoginReCaptcha(); } else { // API not loaded. Register callback and load script. window.snaxReCaptchaOnloadCallback = function() { renderLoginReCaptcha(); }; if ('30' === ver) { $('head').append('