adding a url variable to disable popup
-
modified the script to do this…
/*!
* WmpciPop 1.0.0 (Modified to support ?popup=none, 10min suppression)
* https://astoundify.com
*
* Copyright (c) 2021 Astoundify
*/
(function (WmpciPop, undefined) {
'use strict';
// set default settings
var settings = {
// set default cover id
coverId: 'wmpci-popup-cover',
// duration (in days) before it pops up again
expires: 1,
// close if someone clicks an element with this class and prevent default action
closeClassNoDefault: 'wmpci-popup-close',
// close if someone clicks an element with this class and continue default action
closeClassDefault: 'wmpci-close-go',
// change the cookie name
cookieName: '_Wmpci_Popup',
// on popup open function callback
onPopUpOpen: null,
// on popup close function callback
onPopUpClose: null,
// hash to append to url to force display of popup
forceHash: 'splash',
// hash to append to url to delay popup for 1 day
delayHash: 'go',
// close if the user clicks escape
closeOnEscape: true,
// set an optional delay (in milliseconds) before showing the popup
delay: 10000,
// automatically close the popup after a set amount of time (in milliseconds)
hideAfter: null
},
// grab the elements to be used
$el = {
html: document.getElementsByTagName('html')[0],
cover: null, // filled after settings merge
closeClassDefaultEls: null,
closeClassNoDefaultEls: null
},
/**
* Helper methods
*/
util = {
hasClass: function(el, name) {
return new RegExp('(\\s|^)' + name + '(\\s|$)').test(el.className);
},
addClass: function(el, name) {
if (!util.hasClass(el, name)) {
el.className += (el.className ? ' ' : '') + name;
}
},
removeClass: function(el, name) {
if (util.hasClass(el, name)) {
el.className = el.className.replace(new RegExp('(\\s|^)' + name + '(\\s|$)'), ' ').replace(/^\s+|\s+$/g, '');
}
},
addListener: function(target, type, handler) {
if (target.addEventListener) {
target.addEventListener(type, handler, false);
} else if (target.attachEvent) {
target.attachEvent('on' + type, handler);
}
},
removeListener: function(target, type, handler) {
if (target.removeEventListener) {
target.removeEventListener(type, handler, false);
} else if (target.detachEvent) {
target.detachEvent('on' + type, handler);
}
},
isFunction: function(functionToCheck) {
var getType = {};
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
},
// days can be fractional
setCookie: function(name, days) {
var date = new Date();
date.setTime(+date + (days * 86400000));
document.cookie = name + '=true; expires=' + date.toGMTString() + '; path=/';
},
hasCookie: function(name) {
return document.cookie.indexOf(name) !== -1;
},
hashExists: function(hash) {
return window.location.hash.indexOf(hash) !== -1;
},
preventDefault: function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
mergeObj: function(obj1, obj2) {
for (var attr in obj2) {
obj1[attr] = obj2[attr];
}
}
},
// --- Suppression helpers ---
getPopupQueryValue = function() {
try {
var params = new URLSearchParams(window.location.search);
return (params.get('popup') || '').toLowerCase();
} catch (e) {
return '';
}
},
shouldSuppressByQuery = function() {
var v = getPopupQueryValue();
return v === 'none' || v === '0' || v === 'false' || v === 'off';
},
minutesToDays = function(min) {
return min / (24 * 60);
},
suppression = {
active: false,
observer: null,
// Make suppression bulletproof against late calls / class toggles
engage: function() {
if (this.active) return;
this.active = true;
// 1) Immediately remove the open class if present
util.removeClass($el.html, 'wmpci-popup-open');
// 2) Monkey-patch util.addClass to ignore the popup-open class while suppressed
var _origAddClass = util.addClass;
util.addClass = function(el, name) {
if (name === 'wmpci-popup-open' && suppression.active) {
return; // ignore
}
_origAddClass(el, name);
};
// 3) MutationObserver to auto-remove if some other code forces it
try {
this.observer = new MutationObserver(function(mutations) {
for (var i = 0; i < mutations.length; i++) {
if (mutations[i].attributeName === 'class') {
util.removeClass($el.html, 'wmpci-popup-open');
}
}
});
this.observer.observe($el.html, { attributes: true, attributeFilter: ['class'] });
} catch (e) {
// no-op if MutationObserver not available
}
},
disengage: function() {
this.active = false;
if (this.observer) {
try { this.observer.disconnect(); } catch (e) {}
this.observer = null;
}
}
},
/**
* Private Methods
*/
// close popup when user hits escape button
onDocUp = function(e) {
if (settings.closeOnEscape && e.keyCode === 27) {
WmpciPop.close();
}
},
openCallback = function() {
if (settings.onPopUpOpen !== null) {
if (util.isFunction(settings.onPopUpOpen)) {
settings.onPopUpOpen.call();
} else {
throw new TypeError('WmpciPop open callback must be a function.');
}
}
},
closeCallback = function() {
if (settings.onPopUpClose !== null) {
if (util.isFunction(settings.onPopUpClose)) {
settings.onPopUpClose.call();
} else {
throw new TypeError('WmpciPop close callback must be a function.');
}
}
};
/**
* Public methods
*/
WmpciPop.open = function() {
// Hard guard: never open while suppressed
if (suppression.active || shouldSuppressByQuery() || util.hasCookie(settings.cookieName)) {
// If suppression is intended due to query, extend for 10 minutes
if (shouldSuppressByQuery()) {
util.setCookie(settings.cookieName, minutesToDays(10));
suppression.engage();
}
return;
}
var i, len;
if (util.hashExists(settings.delayHash)) {
util.setCookie(settings.cookieName, 1); // delayHash means set for 1 day
return;
}
// (Re)resolve elements in case DOM changed
$el.cover = document.getElementById(settings.coverId);
$el.closeClassDefaultEls = document.querySelectorAll('.' + settings.closeClassDefault);
$el.closeClassNoDefaultEls = document.querySelectorAll('.' + settings.closeClassNoDefault);
util.addClass($el.html, 'wmpci-popup-open');
// bind close events and prevent default event
if ($el.closeClassNoDefaultEls && $el.closeClassNoDefaultEls.length > 0) {
for (i = 0, len = $el.closeClassNoDefaultEls.length; i < len; i++) {
util.addListener($el.closeClassNoDefaultEls[i], 'click', function(e) {
if (e.target === this) {
util.preventDefault(e);
WmpciPop.close();
}
});
}
}
// bind close events and continue with default event
if ($el.closeClassDefaultEls && $el.closeClassDefaultEls.length > 0) {
for (i = 0, len = $el.closeClassDefaultEls.length; i < len; i++) {
util.addListener($el.closeClassDefaultEls[i], 'click', function(e) {
if (e.target === this) {
WmpciPop.close();
}
});
}
}
// bind escape detection to document
util.addListener(document, 'keyup', onDocUp);
openCallback();
};
WmpciPop.close = function(e) {
util.removeClass($el.html, 'wmpci-popup-open');
util.setCookie(settings.cookieName, settings.expires);
// unbind escape detection to document
util.removeListener(document, 'keyup', onDocUp);
closeCallback();
};
WmpciPop.init = function(options) {
if (!navigator.cookieEnabled) return;
util.mergeObj(settings, options);
// Resolve elements after settings arrive
$el.cover = document.getElementById(settings.coverId);
$el.closeClassDefaultEls = document.querySelectorAll('.' + settings.closeClassDefault);
$el.closeClassNoDefaultEls = document.querySelectorAll('.' + settings.closeClassNoDefault);
// If ?popup=none (or false/off/0), suppress and set 10-minute cookie
if (shouldSuppressByQuery()) {
util.setCookie(settings.cookieName, minutesToDays(10));
suppression.engage();
return; // do not schedule/open
}
// If suppression cookie already exists, engage suppression and do not schedule
if (util.hasCookie(settings.cookieName)) {
suppression.engage();
return;
}
// Normal flow (note: suppression disengaged)
suppression.disengage();
if (!util.hasCookie(settings.cookieName) || util.hashExists(settings.forceHash)) {
if (settings.delay === 0) {
WmpciPop.open();
} else {
setTimeout(WmpciPop.open, settings.delay);
}
if (settings.hideAfter) {
setTimeout(WmpciPop.close, settings.hideAfter + settings.delay);
}
}
};
// alias
WmpciPop.start = function(options) {
WmpciPop.init(options);
};
}(window.WmpciPop = window.WmpciPop || {}));
// -----------------------
// Custom Code (unchanged API)
// -----------------------
jQuery(document).ready(function() {
var popup_sett = {
'coverId' : 'wmpci-popup-wrp',
'delay' : (parseInt(Wmpci_Popup.delay, 10) * 1000),
'closeOnEscape' : Wmpci_Popup.close_on_esc,
'expires' : parseInt(Wmpci_Popup.exp_time, 10),
'hideAfter' : (parseInt(Wmpci_Popup.hide_time, 10) * 1000)
};
if (Wmpci_Popup.enable == 1) {
WmpciPop.start(popup_sett);
}
// Extra safety: if query demands suppression, ensure it's closed immediately
try {
var v = (new URLSearchParams(window.location.search).get('popup') || '').toLowerCase();
if (v === 'none' || v === '0' || v === 'false' || v === 'off') {
// Engage 10-minute suppression immediately as well
(function(){
var tenMin = 10 / (24 * 60);
document.cookie = '_Wmpci_Popup=true; expires=' + (new Date(+new Date() + tenMin * 86400000)).toGMTString() + '; path=/';
})();
// Remove class if anything added it already
document.documentElement.className = document.documentElement.className.replace(/\bwmpci-popup-open\b/g,'').trim();
}
} catch (e) {}
});
Viewing 1 replies (of 1 total)
Viewing 1 replies (of 1 total)
You must be logged in to reply to this topic.