Boxzilla - Version 3.2.10

Version Description

Download this release

Release Info

Developer DvanKooten
Plugin Icon 128x128 Boxzilla
Version 3.2.10
Comparing to
See all releases

Code changes from version 3.2.9 to 3.2.10

Files changed (40) hide show
  1. assets/js/script.js +274 -198
  2. assets/js/script.min.js +1 -1
  3. assets/js/script.min.js.map +1 -1
  4. bootstrap.php +1 -1
  5. boxzilla.php +3 -3
  6. languages/boxzilla.pot +72 -68
  7. readme.txt +13 -2
  8. src/admin/class-admin.php +812 -763
  9. src/admin/class-autocomplete.php +97 -91
  10. src/admin/class-installer.php +93 -88
  11. src/admin/class-migrations.php +21 -17
  12. src/admin/class-notices.php +36 -32
  13. src/admin/class-review-notice.php +29 -23
  14. src/admin/migrations/3.1-cookie-option.php +9 -9
  15. src/admin/migrations/3.1.11-screen-width-condition.php +11 -11
  16. src/admin/views/extensions.php +16 -14
  17. src/admin/views/metaboxes/box-appearance-controls.php +19 -19
  18. src/admin/views/metaboxes/box-option-controls.php +145 -142
  19. src/admin/views/metaboxes/email-optin.php +3 -3
  20. src/admin/views/metaboxes/need-help.php +2 -2
  21. src/admin/views/settings.php +12 -12
  22. src/class-bootstrapper.php +24 -22
  23. src/class-box.php +209 -203
  24. src/class-boxzilla-service-provider.php +59 -64
  25. src/class-boxzilla.php +3 -1
  26. src/class-loader.php +336 -332
  27. src/class-php-fallback.php +58 -56
  28. src/class-plugin.php +114 -105
  29. src/default-actions.php +26 -25
  30. src/default-filters.php +9 -9
  31. src/di/class-container-with-property-access.php +24 -19
  32. src/functions.php +4 -4
  33. src/licensing/class-api-exception.php +29 -27
  34. src/licensing/class-api.php +174 -168
  35. src/licensing/class-license-manager.php +181 -173
  36. src/licensing/class-license-service-provider.php +34 -34
  37. src/licensing/class-license.php +108 -101
  38. src/licensing/class-poller.php +16 -13
  39. src/licensing/class-update-manager.php +240 -232
  40. src/licensing/views/license-form.php +32 -23
assets/js/script.js CHANGED
@@ -1,151 +1,12 @@
1
  (function () { var require = undefined; var module = undefined; var exports = undefined; var define = undefined; (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2
- "use strict";
3
-
4
- function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
5
-
6
- (function () {
7
- 'use strict';
8
-
9
- var Boxzilla = require('boxzilla');
10
-
11
- var options = window.boxzilla_options; // expose Boxzilla object to window
12
-
13
- window.Boxzilla = Boxzilla; // helper function for setting CSS styles
14
-
15
- function css(element, styles) {
16
- if (styles.background_color) {
17
- element.style.background = styles.background_color;
18
- }
19
-
20
- if (styles.color) {
21
- element.style.color = styles.color;
22
- }
23
-
24
- if (styles.border_color) {
25
- element.style.borderColor = styles.border_color;
26
- }
27
-
28
- if (styles.border_width) {
29
- element.style.borderWidth = parseInt(styles.border_width) + "px";
30
- }
31
-
32
- if (styles.border_style) {
33
- element.style.borderStyle = styles.border_style;
34
- }
35
-
36
- if (styles.width) {
37
- element.style.maxWidth = parseInt(styles.width) + "px";
38
- }
39
- }
40
-
41
- function createBoxesFromConfig() {
42
- // failsafe against including script twice.
43
- if (options.inited) {
44
- return;
45
- } // create boxes from options
46
-
47
-
48
- for (var key in options.boxes) {
49
- // get opts
50
- var boxOpts = options.boxes[key];
51
- boxOpts.testMode = isLoggedIn && options.testMode; // find box content element, bail if not found
52
-
53
- var boxContentElement = document.getElementById('boxzilla-box-' + boxOpts.id + '-content');
54
-
55
- if (!boxContentElement) {
56
- continue;
57
- } // use element as content option
58
-
59
-
60
- boxOpts.content = boxContentElement; // create box
61
-
62
- var box = Boxzilla.create(boxOpts.id, boxOpts); // add box slug to box element as classname
63
-
64
- box.element.className = box.element.className + ' boxzilla-' + boxOpts.post.slug; // add custom css to box
65
-
66
- css(box.element, boxOpts.css);
67
- box.element.firstChild.firstChild.className += " first-child";
68
- box.element.firstChild.lastChild.className += " last-child"; // maybe show box right away
69
-
70
- if (box.fits() && locationHashRefersBox(box)) {
71
- box.show();
72
- }
73
- } // set flag to prevent initialising twice
74
-
75
-
76
- options.inited = true; // trigger "done" event.
77
-
78
- Boxzilla.trigger('done'); // maybe open box with MC4WP form in it
79
-
80
- maybeOpenMailChimpForWordPressBox();
81
- }
82
-
83
- function locationHashRefersBox(box) {
84
- if (!window.location.hash || 0 === window.location.hash.length) {
85
- return false;
86
- }
87
-
88
- var elementId = window.location.hash.substring(1); // only attempt on strings looking like an ID
89
-
90
- var regex = /^[a-zA-Z\-\_0-9]+$/;
91
-
92
- if (!regex.test(elementId)) {
93
- return false;
94
- }
95
-
96
- if (elementId === box.element.id) {
97
- return true;
98
- } else if (box.element.querySelector('#' + elementId)) {
99
- return true;
100
- }
101
-
102
- return false;
103
- }
104
-
105
- function maybeOpenMailChimpForWordPressBox() {
106
- if (_typeof(window.mc4wp_forms_config) !== "object" || !window.mc4wp_forms_config.submitted_form) {
107
- return;
108
- }
109
-
110
- var selector = '#' + window.mc4wp_forms_config.submitted_form.element_id;
111
- var boxes = Boxzilla.boxes;
112
-
113
- for (var boxId in boxes) {
114
- if (!boxes.hasOwnProperty(boxId)) {
115
- continue;
116
- }
117
-
118
- var box = boxes[boxId];
119
-
120
- if (box.element.querySelector(selector)) {
121
- box.show();
122
- return;
123
- }
124
- }
125
- } // print message when test mode is enabled
126
-
127
-
128
- var isLoggedIn = document.body.className.indexOf('logged-in') > -1;
129
-
130
- if (isLoggedIn && options.testMode) {
131
- console.log('Boxzilla: Test mode is enabled. Please disable test mode if you\'re done testing.');
132
- } // init boxzilla
133
-
134
-
135
- Boxzilla.init(); // on window.load, create DOM elements for boxes
136
-
137
- window.addEventListener('load', createBoxesFromConfig);
138
- })();
139
-
140
- },{"boxzilla":5}],2:[function(require,module,exports){
141
  /*!
142
- * EventEmitter v4.2.11 - git.io/ee
143
  * Unlicense - http://unlicense.org/
144
  * Oliver Caldwell - http://oli.me.uk/
145
  * @preserve
146
  */
147
 
148
- ;(function () {
149
  'use strict';
150
 
151
  /**
@@ -158,7 +19,6 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
158
 
159
  // Shortcuts to improve speed and size
160
  var proto = EventEmitter.prototype;
161
- var exports = this;
162
  var originalGlobalValue = exports.EventEmitter;
163
 
164
  /**
@@ -259,6 +119,16 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
259
  return response || listeners;
260
  };
261
 
 
 
 
 
 
 
 
 
 
 
262
  /**
263
  * Adds a listener function to the specified event.
264
  * The listener will not be added if it is a duplicate.
@@ -270,6 +140,10 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
270
  * @return {Object} Current instance of EventEmitter for chaining.
271
  */
272
  proto.addListener = function addListener(evt, listener) {
 
 
 
 
273
  var listeners = this.getListenersAsObject(evt);
274
  var listenerIsWrapped = typeof listener === 'object';
275
  var key;
@@ -369,7 +243,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
369
 
370
  /**
371
  * Adds listeners in bulk using the manipulateListeners method.
372
- * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added.
373
  * You can also pass it a regular expression to add the array of listeners to all events that match it.
374
  * Yeah, this function does quite a bit. That's probably a bad thing.
375
  *
@@ -384,7 +258,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
384
 
385
  /**
386
  * Removes listeners in bulk using the manipulateListeners method.
387
- * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.
388
  * You can also pass it an event name and an array of listeners to be removed.
389
  * You can also pass it a regular expression to remove the listeners from all events that match it.
390
  *
@@ -508,9 +382,8 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
508
  for (key in listenersMap) {
509
  if (listenersMap.hasOwnProperty(key)) {
510
  listeners = listenersMap[key].slice(0);
511
- i = listeners.length;
512
 
513
- while (i--) {
514
  // If the listener returns true then it shall be removed from the event
515
  // The function is executed either with a basic call or an apply if there is an args array
516
  listener = listeners[i];
@@ -611,9 +484,9 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
611
  else {
612
  exports.EventEmitter = EventEmitter;
613
  }
614
- }.call(this));
615
 
616
- },{}],3:[function(require,module,exports){
617
  "use strict";
618
 
619
  var duration = 320;
@@ -787,7 +660,7 @@ module.exports = {
787
  'animated': animated
788
  };
789
 
790
- },{}],4:[function(require,module,exports){
791
  'use strict';
792
 
793
  var defaults = {
@@ -1130,21 +1003,28 @@ module.exports = function (_Boxzilla) {
1130
  return Box;
1131
  };
1132
 
1133
- },{"./animator.js":3}],5:[function(require,module,exports){
1134
  'use strict';
1135
 
1136
- var EventEmitter = require('wolfy87-eventemitter'),
1137
- Boxzilla = Object.create(EventEmitter.prototype),
1138
- Box = require('./box.js')(Boxzilla),
1139
- Timer = require('./timer.js'),
1140
- boxes = [],
1141
- overlay,
1142
- scrollElement = window,
1143
- exitIntentDelayTimer,
1144
- exitIntentTriggered,
1145
- siteTimer,
1146
- pageTimer,
1147
- pageViews;
 
 
 
 
 
 
 
1148
 
1149
  function throttle(fn, threshhold, scope) {
1150
  threshhold || (threshhold = 250);
@@ -1170,7 +1050,7 @@ function throttle(fn, threshhold, scope) {
1170
 
1171
 
1172
  function onKeyUp(e) {
1173
- if (e.keyCode == 27) {
1174
  Boxzilla.dismiss();
1175
  }
1176
  } // check "pageviews" criteria for each box
@@ -1264,9 +1144,9 @@ function onOverlayClick(e) {
1264
  });
1265
  }
1266
 
1267
- function triggerExitIntent() {
1268
  // do nothing if already triggered OR another box is visible.
1269
- if (exitIntentTriggered || isAnyBoxVisible()) {
1270
  return;
1271
  }
1272
 
@@ -1275,34 +1155,12 @@ function triggerExitIntent() {
1275
  box.trigger();
1276
  }
1277
  });
1278
- exitIntentTriggered = true;
1279
- }
1280
-
1281
- function onMouseLeave(e) {
1282
- var delay = 400; // did mouse leave at top of window?
1283
-
1284
- if (e.clientY <= 0) {
1285
- exitIntentDelayTimer = window.setTimeout(triggerExitIntent, delay);
1286
- }
1287
  }
1288
 
1289
  function isAnyBoxVisible() {
1290
- for (var i = 0; i < boxes.length; i++) {
1291
- var box = boxes[i];
1292
-
1293
- if (box.visible) {
1294
- return true;
1295
- }
1296
- }
1297
-
1298
- return false;
1299
- }
1300
-
1301
- function onMouseEnter() {
1302
- if (exitIntentDelayTimer) {
1303
- window.clearInterval(exitIntentDelayTimer);
1304
- exitIntentDelayTimer = null;
1305
- }
1306
  }
1307
 
1308
  function onElementClick(e) {
@@ -1346,6 +1204,10 @@ var timers = {
1346
  }; // initialise & add event listeners
1347
 
1348
  Boxzilla.init = function () {
 
 
 
 
1349
  document.body.addEventListener('click', onElementClick, true);
1350
 
1351
  try {
@@ -1357,8 +1219,6 @@ Boxzilla.init = function () {
1357
  siteTimer = new Timer(0);
1358
  pageTimer = new Timer(0); // insert styles into DOM
1359
 
1360
- var styles = require('./styles.js');
1361
-
1362
  var styleElement = document.createElement('style');
1363
  styleElement.setAttribute("type", "text/css");
1364
  styleElement.innerHTML = styles;
@@ -1367,8 +1227,9 @@ Boxzilla.init = function () {
1367
  overlay = document.createElement('div');
1368
  overlay.style.display = 'none';
1369
  overlay.id = 'boxzilla-overlay';
1370
- document.body.appendChild(overlay); // event binds
1371
 
 
1372
  scrollElement.addEventListener('touchstart', throttle(checkHeightCriteria), true);
1373
  scrollElement.addEventListener('scroll', throttle(checkHeightCriteria), true);
1374
  window.addEventListener('resize', throttle(recalculateHeights));
@@ -1376,8 +1237,6 @@ Boxzilla.init = function () {
1376
  overlay.addEventListener('click', onOverlayClick);
1377
  window.setInterval(checkTimeCriteria, 1000);
1378
  window.setTimeout(checkPageViewsCriteria, 1000);
1379
- document.documentElement.addEventListener('mouseleave', onMouseLeave);
1380
- document.documentElement.addEventListener('mouseenter', onMouseEnter);
1381
  document.addEventListener('keyup', onKeyUp);
1382
  timers.start();
1383
  window.addEventListener('focus', timers.start);
@@ -1387,6 +1246,7 @@ Boxzilla.init = function () {
1387
  });
1388
  window.addEventListener('blur', timers.stop);
1389
  Boxzilla.trigger('ready');
 
1390
  };
1391
  /**
1392
  * Create a new Box
@@ -1475,13 +1335,13 @@ if (typeof module !== 'undefined' && module.exports) {
1475
  module.exports = Boxzilla;
1476
  }
1477
 
1478
- },{"./box.js":4,"./styles.js":6,"./timer.js":7,"wolfy87-eventemitter":2}],6:[function(require,module,exports){
1479
  "use strict";
1480
 
1481
  var styles = "#boxzilla-overlay{position:fixed;background:rgba(0,0,0,.65);width:100%;height:100%;left:0;top:0;z-index:99999}.boxzilla-center-container{position:fixed;top:0;left:0;right:0;height:0;text-align:center;z-index:999999;line-height:0}.boxzilla-center-container .boxzilla{display:inline-block;text-align:left;position:relative;line-height:normal}.boxzilla{position:fixed;z-index:999999;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;padding:25px}.boxzilla.boxzilla-top-left{top:0;left:0}.boxzilla.boxzilla-top-right{top:0;right:0}.boxzilla.boxzilla-bottom-left{bottom:0;left:0}.boxzilla.boxzilla-bottom-right{bottom:0;right:0}.boxzilla-content>:first-child{margin-top:0;padding-top:0}.boxzilla-content>:last-child{margin-bottom:0;padding-bottom:0}.boxzilla-close-icon{position:absolute;right:0;top:0;text-align:center;padding:6px;cursor:pointer;-webkit-appearance:none;font-size:28px;font-weight:700;line-height:20px;color:#000;opacity:.5}.boxzilla-close-icon:focus,.boxzilla-close-icon:hover{opacity:.8}";
1482
  module.exports = styles;
1483
 
1484
- },{}],7:[function(require,module,exports){
1485
  'use strict';
1486
 
1487
  var Timer = function Timer(start) {
@@ -1508,5 +1368,221 @@ Timer.prototype.stop = function () {
1508
 
1509
  module.exports = Timer;
1510
 
1511
- },{}]},{},[1]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1512
  ; })();
1
  (function () { var require = undefined; var module = undefined; var exports = undefined; var define = undefined; (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /*!
3
+ * EventEmitter v5.2.5 - git.io/ee
4
  * Unlicense - http://unlicense.org/
5
  * Oliver Caldwell - http://oli.me.uk/
6
  * @preserve
7
  */
8
 
9
+ ;(function (exports) {
10
  'use strict';
11
 
12
  /**
19
 
20
  // Shortcuts to improve speed and size
21
  var proto = EventEmitter.prototype;
 
22
  var originalGlobalValue = exports.EventEmitter;
23
 
24
  /**
119
  return response || listeners;
120
  };
121
 
122
+ function isValidListener (listener) {
123
+ if (typeof listener === 'function' || listener instanceof RegExp) {
124
+ return true
125
+ } else if (listener && typeof listener === 'object') {
126
+ return isValidListener(listener.listener)
127
+ } else {
128
+ return false
129
+ }
130
+ }
131
+
132
  /**
133
  * Adds a listener function to the specified event.
134
  * The listener will not be added if it is a duplicate.
140
  * @return {Object} Current instance of EventEmitter for chaining.
141
  */
142
  proto.addListener = function addListener(evt, listener) {
143
+ if (!isValidListener(listener)) {
144
+ throw new TypeError('listener must be a function');
145
+ }
146
+
147
  var listeners = this.getListenersAsObject(evt);
148
  var listenerIsWrapped = typeof listener === 'object';
149
  var key;
243
 
244
  /**
245
  * Adds listeners in bulk using the manipulateListeners method.
246
+ * If you pass an object as the first argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added.
247
  * You can also pass it a regular expression to add the array of listeners to all events that match it.
248
  * Yeah, this function does quite a bit. That's probably a bad thing.
249
  *
258
 
259
  /**
260
  * Removes listeners in bulk using the manipulateListeners method.
261
+ * If you pass an object as the first argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.
262
  * You can also pass it an event name and an array of listeners to be removed.
263
  * You can also pass it a regular expression to remove the listeners from all events that match it.
264
  *
382
  for (key in listenersMap) {
383
  if (listenersMap.hasOwnProperty(key)) {
384
  listeners = listenersMap[key].slice(0);
 
385
 
386
+ for (i = 0; i < listeners.length; i++) {
387
  // If the listener returns true then it shall be removed from the event
388
  // The function is executed either with a basic call or an apply if there is an args array
389
  listener = listeners[i];
484
  else {
485
  exports.EventEmitter = EventEmitter;
486
  }
487
+ }(typeof window !== 'undefined' ? window : this || {}));
488
 
489
+ },{}],2:[function(require,module,exports){
490
  "use strict";
491
 
492
  var duration = 320;
660
  'animated': animated
661
  };
662
 
663
+ },{}],3:[function(require,module,exports){
664
  'use strict';
665
 
666
  var defaults = {
1003
  return Box;
1004
  };
1005
 
1006
+ },{"./animator.js":2}],4:[function(require,module,exports){
1007
  'use strict';
1008
 
1009
+ var EventEmitter = require('wolfy87-eventemitter');
1010
+
1011
+ var Timer = require('./timer.js');
1012
+
1013
+ var Boxzilla = Object.create(EventEmitter.prototype);
1014
+
1015
+ var Box = require('./box.js')(Boxzilla);
1016
+
1017
+ var boxes = [];
1018
+ var overlay;
1019
+ var scrollElement = window;
1020
+ var siteTimer;
1021
+ var pageTimer;
1022
+ var pageViews;
1023
+ var initialised = false;
1024
+
1025
+ var styles = require('./styles.js');
1026
+
1027
+ var ExitIntent = require('./triggers/exit-intent.js');
1028
 
1029
  function throttle(fn, threshhold, scope) {
1030
  threshhold || (threshhold = 250);
1050
 
1051
 
1052
  function onKeyUp(e) {
1053
+ if (e.keyCode === 27) {
1054
  Boxzilla.dismiss();
1055
  }
1056
  } // check "pageviews" criteria for each box
1144
  });
1145
  }
1146
 
1147
+ function showBoxesWithExitIntentTrigger() {
1148
  // do nothing if already triggered OR another box is visible.
1149
+ if (isAnyBoxVisible()) {
1150
  return;
1151
  }
1152
 
1155
  box.trigger();
1156
  }
1157
  });
 
 
 
 
 
 
 
 
 
1158
  }
1159
 
1160
  function isAnyBoxVisible() {
1161
+ return boxes.filter(function (b) {
1162
+ return b.visible;
1163
+ }).length > 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
1164
  }
1165
 
1166
  function onElementClick(e) {
1204
  }; // initialise & add event listeners
1205
 
1206
  Boxzilla.init = function () {
1207
+ if (initialised) {
1208
+ return;
1209
+ }
1210
+
1211
  document.body.addEventListener('click', onElementClick, true);
1212
 
1213
  try {
1219
  siteTimer = new Timer(0);
1220
  pageTimer = new Timer(0); // insert styles into DOM
1221
 
 
 
1222
  var styleElement = document.createElement('style');
1223
  styleElement.setAttribute("type", "text/css");
1224
  styleElement.innerHTML = styles;
1227
  overlay = document.createElement('div');
1228
  overlay.style.display = 'none';
1229
  overlay.id = 'boxzilla-overlay';
1230
+ document.body.appendChild(overlay); // init exit intent trigger
1231
 
1232
+ new ExitIntent(showBoxesWithExitIntentTrigger);
1233
  scrollElement.addEventListener('touchstart', throttle(checkHeightCriteria), true);
1234
  scrollElement.addEventListener('scroll', throttle(checkHeightCriteria), true);
1235
  window.addEventListener('resize', throttle(recalculateHeights));
1237
  overlay.addEventListener('click', onOverlayClick);
1238
  window.setInterval(checkTimeCriteria, 1000);
1239
  window.setTimeout(checkPageViewsCriteria, 1000);
 
 
1240
  document.addEventListener('keyup', onKeyUp);
1241
  timers.start();
1242
  window.addEventListener('focus', timers.start);
1246
  });
1247
  window.addEventListener('blur', timers.stop);
1248
  Boxzilla.trigger('ready');
1249
+ initialised = true; // ensure this function doesn't run again
1250
  };
1251
  /**
1252
  * Create a new Box
1335
  module.exports = Boxzilla;
1336
  }
1337
 
1338
+ },{"./box.js":3,"./styles.js":5,"./timer.js":6,"./triggers/exit-intent.js":7,"wolfy87-eventemitter":1}],5:[function(require,module,exports){
1339
  "use strict";
1340
 
1341
  var styles = "#boxzilla-overlay{position:fixed;background:rgba(0,0,0,.65);width:100%;height:100%;left:0;top:0;z-index:99999}.boxzilla-center-container{position:fixed;top:0;left:0;right:0;height:0;text-align:center;z-index:999999;line-height:0}.boxzilla-center-container .boxzilla{display:inline-block;text-align:left;position:relative;line-height:normal}.boxzilla{position:fixed;z-index:999999;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;padding:25px}.boxzilla.boxzilla-top-left{top:0;left:0}.boxzilla.boxzilla-top-right{top:0;right:0}.boxzilla.boxzilla-bottom-left{bottom:0;left:0}.boxzilla.boxzilla-bottom-right{bottom:0;right:0}.boxzilla-content>:first-child{margin-top:0;padding-top:0}.boxzilla-content>:last-child{margin-bottom:0;padding-bottom:0}.boxzilla-close-icon{position:absolute;right:0;top:0;text-align:center;padding:6px;cursor:pointer;-webkit-appearance:none;font-size:28px;font-weight:700;line-height:20px;color:#000;opacity:.5}.boxzilla-close-icon:focus,.boxzilla-close-icon:hover{opacity:.8}";
1342
  module.exports = styles;
1343
 
1344
+ },{}],6:[function(require,module,exports){
1345
  'use strict';
1346
 
1347
  var Timer = function Timer(start) {
1368
 
1369
  module.exports = Timer;
1370
 
1371
+ },{}],7:[function(require,module,exports){
1372
+ 'use strict';
1373
+
1374
+ module.exports = function (callback) {
1375
+ var timeout = null;
1376
+ var touchStart = {};
1377
+
1378
+ function triggerCallback() {
1379
+ document.documentElement.removeEventListener('mouseleave', onMouseLeave);
1380
+ document.documentElement.removeEventListener('mouseenter', onMouseEnter);
1381
+ document.documentElement.removeEventListener('click', clearTimeout);
1382
+ window.removeEventListener('touchstart', onTouchStart);
1383
+ window.removeEventListener('touchend', onTouchEnd);
1384
+ callback();
1385
+ }
1386
+
1387
+ function clearTimeout() {
1388
+ if (timeout === null) {
1389
+ return;
1390
+ }
1391
+
1392
+ window.clearTimeout(timeout);
1393
+ timeout = null;
1394
+ }
1395
+
1396
+ function onMouseEnter(evt) {
1397
+ clearTimeout();
1398
+ }
1399
+
1400
+ function onMouseLeave(evt) {
1401
+ clearTimeout(); // did mouse leave at top of window?
1402
+ // add small exception space in the top-right corner
1403
+
1404
+ if (evt.clientY <= 0 && evt.clientX < 0.80 * window.innerWidth) {
1405
+ timeout = window.setTimeout(triggerCallback, 400);
1406
+ }
1407
+ }
1408
+
1409
+ function onTouchStart(evt) {
1410
+ clearTimeout();
1411
+ touchStart = {
1412
+ timestamp: performance.now(),
1413
+ scrollY: window.scrollY,
1414
+ windowHeight: window.innerHeight
1415
+ };
1416
+ }
1417
+
1418
+ function onTouchEnd(evt) {
1419
+ clearTimeout(); // did address bar appear?
1420
+
1421
+ if (window.innerHeight > touchStart.windowHeight) {
1422
+ return;
1423
+ } // allow a tiny tiny margin for error, to not fire on clicks
1424
+
1425
+
1426
+ if (window.scrollY + 20 >= touchStart.scrollY) {
1427
+ return;
1428
+ }
1429
+
1430
+ if (performance.now() - touchStart.timestamp > 300) {
1431
+ return;
1432
+ }
1433
+
1434
+ if (['A', 'INPUT', 'BUTTON'].indexOf(evt.target.tagName) > -1) {
1435
+ return;
1436
+ }
1437
+
1438
+ timeout = window.setTimeout(triggerCallback, 800);
1439
+ }
1440
+
1441
+ window.addEventListener('touchstart', onTouchStart);
1442
+ window.addEventListener('touchend', onTouchEnd);
1443
+ document.documentElement.addEventListener('mouseenter', onMouseEnter);
1444
+ document.documentElement.addEventListener('mouseleave', onMouseLeave);
1445
+ document.documentElement.addEventListener('click', clearTimeout);
1446
+ };
1447
+
1448
+ },{}],8:[function(require,module,exports){
1449
+ "use strict";
1450
+
1451
+ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
1452
+
1453
+ (function () {
1454
+ 'use strict';
1455
+
1456
+ var Boxzilla = require('boxzilla');
1457
+
1458
+ var options = window.boxzilla_options; // expose Boxzilla object to window
1459
+
1460
+ window.Boxzilla = Boxzilla; // helper function for setting CSS styles
1461
+
1462
+ function css(element, styles) {
1463
+ if (styles.background_color) {
1464
+ element.style.background = styles.background_color;
1465
+ }
1466
+
1467
+ if (styles.color) {
1468
+ element.style.color = styles.color;
1469
+ }
1470
+
1471
+ if (styles.border_color) {
1472
+ element.style.borderColor = styles.border_color;
1473
+ }
1474
+
1475
+ if (styles.border_width) {
1476
+ element.style.borderWidth = parseInt(styles.border_width) + "px";
1477
+ }
1478
+
1479
+ if (styles.border_style) {
1480
+ element.style.borderStyle = styles.border_style;
1481
+ }
1482
+
1483
+ if (styles.width) {
1484
+ element.style.maxWidth = parseInt(styles.width) + "px";
1485
+ }
1486
+ }
1487
+
1488
+ function createBoxesFromConfig() {
1489
+ // failsafe against including script twice.
1490
+ if (options.inited) {
1491
+ return;
1492
+ } // create boxes from options
1493
+
1494
+
1495
+ for (var key in options.boxes) {
1496
+ // get opts
1497
+ var boxOpts = options.boxes[key];
1498
+ boxOpts.testMode = isLoggedIn && options.testMode; // find box content element, bail if not found
1499
+
1500
+ var boxContentElement = document.getElementById('boxzilla-box-' + boxOpts.id + '-content');
1501
+
1502
+ if (!boxContentElement) {
1503
+ continue;
1504
+ } // use element as content option
1505
+
1506
+
1507
+ boxOpts.content = boxContentElement; // create box
1508
+
1509
+ var box = Boxzilla.create(boxOpts.id, boxOpts); // add box slug to box element as classname
1510
+
1511
+ box.element.className = box.element.className + ' boxzilla-' + boxOpts.post.slug; // add custom css to box
1512
+
1513
+ css(box.element, boxOpts.css);
1514
+ box.element.firstChild.firstChild.className += " first-child";
1515
+ box.element.firstChild.lastChild.className += " last-child"; // maybe show box right away
1516
+
1517
+ if (box.fits() && locationHashRefersBox(box)) {
1518
+ box.show();
1519
+ }
1520
+ } // set flag to prevent initialising twice
1521
+
1522
+
1523
+ options.inited = true; // trigger "done" event.
1524
+
1525
+ Boxzilla.trigger('done'); // maybe open box with MC4WP form in it
1526
+
1527
+ maybeOpenMailChimpForWordPressBox();
1528
+ }
1529
+
1530
+ function locationHashRefersBox(box) {
1531
+ if (!window.location.hash || 0 === window.location.hash.length) {
1532
+ return false;
1533
+ }
1534
+
1535
+ var elementId = window.location.hash.substring(1); // only attempt on strings looking like an ID
1536
+
1537
+ var regex = /^[a-zA-Z\-\_0-9]+$/;
1538
+
1539
+ if (!regex.test(elementId)) {
1540
+ return false;
1541
+ }
1542
+
1543
+ if (elementId === box.element.id) {
1544
+ return true;
1545
+ } else if (box.element.querySelector('#' + elementId)) {
1546
+ return true;
1547
+ }
1548
+
1549
+ return false;
1550
+ }
1551
+
1552
+ function maybeOpenMailChimpForWordPressBox() {
1553
+ if (_typeof(window.mc4wp_forms_config) !== "object" || !window.mc4wp_forms_config.submitted_form) {
1554
+ return;
1555
+ }
1556
+
1557
+ var selector = '#' + window.mc4wp_forms_config.submitted_form.element_id;
1558
+ var boxes = Boxzilla.boxes;
1559
+
1560
+ for (var boxId in boxes) {
1561
+ if (!boxes.hasOwnProperty(boxId)) {
1562
+ continue;
1563
+ }
1564
+
1565
+ var box = boxes[boxId];
1566
+
1567
+ if (box.element.querySelector(selector)) {
1568
+ box.show();
1569
+ return;
1570
+ }
1571
+ }
1572
+ } // print message when test mode is enabled
1573
+
1574
+
1575
+ var isLoggedIn = document.body.className.indexOf('logged-in') > -1;
1576
+
1577
+ if (isLoggedIn && options.testMode) {
1578
+ console.log('Boxzilla: Test mode is enabled. Please disable test mode if you\'re done testing.');
1579
+ } // init boxzilla
1580
+
1581
+
1582
+ Boxzilla.init(); // on window.load, create DOM elements for boxes
1583
+
1584
+ window.addEventListener('load', createBoxesFromConfig);
1585
+ })();
1586
+
1587
+ },{"boxzilla":4}]},{},[8]);
1588
  ; })();
assets/js/script.min.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(){var l=void 0;!function r(s,l,a){function c(e,t){if(!l[e]){if(!s[e]){var i=!1;if(!t&&i)return i(e,!0);if(d)return d(e,!0);var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var o=l[e]={exports:{}};s[e][0].call(o.exports,function(t){return c(s[e][1][t]||t)},o,o.exports,r,s,l,a)}return l[e].exports}for(var d=!1,t=0;t<a.length;t++)c(a[t]);return c}({1:[function(t,e,i){"use strict";function d(t){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(){var s=t("boxzilla"),l=window.boxzilla_options;function a(t){if(!window.location.hash||0===window.location.hash.length)return!1;var e=window.location.hash.substring(1);return!!/^[a-zA-Z\-\_0-9]+$/.test(e)&&(e===t.element.id||!!t.element.querySelector("#"+e))}window.Boxzilla=s;var c=-1<document.body.className.indexOf("logged-in");c&&l.testMode&&console.log("Boxzilla: Test mode is enabled. Please disable test mode if you're done testing."),s.init(),window.addEventListener("load",function(){if(!l.inited){for(var t in l.boxes){var e=l.boxes[t];e.testMode=c&&l.testMode;var i=document.getElementById("boxzilla-box-"+e.id+"-content");if(i){e.content=i;var n=s.create(e.id,e);n.element.className=n.element.className+" boxzilla-"+e.post.slug,o=n.element,(r=e.css).background_color&&(o.style.background=r.background_color),r.color&&(o.style.color=r.color),r.border_color&&(o.style.borderColor=r.border_color),r.border_width&&(o.style.borderWidth=parseInt(r.border_width)+"px"),r.border_style&&(o.style.borderStyle=r.border_style),r.width&&(o.style.maxWidth=parseInt(r.width)+"px"),n.element.firstChild.firstChild.className+=" first-child",n.element.firstChild.lastChild.className+=" last-child",n.fits()&&a(n)&&n.show()}}var o,r;l.inited=!0,s.trigger("done"),function(){if("object"===d(window.mc4wp_forms_config)&&window.mc4wp_forms_config.submitted_form){var t="#"+window.mc4wp_forms_config.submitted_form.element_id,e=s.boxes;for(var i in e)if(e.hasOwnProperty(i)){var n=e[i];if(n.element.querySelector(t))return n.show()}}}()}})}()},{boxzilla:5}],2:[function(t,s,e){(function(){"use strict";function t(){}var e=t.prototype,i=this,n=i.EventEmitter;function r(t,e){for(var i=t.length;i--;)if(t[i].listener===e)return i;return-1}function o(t){return function(){return this[t].apply(this,arguments)}}e.getListeners=function(t){var e,i,n=this._getEvents();if(t instanceof RegExp)for(i in e={},n)n.hasOwnProperty(i)&&t.test(i)&&(e[i]=n[i]);else e=n[t]||(n[t]=[]);return e},e.flattenListeners=function(t){var e,i=[];for(e=0;e<t.length;e+=1)i.push(t[e].listener);return i},e.getListenersAsObject=function(t){var e,i=this.getListeners(t);return i instanceof Array&&((e={})[t]=i),e||i},e.addListener=function(t,e){var i,n=this.getListenersAsObject(t),o="object"==typeof e;for(i in n)n.hasOwnProperty(i)&&-1===r(n[i],e)&&n[i].push(o?e:{listener:e,once:!1});return this},e.on=o("addListener"),e.addOnceListener=function(t,e){return this.addListener(t,{listener:e,once:!0})},e.once=o("addOnceListener"),e.defineEvent=function(t){return this.getListeners(t),this},e.defineEvents=function(t){for(var e=0;e<t.length;e+=1)this.defineEvent(t[e]);return this},e.removeListener=function(t,e){var i,n,o=this.getListenersAsObject(t);for(n in o)o.hasOwnProperty(n)&&-1!==(i=r(o[n],e))&&o[n].splice(i,1);return this},e.off=o("removeListener"),e.addListeners=function(t,e){return this.manipulateListeners(!1,t,e)},e.removeListeners=function(t,e){return this.manipulateListeners(!0,t,e)},e.manipulateListeners=function(t,e,i){var n,o,r=t?this.removeListener:this.addListener,s=t?this.removeListeners:this.addListeners;if("object"!=typeof e||e instanceof RegExp)for(n=i.length;n--;)r.call(this,e,i[n]);else for(n in e)e.hasOwnProperty(n)&&(o=e[n])&&("function"==typeof o?r.call(this,n,o):s.call(this,n,o));return this},e.removeEvent=function(t){var e,i=typeof t,n=this._getEvents();if("string"===i)delete n[t];else if(t instanceof RegExp)for(e in n)n.hasOwnProperty(e)&&t.test(e)&&delete n[e];else delete this._events;return this},e.removeAllListeners=o("removeEvent"),e.emitEvent=function(t,e){var i,n,o,r,s=this.getListenersAsObject(t);for(r in s)if(s.hasOwnProperty(r))for(o=(i=s[r].slice(0)).length;o--;)!0===(n=i[o]).once&&this.removeListener(t,n.listener),n.listener.apply(this,e||[])===this._getOnceReturnValue()&&this.removeListener(t,n.listener);return this},e.trigger=o("emitEvent"),e.emit=function(t){var e=Array.prototype.slice.call(arguments,1);return this.emitEvent(t,e)},e.setOnceReturnValue=function(t){return this._onceReturnValue=t,this},e._getOnceReturnValue=function(){return!this.hasOwnProperty("_onceReturnValue")||this._onceReturnValue},e._getEvents=function(){return this._events||(this._events={})},t.noConflict=function(){return i.EventEmitter=n,t},"function"==typeof l&&l.amd?l(function(){return t}):"object"==typeof s&&s.exports?s.exports=t:i.EventEmitter=t}).call(this)},{}],3:[function(t,e,i){"use strict";var o=320;function c(t,e){for(var i in e)t.style[i]=e[i]}function d(c,d,h){var f=+new Date,t=window.getComputedStyle(c),u={},g={};for(var e in d){d[e]=parseFloat(d[e]);var i=d[e],n=parseFloat(t[e]);n!=i?(g[e]=(i-n)/o,u[e]=n):delete d[e]}!function t(){var e,i,n,o,r=+new Date-f,s=!0;for(var l in d){e=g[l],i=d[l],n=e*r,o=u[l]+n,0<e&&i<=o||e<0&&o<=i?o=i:s=!1,u[l]=o;var a="opacity"!==l?"px":"";c.style[l]=o+a}f=+new Date,s?h&&h():window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,32)}()}e.exports={toggle:function(t,e,i){var n,o,r="none"!=t.style.display||0<t.offsetLeft,s=t.cloneNode(!0),l=function(){t.removeAttribute("data-animated"),t.setAttribute("style",s.getAttribute("style")),t.style.display=r?"none":"",i&&i()};if(t.setAttribute("data-animated","true"),r||(t.style.display=""),"slide"===e){if(n=function(t,e){for(var i={},n=0;n<t.length;n++)i[t[n]]=e;return i}(["height","borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],0),o={},!r){if(o=function(t,e){for(var i={},n=0;n<t.length;n++)i[t[n]]=e[t[n]];return i}(["height","borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],window.getComputedStyle(t)),!isFinite(o.height)){var a=t.getBoundingClientRect();o.height=a.height}c(t,n)}t.style.overflowY="hidden",d(t,r?n:o,l)}else n={opacity:0},o={opacity:1},r||c(t,n),d(t,r?n:o,l)},animate:d,animated:function(t){return!!t.getAttribute("data-animated")}}},{}],4:[function(t,e,i){"use strict";var n,o={animation:"fade",rehide:!1,content:"",cookie:null,icon:"&times",screenWidthCondition:null,position:"center",testMode:!1,trigger:!1,closable:!0},r=t("./animator.js");var s=function(t,e){this.id=t,this.config=function(t,e){var i={};for(var n in t)i[n]=t[n];for(var n in e)i[n]=e[n];return i}(o,e),this.overlay=document.getElementById("boxzilla-overlay"),this.visible=!1,this.dismissed=!1,this.triggered=!1,this.triggerHeight=this.calculateTriggerHeight(),this.cookieSet=this.isCookieSet(),this.element=null,this.contentElement=null,this.closeIcon=null,this.dom(),this.events()};s.prototype.events=function(){var e=this;this.closeIcon&&this.closeIcon.addEventListener("click",this.dismiss.bind(this)),this.element.addEventListener("click",function(t){"A"===t.target.tagName&&n.trigger("box.interactions.link",[e,t.target])},!1),this.element.addEventListener("submit",function(t){e.setCookie(),n.trigger("box.interactions.form",[e,t.target])},!1)},s.prototype.dom=function(){var t=document.createElement("div");t.className="boxzilla-container boxzilla-"+this.config.position+"-container";var e,i=document.createElement("div");if(i.setAttribute("id","boxzilla-"+this.id),i.className="boxzilla boxzilla-"+this.id+" boxzilla-"+this.config.position,i.style.display="none",t.appendChild(i),"string"==typeof this.config.content?(e=document.createElement("div")).innerHTML=this.config.content:(e=this.config.content).style.display="",e.className="boxzilla-content",i.appendChild(e),this.config.closable&&this.config.icon){var n=document.createElement("span");n.className="boxzilla-close-icon",n.innerHTML=this.config.icon,i.appendChild(n),this.closeIcon=n}document.body.appendChild(t),this.contentElement=e,this.element=i},s.prototype.setCustomBoxStyling=function(){var t=this.element.style.display;this.element.style.display="",this.element.style.overflowY="auto",this.element.style.maxHeight="none";var e=window.innerHeight,i=this.element.clientHeight;if(e<i&&(this.element.style.maxHeight=e+"px",this.element.style.overflowY="scroll"),"center"===this.config.position){var n=(e-i)/2;n=0<=n?n:0,this.element.style.marginTop=n+"px"}this.element.style.display=t},s.prototype.toggle=function(t){return void 0===t&&(t=!this.visible),t!==this.visible&&(!r.animated(this.element)&&(!(!t&&!this.config.closable)&&(this.visible=t,this.setCustomBoxStyling(),n.trigger("box."+(t?"show":"hide"),[this]),"center"===this.config.position&&(this.overlay.classList.toggle("boxzilla-"+this.id+"-overlay"),r.toggle(this.overlay,"fade")),r.toggle(this.element,this.config.animation,function(){this.visible||(this.contentElement.innerHTML=this.contentElement.innerHTML)}.bind(this)),!0)))},s.prototype.show=function(){return this.toggle(!0)},s.prototype.hide=function(){return this.toggle(!1)},s.prototype.calculateTriggerHeight=function(){var t,e,i=0;if(this.config.trigger)if("element"===this.config.trigger.method){var n=document.body.querySelector(this.config.trigger.value);if(n)i=n.getBoundingClientRect().top}else"percentage"===this.config.trigger.method&&(i=this.config.trigger.value/100*(t=document.body,e=document.documentElement,Math.max(t.scrollHeight,t.offsetHeight,e.clientHeight,e.scrollHeight,e.offsetHeight)));return i},s.prototype.fits=function(){if(!this.config.screenWidthCondition||!this.config.screenWidthCondition.value)return!0;switch(this.config.screenWidthCondition.condition){case"larger":return window.innerWidth>this.config.screenWidthCondition.value;case"smaller":return window.innerWidth<this.config.screenWidthCondition.value}return!0},s.prototype.onResize=function(){this.triggerHeight=this.calculateTriggerHeight(),this.setCustomBoxStyling()},s.prototype.mayAutoShow=function(){return!this.dismissed&&(!!this.fits()&&(!!this.config.trigger&&!this.cookieSet))},s.prototype.mayRehide=function(){return this.config.rehide&&this.triggered},s.prototype.isCookieSet=function(){return!(this.config.testMode||!this.config.trigger)&&(!(!this.config.cookie||!this.config.cookie.triggered&&!this.config.cookie.dismissed)&&"true"===document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*boxzilla_box_"+this.id+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))},s.prototype.setCookie=function(t){var e=new Date;e.setHours(e.getHours()+t),document.cookie="boxzilla_box_"+this.id+"=true; expires="+e.toUTCString()+"; path=/"},s.prototype.trigger=function(){this.show()&&(this.triggered=!0,this.config.cookie&&this.config.cookie.triggered&&this.setCookie(this.config.cookie.triggered))},s.prototype.dismiss=function(t){return t&&t.preventDefault(),!!this.visible&&(this.hide(),this.config.cookie&&this.config.cookie.dismissed&&this.setCookie(this.config.cookie.dismissed),this.dismissed=!0,n.trigger("box.dismiss",[this]),!0)},e.exports=function(t){return n=t,s}},{"./animator.js":3}],5:[function(i,t,e){"use strict";var n,o,r,s,l,a,c=i("wolfy87-eventemitter"),d=Object.create(c.prototype),h=i("./box.js")(d),f=i("./timer.js"),u=[],g=window;function m(n,o,r){var s,l;return o||(o=250),function(){var t=r||this,e=+new Date,i=arguments;s&&e<s+o?(clearTimeout(l),l=setTimeout(function(){s=e,n.apply(t,i)},o)):(s=e,n.apply(t,i))}}function p(t){27==t.keyCode&&d.dismiss()}function v(){L()||u.forEach(function(t){t.mayAutoShow()&&"pageviews"===t.config.trigger.method&&a>=t.config.trigger.value&&t.trigger()})}function b(){L()||u.forEach(function(t){t.mayAutoShow()&&("time_on_site"===t.config.trigger.method&&s.time>=t.config.trigger.value&&t.trigger(),"time_on_page"===t.config.trigger.method&&l.time>=t.config.trigger.value&&t.trigger())})}function y(){var e=g.hasOwnProperty("pageYOffset")?g.pageYOffset:g.scrollTop;e+=.9*window.innerHeight,u.forEach(function(t){if(t.mayAutoShow()&&!(t.triggerHeight<=0)){if(e>t.triggerHeight){if(L())return;t.trigger()}t.mayRehide()&&e<t.triggerHeight-5&&t.hide()}})}function w(){u.forEach(function(t){t.onResize()})}function x(t){var i=t.offsetX,n=t.offsetY;u.forEach(function(t){var e=t.element.getBoundingClientRect();(i<e.left-40||i>e.right+40||n<e.top-40||n>e.bottom+40)&&t.dismiss()})}function E(){r||L()||(u.forEach(function(t){t.mayAutoShow()&&"exit_intent"===t.config.trigger.method&&t.trigger()}),r=!0)}function z(t){t.clientY<=0&&(o=window.setTimeout(E,400))}function L(){for(var t=0;t<u.length;t++){if(u[t].visible)return!0}return!1}function _(){o&&(window.clearInterval(o),o=null)}function C(t){for(var e=t.target||t.srcElement,i=0;i<=3&&(e&&"A"!==e.tagName);i++)e=e.parentElement;if(e&&"A"===e.tagName&&e.getAttribute("href")&&0===e.getAttribute("href").toLowerCase().indexOf("#boxzilla-")){var n=e.getAttribute("href").toLowerCase().substring("#boxzilla-".length);d.toggle(n)}}var k=function(){try{var t=sessionStorage.getItem("boxzilla_timer");t&&(s.time=t)}catch(t){}s.start(),l.start()},S=function(){sessionStorage.setItem("boxzilla_timer",s.time),s.stop(),l.stop()};d.init=function(){document.body.addEventListener("click",C,!0);try{a=sessionStorage.getItem("boxzilla_pageviews")||0}catch(t){a=0}s=new f(0),l=new f(0);var t=i("./styles.js"),e=document.createElement("style");e.setAttribute("type","text/css"),e.innerHTML=t,document.head.appendChild(e),(n=document.createElement("div")).style.display="none",n.id="boxzilla-overlay",document.body.appendChild(n),g.addEventListener("touchstart",m(y),!0),g.addEventListener("scroll",m(y),!0),window.addEventListener("resize",m(w)),window.addEventListener("load",w),n.addEventListener("click",x),window.setInterval(b,1e3),window.setTimeout(v,1e3),document.documentElement.addEventListener("mouseleave",z),document.documentElement.addEventListener("mouseenter",_),document.addEventListener("keyup",p),k(),window.addEventListener("focus",k),window.addEventListener("beforeunload",function(){S(),sessionStorage.setItem("boxzilla_pageviews",++a)}),window.addEventListener("blur",S),d.trigger("ready")},d.create=function(t,e){void 0!==e.minimumScreenWidth&&(e.screenWidthCondition={condition:"larger",value:e.minimumScreenWidth});var i=new h(t,e);return u.push(i),i},d.get=function(t){for(var e=0;e<u.length;e++){var i=u[e];if(i.id==t)return i}throw new Error("No box exists with ID "+t)},d.dismiss=function(t){void 0===t?u.forEach(function(t){t.dismiss()}):d.get(t).dismiss()},d.hide=function(t){void 0===t?u.forEach(function(t){t.hide()}):d.get(t).hide()},d.show=function(t){void 0===t?u.forEach(function(t){t.show()}):d.get(t).show()},d.toggle=function(t){void 0===t?u.forEach(function(t){t.toggle()}):d.get(t).toggle()},d.boxes=u,window.Boxzilla=d,void 0!==t&&t.exports&&(t.exports=d)},{"./box.js":4,"./styles.js":6,"./timer.js":7,"wolfy87-eventemitter":2}],6:[function(t,e,i){"use strict";e.exports="#boxzilla-overlay{position:fixed;background:rgba(0,0,0,.65);width:100%;height:100%;left:0;top:0;z-index:99999}.boxzilla-center-container{position:fixed;top:0;left:0;right:0;height:0;text-align:center;z-index:999999;line-height:0}.boxzilla-center-container .boxzilla{display:inline-block;text-align:left;position:relative;line-height:normal}.boxzilla{position:fixed;z-index:999999;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;padding:25px}.boxzilla.boxzilla-top-left{top:0;left:0}.boxzilla.boxzilla-top-right{top:0;right:0}.boxzilla.boxzilla-bottom-left{bottom:0;left:0}.boxzilla.boxzilla-bottom-right{bottom:0;right:0}.boxzilla-content>:first-child{margin-top:0;padding-top:0}.boxzilla-content>:last-child{margin-bottom:0;padding-bottom:0}.boxzilla-close-icon{position:absolute;right:0;top:0;text-align:center;padding:6px;cursor:pointer;-webkit-appearance:none;font-size:28px;font-weight:700;line-height:20px;color:#000;opacity:.5}.boxzilla-close-icon:focus,.boxzilla-close-icon:hover{opacity:.8}"},{}],7:[function(t,e,i){"use strict";var n=function(t){this.time=t,this.interval=0};n.prototype.tick=function(){this.time++},n.prototype.start=function(){this.interval||(this.interval=window.setInterval(this.tick.bind(this),1e3))},n.prototype.stop=function(){this.interval&&(window.clearInterval(this.interval),this.interval=0)},e.exports=n},{}]},{},[1])}();
2
  //# sourceMappingURL=script.min.js.map
1
+ !function(){var l=void 0;!function r(s,l,c){function a(e,t){if(!l[e]){if(!s[e]){var i=!1;if(!t&&i)return i(e,!0);if(d)return d(e,!0);var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var o=l[e]={exports:{}};s[e][0].call(o.exports,function(t){return a(s[e][1][t]||t)},o,o.exports,r,s,l,c)}return l[e].exports}for(var d=!1,t=0;t<c.length;t++)a(c[t]);return a}({1:[function(t,s,e){!function(t){"use strict";function e(){}var i=e.prototype,n=t.EventEmitter;function r(t,e){for(var i=t.length;i--;)if(t[i].listener===e)return i;return-1}function o(t){return function(){return this[t].apply(this,arguments)}}i.getListeners=function(t){var e,i,n=this._getEvents();if(t instanceof RegExp)for(i in e={},n)n.hasOwnProperty(i)&&t.test(i)&&(e[i]=n[i]);else e=n[t]||(n[t]=[]);return e},i.flattenListeners=function(t){var e,i=[];for(e=0;e<t.length;e+=1)i.push(t[e].listener);return i},i.getListenersAsObject=function(t){var e,i=this.getListeners(t);return i instanceof Array&&((e={})[t]=i),e||i},i.addListener=function(t,e){if(!function t(e){return"function"==typeof e||e instanceof RegExp||!(!e||"object"!=typeof e)&&t(e.listener)}(e))throw new TypeError("listener must be a function");var i,n=this.getListenersAsObject(t),o="object"==typeof e;for(i in n)n.hasOwnProperty(i)&&-1===r(n[i],e)&&n[i].push(o?e:{listener:e,once:!1});return this},i.on=o("addListener"),i.addOnceListener=function(t,e){return this.addListener(t,{listener:e,once:!0})},i.once=o("addOnceListener"),i.defineEvent=function(t){return this.getListeners(t),this},i.defineEvents=function(t){for(var e=0;e<t.length;e+=1)this.defineEvent(t[e]);return this},i.removeListener=function(t,e){var i,n,o=this.getListenersAsObject(t);for(n in o)o.hasOwnProperty(n)&&-1!==(i=r(o[n],e))&&o[n].splice(i,1);return this},i.off=o("removeListener"),i.addListeners=function(t,e){return this.manipulateListeners(!1,t,e)},i.removeListeners=function(t,e){return this.manipulateListeners(!0,t,e)},i.manipulateListeners=function(t,e,i){var n,o,r=t?this.removeListener:this.addListener,s=t?this.removeListeners:this.addListeners;if("object"!=typeof e||e instanceof RegExp)for(n=i.length;n--;)r.call(this,e,i[n]);else for(n in e)e.hasOwnProperty(n)&&(o=e[n])&&("function"==typeof o?r.call(this,n,o):s.call(this,n,o));return this},i.removeEvent=function(t){var e,i=typeof t,n=this._getEvents();if("string"===i)delete n[t];else if(t instanceof RegExp)for(e in n)n.hasOwnProperty(e)&&t.test(e)&&delete n[e];else delete this._events;return this},i.removeAllListeners=o("removeEvent"),i.emitEvent=function(t,e){var i,n,o,r,s=this.getListenersAsObject(t);for(r in s)if(s.hasOwnProperty(r))for(i=s[r].slice(0),o=0;o<i.length;o++)!0===(n=i[o]).once&&this.removeListener(t,n.listener),n.listener.apply(this,e||[])===this._getOnceReturnValue()&&this.removeListener(t,n.listener);return this},i.trigger=o("emitEvent"),i.emit=function(t){var e=Array.prototype.slice.call(arguments,1);return this.emitEvent(t,e)},i.setOnceReturnValue=function(t){return this._onceReturnValue=t,this},i._getOnceReturnValue=function(){return!this.hasOwnProperty("_onceReturnValue")||this._onceReturnValue},i._getEvents=function(){return this._events||(this._events={})},e.noConflict=function(){return t.EventEmitter=n,e},"function"==typeof l&&l.amd?l(function(){return e}):"object"==typeof s&&s.exports?s.exports=e:t.EventEmitter=e}("undefined"!=typeof window?window:this||{})},{}],2:[function(t,e,i){"use strict";var o=320;function a(t,e){for(var i in e)t.style[i]=e[i]}function d(a,d,u){var h=+new Date,t=window.getComputedStyle(a),f={},g={};for(var e in d){d[e]=parseFloat(d[e]);var i=d[e],n=parseFloat(t[e]);n!=i?(g[e]=(i-n)/o,f[e]=n):delete d[e]}!function t(){var e,i,n,o,r=+new Date-h,s=!0;for(var l in d){e=g[l],i=d[l],n=e*r,o=f[l]+n,0<e&&i<=o||e<0&&o<=i?o=i:s=!1,f[l]=o;var c="opacity"!==l?"px":"";a.style[l]=o+c}h=+new Date,s?u&&u():window.requestAnimationFrame&&requestAnimationFrame(t)||setTimeout(t,32)}()}e.exports={toggle:function(t,e,i){var n,o,r="none"!=t.style.display||0<t.offsetLeft,s=t.cloneNode(!0),l=function(){t.removeAttribute("data-animated"),t.setAttribute("style",s.getAttribute("style")),t.style.display=r?"none":"",i&&i()};if(t.setAttribute("data-animated","true"),r||(t.style.display=""),"slide"===e){if(n=function(t,e){for(var i={},n=0;n<t.length;n++)i[t[n]]=e;return i}(["height","borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],0),o={},!r){if(o=function(t,e){for(var i={},n=0;n<t.length;n++)i[t[n]]=e[t[n]];return i}(["height","borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],window.getComputedStyle(t)),!isFinite(o.height)){var c=t.getBoundingClientRect();o.height=c.height}a(t,n)}t.style.overflowY="hidden",d(t,r?n:o,l)}else n={opacity:0},o={opacity:1},r||a(t,n),d(t,r?n:o,l)},animate:d,animated:function(t){return!!t.getAttribute("data-animated")}}},{}],3:[function(t,e,i){"use strict";var n,o={animation:"fade",rehide:!1,content:"",cookie:null,icon:"&times",screenWidthCondition:null,position:"center",testMode:!1,trigger:!1,closable:!0},r=t("./animator.js");var s=function(t,e){this.id=t,this.config=function(t,e){var i={};for(var n in t)i[n]=t[n];for(var n in e)i[n]=e[n];return i}(o,e),this.overlay=document.getElementById("boxzilla-overlay"),this.visible=!1,this.dismissed=!1,this.triggered=!1,this.triggerHeight=this.calculateTriggerHeight(),this.cookieSet=this.isCookieSet(),this.element=null,this.contentElement=null,this.closeIcon=null,this.dom(),this.events()};s.prototype.events=function(){var e=this;this.closeIcon&&this.closeIcon.addEventListener("click",this.dismiss.bind(this)),this.element.addEventListener("click",function(t){"A"===t.target.tagName&&n.trigger("box.interactions.link",[e,t.target])},!1),this.element.addEventListener("submit",function(t){e.setCookie(),n.trigger("box.interactions.form",[e,t.target])},!1)},s.prototype.dom=function(){var t=document.createElement("div");t.className="boxzilla-container boxzilla-"+this.config.position+"-container";var e,i=document.createElement("div");if(i.setAttribute("id","boxzilla-"+this.id),i.className="boxzilla boxzilla-"+this.id+" boxzilla-"+this.config.position,i.style.display="none",t.appendChild(i),"string"==typeof this.config.content?(e=document.createElement("div")).innerHTML=this.config.content:(e=this.config.content).style.display="",e.className="boxzilla-content",i.appendChild(e),this.config.closable&&this.config.icon){var n=document.createElement("span");n.className="boxzilla-close-icon",n.innerHTML=this.config.icon,i.appendChild(n),this.closeIcon=n}document.body.appendChild(t),this.contentElement=e,this.element=i},s.prototype.setCustomBoxStyling=function(){var t=this.element.style.display;this.element.style.display="",this.element.style.overflowY="auto",this.element.style.maxHeight="none";var e=window.innerHeight,i=this.element.clientHeight;if(e<i&&(this.element.style.maxHeight=e+"px",this.element.style.overflowY="scroll"),"center"===this.config.position){var n=(e-i)/2;n=0<=n?n:0,this.element.style.marginTop=n+"px"}this.element.style.display=t},s.prototype.toggle=function(t){return void 0===t&&(t=!this.visible),t!==this.visible&&(!r.animated(this.element)&&(!(!t&&!this.config.closable)&&(this.visible=t,this.setCustomBoxStyling(),n.trigger("box."+(t?"show":"hide"),[this]),"center"===this.config.position&&(this.overlay.classList.toggle("boxzilla-"+this.id+"-overlay"),r.toggle(this.overlay,"fade")),r.toggle(this.element,this.config.animation,function(){this.visible||(this.contentElement.innerHTML=this.contentElement.innerHTML)}.bind(this)),!0)))},s.prototype.show=function(){return this.toggle(!0)},s.prototype.hide=function(){return this.toggle(!1)},s.prototype.calculateTriggerHeight=function(){var t,e,i=0;if(this.config.trigger)if("element"===this.config.trigger.method){var n=document.body.querySelector(this.config.trigger.value);if(n)i=n.getBoundingClientRect().top}else"percentage"===this.config.trigger.method&&(i=this.config.trigger.value/100*(t=document.body,e=document.documentElement,Math.max(t.scrollHeight,t.offsetHeight,e.clientHeight,e.scrollHeight,e.offsetHeight)));return i},s.prototype.fits=function(){if(!this.config.screenWidthCondition||!this.config.screenWidthCondition.value)return!0;switch(this.config.screenWidthCondition.condition){case"larger":return window.innerWidth>this.config.screenWidthCondition.value;case"smaller":return window.innerWidth<this.config.screenWidthCondition.value}return!0},s.prototype.onResize=function(){this.triggerHeight=this.calculateTriggerHeight(),this.setCustomBoxStyling()},s.prototype.mayAutoShow=function(){return!this.dismissed&&(!!this.fits()&&(!!this.config.trigger&&!this.cookieSet))},s.prototype.mayRehide=function(){return this.config.rehide&&this.triggered},s.prototype.isCookieSet=function(){return!(this.config.testMode||!this.config.trigger)&&(!(!this.config.cookie||!this.config.cookie.triggered&&!this.config.cookie.dismissed)&&"true"===document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*boxzilla_box_"+this.id+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))},s.prototype.setCookie=function(t){var e=new Date;e.setHours(e.getHours()+t),document.cookie="boxzilla_box_"+this.id+"=true; expires="+e.toUTCString()+"; path=/"},s.prototype.trigger=function(){this.show()&&(this.triggered=!0,this.config.cookie&&this.config.cookie.triggered&&this.setCookie(this.config.cookie.triggered))},s.prototype.dismiss=function(t){return t&&t.preventDefault(),!!this.visible&&(this.hide(),this.config.cookie&&this.config.cookie.dismissed&&this.setCookie(this.config.cookie.dismissed),this.dismissed=!0,n.trigger("box.dismiss",[this]),!0)},e.exports=function(t){return n=t,s}},{"./animator.js":2}],4:[function(t,e,i){"use strict";var n,o,r,s,l=t("wolfy87-eventemitter"),c=t("./timer.js"),a=Object.create(l.prototype),d=t("./box.js")(a),u=[],h=window,f=!1,g=t("./styles.js"),m=t("./triggers/exit-intent.js");function p(n,o,r){var s,l;return o||(o=250),function(){var t=r||this,e=+new Date,i=arguments;s&&e<s+o?(clearTimeout(l),l=setTimeout(function(){s=e,n.apply(t,i)},o)):(s=e,n.apply(t,i))}}function v(t){27===t.keyCode&&a.dismiss()}function b(){z()||u.forEach(function(t){t.mayAutoShow()&&"pageviews"===t.config.trigger.method&&s>=t.config.trigger.value&&t.trigger()})}function w(){z()||u.forEach(function(t){t.mayAutoShow()&&("time_on_site"===t.config.trigger.method&&o.time>=t.config.trigger.value&&t.trigger(),"time_on_page"===t.config.trigger.method&&r.time>=t.config.trigger.value&&t.trigger())})}function y(){var e=h.hasOwnProperty("pageYOffset")?h.pageYOffset:h.scrollTop;e+=.9*window.innerHeight,u.forEach(function(t){if(t.mayAutoShow()&&!(t.triggerHeight<=0)){if(e>t.triggerHeight){if(z())return;t.trigger()}t.mayRehide()&&e<t.triggerHeight-5&&t.hide()}})}function x(){u.forEach(function(t){t.onResize()})}function E(t){var i=t.offsetX,n=t.offsetY;u.forEach(function(t){var e=t.element.getBoundingClientRect();(i<e.left-40||i>e.right+40||n<e.top-40||n>e.bottom+40)&&t.dismiss()})}function L(){z()||u.forEach(function(t){t.mayAutoShow()&&"exit_intent"===t.config.trigger.method&&t.trigger()})}function z(){return 0<u.filter(function(t){return t.visible}).length}function _(t){for(var e=t.target||t.srcElement,i=0;i<=3&&(e&&"A"!==e.tagName);i++)e=e.parentElement;if(e&&"A"===e.tagName&&e.getAttribute("href")&&0===e.getAttribute("href").toLowerCase().indexOf("#boxzilla-")){var n=e.getAttribute("href").toLowerCase().substring("#boxzilla-".length);a.toggle(n)}}var k=function(){try{var t=sessionStorage.getItem("boxzilla_timer");t&&(o.time=t)}catch(t){}o.start(),r.start()},C=function(){sessionStorage.setItem("boxzilla_timer",o.time),o.stop(),r.stop()};a.init=function(){if(!f){document.body.addEventListener("click",_,!0);try{s=sessionStorage.getItem("boxzilla_pageviews")||0}catch(t){s=0}o=new c(0),r=new c(0);var t=document.createElement("style");t.setAttribute("type","text/css"),t.innerHTML=g,document.head.appendChild(t),(n=document.createElement("div")).style.display="none",n.id="boxzilla-overlay",document.body.appendChild(n),new m(L),h.addEventListener("touchstart",p(y),!0),h.addEventListener("scroll",p(y),!0),window.addEventListener("resize",p(x)),window.addEventListener("load",x),n.addEventListener("click",E),window.setInterval(w,1e3),window.setTimeout(b,1e3),document.addEventListener("keyup",v),k(),window.addEventListener("focus",k),window.addEventListener("beforeunload",function(){C(),sessionStorage.setItem("boxzilla_pageviews",++s)}),window.addEventListener("blur",C),a.trigger("ready"),f=!0}},a.create=function(t,e){void 0!==e.minimumScreenWidth&&(e.screenWidthCondition={condition:"larger",value:e.minimumScreenWidth});var i=new d(t,e);return u.push(i),i},a.get=function(t){for(var e=0;e<u.length;e++){var i=u[e];if(i.id==t)return i}throw new Error("No box exists with ID "+t)},a.dismiss=function(t){void 0===t?u.forEach(function(t){t.dismiss()}):a.get(t).dismiss()},a.hide=function(t){void 0===t?u.forEach(function(t){t.hide()}):a.get(t).hide()},a.show=function(t){void 0===t?u.forEach(function(t){t.show()}):a.get(t).show()},a.toggle=function(t){void 0===t?u.forEach(function(t){t.toggle()}):a.get(t).toggle()},a.boxes=u,window.Boxzilla=a,void 0!==e&&e.exports&&(e.exports=a)},{"./box.js":3,"./styles.js":5,"./timer.js":6,"./triggers/exit-intent.js":7,"wolfy87-eventemitter":1}],5:[function(t,e,i){"use strict";e.exports="#boxzilla-overlay{position:fixed;background:rgba(0,0,0,.65);width:100%;height:100%;left:0;top:0;z-index:99999}.boxzilla-center-container{position:fixed;top:0;left:0;right:0;height:0;text-align:center;z-index:999999;line-height:0}.boxzilla-center-container .boxzilla{display:inline-block;text-align:left;position:relative;line-height:normal}.boxzilla{position:fixed;z-index:999999;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;padding:25px}.boxzilla.boxzilla-top-left{top:0;left:0}.boxzilla.boxzilla-top-right{top:0;right:0}.boxzilla.boxzilla-bottom-left{bottom:0;left:0}.boxzilla.boxzilla-bottom-right{bottom:0;right:0}.boxzilla-content>:first-child{margin-top:0;padding-top:0}.boxzilla-content>:last-child{margin-bottom:0;padding-bottom:0}.boxzilla-close-icon{position:absolute;right:0;top:0;text-align:center;padding:6px;cursor:pointer;-webkit-appearance:none;font-size:28px;font-weight:700;line-height:20px;color:#000;opacity:.5}.boxzilla-close-icon:focus,.boxzilla-close-icon:hover{opacity:.8}"},{}],6:[function(t,e,i){"use strict";var n=function(t){this.time=t,this.interval=0};n.prototype.tick=function(){this.time++},n.prototype.start=function(){this.interval||(this.interval=window.setInterval(this.tick.bind(this),1e3))},n.prototype.stop=function(){this.interval&&(window.clearInterval(this.interval),this.interval=0)},e.exports=n},{}],7:[function(t,e,i){"use strict";e.exports=function(t){var e=null,i={};function n(){document.documentElement.removeEventListener("mouseleave",s),document.documentElement.removeEventListener("mouseenter",r),document.documentElement.removeEventListener("click",o),window.removeEventListener("touchstart",l),window.removeEventListener("touchend",c),t()}function o(){null!==e&&(window.clearTimeout(e),e=null)}function r(t){o()}function s(t){o(),t.clientY<=0&&t.clientX<.8*window.innerWidth&&(e=window.setTimeout(n,400))}function l(t){o(),i={timestamp:performance.now(),scrollY:window.scrollY,windowHeight:window.innerHeight}}function c(t){o(),window.innerHeight>i.windowHeight||window.scrollY+20>=i.scrollY||300<performance.now()-i.timestamp||-1<["A","INPUT","BUTTON"].indexOf(t.target.tagName)||(e=window.setTimeout(n,800))}window.addEventListener("touchstart",l),window.addEventListener("touchend",c),document.documentElement.addEventListener("mouseenter",r),document.documentElement.addEventListener("mouseleave",s),document.documentElement.addEventListener("click",o)}},{}],8:[function(t,e,i){"use strict";function d(t){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(){var s=t("boxzilla"),l=window.boxzilla_options;function c(t){if(!window.location.hash||0===window.location.hash.length)return!1;var e=window.location.hash.substring(1);return!!/^[a-zA-Z\-\_0-9]+$/.test(e)&&(e===t.element.id||!!t.element.querySelector("#"+e))}window.Boxzilla=s;var a=-1<document.body.className.indexOf("logged-in");a&&l.testMode&&console.log("Boxzilla: Test mode is enabled. Please disable test mode if you're done testing."),s.init(),window.addEventListener("load",function(){if(!l.inited){for(var t in l.boxes){var e=l.boxes[t];e.testMode=a&&l.testMode;var i=document.getElementById("boxzilla-box-"+e.id+"-content");if(i){e.content=i;var n=s.create(e.id,e);n.element.className=n.element.className+" boxzilla-"+e.post.slug,o=n.element,(r=e.css).background_color&&(o.style.background=r.background_color),r.color&&(o.style.color=r.color),r.border_color&&(o.style.borderColor=r.border_color),r.border_width&&(o.style.borderWidth=parseInt(r.border_width)+"px"),r.border_style&&(o.style.borderStyle=r.border_style),r.width&&(o.style.maxWidth=parseInt(r.width)+"px"),n.element.firstChild.firstChild.className+=" first-child",n.element.firstChild.lastChild.className+=" last-child",n.fits()&&c(n)&&n.show()}}var o,r;l.inited=!0,s.trigger("done"),function(){if("object"===d(window.mc4wp_forms_config)&&window.mc4wp_forms_config.submitted_form){var t="#"+window.mc4wp_forms_config.submitted_form.element_id,e=s.boxes;for(var i in e)if(e.hasOwnProperty(i)){var n=e[i];if(n.element.querySelector(t))return n.show()}}}()}})}()},{boxzilla:4}]},{},[8])}();
2
  //# sourceMappingURL=script.min.js.map
assets/js/script.min.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["script.js"],"names":["define","undefined","r","e","n","t","o","i","f","c","u","a","Error","code","p","exports","call","length","1","require","module","_typeof","obj","Symbol","iterator","constructor","prototype","Boxzilla","options","window","boxzilla_options","locationHashRefersBox","box","location","hash","elementId","substring","test","element","id","querySelector","isLoggedIn","document","body","className","indexOf","testMode","console","log","init","addEventListener","inited","key","boxes","boxOpts","boxContentElement","getElementById","content","create","post","slug","styles","css","background_color","style","background","color","border_color","borderColor","border_width","borderWidth","parseInt","border_style","borderStyle","width","maxWidth","firstChild","lastChild","fits","show","trigger","mc4wp_forms_config","submitted_form","selector","element_id","boxId","hasOwnProperty","maybeOpenMailChimpForWordPressBox","boxzilla","2","EventEmitter","proto","this","originalGlobalValue","indexOfListener","listeners","listener","alias","name","apply","arguments","getListeners","evt","response","events","_getEvents","RegExp","flattenListeners","flatListeners","push","getListenersAsObject","Array","addListener","listenerIsWrapped","once","on","addOnceListener","defineEvent","defineEvents","evts","removeListener","index","splice","off","addListeners","manipulateListeners","removeListeners","remove","value","single","multiple","removeEvent","type","_events","removeAllListeners","emitEvent","args","listenersMap","slice","_getOnceReturnValue","emit","setOnceReturnValue","_onceReturnValue","noConflict","amd","3","duration","property","animate","targetStyles","fn","last","Date","initialStyles","getComputedStyle","currentStyles","propSteps","parseFloat","to","current","tick","step","increment","newValue","timeSinceLastTick","done","suffix","requestAnimationFrame","setTimeout","toggle","animation","callbackFn","hiddenStyles","visibleStyles","nowVisible","display","offsetLeft","clone","cloneNode","cleanup","removeAttribute","setAttribute","getAttribute","properties","newObject","initObjectProperties","object","copyObjectProperties","isFinite","height","clientRect","getBoundingClientRect","overflowY","opacity","animated","4","defaults","rehide","cookie","icon","screenWidthCondition","position","closable","Animator","Box","config","obj1","obj2","obj3","attrname","merge","overlay","visible","dismissed","triggered","triggerHeight","calculateTriggerHeight","cookieSet","isCookieSet","contentElement","closeIcon","dom","dismiss","bind","target","tagName","setCookie","wrapper","createElement","appendChild","innerHTML","setCustomBoxStyling","origDisplay","maxHeight","windowHeight","innerHeight","boxHeight","clientHeight","newTopMargin","marginTop","classList","hide","html","method","triggerElement","top","documentElement","Math","max","scrollHeight","offsetHeight","condition","innerWidth","onResize","mayAutoShow","mayRehide","replace","hours","expiryDate","setHours","getHours","toUTCString","preventDefault","_Boxzilla","./animator.js","5","exitIntentDelayTimer","exitIntentTriggered","siteTimer","pageTimer","pageViews","Object","Timer","scrollElement","throttle","threshhold","scope","deferTimer","context","now","clearTimeout","onKeyUp","keyCode","checkPageViewsCriteria","isAnyBoxVisible","forEach","checkTimeCriteria","time","checkHeightCriteria","scrollY","pageYOffset","scrollTop","recalculateHeights","onOverlayClick","x","offsetX","y","offsetY","rect","left","right","bottom","triggerExitIntent","onMouseLeave","clientY","onMouseEnter","clearInterval","onElementClick","el","srcElement","parentElement","toLowerCase","timers","sessionTime","sessionStorage","getItem","start","setItem","stop","styleElement","head","setInterval","opts","minimumScreenWidth","get","./box.js","./styles.js","./timer.js","wolfy87-eventemitter","6","7","interval"],"mappings":"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","file":"script.min.js","sourcesContent":["(function () { var require = undefined; var module = undefined; var exports = undefined; var define = undefined; (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n\"use strict\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n(function () {\n 'use strict';\n\n var Boxzilla = require('boxzilla');\n\n var options = window.boxzilla_options; // expose Boxzilla object to window\n\n window.Boxzilla = Boxzilla; // helper function for setting CSS styles\n\n function css(element, styles) {\n if (styles.background_color) {\n element.style.background = styles.background_color;\n }\n\n if (styles.color) {\n element.style.color = styles.color;\n }\n\n if (styles.border_color) {\n element.style.borderColor = styles.border_color;\n }\n\n if (styles.border_width) {\n element.style.borderWidth = parseInt(styles.border_width) + \"px\";\n }\n\n if (styles.border_style) {\n element.style.borderStyle = styles.border_style;\n }\n\n if (styles.width) {\n element.style.maxWidth = parseInt(styles.width) + \"px\";\n }\n }\n\n function createBoxesFromConfig() {\n // failsafe against including script twice.\n if (options.inited) {\n return;\n } // create boxes from options\n\n\n for (var key in options.boxes) {\n // get opts\n var boxOpts = options.boxes[key];\n boxOpts.testMode = isLoggedIn && options.testMode; // find box content element, bail if not found\n\n var boxContentElement = document.getElementById('boxzilla-box-' + boxOpts.id + '-content');\n\n if (!boxContentElement) {\n continue;\n } // use element as content option\n\n\n boxOpts.content = boxContentElement; // create box\n\n var box = Boxzilla.create(boxOpts.id, boxOpts); // add box slug to box element as classname\n\n box.element.className = box.element.className + ' boxzilla-' + boxOpts.post.slug; // add custom css to box\n\n css(box.element, boxOpts.css);\n box.element.firstChild.firstChild.className += \" first-child\";\n box.element.firstChild.lastChild.className += \" last-child\"; // maybe show box right away\n\n if (box.fits() && locationHashRefersBox(box)) {\n box.show();\n }\n } // set flag to prevent initialising twice\n\n\n options.inited = true; // trigger \"done\" event.\n\n Boxzilla.trigger('done'); // maybe open box with MC4WP form in it\n\n maybeOpenMailChimpForWordPressBox();\n }\n\n function locationHashRefersBox(box) {\n if (!window.location.hash || 0 === window.location.hash.length) {\n return false;\n }\n\n var elementId = window.location.hash.substring(1); // only attempt on strings looking like an ID \n\n var regex = /^[a-zA-Z\\-\\_0-9]+$/;\n\n if (!regex.test(elementId)) {\n return false;\n }\n\n if (elementId === box.element.id) {\n return true;\n } else if (box.element.querySelector('#' + elementId)) {\n return true;\n }\n\n return false;\n }\n\n function maybeOpenMailChimpForWordPressBox() {\n if (_typeof(window.mc4wp_forms_config) !== \"object\" || !window.mc4wp_forms_config.submitted_form) {\n return;\n }\n\n var selector = '#' + window.mc4wp_forms_config.submitted_form.element_id;\n var boxes = Boxzilla.boxes;\n\n for (var boxId in boxes) {\n if (!boxes.hasOwnProperty(boxId)) {\n continue;\n }\n\n var box = boxes[boxId];\n\n if (box.element.querySelector(selector)) {\n box.show();\n return;\n }\n }\n } // print message when test mode is enabled\n\n\n var isLoggedIn = document.body.className.indexOf('logged-in') > -1;\n\n if (isLoggedIn && options.testMode) {\n console.log('Boxzilla: Test mode is enabled. Please disable test mode if you\\'re done testing.');\n } // init boxzilla\n\n\n Boxzilla.init(); // on window.load, create DOM elements for boxes\n\n window.addEventListener('load', createBoxesFromConfig);\n})();\n\n},{\"boxzilla\":5}],2:[function(require,module,exports){\n/*!\n * EventEmitter v4.2.11 - git.io/ee\n * Unlicense - http://unlicense.org/\n * Oliver Caldwell - http://oli.me.uk/\n * @preserve\n */\n\n;(function () {\n 'use strict';\n\n /**\n * Class for managing events.\n * Can be extended to provide event functionality in other classes.\n *\n * @class EventEmitter Manages event registering and emitting.\n */\n function EventEmitter() {}\n\n // Shortcuts to improve speed and size\n var proto = EventEmitter.prototype;\n var exports = this;\n var originalGlobalValue = exports.EventEmitter;\n\n /**\n * Finds the index of the listener for the event in its storage array.\n *\n * @param {Function[]} listeners Array of listeners to search through.\n * @param {Function} listener Method to look for.\n * @return {Number} Index of the specified listener, -1 if not found\n * @api private\n */\n function indexOfListener(listeners, listener) {\n var i = listeners.length;\n while (i--) {\n if (listeners[i].listener === listener) {\n return i;\n }\n }\n\n return -1;\n }\n\n /**\n * Alias a method while keeping the context correct, to allow for overwriting of target method.\n *\n * @param {String} name The name of the target method.\n * @return {Function} The aliased method\n * @api private\n */\n function alias(name) {\n return function aliasClosure() {\n return this[name].apply(this, arguments);\n };\n }\n\n /**\n * Returns the listener array for the specified event.\n * Will initialise the event object and listener arrays if required.\n * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them.\n * Each property in the object response is an array of listener functions.\n *\n * @param {String|RegExp} evt Name of the event to return the listeners from.\n * @return {Function[]|Object} All listener functions for the event.\n */\n proto.getListeners = function getListeners(evt) {\n var events = this._getEvents();\n var response;\n var key;\n\n // Return a concatenated array of all matching events if\n // the selector is a regular expression.\n if (evt instanceof RegExp) {\n response = {};\n for (key in events) {\n if (events.hasOwnProperty(key) && evt.test(key)) {\n response[key] = events[key];\n }\n }\n }\n else {\n response = events[evt] || (events[evt] = []);\n }\n\n return response;\n };\n\n /**\n * Takes a list of listener objects and flattens it into a list of listener functions.\n *\n * @param {Object[]} listeners Raw listener objects.\n * @return {Function[]} Just the listener functions.\n */\n proto.flattenListeners = function flattenListeners(listeners) {\n var flatListeners = [];\n var i;\n\n for (i = 0; i < listeners.length; i += 1) {\n flatListeners.push(listeners[i].listener);\n }\n\n return flatListeners;\n };\n\n /**\n * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful.\n *\n * @param {String|RegExp} evt Name of the event to return the listeners from.\n * @return {Object} All listener functions for an event in an object.\n */\n proto.getListenersAsObject = function getListenersAsObject(evt) {\n var listeners = this.getListeners(evt);\n var response;\n\n if (listeners instanceof Array) {\n response = {};\n response[evt] = listeners;\n }\n\n return response || listeners;\n };\n\n /**\n * Adds a listener function to the specified event.\n * The listener will not be added if it is a duplicate.\n * If the listener returns true then it will be removed after it is called.\n * If you pass a regular expression as the event name then the listener will be added to all events that match it.\n *\n * @param {String|RegExp} evt Name of the event to attach the listener to.\n * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.addListener = function addListener(evt, listener) {\n var listeners = this.getListenersAsObject(evt);\n var listenerIsWrapped = typeof listener === 'object';\n var key;\n\n for (key in listeners) {\n if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) {\n listeners[key].push(listenerIsWrapped ? listener : {\n listener: listener,\n once: false\n });\n }\n }\n\n return this;\n };\n\n /**\n * Alias of addListener\n */\n proto.on = alias('addListener');\n\n /**\n * Semi-alias of addListener. It will add a listener that will be\n * automatically removed after its first execution.\n *\n * @param {String|RegExp} evt Name of the event to attach the listener to.\n * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.addOnceListener = function addOnceListener(evt, listener) {\n return this.addListener(evt, {\n listener: listener,\n once: true\n });\n };\n\n /**\n * Alias of addOnceListener.\n */\n proto.once = alias('addOnceListener');\n\n /**\n * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad.\n * You need to tell it what event names should be matched by a regex.\n *\n * @param {String} evt Name of the event to create.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.defineEvent = function defineEvent(evt) {\n this.getListeners(evt);\n return this;\n };\n\n /**\n * Uses defineEvent to define multiple events.\n *\n * @param {String[]} evts An array of event names to define.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.defineEvents = function defineEvents(evts) {\n for (var i = 0; i < evts.length; i += 1) {\n this.defineEvent(evts[i]);\n }\n return this;\n };\n\n /**\n * Removes a listener function from the specified event.\n * When passed a regular expression as the event name, it will remove the listener from all events that match it.\n *\n * @param {String|RegExp} evt Name of the event to remove the listener from.\n * @param {Function} listener Method to remove from the event.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.removeListener = function removeListener(evt, listener) {\n var listeners = this.getListenersAsObject(evt);\n var index;\n var key;\n\n for (key in listeners) {\n if (listeners.hasOwnProperty(key)) {\n index = indexOfListener(listeners[key], listener);\n\n if (index !== -1) {\n listeners[key].splice(index, 1);\n }\n }\n }\n\n return this;\n };\n\n /**\n * Alias of removeListener\n */\n proto.off = alias('removeListener');\n\n /**\n * Adds listeners in bulk using the manipulateListeners method.\n * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added.\n * You can also pass it a regular expression to add the array of listeners to all events that match it.\n * Yeah, this function does quite a bit. That's probably a bad thing.\n *\n * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once.\n * @param {Function[]} [listeners] An optional array of listener functions to add.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.addListeners = function addListeners(evt, listeners) {\n // Pass through to manipulateListeners\n return this.manipulateListeners(false, evt, listeners);\n };\n\n /**\n * Removes listeners in bulk using the manipulateListeners method.\n * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n * You can also pass it an event name and an array of listeners to be removed.\n * You can also pass it a regular expression to remove the listeners from all events that match it.\n *\n * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once.\n * @param {Function[]} [listeners] An optional array of listener functions to remove.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.removeListeners = function removeListeners(evt, listeners) {\n // Pass through to manipulateListeners\n return this.manipulateListeners(true, evt, listeners);\n };\n\n /**\n * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level.\n * The first argument will determine if the listeners are removed (true) or added (false).\n * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n * You can also pass it an event name and an array of listeners to be added/removed.\n * You can also pass it a regular expression to manipulate the listeners of all events that match it.\n *\n * @param {Boolean} remove True if you want to remove listeners, false if you want to add.\n * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once.\n * @param {Function[]} [listeners] An optional array of listener functions to add/remove.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) {\n var i;\n var value;\n var single = remove ? this.removeListener : this.addListener;\n var multiple = remove ? this.removeListeners : this.addListeners;\n\n // If evt is an object then pass each of its properties to this method\n if (typeof evt === 'object' && !(evt instanceof RegExp)) {\n for (i in evt) {\n if (evt.hasOwnProperty(i) && (value = evt[i])) {\n // Pass the single listener straight through to the singular method\n if (typeof value === 'function') {\n single.call(this, i, value);\n }\n else {\n // Otherwise pass back to the multiple function\n multiple.call(this, i, value);\n }\n }\n }\n }\n else {\n // So evt must be a string\n // And listeners must be an array of listeners\n // Loop over it and pass each one to the multiple method\n i = listeners.length;\n while (i--) {\n single.call(this, evt, listeners[i]);\n }\n }\n\n return this;\n };\n\n /**\n * Removes all listeners from a specified event.\n * If you do not specify an event then all listeners will be removed.\n * That means every event will be emptied.\n * You can also pass a regex to remove all events that match it.\n *\n * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.removeEvent = function removeEvent(evt) {\n var type = typeof evt;\n var events = this._getEvents();\n var key;\n\n // Remove different things depending on the state of evt\n if (type === 'string') {\n // Remove all listeners for the specified event\n delete events[evt];\n }\n else if (evt instanceof RegExp) {\n // Remove all events matching the regex.\n for (key in events) {\n if (events.hasOwnProperty(key) && evt.test(key)) {\n delete events[key];\n }\n }\n }\n else {\n // Remove all listeners in all events\n delete this._events;\n }\n\n return this;\n };\n\n /**\n * Alias of removeEvent.\n *\n * Added to mirror the node API.\n */\n proto.removeAllListeners = alias('removeEvent');\n\n /**\n * Emits an event of your choice.\n * When emitted, every listener attached to that event will be executed.\n * If you pass the optional argument array then those arguments will be passed to every listener upon execution.\n * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.\n * So they will not arrive within the array on the other side, they will be separate.\n * You can also pass a regular expression to emit to all events that match it.\n *\n * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n * @param {Array} [args] Optional array of arguments to be passed to each listener.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.emitEvent = function emitEvent(evt, args) {\n var listenersMap = this.getListenersAsObject(evt);\n var listeners;\n var listener;\n var i;\n var key;\n var response;\n\n for (key in listenersMap) {\n if (listenersMap.hasOwnProperty(key)) {\n listeners = listenersMap[key].slice(0);\n i = listeners.length;\n\n while (i--) {\n // If the listener returns true then it shall be removed from the event\n // The function is executed either with a basic call or an apply if there is an args array\n listener = listeners[i];\n\n if (listener.once === true) {\n this.removeListener(evt, listener.listener);\n }\n\n response = listener.listener.apply(this, args || []);\n\n if (response === this._getOnceReturnValue()) {\n this.removeListener(evt, listener.listener);\n }\n }\n }\n }\n\n return this;\n };\n\n /**\n * Alias of emitEvent\n */\n proto.trigger = alias('emitEvent');\n\n /**\n * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on.\n * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it.\n *\n * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n * @param {...*} Optional additional arguments to be passed to each listener.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.emit = function emit(evt) {\n var args = Array.prototype.slice.call(arguments, 1);\n return this.emitEvent(evt, args);\n };\n\n /**\n * Sets the current value to check against when executing listeners. If a\n * listeners return value matches the one set here then it will be removed\n * after execution. This value defaults to true.\n *\n * @param {*} value The new value to check for when executing listeners.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.setOnceReturnValue = function setOnceReturnValue(value) {\n this._onceReturnValue = value;\n return this;\n };\n\n /**\n * Fetches the current value to check against when executing listeners. If\n * the listeners return value matches this one then it should be removed\n * automatically. It will return true by default.\n *\n * @return {*|Boolean} The current value to check for or the default, true.\n * @api private\n */\n proto._getOnceReturnValue = function _getOnceReturnValue() {\n if (this.hasOwnProperty('_onceReturnValue')) {\n return this._onceReturnValue;\n }\n else {\n return true;\n }\n };\n\n /**\n * Fetches the events object and creates one if required.\n *\n * @return {Object} The events storage object.\n * @api private\n */\n proto._getEvents = function _getEvents() {\n return this._events || (this._events = {});\n };\n\n /**\n * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version.\n *\n * @return {Function} Non conflicting EventEmitter class.\n */\n EventEmitter.noConflict = function noConflict() {\n exports.EventEmitter = originalGlobalValue;\n return EventEmitter;\n };\n\n // Expose the class either via AMD, CommonJS or the global object\n if (typeof define === 'function' && define.amd) {\n define(function () {\n return EventEmitter;\n });\n }\n else if (typeof module === 'object' && module.exports){\n module.exports = EventEmitter;\n }\n else {\n exports.EventEmitter = EventEmitter;\n }\n}.call(this));\n\n},{}],3:[function(require,module,exports){\n\"use strict\";\n\nvar duration = 320;\n\nfunction css(element, styles) {\n for (var property in styles) {\n element.style[property] = styles[property];\n }\n}\n\nfunction initObjectProperties(properties, value) {\n var newObject = {};\n\n for (var i = 0; i < properties.length; i++) {\n newObject[properties[i]] = value;\n }\n\n return newObject;\n}\n\nfunction copyObjectProperties(properties, object) {\n var newObject = {};\n\n for (var i = 0; i < properties.length; i++) {\n newObject[properties[i]] = object[properties[i]];\n }\n\n return newObject;\n}\n/**\n * Checks if the given element is currently being animated.\n *\n * @param element\n * @returns {boolean}\n */\n\n\nfunction animated(element) {\n return !!element.getAttribute('data-animated');\n}\n/**\n * Toggles the element using the given animation.\n *\n * @param element\n * @param animation Either \"fade\" or \"slide\"\n */\n\n\nfunction toggle(element, animation, callbackFn) {\n var nowVisible = element.style.display != 'none' || element.offsetLeft > 0; // create clone for reference\n\n var clone = element.cloneNode(true);\n\n var cleanup = function cleanup() {\n element.removeAttribute('data-animated');\n element.setAttribute('style', clone.getAttribute('style'));\n element.style.display = nowVisible ? 'none' : '';\n\n if (callbackFn) {\n callbackFn();\n }\n }; // store attribute so everyone knows we're animating this element\n\n\n element.setAttribute('data-animated', \"true\"); // toggle element visiblity right away if we're making something visible\n\n if (!nowVisible) {\n element.style.display = '';\n }\n\n var hiddenStyles, visibleStyles; // animate properties\n\n if (animation === 'slide') {\n hiddenStyles = initObjectProperties([\"height\", \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"], 0);\n visibleStyles = {};\n\n if (!nowVisible) {\n var computedStyles = window.getComputedStyle(element);\n visibleStyles = copyObjectProperties([\"height\", \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"], computedStyles); // in some browsers, getComputedStyle returns \"auto\" value. this falls back to getBoundingClientRect() in those browsers since we need an actual height.\n\n if (!isFinite(visibleStyles.height)) {\n var clientRect = element.getBoundingClientRect();\n visibleStyles.height = clientRect.height;\n }\n\n css(element, hiddenStyles);\n } // don't show a scrollbar during animation\n\n\n element.style.overflowY = 'hidden';\n animate(element, nowVisible ? hiddenStyles : visibleStyles, cleanup);\n } else {\n hiddenStyles = {\n opacity: 0\n };\n visibleStyles = {\n opacity: 1\n };\n\n if (!nowVisible) {\n css(element, hiddenStyles);\n }\n\n animate(element, nowVisible ? hiddenStyles : visibleStyles, cleanup);\n }\n}\n\nfunction animate(element, targetStyles, fn) {\n var last = +new Date();\n var initialStyles = window.getComputedStyle(element);\n var currentStyles = {};\n var propSteps = {};\n\n for (var property in targetStyles) {\n // make sure we have an object filled with floats\n targetStyles[property] = parseFloat(targetStyles[property]); // calculate step size & current value\n\n var to = targetStyles[property];\n var current = parseFloat(initialStyles[property]); // is there something to do?\n\n if (current == to) {\n delete targetStyles[property];\n continue;\n }\n\n propSteps[property] = (to - current) / duration; // points per second\n\n currentStyles[property] = current;\n }\n\n var tick = function tick() {\n var now = +new Date();\n var timeSinceLastTick = now - last;\n var done = true;\n var step, to, increment, newValue;\n\n for (var property in targetStyles) {\n step = propSteps[property];\n to = targetStyles[property];\n increment = step * timeSinceLastTick;\n newValue = currentStyles[property] + increment;\n\n if (step > 0 && newValue >= to || step < 0 && newValue <= to) {\n newValue = to;\n } else {\n done = false;\n } // store new value\n\n\n currentStyles[property] = newValue;\n var suffix = property !== \"opacity\" ? \"px\" : \"\";\n element.style[property] = newValue + suffix;\n }\n\n last = +new Date(); // keep going until we're done for all props\n\n if (!done) {\n window.requestAnimationFrame && requestAnimationFrame(tick) || setTimeout(tick, 32);\n } else {\n // call callback\n fn && fn();\n }\n };\n\n tick();\n}\n\nmodule.exports = {\n 'toggle': toggle,\n 'animate': animate,\n 'animated': animated\n};\n\n},{}],4:[function(require,module,exports){\n'use strict';\n\nvar defaults = {\n 'animation': 'fade',\n 'rehide': false,\n 'content': '',\n 'cookie': null,\n 'icon': '&times',\n 'screenWidthCondition': null,\n 'position': 'center',\n 'testMode': false,\n 'trigger': false,\n 'closable': true\n},\n Boxzilla,\n Animator = require('./animator.js');\n/**\n* Merge 2 objects, values of the latter overwriting the former.\n*\n* @param obj1\n* @param obj2\n* @returns {*}\n*/\n\n\nfunction merge(obj1, obj2) {\n var obj3 = {};\n\n for (var attrname in obj1) {\n obj3[attrname] = obj1[attrname];\n }\n\n for (var attrname in obj2) {\n obj3[attrname] = obj2[attrname];\n }\n\n return obj3;\n}\n/**\n* Get the real height of entire document.\n* @returns {number}\n*/\n\n\nfunction getDocumentHeight() {\n var body = document.body,\n html = document.documentElement;\n var height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n return height;\n} // Box Object\n\n\nvar Box = function Box(id, config) {\n this.id = id; // store config values\n\n this.config = merge(defaults, config); // store ref to overlay\n\n this.overlay = document.getElementById('boxzilla-overlay'); // state\n\n this.visible = false;\n this.dismissed = false;\n this.triggered = false;\n this.triggerHeight = this.calculateTriggerHeight();\n this.cookieSet = this.isCookieSet();\n this.element = null;\n this.contentElement = null;\n this.closeIcon = null; // create dom elements for this box\n\n this.dom(); // further initialise the box\n\n this.events();\n}; // initialise the box\n\n\nBox.prototype.events = function () {\n var box = this; // attach event to \"close\" icon inside box\n\n if (this.closeIcon) {\n this.closeIcon.addEventListener('click', this.dismiss.bind(this));\n }\n\n this.element.addEventListener('click', function (e) {\n if (e.target.tagName === 'A') {\n Boxzilla.trigger('box.interactions.link', [box, e.target]);\n }\n }, false);\n this.element.addEventListener('submit', function (e) {\n box.setCookie();\n Boxzilla.trigger('box.interactions.form', [box, e.target]);\n }, false);\n}; // generate dom elements for this box\n\n\nBox.prototype.dom = function () {\n var wrapper = document.createElement('div');\n wrapper.className = 'boxzilla-container boxzilla-' + this.config.position + '-container';\n var box = document.createElement('div');\n box.setAttribute('id', 'boxzilla-' + this.id);\n box.className = 'boxzilla boxzilla-' + this.id + ' boxzilla-' + this.config.position;\n box.style.display = 'none';\n wrapper.appendChild(box);\n var content;\n\n if (typeof this.config.content === \"string\") {\n content = document.createElement('div');\n content.innerHTML = this.config.content;\n } else {\n content = this.config.content; // make sure element is visible\n\n content.style.display = '';\n }\n\n content.className = 'boxzilla-content';\n box.appendChild(content);\n\n if (this.config.closable && this.config.icon) {\n var closeIcon = document.createElement('span');\n closeIcon.className = \"boxzilla-close-icon\";\n closeIcon.innerHTML = this.config.icon;\n box.appendChild(closeIcon);\n this.closeIcon = closeIcon;\n }\n\n document.body.appendChild(wrapper);\n this.contentElement = content;\n this.element = box;\n}; // set (calculate) custom box styling depending on box options\n\n\nBox.prototype.setCustomBoxStyling = function () {\n // reset element to its initial state\n var origDisplay = this.element.style.display;\n this.element.style.display = '';\n this.element.style.overflowY = 'auto';\n this.element.style.maxHeight = 'none'; // get new dimensions\n\n var windowHeight = window.innerHeight;\n var boxHeight = this.element.clientHeight; // add scrollbar to box and limit height\n\n if (boxHeight > windowHeight) {\n this.element.style.maxHeight = windowHeight + \"px\";\n this.element.style.overflowY = 'scroll';\n } // set new top margin for boxes which are centered\n\n\n if (this.config.position === 'center') {\n var newTopMargin = (windowHeight - boxHeight) / 2;\n newTopMargin = newTopMargin >= 0 ? newTopMargin : 0;\n this.element.style.marginTop = newTopMargin + \"px\";\n }\n\n this.element.style.display = origDisplay;\n}; // toggle visibility of the box\n\n\nBox.prototype.toggle = function (show) {\n // revert visibility if no explicit argument is given\n if (typeof show === \"undefined\") {\n show = !this.visible;\n } // is box already at desired visibility?\n\n\n if (show === this.visible) {\n return false;\n } // is box being animated?\n\n\n if (Animator.animated(this.element)) {\n return false;\n } // if box should be hidden but is not closable, bail.\n\n\n if (!show && !this.config.closable) {\n return false;\n } // set new visibility status\n\n\n this.visible = show; // calculate new styling rules\n\n this.setCustomBoxStyling(); // trigger event\n\n Boxzilla.trigger('box.' + (show ? 'show' : 'hide'), [this]); // show or hide box using selected animation\n\n if (this.config.position === 'center') {\n this.overlay.classList.toggle('boxzilla-' + this.id + '-overlay');\n Animator.toggle(this.overlay, \"fade\");\n }\n\n Animator.toggle(this.element, this.config.animation, function () {\n if (this.visible) {\n return;\n }\n\n this.contentElement.innerHTML = this.contentElement.innerHTML;\n }.bind(this));\n return true;\n}; // show the box\n\n\nBox.prototype.show = function () {\n return this.toggle(true);\n}; // hide the box\n\n\nBox.prototype.hide = function () {\n return this.toggle(false);\n}; // calculate trigger height\n\n\nBox.prototype.calculateTriggerHeight = function () {\n var triggerHeight = 0;\n\n if (this.config.trigger) {\n if (this.config.trigger.method === 'element') {\n var triggerElement = document.body.querySelector(this.config.trigger.value);\n\n if (triggerElement) {\n var offset = triggerElement.getBoundingClientRect();\n triggerHeight = offset.top;\n }\n } else if (this.config.trigger.method === 'percentage') {\n triggerHeight = this.config.trigger.value / 100 * getDocumentHeight();\n }\n }\n\n return triggerHeight;\n};\n\nBox.prototype.fits = function () {\n if (!this.config.screenWidthCondition || !this.config.screenWidthCondition.value) {\n return true;\n }\n\n switch (this.config.screenWidthCondition.condition) {\n case \"larger\":\n return window.innerWidth > this.config.screenWidthCondition.value;\n\n case \"smaller\":\n return window.innerWidth < this.config.screenWidthCondition.value;\n } // meh.. condition should be \"smaller\" or \"larger\", just return true.\n\n\n return true;\n};\n\nBox.prototype.onResize = function () {\n this.triggerHeight = this.calculateTriggerHeight();\n this.setCustomBoxStyling();\n}; // is this box enabled?\n\n\nBox.prototype.mayAutoShow = function () {\n if (this.dismissed) {\n return false;\n } // check if box fits on given minimum screen width\n\n\n if (!this.fits()) {\n return false;\n } // if trigger empty or error in calculating triggerHeight, return false\n\n\n if (!this.config.trigger) {\n return false;\n } // rely on cookie value (show if not set, don't show if set)\n\n\n return !this.cookieSet;\n};\n\nBox.prototype.mayRehide = function () {\n return this.config.rehide && this.triggered;\n};\n\nBox.prototype.isCookieSet = function () {\n // always show on test mode or when no auto-trigger is configured\n if (this.config.testMode || !this.config.trigger) {\n return false;\n } // if either cookie is null or trigger & dismiss are both falsey, don't bother checking.\n\n\n if (!this.config.cookie || !this.config.cookie.triggered && !this.config.cookie.dismissed) {\n return false;\n }\n\n var cookieSet = document.cookie.replace(new RegExp(\"(?:(?:^|.*;)\\\\s*\" + 'boxzilla_box_' + this.id + \"\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$\"), \"$1\") === \"true\";\n return cookieSet;\n}; // set cookie that disables automatically showing the box\n\n\nBox.prototype.setCookie = function (hours) {\n var expiryDate = new Date();\n expiryDate.setHours(expiryDate.getHours() + hours);\n document.cookie = 'boxzilla_box_' + this.id + '=true; expires=' + expiryDate.toUTCString() + '; path=/';\n};\n\nBox.prototype.trigger = function () {\n var shown = this.show();\n\n if (!shown) {\n return;\n }\n\n this.triggered = true;\n\n if (this.config.cookie && this.config.cookie.triggered) {\n this.setCookie(this.config.cookie.triggered);\n }\n};\n/**\n* Dismisses the box and optionally sets a cookie.\n*\n* @param e The event that triggered this dismissal.\n* @returns {boolean}\n*/\n\n\nBox.prototype.dismiss = function (e) {\n // prevent default action\n e && e.preventDefault(); // only dismiss box if it's currently open.\n\n if (!this.visible) {\n return false;\n } // hide box element\n\n\n this.hide(); // set cookie\n\n if (this.config.cookie && this.config.cookie.dismissed) {\n this.setCookie(this.config.cookie.dismissed);\n }\n\n this.dismissed = true;\n Boxzilla.trigger('box.dismiss', [this]);\n return true;\n};\n\nmodule.exports = function (_Boxzilla) {\n Boxzilla = _Boxzilla;\n return Box;\n};\n\n},{\"./animator.js\":3}],5:[function(require,module,exports){\n'use strict';\n\nvar EventEmitter = require('wolfy87-eventemitter'),\n Boxzilla = Object.create(EventEmitter.prototype),\n Box = require('./box.js')(Boxzilla),\n Timer = require('./timer.js'),\n boxes = [],\n overlay,\n scrollElement = window,\n exitIntentDelayTimer,\n exitIntentTriggered,\n siteTimer,\n pageTimer,\n pageViews;\n\nfunction throttle(fn, threshhold, scope) {\n threshhold || (threshhold = 250);\n var last, deferTimer;\n return function () {\n var context = scope || this;\n var now = +new Date(),\n args = arguments;\n\n if (last && now < last + threshhold) {\n // hold on to it\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n fn.apply(context, args);\n }, threshhold);\n } else {\n last = now;\n fn.apply(context, args);\n }\n };\n} // \"keyup\" listener\n\n\nfunction onKeyUp(e) {\n if (e.keyCode == 27) {\n Boxzilla.dismiss();\n }\n} // check \"pageviews\" criteria for each box\n\n\nfunction checkPageViewsCriteria() {\n // don't bother if another box is currently open\n if (isAnyBoxVisible()) {\n return;\n }\n\n boxes.forEach(function (box) {\n if (!box.mayAutoShow()) {\n return;\n }\n\n if (box.config.trigger.method === 'pageviews' && pageViews >= box.config.trigger.value) {\n box.trigger();\n }\n });\n} // check time trigger criteria for each box\n\n\nfunction checkTimeCriteria() {\n // don't bother if another box is currently open\n if (isAnyBoxVisible()) {\n return;\n }\n\n boxes.forEach(function (box) {\n if (!box.mayAutoShow()) {\n return;\n } // check \"time on site\" trigger\n\n\n if (box.config.trigger.method === 'time_on_site' && siteTimer.time >= box.config.trigger.value) {\n box.trigger();\n } // check \"time on page\" trigger\n\n\n if (box.config.trigger.method === 'time_on_page' && pageTimer.time >= box.config.trigger.value) {\n box.trigger();\n }\n });\n} // check triggerHeight criteria for all boxes\n\n\nfunction checkHeightCriteria() {\n var scrollY = scrollElement.hasOwnProperty('pageYOffset') ? scrollElement.pageYOffset : scrollElement.scrollTop;\n scrollY = scrollY + window.innerHeight * 0.9;\n boxes.forEach(function (box) {\n if (!box.mayAutoShow() || box.triggerHeight <= 0) {\n return;\n }\n\n if (scrollY > box.triggerHeight) {\n // don't bother if another box is currently open\n if (isAnyBoxVisible()) {\n return;\n } // trigger box\n\n\n box.trigger();\n } // if box may auto-hide and scrollY is less than triggerHeight (with small margin of error), hide box\n\n\n if (box.mayRehide() && scrollY < box.triggerHeight - 5) {\n box.hide();\n }\n });\n} // recalculate heights and variables based on height\n\n\nfunction recalculateHeights() {\n boxes.forEach(function (box) {\n box.onResize();\n });\n}\n\nfunction onOverlayClick(e) {\n var x = e.offsetX;\n var y = e.offsetY; // calculate if click was less than 40px outside box to avoid closing it by accident\n\n boxes.forEach(function (box) {\n var rect = box.element.getBoundingClientRect();\n var margin = 40; // if click was not anywhere near box, dismiss it.\n\n if (x < rect.left - margin || x > rect.right + margin || y < rect.top - margin || y > rect.bottom + margin) {\n box.dismiss();\n }\n });\n}\n\nfunction triggerExitIntent() {\n // do nothing if already triggered OR another box is visible.\n if (exitIntentTriggered || isAnyBoxVisible()) {\n return;\n }\n\n boxes.forEach(function (box) {\n if (box.mayAutoShow() && box.config.trigger.method === 'exit_intent') {\n box.trigger();\n }\n });\n exitIntentTriggered = true;\n}\n\nfunction onMouseLeave(e) {\n var delay = 400; // did mouse leave at top of window?\n\n if (e.clientY <= 0) {\n exitIntentDelayTimer = window.setTimeout(triggerExitIntent, delay);\n }\n}\n\nfunction isAnyBoxVisible() {\n for (var i = 0; i < boxes.length; i++) {\n var box = boxes[i];\n\n if (box.visible) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction onMouseEnter() {\n if (exitIntentDelayTimer) {\n window.clearInterval(exitIntentDelayTimer);\n exitIntentDelayTimer = null;\n }\n}\n\nfunction onElementClick(e) {\n // find <a> element in up to 3 parent elements\n var el = e.target || e.srcElement;\n var depth = 3;\n\n for (var i = 0; i <= depth; i++) {\n if (!el || el.tagName === 'A') {\n break;\n }\n\n el = el.parentElement;\n }\n\n if (!el || el.tagName !== 'A' || !el.getAttribute('href')) {\n return;\n }\n\n if (el.getAttribute('href').toLowerCase().indexOf('#boxzilla-') === 0) {\n var boxId = el.getAttribute('href').toLowerCase().substring(\"#boxzilla-\".length);\n Boxzilla.toggle(boxId);\n }\n}\n\nvar timers = {\n start: function start() {\n try {\n var sessionTime = sessionStorage.getItem('boxzilla_timer');\n if (sessionTime) siteTimer.time = sessionTime;\n } catch (e) {}\n\n siteTimer.start();\n pageTimer.start();\n },\n stop: function stop() {\n sessionStorage.setItem('boxzilla_timer', siteTimer.time);\n siteTimer.stop();\n pageTimer.stop();\n }\n}; // initialise & add event listeners\n\nBoxzilla.init = function () {\n document.body.addEventListener('click', onElementClick, true);\n\n try {\n pageViews = sessionStorage.getItem('boxzilla_pageviews') || 0;\n } catch (e) {\n pageViews = 0;\n }\n\n siteTimer = new Timer(0);\n pageTimer = new Timer(0); // insert styles into DOM\n\n var styles = require('./styles.js');\n\n var styleElement = document.createElement('style');\n styleElement.setAttribute(\"type\", \"text/css\");\n styleElement.innerHTML = styles;\n document.head.appendChild(styleElement); // add overlay element to dom\n\n overlay = document.createElement('div');\n overlay.style.display = 'none';\n overlay.id = 'boxzilla-overlay';\n document.body.appendChild(overlay); // event binds\n\n scrollElement.addEventListener('touchstart', throttle(checkHeightCriteria), true);\n scrollElement.addEventListener('scroll', throttle(checkHeightCriteria), true);\n window.addEventListener('resize', throttle(recalculateHeights));\n window.addEventListener('load', recalculateHeights);\n overlay.addEventListener('click', onOverlayClick);\n window.setInterval(checkTimeCriteria, 1000);\n window.setTimeout(checkPageViewsCriteria, 1000);\n document.documentElement.addEventListener('mouseleave', onMouseLeave);\n document.documentElement.addEventListener('mouseenter', onMouseEnter);\n document.addEventListener('keyup', onKeyUp);\n timers.start();\n window.addEventListener('focus', timers.start);\n window.addEventListener('beforeunload', function () {\n timers.stop();\n sessionStorage.setItem('boxzilla_pageviews', ++pageViews);\n });\n window.addEventListener('blur', timers.stop);\n Boxzilla.trigger('ready');\n};\n/**\n * Create a new Box\n *\n * @param string id\n * @param object opts\n *\n * @returns Box\n */\n\n\nBoxzilla.create = function (id, opts) {\n // preserve backwards compat for minimumScreenWidth option\n if (typeof opts.minimumScreenWidth !== \"undefined\") {\n opts.screenWidthCondition = {\n condition: \"larger\",\n value: opts.minimumScreenWidth\n };\n }\n\n var box = new Box(id, opts);\n boxes.push(box);\n return box;\n};\n\nBoxzilla.get = function (id) {\n for (var i = 0; i < boxes.length; i++) {\n var box = boxes[i];\n\n if (box.id == id) {\n return box;\n }\n }\n\n throw new Error(\"No box exists with ID \" + id);\n}; // dismiss a single box (or all by omitting id param)\n\n\nBoxzilla.dismiss = function (id) {\n // if no id given, dismiss all current open boxes\n if (typeof id === \"undefined\") {\n boxes.forEach(function (box) {\n box.dismiss();\n });\n } else {\n Boxzilla.get(id).dismiss();\n }\n};\n\nBoxzilla.hide = function (id) {\n if (typeof id === \"undefined\") {\n boxes.forEach(function (box) {\n box.hide();\n });\n } else {\n Boxzilla.get(id).hide();\n }\n};\n\nBoxzilla.show = function (id) {\n if (typeof id === \"undefined\") {\n boxes.forEach(function (box) {\n box.show();\n });\n } else {\n Boxzilla.get(id).show();\n }\n};\n\nBoxzilla.toggle = function (id) {\n if (typeof id === \"undefined\") {\n boxes.forEach(function (box) {\n box.toggle();\n });\n } else {\n Boxzilla.get(id).toggle();\n }\n}; // expose each individual box.\n\n\nBoxzilla.boxes = boxes; // expose boxzilla object\n\nwindow.Boxzilla = Boxzilla;\n\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = Boxzilla;\n}\n\n},{\"./box.js\":4,\"./styles.js\":6,\"./timer.js\":7,\"wolfy87-eventemitter\":2}],6:[function(require,module,exports){\n\"use strict\";\n\nvar styles = \"#boxzilla-overlay{position:fixed;background:rgba(0,0,0,.65);width:100%;height:100%;left:0;top:0;z-index:99999}.boxzilla-center-container{position:fixed;top:0;left:0;right:0;height:0;text-align:center;z-index:999999;line-height:0}.boxzilla-center-container .boxzilla{display:inline-block;text-align:left;position:relative;line-height:normal}.boxzilla{position:fixed;z-index:999999;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;padding:25px}.boxzilla.boxzilla-top-left{top:0;left:0}.boxzilla.boxzilla-top-right{top:0;right:0}.boxzilla.boxzilla-bottom-left{bottom:0;left:0}.boxzilla.boxzilla-bottom-right{bottom:0;right:0}.boxzilla-content>:first-child{margin-top:0;padding-top:0}.boxzilla-content>:last-child{margin-bottom:0;padding-bottom:0}.boxzilla-close-icon{position:absolute;right:0;top:0;text-align:center;padding:6px;cursor:pointer;-webkit-appearance:none;font-size:28px;font-weight:700;line-height:20px;color:#000;opacity:.5}.boxzilla-close-icon:focus,.boxzilla-close-icon:hover{opacity:.8}\";\nmodule.exports = styles;\n\n},{}],7:[function(require,module,exports){\n'use strict';\n\nvar Timer = function Timer(start) {\n this.time = start;\n this.interval = 0;\n};\n\nTimer.prototype.tick = function () {\n this.time++;\n};\n\nTimer.prototype.start = function () {\n if (!this.interval) {\n this.interval = window.setInterval(this.tick.bind(this), 1000);\n }\n};\n\nTimer.prototype.stop = function () {\n if (this.interval) {\n window.clearInterval(this.interval);\n this.interval = 0;\n }\n};\n\nmodule.exports = Timer;\n\n},{}]},{},[1]);\n; })();"]}
1
+ {"version":3,"sources":["script.js"],"names":["define","undefined","r","e","n","t","o","i","f","c","u","a","Error","code","p","exports","call","length","1","require","module","EventEmitter","proto","prototype","originalGlobalValue","indexOfListener","listeners","listener","alias","name","this","apply","arguments","getListeners","evt","response","key","events","_getEvents","RegExp","hasOwnProperty","test","flattenListeners","flatListeners","push","getListenersAsObject","Array","addListener","isValidListener","TypeError","listenerIsWrapped","once","on","addOnceListener","defineEvent","defineEvents","evts","removeListener","index","splice","off","addListeners","manipulateListeners","removeListeners","remove","value","single","multiple","removeEvent","type","_events","removeAllListeners","emitEvent","args","listenersMap","slice","_getOnceReturnValue","trigger","emit","setOnceReturnValue","_onceReturnValue","noConflict","amd","window","2","duration","css","element","styles","property","style","animate","targetStyles","fn","last","Date","initialStyles","getComputedStyle","currentStyles","propSteps","parseFloat","to","current","tick","step","increment","newValue","timeSinceLastTick","done","suffix","requestAnimationFrame","setTimeout","toggle","animation","callbackFn","hiddenStyles","visibleStyles","nowVisible","display","offsetLeft","clone","cloneNode","cleanup","removeAttribute","setAttribute","getAttribute","properties","newObject","initObjectProperties","object","copyObjectProperties","isFinite","height","clientRect","getBoundingClientRect","overflowY","opacity","animated","3","Boxzilla","defaults","rehide","content","cookie","icon","screenWidthCondition","position","testMode","closable","Animator","Box","id","config","obj1","obj2","obj3","attrname","merge","overlay","document","getElementById","visible","dismissed","triggered","triggerHeight","calculateTriggerHeight","cookieSet","isCookieSet","contentElement","closeIcon","dom","box","addEventListener","dismiss","bind","target","tagName","setCookie","wrapper","createElement","className","appendChild","innerHTML","body","setCustomBoxStyling","origDisplay","maxHeight","windowHeight","innerHeight","boxHeight","clientHeight","newTopMargin","marginTop","show","classList","hide","html","method","triggerElement","querySelector","top","documentElement","Math","max","scrollHeight","offsetHeight","fits","condition","innerWidth","onResize","mayAutoShow","mayRehide","replace","hours","expiryDate","setHours","getHours","toUTCString","preventDefault","_Boxzilla","./animator.js","4","siteTimer","pageTimer","pageViews","Timer","Object","create","boxes","scrollElement","initialised","ExitIntent","throttle","threshhold","scope","deferTimer","context","now","clearTimeout","onKeyUp","keyCode","checkPageViewsCriteria","isAnyBoxVisible","forEach","checkTimeCriteria","time","checkHeightCriteria","scrollY","pageYOffset","scrollTop","recalculateHeights","onOverlayClick","x","offsetX","y","offsetY","rect","left","right","bottom","showBoxesWithExitIntentTrigger","filter","b","onElementClick","el","srcElement","parentElement","toLowerCase","indexOf","boxId","substring","timers","sessionTime","sessionStorage","getItem","start","setItem","stop","init","styleElement","head","setInterval","opts","minimumScreenWidth","get","./box.js","./styles.js","./timer.js","./triggers/exit-intent.js","wolfy87-eventemitter","5","6","interval","clearInterval","7","callback","timeout","touchStart","triggerCallback","removeEventListener","onMouseLeave","onMouseEnter","onTouchStart","onTouchEnd","clientY","clientX","timestamp","performance","8","_typeof","obj","Symbol","iterator","constructor","options","boxzilla_options","locationHashRefersBox","location","hash","elementId","isLoggedIn","console","log","inited","boxOpts","boxContentElement","post","slug","background_color","background","color","border_color","borderColor","border_width","borderWidth","parseInt","border_style","borderStyle","width","maxWidth","firstChild","lastChild","mc4wp_forms_config","submitted_form","selector","element_id","maybeOpenMailChimpForWordPressBox","boxzilla"],"mappings":"CAAA,WAAe,IAA8EA,OAASC,GAAuB,SAASC,EAAEC,EAAEC,EAAEC,GAAG,SAASC,EAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,IAAIE,GAAE,EAAoC,IAAID,GAAGC,EAAE,OAAOA,EAAEF,GAAE,GAAI,GAAGG,EAAE,OAAOA,EAAEH,GAAE,GAAI,IAAII,EAAE,IAAIC,MAAM,uBAAuBL,EAAE,KAAK,MAAMI,EAAEE,KAAK,mBAAmBF,EAAE,IAAIG,EAAEV,EAAEG,GAAG,CAACQ,QAAQ,IAAIZ,EAAEI,GAAG,GAAGS,KAAKF,EAAEC,QAAQ,SAASb,GAAoB,OAAOI,EAAlBH,EAAEI,GAAG,GAAGL,IAAeA,IAAIY,EAAEA,EAAEC,QAAQb,EAAEC,EAAEC,EAAEC,GAAG,OAAOD,EAAEG,GAAGQ,QAAQ,IAAI,IAAIL,GAAE,EAAoCH,EAAE,EAAEA,EAAEF,EAAEY,OAAOV,IAAID,EAAED,EAAEE,IAAI,OAAOD,EAA7b,CAA4c,CAACY,EAAE,CAAC,SAASC,EAAQC,EAAOL,IAQvlB,SAAUA,GACR,aAQA,SAASM,KAGT,IAAIC,EAAQD,EAAaE,UACrBC,EAAsBT,EAAQM,aAUlC,SAASI,EAAgBC,EAAWC,GAEhC,IADA,IAAIpB,EAAImB,EAAUT,OACXV,KACH,GAAImB,EAAUnB,GAAGoB,WAAaA,EAC1B,OAAOpB,EAIf,OAAQ,EAUZ,SAASqB,EAAMC,GACX,OAAO,WACH,OAAOC,KAAKD,GAAME,MAAMD,KAAME,YAatCV,EAAMW,aAAe,SAAsBC,GACvC,IACIC,EACAC,EAFAC,EAASP,KAAKQ,aAMlB,GAAIJ,aAAeK,OAEf,IAAKH,KADLD,EAAW,GACCE,EACJA,EAAOG,eAAeJ,IAAQF,EAAIO,KAAKL,KACvCD,EAASC,GAAOC,EAAOD,SAK/BD,EAAWE,EAAOH,KAASG,EAAOH,GAAO,IAG7C,OAAOC,GASXb,EAAMoB,iBAAmB,SAA0BhB,GAC/C,IACInB,EADAoC,EAAgB,GAGpB,IAAKpC,EAAI,EAAGA,EAAImB,EAAUT,OAAQV,GAAK,EACnCoC,EAAcC,KAAKlB,EAAUnB,GAAGoB,UAGpC,OAAOgB,GASXrB,EAAMuB,qBAAuB,SAA8BX,GACvD,IACIC,EADAT,EAAYI,KAAKG,aAAaC,GAQlC,OALIR,aAAqBoB,SACrBX,EAAW,IACFD,GAAOR,GAGbS,GAAYT,GAuBvBJ,EAAMyB,YAAc,SAAqBb,EAAKP,GAC1C,IArBJ,SAASqB,EAAiBrB,GACtB,MAAwB,mBAAbA,GAA2BA,aAAoBY,WAE/CZ,GAAgC,iBAAbA,IACnBqB,EAAgBrB,EAASA,UAiB/BqB,CAAgBrB,GACjB,MAAM,IAAIsB,UAAU,+BAGxB,IAEIb,EAFAV,EAAYI,KAAKe,qBAAqBX,GACtCgB,EAAwC,iBAAbvB,EAG/B,IAAKS,KAAOV,EACJA,EAAUc,eAAeJ,KAAuD,IAA/CX,EAAgBC,EAAUU,GAAMT,IACjED,EAAUU,GAAKQ,KAAKM,EAAoBvB,EAAW,CAC/CA,SAAUA,EACVwB,MAAM,IAKlB,OAAOrB,MAMXR,EAAM8B,GAAKxB,EAAM,eAUjBN,EAAM+B,gBAAkB,SAAyBnB,EAAKP,GAClD,OAAOG,KAAKiB,YAAYb,EAAK,CACzBP,SAAUA,EACVwB,MAAM,KAOd7B,EAAM6B,KAAOvB,EAAM,mBASnBN,EAAMgC,YAAc,SAAqBpB,GAErC,OADAJ,KAAKG,aAAaC,GACXJ,MASXR,EAAMiC,aAAe,SAAsBC,GACvC,IAAK,IAAIjD,EAAI,EAAGA,EAAIiD,EAAKvC,OAAQV,GAAK,EAClCuB,KAAKwB,YAAYE,EAAKjD,IAE1B,OAAOuB,MAWXR,EAAMmC,eAAiB,SAAwBvB,EAAKP,GAChD,IACI+B,EACAtB,EAFAV,EAAYI,KAAKe,qBAAqBX,GAI1C,IAAKE,KAAOV,EACJA,EAAUc,eAAeJ,KAGV,KAFfsB,EAAQjC,EAAgBC,EAAUU,GAAMT,KAGpCD,EAAUU,GAAKuB,OAAOD,EAAO,GAKzC,OAAO5B,MAMXR,EAAMsC,IAAMhC,EAAM,kBAYlBN,EAAMuC,aAAe,SAAsB3B,EAAKR,GAE5C,OAAOI,KAAKgC,qBAAoB,EAAO5B,EAAKR,IAahDJ,EAAMyC,gBAAkB,SAAyB7B,EAAKR,GAElD,OAAOI,KAAKgC,qBAAoB,EAAM5B,EAAKR,IAe/CJ,EAAMwC,oBAAsB,SAA6BE,EAAQ9B,EAAKR,GAClE,IAAInB,EACA0D,EACAC,EAASF,EAASlC,KAAK2B,eAAiB3B,KAAKiB,YAC7CoB,EAAWH,EAASlC,KAAKiC,gBAAkBjC,KAAK+B,aAGpD,GAAmB,iBAAR3B,GAAsBA,aAAeK,OAmB5C,IADAhC,EAAImB,EAAUT,OACPV,KACH2D,EAAOlD,KAAKc,KAAMI,EAAKR,EAAUnB,SAnBrC,IAAKA,KAAK2B,EACFA,EAAIM,eAAejC,KAAO0D,EAAQ/B,EAAI3B,MAEjB,mBAAV0D,EACPC,EAAOlD,KAAKc,KAAMvB,EAAG0D,GAIrBE,EAASnD,KAAKc,KAAMvB,EAAG0D,IAevC,OAAOnC,MAYXR,EAAM8C,YAAc,SAAqBlC,GACrC,IAEIE,EAFAiC,SAAcnC,EACdG,EAASP,KAAKQ,aAIlB,GAAa,WAAT+B,SAEOhC,EAAOH,QAEb,GAAIA,aAAeK,OAEpB,IAAKH,KAAOC,EACJA,EAAOG,eAAeJ,IAAQF,EAAIO,KAAKL,WAChCC,EAAOD,eAMfN,KAAKwC,QAGhB,OAAOxC,MAQXR,EAAMiD,mBAAqB3C,EAAM,eAcjCN,EAAMkD,UAAY,SAAmBtC,EAAKuC,GACtC,IACI/C,EACAC,EACApB,EACA6B,EAJAsC,EAAe5C,KAAKe,qBAAqBX,GAO7C,IAAKE,KAAOsC,EACR,GAAIA,EAAalC,eAAeJ,GAG5B,IAFAV,EAAYgD,EAAatC,GAAKuC,MAAM,GAE/BpE,EAAI,EAAGA,EAAImB,EAAUT,OAAQV,KAKR,KAFtBoB,EAAWD,EAAUnB,IAER4C,MACTrB,KAAK2B,eAAevB,EAAKP,EAASA,UAG3BA,EAASA,SAASI,MAAMD,KAAM2C,GAAQ,MAEhC3C,KAAK8C,uBAClB9C,KAAK2B,eAAevB,EAAKP,EAASA,UAMlD,OAAOG,MAMXR,EAAMuD,QAAUjD,EAAM,aAUtBN,EAAMwD,KAAO,SAAc5C,GACvB,IAAIuC,EAAO3B,MAAMvB,UAAUoD,MAAM3D,KAAKgB,UAAW,GACjD,OAAOF,KAAK0C,UAAUtC,EAAKuC,IAW/BnD,EAAMyD,mBAAqB,SAA4Bd,GAEnD,OADAnC,KAAKkD,iBAAmBf,EACjBnC,MAWXR,EAAMsD,oBAAsB,WACxB,OAAI9C,KAAKU,eAAe,qBACbV,KAAKkD,kBAapB1D,EAAMgB,WAAa,WACf,OAAOR,KAAKwC,UAAYxC,KAAKwC,QAAU,KAQ3CjD,EAAa4D,WAAa,WAEtB,OADAlE,EAAQM,aAAeG,EAChBH,GAIW,mBAAXrB,GAAyBA,EAAOkF,IACvClF,EAAO,WACH,OAAOqB,IAGY,iBAAXD,GAAuBA,EAAOL,QAC1CK,EAAOL,QAAUM,EAGjBN,EAAQM,aAAeA,EA5d9B,CA8dmB,oBAAX8D,OAAyBA,OAASrD,MAAQ,KAEjD,IAAIsD,EAAE,CAAC,SAASjE,EAAQC,EAAOL,GACjC,aAEA,IAAIsE,EAAW,IAEf,SAASC,EAAIC,EAASC,GACpB,IAAK,IAAIC,KAAYD,EACnBD,EAAQG,MAAMD,GAAYD,EAAOC,GAqGrC,SAASE,EAAQJ,EAASK,EAAcC,GACtC,IAAIC,GAAQ,IAAIC,KACZC,EAAgBb,OAAOc,iBAAiBV,GACxCW,EAAgB,GAChBC,EAAY,GAEhB,IAAK,IAAIV,KAAYG,EAAc,CAEjCA,EAAaH,GAAYW,WAAWR,EAAaH,IAEjD,IAAIY,EAAKT,EAAaH,GAClBa,EAAUF,WAAWJ,EAAcP,IAEnCa,GAAWD,GAKfF,EAAUV,IAAaY,EAAKC,GAAWjB,EAEvCa,EAAcT,GAAYa,UANjBV,EAAaH,IASb,SAASc,IAClB,IAGIC,EAAMH,EAAII,EAAWC,EAFrBC,GADO,IAAIZ,KACeD,EAC1Bc,GAAO,EAGX,IAAK,IAAInB,KAAYG,EAAc,CACjCY,EAAOL,EAAUV,GACjBY,EAAKT,EAAaH,GAClBgB,EAAYD,EAAOG,EACnBD,EAAWR,EAAcT,GAAYgB,EAE1B,EAAPD,GAAwBH,GAAZK,GAAkBF,EAAO,GAAKE,GAAYL,EACxDK,EAAWL,EAEXO,GAAO,EAITV,EAAcT,GAAYiB,EAC1B,IAAIG,EAAsB,YAAbpB,EAAyB,KAAO,GAC7CF,EAAQG,MAAMD,GAAYiB,EAAWG,EAGvCf,GAAQ,IAAIC,KAEPa,EAIHf,GAAMA,IAHNV,OAAO2B,uBAAyBA,sBAAsBP,IAASQ,WAAWR,EAAM,IAOpFA,GAGFnF,EAAOL,QAAU,CACfiG,OAxHF,SAAgBzB,EAAS0B,EAAWC,GAClC,IAqBIC,EAAcC,EArBdC,EAAsC,QAAzB9B,EAAQG,MAAM4B,SAA0C,EAArB/B,EAAQgC,WAExDC,EAAQjC,EAAQkC,WAAU,GAE1BC,EAAU,WACZnC,EAAQoC,gBAAgB,iBACxBpC,EAAQqC,aAAa,QAASJ,EAAMK,aAAa,UACjDtC,EAAQG,MAAM4B,QAAUD,EAAa,OAAS,GAE1CH,GACFA,KAaJ,GARA3B,EAAQqC,aAAa,gBAAiB,QAEjCP,IACH9B,EAAQG,MAAM4B,QAAU,IAKR,UAAdL,EAAuB,CAIzB,GAHAE,EA/DJ,SAA8BW,EAAY7D,GAGxC,IAFA,IAAI8D,EAAY,GAEPxH,EAAI,EAAGA,EAAIuH,EAAW7G,OAAQV,IACrCwH,EAAUD,EAAWvH,IAAM0D,EAG7B,OAAO8D,EAwDUC,CAAqB,CAAC,SAAU,iBAAkB,oBAAqB,aAAc,iBAAkB,GACtHZ,EAAgB,IAEXC,EAAY,CAIf,GAFAD,EA1DN,SAA8BU,EAAYG,GAGxC,IAFA,IAAIF,EAAY,GAEPxH,EAAI,EAAGA,EAAIuH,EAAW7G,OAAQV,IACrCwH,EAAUD,EAAWvH,IAAM0H,EAAOH,EAAWvH,IAG/C,OAAOwH,EAmDaG,CAAqB,CAAC,SAAU,iBAAkB,oBAAqB,aAAc,iBADhF/C,OAAOc,iBAAiBV,KAGxC4C,SAASf,EAAcgB,QAAS,CACnC,IAAIC,EAAa9C,EAAQ+C,wBACzBlB,EAAcgB,OAASC,EAAWD,OAGpC9C,EAAIC,EAAS4B,GAIf5B,EAAQG,MAAM6C,UAAY,SAC1B5C,EAAQJ,EAAS8B,EAAaF,EAAeC,EAAeM,QAE5DP,EAAe,CACbqB,QAAS,GAEXpB,EAAgB,CACdoB,QAAS,GAGNnB,GACH/B,EAAIC,EAAS4B,GAGfxB,EAAQJ,EAAS8B,EAAaF,EAAeC,EAAeM,IAkE9D/B,QAAWA,EACX8C,SArIF,SAAkBlD,GAChB,QAASA,EAAQsC,aAAa,oBAuI9B,IAAIa,EAAE,CAAC,SAASvH,EAAQC,EAAOL,GACjC,aAEA,IAYI4H,EAZAC,EAAW,CACb3B,UAAa,OACb4B,QAAU,EACVC,QAAW,GACXC,OAAU,KACVC,KAAQ,SACRC,qBAAwB,KACxBC,SAAY,SACZC,UAAY,EACZtE,SAAW,EACXuE,UAAY,GAGVC,EAAWlI,EAAQ,iBAqCvB,IAAImI,EAAM,SAAaC,EAAIC,GACzB1H,KAAKyH,GAAKA,EAEVzH,KAAK0H,OA9BP,SAAeC,EAAMC,GACnB,IAAIC,EAAO,GAEX,IAAK,IAAIC,KAAYH,EACnBE,EAAKC,GAAYH,EAAKG,GAGxB,IAAK,IAAIA,KAAYF,EACnBC,EAAKC,GAAYF,EAAKE,GAGxB,OAAOD,EAmBOE,CAAMjB,EAAUY,GAE9B1H,KAAKgI,QAAUC,SAASC,eAAe,oBAEvClI,KAAKmI,SAAU,EACfnI,KAAKoI,WAAY,EACjBpI,KAAKqI,WAAY,EACjBrI,KAAKsI,cAAgBtI,KAAKuI,yBAC1BvI,KAAKwI,UAAYxI,KAAKyI,cACtBzI,KAAKyD,QAAU,KACfzD,KAAK0I,eAAiB,KACtB1I,KAAK2I,UAAY,KAEjB3I,KAAK4I,MAEL5I,KAAKO,UAIPiH,EAAI/H,UAAUc,OAAS,WACrB,IAAIsI,EAAM7I,KAENA,KAAK2I,WACP3I,KAAK2I,UAAUG,iBAAiB,QAAS9I,KAAK+I,QAAQC,KAAKhJ,OAG7DA,KAAKyD,QAAQqF,iBAAiB,QAAS,SAAUzK,GACtB,MAArBA,EAAE4K,OAAOC,SACXrC,EAAS9D,QAAQ,wBAAyB,CAAC8F,EAAKxK,EAAE4K,WAEnD,GACHjJ,KAAKyD,QAAQqF,iBAAiB,SAAU,SAAUzK,GAChDwK,EAAIM,YACJtC,EAAS9D,QAAQ,wBAAyB,CAAC8F,EAAKxK,EAAE4K,WACjD,IAILzB,EAAI/H,UAAUmJ,IAAM,WAClB,IAAIQ,EAAUnB,SAASoB,cAAc,OACrCD,EAAQE,UAAY,+BAAiCtJ,KAAK0H,OAAON,SAAW,aAC5E,IAKIJ,EALA6B,EAAMZ,SAASoB,cAAc,OAmBjC,GAlBAR,EAAI/C,aAAa,KAAM,YAAc9F,KAAKyH,IAC1CoB,EAAIS,UAAY,qBAAuBtJ,KAAKyH,GAAK,aAAezH,KAAK0H,OAAON,SAC5EyB,EAAIjF,MAAM4B,QAAU,OACpB4D,EAAQG,YAAYV,GAGe,iBAAxB7I,KAAK0H,OAAOV,SACrBA,EAAUiB,SAASoB,cAAc,QACzBG,UAAYxJ,KAAK0H,OAAOV,SAEhCA,EAAUhH,KAAK0H,OAAOV,SAEdpD,MAAM4B,QAAU,GAG1BwB,EAAQsC,UAAY,mBACpBT,EAAIU,YAAYvC,GAEZhH,KAAK0H,OAAOJ,UAAYtH,KAAK0H,OAAOR,KAAM,CAC5C,IAAIyB,EAAYV,SAASoB,cAAc,QACvCV,EAAUW,UAAY,sBACtBX,EAAUa,UAAYxJ,KAAK0H,OAAOR,KAClC2B,EAAIU,YAAYZ,GAChB3I,KAAK2I,UAAYA,EAGnBV,SAASwB,KAAKF,YAAYH,GAC1BpJ,KAAK0I,eAAiB1B,EACtBhH,KAAKyD,QAAUoF,GAIjBrB,EAAI/H,UAAUiK,oBAAsB,WAElC,IAAIC,EAAc3J,KAAKyD,QAAQG,MAAM4B,QACrCxF,KAAKyD,QAAQG,MAAM4B,QAAU,GAC7BxF,KAAKyD,QAAQG,MAAM6C,UAAY,OAC/BzG,KAAKyD,QAAQG,MAAMgG,UAAY,OAE/B,IAAIC,EAAexG,OAAOyG,YACtBC,EAAY/J,KAAKyD,QAAQuG,aAQ7B,GANgBH,EAAZE,IACF/J,KAAKyD,QAAQG,MAAMgG,UAAYC,EAAe,KAC9C7J,KAAKyD,QAAQG,MAAM6C,UAAY,UAIJ,WAAzBzG,KAAK0H,OAAON,SAAuB,CACrC,IAAI6C,GAAgBJ,EAAeE,GAAa,EAChDE,EAA+B,GAAhBA,EAAoBA,EAAe,EAClDjK,KAAKyD,QAAQG,MAAMsG,UAAYD,EAAe,KAGhDjK,KAAKyD,QAAQG,MAAM4B,QAAUmE,GAI/BnC,EAAI/H,UAAUyF,OAAS,SAAUiF,GAO/B,YALoB,IAATA,IACTA,GAAQnK,KAAKmI,SAIXgC,IAASnK,KAAKmI,WAKdZ,EAASZ,SAAS3G,KAAKyD,cAKtB0G,IAASnK,KAAK0H,OAAOJ,YAK1BtH,KAAKmI,QAAUgC,EAEfnK,KAAK0J,sBAEL7C,EAAS9D,QAAQ,QAAUoH,EAAO,OAAS,QAAS,CAACnK,OAExB,WAAzBA,KAAK0H,OAAON,WACdpH,KAAKgI,QAAQoC,UAAUlF,OAAO,YAAclF,KAAKyH,GAAK,YACtDF,EAASrC,OAAOlF,KAAKgI,QAAS,SAGhCT,EAASrC,OAAOlF,KAAKyD,QAASzD,KAAK0H,OAAOvC,UAAW,WAC/CnF,KAAKmI,UAITnI,KAAK0I,eAAec,UAAYxJ,KAAK0I,eAAec,YACpDR,KAAKhJ,QACA,MAITwH,EAAI/H,UAAU0K,KAAO,WACnB,OAAOnK,KAAKkF,QAAO,IAIrBsC,EAAI/H,UAAU4K,KAAO,WACnB,OAAOrK,KAAKkF,QAAO,IAIrBsC,EAAI/H,UAAU8I,uBAAyB,WACrC,IArKIkB,EACAa,EAoKAhC,EAAgB,EAEpB,GAAItI,KAAK0H,OAAO3E,QACd,GAAmC,YAA/B/C,KAAK0H,OAAO3E,QAAQwH,OAAsB,CAC5C,IAAIC,EAAiBvC,SAASwB,KAAKgB,cAAczK,KAAK0H,OAAO3E,QAAQZ,OAErE,GAAIqI,EAEFlC,EADakC,EAAehE,wBACLkE,QAEe,eAA/B1K,KAAK0H,OAAO3E,QAAQwH,SAC7BjC,EAAgBtI,KAAK0H,OAAO3E,QAAQZ,MAAQ,KAhL5CsH,EAAOxB,SAASwB,KAChBa,EAAOrC,SAAS0C,gBACPC,KAAKC,IAAIpB,EAAKqB,aAAcrB,EAAKsB,aAAcT,EAAKN,aAAcM,EAAKQ,aAAcR,EAAKS,gBAkLvG,OAAOzC,GAGTd,EAAI/H,UAAUuL,KAAO,WACnB,IAAKhL,KAAK0H,OAAOP,uBAAyBnH,KAAK0H,OAAOP,qBAAqBhF,MACzE,OAAO,EAGT,OAAQnC,KAAK0H,OAAOP,qBAAqB8D,WACvC,IAAK,SACH,OAAO5H,OAAO6H,WAAalL,KAAK0H,OAAOP,qBAAqBhF,MAE9D,IAAK,UACH,OAAOkB,OAAO6H,WAAalL,KAAK0H,OAAOP,qBAAqBhF,MAIhE,OAAO,GAGTqF,EAAI/H,UAAU0L,SAAW,WACvBnL,KAAKsI,cAAgBtI,KAAKuI,yBAC1BvI,KAAK0J,uBAIPlC,EAAI/H,UAAU2L,YAAc,WAC1B,OAAIpL,KAAKoI,cAKJpI,KAAKgL,WAKLhL,KAAK0H,OAAO3E,UAKT/C,KAAKwI,aAGfhB,EAAI/H,UAAU4L,UAAY,WACxB,OAAOrL,KAAK0H,OAAOX,QAAU/G,KAAKqI,WAGpCb,EAAI/H,UAAUgJ,YAAc,WAE1B,QAAIzI,KAAK0H,OAAOL,WAAarH,KAAK0H,OAAO3E,cAKpC/C,KAAK0H,OAAOT,SAAWjH,KAAK0H,OAAOT,OAAOoB,YAAcrI,KAAK0H,OAAOT,OAAOmB,YAI8D,SAA9HH,SAAShB,OAAOqE,QAAQ,IAAI7K,OAAO,gCAAuCT,KAAKyH,GAAK,+BAAgC,QAKtID,EAAI/H,UAAU0J,UAAY,SAAUoC,GAClC,IAAIC,EAAa,IAAIvH,KACrBuH,EAAWC,SAASD,EAAWE,WAAaH,GAC5CtD,SAAShB,OAAS,gBAAkBjH,KAAKyH,GAAK,kBAAoB+D,EAAWG,cAAgB,YAG/FnE,EAAI/H,UAAUsD,QAAU,WACV/C,KAAKmK,SAMjBnK,KAAKqI,WAAY,EAEbrI,KAAK0H,OAAOT,QAAUjH,KAAK0H,OAAOT,OAAOoB,WAC3CrI,KAAKmJ,UAAUnJ,KAAK0H,OAAOT,OAAOoB,aAWtCb,EAAI/H,UAAUsJ,QAAU,SAAU1K,GAIhC,OAFAA,GAAKA,EAAEuN,mBAEF5L,KAAKmI,UAKVnI,KAAKqK,OAEDrK,KAAK0H,OAAOT,QAAUjH,KAAK0H,OAAOT,OAAOmB,WAC3CpI,KAAKmJ,UAAUnJ,KAAK0H,OAAOT,OAAOmB,WAGpCpI,KAAKoI,WAAY,EACjBvB,EAAS9D,QAAQ,cAAe,CAAC/C,QAC1B,IAGTV,EAAOL,QAAU,SAAU4M,GAEzB,OADAhF,EAAWgF,EACJrE,IAGP,CAACsE,gBAAgB,IAAIC,EAAE,CAAC,SAAS1M,EAAQC,EAAOL,GAClD,aAEA,IASI+I,EAEAgE,EACAC,EACAC,EAbA3M,EAAeF,EAAQ,wBAEvB8M,EAAQ9M,EAAQ,cAEhBwH,EAAWuF,OAAOC,OAAO9M,EAAaE,WAEtC+H,EAAMnI,EAAQ,WAARA,CAAoBwH,GAE1ByF,EAAQ,GAERC,EAAgBlJ,OAIhBmJ,GAAc,EAEd9I,EAASrE,EAAQ,eAEjBoN,EAAapN,EAAQ,6BAEzB,SAASqN,EAAS3I,EAAI4I,EAAYC,GAEhC,IAAI5I,EAAM6I,EACV,OAFAF,IAAeA,EAAa,KAErB,WACL,IAAIG,EAAUF,GAAS5M,KACnB+M,GAAO,IAAI9I,KACXtB,EAAOzC,UAEP8D,GAAQ+I,EAAM/I,EAAO2I,GAEvBK,aAAaH,GACbA,EAAa5H,WAAW,WACtBjB,EAAO+I,EACPhJ,EAAG9D,MAAM6M,EAASnK,IACjBgK,KAEH3I,EAAO+I,EACPhJ,EAAG9D,MAAM6M,EAASnK,KAMxB,SAASsK,EAAQ5O,GACG,KAAdA,EAAE6O,SACJrG,EAASkC,UAKb,SAASoE,IAEHC,KAIJd,EAAMe,QAAQ,SAAUxE,GACjBA,EAAIuC,eAIyB,cAA9BvC,EAAInB,OAAO3E,QAAQwH,QAA0B2B,GAAarD,EAAInB,OAAO3E,QAAQZ,OAC/E0G,EAAI9F,YAMV,SAASuK,IAEHF,KAIJd,EAAMe,QAAQ,SAAUxE,GACjBA,EAAIuC,gBAKyB,iBAA9BvC,EAAInB,OAAO3E,QAAQwH,QAA6ByB,EAAUuB,MAAQ1E,EAAInB,OAAO3E,QAAQZ,OACvF0G,EAAI9F,UAI4B,iBAA9B8F,EAAInB,OAAO3E,QAAQwH,QAA6B0B,EAAUsB,MAAQ1E,EAAInB,OAAO3E,QAAQZ,OACvF0G,EAAI9F,aAMV,SAASyK,IACP,IAAIC,EAAUlB,EAAc7L,eAAe,eAAiB6L,EAAcmB,YAAcnB,EAAcoB,UACtGF,GAAyC,GAArBpK,OAAOyG,YAC3BwC,EAAMe,QAAQ,SAAUxE,GACtB,GAAKA,EAAIuC,iBAAiBvC,EAAIP,eAAiB,GAA/C,CAIA,GAAImF,EAAU5E,EAAIP,cAAe,CAE/B,GAAI8E,IACF,OAIFvE,EAAI9F,UAIF8F,EAAIwC,aAAeoC,EAAU5E,EAAIP,cAAgB,GACnDO,EAAIwB,UAMV,SAASuD,IACPtB,EAAMe,QAAQ,SAAUxE,GACtBA,EAAIsC,aAIR,SAAS0C,EAAexP,GACtB,IAAIyP,EAAIzP,EAAE0P,QACNC,EAAI3P,EAAE4P,QAEV3B,EAAMe,QAAQ,SAAUxE,GACtB,IAAIqF,EAAOrF,EAAIpF,QAAQ+C,yBAGnBsH,EAAII,EAAKC,KAFA,IAEiBL,EAAII,EAAKE,MAF1B,IAE4CJ,EAAIE,EAAKxD,IAFrD,IAEqEsD,EAAIE,EAAKG,OAF9E,KAGXxF,EAAIE,YAKV,SAASuF,IAEHlB,KAIJd,EAAMe,QAAQ,SAAUxE,GAClBA,EAAIuC,eAA+C,gBAA9BvC,EAAInB,OAAO3E,QAAQwH,QAC1C1B,EAAI9F,YAKV,SAASqK,IACP,OAEY,EAFLd,EAAMiC,OAAO,SAAUC,GAC5B,OAAOA,EAAErG,UACRhJ,OAGL,SAASsP,EAAepQ,GAKtB,IAHA,IAAIqQ,EAAKrQ,EAAE4K,QAAU5K,EAAEsQ,WAGdlQ,EAAI,EAAGA,GAFJ,IAGLiQ,GAAqB,MAAfA,EAAGxF,SADYzK,IAK1BiQ,EAAKA,EAAGE,cAGV,GAAKF,GAAqB,MAAfA,EAAGxF,SAAoBwF,EAAG3I,aAAa,SAIkB,IAAhE2I,EAAG3I,aAAa,QAAQ8I,cAAcC,QAAQ,cAAqB,CACrE,IAAIC,EAAQL,EAAG3I,aAAa,QAAQ8I,cAAcG,UAAU,aAAa7P,QACzE0H,EAAS3B,OAAO6J,IAIpB,IAAIE,EACK,WACL,IACE,IAAIC,EAAcC,eAAeC,QAAQ,kBACrCF,IAAalD,EAAUuB,KAAO2B,GAClC,MAAO7Q,IAET2N,EAAUqD,QACVpD,EAAUoD,SARVJ,EAUI,WACJE,eAAeG,QAAQ,iBAAkBtD,EAAUuB,MACnDvB,EAAUuD,OACVtD,EAAUsD,QAId1I,EAAS2I,KAAO,WACd,IAAIhD,EAAJ,CAIAvE,SAASwB,KAAKX,iBAAiB,QAAS2F,GAAgB,GAExD,IACEvC,EAAYiD,eAAeC,QAAQ,uBAAyB,EAC5D,MAAO/Q,GACP6N,EAAY,EAGdF,EAAY,IAAIG,EAAM,GACtBF,EAAY,IAAIE,EAAM,GAEtB,IAAIsD,EAAexH,SAASoB,cAAc,SAC1CoG,EAAa3J,aAAa,OAAQ,YAClC2J,EAAajG,UAAY9F,EACzBuE,SAASyH,KAAKnG,YAAYkG,IAE1BzH,EAAUC,SAASoB,cAAc,QACzBzF,MAAM4B,QAAU,OACxBwC,EAAQP,GAAK,mBACbQ,SAASwB,KAAKF,YAAYvB,GAE1B,IAAIyE,EAAW6B,GACf/B,EAAczD,iBAAiB,aAAc4D,EAASc,IAAsB,GAC5EjB,EAAczD,iBAAiB,SAAU4D,EAASc,IAAsB,GACxEnK,OAAOyF,iBAAiB,SAAU4D,EAASkB,IAC3CvK,OAAOyF,iBAAiB,OAAQ8E,GAChC5F,EAAQc,iBAAiB,QAAS+E,GAClCxK,OAAOsM,YAAYrC,EAAmB,KACtCjK,OAAO4B,WAAWkI,EAAwB,KAC1ClF,SAASa,iBAAiB,QAASmE,GACnCgC,IACA5L,OAAOyF,iBAAiB,QAASmG,GACjC5L,OAAOyF,iBAAiB,eAAgB,WACtCmG,IACAE,eAAeG,QAAQ,uBAAwBpD,KAEjD7I,OAAOyF,iBAAiB,OAAQmG,GAChCpI,EAAS9D,QAAQ,SACjByJ,GAAc,IAYhB3F,EAASwF,OAAS,SAAU5E,EAAImI,QAES,IAA5BA,EAAKC,qBACdD,EAAKzI,qBAAuB,CAC1B8D,UAAW,SACX9I,MAAOyN,EAAKC,qBAIhB,IAAIhH,EAAM,IAAIrB,EAAIC,EAAImI,GAEtB,OADAtD,EAAMxL,KAAK+H,GACJA,GAGThC,EAASiJ,IAAM,SAAUrI,GACvB,IAAK,IAAIhJ,EAAI,EAAGA,EAAI6N,EAAMnN,OAAQV,IAAK,CACrC,IAAIoK,EAAMyD,EAAM7N,GAEhB,GAAIoK,EAAIpB,IAAMA,EACZ,OAAOoB,EAIX,MAAM,IAAI/J,MAAM,yBAA2B2I,IAI7CZ,EAASkC,QAAU,SAAUtB,QAET,IAAPA,EACT6E,EAAMe,QAAQ,SAAUxE,GACtBA,EAAIE,YAGNlC,EAASiJ,IAAIrI,GAAIsB,WAIrBlC,EAASwD,KAAO,SAAU5C,QACN,IAAPA,EACT6E,EAAMe,QAAQ,SAAUxE,GACtBA,EAAIwB,SAGNxD,EAASiJ,IAAIrI,GAAI4C,QAIrBxD,EAASsD,KAAO,SAAU1C,QACN,IAAPA,EACT6E,EAAMe,QAAQ,SAAUxE,GACtBA,EAAIsB,SAGNtD,EAASiJ,IAAIrI,GAAI0C,QAIrBtD,EAAS3B,OAAS,SAAUuC,QACR,IAAPA,EACT6E,EAAMe,QAAQ,SAAUxE,GACtBA,EAAI3D,WAGN2B,EAASiJ,IAAIrI,GAAIvC,UAKrB2B,EAASyF,MAAQA,EAEjBjJ,OAAOwD,SAAWA,OAEI,IAAXvH,GAA0BA,EAAOL,UAC1CK,EAAOL,QAAU4H,IAGjB,CAACkJ,WAAW,EAAEC,cAAc,EAAEC,aAAa,EAAEC,4BAA4B,EAAEC,uBAAuB,IAAIC,EAAE,CAAC,SAAS/Q,EAAQC,EAAOL,GACnI,aAGAK,EAAOL,QADM,0hCAGX,IAAIoR,EAAE,CAAC,SAAShR,EAAQC,EAAOL,GACjC,aAEA,IAAIkN,EAAQ,SAAekD,GACzBrP,KAAKuN,KAAO8B,EACZrP,KAAKsQ,SAAW,GAGlBnE,EAAM1M,UAAUgF,KAAO,WACrBzE,KAAKuN,QAGPpB,EAAM1M,UAAU4P,MAAQ,WACjBrP,KAAKsQ,WACRtQ,KAAKsQ,SAAWjN,OAAOsM,YAAY3P,KAAKyE,KAAKuE,KAAKhJ,MAAO,OAI7DmM,EAAM1M,UAAU8P,KAAO,WACjBvP,KAAKsQ,WACPjN,OAAOkN,cAAcvQ,KAAKsQ,UAC1BtQ,KAAKsQ,SAAW,IAIpBhR,EAAOL,QAAUkN,GAEf,IAAIqE,EAAE,CAAC,SAASnR,EAAQC,EAAOL,GACjC,aAEAK,EAAOL,QAAU,SAAUwR,GACzB,IAAIC,EAAU,KACVC,EAAa,GAEjB,SAASC,IACP3I,SAAS0C,gBAAgBkG,oBAAoB,aAAcC,GAC3D7I,SAAS0C,gBAAgBkG,oBAAoB,aAAcE,GAC3D9I,SAAS0C,gBAAgBkG,oBAAoB,QAAS7D,GACtD3J,OAAOwN,oBAAoB,aAAcG,GACzC3N,OAAOwN,oBAAoB,WAAYI,GACvCR,IAGF,SAASzD,IACS,OAAZ0D,IAIJrN,OAAO2J,aAAa0D,GACpBA,EAAU,MAGZ,SAASK,EAAa3Q,GACpB4M,IAGF,SAAS8D,EAAa1Q,GACpB4M,IAGI5M,EAAI8Q,SAAW,GAAK9Q,EAAI+Q,QAAU,GAAO9N,OAAO6H,aAClDwF,EAAUrN,OAAO4B,WAAW2L,EAAiB,MAIjD,SAASI,EAAa5Q,GACpB4M,IACA2D,EAAa,CACXS,UAAWC,YAAYtE,MACvBU,QAASpK,OAAOoK,QAChB5D,aAAcxG,OAAOyG,aAIzB,SAASmH,EAAW7Q,GAClB4M,IAEI3J,OAAOyG,YAAc6G,EAAW9G,cAKhCxG,OAAOoK,QAAU,IAAMkD,EAAWlD,SAIS,IAA3C4D,YAAYtE,MAAQ4D,EAAWS,YAIyB,EAAxD,CAAC,IAAK,QAAS,UAAUtC,QAAQ1O,EAAI6I,OAAOC,WAIhDwH,EAAUrN,OAAO4B,WAAW2L,EAAiB,MAG/CvN,OAAOyF,iBAAiB,aAAckI,GACtC3N,OAAOyF,iBAAiB,WAAYmI,GACpChJ,SAAS0C,gBAAgB7B,iBAAiB,aAAciI,GACxD9I,SAAS0C,gBAAgB7B,iBAAiB,aAAcgI,GACxD7I,SAAS0C,gBAAgB7B,iBAAiB,QAASkE,KAGnD,IAAIsE,EAAE,CAAC,SAASjS,EAAQC,EAAOL,GACjC,aAEA,SAASsS,EAAQC,GAAwT,OAAtOD,EAArD,mBAAXE,QAAoD,iBAApBA,OAAOC,SAAmC,SAAiBF,GAAO,cAAcA,GAA2B,SAAiBA,GAAO,OAAOA,GAAyB,mBAAXC,QAAyBD,EAAIG,cAAgBF,QAAUD,IAAQC,OAAOhS,UAAY,gBAAkB+R,IAAyBA,IAExV,WAGE,IAAI3K,EAAWxH,EAAQ,YAEnBuS,EAAUvO,OAAOwO,iBAwErB,SAASC,EAAsBjJ,GAC7B,IAAKxF,OAAO0O,SAASC,MAAQ,IAAM3O,OAAO0O,SAASC,KAAK7S,OACtD,OAAO,EAGT,IAAI8S,EAAY5O,OAAO0O,SAASC,KAAKhD,UAAU,GAI/C,QAFY,qBAEDrO,KAAKsR,KAIZA,IAAcpJ,EAAIpF,QAAQgE,MAEnBoB,EAAIpF,QAAQgH,cAAc,IAAMwH,IArF7C5O,OAAOwD,SAAWA,EAmHlB,IAAIqL,GAA6D,EAAhDjK,SAASwB,KAAKH,UAAUwF,QAAQ,aAE7CoD,GAAcN,EAAQvK,UACxB8K,QAAQC,IAAI,oFAIdvL,EAAS2I,OAETnM,OAAOyF,iBAAiB,OAhGxB,WAEE,IAAI8I,EAAQS,OAAZ,CAKA,IAAK,IAAI/R,KAAOsR,EAAQtF,MAAO,CAE7B,IAAIgG,EAAUV,EAAQtF,MAAMhM,GAC5BgS,EAAQjL,SAAW6K,GAAcN,EAAQvK,SAEzC,IAAIkL,EAAoBtK,SAASC,eAAe,gBAAkBoK,EAAQ7K,GAAK,YAE/E,GAAK8K,EAAL,CAKAD,EAAQtL,QAAUuL,EAElB,IAAI1J,EAAMhC,EAASwF,OAAOiG,EAAQ7K,GAAI6K,GAEtCzJ,EAAIpF,QAAQ6F,UAAYT,EAAIpF,QAAQ6F,UAAY,aAAegJ,EAAQE,KAAKC,KAjDnEhP,EAmDLoF,EAAIpF,SAnDUC,EAmDD4O,EAAQ9O,KAlDhBkP,mBACTjP,EAAQG,MAAM+O,WAAajP,EAAOgP,kBAGhChP,EAAOkP,QACTnP,EAAQG,MAAMgP,MAAQlP,EAAOkP,OAG3BlP,EAAOmP,eACTpP,EAAQG,MAAMkP,YAAcpP,EAAOmP,cAGjCnP,EAAOqP,eACTtP,EAAQG,MAAMoP,YAAcC,SAASvP,EAAOqP,cAAgB,MAG1DrP,EAAOwP,eACTzP,EAAQG,MAAMuP,YAAczP,EAAOwP,cAGjCxP,EAAO0P,QACT3P,EAAQG,MAAMyP,SAAWJ,SAASvP,EAAO0P,OAAS,MA8BlDvK,EAAIpF,QAAQ6P,WAAWA,WAAWhK,WAAa,eAC/CT,EAAIpF,QAAQ6P,WAAWC,UAAUjK,WAAa,cAE1CT,EAAImC,QAAU8G,EAAsBjJ,IACtCA,EAAIsB,QAxDV,IAAa1G,EAASC,EA6DpBkO,EAAQS,QAAS,EAEjBxL,EAAS9D,QAAQ,QA2BnB,WACE,GAA2C,WAAvCwO,EAAQlO,OAAOmQ,qBAAqCnQ,OAAOmQ,mBAAmBC,eAAlF,CAIA,IAAIC,EAAW,IAAMrQ,OAAOmQ,mBAAmBC,eAAeE,WAC1DrH,EAAQzF,EAASyF,MAErB,IAAK,IAAIyC,KAASzC,EAChB,GAAKA,EAAM5L,eAAeqO,GAA1B,CAIA,IAAIlG,EAAMyD,EAAMyC,GAEhB,GAAIlG,EAAIpF,QAAQgH,cAAciJ,GAE5B,OADA7K,EAAIsB,SAzCRyJ,MA1EJ,IAsIE,CAACC,SAAW,KAAK,GAAG,CAAC,IAljDvB","file":"script.min.js","sourcesContent":["(function () { var require = undefined; var module = undefined; var exports = undefined; var define = undefined; (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*!\n * EventEmitter v5.2.5 - git.io/ee\n * Unlicense - http://unlicense.org/\n * Oliver Caldwell - http://oli.me.uk/\n * @preserve\n */\n\n;(function (exports) {\n 'use strict';\n\n /**\n * Class for managing events.\n * Can be extended to provide event functionality in other classes.\n *\n * @class EventEmitter Manages event registering and emitting.\n */\n function EventEmitter() {}\n\n // Shortcuts to improve speed and size\n var proto = EventEmitter.prototype;\n var originalGlobalValue = exports.EventEmitter;\n\n /**\n * Finds the index of the listener for the event in its storage array.\n *\n * @param {Function[]} listeners Array of listeners to search through.\n * @param {Function} listener Method to look for.\n * @return {Number} Index of the specified listener, -1 if not found\n * @api private\n */\n function indexOfListener(listeners, listener) {\n var i = listeners.length;\n while (i--) {\n if (listeners[i].listener === listener) {\n return i;\n }\n }\n\n return -1;\n }\n\n /**\n * Alias a method while keeping the context correct, to allow for overwriting of target method.\n *\n * @param {String} name The name of the target method.\n * @return {Function} The aliased method\n * @api private\n */\n function alias(name) {\n return function aliasClosure() {\n return this[name].apply(this, arguments);\n };\n }\n\n /**\n * Returns the listener array for the specified event.\n * Will initialise the event object and listener arrays if required.\n * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them.\n * Each property in the object response is an array of listener functions.\n *\n * @param {String|RegExp} evt Name of the event to return the listeners from.\n * @return {Function[]|Object} All listener functions for the event.\n */\n proto.getListeners = function getListeners(evt) {\n var events = this._getEvents();\n var response;\n var key;\n\n // Return a concatenated array of all matching events if\n // the selector is a regular expression.\n if (evt instanceof RegExp) {\n response = {};\n for (key in events) {\n if (events.hasOwnProperty(key) && evt.test(key)) {\n response[key] = events[key];\n }\n }\n }\n else {\n response = events[evt] || (events[evt] = []);\n }\n\n return response;\n };\n\n /**\n * Takes a list of listener objects and flattens it into a list of listener functions.\n *\n * @param {Object[]} listeners Raw listener objects.\n * @return {Function[]} Just the listener functions.\n */\n proto.flattenListeners = function flattenListeners(listeners) {\n var flatListeners = [];\n var i;\n\n for (i = 0; i < listeners.length; i += 1) {\n flatListeners.push(listeners[i].listener);\n }\n\n return flatListeners;\n };\n\n /**\n * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful.\n *\n * @param {String|RegExp} evt Name of the event to return the listeners from.\n * @return {Object} All listener functions for an event in an object.\n */\n proto.getListenersAsObject = function getListenersAsObject(evt) {\n var listeners = this.getListeners(evt);\n var response;\n\n if (listeners instanceof Array) {\n response = {};\n response[evt] = listeners;\n }\n\n return response || listeners;\n };\n\n function isValidListener (listener) {\n if (typeof listener === 'function' || listener instanceof RegExp) {\n return true\n } else if (listener && typeof listener === 'object') {\n return isValidListener(listener.listener)\n } else {\n return false\n }\n }\n\n /**\n * Adds a listener function to the specified event.\n * The listener will not be added if it is a duplicate.\n * If the listener returns true then it will be removed after it is called.\n * If you pass a regular expression as the event name then the listener will be added to all events that match it.\n *\n * @param {String|RegExp} evt Name of the event to attach the listener to.\n * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.addListener = function addListener(evt, listener) {\n if (!isValidListener(listener)) {\n throw new TypeError('listener must be a function');\n }\n\n var listeners = this.getListenersAsObject(evt);\n var listenerIsWrapped = typeof listener === 'object';\n var key;\n\n for (key in listeners) {\n if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) {\n listeners[key].push(listenerIsWrapped ? listener : {\n listener: listener,\n once: false\n });\n }\n }\n\n return this;\n };\n\n /**\n * Alias of addListener\n */\n proto.on = alias('addListener');\n\n /**\n * Semi-alias of addListener. It will add a listener that will be\n * automatically removed after its first execution.\n *\n * @param {String|RegExp} evt Name of the event to attach the listener to.\n * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.addOnceListener = function addOnceListener(evt, listener) {\n return this.addListener(evt, {\n listener: listener,\n once: true\n });\n };\n\n /**\n * Alias of addOnceListener.\n */\n proto.once = alias('addOnceListener');\n\n /**\n * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad.\n * You need to tell it what event names should be matched by a regex.\n *\n * @param {String} evt Name of the event to create.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.defineEvent = function defineEvent(evt) {\n this.getListeners(evt);\n return this;\n };\n\n /**\n * Uses defineEvent to define multiple events.\n *\n * @param {String[]} evts An array of event names to define.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.defineEvents = function defineEvents(evts) {\n for (var i = 0; i < evts.length; i += 1) {\n this.defineEvent(evts[i]);\n }\n return this;\n };\n\n /**\n * Removes a listener function from the specified event.\n * When passed a regular expression as the event name, it will remove the listener from all events that match it.\n *\n * @param {String|RegExp} evt Name of the event to remove the listener from.\n * @param {Function} listener Method to remove from the event.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.removeListener = function removeListener(evt, listener) {\n var listeners = this.getListenersAsObject(evt);\n var index;\n var key;\n\n for (key in listeners) {\n if (listeners.hasOwnProperty(key)) {\n index = indexOfListener(listeners[key], listener);\n\n if (index !== -1) {\n listeners[key].splice(index, 1);\n }\n }\n }\n\n return this;\n };\n\n /**\n * Alias of removeListener\n */\n proto.off = alias('removeListener');\n\n /**\n * Adds listeners in bulk using the manipulateListeners method.\n * If you pass an object as the first argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added.\n * You can also pass it a regular expression to add the array of listeners to all events that match it.\n * Yeah, this function does quite a bit. That's probably a bad thing.\n *\n * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once.\n * @param {Function[]} [listeners] An optional array of listener functions to add.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.addListeners = function addListeners(evt, listeners) {\n // Pass through to manipulateListeners\n return this.manipulateListeners(false, evt, listeners);\n };\n\n /**\n * Removes listeners in bulk using the manipulateListeners method.\n * If you pass an object as the first argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n * You can also pass it an event name and an array of listeners to be removed.\n * You can also pass it a regular expression to remove the listeners from all events that match it.\n *\n * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once.\n * @param {Function[]} [listeners] An optional array of listener functions to remove.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.removeListeners = function removeListeners(evt, listeners) {\n // Pass through to manipulateListeners\n return this.manipulateListeners(true, evt, listeners);\n };\n\n /**\n * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level.\n * The first argument will determine if the listeners are removed (true) or added (false).\n * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n * You can also pass it an event name and an array of listeners to be added/removed.\n * You can also pass it a regular expression to manipulate the listeners of all events that match it.\n *\n * @param {Boolean} remove True if you want to remove listeners, false if you want to add.\n * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once.\n * @param {Function[]} [listeners] An optional array of listener functions to add/remove.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) {\n var i;\n var value;\n var single = remove ? this.removeListener : this.addListener;\n var multiple = remove ? this.removeListeners : this.addListeners;\n\n // If evt is an object then pass each of its properties to this method\n if (typeof evt === 'object' && !(evt instanceof RegExp)) {\n for (i in evt) {\n if (evt.hasOwnProperty(i) && (value = evt[i])) {\n // Pass the single listener straight through to the singular method\n if (typeof value === 'function') {\n single.call(this, i, value);\n }\n else {\n // Otherwise pass back to the multiple function\n multiple.call(this, i, value);\n }\n }\n }\n }\n else {\n // So evt must be a string\n // And listeners must be an array of listeners\n // Loop over it and pass each one to the multiple method\n i = listeners.length;\n while (i--) {\n single.call(this, evt, listeners[i]);\n }\n }\n\n return this;\n };\n\n /**\n * Removes all listeners from a specified event.\n * If you do not specify an event then all listeners will be removed.\n * That means every event will be emptied.\n * You can also pass a regex to remove all events that match it.\n *\n * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.removeEvent = function removeEvent(evt) {\n var type = typeof evt;\n var events = this._getEvents();\n var key;\n\n // Remove different things depending on the state of evt\n if (type === 'string') {\n // Remove all listeners for the specified event\n delete events[evt];\n }\n else if (evt instanceof RegExp) {\n // Remove all events matching the regex.\n for (key in events) {\n if (events.hasOwnProperty(key) && evt.test(key)) {\n delete events[key];\n }\n }\n }\n else {\n // Remove all listeners in all events\n delete this._events;\n }\n\n return this;\n };\n\n /**\n * Alias of removeEvent.\n *\n * Added to mirror the node API.\n */\n proto.removeAllListeners = alias('removeEvent');\n\n /**\n * Emits an event of your choice.\n * When emitted, every listener attached to that event will be executed.\n * If you pass the optional argument array then those arguments will be passed to every listener upon execution.\n * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.\n * So they will not arrive within the array on the other side, they will be separate.\n * You can also pass a regular expression to emit to all events that match it.\n *\n * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n * @param {Array} [args] Optional array of arguments to be passed to each listener.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.emitEvent = function emitEvent(evt, args) {\n var listenersMap = this.getListenersAsObject(evt);\n var listeners;\n var listener;\n var i;\n var key;\n var response;\n\n for (key in listenersMap) {\n if (listenersMap.hasOwnProperty(key)) {\n listeners = listenersMap[key].slice(0);\n\n for (i = 0; i < listeners.length; i++) {\n // If the listener returns true then it shall be removed from the event\n // The function is executed either with a basic call or an apply if there is an args array\n listener = listeners[i];\n\n if (listener.once === true) {\n this.removeListener(evt, listener.listener);\n }\n\n response = listener.listener.apply(this, args || []);\n\n if (response === this._getOnceReturnValue()) {\n this.removeListener(evt, listener.listener);\n }\n }\n }\n }\n\n return this;\n };\n\n /**\n * Alias of emitEvent\n */\n proto.trigger = alias('emitEvent');\n\n /**\n * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on.\n * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it.\n *\n * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n * @param {...*} Optional additional arguments to be passed to each listener.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.emit = function emit(evt) {\n var args = Array.prototype.slice.call(arguments, 1);\n return this.emitEvent(evt, args);\n };\n\n /**\n * Sets the current value to check against when executing listeners. If a\n * listeners return value matches the one set here then it will be removed\n * after execution. This value defaults to true.\n *\n * @param {*} value The new value to check for when executing listeners.\n * @return {Object} Current instance of EventEmitter for chaining.\n */\n proto.setOnceReturnValue = function setOnceReturnValue(value) {\n this._onceReturnValue = value;\n return this;\n };\n\n /**\n * Fetches the current value to check against when executing listeners. If\n * the listeners return value matches this one then it should be removed\n * automatically. It will return true by default.\n *\n * @return {*|Boolean} The current value to check for or the default, true.\n * @api private\n */\n proto._getOnceReturnValue = function _getOnceReturnValue() {\n if (this.hasOwnProperty('_onceReturnValue')) {\n return this._onceReturnValue;\n }\n else {\n return true;\n }\n };\n\n /**\n * Fetches the events object and creates one if required.\n *\n * @return {Object} The events storage object.\n * @api private\n */\n proto._getEvents = function _getEvents() {\n return this._events || (this._events = {});\n };\n\n /**\n * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version.\n *\n * @return {Function} Non conflicting EventEmitter class.\n */\n EventEmitter.noConflict = function noConflict() {\n exports.EventEmitter = originalGlobalValue;\n return EventEmitter;\n };\n\n // Expose the class either via AMD, CommonJS or the global object\n if (typeof define === 'function' && define.amd) {\n define(function () {\n return EventEmitter;\n });\n }\n else if (typeof module === 'object' && module.exports){\n module.exports = EventEmitter;\n }\n else {\n exports.EventEmitter = EventEmitter;\n }\n}(typeof window !== 'undefined' ? window : this || {}));\n\n},{}],2:[function(require,module,exports){\n\"use strict\";\n\nvar duration = 320;\n\nfunction css(element, styles) {\n for (var property in styles) {\n element.style[property] = styles[property];\n }\n}\n\nfunction initObjectProperties(properties, value) {\n var newObject = {};\n\n for (var i = 0; i < properties.length; i++) {\n newObject[properties[i]] = value;\n }\n\n return newObject;\n}\n\nfunction copyObjectProperties(properties, object) {\n var newObject = {};\n\n for (var i = 0; i < properties.length; i++) {\n newObject[properties[i]] = object[properties[i]];\n }\n\n return newObject;\n}\n/**\n * Checks if the given element is currently being animated.\n *\n * @param element\n * @returns {boolean}\n */\n\n\nfunction animated(element) {\n return !!element.getAttribute('data-animated');\n}\n/**\n * Toggles the element using the given animation.\n *\n * @param element\n * @param animation Either \"fade\" or \"slide\"\n */\n\n\nfunction toggle(element, animation, callbackFn) {\n var nowVisible = element.style.display != 'none' || element.offsetLeft > 0; // create clone for reference\n\n var clone = element.cloneNode(true);\n\n var cleanup = function cleanup() {\n element.removeAttribute('data-animated');\n element.setAttribute('style', clone.getAttribute('style'));\n element.style.display = nowVisible ? 'none' : '';\n\n if (callbackFn) {\n callbackFn();\n }\n }; // store attribute so everyone knows we're animating this element\n\n\n element.setAttribute('data-animated', \"true\"); // toggle element visiblity right away if we're making something visible\n\n if (!nowVisible) {\n element.style.display = '';\n }\n\n var hiddenStyles, visibleStyles; // animate properties\n\n if (animation === 'slide') {\n hiddenStyles = initObjectProperties([\"height\", \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"], 0);\n visibleStyles = {};\n\n if (!nowVisible) {\n var computedStyles = window.getComputedStyle(element);\n visibleStyles = copyObjectProperties([\"height\", \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"], computedStyles); // in some browsers, getComputedStyle returns \"auto\" value. this falls back to getBoundingClientRect() in those browsers since we need an actual height.\n\n if (!isFinite(visibleStyles.height)) {\n var clientRect = element.getBoundingClientRect();\n visibleStyles.height = clientRect.height;\n }\n\n css(element, hiddenStyles);\n } // don't show a scrollbar during animation\n\n\n element.style.overflowY = 'hidden';\n animate(element, nowVisible ? hiddenStyles : visibleStyles, cleanup);\n } else {\n hiddenStyles = {\n opacity: 0\n };\n visibleStyles = {\n opacity: 1\n };\n\n if (!nowVisible) {\n css(element, hiddenStyles);\n }\n\n animate(element, nowVisible ? hiddenStyles : visibleStyles, cleanup);\n }\n}\n\nfunction animate(element, targetStyles, fn) {\n var last = +new Date();\n var initialStyles = window.getComputedStyle(element);\n var currentStyles = {};\n var propSteps = {};\n\n for (var property in targetStyles) {\n // make sure we have an object filled with floats\n targetStyles[property] = parseFloat(targetStyles[property]); // calculate step size & current value\n\n var to = targetStyles[property];\n var current = parseFloat(initialStyles[property]); // is there something to do?\n\n if (current == to) {\n delete targetStyles[property];\n continue;\n }\n\n propSteps[property] = (to - current) / duration; // points per second\n\n currentStyles[property] = current;\n }\n\n var tick = function tick() {\n var now = +new Date();\n var timeSinceLastTick = now - last;\n var done = true;\n var step, to, increment, newValue;\n\n for (var property in targetStyles) {\n step = propSteps[property];\n to = targetStyles[property];\n increment = step * timeSinceLastTick;\n newValue = currentStyles[property] + increment;\n\n if (step > 0 && newValue >= to || step < 0 && newValue <= to) {\n newValue = to;\n } else {\n done = false;\n } // store new value\n\n\n currentStyles[property] = newValue;\n var suffix = property !== \"opacity\" ? \"px\" : \"\";\n element.style[property] = newValue + suffix;\n }\n\n last = +new Date(); // keep going until we're done for all props\n\n if (!done) {\n window.requestAnimationFrame && requestAnimationFrame(tick) || setTimeout(tick, 32);\n } else {\n // call callback\n fn && fn();\n }\n };\n\n tick();\n}\n\nmodule.exports = {\n 'toggle': toggle,\n 'animate': animate,\n 'animated': animated\n};\n\n},{}],3:[function(require,module,exports){\n'use strict';\n\nvar defaults = {\n 'animation': 'fade',\n 'rehide': false,\n 'content': '',\n 'cookie': null,\n 'icon': '&times',\n 'screenWidthCondition': null,\n 'position': 'center',\n 'testMode': false,\n 'trigger': false,\n 'closable': true\n},\n Boxzilla,\n Animator = require('./animator.js');\n/**\n* Merge 2 objects, values of the latter overwriting the former.\n*\n* @param obj1\n* @param obj2\n* @returns {*}\n*/\n\n\nfunction merge(obj1, obj2) {\n var obj3 = {};\n\n for (var attrname in obj1) {\n obj3[attrname] = obj1[attrname];\n }\n\n for (var attrname in obj2) {\n obj3[attrname] = obj2[attrname];\n }\n\n return obj3;\n}\n/**\n* Get the real height of entire document.\n* @returns {number}\n*/\n\n\nfunction getDocumentHeight() {\n var body = document.body,\n html = document.documentElement;\n var height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n return height;\n} // Box Object\n\n\nvar Box = function Box(id, config) {\n this.id = id; // store config values\n\n this.config = merge(defaults, config); // store ref to overlay\n\n this.overlay = document.getElementById('boxzilla-overlay'); // state\n\n this.visible = false;\n this.dismissed = false;\n this.triggered = false;\n this.triggerHeight = this.calculateTriggerHeight();\n this.cookieSet = this.isCookieSet();\n this.element = null;\n this.contentElement = null;\n this.closeIcon = null; // create dom elements for this box\n\n this.dom(); // further initialise the box\n\n this.events();\n}; // initialise the box\n\n\nBox.prototype.events = function () {\n var box = this; // attach event to \"close\" icon inside box\n\n if (this.closeIcon) {\n this.closeIcon.addEventListener('click', this.dismiss.bind(this));\n }\n\n this.element.addEventListener('click', function (e) {\n if (e.target.tagName === 'A') {\n Boxzilla.trigger('box.interactions.link', [box, e.target]);\n }\n }, false);\n this.element.addEventListener('submit', function (e) {\n box.setCookie();\n Boxzilla.trigger('box.interactions.form', [box, e.target]);\n }, false);\n}; // generate dom elements for this box\n\n\nBox.prototype.dom = function () {\n var wrapper = document.createElement('div');\n wrapper.className = 'boxzilla-container boxzilla-' + this.config.position + '-container';\n var box = document.createElement('div');\n box.setAttribute('id', 'boxzilla-' + this.id);\n box.className = 'boxzilla boxzilla-' + this.id + ' boxzilla-' + this.config.position;\n box.style.display = 'none';\n wrapper.appendChild(box);\n var content;\n\n if (typeof this.config.content === \"string\") {\n content = document.createElement('div');\n content.innerHTML = this.config.content;\n } else {\n content = this.config.content; // make sure element is visible\n\n content.style.display = '';\n }\n\n content.className = 'boxzilla-content';\n box.appendChild(content);\n\n if (this.config.closable && this.config.icon) {\n var closeIcon = document.createElement('span');\n closeIcon.className = \"boxzilla-close-icon\";\n closeIcon.innerHTML = this.config.icon;\n box.appendChild(closeIcon);\n this.closeIcon = closeIcon;\n }\n\n document.body.appendChild(wrapper);\n this.contentElement = content;\n this.element = box;\n}; // set (calculate) custom box styling depending on box options\n\n\nBox.prototype.setCustomBoxStyling = function () {\n // reset element to its initial state\n var origDisplay = this.element.style.display;\n this.element.style.display = '';\n this.element.style.overflowY = 'auto';\n this.element.style.maxHeight = 'none'; // get new dimensions\n\n var windowHeight = window.innerHeight;\n var boxHeight = this.element.clientHeight; // add scrollbar to box and limit height\n\n if (boxHeight > windowHeight) {\n this.element.style.maxHeight = windowHeight + \"px\";\n this.element.style.overflowY = 'scroll';\n } // set new top margin for boxes which are centered\n\n\n if (this.config.position === 'center') {\n var newTopMargin = (windowHeight - boxHeight) / 2;\n newTopMargin = newTopMargin >= 0 ? newTopMargin : 0;\n this.element.style.marginTop = newTopMargin + \"px\";\n }\n\n this.element.style.display = origDisplay;\n}; // toggle visibility of the box\n\n\nBox.prototype.toggle = function (show) {\n // revert visibility if no explicit argument is given\n if (typeof show === \"undefined\") {\n show = !this.visible;\n } // is box already at desired visibility?\n\n\n if (show === this.visible) {\n return false;\n } // is box being animated?\n\n\n if (Animator.animated(this.element)) {\n return false;\n } // if box should be hidden but is not closable, bail.\n\n\n if (!show && !this.config.closable) {\n return false;\n } // set new visibility status\n\n\n this.visible = show; // calculate new styling rules\n\n this.setCustomBoxStyling(); // trigger event\n\n Boxzilla.trigger('box.' + (show ? 'show' : 'hide'), [this]); // show or hide box using selected animation\n\n if (this.config.position === 'center') {\n this.overlay.classList.toggle('boxzilla-' + this.id + '-overlay');\n Animator.toggle(this.overlay, \"fade\");\n }\n\n Animator.toggle(this.element, this.config.animation, function () {\n if (this.visible) {\n return;\n }\n\n this.contentElement.innerHTML = this.contentElement.innerHTML;\n }.bind(this));\n return true;\n}; // show the box\n\n\nBox.prototype.show = function () {\n return this.toggle(true);\n}; // hide the box\n\n\nBox.prototype.hide = function () {\n return this.toggle(false);\n}; // calculate trigger height\n\n\nBox.prototype.calculateTriggerHeight = function () {\n var triggerHeight = 0;\n\n if (this.config.trigger) {\n if (this.config.trigger.method === 'element') {\n var triggerElement = document.body.querySelector(this.config.trigger.value);\n\n if (triggerElement) {\n var offset = triggerElement.getBoundingClientRect();\n triggerHeight = offset.top;\n }\n } else if (this.config.trigger.method === 'percentage') {\n triggerHeight = this.config.trigger.value / 100 * getDocumentHeight();\n }\n }\n\n return triggerHeight;\n};\n\nBox.prototype.fits = function () {\n if (!this.config.screenWidthCondition || !this.config.screenWidthCondition.value) {\n return true;\n }\n\n switch (this.config.screenWidthCondition.condition) {\n case \"larger\":\n return window.innerWidth > this.config.screenWidthCondition.value;\n\n case \"smaller\":\n return window.innerWidth < this.config.screenWidthCondition.value;\n } // meh.. condition should be \"smaller\" or \"larger\", just return true.\n\n\n return true;\n};\n\nBox.prototype.onResize = function () {\n this.triggerHeight = this.calculateTriggerHeight();\n this.setCustomBoxStyling();\n}; // is this box enabled?\n\n\nBox.prototype.mayAutoShow = function () {\n if (this.dismissed) {\n return false;\n } // check if box fits on given minimum screen width\n\n\n if (!this.fits()) {\n return false;\n } // if trigger empty or error in calculating triggerHeight, return false\n\n\n if (!this.config.trigger) {\n return false;\n } // rely on cookie value (show if not set, don't show if set)\n\n\n return !this.cookieSet;\n};\n\nBox.prototype.mayRehide = function () {\n return this.config.rehide && this.triggered;\n};\n\nBox.prototype.isCookieSet = function () {\n // always show on test mode or when no auto-trigger is configured\n if (this.config.testMode || !this.config.trigger) {\n return false;\n } // if either cookie is null or trigger & dismiss are both falsey, don't bother checking.\n\n\n if (!this.config.cookie || !this.config.cookie.triggered && !this.config.cookie.dismissed) {\n return false;\n }\n\n var cookieSet = document.cookie.replace(new RegExp(\"(?:(?:^|.*;)\\\\s*\" + 'boxzilla_box_' + this.id + \"\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$\"), \"$1\") === \"true\";\n return cookieSet;\n}; // set cookie that disables automatically showing the box\n\n\nBox.prototype.setCookie = function (hours) {\n var expiryDate = new Date();\n expiryDate.setHours(expiryDate.getHours() + hours);\n document.cookie = 'boxzilla_box_' + this.id + '=true; expires=' + expiryDate.toUTCString() + '; path=/';\n};\n\nBox.prototype.trigger = function () {\n var shown = this.show();\n\n if (!shown) {\n return;\n }\n\n this.triggered = true;\n\n if (this.config.cookie && this.config.cookie.triggered) {\n this.setCookie(this.config.cookie.triggered);\n }\n};\n/**\n* Dismisses the box and optionally sets a cookie.\n*\n* @param e The event that triggered this dismissal.\n* @returns {boolean}\n*/\n\n\nBox.prototype.dismiss = function (e) {\n // prevent default action\n e && e.preventDefault(); // only dismiss box if it's currently open.\n\n if (!this.visible) {\n return false;\n } // hide box element\n\n\n this.hide(); // set cookie\n\n if (this.config.cookie && this.config.cookie.dismissed) {\n this.setCookie(this.config.cookie.dismissed);\n }\n\n this.dismissed = true;\n Boxzilla.trigger('box.dismiss', [this]);\n return true;\n};\n\nmodule.exports = function (_Boxzilla) {\n Boxzilla = _Boxzilla;\n return Box;\n};\n\n},{\"./animator.js\":2}],4:[function(require,module,exports){\n'use strict';\n\nvar EventEmitter = require('wolfy87-eventemitter');\n\nvar Timer = require('./timer.js');\n\nvar Boxzilla = Object.create(EventEmitter.prototype);\n\nvar Box = require('./box.js')(Boxzilla);\n\nvar boxes = [];\nvar overlay;\nvar scrollElement = window;\nvar siteTimer;\nvar pageTimer;\nvar pageViews;\nvar initialised = false;\n\nvar styles = require('./styles.js');\n\nvar ExitIntent = require('./triggers/exit-intent.js');\n\nfunction throttle(fn, threshhold, scope) {\n threshhold || (threshhold = 250);\n var last, deferTimer;\n return function () {\n var context = scope || this;\n var now = +new Date(),\n args = arguments;\n\n if (last && now < last + threshhold) {\n // hold on to it\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n fn.apply(context, args);\n }, threshhold);\n } else {\n last = now;\n fn.apply(context, args);\n }\n };\n} // \"keyup\" listener\n\n\nfunction onKeyUp(e) {\n if (e.keyCode === 27) {\n Boxzilla.dismiss();\n }\n} // check \"pageviews\" criteria for each box\n\n\nfunction checkPageViewsCriteria() {\n // don't bother if another box is currently open\n if (isAnyBoxVisible()) {\n return;\n }\n\n boxes.forEach(function (box) {\n if (!box.mayAutoShow()) {\n return;\n }\n\n if (box.config.trigger.method === 'pageviews' && pageViews >= box.config.trigger.value) {\n box.trigger();\n }\n });\n} // check time trigger criteria for each box\n\n\nfunction checkTimeCriteria() {\n // don't bother if another box is currently open\n if (isAnyBoxVisible()) {\n return;\n }\n\n boxes.forEach(function (box) {\n if (!box.mayAutoShow()) {\n return;\n } // check \"time on site\" trigger\n\n\n if (box.config.trigger.method === 'time_on_site' && siteTimer.time >= box.config.trigger.value) {\n box.trigger();\n } // check \"time on page\" trigger\n\n\n if (box.config.trigger.method === 'time_on_page' && pageTimer.time >= box.config.trigger.value) {\n box.trigger();\n }\n });\n} // check triggerHeight criteria for all boxes\n\n\nfunction checkHeightCriteria() {\n var scrollY = scrollElement.hasOwnProperty('pageYOffset') ? scrollElement.pageYOffset : scrollElement.scrollTop;\n scrollY = scrollY + window.innerHeight * 0.9;\n boxes.forEach(function (box) {\n if (!box.mayAutoShow() || box.triggerHeight <= 0) {\n return;\n }\n\n if (scrollY > box.triggerHeight) {\n // don't bother if another box is currently open\n if (isAnyBoxVisible()) {\n return;\n } // trigger box\n\n\n box.trigger();\n } // if box may auto-hide and scrollY is less than triggerHeight (with small margin of error), hide box\n\n\n if (box.mayRehide() && scrollY < box.triggerHeight - 5) {\n box.hide();\n }\n });\n} // recalculate heights and variables based on height\n\n\nfunction recalculateHeights() {\n boxes.forEach(function (box) {\n box.onResize();\n });\n}\n\nfunction onOverlayClick(e) {\n var x = e.offsetX;\n var y = e.offsetY; // calculate if click was less than 40px outside box to avoid closing it by accident\n\n boxes.forEach(function (box) {\n var rect = box.element.getBoundingClientRect();\n var margin = 40; // if click was not anywhere near box, dismiss it.\n\n if (x < rect.left - margin || x > rect.right + margin || y < rect.top - margin || y > rect.bottom + margin) {\n box.dismiss();\n }\n });\n}\n\nfunction showBoxesWithExitIntentTrigger() {\n // do nothing if already triggered OR another box is visible.\n if (isAnyBoxVisible()) {\n return;\n }\n\n boxes.forEach(function (box) {\n if (box.mayAutoShow() && box.config.trigger.method === 'exit_intent') {\n box.trigger();\n }\n });\n}\n\nfunction isAnyBoxVisible() {\n return boxes.filter(function (b) {\n return b.visible;\n }).length > 0;\n}\n\nfunction onElementClick(e) {\n // find <a> element in up to 3 parent elements\n var el = e.target || e.srcElement;\n var depth = 3;\n\n for (var i = 0; i <= depth; i++) {\n if (!el || el.tagName === 'A') {\n break;\n }\n\n el = el.parentElement;\n }\n\n if (!el || el.tagName !== 'A' || !el.getAttribute('href')) {\n return;\n }\n\n if (el.getAttribute('href').toLowerCase().indexOf('#boxzilla-') === 0) {\n var boxId = el.getAttribute('href').toLowerCase().substring(\"#boxzilla-\".length);\n Boxzilla.toggle(boxId);\n }\n}\n\nvar timers = {\n start: function start() {\n try {\n var sessionTime = sessionStorage.getItem('boxzilla_timer');\n if (sessionTime) siteTimer.time = sessionTime;\n } catch (e) {}\n\n siteTimer.start();\n pageTimer.start();\n },\n stop: function stop() {\n sessionStorage.setItem('boxzilla_timer', siteTimer.time);\n siteTimer.stop();\n pageTimer.stop();\n }\n}; // initialise & add event listeners\n\nBoxzilla.init = function () {\n if (initialised) {\n return;\n }\n\n document.body.addEventListener('click', onElementClick, true);\n\n try {\n pageViews = sessionStorage.getItem('boxzilla_pageviews') || 0;\n } catch (e) {\n pageViews = 0;\n }\n\n siteTimer = new Timer(0);\n pageTimer = new Timer(0); // insert styles into DOM\n\n var styleElement = document.createElement('style');\n styleElement.setAttribute(\"type\", \"text/css\");\n styleElement.innerHTML = styles;\n document.head.appendChild(styleElement); // add overlay element to dom\n\n overlay = document.createElement('div');\n overlay.style.display = 'none';\n overlay.id = 'boxzilla-overlay';\n document.body.appendChild(overlay); // init exit intent trigger\n\n new ExitIntent(showBoxesWithExitIntentTrigger);\n scrollElement.addEventListener('touchstart', throttle(checkHeightCriteria), true);\n scrollElement.addEventListener('scroll', throttle(checkHeightCriteria), true);\n window.addEventListener('resize', throttle(recalculateHeights));\n window.addEventListener('load', recalculateHeights);\n overlay.addEventListener('click', onOverlayClick);\n window.setInterval(checkTimeCriteria, 1000);\n window.setTimeout(checkPageViewsCriteria, 1000);\n document.addEventListener('keyup', onKeyUp);\n timers.start();\n window.addEventListener('focus', timers.start);\n window.addEventListener('beforeunload', function () {\n timers.stop();\n sessionStorage.setItem('boxzilla_pageviews', ++pageViews);\n });\n window.addEventListener('blur', timers.stop);\n Boxzilla.trigger('ready');\n initialised = true; // ensure this function doesn't run again\n};\n/**\n * Create a new Box\n *\n * @param string id\n * @param object opts\n *\n * @returns Box\n */\n\n\nBoxzilla.create = function (id, opts) {\n // preserve backwards compat for minimumScreenWidth option\n if (typeof opts.minimumScreenWidth !== \"undefined\") {\n opts.screenWidthCondition = {\n condition: \"larger\",\n value: opts.minimumScreenWidth\n };\n }\n\n var box = new Box(id, opts);\n boxes.push(box);\n return box;\n};\n\nBoxzilla.get = function (id) {\n for (var i = 0; i < boxes.length; i++) {\n var box = boxes[i];\n\n if (box.id == id) {\n return box;\n }\n }\n\n throw new Error(\"No box exists with ID \" + id);\n}; // dismiss a single box (or all by omitting id param)\n\n\nBoxzilla.dismiss = function (id) {\n // if no id given, dismiss all current open boxes\n if (typeof id === \"undefined\") {\n boxes.forEach(function (box) {\n box.dismiss();\n });\n } else {\n Boxzilla.get(id).dismiss();\n }\n};\n\nBoxzilla.hide = function (id) {\n if (typeof id === \"undefined\") {\n boxes.forEach(function (box) {\n box.hide();\n });\n } else {\n Boxzilla.get(id).hide();\n }\n};\n\nBoxzilla.show = function (id) {\n if (typeof id === \"undefined\") {\n boxes.forEach(function (box) {\n box.show();\n });\n } else {\n Boxzilla.get(id).show();\n }\n};\n\nBoxzilla.toggle = function (id) {\n if (typeof id === \"undefined\") {\n boxes.forEach(function (box) {\n box.toggle();\n });\n } else {\n Boxzilla.get(id).toggle();\n }\n}; // expose each individual box.\n\n\nBoxzilla.boxes = boxes; // expose boxzilla object\n\nwindow.Boxzilla = Boxzilla;\n\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = Boxzilla;\n}\n\n},{\"./box.js\":3,\"./styles.js\":5,\"./timer.js\":6,\"./triggers/exit-intent.js\":7,\"wolfy87-eventemitter\":1}],5:[function(require,module,exports){\n\"use strict\";\n\nvar styles = \"#boxzilla-overlay{position:fixed;background:rgba(0,0,0,.65);width:100%;height:100%;left:0;top:0;z-index:99999}.boxzilla-center-container{position:fixed;top:0;left:0;right:0;height:0;text-align:center;z-index:999999;line-height:0}.boxzilla-center-container .boxzilla{display:inline-block;text-align:left;position:relative;line-height:normal}.boxzilla{position:fixed;z-index:999999;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;padding:25px}.boxzilla.boxzilla-top-left{top:0;left:0}.boxzilla.boxzilla-top-right{top:0;right:0}.boxzilla.boxzilla-bottom-left{bottom:0;left:0}.boxzilla.boxzilla-bottom-right{bottom:0;right:0}.boxzilla-content>:first-child{margin-top:0;padding-top:0}.boxzilla-content>:last-child{margin-bottom:0;padding-bottom:0}.boxzilla-close-icon{position:absolute;right:0;top:0;text-align:center;padding:6px;cursor:pointer;-webkit-appearance:none;font-size:28px;font-weight:700;line-height:20px;color:#000;opacity:.5}.boxzilla-close-icon:focus,.boxzilla-close-icon:hover{opacity:.8}\";\nmodule.exports = styles;\n\n},{}],6:[function(require,module,exports){\n'use strict';\n\nvar Timer = function Timer(start) {\n this.time = start;\n this.interval = 0;\n};\n\nTimer.prototype.tick = function () {\n this.time++;\n};\n\nTimer.prototype.start = function () {\n if (!this.interval) {\n this.interval = window.setInterval(this.tick.bind(this), 1000);\n }\n};\n\nTimer.prototype.stop = function () {\n if (this.interval) {\n window.clearInterval(this.interval);\n this.interval = 0;\n }\n};\n\nmodule.exports = Timer;\n\n},{}],7:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function (callback) {\n var timeout = null;\n var touchStart = {};\n\n function triggerCallback() {\n document.documentElement.removeEventListener('mouseleave', onMouseLeave);\n document.documentElement.removeEventListener('mouseenter', onMouseEnter);\n document.documentElement.removeEventListener('click', clearTimeout);\n window.removeEventListener('touchstart', onTouchStart);\n window.removeEventListener('touchend', onTouchEnd);\n callback();\n }\n\n function clearTimeout() {\n if (timeout === null) {\n return;\n }\n\n window.clearTimeout(timeout);\n timeout = null;\n }\n\n function onMouseEnter(evt) {\n clearTimeout();\n }\n\n function onMouseLeave(evt) {\n clearTimeout(); // did mouse leave at top of window?\n // add small exception space in the top-right corner\n\n if (evt.clientY <= 0 && evt.clientX < 0.80 * window.innerWidth) {\n timeout = window.setTimeout(triggerCallback, 400);\n }\n }\n\n function onTouchStart(evt) {\n clearTimeout();\n touchStart = {\n timestamp: performance.now(),\n scrollY: window.scrollY,\n windowHeight: window.innerHeight\n };\n }\n\n function onTouchEnd(evt) {\n clearTimeout(); // did address bar appear?\n\n if (window.innerHeight > touchStart.windowHeight) {\n return;\n } // allow a tiny tiny margin for error, to not fire on clicks\n\n\n if (window.scrollY + 20 >= touchStart.scrollY) {\n return;\n }\n\n if (performance.now() - touchStart.timestamp > 300) {\n return;\n }\n\n if (['A', 'INPUT', 'BUTTON'].indexOf(evt.target.tagName) > -1) {\n return;\n }\n\n timeout = window.setTimeout(triggerCallback, 800);\n }\n\n window.addEventListener('touchstart', onTouchStart);\n window.addEventListener('touchend', onTouchEnd);\n document.documentElement.addEventListener('mouseenter', onMouseEnter);\n document.documentElement.addEventListener('mouseleave', onMouseLeave);\n document.documentElement.addEventListener('click', clearTimeout);\n};\n\n},{}],8:[function(require,module,exports){\n\"use strict\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n(function () {\n 'use strict';\n\n var Boxzilla = require('boxzilla');\n\n var options = window.boxzilla_options; // expose Boxzilla object to window\n\n window.Boxzilla = Boxzilla; // helper function for setting CSS styles\n\n function css(element, styles) {\n if (styles.background_color) {\n element.style.background = styles.background_color;\n }\n\n if (styles.color) {\n element.style.color = styles.color;\n }\n\n if (styles.border_color) {\n element.style.borderColor = styles.border_color;\n }\n\n if (styles.border_width) {\n element.style.borderWidth = parseInt(styles.border_width) + \"px\";\n }\n\n if (styles.border_style) {\n element.style.borderStyle = styles.border_style;\n }\n\n if (styles.width) {\n element.style.maxWidth = parseInt(styles.width) + \"px\";\n }\n }\n\n function createBoxesFromConfig() {\n // failsafe against including script twice.\n if (options.inited) {\n return;\n } // create boxes from options\n\n\n for (var key in options.boxes) {\n // get opts\n var boxOpts = options.boxes[key];\n boxOpts.testMode = isLoggedIn && options.testMode; // find box content element, bail if not found\n\n var boxContentElement = document.getElementById('boxzilla-box-' + boxOpts.id + '-content');\n\n if (!boxContentElement) {\n continue;\n } // use element as content option\n\n\n boxOpts.content = boxContentElement; // create box\n\n var box = Boxzilla.create(boxOpts.id, boxOpts); // add box slug to box element as classname\n\n box.element.className = box.element.className + ' boxzilla-' + boxOpts.post.slug; // add custom css to box\n\n css(box.element, boxOpts.css);\n box.element.firstChild.firstChild.className += \" first-child\";\n box.element.firstChild.lastChild.className += \" last-child\"; // maybe show box right away\n\n if (box.fits() && locationHashRefersBox(box)) {\n box.show();\n }\n } // set flag to prevent initialising twice\n\n\n options.inited = true; // trigger \"done\" event.\n\n Boxzilla.trigger('done'); // maybe open box with MC4WP form in it\n\n maybeOpenMailChimpForWordPressBox();\n }\n\n function locationHashRefersBox(box) {\n if (!window.location.hash || 0 === window.location.hash.length) {\n return false;\n }\n\n var elementId = window.location.hash.substring(1); // only attempt on strings looking like an ID \n\n var regex = /^[a-zA-Z\\-\\_0-9]+$/;\n\n if (!regex.test(elementId)) {\n return false;\n }\n\n if (elementId === box.element.id) {\n return true;\n } else if (box.element.querySelector('#' + elementId)) {\n return true;\n }\n\n return false;\n }\n\n function maybeOpenMailChimpForWordPressBox() {\n if (_typeof(window.mc4wp_forms_config) !== \"object\" || !window.mc4wp_forms_config.submitted_form) {\n return;\n }\n\n var selector = '#' + window.mc4wp_forms_config.submitted_form.element_id;\n var boxes = Boxzilla.boxes;\n\n for (var boxId in boxes) {\n if (!boxes.hasOwnProperty(boxId)) {\n continue;\n }\n\n var box = boxes[boxId];\n\n if (box.element.querySelector(selector)) {\n box.show();\n return;\n }\n }\n } // print message when test mode is enabled\n\n\n var isLoggedIn = document.body.className.indexOf('logged-in') > -1;\n\n if (isLoggedIn && options.testMode) {\n console.log('Boxzilla: Test mode is enabled. Please disable test mode if you\\'re done testing.');\n } // init boxzilla\n\n\n Boxzilla.init(); // on window.load, create DOM elements for boxes\n\n window.addEventListener('load', createBoxesFromConfig);\n})();\n\n},{\"boxzilla\":4}]},{},[8]);\n; })();"]}
bootstrap.php CHANGED
@@ -45,7 +45,7 @@ add_action( 'plugins_loaded', function() use( $boxzilla ) {
45
  // license manager
46
  if( is_admin() || ( defined( 'DOING_CRON' ) && DOING_CRON ) || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
47
  $boxzilla['license_manager']->hook();
48
-
49
  if( count( $boxzilla->plugins ) > 0 ) {
50
  $boxzilla['update_manager']->hook();
51
  }
45
  // license manager
46
  if( is_admin() || ( defined( 'DOING_CRON' ) && DOING_CRON ) || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
47
  $boxzilla['license_manager']->hook();
48
+
49
  if( count( $boxzilla->plugins ) > 0 ) {
50
  $boxzilla['update_manager']->hook();
51
  }
boxzilla.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Plugin Name: Boxzilla
4
- Version: 3.2.9
5
  Plugin URI: https://boxzillaplugin.com/#utm_source=wp-plugin&utm_medium=boxzilla&utm_campaign=plugins-page
6
  Description: Call-To-Action Boxes that display after visitors scroll down far enough. Unobtrusive, but highly conversing!
7
  Author: ibericode
@@ -11,7 +11,7 @@ Domain Path: /languages/
11
  License: GPL v3
12
 
13
  Boxzilla Plugin
14
- Copyright (C) 2013-2018, Danny van Kooten, hi@dannyvankooten.com
15
 
16
  This program is free software: you can redistribute it and/or modify
17
  it under the terms of the GNU General Public License as published by
@@ -41,7 +41,7 @@ if ( ! defined( 'ABSPATH' ) ) {
41
  function _load_boxzilla() {
42
 
43
  define( 'BOXZILLA_FILE', __FILE__ );
44
- define( 'BOXZILLA_VERSION', '3.2.9' );
45
 
46
  require __DIR__ . '/bootstrap.php';
47
  }
1
  <?php
2
  /*
3
  Plugin Name: Boxzilla
4
+ Version: 3.2.10
5
  Plugin URI: https://boxzillaplugin.com/#utm_source=wp-plugin&utm_medium=boxzilla&utm_campaign=plugins-page
6
  Description: Call-To-Action Boxes that display after visitors scroll down far enough. Unobtrusive, but highly conversing!
7
  Author: ibericode
11
  License: GPL v3
12
 
13
  Boxzilla Plugin
14
+ Copyright (C) 2013-2019, Danny van Kooten, hi@dannyvankooten.com
15
 
16
  This program is free software: you can redistribute it and/or modify
17
  it under the terms of the GNU General Public License as published by
41
  function _load_boxzilla() {
42
 
43
  define( 'BOXZILLA_FILE', __FILE__ );
44
+ define( 'BOXZILLA_VERSION', '3.2.10' );
45
 
46
  require __DIR__ . '/bootstrap.php';
47
  }
languages/boxzilla.pot CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2018 boxzilla
2
  # This file is distributed under the same license as the boxzilla package.
3
  msgid ""
4
  msgstr ""
@@ -57,83 +57,87 @@ msgstr ""
57
  msgid "No Boxes found in Trash"
58
  msgstr ""
59
 
60
- #: src/admin/class-admin.php:104
 
 
 
 
61
  msgid "Awesome, you are using Boxzilla! You can now safely <a href=\"%s\">deactivate the Scroll Triggered Boxes plugin</a>."
62
  msgstr ""
63
 
64
- #: src/admin/class-admin.php:172
65
  msgid "Box ID"
66
  msgstr ""
67
 
68
- #: src/admin/class-admin.php:175
69
  msgid "Box Title"
70
  msgstr ""
71
 
72
- #: src/admin/class-admin.php:209, src/admin/class-admin.php:210, src/admin/views/settings.php:7
73
  msgid "Settings"
74
  msgstr ""
75
 
76
- #: src/admin/class-admin.php:215, src/admin/class-admin.php:216
77
  msgid "Extensions"
78
  msgstr ""
79
 
80
- #: src/admin/class-admin.php:308, src/admin/views/metaboxes/box-option-controls.php:60
81
  msgid "and"
82
  msgstr ""
83
 
84
- #: src/admin/class-admin.php:309, src/admin/views/metaboxes/box-option-controls.php:59
85
  msgid "or"
86
  msgstr ""
87
 
88
- #: src/admin/class-admin.php:310
89
  msgid "Enter a comma-separated list of values."
90
  msgstr ""
91
 
92
- #: src/admin/class-admin.php:311
93
  msgid "Enter a comma-separated list of post slugs or post ID's.."
94
  msgstr ""
95
 
96
- #: src/admin/class-admin.php:312
97
  msgid "Enter a comma-separated list of page slugs or page ID's.."
98
  msgstr ""
99
 
100
- #: src/admin/class-admin.php:313
101
  msgid "Enter a comma-separated list of post types.."
102
  msgstr ""
103
 
104
- #: src/admin/class-admin.php:314
105
  msgid "Enter a comma-separated list of relative URL's, eg /contact/"
106
  msgstr ""
107
 
108
- #: src/admin/class-admin.php:346
109
  msgid "Box Appearance"
110
  msgstr ""
111
 
112
- #: src/admin/class-admin.php:355
113
  msgid "Box Options"
114
  msgstr ""
115
 
116
- #: src/admin/class-admin.php:364
117
  msgid "Looking for help?"
118
  msgstr ""
119
 
120
- #: src/admin/class-admin.php:372
121
  msgid "Subscribe to our newsletter"
122
  msgstr ""
123
 
124
- #: src/admin/class-review-notice.php:74
125
  msgid "You've been using Boxzilla for some time now; we hope you love it!"
126
  msgstr ""
127
 
128
- #: src/admin/class-review-notice.php:75
129
  msgid "If you do, please <a href=\"%s\">leave us a 5★ rating on WordPress.org</a>. It would be of great help to us."
130
  msgstr ""
131
 
132
- #: src/admin/class-review-notice.php:77
133
  msgid "Dismiss this notice."
134
  msgstr ""
135
 
136
- #: src/licensing/class-api.php:165
137
  msgid "The Boxzilla server returned an invalid response."
138
  msgstr ""
139
 
@@ -157,11 +161,11 @@ msgstr ""
157
  msgid "If not, please click here: %s."
158
  msgstr ""
159
 
160
- #: src/admin/views/settings.php:20, src/admin/views/metaboxes/box-option-controls.php:213
161
  msgid "Enable test mode?"
162
  msgstr ""
163
 
164
- #: src/admin/views/settings.php:24, src/admin/views/metaboxes/box-option-controls.php:217
165
  msgid "If test mode is enabled, all boxes will show up regardless of whether a cookie has been set."
166
  msgstr ""
167
 
@@ -169,39 +173,39 @@ msgstr ""
169
  msgid "License & Plugin Updates"
170
  msgstr ""
171
 
172
- #: src/licensing/views/license-form.php:13
173
  msgid "Warning! You are <u>not</u> receiving plugin updates for the following plugin(s):"
174
  msgstr ""
175
 
176
- #: src/licensing/views/license-form.php:37
177
  msgid "License Key"
178
  msgstr ""
179
 
180
- #: src/licensing/views/license-form.php:39
181
  msgid "Enter your license key.."
182
  msgstr ""
183
 
184
- #: src/licensing/views/license-form.php:42
185
  msgid "The license key received when purchasing your premium Boxzilla plan. <a href=\"%s\">You can find it here</a>."
186
  msgstr ""
187
 
188
- #: src/licensing/views/license-form.php:47
189
  msgid "License Status"
190
  msgstr ""
191
 
192
- #: src/licensing/views/license-form.php:51
193
  msgid "ACTIVE"
194
  msgstr ""
195
 
196
- #: src/licensing/views/license-form.php:51
197
  msgid "you are receiving plugin updates"
198
  msgstr ""
199
 
200
- #: src/licensing/views/license-form.php:53
201
  msgid "INACTIVE"
202
  msgstr ""
203
 
204
- #: src/licensing/views/license-form.php:53
205
  msgid "you are <strong>not</strong> receiving plugin updates"
206
  msgstr ""
207
 
@@ -297,147 +301,147 @@ msgstr ""
297
  msgid "of the following conditions."
298
  msgstr ""
299
 
300
- #: src/admin/views/metaboxes/box-option-controls.php:71, src/admin/views/metaboxes/box-option-controls.php:237
301
  msgid "Remove rule"
302
  msgstr ""
303
 
304
- #: src/admin/views/metaboxes/box-option-controls.php:81, src/admin/views/metaboxes/box-option-controls.php:246
305
  msgid "is"
306
  msgstr ""
307
 
308
- #: src/admin/views/metaboxes/box-option-controls.php:82, src/admin/views/metaboxes/box-option-controls.php:247
309
  msgid "is not"
310
  msgstr ""
311
 
312
- #: src/admin/views/metaboxes/box-option-controls.php:83, src/admin/views/metaboxes/box-option-controls.php:248
313
  msgid "contains"
314
  msgstr ""
315
 
316
- #: src/admin/views/metaboxes/box-option-controls.php:84, src/admin/views/metaboxes/box-option-controls.php:249
317
  msgid "does not contain"
318
  msgstr ""
319
 
320
- #: src/admin/views/metaboxes/box-option-controls.php:87, src/admin/views/metaboxes/box-option-controls.php:252
321
  msgid "Leave empty for any or enter (comma-separated) names or ID's"
322
  msgstr ""
323
 
324
- #: src/admin/views/metaboxes/box-option-controls.php:95
325
  msgid "Add another rule"
326
  msgstr ""
327
 
328
- #: src/admin/views/metaboxes/box-option-controls.php:98
329
  msgid "Box Position"
330
  msgstr ""
331
 
332
- #: src/admin/views/metaboxes/box-option-controls.php:104
333
  msgid "Top Left"
334
  msgstr ""
335
 
336
- #: src/admin/views/metaboxes/box-option-controls.php:111
337
  msgid "Top Right"
338
  msgstr ""
339
 
340
- #: src/admin/views/metaboxes/box-option-controls.php:120
341
  msgid "Center"
342
  msgstr ""
343
 
344
- #: src/admin/views/metaboxes/box-option-controls.php:129
345
  msgid "Bottom Left"
346
  msgstr ""
347
 
348
- #: src/admin/views/metaboxes/box-option-controls.php:136
349
  msgid "Bottom Right"
350
  msgstr ""
351
 
352
- #: src/admin/views/metaboxes/box-option-controls.php:145
353
  msgid "Animation"
354
  msgstr ""
355
 
356
- #: src/admin/views/metaboxes/box-option-controls.php:147
357
  msgid "Fade In"
358
  msgstr ""
359
 
360
- #: src/admin/views/metaboxes/box-option-controls.php:148
361
  msgid "Slide In"
362
  msgstr ""
363
 
364
- #: src/admin/views/metaboxes/box-option-controls.php:149
365
  msgid "Which animation type should be used to show the box when triggered?"
366
  msgstr ""
367
 
368
- #: src/admin/views/metaboxes/box-option-controls.php:153
369
  msgid "Auto-show box?"
370
  msgstr ""
371
 
372
- #: src/admin/views/metaboxes/box-option-controls.php:155
373
  msgid "Never"
374
  msgstr ""
375
 
376
- #: src/admin/views/metaboxes/box-option-controls.php:156
377
  msgid "Yes, after %s seconds on the page."
378
  msgstr ""
379
 
380
- #: src/admin/views/metaboxes/box-option-controls.php:157
381
  msgid "Yes, when at %s of page height"
382
  msgstr ""
383
 
384
- #: src/admin/views/metaboxes/box-option-controls.php:158
385
  msgid "Yes, when at element %s"
386
  msgstr ""
387
 
388
- #: src/admin/views/metaboxes/box-option-controls.php:158
389
  msgid "Example: #comments"
390
  msgstr ""
391
 
392
- #: src/admin/views/metaboxes/box-option-controls.php:164
393
  msgid "Cookie expiration"
394
  msgstr ""
395
 
396
- #: src/admin/views/metaboxes/box-option-controls.php:169, src/admin/views/metaboxes/box-option-controls.php:174
397
  msgid "hours"
398
  msgstr ""
399
 
400
- #: src/admin/views/metaboxes/box-option-controls.php:178
401
  msgid "After this box is triggered or dismissed, how many hours should it stay hidden?"
402
  msgstr ""
403
 
404
- #: src/admin/views/metaboxes/box-option-controls.php:182
405
  msgid "Screen width"
406
  msgstr ""
407
 
408
- #: src/admin/views/metaboxes/box-option-controls.php:187
409
  msgid "larger"
410
  msgstr ""
411
 
412
- #: src/admin/views/metaboxes/box-option-controls.php:187
413
  msgid "smaller"
414
  msgstr ""
415
 
416
- #: src/admin/views/metaboxes/box-option-controls.php:188
417
  msgid "Only show on screens %s than %s."
418
  msgstr ""
419
 
420
- #: src/admin/views/metaboxes/box-option-controls.php:189
421
  msgid "Leave empty if you want to show the box on all screen sizes."
422
  msgstr ""
423
 
424
- #: src/admin/views/metaboxes/box-option-controls.php:194
425
  msgid "Auto-hide?"
426
  msgstr ""
427
 
428
- #: src/admin/views/metaboxes/box-option-controls.php:198
429
  msgid "Hide box again when visitors scroll back up?"
430
  msgstr ""
431
 
432
- #: src/admin/views/metaboxes/box-option-controls.php:202
433
  msgid "Show close icon?"
434
  msgstr ""
435
 
436
- #: src/admin/views/metaboxes/box-option-controls.php:207
437
  msgid "If you decide to hide the close icon, make sure to offer an alternative way to close the box."
438
  msgstr ""
439
 
440
- #: src/admin/views/metaboxes/box-option-controls.php:208
441
  msgid "Example: "
442
  msgstr ""
443
 
1
+ # Copyright (C) 2019 boxzilla
2
  # This file is distributed under the same license as the boxzilla package.
3
  msgid ""
4
  msgstr ""
57
  msgid "No Boxes found in Trash"
58
  msgstr ""
59
 
60
+ #: src/admin/class-admin.php:97
61
+ msgid "Duplicate box"
62
+ msgstr ""
63
+
64
+ #: src/admin/class-admin.php:136
65
  msgid "Awesome, you are using Boxzilla! You can now safely <a href=\"%s\">deactivate the Scroll Triggered Boxes plugin</a>."
66
  msgstr ""
67
 
68
+ #: src/admin/class-admin.php:208
69
  msgid "Box ID"
70
  msgstr ""
71
 
72
+ #: src/admin/class-admin.php:211
73
  msgid "Box Title"
74
  msgstr ""
75
 
76
+ #: src/admin/class-admin.php:246, src/admin/class-admin.php:247, src/admin/views/settings.php:7
77
  msgid "Settings"
78
  msgstr ""
79
 
80
+ #: src/admin/class-admin.php:252, src/admin/class-admin.php:253
81
  msgid "Extensions"
82
  msgstr ""
83
 
84
+ #: src/admin/class-admin.php:349, src/admin/views/metaboxes/box-option-controls.php:62
85
  msgid "and"
86
  msgstr ""
87
 
88
+ #: src/admin/class-admin.php:350, src/admin/views/metaboxes/box-option-controls.php:61
89
  msgid "or"
90
  msgstr ""
91
 
92
+ #: src/admin/class-admin.php:351
93
  msgid "Enter a comma-separated list of values."
94
  msgstr ""
95
 
96
+ #: src/admin/class-admin.php:352
97
  msgid "Enter a comma-separated list of post slugs or post ID's.."
98
  msgstr ""
99
 
100
+ #: src/admin/class-admin.php:353
101
  msgid "Enter a comma-separated list of page slugs or page ID's.."
102
  msgstr ""
103
 
104
+ #: src/admin/class-admin.php:354
105
  msgid "Enter a comma-separated list of post types.."
106
  msgstr ""
107
 
108
+ #: src/admin/class-admin.php:355
109
  msgid "Enter a comma-separated list of relative URL's, eg /contact/"
110
  msgstr ""
111
 
112
+ #: src/admin/class-admin.php:386
113
  msgid "Box Appearance"
114
  msgstr ""
115
 
116
+ #: src/admin/class-admin.php:395
117
  msgid "Box Options"
118
  msgstr ""
119
 
120
+ #: src/admin/class-admin.php:404
121
  msgid "Looking for help?"
122
  msgstr ""
123
 
124
+ #: src/admin/class-admin.php:412
125
  msgid "Subscribe to our newsletter"
126
  msgstr ""
127
 
128
+ #: src/admin/class-review-notice.php:79
129
  msgid "You've been using Boxzilla for some time now; we hope you love it!"
130
  msgstr ""
131
 
132
+ #: src/admin/class-review-notice.php:80
133
  msgid "If you do, please <a href=\"%s\">leave us a 5★ rating on WordPress.org</a>. It would be of great help to us."
134
  msgstr ""
135
 
136
+ #: src/admin/class-review-notice.php:82
137
  msgid "Dismiss this notice."
138
  msgstr ""
139
 
140
+ #: src/licensing/class-api.php:172
141
  msgid "The Boxzilla server returned an invalid response."
142
  msgstr ""
143
 
161
  msgid "If not, please click here: %s."
162
  msgstr ""
163
 
164
+ #: src/admin/views/settings.php:20, src/admin/views/metaboxes/box-option-controls.php:216
165
  msgid "Enable test mode?"
166
  msgstr ""
167
 
168
+ #: src/admin/views/settings.php:24, src/admin/views/metaboxes/box-option-controls.php:220
169
  msgid "If test mode is enabled, all boxes will show up regardless of whether a cookie has been set."
170
  msgstr ""
171
 
173
  msgid "License & Plugin Updates"
174
  msgstr ""
175
 
176
+ #: src/licensing/views/license-form.php:14
177
  msgid "Warning! You are <u>not</u> receiving plugin updates for the following plugin(s):"
178
  msgstr ""
179
 
180
+ #: src/licensing/views/license-form.php:40
181
  msgid "License Key"
182
  msgstr ""
183
 
184
+ #: src/licensing/views/license-form.php:42
185
  msgid "Enter your license key.."
186
  msgstr ""
187
 
188
+ #: src/licensing/views/license-form.php:47
189
  msgid "The license key received when purchasing your premium Boxzilla plan. <a href=\"%s\">You can find it here</a>."
190
  msgstr ""
191
 
192
+ #: src/licensing/views/license-form.php:52
193
  msgid "License Status"
194
  msgstr ""
195
 
196
+ #: src/licensing/views/license-form.php:57
197
  msgid "ACTIVE"
198
  msgstr ""
199
 
200
+ #: src/licensing/views/license-form.php:57
201
  msgid "you are receiving plugin updates"
202
  msgstr ""
203
 
204
+ #: src/licensing/views/license-form.php:61
205
  msgid "INACTIVE"
206
  msgstr ""
207
 
208
+ #: src/licensing/views/license-form.php:61
209
  msgid "you are <strong>not</strong> receiving plugin updates"
210
  msgstr ""
211
 
301
  msgid "of the following conditions."
302
  msgstr ""
303
 
304
+ #: src/admin/views/metaboxes/box-option-controls.php:72, src/admin/views/metaboxes/box-option-controls.php:240
305
  msgid "Remove rule"
306
  msgstr ""
307
 
308
+ #: src/admin/views/metaboxes/box-option-controls.php:82, src/admin/views/metaboxes/box-option-controls.php:249
309
  msgid "is"
310
  msgstr ""
311
 
312
+ #: src/admin/views/metaboxes/box-option-controls.php:83, src/admin/views/metaboxes/box-option-controls.php:250
313
  msgid "is not"
314
  msgstr ""
315
 
316
+ #: src/admin/views/metaboxes/box-option-controls.php:84, src/admin/views/metaboxes/box-option-controls.php:251
317
  msgid "contains"
318
  msgstr ""
319
 
320
+ #: src/admin/views/metaboxes/box-option-controls.php:85, src/admin/views/metaboxes/box-option-controls.php:252
321
  msgid "does not contain"
322
  msgstr ""
323
 
324
+ #: src/admin/views/metaboxes/box-option-controls.php:88, src/admin/views/metaboxes/box-option-controls.php:255
325
  msgid "Leave empty for any or enter (comma-separated) names or ID's"
326
  msgstr ""
327
 
328
+ #: src/admin/views/metaboxes/box-option-controls.php:98
329
  msgid "Add another rule"
330
  msgstr ""
331
 
332
+ #: src/admin/views/metaboxes/box-option-controls.php:101
333
  msgid "Box Position"
334
  msgstr ""
335
 
336
+ #: src/admin/views/metaboxes/box-option-controls.php:107
337
  msgid "Top Left"
338
  msgstr ""
339
 
340
+ #: src/admin/views/metaboxes/box-option-controls.php:114
341
  msgid "Top Right"
342
  msgstr ""
343
 
344
+ #: src/admin/views/metaboxes/box-option-controls.php:123
345
  msgid "Center"
346
  msgstr ""
347
 
348
+ #: src/admin/views/metaboxes/box-option-controls.php:132
349
  msgid "Bottom Left"
350
  msgstr ""
351
 
352
+ #: src/admin/views/metaboxes/box-option-controls.php:139
353
  msgid "Bottom Right"
354
  msgstr ""
355
 
356
+ #: src/admin/views/metaboxes/box-option-controls.php:148
357
  msgid "Animation"
358
  msgstr ""
359
 
360
+ #: src/admin/views/metaboxes/box-option-controls.php:150
361
  msgid "Fade In"
362
  msgstr ""
363
 
364
+ #: src/admin/views/metaboxes/box-option-controls.php:151
365
  msgid "Slide In"
366
  msgstr ""
367
 
368
+ #: src/admin/views/metaboxes/box-option-controls.php:152
369
  msgid "Which animation type should be used to show the box when triggered?"
370
  msgstr ""
371
 
372
+ #: src/admin/views/metaboxes/box-option-controls.php:156
373
  msgid "Auto-show box?"
374
  msgstr ""
375
 
376
+ #: src/admin/views/metaboxes/box-option-controls.php:158
377
  msgid "Never"
378
  msgstr ""
379
 
380
+ #: src/admin/views/metaboxes/box-option-controls.php:159
381
  msgid "Yes, after %s seconds on the page."
382
  msgstr ""
383
 
384
+ #: src/admin/views/metaboxes/box-option-controls.php:160
385
  msgid "Yes, when at %s of page height"
386
  msgstr ""
387
 
388
+ #: src/admin/views/metaboxes/box-option-controls.php:161
389
  msgid "Yes, when at element %s"
390
  msgstr ""
391
 
392
+ #: src/admin/views/metaboxes/box-option-controls.php:161
393
  msgid "Example: #comments"
394
  msgstr ""
395
 
396
+ #: src/admin/views/metaboxes/box-option-controls.php:167
397
  msgid "Cookie expiration"
398
  msgstr ""
399
 
400
+ #: src/admin/views/metaboxes/box-option-controls.php:172, src/admin/views/metaboxes/box-option-controls.php:177
401
  msgid "hours"
402
  msgstr ""
403
 
404
+ #: src/admin/views/metaboxes/box-option-controls.php:181
405
  msgid "After this box is triggered or dismissed, how many hours should it stay hidden?"
406
  msgstr ""
407
 
408
+ #: src/admin/views/metaboxes/box-option-controls.php:185
409
  msgid "Screen width"
410
  msgstr ""
411
 
412
+ #: src/admin/views/metaboxes/box-option-controls.php:190
413
  msgid "larger"
414
  msgstr ""
415
 
416
+ #: src/admin/views/metaboxes/box-option-controls.php:190
417
  msgid "smaller"
418
  msgstr ""
419
 
420
+ #: src/admin/views/metaboxes/box-option-controls.php:191
421
  msgid "Only show on screens %s than %s."
422
  msgstr ""
423
 
424
+ #: src/admin/views/metaboxes/box-option-controls.php:192
425
  msgid "Leave empty if you want to show the box on all screen sizes."
426
  msgstr ""
427
 
428
+ #: src/admin/views/metaboxes/box-option-controls.php:197
429
  msgid "Auto-hide?"
430
  msgstr ""
431
 
432
+ #: src/admin/views/metaboxes/box-option-controls.php:201
433
  msgid "Hide box again when visitors scroll back up?"
434
  msgstr ""
435
 
436
+ #: src/admin/views/metaboxes/box-option-controls.php:205
437
  msgid "Show close icon?"
438
  msgstr ""
439
 
440
+ #: src/admin/views/metaboxes/box-option-controls.php:210
441
  msgid "If you decide to hide the close icon, make sure to offer an alternative way to close the box."
442
  msgstr ""
443
 
444
+ #: src/admin/views/metaboxes/box-option-controls.php:211
445
  msgid "Example: "
446
  msgstr ""
447
 
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: Ibericode, DvanKooten, hchouhan, lapzor
3
  Donate link: https://boxzillaplugin.com/#utm_source=wp-plugin-repo&utm_medium=boxzilla&utm_campaign=donate-link
4
  Tags: scroll triggered box, cta, social, pop-up, newsletter, call to action, mailchimp, contact form 7, social media, mc4wp, ibericode
5
  Requires at least: 4.1
6
- Tested up to: 5.0.2
7
- Stable tag: 3.2.9
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
  Requires PHP: 5.3
@@ -130,6 +130,17 @@ Have a look at the [frequently asked questions](https://wordpress.org/plugins/bo
130
  == Changelog ==
131
 
132
 
 
 
 
 
 
 
 
 
 
 
 
133
  #### 3.2.9 - December 5, 2018
134
 
135
  **Improvements**
3
  Donate link: https://boxzillaplugin.com/#utm_source=wp-plugin-repo&utm_medium=boxzilla&utm_campaign=donate-link
4
  Tags: scroll triggered box, cta, social, pop-up, newsletter, call to action, mailchimp, contact form 7, social media, mc4wp, ibericode
5
  Requires at least: 4.1
6
+ Tested up to: 5.1
7
+ Stable tag: 3.2.10
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
  Requires PHP: 5.3
130
  == Changelog ==
131
 
132
 
133
+ #### 3.2.10 - February 15, 2019
134
+
135
+ **Improvements**
136
+
137
+ - Better [exit intent detection](https://boxzillaplugin.com/add-ons/exit-intent/) for mobile devices.
138
+
139
+ **Additions**
140
+
141
+ - New bulk action to quickly duplicate a box with all of its settings.
142
+
143
+
144
  #### 3.2.9 - December 5, 2018
145
 
146
  **Improvements**
src/admin/class-admin.php CHANGED
@@ -1,763 +1,812 @@
1
- <?php
2
-
3
- namespace Boxzilla\Admin;
4
-
5
- use Boxzilla\Plugin,
6
- Boxzilla\Box,
7
- Boxzilla\Boxzilla;
8
- use WP_Post;
9
- use WP_Screen;
10
-
11
- class Admin {
12
-
13
- /**
14
- * @var Plugin $plugin
15
- */
16
- private $plugin;
17
-
18
- /**
19
- * @var Boxzilla
20
- */
21
- protected $boxzilla;
22
-
23
- /**
24
- * @var ReviewNotice
25
- */
26
- protected $review_notice;
27
-
28
- /**
29
- * @param Plugin $plugin
30
- * @param Boxzilla $boxzilla
31
- */
32
- public function __construct( Plugin $plugin, Boxzilla $boxzilla ) {
33
- $this->plugin = $plugin;
34
- $this->boxzilla = $boxzilla;
35
- $this->review_notice = new ReviewNotice();
36
- }
37
-
38
- /**
39
- * Initialise the all admin related stuff
40
- */
41
- public function init() {
42
-
43
- // Load the plugin textdomain
44
- load_plugin_textdomain( 'boxzilla', null, basename( $this->plugin->dir() ) . '/languages' );
45
-
46
- // action hooks
47
- $this->add_hooks();
48
- $this->run_migrations();
49
- }
50
-
51
- /**
52
- * Add necessary hooks
53
- */
54
- protected function add_hooks() {
55
- add_action( 'admin_init', array( $this, 'lazy_add_hooks' ) );
56
- add_action( 'admin_init', array( $this, 'register' ) );
57
- add_action( 'init', array( $this, 'listen_for_actions' ) );
58
- add_action( 'admin_menu', array( $this, 'menu' ) );
59
- add_action( 'admin_notices', array( $this, 'notices' ) );
60
- add_action( 'save_post_boxzilla-box', array( $this, 'save_box_options' ), 20, 2 );
61
- add_action( 'trashed_post', array( $this, 'flush_rules' ) );
62
- add_action( 'untrashed_post', array( $this, 'flush_rules' ) );
63
-
64
- $this->review_notice->add_hooks();
65
- }
66
-
67
- /**
68
- * Listen for admin actions.
69
- */
70
- public function listen_for_actions() {
71
-
72
- // triggered?
73
- $vars = array_merge( $_POST, $_GET );
74
- if( empty( $vars['_boxzilla_admin_action'] ) ) {
75
- return false;
76
- }
77
-
78
- // authorized?
79
- if( ! current_user_can( 'edit_posts' ) ) {
80
- return false;
81
- }
82
-
83
- // fire action
84
- $action = $vars['_boxzilla_admin_action'];
85
- do_action( 'boxzilla_admin_' . $action );
86
-
87
- return true;
88
- }
89
-
90
- /**
91
- * All logic for admin notices lives here.
92
- */
93
- public function notices() {
94
- global $pagenow,
95
- $current_screen;
96
-
97
- if( ( $pagenow === 'plugins.php' || ( $current_screen && $current_screen->post_type === 'boxzilla-box' ) )
98
- && current_user_can( 'install_plugins' )
99
- && is_plugin_active( 'scroll-triggered-boxes/index.php' ) ) {
100
-
101
- $url = wp_nonce_url( 'plugins.php?action=deactivate&plugin=scroll-triggered-boxes/index.php', 'deactivate-plugin_' . 'scroll-triggered-boxes/index.php' );
102
- ?>
103
- <div class="notice notice-info">
104
- <p><?php printf( __( 'Awesome, you are using Boxzilla! You can now safely <a href="%s">deactivate the Scroll Triggered Boxes plugin</a>.', 'boxzilla' ), $url ); ?></p>
105
- </div>
106
- <?php
107
- }
108
-
109
- }
110
-
111
- /**
112
- * Checks current version against stored version & runs necessary update routines.
113
- *
114
- * @return bool
115
- */
116
- protected function run_migrations() {
117
-
118
- // Only run if db option is at older version than code constant
119
- $previous_version = get_option( 'boxzilla_version', '0' );
120
- $current_version = $this->plugin->version();
121
-
122
- if( version_compare( $current_version, $previous_version, '<=' ) ) {
123
- return false;
124
- }
125
-
126
- $upgrade_routines = new Migrations( $previous_version, $current_version, __DIR__ . '/migrations' );
127
- $upgrade_routines->run();
128
- update_option( 'boxzilla_version', $current_version );
129
- }
130
-
131
- public function lazy_add_hooks() {
132
- global $pagenow;
133
-
134
- add_action( 'admin_enqueue_scripts', array( $this, 'load_assets' ) );
135
- add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
136
- add_filter( 'tiny_mce_before_init', array( $this, 'tinymce_init' ) );
137
- add_filter( 'manage_edit-boxzilla-box_columns', array( $this, 'post_type_column_titles' ) );
138
- add_action( 'manage_boxzilla-box_posts_custom_column', array( $this, 'post_type_column_content' ), 10, 2 );
139
- add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ) );
140
-
141
- if ( $pagenow === 'plugins.php' ) {
142
- add_filter( 'plugin_action_links', array( $this, 'add_plugin_settings_link' ), 10, 2 );
143
- add_filter( 'plugin_row_meta', array( $this, 'add_plugin_meta_links' ), 10, 2 );
144
- }
145
- }
146
-
147
- /**
148
- * @param $post_id
149
- */
150
- public function post_type_column_box_id_content( $post_id ) {
151
- echo $post_id;
152
- }
153
-
154
- /**
155
- * @param $column
156
- * @param $post_id
157
- */
158
- public function post_type_column_content( $column, $post_id ) {
159
- $method_name = 'post_type_column_' . $column . '_content';
160
- if ( method_exists( $this, $method_name ) ) {
161
- call_user_func( array( $this, $method_name ), $post_id );
162
- }
163
- }
164
-
165
- /**
166
- * @param $columns
167
- *
168
- * @return mixed
169
- */
170
- public function post_type_column_titles( $columns ) {
171
- $columns = self::array_insert( $columns, array(
172
- 'box_id' => __( 'Box ID', 'boxzilla' )
173
- ), 1 );
174
-
175
- $columns['title'] = __( 'Box Title', 'boxzilla' );
176
-
177
- return $columns;
178
- }
179
-
180
- /**
181
- * Register stuffs
182
- */
183
- public function register() {
184
-
185
- // register settings
186
- register_setting( 'boxzilla_settings', 'boxzilla_settings', array( $this, 'sanitize_settings' ) );
187
-
188
- // register scripts
189
- $pre_suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
190
-
191
- wp_register_script( 'boxzilla-admin', $this->plugin->url( '/assets/js/admin-script' . $pre_suffix . '.js' ), array(
192
- 'jquery',
193
- 'wp-util',
194
- 'wp-color-picker',
195
- 'suggest'
196
- ), $this->plugin->version(), true );
197
-
198
- // load stylesheets
199
- wp_register_style( 'boxzilla-admin', $this->plugin->url( '/assets/css/admin-styles' . $pre_suffix . '.css' ), array(), $this->plugin->version() );
200
- }
201
-
202
- /**
203
- * Renders the STB Menu items
204
- */
205
- public function menu() {
206
-
207
- $menu_items = array(
208
- array(
209
- __( 'Settings', 'boxzilla' ),
210
- __( 'Settings', 'boxzilla' ),
211
- 'boxzilla-settings',
212
- array( $this, 'show_settings_page' )
213
- ),
214
- array(
215
- __( 'Extensions', 'boxzilla' ),
216
- '<span style="color: orange">' . __( 'Extensions', 'boxzilla' ) . '</span>',
217
- 'boxzilla-extensions',
218
- array( $this, 'show_extensions_page' )
219
- )
220
- );
221
-
222
- $menu_items = apply_filters( 'boxzilla_admin_menu_items', $menu_items );
223
-
224
- foreach ( $menu_items as $item ) {
225
- add_submenu_page( 'edit.php?post_type=boxzilla-box', $item[0] . '- Boxzilla', $item[1], 'manage_options', $item[2], $item[3] );
226
- }
227
- }
228
-
229
- /**
230
- * Shows the settings page
231
- */
232
- public function show_settings_page() {
233
- $opts = $this->boxzilla->options;
234
- require __DIR__ . '/views/settings.php';
235
- }
236
-
237
- /**
238
- * Shows the extensions page
239
- */
240
- public function show_extensions_page() {
241
- $extensions = $this->fetch_extensions();
242
- require __DIR__ . '/views/extensions.php';
243
- }
244
-
245
- /**
246
- * Are we currently editing a box?
247
- *
248
- * @return bool
249
- */
250
- protected function on_edit_box_page() {
251
- global $pagenow;
252
-
253
- if ( ! in_array( $pagenow, array( 'post-new.php', 'post.php' ) ) ) {
254
- return false;
255
- }
256
-
257
- if ( isset( $_GET['post_type'] ) && $_GET['post_type'] === 'boxzilla-box' ) {
258
- return true;
259
- }
260
-
261
- if ( get_post_type() === 'boxzilla-box' ) {
262
- return true;
263
- }
264
-
265
- return false;
266
- }
267
-
268
- /**
269
- * @param $args
270
- *
271
- * @return mixed
272
- */
273
- public function tinymce_init( $args ) {
274
-
275
- // only act on our post type
276
- if ( get_post_type() !== 'boxzilla-box' ) {
277
- return $args;
278
- }
279
-
280
- $args['setup'] = 'function( editor ) { if(typeof(window.Boxzilla_Admin) === \'undefined\') { return; } editor.on("PreInit", window.Boxzilla_Admin.Designer.init ); }';
281
-
282
- return $args;
283
- }
284
-
285
- /**
286
- * Load plugin assets
287
- */
288
- public function load_assets() {
289
-
290
- $screen = get_current_screen();
291
-
292
- if ( ! $screen instanceof WP_Screen ) {
293
- return false;
294
- }
295
-
296
- if ( $screen->base === 'edit' && $screen->post_type === 'boxzilla-box' ) {
297
- wp_enqueue_style( 'boxzilla-admin' );
298
- }
299
-
300
- if ( $screen->base === 'post' && $screen->post_type === 'boxzilla-box' ) {
301
- // color picker
302
- wp_enqueue_style( 'wp-color-picker' );
303
-
304
- // load scripts
305
- wp_enqueue_script( 'boxzilla-admin' );
306
-
307
- $data = array(
308
- 'and' => __( 'and', 'boxzilla' ),
309
- 'or' => __( 'or', 'boxzilla' ),
310
- 'enterCommaSeparatedValues' => __( 'Enter a comma-separated list of values.', 'boxzilla' ),
311
- 'enterCommaSeparatedPosts' => __( "Enter a comma-separated list of post slugs or post ID's..", 'boxzilla' ),
312
- 'enterCommaSeparatedPages' => __( "Enter a comma-separated list of page slugs or page ID's..", 'boxzilla' ),
313
- 'enterCommaSeparatedPostTypes' => __( "Enter a comma-separated list of post types..", 'boxzilla' ),
314
- 'enterCommaSeparatedRelativeUrls' => __( "Enter a comma-separated list of relative URL's, eg /contact/", 'boxzilla' ),
315
- );
316
- wp_localize_script( 'boxzilla-admin' ,'boxzilla_i18n', $data );
317
-
318
- // load stylesheets
319
- wp_enqueue_style( 'boxzilla-admin' );
320
-
321
- // allow add-ons to easily load their own scripts or stylesheets
322
- do_action( 'boxzilla_load_admin_assets' );
323
- }
324
-
325
- if ( isset( $_GET['page'] ) && $_GET['page'] === 'boxzilla-settings' ) {
326
- wp_enqueue_style( 'boxzilla-admin' );
327
- }
328
-
329
- }
330
-
331
- /**
332
- * Register meta boxes
333
- *
334
- * @param string $post_type
335
- *
336
- * @return bool
337
- */
338
- public function add_meta_boxes( $post_type ) {
339
-
340
- if ( $post_type !== 'boxzilla-box' ) {
341
- return false;
342
- }
343
-
344
- add_meta_box(
345
- 'boxzilla-box-appearance-controls',
346
- __( 'Box Appearance', 'boxzilla' ),
347
- array( $this, 'metabox_box_appearance_controls' ),
348
- 'boxzilla-box',
349
- 'normal',
350
- 'core'
351
- );
352
-
353
- add_meta_box(
354
- 'boxzilla-box-options-controls',
355
- __( 'Box Options', 'boxzilla' ),
356
- array( $this, 'metabox_box_option_controls' ),
357
- 'boxzilla-box',
358
- 'normal',
359
- 'core'
360
- );
361
-
362
- add_meta_box(
363
- 'boxzilla-support',
364
- __( 'Looking for help?', 'boxzilla' ),
365
- array( $this, 'metabox_support' ),
366
- 'boxzilla-box',
367
- 'side'
368
- );
369
-
370
- add_meta_box(
371
- 'boxzilla-email-optin',
372
- __( 'Subscribe to our newsletter', 'boxzilla' ),
373
- array( $this, 'metabox_email_optin' ),
374
- 'boxzilla-box',
375
- 'side'
376
- );
377
-
378
- return true;
379
- }
380
-
381
- /**
382
- * @param \WP_Post $post
383
- * @param $metabox
384
- */
385
- public function metabox_box_appearance_controls( \WP_Post $post, $metabox ) {
386
-
387
- // get box options
388
- $box = new Box( $post );
389
- $opts = $box->get_options();
390
-
391
- // include view
392
- include __DIR__ . '/views/metaboxes/box-appearance-controls.php';
393
- }
394
-
395
- /**
396
- * @param \WP_Post $post
397
- * @param $metabox
398
- */
399
- public function metabox_box_option_controls( \WP_Post $post, $metabox ) {
400
-
401
- // get box options
402
- $box = new Box( $post );
403
- $opts = $box->get_options();
404
- $global_opts = $this->boxzilla->options;
405
-
406
- if ( empty( $opts['rules'] ) ) {
407
- $opts['rules'][] = array( 'condition' => '', 'qualifier' => 1, 'value' => '' );
408
- }
409
-
410
- // include view
411
- include __DIR__ . '/views/metaboxes/box-option-controls.php';
412
- }
413
-
414
- /**
415
- * @param \WP_Post $post
416
- * @param $metabox
417
- */
418
- public function metabox_email_optin( \WP_Post $post, $metabox ) {
419
- include __DIR__ . '/views/metaboxes/email-optin.php';
420
- }
421
-
422
- /**
423
- * @param \WP_Post $post
424
- * @param $metabox
425
- */
426
- public function metabox_support( \WP_Post $post, $metabox ) {
427
- include __DIR__ . '/views/metaboxes/need-help.php';
428
- }
429
-