: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Adds needed backward compatibility for older versions of jQuery
if ( $.fn.on === undefined ) {
$.fn.on = function( types, sel, fn ) {
return this.delegate( sel, types, fn );
if ( $.fn.off === undefined ) {
$.fn.off = function( types, sel, fn ) {
return this.undelegate( sel, types, fn );
if ( $.fn.bindFirst === undefined ) {
$.fn.bindFirst = function( which, handler ) {
$el.unbind( which, handler );
$el.bind( which, handler );
events = $._data( $el[ 0 ] ).events;
registered = events[ which ];
registered.unshift( registered.pop() );
events[ which ] = registered;
if ( $.fn.outerHtml === undefined ) {
$.fn.outerHtml = function() {
var $el = $( this ).clone(),
$temp = $( '<div/>' ).append( $el );
if ( $.fn.isInViewport === undefined ) {
$.fn.isInViewport = function() {
var elementTop = $( this ).offset().top;
var elementBottom = elementTop + $( this ).outerHeight();
var viewportTop = $( window ).scrollTop();
var viewportBottom = viewportTop + $( window ).height();
return elementBottom > viewportTop && elementTop < viewportBottom;
if ( Date.now === undefined ) {
return new Date().getTime();
* Defines the core $.popmake function which will load the proper methods.
(function ($, document, undefined) {
window.pum_vars = window.pum_vars || {
core_sub_forms_enabled: true,
window.pum_popups = window.pum_popups || {};
// Backward compatibility fill.
window.pum_vars.popups = window.pum_popups;
return !isNaN(value) && parseInt(Number(value)) === parseInt(value) && !isNaN(parseInt(value, 10));
function Selector_Cache() {
var get_from_cache = function (selector, $ctxt, reset) {
if ('boolean' === typeof $ctxt) {
var cacheKey = $ctxt ? $ctxt.selector + ' ' + selector : selector;
if (undefined === elementCache[cacheKey] || reset) {
elementCache[cacheKey] = $ctxt ? $ctxt.find(selector) : jQuery(selector);
return elementCache[cacheKey];
get_from_cache.elementCache = elementCache;
function string_to_ref(object, reference) {
function arr_deref(o, ref, i) {
return !ref ? o : (o[ref.slice(0, i ? -1 : ref.length)]);
function dot_deref(o, ref) {
return !ref ? o : ref.split('[').reduce(arr_deref, o);
return reference.split('.').reduce(dot_deref, object);
get: new Selector_Cache(),
getPopup: function (el) {
$this = PUM.get('#pum-' + el);
} else if (el === 'current') {
$this = PUM.get('.pum-overlay.pum-active:eq(0)', true);
} else if (el === 'open') {
$this = PUM.get('.pum-overlay.pum-active', true);
} else if (el === 'closed') {
$this = PUM.get('.pum-overlay:not(.pum-active)', true);
} else if (el instanceof jQuery) {
if ($this.hasClass('pum-overlay')) {
if ($this.hasClass('popmake')) {
return $this.parents('.pum-overlay');
return $this.parents('.pum-overlay').length ? $this.parents('.pum-overlay') : $();
open: function (el, callback) {
PUM.getPopup(el).popmake('open', callback);
close: function (el, callback) {
PUM.getPopup(el).popmake('close', callback);
preventOpen: function (el) {
PUM.getPopup(el).addClass('preventOpen');
getSettings: function (el) {
var $popup = PUM.getPopup(el);
return $popup.popmake('getSettings');
getSetting: function (el, key, _default) {
var settings = PUM.getSettings(el),
value = string_to_ref(settings, key);
return typeof value !== 'undefined' ? value : (_default !== undefined ? _default : null);
checkConditions: function (el) {
return PUM.getPopup(el).popmake('checkConditions');
getCookie: function (cookie_name) {
return $.pm_cookie(cookie_name);
getJSONCookie: function (cookie_name) {
return $.pm_cookie_json(cookie_name);
setCookie: function (el, settings) {
var $popup = PUM.getPopup(el);
$popup.popmake('setCookie', jQuery.extend({
name: 'pum-' + PUM.getSetting(el, 'id'),
clearCookie: function (cookie_name, callback) {
$.pm_remove_cookie(cookie_name);
if (typeof callback === 'function') {
clearCookies: function (el, callback) {
var $popup = PUM.getPopup(el),
settings = $popup.popmake('getSettings'),
cookies = settings.cookies,
if (cookies !== undefined && cookies.length) {
for (i = 0; cookies.length > i; i += 1) {
$.pm_remove_cookie(cookies[i].settings.name);
if (typeof callback === 'function') {
getClickTriggerSelector: function (el, trigger_settings) {
var $popup = PUM.getPopup(el),
settings = PUM.getSettings(el),
'.popmake-' + settings.id,
'.popmake-' + decodeURIComponent(settings.slug),
'a[href$="#popmake-' + settings.id + '"]'
if (trigger_settings.extra_selectors && trigger_settings.extra_selectors !== '') {
trigger_selectors.push(trigger_settings.extra_selectors);
trigger_selectors = pum.hooks.applyFilters('pum.trigger.click_open.selectors', trigger_selectors, trigger_settings, $popup);
return trigger_selectors.join(', ');
disableClickTriggers: function (el, trigger_settings) {
// disable all triggers. Not available yet.
if (trigger_settings !== undefined) {
var selector = PUM.getClickTriggerSelector(el, trigger_settings);
$(selector).removeClass('pum-trigger');
$(document).off('click.pumTrigger click.popmakeOpen', selector)
var triggers = PUM.getSetting(el, 'triggers', []);
for (var i = 0; triggers.length > i; i++) {
// If this isn't an explicitly allowed click trigger type skip it.
if (pum.hooks.applyFilters('pum.disableClickTriggers.clickTriggerTypes', ['click_open']).indexOf(triggers[i].type) === -1) {
var selector = PUM.getClickTriggerSelector(el, triggers[i].settings);
$(selector).removeClass('pum-trigger');
$(document).off('click.pumTrigger click.popmakeOpen', selector)
stopIframeVideosPlaying: function() {
var $popup = PUM.getPopup( this ),
$container = $popup.popmake( 'getContainer' );
if ( ! $popup.hasClass( 'pum-has-videos' ) ) {
// TODO: Move this to its own event binding to keep this method clean and simple.
.filter( '[src*="youtube"],[src*="vimeo"]' )
src = $iframe.attr( 'src' ),
// Remove autoplay so video doesn't start playing again.
new_src = src.replace( 'autoplay=1', '1=1' );
$iframe.prop( 'src', src );
// TODO: Move this to its own event binding to keep this method clean and simple.
$container.find( 'video' ).each( function() {
$.fn.popmake = function (method) {
if ($.fn.popmake.methods[method]) {
$(document).trigger('pumMethodCall', arguments);
return $.fn.popmake.methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
if (typeof method === 'object' || !method) {
return $.fn.popmake.methods.init.apply(this, arguments);
console.warn('Method ' + method + ' does not exist on $.fn.popmake');
// Defines the core $.popmake methods.
return this.each(function () {
var $popup = PUM.getPopup(this),
settings = $popup.popmake('getSettings');
if (settings.theme_id <= 0) {
settings.theme_id = pum_vars.default_theme;
// TODO Move this to be a single global $(window) function that looks at any open popup.
if (settings.disable_reposition === undefined || !settings.disable_reposition) {
$(window).on('resize', function () {
if ($popup.hasClass('pum-active') || $popup.find('.popmake.active').length) {
$.fn.popmake.utilities.throttle(setTimeout(function () {
$popup.popmake('reposition');
// Added popmake settings to the container for temporary backward compatibility with extensions.
// TODO Once extensions updated remove this.
$popup.find('.pum-container').data('popmake', settings);
.data('popmake', settings)
// If our opening sound setting is not set to None...
if ( settings.open_sound && 'none' !== settings.open_sound ) {
// ... then set up our audio. Once loaded, add to popup data.
var audio = 'custom' !== settings.open_sound ? new Audio( pum_vars.pm_dir_url + 'assets/sounds/' + settings.open_sound ) : new Audio( settings.custom_sound );
audio.addEventListener('canplaythrough', function() {
$popup.data('popAudio', audio);
audio.addEventListener('error', function() {
console.warn( 'Error occurred when trying to load Popup opening sound.' );
// In case our audio loaded faster than us attaching the event listener.
getOverlay: function () {
return PUM.getPopup(this);
getContainer: function () {
return PUM.getPopup(this).find('.pum-container');
return PUM.getPopup(this).find('.pum-title') || null;
getContent: function () {
return PUM.getPopup(this).find('.pum-content') || null;
return PUM.getPopup(this).find('.pum-content + .pum-close') || null;
getSettings: function () {
var $popup = PUM.getPopup(this);
return $.extend(true, {}, $.fn.popmake.defaults, $popup.data('popmake') || {}, typeof pum_popups === 'object' && typeof pum_popups[$popup.attr('id')] !== 'undefined' ? pum_popups[$popup.attr('id')] : {});
var $popup = PUM.getPopup(this);
if (undefined !== test) {
return $popup.hasClass('pum-open') || $popup.popmake('getContainer').hasClass('active');
return !$popup.hasClass('pum-open') && !$popup.popmake('getContainer').hasClass('active');
open: function (callback) {
var $popup = PUM.getPopup(this),
$container = $popup.popmake('getContainer'),
$close = $popup.popmake('getClose'),
settings = $popup.popmake('getSettings'),
$popup.trigger('pumBeforeOpen');
* Allow for preventing popups from opening.
if ($popup.hasClass('preventOpen') || $container.hasClass('preventOpen')) {
console.log('prevented');
.removeClass('preventOpen')
.removeClass('pum-active')
.trigger('pumOpenPrevented');
* If popup isn't stackable close all others.
if (!settings.stackable) {
$popup.popmake('close_all');
$popup.addClass('pum-active');
* Hide the close button if delay is active.
if (settings.close_button_delay > 0) {
$html.addClass('pum-open');
* Check for and disable the overlay.
if (settings.overlay_disabled) {
$html.addClass('pum-open-overlay-disabled');
$html.addClass('pum-open-overlay');
* Set position fixed when active.
if (settings.position_fixed) {
$html.addClass('pum-open-fixed');
$html.addClass('pum-open-scrollable');
.popmake('animate', settings.animation_type, function () {
* Fade the close button in after specified delay.
if (settings.close_button_delay > 0) {
}, settings.close_button_delay);
$popup.trigger('pumAfterOpen');
$(window).trigger('resize');
$.fn.popmake.last_open_popup = $popup;
// Fire user passed callback.
if (callback !== undefined) {
// TODO Test this new method. Then remove the above.
// If the audio hasn't loaded yet, it wouldn't have been added to the popup.
if ( 'undefined' !== typeof $popup.data('popAudio') ) {
$popup.data('popAudio').play()
.catch(function(reason) {
console.warn('Sound was not able to play when popup opened. Reason: ' + reason);
setup_close: function () {
var $popup = PUM.getPopup(this),
$close = $popup.popmake('getClose'),
settings = $popup.popmake('getSettings');
// Add For non built in close buttons and backward compatibility.
$close = $close.add($('.popmake-close, .pum-close', $popup).not($close));
// TODO: Move to a global $(document).on type bind. Possibly look for an inactive class to fail on.
.on("click.pum", function (event) {
do_default = $this.hasClass('pum-do-default') || ($this.data('do-default') !== undefined && $this.data('do-default'));