news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
news
'use strict'; function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } var HurrytimerAction = /*#__PURE__*/function () { function HurrytimerAction(elementRef, config) { _classCallCheck(this, HurrytimerAction); this.elementRef = elementRef; this.config = config; } _createClass(HurrytimerAction, [{ key: "changeStockStatus", value: function changeStockStatus(campaignId, status) { if (!jQuery.post) return; jQuery.post(hurrytimer_ajax_object.ajax_url, { nonce: hurrytimer_ajax_object.ajax_nonce, action: 'change_stock_status', status: status, campaign_id: campaignId }); } }, { key: "hasMessageAction", value: function hasMessageAction() { var _iterator = _createForOfIteratorHelper(this.config.actions), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var action = _step.value; if (action['id'] == hurrytimer_ajax_object.actionsOptions.displayMessage) { return true; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return false; } /** * Hide campaign. */ }, { key: "hide", value: function hide() { // We don't hide campaign if there is a message to display. if (this.hasMessageAction()) { return; } var stickyBar = this.elementRef.closest('.hurrytimer-sticky'); if (stickyBar.length) { stickyBar.addClass('hurryt-loading'); } else { this.elementRef.addClass('hurryt-loading'); } } /** * Redirect to the given url. * @param url */ }, { key: "hideAddToCartButton", value: /** * Hide "Add to cart" button. * @return void */ function hideAddToCartButton() { var $addToCartForm = jQuery('.single_add_to_cart_button').closest('form.cart'); if ($addToCartForm.length) { $addToCartForm.remove(); } } /** * Display message by replacing campaign content with the given message. * @param message */ }, { key: "displayMessage", value: function displayMessage(message) { var messageHtml = "
").concat(message, "
"); this.elementRef.find('.hurrytimer-campaign-message').remove(); var stickyBar = this.elementRef.closest('.hurrytimer-sticky'); if (stickyBar.length) { this.elementRef.addClass('hurryt-loading'); stickyBar.find('.hurrytimer-sticky-inner').append(messageHtml); } else { this.elementRef.addClass('hurryt-loading'); this.elementRef.after(messageHtml); } } }, { key: "expireCoupon", value: function expireCoupon(code, message) { // Remove coupon if applied but expired and the checkout form has not been placed yet. jQuery('form.checkout').on('checkout_place_order', function (event) { validate_expired_coupon_checkout(event); }); document.addEventListener("DOMContentLoaded", function () { validate_expired_coupon_checkout(); }); function validate_expired_coupon_checkout(event) { // Get applied coupons var appliedCoupons = jQuery('.woocommerce-checkout-review-order-table').find('.cart-discount'); var isCouponExpired = false; appliedCoupons.each(function () { var couponCode = jQuery(this).find('.woocommerce-remove-coupon').data('coupon'); if (couponCode.toLowerCase() === code.toLowerCase()) { isCouponExpired = true; return false; } }); if (isCouponExpired) { var errorHtml = ''; var noticeGroup = jQuery('.woocommerce-NoticeGroup-checkout'); if (noticeGroup.length) { noticeGroup.html(errorHtml); } else { var noticeGroupHtml = "
".concat(errorHtml, "
"); jQuery('form.checkout').before(noticeGroupHtml); jQuery('html, body').animate({ scrollTop: jQuery('.woocommerce-NoticeGroup-checkout').offset().top - 100 }); } var container = jQuery('.woocommerce-checkout-review-order'); container.addClass('processing').block({ message: null, overlayCSS: { background: '#fff', opacity: 0.6 } }); jQuery.ajax({ type: 'POST', url: wc_checkout_params.wc_ajax_url.toString().replace('%%endpoint%%', 'remove_coupon'), data: { security: wc_checkout_params.remove_coupon_nonce, coupon: code }, success: function success(response) { container.removeClass('processing').unblock(); if (response) { jQuery(document.body).trigger('removed_coupon_in_checkout', [code]); jQuery(document.body).trigger('update_checkout', { update_shipping_method: false }); } }, error: function error(jqXHR) { if (wc_checkout_params.debug_mode) { console.log(jqXHR.responseText); } } }); if (event) { event.preventDefault(); } return false; } } // WC 7.5.x var originalFetch = window.fetch; window.fetch = function (url, options) { if (url.indexOf('wc-ajax=apply_coupon') !== -1) { var body = options.body; var searchParams = new URLSearchParams(body); var couponCode = searchParams.get('coupon_code'); if (typeof couponCode === 'string' && couponCode.toLowerCase() === code.toLowerCase()) { jQuery('.woocommerce-error').remove(); var $target = jQuery('.woocommerce-notices-wrapper:first') || jQuery('.cart-empty').closest('.woocommerce') || jQuery('.woocommerce-cart-form'); $target.prepend("")); jQuery('.checkout_coupon').removeClass('processing').unblock(); jQuery('.woocommerce-cart-form').removeClass('processing').unblock(); return Promise.reject(new Error(message)); } } else if (url.indexOf('/wc/store/v1/batch') !== -1) { var body = options.body; var requests = JSON.parse(body).requests || []; var abortController = new AbortController(); options.signal = abortController.signal; requests.forEach(function (req) { if (req.path === '/wc/store/v1/cart/apply-coupon') { var couponCode = req.body.code; if (typeof couponCode === 'string' && couponCode.toLowerCase() === code.toLowerCase()) { abortController.abort(); throw new Error(message); } } }); } return originalFetch.apply(this, [url, options]); }; // WC 7.4.x jQuery.ajaxPrefilter(function (opts, originOpts, jqXHR) { if (opts.url.indexOf('wc-ajax=apply_coupon') === -1) return; if (typeof originOpts.data.coupon_code !== 'string' || typeof code !== 'string' || originOpts.data.coupon_code.toLowerCase() !== code.toLowerCase()) return; jqXHR.abort(); jQuery('.woocommerce-error').remove(); var $target = jQuery('.woocommerce-notices-wrapper:first') || jQuery('.cart-empty').closest('.woocommerce') || jQuery('.woocommerce-cart-form'); $target.prepend("")); jQuery('.checkout_coupon').removeClass('processing').unblock(); jQuery('.woocommerce-cart-form').removeClass('processing').unblock(); }); } }], [{ key: "redirect", value: function redirect(url) { document.body.style.opacity = '0'; document.body.style.display = 'none'; if (url.trim().length === 0) { return; } if (hurrytimer_ajax_object.redirect_no_back) { window.location.replace(url); } else { window.location.href = url; } } }]); return HurrytimerAction; }(); "use strict"; function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } /* * global hurrytimer_ajax_object */ var HurrytimerCampaign = /*#__PURE__*/function () { function HurrytimerCampaign(elementRef, config, state) { _classCallCheck(this, HurrytimerCampaign); this.config = config; this.elementRef = elementRef; this.actionsOptions = hurrytimer_ajax_object.actionsOptions; this.restartOptions = hurrytimer_ajax_object.restartOptions; this.recurTimeoutId = -1; this.recurIntervalId = -1; this.retryCount = 0; this.startEventDispatched = false; this.state = state; this.restartIntervalId = -1; this.currentEndDate = null; } /** * @param endDateInMS * @return void */ _createClass(HurrytimerCampaign, [{ key: "setCookie", value: function setCookie(endDateInMS) { var options = { expires: 365 }; if (hurrytimer_ajax_object.COOKIEPATH) { options.path = hurrytimer_ajax_object.COOKIEPATH; } if (hurrytimer_ajax_object.COOKIE_DOMAIN) { options.domain = hurrytimer_ajax_object.COOKIE_DOMAIN; } Cookies.set(this.config.cookieName, endDateInMS, options); if (this.config.reset_token) { Cookies.set("".concat(this.config.cookieName, "_reset_token"), this.config.reset_token, { expires: 365 }); } } /** * Returns end date for the given duration. * @return {Date} */ }, { key: "getEndDate", value: function getEndDate() { // Evergreen or recurring if (this.config.isRegular) { return new Date(this.config.endDate); } var date = new Date(parseInt(this.config.endDate)); if (!this.isValidDate(date) || !this.config.endDate || this.should_reset() || this.allowRestart() || this.config.reload_reset) { if (_typeof(date) === 'object' && date.setTime != undefined) { this.unDismissStickyBar(); date.setTime(this.calculateDate().getTime()); } } this.setCookie(date.getTime()); this.updateTimestamp(date.getTime()); this.currentEndDate = date; return date; } /** * Check if the given date is valid. * @param {*} d */ }, { key: "isValidDate", value: function isValidDate(d) { return Object.prototype.toString.call(d) === '[object Date]' && !isNaN(d.getTime()); } /** * This is useful to force timestamp update when the page is cached. */ }, { key: "updateTimestamp", value: function updateTimestamp(endDateTimeTS) { if (jQuery.ajax === undefined) return; var args = { url: hurrytimer_ajax_object.ajax_url, async: true, type: 'POST', data: { nonce: hurrytimer_ajax_object.ajax_nonce, timestamp: endDateTimeTS, cid: this.config.id, action: 'hurryt/update_timestamp' } }; jQuery.ajax(args); } /** * Returns true if the campaign should reset. * * @return {number} */ }, { key: "should_reset", value: function should_reset() { return this.config.should_reset; } /** * Remove sticky bar dismiss if available for current given campaign. */ }, { key: "unDismissStickyBar", value: function unDismissStickyBar() { Cookies.remove("_ht_CDT-".concat(this.config.id, "_dismissed")); } /** * Returns true if the campaign will restart. * @return {boolean} */ }, { key: "allowRestart", value: function allowRestart() { if (this.config.isRegular) return false; return this.isExpired() && (this.allowRestartImmediately() || this.allowRestartAfterReload() || this.durationSinceExpiryIsOver()); } /** * Campaign expired. */ }, { key: "isExpired", value: function isExpired() { var today = new Date(); return this.config.endDate < today; } }, { key: "duratinSinceExpiration", value: function duratinSinceExpiration() { var endDate = this.currentEndDate || this.config.endDate; if (!endDate) { return 0; } var now = new Date(); var diff = now.getTime() - endDate; return diff / 1000; } }, { key: "durationSinceExpiryIsOver", value: function durationSinceExpiryIsOver() { return this.shouldRestartAfterDuration() && this.duratinSinceExpiration() >= this.config.restart_duration; } /** * Restart on refresh. * * @returns {boolean} */ }, { key: "allowRestartAfterReload", value: function allowRestartAfterReload() { return parseInt(this.config.restart) === parseInt(this.restartOptions.afterReload); } /** * Restart immediatly. * * @returns {boolean} */ }, { key: "allowRestartImmediately", value: function allowRestartImmediately() { return parseInt(this.config.restart) === parseInt(this.restartOptions.immediately); } }, { key: "shouldRestartAfterDuration", value: function shouldRestartAfterDuration() { return this.config.restart == this.restartOptions.after_duration; } /** * Returns true if the campaign has an action. */ }, { key: "hasAction", value: function hasAction() { return this.config.actions.length; } /** * Calculate date based on the given duration. * @return {Date} */ }, { key: "calculateDate", value: function calculateDate() { var date = new Date(); date.setSeconds(date.getSeconds() + this.config.duration); return date; } /** * Run registered actions. */ }, { key: "executeActions", value: function executeActions() { if (parseInt(hurrytimer_ajax_object.disable_actions) === 1) { return false; } // No action, abort. if (this.hasAction()) { var _iterator = _createForOfIteratorHelper(this.config.actions), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var action = _step.value; var actionManager = new HurrytimerAction(this.elementRef, this.config); if (this.config.run_in_background) { if (action['id'] == this.actionsOptions.expire_coupon) { actionManager.expireCoupon(action['coupon'], hurrytimer_ajax_object.expire_coupon_message); } } else { switch (action['id']) { case this.actionsOptions.redirect: HurrytimerAction.redirect(action['redirectUrl']); break; case this.actionsOptions.displayMessage: actionManager.displayMessage(action['message']); break; case this.actionsOptions.hideAddToCartButton: actionManager.hideAddToCartButton(); break; case this.actionsOptions.stockStatus: if (this.config.isRegular) { actionManager.changeStockStatus(this.config.id, action['wcStockStatus']); } break; case this.actionsOptions.hide: actionManager.hide(); break; } } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } } }, { key: "maybeShowCampaign", value: function maybeShowCampaign() { if (this.elementRef.length && !this.config.run_in_background) { // Remove message tag if present. var $message = this.elementRef.parent().find(".hurrytimer-campaign-message[data-id=\"".concat(this.config.id, "\"]")); if ($message.length) { $message.remove(); } this.elementRef.removeClass('hurryt-loading'); } var stickyBar = this.elementRef.closest('.hurrytimer-sticky'); if (stickyBar.length) { // Remove message tag if present. var _$message = this.elementRef.find('.hurrytimer-campaign-message'); if (_$message.length) { _$message.remove(); } stickyBar.removeClass('hurryt-loading'); } } /** * Maybe run countdown timer. */ }, { key: "waitThenRun", value: function waitThenRun() { var _this = this; this.restartIntervalId = setInterval(function () { if (_this.durationSinceExpiryIsOver()) { clearInterval(_this.restartIntervalId); _this.run(); } }, 1000); } }, { key: "run", value: function run() { var _this2 = this; this.triggerInitEvent(); this.elementRef.countdown(this.getEndDate(), function (e) { return _this2.onCountdownUpdate(e); }); var stickyBar = this.elementRef.closest('.hurrytimer-sticky'); this.handleStickyBar(stickyBar); } /** * Handle sticky bar visibility. * @param {*} stickyBar */ }, { key: "handleStickyBar", value: function handleStickyBar(stickyBar) { var _this3 = this; if (stickyBar.length === 0) return; var dismissCookie = Cookies.get("_ht_CDT-".concat(this.config.id, "_dismissed")); // Stick bar hasn't been dismissed. if (dismissCookie == undefined) { stickyBar.on('click', '.hurrytimer-sticky-close', function () { return _this3.onStickyBarDismiss(stickyBar); }); } else { this.hideStickyBar(stickyBar); } } /** * Hide Sticky Bar * @param {*} stickyBar */ }, { key: "hideStickyBar", value: function hideStickyBar(stickyBar) { if (stickyBar.length === 0) return; var isTopPinned = stickyBar.css('top') === '0px'; stickyBar.remove(); if (isTopPinned) { jQuery('body').css('margin-top', 0); } else { jQuery('body').css('margin-bottom', 0); } } /** * Handle sticky bar dismiss. */ }, { key: "onStickyBarDismiss", value: function onStickyBarDismiss(stickyBar) { this.hideStickyBar(stickyBar); Cookies.set("_ht_CDT-".concat(this.config.id, "_dismissed"), '1', { expires: +this.config.sticky_bar_hide_timeout }); } /** * Countdown timer start callback. * @param event */ }, { key: "onCountdownUpdate", value: function onCountdownUpdate(event) { this.render(event); this.maybeShowCampaign(); if (event.elapsed && event.type === 'finish') { this.executeActions(); this.triggerFinishEvent(); this.maybeRecur(); if (this.allowRestartImmediately()) { this.run(); } if (this.shouldRestartAfterDuration()) { this.waitThenRun(); } } } }, { key: "triggerFinishEvent", value: function triggerFinishEvent() { var params = { id: this.config.id, mode: this.config.mode, endAt: this.config.endDate }; this.elementRef.trigger('hurryt:finished', params); } }, { key: "triggerInitEvent", value: function triggerInitEvent() { var params = { id: this.config.id, mode: this.config.mode, endAt: this.config.endDate }; jQuery('.hurrytimer-campaign').trigger('hurryt:init', params); } }, { key: "triggerStartEvent", value: function triggerStartEvent() { if (!this.startEventDispatched) { var params = { id: this.config.id, mode: this.config.mode, endAt: this.config.endDate }; this.elementRef.trigger('hurryt:started', params); this.startEventDispatched = true; } } /** * Render countdown timer. * @param event */ }, { key: "render", value: function render(event) { if (hurrytimer_ajax_object.run_in_background) { this.elementRef.html(''); } else { this.elementRef.find('.hurrytimer-timer').html(event.strftime(this.config.template)); } this.triggerStartEvent(); } /** * Calculate the remaining time until the next recurrence. * * @return int */ }, { key: "willRecurNow", value: function willRecurNow() { var now = new Date(); var prev_recurrence_time = this.getEndDate().getTime() + this.config.timeToNextRecurrence * 1000; return now.getTime() >= prev_recurrence_time; } /** * Run the next recurrence if available. */ }, { key: "maybeRecur", value: function maybeRecur() { var _this4 = this; // Not a recurring campaign. if (!this.config.recurr) return; // the jQuery ajax function is required to fetch the next recurrence. if (jQuery.ajax === undefined) return; clearTimeout(this.recurTimeoutId); clearInterval(this.recurIntervalId); this.recurIntervalId = setInterval(function () { if (!_this4.willRecurNow()) { return; } clearInterval(_this4.recurIntervalId); jQuery.ajax({ url: hurrytimer_ajax_object.ajax_url, data: { action: 'next_recurrence', nonce: hurrytimer_ajax_object.ajax_nonce, id: _this4.config.id }, error: function error() { if (_this4.retryCount === 10) return; _this4.retryCount++; setTimeout(function () { _this4.maybeRecur(); }, 1000); }, success: function success(_ref) { var data = _ref.data; _this4.retryCount = 0; if (!data) return; if (isNaN(data.endTimestamp)) { return; } _this4.config.endDate = data.endTimestamp; // TODO: Handle lateness: // retry for one minute if the received end date is still expired. _this4.run(); } }); }, 1000); } }]); return HurrytimerCampaign; }(); 'use strict'; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } (function ($) { // TODO: delete `state`. var state = { reseting: [] }; var $body = $('body'); function onElementInserted(containerSelector, elementSelector, callback) { var onMutationsObserved = function onMutationsObserved(mutations) { mutations.forEach(function (mutation) { if (mutation.addedNodes.length) { var elements = $(mutation.addedNodes).find(elementSelector); for (var i = 0, len = elements.length; i < len; i++) { callback(elements[i]); } } }); }; var target = $(containerSelector)[0]; var config = { childList: true, subtree: true }; var MutationObserver = window.MutationObserver || window.WebKitMutationObserver; var observer = new MutationObserver(onMutationsObserved); observer.observe(target, config); } document.addEventListener('DOMContentLoaded', function () { var initialElements = document.querySelectorAll('.hurrytimer-campaign'); initialElements.forEach(initCallback); onElementInserted('body', '.hurrytimer-campaign', initCallback); }); function initCallback(e) { if ($(e).parents('div[data-elementor-type=popup]').length === 0) { runCampaign($(e)); } } $(document).on('elementor/popup/show', function (event, id) { // Run only campaigns within a Elementor popup. $(".elementor-".concat(id, " .hurrytimer-campaign")).each(function () { runCampaign($(this)); }); }); /** * * @param $campaign jQuery */ function runCampaign($campaign) { // TODO: Inject config object in the tag or inline. var config = $campaign.data('config'); if (config === undefined) return; // Check if the config object is corrupt. if (_typeof(config) !== 'object') { config = JSON.parse(config.replace(/\s+/g, " ")); } $campaign.removeAttr('data-config'); $campaign.trigger('hurryt:pre-init', { id: config.id, mode: config.mode, endAt: config.endAt }); var $sticky = $campaign.closest('.hurrytimer-sticky'); // Display sticky bar if present. if ($sticky.length) { $body.append($sticky); $(window).resize(function () { if ($sticky.css('top') === '0px') { // Pin at the top. $body.css('margin-top', $sticky.outerHeight()); } else { // Pin at the bottom. $body.css('margin-bottom', $sticky.outerHeight()); } }); setTimeout(function () { $(window).trigger('resize'); }); } new HurrytimerCampaign($campaign, config, state).run(); } })(jQuery);