Matomo Analytics – Ethical Stats. Powerful Insights. - Version 1.0.3

Version Description

Download this release

Release Info

Developer matomoteam
Plugin Icon 128x128 Matomo Analytics – Ethical Stats. Powerful Insights.
Version 1.0.3
Comparing to
See all releases

Code changes from version 1.0.2 to 1.0.3

Files changed (41) hide show
  1. app/config/environment/dev.php +6 -6
  2. app/core/API/Request.php +6 -1
  3. app/core/Archive/ArchiveInvalidator.php +26 -3
  4. app/core/Cookie.php +3 -6
  5. app/core/Exception/InvalidRequestParameterException.php +5 -0
  6. app/core/Plugin/ViewDataTable.php +0 -2
  7. app/core/Plugin/Visualization.php +6 -3
  8. app/core/Session.php +14 -4
  9. app/core/Tracker/GoalManager.php +5 -1
  10. app/core/Tracker/IgnoreCookie.php +7 -1
  11. app/core/Tracker/Response.php +2 -1
  12. app/core/Version.php +1 -1
  13. app/js/piwik.min.js +1 -1
  14. app/libs/HTML/QuickForm2/Element/Date.php +1 -1
  15. app/libs/Zend/Session.php +2 -0
  16. app/libs/Zend/Validate/Isbn.php +3 -3
  17. app/libs/bower_components/jquery-mousewheel/ChangeLog.md +0 -147
  18. app/libs/bower_components/visibilityjs/ChangeLog.md +0 -78
  19. app/matomo.js +1 -1
  20. app/piwik.js +1 -1
  21. app/plugins/CoreVisualizations/Visualizations/HtmlTable.php +5 -3
  22. app/plugins/CustomPiwikJs/TrackingCode/PluginTrackerFiles.php +17 -31
  23. app/plugins/GeoIp2/GeoIP2AutoUpdater.php +36 -2
  24. app/plugins/GeoIp2/LocationProvider/GeoIp2/Php.php +26 -1
  25. app/plugins/Overlay/Controller.php +7 -0
  26. app/plugins/VisitFrequency/API.php +4 -1
  27. app/vendor/autoload.php +1 -1
  28. app/vendor/composer/autoload_classmap.php +3 -1
  29. app/vendor/composer/autoload_real.php +7 -7
  30. app/vendor/composer/autoload_static.php +9 -7
  31. assets/js/asset_manager_core_js.js +1 -1
  32. classes/WpMatomo/Admin/SystemReport.php +23 -0
  33. classes/WpMatomo/Admin/views/marketplace.php +4 -4
  34. classes/WpMatomo/Ecommerce/Base.php +1 -1
  35. classes/WpMatomo/Ecommerce/Woocommerce.php +18 -2
  36. classes/WpMatomo/Paths.php +2 -2
  37. config/common.config.ini.php +3 -0
  38. config/config.php +3 -4
  39. matomo.php +24 -8
  40. plugins/WordPress/WordPress.php +20 -0
  41. readme.txt +160 -154
app/config/environment/dev.php CHANGED
@@ -2,11 +2,11 @@
2
 
3
  return array(
4
 
5
- 'Piwik\Cache\Backend' => DI\object('Piwik\Cache\Backend\ArrayCache'),
6
 
7
- 'Piwik\Translation\Loader\LoaderInterface' => DI\object('Piwik\Translation\Loader\LoaderCache')
8
- ->constructor(DI\get('Piwik\Translation\Loader\DevelopmentLoader')),
9
- 'Piwik\Translation\Loader\DevelopmentLoader' => DI\object()
10
- ->constructor(DI\get('Piwik\Translation\Loader\JsonFileLoader')),
11
 
12
- );
2
 
3
  return array(
4
 
5
+ 'Piwik\Cache\Backend' => DI\object('Piwik\Cache\Backend\ArrayCache'),
6
 
7
+ 'Piwik\Translation\Loader\LoaderInterface' => DI\object('Piwik\Translation\Loader\LoaderCache')
8
+ ->constructor(DI\get('Piwik\Translation\Loader\DevelopmentLoader')),
9
+ 'Piwik\Translation\Loader\DevelopmentLoader' => DI\object()
10
+ ->constructor(DI\get('Piwik\Translation\Loader\JsonFileLoader')),
11
 
12
+ );
app/core/API/Request.php CHANGED
@@ -215,6 +215,8 @@ class Request
215
  */
216
  public function process()
217
  {
 
 
218
  try {
219
  ++self::$nestedApiInvocationCount;
220
 
@@ -233,7 +235,6 @@ class Request
233
  $corsHandler->handle();
234
 
235
  $tokenAuth = Common::getRequestVar('token_auth', '', 'string', $this->request);
236
- $shouldReloadAuth = false;
237
 
238
  // IP check is needed here as we cannot listen to API.Request.authenticate as it would then not return proper API format response.
239
  // We can also not do it by listening to API.Request.dispatch as by then the user is already authenticated and we want to make sure
@@ -276,6 +277,10 @@ class Request
276
  'ignoreInScreenWriter' => true,
277
  ]);
278
 
 
 
 
 
279
  $toReturn = $response->getResponseException($e);
280
  } finally {
281
  --self::$nestedApiInvocationCount;
215
  */
216
  public function process()
217
  {
218
+ $shouldReloadAuth = false;
219
+
220
  try {
221
  ++self::$nestedApiInvocationCount;
222
 
235
  $corsHandler->handle();
236
 
237
  $tokenAuth = Common::getRequestVar('token_auth', '', 'string', $this->request);
 
238
 
239
  // IP check is needed here as we cannot listen to API.Request.authenticate as it would then not return proper API format response.
240
  // We can also not do it by listening to API.Request.dispatch as by then the user is already authenticated and we want to make sure
277
  'ignoreInScreenWriter' => true,
278
  ]);
279
 
280
+ if (empty($response)) {
281
+ $response = new ResponseBuilder('console', $this->request);
282
+ }
283
+
284
  $toReturn = $response->getResponseException($e);
285
  } finally {
286
  --self::$nestedApiInvocationCount;
app/core/Archive/ArchiveInvalidator.php CHANGED
@@ -16,6 +16,7 @@ use Piwik\DataAccess\ArchiveTableCreator;
16
  use Piwik\DataAccess\Model;
17
  use Piwik\Date;
18
  use Piwik\CliMulti\Process;
 
19
  use Piwik\Option;
20
  use Piwik\Common;
21
  use Piwik\Piwik;
@@ -125,7 +126,6 @@ class ArchiveInvalidator
125
 
126
  $generalCache = Cache::getCacheGeneral();
127
  if (empty($generalCache[$cacheKey][$idSite][$dateStr])) {
128
- Cache::clearCacheGeneral();
129
  return [];
130
  }
131
 
@@ -178,12 +178,14 @@ class ArchiveInvalidator
178
  public function forgetRememberedArchivedReportsToInvalidateForSite($idSite)
179
  {
180
  $id = $this->buildRememberArchivedReportIdForSite($idSite) . '_%';
181
- Option::deleteLike($id);
182
  Cache::clearCacheGeneral();
183
  }
184
 
185
  /**
186
  * @internal
 
 
187
  */
188
  public function forgetRememberedArchivedReportsToInvalidate($idSite, Date $date)
189
  {
@@ -191,10 +193,28 @@ class ArchiveInvalidator
191
 
192
  // The process pid is added to the end of the entry in order to support multiple concurrent transactions.
193
  // So this must be a deleteLike call to get all the entries, where there used to only be one.
194
- Option::deleteLike($id . '%');
195
  Cache::clearCacheGeneral();
196
  }
197
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  /**
199
  * @param $idSites int[]
200
  * @param $dates Date[]
@@ -268,6 +288,7 @@ class ArchiveInvalidator
268
  $this->forgetRememberedArchivedReportsToInvalidate($idSite, $date);
269
  }
270
  }
 
271
 
272
  return $invalidationInfo;
273
  }
@@ -310,6 +331,8 @@ class ArchiveInvalidator
310
  }
311
  }
312
 
 
 
313
  $archivesToPurge = new ArchivesToPurgeDistributedList();
314
  $archivesToPurge->add($invalidatedMonths);
315
 
16
  use Piwik\DataAccess\Model;
17
  use Piwik\Date;
18
  use Piwik\CliMulti\Process;
19
+ use Piwik\Db;
20
  use Piwik\Option;
21
  use Piwik\Common;
22
  use Piwik\Piwik;
126
 
127
  $generalCache = Cache::getCacheGeneral();
128
  if (empty($generalCache[$cacheKey][$idSite][$dateStr])) {
 
129
  return [];
130
  }
131
 
178
  public function forgetRememberedArchivedReportsToInvalidateForSite($idSite)
179
  {
180
  $id = $this->buildRememberArchivedReportIdForSite($idSite) . '_%';
181
+ $this->deleteOptionLike($id);
182
  Cache::clearCacheGeneral();
183
  }
184
 
185
  /**
186
  * @internal
187
+ * After calling this method, make sure to call Cache::clearCacheGeneral(); For performance reasons we don't call
188
+ * this here immediately in case there are multiple invalidations.
189
  */
190
  public function forgetRememberedArchivedReportsToInvalidate($idSite, Date $date)
191
  {
193
 
194
  // The process pid is added to the end of the entry in order to support multiple concurrent transactions.
195
  // So this must be a deleteLike call to get all the entries, where there used to only be one.
196
+ $this->deleteOptionLike($id);
197
  Cache::clearCacheGeneral();
198
  }
199
 
200
+ private function deleteOptionLike($id)
201
+ {
202
+ // we're not using deleteLike since it maybe could cause deadlocks see https://github.com/matomo-org/matomo/issues/15545
203
+ // we want to reduce number of rows scanned and only delete specific primary key
204
+ $keys = Option::getLike($id . '%');
205
+
206
+ if (empty($keys)) {
207
+ return;
208
+ }
209
+
210
+ $keys = array_keys($keys);
211
+
212
+ $placeholders = Common::getSqlStringFieldsArray($keys);
213
+
214
+ $table = Common::prefixTable('option');
215
+ Db::query('DELETE FROM `' . $table . '` WHERE `option_name` IN (' . $placeholders . ')', $keys);
216
+ }
217
+
218
  /**
219
  * @param $idSites int[]
220
  * @param $dates Date[]
288
  $this->forgetRememberedArchivedReportsToInvalidate($idSite, $date);
289
  }
290
  }
291
+ Cache::clearCacheGeneral();
292
 
293
  return $invalidationInfo;
294
  }
331
  }
332
  }
333
 
334
+ Cache::clearCacheGeneral();
335
+
336
  $archivesToPurge = new ArchivesToPurgeDistributedList();
337
  $archivesToPurge->add($invalidatedMonths);
338
 
app/core/Cookie.php CHANGED
@@ -445,14 +445,11 @@ class Cookie
445
  $ddFactory = StaticContainer::get(\Piwik\DeviceDetector\DeviceDetectorFactory::class);
446
  $deviceDetector = $ddFactory->makeInstance($userAgent);
447
  $deviceDetector->parse();
448
- $browser = $deviceDetector->getClient();
449
- if (is_array($browser)) {
450
- $browser = $browser['name'];
451
- }
452
 
453
- if ((!ProxyHttp::isHttps()) && $browser === 'Chrome') {
 
454
  $sameSite = 'Lax';
455
- } else if ($browser === 'Safari') {
456
  $sameSite = '';
457
  }
458
  }
445
  $ddFactory = StaticContainer::get(\Piwik\DeviceDetector\DeviceDetectorFactory::class);
446
  $deviceDetector = $ddFactory->makeInstance($userAgent);
447
  $deviceDetector->parse();
 
 
 
 
448
 
449
+ $browserFamily = \DeviceDetector\Parser\Client\Browser::getBrowserFamily($deviceDetector->getClient('short_name'));
450
+ if ((!ProxyHttp::isHttps()) && $browserFamily === 'Chrome') {
451
  $sameSite = 'Lax';
452
+ } else if ($browserFamily === 'Safari') {
453
  $sameSite = '';
454
  }
455
  }
app/core/Exception/InvalidRequestParameterException.php CHANGED
@@ -10,4 +10,9 @@ namespace Piwik\Exception;
10
 
11
  class InvalidRequestParameterException extends Exception
12
  {
 
 
 
 
 
13
  }
10
 
11
  class InvalidRequestParameterException extends Exception
12
  {
13
+
14
+ public function __toString()
15
+ {
16
+ return $this->getMessage() . ' ' . $this->getFile() . ':' . $this->getLine();
17
+ }
18
  }
app/core/Plugin/ViewDataTable.php CHANGED
@@ -15,8 +15,6 @@ use Piwik\DataTable;
15
  use Piwik\Period;
16
  use Piwik\Piwik;
17
  use Piwik\Plugins\API\Filter\DataComparisonFilter;
18
- use Piwik\Plugins\CoreVisualizations\Visualizations\Sparkline;
19
- use Piwik\View;
20
  use Piwik\View\ViewInterface;
21
  use Piwik\ViewDataTable\Config as VizConfig;
22
  use Piwik\ViewDataTable\Manager as ViewDataTableManager;
15
  use Piwik\Period;
16
  use Piwik\Piwik;
17
  use Piwik\Plugins\API\Filter\DataComparisonFilter;
 
 
18
  use Piwik\View\ViewInterface;
19
  use Piwik\ViewDataTable\Config as VizConfig;
20
  use Piwik\ViewDataTable\Manager as ViewDataTableManager;
app/core/Plugin/Visualization.php CHANGED
@@ -332,9 +332,12 @@ class Visualization extends ViewDataTable
332
 
333
  PluginManager::getInstance()->checkIsPluginActivated($module);
334
 
335
- $proxyRequestParams = array_merge($request, [
336
- 'disable_root_datatable_post_processor' => 1,
337
- ]);
 
 
 
338
 
339
  $class = ApiRequest::getClassNameAPI($module);
340
  $dataTable = Proxy::getInstance()->call($class, $method, $proxyRequestParams);
332
 
333
  PluginManager::getInstance()->checkIsPluginActivated($module);
334
 
335
+ $proxyRequestParams = $request;
336
+ if ($this->isComparing()) {
337
+ $proxyRequestParams = array_merge($proxyRequestParams, [
338
+ 'disable_root_datatable_post_processor' => 1,
339
+ ]);
340
+ }
341
 
342
  $class = ApiRequest::getClassNameAPI($module);
343
  $dataTable = Proxy::getInstance()->call($class, $method, $proxyRequestParams);
app/core/Session.php CHANGED
@@ -190,7 +190,15 @@ class Session extends Zend_Session
190
  {
191
  $config = Config::getInstance();
192
  $general = $config->General;
193
- if (!empty($general['enable_framed_pages']) && ProxyHttp::isHttps()) {
 
 
 
 
 
 
 
 
194
  return 'None';
195
  }
196
 
@@ -214,10 +222,10 @@ class Session extends Zend_Session
214
  {
215
  $headerStr = 'Set-Cookie: ' . rawurlencode($name) . '=' . rawurlencode($value);
216
  if ($expires) {
217
- $headerStr .= '; expires=' . rawurlencode($expires);
218
  }
219
  if ($path) {
220
- $headerStr .= '; path=' . rawurlencode($path);
221
  }
222
  if ($domain) {
223
  $headerStr .= '; domain=' . rawurlencode($domain);
@@ -229,8 +237,10 @@ class Session extends Zend_Session
229
  $headerStr .= '; httponly';
230
  }
231
  if ($sameSite) {
232
- $headerStr .= '; SameSite=' . rawurlencode($sameSite);
233
  }
 
 
234
  return $headerStr;
235
  }
236
  }
190
  {
191
  $config = Config::getInstance();
192
  $general = $config->General;
193
+
194
+ $module = Piwik::getModule();
195
+ $action = Piwik::getAction();
196
+
197
+ $isOptOutRequest = $module == 'CoreAdminHome' && $action == 'optOut';
198
+ $isOverlay = $module == 'Overlay';
199
+ $shouldUseNone = !empty($general['enable_framed_pages']) || $isOptOutRequest || $isOverlay;
200
+
201
+ if ($shouldUseNone && ProxyHttp::isHttps()) {
202
  return 'None';
203
  }
204
 
222
  {
223
  $headerStr = 'Set-Cookie: ' . rawurlencode($name) . '=' . rawurlencode($value);
224
  if ($expires) {
225
+ $headerStr .= '; expires=' . $expires;
226
  }
227
  if ($path) {
228
+ $headerStr .= '; path=' . $path;
229
  }
230
  if ($domain) {
231
  $headerStr .= '; domain=' . rawurlencode($domain);
237
  $headerStr .= '; httponly';
238
  }
239
  if ($sameSite) {
240
+ $headerStr .= '; SameSite=' . $sameSite;
241
  }
242
+
243
+ Common::sendHeader($headerStr);
244
  return $headerStr;
245
  }
246
  }
app/core/Tracker/GoalManager.php CHANGED
@@ -877,10 +877,14 @@ class GoalManager
877
 
878
  private function getGoalFromVisitor(VisitProperties $visitProperties, Request $request, $action)
879
  {
 
 
 
 
880
  $goal = array(
881
  'idvisit' => $visitProperties->getProperty('idvisit'),
882
  'idvisitor' => $visitProperties->getProperty('idvisitor'),
883
- 'server_time' => Date::getDatetimeFromTimestamp($visitProperties->getProperty('visit_last_action_time')),
884
  );
885
 
886
  $visitDimensions = VisitDimension::getAllDimensions();
877
 
878
  private function getGoalFromVisitor(VisitProperties $visitProperties, Request $request, $action)
879
  {
880
+ $lastVisitTime = $visitProperties->getProperty('visit_last_action_time');
881
+ if (!$lastVisitTime) {
882
+ $lastVisitTime = $request->getCurrentTimestamp();
883
+ }
884
  $goal = array(
885
  'idvisit' => $visitProperties->getProperty('idvisit'),
886
  'idvisitor' => $visitProperties->getProperty('idvisitor'),
887
+ 'server_time' => Date::getDatetimeFromTimestamp($lastVisitTime),
888
  );
889
 
890
  $visitDimensions = VisitDimension::getAllDimensions();
app/core/Tracker/IgnoreCookie.php CHANGED
@@ -10,6 +10,7 @@ namespace Piwik\Tracker;
10
 
11
  use Piwik\Config;
12
  use Piwik\Cookie;
 
13
 
14
  /**
15
  * Tracking cookies.
@@ -61,7 +62,12 @@ class IgnoreCookie
61
  $ignoreCookie->delete();
62
  } else {
63
  $ignoreCookie->set('ignore', '*');
64
- $ignoreCookie->save('None');
 
 
 
 
 
65
  }
66
 
67
  self::deleteThirdPartyCookieUIDIfExists();
10
 
11
  use Piwik\Config;
12
  use Piwik\Cookie;
13
+ use Piwik\ProxyHttp;
14
 
15
  /**
16
  * Tracking cookies.
62
  $ignoreCookie->delete();
63
  } else {
64
  $ignoreCookie->set('ignore', '*');
65
+ if (ProxyHttp::isHttps()) {
66
+ $ignoreCookie->setSecure(true);
67
+ $ignoreCookie->save('None');
68
+ } else {
69
+ $ignoreCookie->save('Lax');
70
+ }
71
  }
72
 
73
  self::deleteThirdPartyCookieUIDIfExists();
app/core/Tracker/Response.php CHANGED
@@ -89,7 +89,8 @@ class Response
89
 
90
  if ($tracker->isDebugModeEnabled()
91
  && $tracker->isDatabaseConnected()
92
- && TrackerDb::isProfilingEnabled()) {
 
93
  $db = Tracker::getDatabase();
94
  $db->recordProfiling();
95
  Profiler::displayDbTrackerProfile($db);
89
 
90
  if ($tracker->isDebugModeEnabled()
91
  && $tracker->isDatabaseConnected()
92
+ && TrackerDb::isProfilingEnabled()
93
+ ) {
94
  $db = Tracker::getDatabase();
95
  $db->recordProfiling();
96
  Profiler::displayDbTrackerProfile($db);
app/core/Version.php CHANGED
@@ -20,7 +20,7 @@ final class Version
20
  * The current Matomo version.
21
  * @var string
22
  */
23
- const VERSION = '3.13.2';
24
 
25
  public function isStableVersion($version)
26
  {
20
  * The current Matomo version.
21
  * @var string
22
  */
23
+ const VERSION = '3.13.3';
24
 
25
  public function isStableVersion($version)
26
  {
app/js/piwik.min.js CHANGED
@@ -39,7 +39,7 @@ if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.in
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
  if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
42
- try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
43
  if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
44
  var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
45
  dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
  if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
42
+ try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")+";SameSite=Lax"}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
43
  if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
44
  var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
45
  dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
app/libs/HTML/QuickForm2/Element/Date.php CHANGED
@@ -128,7 +128,7 @@ class HTML_QuickForm2_Element_Date extends HTML_QuickForm2_Container_Group
128
  $separator = '';
129
 
130
  for ($i = 0, $length = strlen($this->data['format']); $i < $length; $i++) {
131
- $sign = $this->data['format']{$i};
132
  if ($backslash) {
133
  $backslash = false;
134
  $separator .= $sign;
128
  $separator = '';
129
 
130
  for ($i = 0, $length = strlen($this->data['format']); $i < $length; $i++) {
131
+ $sign = $this->data['format'][$i];
132
  if ($backslash) {
133
  $backslash = false;
134
  $separator .= $sign;
app/libs/Zend/Session.php CHANGED
@@ -523,6 +523,8 @@ class Zend_Session extends Zend_Session_Abstract
523
  self::$_sessionStarted = true;
524
  if (self::$_regenerateIdState === -1) {
525
  self::regenerateId();
 
 
526
  }
527
 
528
  if (isset($_SESSION['data']) && is_string($_SESSION['data'])) {
523
  self::$_sessionStarted = true;
524
  if (self::$_regenerateIdState === -1) {
525
  self::regenerateId();
526
+ } else {
527
+ self::rewriteSessionCookieWithSameSiteDirective();
528
  }
529
 
530
  if (isset($_SESSION['data']) && is_string($_SESSION['data'])) {
app/libs/Zend/Validate/Isbn.php CHANGED
@@ -168,7 +168,7 @@ class Zend_Validate_Isbn extends Zend_Validate_Abstract
168
  $isbn10 = str_replace($this->_separator, '', $value);
169
  $sum = 0;
170
  for ($i = 0; $i < 9; $i++) {
171
- $sum += (10 - $i) * $isbn10{$i};
172
  }
173
 
174
  // checksum
@@ -186,9 +186,9 @@ class Zend_Validate_Isbn extends Zend_Validate_Abstract
186
  $sum = 0;
187
  for ($i = 0; $i < 12; $i++) {
188
  if ($i % 2 == 0) {
189
- $sum += $isbn13{$i};
190
  } else {
191
- $sum += 3 * $isbn13{$i};
192
  }
193
  }
194
  // checksum
168
  $isbn10 = str_replace($this->_separator, '', $value);
169
  $sum = 0;
170
  for ($i = 0; $i < 9; $i++) {
171
+ $sum += (10 - $i) * $isbn10[$i];
172
  }
173
 
174
  // checksum
186
  $sum = 0;
187
  for ($i = 0; $i < 12; $i++) {
188
  if ($i % 2 == 0) {
189
+ $sum += $isbn13[$i];
190
  } else {
191
+ $sum += 3 * $isbn13[$i];
192
  }
193
  }
194
  // checksum
app/libs/bower_components/jquery-mousewheel/ChangeLog.md DELETED
@@ -1,147 +0,0 @@
1
- # Mouse Wheel ChangeLog
2
-
3
- ## 3.1.13
4
-
5
- * Update copyright notice and license to remove years
6
- * Create the correct compressed version
7
- * Remove the obsolete jQuery Plugin Registry file
8
-
9
- ## 3.1.12
10
-
11
- * Fix possible 0 value for line height when in delta mode 1
12
-
13
- ## 3.1.11
14
-
15
- * Fix version number for package managers...
16
-
17
- ## 3.1.10
18
-
19
- * Fix issue with calculating line height when using older versions of jQuery
20
- * Add offsetX/Y normalization with setting to turn it off
21
- * Cleans up data on teardown
22
-
23
- ## 3.1.9
24
-
25
- * Fix bower.json file
26
- * Updated how the deltas are adjusted for older mousewheel based events that have deltas that are factors of 120.
27
- * Add $.event.special.mousewheel.settings.adjustOldDeltas (defaults to true) to turn off adjusting of old deltas that are factors of 120. You'd turn this off if you want to be as close to native scrolling as possible.
28
-
29
- ## 3.1.8
30
-
31
- * Even better handling of older browsers that use a wheelDelta based on 120
32
- * And fix version reported by `$.event.special.mousewheel`
33
-
34
- ## 3.1.7
35
-
36
- * Better handle the `deltaMode` values 1 (lines) and 2 (pages)
37
- * Attempt to better handle older browsers that use a wheelDelta based on 120
38
-
39
- ## 3.1.6
40
-
41
- * Deprecating `delta`, `deltaX`, and `deltaY` event handler arguments
42
- * Update actual event object with normalized `deltaX `and `deltaY` values (`event.deltaX`, `event.deltaY`)
43
- * Add `deltaFactor` to the event object (`event.deltaFactor`)
44
- * Handle `> 0` but `< 1` deltas better
45
- * Do not fire the event if `deltaX` and `deltaY` are `0`
46
- * Better handle different devices that give different `lowestDelta` values
47
- * Add `$.event.special.mousewheel.version`
48
- * Some clean up
49
-
50
- ## 3.1.5
51
-
52
- * Bad release because I did not update the new `$.event.special.mousewheel.version`
53
-
54
- ## 3.1.4
55
-
56
- * Always set the `deltaY`
57
- * Add back in the `deltaX` and `deltaY` support for older Firefox versions
58
-
59
- ## 3.1.3
60
-
61
- * Include `MozMousePixelScroll` in the to fix list to avoid inconsistent behavior in older Firefox
62
-
63
- ## 3.1.2
64
-
65
- * Include grunt utilities for development purposes (jshint and uglify)
66
- * Include support for browserify
67
- * Some basic cleaning up
68
-
69
- ## 3.1.1
70
-
71
- * Fix rounding issue with deltas less than zero
72
-
73
-
74
- ## 3.1.0
75
-
76
- * Fix Firefox 17+ issues by using new wheel event
77
- * Normalize delta values
78
- * Adds horizontal support for IE 9+ by using new wheel event
79
- * Support AMD loaders
80
-
81
-
82
- ## 3.0.6
83
-
84
- * Fix issue with delta being 0 in Firefox
85
-
86
-
87
- ## 3.0.5
88
-
89
- * jQuery 1.7 compatibility
90
-
91
-
92
- ## 3.0.4
93
-
94
- * Fix IE issue
95
-
96
-
97
- ## 3.0.3
98
-
99
- * Added `deltaX` and `deltaY` for horizontal scrolling support (Thanks to Seamus Leahy)
100
-
101
-
102
- ## 3.0.2
103
-
104
- * Fixed delta being opposite value in latest Opera
105
- * No longer fix `pageX`, `pageY` for older Mozilla browsers
106
- * Removed browser detection
107
- * Cleaned up the code
108
-
109
-
110
- ## 3.0.1
111
-
112
- * Bad release... creating a new release due to plugins.jquery.com issue :(
113
-
114
-
115
- ## 3.0
116
-
117
- * Uses new special events API in jQuery 1.2.2+
118
- * You can now treat `mousewheel` as a normal event and use `.bind`, `.unbind` and `.trigger`
119
- * Using jQuery.data API for expandos
120
-
121
-
122
- ## 2.2
123
-
124
- * Fixed `pageX`, `pageY`, `clientX` and `clientY` event properties for Mozilla based browsers
125
-
126
-
127
- ## 2.1.1
128
-
129
- * Updated to work with jQuery 1.1.3
130
- * Used one instead of bind to do unload event for clean up
131
-
132
-
133
- ## 2.1
134
-
135
- * Fixed an issue with the unload handler
136
-
137
-
138
- ## 2.0
139
-
140
- * Major reduction in code size and complexity (internals have change a whole lot)
141
-
142
-
143
- ## 1.0
144
-
145
- * Fixed Opera issue
146
- * Fixed an issue with children elements that also have a mousewheel handler
147
- * Added ability to handle multiple handlers
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/libs/bower_components/visibilityjs/ChangeLog.md DELETED
@@ -1,78 +0,0 @@
1
- ### 1.2.3 “Vanguard 3, 300 years”
2
- * Fix Rails support by @dimko.
3
-
4
- ### 1.2.2 “Luna 2, impact”
5
- * Fix Sprockets 3 support by Waseem Sadiq.
6
- * Add Component support by Mitchel Kelonye.
7
-
8
- ### 1.2.1 “Discoverer 6, again”
9
- * Fix Bower config by Misha Ponizil.
10
-
11
- ### 1.2.0 “Discoverer 5, spy”
12
- * Allow to use in CommonJS.
13
- * Release npm package.
14
- * Reduce library size to 10 %.
15
- * Allow to use latest version from master in Ruby Bundler.
16
- * Method `hidden()` now always return boolean.
17
- * Change repository URL to `github.com/ai/visibilityjs`.
18
-
19
- ## 1.1.0 “Explorer 6, photo”
20
- * Prevent to run timer often, that it’s interval, when visibility was changed.
21
- * Allow to install by Bower package manager.
22
- * Change license to MIT.
23
- * Reduce library size.
24
-
25
- ## 1.0.0 “Discoverer 2, stable”
26
- * Remove jQuery.Chrono integration.
27
- * Remove outdated Firefox prefix.
28
-
29
- ## 0.6.2 “Pioneer 4, American Sun”
30
- * Decrease files size (by compressible code and UnglifyJS 2).
31
- * Remove unnecessary vendor prefixes from fallback.
32
-
33
- ## 0.6.1 “Vanguard 2, weather”
34
- * Remove unnecessary vendor prefixes.
35
-
36
- ## 0.6 “Luna 1, Mechta”
37
- * Methods onVisible and afterPrerendering return listener ID (by mcfedr).
38
- * Fix documentation (by Erwänn Mest).
39
-
40
- ## 0.5 “SCORE, communication”
41
- * Split library to core and timers modules.
42
- * Allow to unbind change listener.
43
- * Use common logic in change(), afterPrerendering() and onVisible().
44
-
45
- ## 0.4.5 “Pioneer 3, closer”
46
- * Fix gem assets directory.
47
- * Update development dependencies.
48
-
49
- ## 0.4.4 “Pioneer 1, deeper into space”
50
- * Remove non-ASCII symbols from gemspec.
51
- * Print testing URL in test task.
52
-
53
- ## 0.4.3 “Explorer 4, short”
54
- * Fix gemspec issue with Bundler.
55
-
56
- ## 0.4.2 “Sputnik 3, real”
57
- * Reorder code to show first public and common methods.
58
- * Use node.js Cake instead of Ruby’s Rake to build tasks.
59
- * Move to Mocha, Chai and Sinon.JS for tests.
60
- * Move autogenerated minified to GitHub downloads.
61
-
62
- ## 0.4.1 “Explorer 3, repeat”
63
- * Fix documentation and gemspec.
64
-
65
- ## 0.4 “Vanguard 1, alternative”
66
- * Add fallback API support by focus/blur hack to all browsers.
67
-
68
- ## 0.3 “Explorer 1, answer”
69
- * Rename gem to visibilityjs.
70
- * Fix gem integration with Asset Pipeline paths.
71
-
72
- ## 0.2 “Sputnik 2, Laika”
73
- * Rename support() to isSupported() and notPrerender() to afterPrerendering().
74
- * Fix IE 6 and 7 support.
75
- * Documentation fixes by Peter Zotov.
76
-
77
- ## 0.1 “Sputnik 1, the first”
78
- * Initial release.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/matomo.js CHANGED
@@ -39,7 +39,7 @@ if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.in
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
  if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
42
- try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
43
  if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
44
  var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
45
  dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
  if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
42
+ try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")+";SameSite=Lax"}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
43
  if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
44
  var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
45
  dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
app/piwik.js CHANGED
@@ -39,7 +39,7 @@ if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.in
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
  if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
42
- try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
43
  if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
44
  var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
45
  dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
  if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
42
+ try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")+";SameSite=Lax"}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
43
  if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
44
  var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
45
  dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
app/plugins/CoreVisualizations/Visualizations/HtmlTable.php CHANGED
@@ -235,9 +235,11 @@ class HtmlTable extends Visualization
235
 
236
  $reportTotal = isset($totals[$column]) ? $totals[$column] : 0;
237
 
238
- $percentageColumnName = $column . '_row_percentage';
239
- $rowPercentage = $formatter->formatPercent(Piwik::getPercentageSafe($value, $reportTotal, $precision = 1), $precision);
240
- $row->setMetadata($percentageColumnName, $rowPercentage);
 
 
241
 
242
  if ($siteTotalRow) {
243
  $siteTotal = $siteTotalRow->getColumn($column) ?: 0;
235
 
236
  $reportTotal = isset($totals[$column]) ? $totals[$column] : 0;
237
 
238
+ if (is_numeric($value)) {
239
+ $percentageColumnName = $column . '_row_percentage';
240
+ $rowPercentage = $formatter->formatPercent(Piwik::getPercentageSafe($value, $reportTotal, $precision = 1), $precision);
241
+ $row->setMetadata($percentageColumnName, $rowPercentage);
242
+ }
243
 
244
  if ($siteTotalRow) {
245
  $siteTotal = $siteTotalRow->getColumn($column) ?: 0;
app/plugins/CustomPiwikJs/TrackingCode/PluginTrackerFiles.php CHANGED
@@ -16,11 +16,6 @@ class PluginTrackerFiles
16
  const TRACKER_FILE = 'tracker.js';
17
  const MIN_TRACKER_FILE = 'tracker.min.js';
18
 
19
- /**
20
- * @var string
21
- */
22
- protected $dir;
23
-
24
  /**
25
  * @var Plugin\Manager
26
  */
@@ -33,7 +28,6 @@ class PluginTrackerFiles
33
 
34
  public function __construct()
35
  {
36
- $this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/';
37
  $this->pluginManager = Plugin\Manager::getInstance();
38
  }
39
 
@@ -42,6 +36,18 @@ class PluginTrackerFiles
42
  $this->ignoreMinified = true;
43
  }
44
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  /**
46
  * @return File[]
47
  */
@@ -49,25 +55,11 @@ class PluginTrackerFiles
49
  {
50
  $jsFiles = array();
51
 
52
- if (!$this->ignoreMinified) {
53
- $trackerFiles = \_glob($this->dir . '*/' . self::MIN_TRACKER_FILE);
54
-
55
- foreach ($trackerFiles as $trackerFile) {
56
- $plugin = $this->getPluginNameFromFile($trackerFile);
57
- if ($this->isPluginActivated($plugin)) {
58
- $jsFiles[$plugin] = new File($trackerFile);
59
- }
60
- }
61
- }
62
-
63
- $trackerFiles = \_glob($this->dir . '*/' . self::TRACKER_FILE);
64
-
65
- foreach ($trackerFiles as $trackerFile) {
66
- $plugin = $this->getPluginNameFromFile($trackerFile);
67
- if (!isset($jsFiles[$plugin])) {
68
- if ($this->isPluginActivated($plugin)) {
69
- $jsFiles[$plugin] = new File($trackerFile);
70
- }
71
  }
72
  }
73
 
@@ -101,10 +93,4 @@ class PluginTrackerFiles
101
  {
102
  return $this->pluginManager->isPluginActivated($pluginName);
103
  }
104
-
105
- protected function getPluginNameFromFile($file)
106
- {
107
- $file = str_replace(array($this->dir, self::TRACKER_FILE, self::MIN_TRACKER_FILE), '', $file);
108
- return trim($file, '/');
109
- }
110
  }
16
  const TRACKER_FILE = 'tracker.js';
17
  const MIN_TRACKER_FILE = 'tracker.min.js';
18
 
 
 
 
 
 
19
  /**
20
  * @var Plugin\Manager
21
  */
28
 
29
  public function __construct()
30
  {
 
31
  $this->pluginManager = Plugin\Manager::getInstance();
32
  }
33
 
36
  $this->ignoreMinified = true;
37
  }
38
 
39
+ protected function getDirectoriesToLook()
40
+ {
41
+ $dirs = array();
42
+ $manager = Plugin\Manager::getInstance();
43
+ foreach ($manager->getPluginsLoadedAndActivated() as $pluginName => $plugin) {
44
+ if ($plugin->isTrackerPlugin()) {
45
+ $dirs[$pluginName] = rtrim(Plugin\Manager::getPluginDirectory($pluginName), '/') . '/';
46
+ }
47
+ }
48
+ return $dirs;
49
+ }
50
+
51
  /**
52
  * @return File[]
53
  */
55
  {
56
  $jsFiles = array();
57
 
58
+ foreach ($this->getDirectoriesToLook() as $pluginName => $pluginDir) {
59
+ if (!$this->ignoreMinified && file_exists($pluginDir . self::MIN_TRACKER_FILE)) {
60
+ $jsFiles[$pluginName] = new File($pluginDir . self::MIN_TRACKER_FILE);
61
+ } elseif (file_exists($pluginDir . self::TRACKER_FILE)) {
62
+ $jsFiles[$pluginName] = new File($pluginDir . self::TRACKER_FILE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  }
64
  }
65
 
93
  {
94
  return $this->pluginManager->isPluginActivated($pluginName);
95
  }
 
 
 
 
 
 
96
  }
app/plugins/GeoIp2/GeoIP2AutoUpdater.php CHANGED
@@ -130,7 +130,10 @@ class GeoIP2AutoUpdater extends Task
130
  $logger = StaticContainer::get(LoggerInterface::class);
131
 
132
  $url = trim($url);
133
- if ($this->isDbIpUrl($url)) {
 
 
 
134
  $url = $this->getDbIpUrlWithLatestDate($url);
135
  }
136
 
@@ -731,7 +734,7 @@ class GeoIP2AutoUpdater extends Task
731
  return LocationProviderGeoIp2::$dbNames[$dbType][0] . '.' . $ext;
732
  }
733
 
734
- private function getDbIpUrlWithLatestDate($url)
735
  {
736
  $today = Date::today();
737
  return preg_replace('/-\d{4}-\d{2}\./', '-' . $today->toString('Y-m') . '.', $url);
@@ -741,4 +744,35 @@ class GeoIP2AutoUpdater extends Task
741
  {
742
  return !! preg_match('/db-ip\.com/', $url);
743
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
744
  }
130
  $logger = StaticContainer::get(LoggerInterface::class);
131
 
132
  $url = trim($url);
133
+
134
+ if (self::isPaidDbIpUrl($url)) {
135
+ $url = $this->fetchPaidDbIpUrl($url);
136
+ } else if (self::isDbIpUrl($url)) {
137
  $url = $this->getDbIpUrlWithLatestDate($url);
138
  }
139
 
734
  return LocationProviderGeoIp2::$dbNames[$dbType][0] . '.' . $ext;
735
  }
736
 
737
+ protected function getDbIpUrlWithLatestDate($url)
738
  {
739
  $today = Date::today();
740
  return preg_replace('/-\d{4}-\d{2}\./', '-' . $today->toString('Y-m') . '.', $url);
744
  {
745
  return !! preg_match('/db-ip\.com/', $url);
746
  }
747
+
748
+ protected static function isPaidDbIpUrl($url)
749
+ {
750
+ return !! preg_match('/db-ip\.com\/account\/[0-9a-z]+\/db/', $url);
751
+ }
752
+
753
+ protected function fetchPaidDbIpUrl($url)
754
+ {
755
+ $content = trim($this->fetchUrl($url));
756
+
757
+ if (0 === strpos($content, 'http')) {
758
+ return $content;
759
+ }
760
+
761
+ $content = json_decode($content, true);
762
+
763
+ if (!empty($content['mmdb']['url'])) {
764
+ return $content['mmdb']['url'];
765
+ }
766
+
767
+ if (!empty($content['url'])) {
768
+ return $content['url'];
769
+ }
770
+
771
+ throw new Exception('Unable to determine download url');
772
+ }
773
+
774
+ protected function fetchUrl($url)
775
+ {
776
+ return Http::fetchRemoteFile($url);
777
+ }
778
  }
app/plugins/GeoIp2/LocationProvider/GeoIp2/Php.php CHANGED
@@ -11,6 +11,7 @@ namespace Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
11
  use GeoIp2\Database\Reader;
12
  use GeoIp2\Exception\AddressNotFoundException;
13
  use MaxMind\Db\Reader\InvalidDatabaseException;
 
14
  use Piwik\Log;
15
  use Piwik\Piwik;
16
  use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
@@ -238,11 +239,35 @@ class Php extends GeoIp2
238
  if (is_array($lookupResult->subdivisions) && count($lookupResult->subdivisions) > 0) {
239
  $subdivisions = $lookupResult->subdivisions;
240
  $subdivision = $this->determinSubdivision($subdivisions, $result[self::COUNTRY_CODE_KEY]);
241
- $result[self::REGION_CODE_KEY] = strtoupper($subdivision->isoCode);
242
  $result[self::REGION_NAME_KEY] = $subdivision->name;
243
  }
244
  }
245
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  protected function determinSubdivision($subdivisions, $countryCode)
247
  {
248
  if (in_array($countryCode, ['GB'])) {
11
  use GeoIp2\Database\Reader;
12
  use GeoIp2\Exception\AddressNotFoundException;
13
  use MaxMind\Db\Reader\InvalidDatabaseException;
14
+ use Piwik\Common;
15
  use Piwik\Log;
16
  use Piwik\Piwik;
17
  use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
239
  if (is_array($lookupResult->subdivisions) && count($lookupResult->subdivisions) > 0) {
240
  $subdivisions = $lookupResult->subdivisions;
241
  $subdivision = $this->determinSubdivision($subdivisions, $result[self::COUNTRY_CODE_KEY]);
242
+ $result[self::REGION_CODE_KEY] = strtoupper($subdivision->isoCode) ?: $this->determineRegionIsoCodeByNameAndCountryCode($subdivision->name, $result[self::COUNTRY_CODE_KEY]);
243
  $result[self::REGION_NAME_KEY] = $subdivision->name;
244
  }
245
  }
246
 
247
+ /**
248
+ * Try to determine the ISO region code based on the region name and country code
249
+ *
250
+ * @param string $regionName
251
+ * @param string $countryCode
252
+ * @return string
253
+ */
254
+ protected function determineRegionIsoCodeByNameAndCountryCode($regionName, $countryCode)
255
+ {
256
+ $regionNames = self::getRegionNames();
257
+
258
+ if (empty($regionNames[$countryCode])) {
259
+ return '';
260
+ }
261
+
262
+ foreach ($regionNames[$countryCode] as $isoCode => $name) {
263
+ if (Common::mb_strtolower($name) === Common::mb_strtolower($regionName)) {
264
+ return $isoCode;
265
+ }
266
+ }
267
+
268
+ return '';
269
+ }
270
+
271
  protected function determinSubdivision($subdivisions, $countryCode)
272
  {
273
  if (in_array($countryCode, ['GB'])) {
app/plugins/Overlay/Controller.php CHANGED
@@ -20,6 +20,7 @@ use Piwik\Plugins\SegmentEditor\SegmentFormatter;
20
  use Piwik\Plugins\SitesManager\API as APISitesManager;
21
  use Piwik\ProxyHttp;
22
  use Piwik\Segment;
 
23
  use Piwik\Tracker\Action;
24
  use Piwik\Tracker\PageUrl;
25
  use Piwik\View;
@@ -43,6 +44,12 @@ class Controller extends \Piwik\Plugin\Controller
43
  {
44
  Piwik::checkUserHasViewAccess($this->idSite);
45
 
 
 
 
 
 
 
46
  $template = '@Overlay/index';
47
  if (Config::getInstance()->General['overlay_disable_framed_mode']) {
48
  $template = '@Overlay/index_noframe';
20
  use Piwik\Plugins\SitesManager\API as APISitesManager;
21
  use Piwik\ProxyHttp;
22
  use Piwik\Segment;
23
+ use Piwik\Session;
24
  use Piwik\Tracker\Action;
25
  use Piwik\Tracker\PageUrl;
26
  use Piwik\View;
44
  {
45
  Piwik::checkUserHasViewAccess($this->idSite);
46
 
47
+ // Overlay needs to send requests w/ the session cookie from within the tracked website, which means
48
+ // we can't use SameSite=Lax. So, we regenerate the session ID here (in Session.php there is a hardcoded
49
+ // check for Overlay, so will be set to SameSite=None).
50
+ // Note: this means the new session ID will have SameSite=None until it regenerates on a non-Overlay page.
51
+ Session::regenerateId();
52
+
53
  $template = '@Overlay/index';
54
  if (Config::getInstance()->General['overlay_disable_framed_mode']) {
55
  $template = '@Overlay/index_noframe';
app/plugins/VisitFrequency/API.php CHANGED
@@ -49,7 +49,10 @@ class API extends \Piwik\Plugin\API
49
  $columns = Piwik::getArrayFromApiParameter($columns);
50
 
51
  /** @var \Piwik\DataTable\DataTableInterface $resultSet */
52
- if (Period::isMultiplePeriod($date, $period)) {
 
 
 
53
  $resultSet = new DataTable\Map();
54
  $resultSet->setKeyName('period');
55
  } else {
49
  $columns = Piwik::getArrayFromApiParameter($columns);
50
 
51
  /** @var \Piwik\DataTable\DataTableInterface $resultSet */
52
+ if ($idSite === 'all') {
53
+ $resultSet = new DataTable\Map();
54
+ $resultSet->setKeyName('idSite');
55
+ } else if (Period::isMultiplePeriod($date, $period)) {
56
  $resultSet = new DataTable\Map();
57
  $resultSet->setKeyName('period');
58
  } else {
app/vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInite02e2beb31e6163bda800886ed643e0c::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInite67cb932b779452f67cda37373f10cc8::getLoader();
app/vendor/composer/autoload_classmap.php CHANGED
@@ -1089,7 +1089,6 @@ return array(
1089
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Framework\\Mock\\PluginTrackerFilesMock' => $baseDir . '/plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php',
1090
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\ApiTest' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/ApiTest.php',
1091
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomPluginTrackerFiles' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php',
1092
- 'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomPluginTrackerFiles2' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php',
1093
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomTestFile' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/FileTest.php',
1094
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\FileTest' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/FileTest.php',
1095
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\PiwikJsManipulatorTest' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php',
@@ -1344,6 +1343,7 @@ return array(
1344
  'Piwik\\Plugins\\ExampleTracker\\Columns\\ExampleDimension' => $baseDir . '/plugins/ExampleTracker/Columns/ExampleDimension.php',
1345
  'Piwik\\Plugins\\ExampleTracker\\Columns\\ExampleVisitDimension' => $baseDir . '/plugins/ExampleTracker/Columns/ExampleVisitDimension.php',
1346
  'Piwik\\Plugins\\ExampleTracker\\ExampleTracker' => $baseDir . '/plugins/ExampleTracker/ExampleTracker.php',
 
1347
  'Piwik\\Plugins\\ExampleUI\\API' => $baseDir . '/plugins/ExampleUI/API.php',
1348
  'Piwik\\Plugins\\ExampleUI\\Categories\\ExampleUiCategory' => $baseDir . '/plugins/ExampleUI/Categories/ExampleUiCategory.php',
1349
  'Piwik\\Plugins\\ExampleUI\\Controller' => $baseDir . '/plugins/ExampleUI/Controller.php',
@@ -1376,6 +1376,8 @@ return array(
1376
  'Piwik\\Plugins\\GeoIp2\\tests\\Integration\\LocationProviderTest' => $baseDir . '/plugins/GeoIp2/tests/Integration/LocationProviderTest.php',
1377
  'Piwik\\Plugins\\GeoIp2\\tests\\Integration\\UpdateTest' => $baseDir . '/plugins/GeoIp2/tests/Integration/UpdateTest.php',
1378
  'Piwik\\Plugins\\GeoIp2\\tests\\System\\ConvertRegionCodesToIsoTest' => $baseDir . '/plugins/GeoIp2/tests/System/ConvertRegionCodesToIsoTest.php',
 
 
1379
  'Piwik\\Plugins\\Goals\\API' => $baseDir . '/plugins/Goals/API.php',
1380
  'Piwik\\Plugins\\Goals\\Archiver' => $baseDir . '/plugins/Goals/Archiver.php',
1381
  'Piwik\\Plugins\\Goals\\Categories\\AddANewGoalSubcategory' => $baseDir . '/plugins/Goals/Categories/AddANewGoalSubcategory.php',
1089
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Framework\\Mock\\PluginTrackerFilesMock' => $baseDir . '/plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php',
1090
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\ApiTest' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/ApiTest.php',
1091
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomPluginTrackerFiles' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php',
 
1092
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomTestFile' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/FileTest.php',
1093
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\FileTest' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/FileTest.php',
1094
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\PiwikJsManipulatorTest' => $baseDir . '/plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php',
1343
  'Piwik\\Plugins\\ExampleTracker\\Columns\\ExampleDimension' => $baseDir . '/plugins/ExampleTracker/Columns/ExampleDimension.php',
1344
  'Piwik\\Plugins\\ExampleTracker\\Columns\\ExampleVisitDimension' => $baseDir . '/plugins/ExampleTracker/Columns/ExampleVisitDimension.php',
1345
  'Piwik\\Plugins\\ExampleTracker\\ExampleTracker' => $baseDir . '/plugins/ExampleTracker/ExampleTracker.php',
1346
+ 'Piwik\\Plugins\\ExampleTracker\\VisitorDetails' => $baseDir . '/plugins/ExampleTracker/VisitorDetails.php',
1347
  'Piwik\\Plugins\\ExampleUI\\API' => $baseDir . '/plugins/ExampleUI/API.php',
1348
  'Piwik\\Plugins\\ExampleUI\\Categories\\ExampleUiCategory' => $baseDir . '/plugins/ExampleUI/Categories/ExampleUiCategory.php',
1349
  'Piwik\\Plugins\\ExampleUI\\Controller' => $baseDir . '/plugins/ExampleUI/Controller.php',
1376
  'Piwik\\Plugins\\GeoIp2\\tests\\Integration\\LocationProviderTest' => $baseDir . '/plugins/GeoIp2/tests/Integration/LocationProviderTest.php',
1377
  'Piwik\\Plugins\\GeoIp2\\tests\\Integration\\UpdateTest' => $baseDir . '/plugins/GeoIp2/tests/Integration/UpdateTest.php',
1378
  'Piwik\\Plugins\\GeoIp2\\tests\\System\\ConvertRegionCodesToIsoTest' => $baseDir . '/plugins/GeoIp2/tests/System/ConvertRegionCodesToIsoTest.php',
1379
+ 'Piwik\\Plugins\\GeoIp2\\tests\\Unit\\GeoIP2AutoUpdaterTest' => $baseDir . '/plugins/GeoIp2/tests/Unit/GeoIP2AutoUpdaterTest.php',
1380
+ 'Piwik\\Plugins\\GeoIp2\\tests\\Unit\\public_GeoIP2AutoUpdater' => $baseDir . '/plugins/GeoIp2/tests/Unit/GeoIP2AutoUpdaterTest.php',
1381
  'Piwik\\Plugins\\Goals\\API' => $baseDir . '/plugins/Goals/API.php',
1382
  'Piwik\\Plugins\\Goals\\Archiver' => $baseDir . '/plugins/Goals/Archiver.php',
1383
  'Piwik\\Plugins\\Goals\\Categories\\AddANewGoalSubcategory' => $baseDir . '/plugins/Goals/Categories/AddANewGoalSubcategory.php',
app/vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInite02e2beb31e6163bda800886ed643e0c
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInite02e2beb31e6163bda800886ed643e0c
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInite02e2beb31e6163bda800886ed643e0c', 'loadClassLoader'), true, false);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInite02e2beb31e6163bda800886ed643e0c', 'loadClassLoader'));
25
 
26
  $includePaths = require __DIR__ . '/include_paths.php';
27
  $includePaths[] = get_include_path();
@@ -31,7 +31,7 @@ class ComposerAutoloaderInite02e2beb31e6163bda800886ed643e0c
31
  if ($useStaticLoader) {
32
  require_once __DIR__ . '/autoload_static.php';
33
 
34
- call_user_func(\Composer\Autoload\ComposerStaticInite02e2beb31e6163bda800886ed643e0c::getInitializer($loader));
35
  } else {
36
  $map = require __DIR__ . '/autoload_namespaces.php';
37
  foreach ($map as $namespace => $path) {
@@ -52,19 +52,19 @@ class ComposerAutoloaderInite02e2beb31e6163bda800886ed643e0c
52
  $loader->register(false);
53
 
54
  if ($useStaticLoader) {
55
- $includeFiles = Composer\Autoload\ComposerStaticInite02e2beb31e6163bda800886ed643e0c::$files;
56
  } else {
57
  $includeFiles = require __DIR__ . '/autoload_files.php';
58
  }
59
  foreach ($includeFiles as $fileIdentifier => $file) {
60
- composerRequiree02e2beb31e6163bda800886ed643e0c($fileIdentifier, $file);
61
  }
62
 
63
  return $loader;
64
  }
65
  }
66
 
67
- function composerRequiree02e2beb31e6163bda800886ed643e0c($fileIdentifier, $file)
68
  {
69
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
70
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInite67cb932b779452f67cda37373f10cc8
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInite67cb932b779452f67cda37373f10cc8', 'loadClassLoader'), true, false);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInite67cb932b779452f67cda37373f10cc8', 'loadClassLoader'));
25
 
26
  $includePaths = require __DIR__ . '/include_paths.php';
27
  $includePaths[] = get_include_path();
31
  if ($useStaticLoader) {
32
  require_once __DIR__ . '/autoload_static.php';
33
 
34
+ call_user_func(\Composer\Autoload\ComposerStaticInite67cb932b779452f67cda37373f10cc8::getInitializer($loader));
35
  } else {
36
  $map = require __DIR__ . '/autoload_namespaces.php';
37
  foreach ($map as $namespace => $path) {
52
  $loader->register(false);
53
 
54
  if ($useStaticLoader) {
55
+ $includeFiles = Composer\Autoload\ComposerStaticInite67cb932b779452f67cda37373f10cc8::$files;
56
  } else {
57
  $includeFiles = require __DIR__ . '/autoload_files.php';
58
  }
59
  foreach ($includeFiles as $fileIdentifier => $file) {
60
+ composerRequiree67cb932b779452f67cda37373f10cc8($fileIdentifier, $file);
61
  }
62
 
63
  return $loader;
64
  }
65
  }
66
 
67
+ function composerRequiree67cb932b779452f67cda37373f10cc8($fileIdentifier, $file)
68
  {
69
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
70
  require $file;
app/vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInite02e2beb31e6163bda800886ed643e0c
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
@@ -1331,7 +1331,6 @@ class ComposerStaticInite02e2beb31e6163bda800886ed643e0c
1331
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Framework\\Mock\\PluginTrackerFilesMock' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php',
1332
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\ApiTest' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/ApiTest.php',
1333
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomPluginTrackerFiles' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php',
1334
- 'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomPluginTrackerFiles2' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php',
1335
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomTestFile' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/FileTest.php',
1336
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\FileTest' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/FileTest.php',
1337
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\PiwikJsManipulatorTest' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php',
@@ -1586,6 +1585,7 @@ class ComposerStaticInite02e2beb31e6163bda800886ed643e0c
1586
  'Piwik\\Plugins\\ExampleTracker\\Columns\\ExampleDimension' => __DIR__ . '/../..' . '/plugins/ExampleTracker/Columns/ExampleDimension.php',
1587
  'Piwik\\Plugins\\ExampleTracker\\Columns\\ExampleVisitDimension' => __DIR__ . '/../..' . '/plugins/ExampleTracker/Columns/ExampleVisitDimension.php',
1588
  'Piwik\\Plugins\\ExampleTracker\\ExampleTracker' => __DIR__ . '/../..' . '/plugins/ExampleTracker/ExampleTracker.php',
 
1589
  'Piwik\\Plugins\\ExampleUI\\API' => __DIR__ . '/../..' . '/plugins/ExampleUI/API.php',
1590
  'Piwik\\Plugins\\ExampleUI\\Categories\\ExampleUiCategory' => __DIR__ . '/../..' . '/plugins/ExampleUI/Categories/ExampleUiCategory.php',
1591
  'Piwik\\Plugins\\ExampleUI\\Controller' => __DIR__ . '/../..' . '/plugins/ExampleUI/Controller.php',
@@ -1618,6 +1618,8 @@ class ComposerStaticInite02e2beb31e6163bda800886ed643e0c
1618
  'Piwik\\Plugins\\GeoIp2\\tests\\Integration\\LocationProviderTest' => __DIR__ . '/../..' . '/plugins/GeoIp2/tests/Integration/LocationProviderTest.php',
1619
  'Piwik\\Plugins\\GeoIp2\\tests\\Integration\\UpdateTest' => __DIR__ . '/../..' . '/plugins/GeoIp2/tests/Integration/UpdateTest.php',
1620
  'Piwik\\Plugins\\GeoIp2\\tests\\System\\ConvertRegionCodesToIsoTest' => __DIR__ . '/../..' . '/plugins/GeoIp2/tests/System/ConvertRegionCodesToIsoTest.php',
 
 
1621
  'Piwik\\Plugins\\Goals\\API' => __DIR__ . '/../..' . '/plugins/Goals/API.php',
1622
  'Piwik\\Plugins\\Goals\\Archiver' => __DIR__ . '/../..' . '/plugins/Goals/Archiver.php',
1623
  'Piwik\\Plugins\\Goals\\Categories\\AddANewGoalSubcategory' => __DIR__ . '/../..' . '/plugins/Goals/Categories/AddANewGoalSubcategory.php',
@@ -3601,11 +3603,11 @@ class ComposerStaticInite02e2beb31e6163bda800886ed643e0c
3601
  public static function getInitializer(ClassLoader $loader)
3602
  {
3603
  return \Closure::bind(function () use ($loader) {
3604
- $loader->prefixLengthsPsr4 = ComposerStaticInite02e2beb31e6163bda800886ed643e0c::$prefixLengthsPsr4;
3605
- $loader->prefixDirsPsr4 = ComposerStaticInite02e2beb31e6163bda800886ed643e0c::$prefixDirsPsr4;
3606
- $loader->prefixesPsr0 = ComposerStaticInite02e2beb31e6163bda800886ed643e0c::$prefixesPsr0;
3607
- $loader->fallbackDirsPsr0 = ComposerStaticInite02e2beb31e6163bda800886ed643e0c::$fallbackDirsPsr0;
3608
- $loader->classMap = ComposerStaticInite02e2beb31e6163bda800886ed643e0c::$classMap;
3609
 
3610
  }, null, ClassLoader::class);
3611
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInite67cb932b779452f67cda37373f10cc8
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
1331
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Framework\\Mock\\PluginTrackerFilesMock' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php',
1332
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\ApiTest' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/ApiTest.php',
1333
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomPluginTrackerFiles' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php',
 
1334
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\CustomTestFile' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/FileTest.php',
1335
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\FileTest' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/FileTest.php',
1336
  'Piwik\\Plugins\\CustomPiwikJs\\tests\\Integration\\PiwikJsManipulatorTest' => __DIR__ . '/../..' . '/plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php',
1585
  'Piwik\\Plugins\\ExampleTracker\\Columns\\ExampleDimension' => __DIR__ . '/../..' . '/plugins/ExampleTracker/Columns/ExampleDimension.php',
1586
  'Piwik\\Plugins\\ExampleTracker\\Columns\\ExampleVisitDimension' => __DIR__ . '/../..' . '/plugins/ExampleTracker/Columns/ExampleVisitDimension.php',
1587
  'Piwik\\Plugins\\ExampleTracker\\ExampleTracker' => __DIR__ . '/../..' . '/plugins/ExampleTracker/ExampleTracker.php',
1588
+ 'Piwik\\Plugins\\ExampleTracker\\VisitorDetails' => __DIR__ . '/../..' . '/plugins/ExampleTracker/VisitorDetails.php',
1589
  'Piwik\\Plugins\\ExampleUI\\API' => __DIR__ . '/../..' . '/plugins/ExampleUI/API.php',
1590
  'Piwik\\Plugins\\ExampleUI\\Categories\\ExampleUiCategory' => __DIR__ . '/../..' . '/plugins/ExampleUI/Categories/ExampleUiCategory.php',
1591
  'Piwik\\Plugins\\ExampleUI\\Controller' => __DIR__ . '/../..' . '/plugins/ExampleUI/Controller.php',
1618
  'Piwik\\Plugins\\GeoIp2\\tests\\Integration\\LocationProviderTest' => __DIR__ . '/../..' . '/plugins/GeoIp2/tests/Integration/LocationProviderTest.php',
1619
  'Piwik\\Plugins\\GeoIp2\\tests\\Integration\\UpdateTest' => __DIR__ . '/../..' . '/plugins/GeoIp2/tests/Integration/UpdateTest.php',
1620
  'Piwik\\Plugins\\GeoIp2\\tests\\System\\ConvertRegionCodesToIsoTest' => __DIR__ . '/../..' . '/plugins/GeoIp2/tests/System/ConvertRegionCodesToIsoTest.php',
1621
+ 'Piwik\\Plugins\\GeoIp2\\tests\\Unit\\GeoIP2AutoUpdaterTest' => __DIR__ . '/../..' . '/plugins/GeoIp2/tests/Unit/GeoIP2AutoUpdaterTest.php',
1622
+ 'Piwik\\Plugins\\GeoIp2\\tests\\Unit\\public_GeoIP2AutoUpdater' => __DIR__ . '/../..' . '/plugins/GeoIp2/tests/Unit/GeoIP2AutoUpdaterTest.php',
1623
  'Piwik\\Plugins\\Goals\\API' => __DIR__ . '/../..' . '/plugins/Goals/API.php',
1624
  'Piwik\\Plugins\\Goals\\Archiver' => __DIR__ . '/../..' . '/plugins/Goals/Archiver.php',
1625
  'Piwik\\Plugins\\Goals\\Categories\\AddANewGoalSubcategory' => __DIR__ . '/../..' . '/plugins/Goals/Categories/AddANewGoalSubcategory.php',
3603
  public static function getInitializer(ClassLoader $loader)
3604
  {
3605
  return \Closure::bind(function () use ($loader) {
3606
+ $loader->prefixLengthsPsr4 = ComposerStaticInite67cb932b779452f67cda37373f10cc8::$prefixLengthsPsr4;
3607
+ $loader->prefixDirsPsr4 = ComposerStaticInite67cb932b779452f67cda37373f10cc8::$prefixDirsPsr4;
3608
+ $loader->prefixesPsr0 = ComposerStaticInite67cb932b779452f67cda37373f10cc8::$prefixesPsr0;
3609
+ $loader->fallbackDirsPsr0 = ComposerStaticInite67cb932b779452f67cda37373f10cc8::$fallbackDirsPsr0;
3610
+ $loader->classMap = ComposerStaticInite67cb932b779452f67cda37373f10cc8::$classMap;
3611
 
3612
  }, null, ClassLoader::class);
3613
  }
assets/js/asset_manager_core_js.js CHANGED
@@ -1,4 +1,4 @@
1
- /* Matomo Javascript - cb=fbf66b87c80a34a3250f0e95af7bbe49*/
2
 
3
  /*! jQuery Browser - v0.1.0 - 3/23/2012
4
  * https://github.com/jquery/jquery-browser
1
+ /* Matomo Javascript - cb=96b12efedc5a20952da305f7fa27e7d0*/
2
 
3
  /*! jQuery Browser - v0.1.0 - 3/23/2012
4
  * https://github.com/jquery/jquery-browser
classes/WpMatomo/Admin/SystemReport.php CHANGED
@@ -153,6 +153,7 @@ class SystemReport {
153
  array(
154
  'title' => 'WordPress',
155
  'rows' => $this->get_wordpress_info(),
 
156
  ),
157
  array(
158
  'title' => 'WordPress Plugins',
@@ -667,6 +668,28 @@ class SystemReport {
667
  'value' => defined( 'WP_CACHE' ) && WP_CACHE,
668
  );
669
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
670
  return $rows;
671
  }
672
 
153
  array(
154
  'title' => 'WordPress',
155
  'rows' => $this->get_wordpress_info(),
156
+ 'has_comments' => true,
157
  ),
158
  array(
159
  'title' => 'WordPress Plugins',
668
  'value' => defined( 'WP_CACHE' ) && WP_CACHE,
669
  );
670
 
671
+ if (is_plugin_active('wp-piwik/wp-piwik.php')) {
672
+ $rows[] = array(
673
+ 'name' => 'WP-Matomo (WP-Piwik) activated',
674
+ 'value' => true,
675
+ 'is_warning' => true,
676
+ 'comment' => 'It is usually not recommended or needed to run Matomo for WordPress and WP-Matomo at the same time. To learn more about the differences between the two plugins view this URL: https://matomo.org/faq/wordpress/why-are-there-two-different-matomo-for-wordpress-plugins-what-is-the-difference-to-wp-matomo-integration-plugin/'
677
+ );
678
+
679
+ $mode = get_option ( 'wp-piwik_global-piwik_mode' );
680
+ if (function_exists('get_site_option') && is_plugin_active_for_network ( 'wp-piwik/wp-piwik.php' )) {
681
+ $mode = get_site_option ( 'wp-piwik_global-piwik_mode');
682
+ }
683
+ if (!empty($mode)) {
684
+ $rows[] = array(
685
+ 'name' => 'WP-Matomo mode',
686
+ 'value' => $mode,
687
+ 'is_warning' => $mode === 'php' || $mode === 'PHP',
688
+ 'comment' => 'WP-Matomo is configured in "PHP mode". This is known to cause issues with Matomo for WordPress. We recommend you either deactivate WP-Matomo or you go "Settings => WP-Matomo" and change the "Matomo Mode" in the "Connect to Matomo" section to "Self-hosted HTTP API".'
689
+ );
690
+ }
691
+ }
692
+
693
  return $rows;
694
  }
695
 
classes/WpMatomo/Admin/views/marketplace.php CHANGED
@@ -71,11 +71,11 @@ $matomo_extra_url_params = '&' . http_build_query(
71
  'image' => '',
72
  ),
73
  array(
74
- 'name' => 'Google Analytics Importer',
75
- 'description' => 'Import reports from a Google Analytics account into Matomo.',
76
  'price' => '',
77
- 'download_url' => 'https://plugins.matomo.org/api/2.0/plugins/GoogleAnalyticsImporter/download/latest?wp=1' . $matomo_extra_url_params,
78
- 'url' => 'https://plugins.matomo.org/GoogleAnalyticsImporter?wp=1',
79
  'image' => '',
80
  ),
81
  ),
71
  'image' => '',
72
  ),
73
  array(
74
+ 'name' => 'Marketing Campaigns Reporting',
75
+ 'description' => 'Measure the effectiveness of your marketing campaigns. Track up to five channels instead of two: campaign, source, medium, keyword, content.',
76
  'price' => '',
77
+ 'download_url' => 'https://plugins.matomo.org/api/2.0/plugins/MarketingCampaignsReporting/download/latest?wp=1' . $matomo_extra_url_params,
78
+ 'url' => 'https://plugins.matomo.org/MarketingCampaignsReporting?wp=1',
79
  'image' => '',
80
  ),
81
  ),
classes/WpMatomo/Ecommerce/Base.php CHANGED
@@ -70,7 +70,7 @@ class Base {
70
  update_post_meta( $order_id, $this->key_order_tracked, 1 );
71
  }
72
 
73
- private function is_doing_ajax() {
74
  return defined( 'DOING_AJAX' ) && DOING_AJAX;
75
  }
76
 
70
  update_post_meta( $order_id, $this->key_order_tracked, 1 );
71
  }
72
 
73
+ protected function is_doing_ajax() {
74
  return defined( 'DOING_AJAX' ) && DOING_AJAX;
75
  }
76
 
classes/WpMatomo/Ecommerce/Woocommerce.php CHANGED
@@ -28,7 +28,16 @@ class Woocommerce extends Base {
28
  add_action( 'woocommerce_add_to_cart', array( $this, 'on_cart_updated' ), 99999, 0 );
29
  add_action( 'woocommerce_cart_item_removed', array( $this, 'on_cart_updated' ), 99999, 0 );
30
  add_action( 'woocommerce_cart_item_restored', array( $this, 'on_cart_updated' ), 99999, 0 );
31
- add_filter( 'woocommerce_update_cart_action_cart_updated', array( $this, 'on_cart_updated' ), 99999, 1 );
 
 
 
 
 
 
 
 
 
32
  add_action( 'woocommerce_applied_coupon', array( $this, 'on_cart_updated' ), 99999, 0 );
33
  add_action( 'woocommerce_removed_coupon', array( $this, 'on_cart_updated' ), 99999, 0 );
34
  }
@@ -44,7 +53,12 @@ class Woocommerce extends Base {
44
  }
45
  }
46
 
47
- public function on_cart_updated() {
 
 
 
 
 
48
  global $woocommerce;
49
 
50
  /** @var \WC_Cart $cart */
@@ -102,6 +116,8 @@ class Woocommerce extends Base {
102
 
103
  $this->cart_update_queue = $this->wrap_script( $tracking_code );
104
  $this->logger->log( 'Tracked ecommerce cart update: ' . $this->cart_update_queue );
 
 
105
  }
106
 
107
  public function on_order( $order_id ) {
28
  add_action( 'woocommerce_add_to_cart', array( $this, 'on_cart_updated' ), 99999, 0 );
29
  add_action( 'woocommerce_cart_item_removed', array( $this, 'on_cart_updated' ), 99999, 0 );
30
  add_action( 'woocommerce_cart_item_restored', array( $this, 'on_cart_updated' ), 99999, 0 );
31
+ add_action( 'woocommerce_cart_item_set_quantity', array( $this, 'on_cart_updated' ), 99999, 0 );
32
+
33
+ if (!$this->is_doing_ajax()) {
34
+ // prevent possibly executing same event twice where eg first a PHP Matomo tracker request is created
35
+ // because of woocommerce_applied_coupon and then also because of woocommerce_update_cart_action_cart_updated itself
36
+ // causing two tracking requests to be issues from the server. refs #215
37
+ // when not ajax mode the later event will simply overwrite the first and it should be fine.
38
+ add_filter( 'woocommerce_update_cart_action_cart_updated', array( $this, 'on_cart_updated' ), 99999, 1 );
39
+ }
40
+
41
  add_action( 'woocommerce_applied_coupon', array( $this, 'on_cart_updated' ), 99999, 0 );
42
  add_action( 'woocommerce_removed_coupon', array( $this, 'on_cart_updated' ), 99999, 0 );
43
  }
53
  }
54
  }
55
 
56
+ /**
57
+ * @param null $val needed for woocommerce_update_cart_action_cart_updated filter
58
+ *
59
+ * @return mixed
60
+ */
61
+ public function on_cart_updated( $val = null ) {
62
  global $woocommerce;
63
 
64
  /** @var \WC_Cart $cart */
116
 
117
  $this->cart_update_queue = $this->wrap_script( $tracking_code );
118
  $this->logger->log( 'Tracked ecommerce cart update: ' . $this->cart_update_queue );
119
+
120
+ return $val;
121
  }
122
 
123
  public function on_order( $order_id ) {
classes/WpMatomo/Paths.php CHANGED
@@ -110,8 +110,8 @@ class Paths {
110
 
111
  public function get_relative_dir_to_matomo( $target_dir ) {
112
  $matomo_dir = plugin_dir_path( MATOMO_ANALYTICS_FILE ) . 'app';
113
- $matomo_dir_parts = explode( '/', $matomo_dir );
114
- $target_dir_parts = explode( '/', $target_dir );
115
  $relative_directory = '';
116
  $add_at_the_end = array();
117
  $was_previous_same = false;
110
 
111
  public function get_relative_dir_to_matomo( $target_dir ) {
112
  $matomo_dir = plugin_dir_path( MATOMO_ANALYTICS_FILE ) . 'app';
113
+ $matomo_dir_parts = explode( DIRECTORY_SEPARATOR, $matomo_dir );
114
+ $target_dir_parts = explode( DIRECTORY_SEPARATOR, $target_dir );
115
  $relative_directory = '';
116
  $add_at_the_end = array();
117
  $was_previous_same = false;
config/common.config.ini.php CHANGED
@@ -1,6 +1,9 @@
1
  ; <?php exit; ?> DO NOT REMOVE THIS LINE
2
  ; Configuration settings which are applied to all Piwik instances.
3
 
 
 
 
4
  [General]
5
  enable_update_communication = 0
6
  enable_auto_update = 0
1
  ; <?php exit; ?> DO NOT REMOVE THIS LINE
2
  ; Configuration settings which are applied to all Piwik instances.
3
 
4
+ [database]
5
+ adapter = WordPress
6
+
7
  [General]
8
  enable_update_communication = 0
9
  enable_auto_update = 0
config/config.php CHANGED
@@ -46,12 +46,11 @@ return array(
46
  $previous->General = $general;
47
  }
48
 
 
 
 
49
  $paths = new Paths();
50
  if ( file_exists( $paths->get_config_ini_path() ) ) {
51
- // we overwrite DB on demand only once installed... otherwise Matomo may think it is installed already
52
- $database = $previous->database;
53
- $previous->database = \WpMatomo\Installer::get_db_infos($database);
54
-
55
  $general = $previous->General;
56
 
57
  if (defined('MATOMO_TRIGGER_BROWSER_ARCHIVING')) {
46
  $previous->General = $general;
47
  }
48
 
49
+ $database = $previous->database;
50
+ $previous->database = \WpMatomo\Installer::get_db_infos($database);
51
+
52
  $paths = new Paths();
53
  if ( file_exists( $paths->get_config_ini_path() ) ) {
 
 
 
 
54
  $general = $previous->General;
55
 
56
  if (defined('MATOMO_TRIGGER_BROWSER_ARCHIVING')) {
matomo.php CHANGED
@@ -4,10 +4,10 @@
4
  * Description: The #1 Google Analytics alternative that gives you full control over your data and protects the privacy for your users. Free, secure and open.
5
  * Author: Matomo
6
  * Author URI: https://matomo.org
7
- * Version: 1.0.2
8
  * Domain Path: /languages
9
  * WC requires at least: 2.4.0
10
- * WC tested up to: 3.8
11
  *
12
  * Matomo - free/libre analytics platform
13
  *
@@ -36,9 +36,25 @@ $GLOBALS['MATOMO_PLUGINS_ENABLED'] = array();
36
  $GLOBALS['MATOMO_PLUGIN_FILES'] = array( MATOMO_ANALYTICS_FILE );
37
 
38
  function matomo_has_compatible_content_dir() {
39
- return (defined( 'WP_CONTENT_DIR' )
40
- && ABSPATH . 'wp-content' === rtrim( WP_CONTENT_DIR, '/' ))
41
- || ( !empty( $_ENV['MATOMO_WP_ROOT_PATH'] ) && is_dir( $_ENV['MATOMO_WP_ROOT_PATH'] ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  }
43
 
44
  function matomo_is_app_request() {
@@ -117,8 +133,8 @@ function matomo_add_plugin( $plugins_directory, $wp_plugin_file, $is_marketplace
117
  }
118
 
119
  $matomo_dir = __DIR__ . '/app';
120
- $matomo_dir_parts = explode( '/', $matomo_dir );
121
- $root_dir_parts = explode( '/', $root_dir );
122
  $webroot_dir = '';
123
  foreach ( $matomo_dir_parts as $index => $part ) {
124
  if ( isset( $root_dir_parts[ $index ] ) && $root_dir_parts[ $index ] === $part ) {
@@ -136,4 +152,4 @@ function matomo_add_plugin( $plugins_directory, $wp_plugin_file, $is_marketplace
136
  require_once __DIR__ . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR . 'WpMatomo.php';
137
  require 'shared.php';
138
  matomo_add_plugin( __DIR__ . '/plugins/WordPress', MATOMO_ANALYTICS_FILE );
139
- new WpMatomo();
4
  * Description: The #1 Google Analytics alternative that gives you full control over your data and protects the privacy for your users. Free, secure and open.
5
  * Author: Matomo
6
  * Author URI: https://matomo.org
7
+ * Version: 1.0.3
8
  * Domain Path: /languages
9
  * WC requires at least: 2.4.0
10
+ * WC tested up to: 3.9.2
11
  *
12
  * Matomo - free/libre analytics platform
13
  *
36
  $GLOBALS['MATOMO_PLUGIN_FILES'] = array( MATOMO_ANALYTICS_FILE );
37
 
38
  function matomo_has_compatible_content_dir() {
39
+ if ( !empty( $_ENV['MATOMO_WP_ROOT_PATH'] ) && is_dir( $_ENV['MATOMO_WP_ROOT_PATH'] ) ) {
40
+ return true;
41
+ }
42
+
43
+ if ( ! defined( 'WP_CONTENT_DIR' ) ) {
44
+ return false;
45
+ }
46
+
47
+ $contentDir = rtrim(rtrim( WP_CONTENT_DIR, '/' ), DIRECTORY_SEPARATOR );
48
+ $contentDir = wp_normalize_path($contentDir);
49
+ $absPath = wp_normalize_path(ABSPATH);
50
+
51
+ $absPaths = array(
52
+ $absPath . 'wp-content',
53
+ $absPath . '/wp-content',
54
+ $absPath . DIRECTORY_SEPARATOR . 'wp-content'
55
+ );
56
+
57
+ return in_array($contentDir, $absPaths, true);
58
  }
59
 
60
  function matomo_is_app_request() {
133
  }
134
 
135
  $matomo_dir = __DIR__ . '/app';
136
+ $matomo_dir_parts = explode( DIRECTORY_SEPARATOR, $matomo_dir );
137
+ $root_dir_parts = explode( DIRECTORY_SEPARATOR, $root_dir );
138
  $webroot_dir = '';
139
  foreach ( $matomo_dir_parts as $index => $part ) {
140
  if ( isset( $root_dir_parts[ $index ] ) && $root_dir_parts[ $index ] === $part ) {
152
  require_once __DIR__ . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR . 'WpMatomo.php';
153
  require 'shared.php';
154
  matomo_add_plugin( __DIR__ . '/plugins/WordPress', MATOMO_ANALYTICS_FILE );
155
+ new WpMatomo();
plugins/WordPress/WordPress.php CHANGED
@@ -15,6 +15,7 @@ use Piwik\Common;
15
  use Piwik\FrontController;
16
  use Piwik\Piwik;
17
  use Piwik\Plugin;
 
18
  use Piwik\Plugins\CoreHome\SystemSummary\Item;
19
  use Piwik\Scheduler\Task;
20
  use Piwik\Url;
@@ -49,9 +50,28 @@ class WordPress extends Plugin
49
  'API.Tour.getChallenges.end' => 'modifyTourChallenges',
50
  'API.ScheduledReports.generateReport.end' => 'onGenerateReportEnd',
51
  'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
 
 
52
  );
53
  }
54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  public function getClientSideTranslationKeys(&$translationKeys)
56
  {
57
  $translationKeys[] = 'Feedback_SearchOnMatomo';
15
  use Piwik\FrontController;
16
  use Piwik\Piwik;
17
  use Piwik\Plugin;
18
+ use Piwik\Plugin\Manager;
19
  use Piwik\Plugins\CoreHome\SystemSummary\Item;
20
  use Piwik\Scheduler\Task;
21
  use Piwik\Url;
50
  'API.Tour.getChallenges.end' => 'modifyTourChallenges',
51
  'API.ScheduledReports.generateReport.end' => 'onGenerateReportEnd',
52
  'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
53
+ 'CustomMatomoJs.manipulateJsTracker' => 'updateHeatmapTrackerPath',
54
+ 'Visualization.beforeRender' => 'onBeforeRenderView',
55
  );
56
  }
57
 
58
+ public function onBeforeRenderView (Plugin\ViewDataTable $view)
59
+ {
60
+ if ($view->requestConfig->getApiModuleToRequest() === 'UserCountry' && $view->config->show_footer_message && strpos($view->config->show_footer_message, 'href') !== false) {
61
+ // dont suggest setting up geoip
62
+ $view->config->show_footer_message = '';
63
+ }
64
+ }
65
+
66
+ public function updateHeatmapTrackerPath(&$content)
67
+ {
68
+ $webRootDirs = Manager::getInstance()->getWebRootDirectoriesForCustomPluginDirs();
69
+ if (!empty($webRootDirs['HeatmapSessionRecording'])) {
70
+ $baseUrl = trim($webRootDirs['HeatmapSessionRecording'], '/') . '/HeatmapSessionRecording/configs.php';
71
+ $content = str_replace('plugins/HeatmapSessionRecording/configs.php', $baseUrl, $content);
72
+ }
73
+ }
74
+
75
  public function getClientSideTranslationKeys(&$translationKeys)
76
  {
77
  $translationKeys[] = 'Feedback_SearchOnMatomo';
readme.txt CHANGED
@@ -1,154 +1,160 @@
1
- === Matomo Analytics - Ethical Stats. Powerful Insights. ===
2
- Contributors: matomoteam
3
- Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5EJ2LHATAKCJ4&source=url
4
- Tags: matomo,piwik,analytics,statistics,stats,tracking,ecommerce
5
- Requires at least: 4.8
6
- Tested up to: 5.3
7
- Stable tag: 1.0.2
8
- Requires PHP: 7.2
9
- License: GPLv3 or later
10
- License URI: https://www.gnu.org/licenses/gpl-3.0.html
11
-
12
- The #1 Google Analytics alternative that gives you full control over your data and protects the privacy for your users. Free, secure and open.
13
-
14
- == Description ==
15
-
16
- For all you WordPress website owners wanting an easier way to get customer insights to grow your business, you can now get the solution the professionals use, for free!
17
-
18
- Matomo Analytics is the #1 used Google Analytics alternative that offers a powerful range of features, security and protects the privacy of your users. This enables you to learn how to improve your website, make the right decisions for your business and stand out in the crowd in a safe and trustworthy way.
19
-
20
- Matomo’s mission is to give control and data ownership back to the user. By hosting web analytics on your own servers there’s no third-parties taking ownership, no on-selling of data and no-one looking in. This means when you install Matomo in a matter of a few clicks, you’re in full control.
21
-
22
- It’s also easier for you to get insights from Matomo Analytics with it’s time-saving interface design and out-of-the-box features, which require less manual configuration than Google Analytics.
23
-
24
- Matomo is free, secure and open - your ethical user insights platform.
25
-
26
- **How Matomo Analytics for Wordpress solves problems:**
27
-
28
- * 100% data ownership, no one else can see your data
29
- * Super easy to install. No coding or technical knowledge needed #nocode
30
- * Free to use forever
31
- * Designed to save you time as an out-of-box solution (including many Ecommerce stores)
32
- * Protects the privacy of your users
33
- * GDPR Manager
34
- * No data sampling
35
- * Opportunities to extend with an ever-growing marketplace
36
- * Supports over 50 languages
37
- * Comes equipped with Matomo Tag Manager
38
-
39
- **How Matomo focuses on privacy:**
40
- * Superb user privacy protection
41
- * Heaps of features to anonymise data and IP addresses
42
- * WP shortcode to embed an opt-out feature into your website
43
- * Features to export and delete data for GDPR
44
- * Ability to configure data retention
45
-
46
- **Ultimately, Matomo lets you:** learn who your customers are and their needs; understand what content works and how engaged your audience is; identify which marketing channels give you the highest ROI and invest with confidence in channels that convert for your business; and discover blockages and fix pain points for confused visitors to ensure they become satisfied customers.
47
-
48
- **Features include:**
49
- * Ecommerce features
50
- * Campaign tracking
51
- * Visitor profiles
52
- * Tag Manager
53
- * Dashboards
54
- * Segmentation
55
- * Real time reports
56
- * Transitions
57
- * Extensive geolocation reports / maps
58
- * Many different visualisations
59
- * Row evolution
60
- * Report comparisons
61
- * Export features
62
- * Movers and Shakers to see the most drastic changes within a given time period
63
- * Supports WP Rest API
64
- * And hundreds of other features
65
- * Easily give your colleagues access to your reports if / when needed
66
- * Easily exclude certain roles, visitors and pages from being tracked
67
- * Supports WordPress Multisite. (Note: Tag Manager feature does not work in MultiSite.)
68
-
69
- **[Premium paid features:](https://plugins.matomo.org/premium?wp=1)**
70
- * Heatmaps & Session Recordings
71
- * Form Analytics
72
- * Media Analytics
73
- * Funnels
74
- * SEO features - Keyword rankings
75
- * Custom reporting
76
- * Cohorts
77
- * Users flow
78
-
79
- **Prerequisites and technical requirements:**
80
-
81
- Running Matomo Analytics on your server can use significant resources. Whenever someone visits your WordPress website, your server will need to serve your WordPress pages to the user, as well as tracking the user journey in Matomo, resulting in an additional request for each page view.
82
-
83
- * The minimum PHP memory limit is 128Mb but we recommend to use a higher limit (memory_limit = 256M).
84
- * PHP 7.0 at minimum is required.
85
- * If you have high traffic website, or manage a lot of websites with WordPress MultiSite, we recommend installing [Matomo On-Premise](https://matomo.org/docs/installation/) or signup to [Matomo Cloud](https://matomo.org/hosting/) and install the [WP-Matomo plugin](https://wordpress.org/plugins/wp-piwik/) instead.
86
- * Needing to know more before you install? Have a [read through the most popular FAQs to ensure you’re making the right choice for you](https://matomo.org/faq/wordpress/what-are-the-requirements-for-matomo-for-wordpress/).
87
-
88
- Over 1 million websites in over 190 countries are using Matomo already. Join the revolution too! Install Matomo on your Wordpress website completely free and take back full control of your data!
89
-
90
- **Third party resources we use:**
91
- * After activating this plugin, it will download a Geolocation database (DBIP-City.mmdb) from [DB IP](https://db-ip.com/db/download/ip-to-city-lite?refid=mtm) into your uploads directory. The DB-IP database is distributed under the [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/). This database is needed to detect the location of your visitors based on their IP.
92
- * When you enter a URL in the SEO ranking widget, then a request with the entered URL may be sent to Google, Alexa, Bing, and other SEO providers.
93
-
94
- == Installation ==
95
- * Install & activate the plugin.
96
- * Go to "Matomo Analytics" in the WordPress Admin Dashboard.
97
- * Click on "Activate tracking" in the "Get started" page.
98
- * That's it! You can further customize the tracking in the settings page.
99
-
100
- == Frequently Asked Questions ==
101
-
102
- = Is there a demo available?
103
- Yes, check out the online demo for Matomo at https://demo.matomo.org
104
-
105
- = Does Matomo care about security?
106
- Security is a top priority at Matomo. As potential issues are discovered, we validate, patch and release fixes as quickly as we can. We have a security bug bounty program in place that rewards researchers for finding security issues and disclosing them to us.
107
- [Learn more](https://matomo.org/security/) or check out our [HackerOne program](https://hackerone.com/matomo).
108
-
109
- = How can I get involved?
110
- We believe in liberating Web Analytics, providing a free platform for simple and advanced analytics. Matomo was built by dozens of people like you,
111
- and we need your help to make Matomo better… Why not participate in a useful project today? [Learn how you can contribute to Matomo.](https://matomo.org/get-involved)
112
-
113
- = How do you ensure quality?
114
- The Matomo project uses an ever-expanding comprehensive set of thousands of unit tests and hundreds of automated integration tests, system tests, JavaScript tests, and screenshot UI tests, running on a continuous integration server as part of its software quality assurance. [Learn more](https://developer.matomo.org/guides/tests)
115
-
116
- = Can I disable the Tag Manager?
117
- The Tag Manager can be disabled by placing `define('MATOMO_ENABLE_TAG_MANAGER', false);` in your `wp-config.php`.
118
-
119
- The Tag Manager does currently not work in WP Multisite mode.
120
-
121
- = Which MySQL versions are supported?
122
- Matomo should run on most MySQL versions. However, we only support MySQL 5.1 and newer. It should also work with MariaDB and other MySQL compatible databases.
123
-
124
- = Which browsers do you support?
125
- * Tracking: We support pretty much all browsers even very old browsers
126
- * Admin: The Matomo UI does not support IE9 or older.
127
-
128
- = What are your contact details?
129
- Website: [matomo.org](https://matomo.org)
130
- About us: [matomo.org/team/](https://matomo.org/team/)
131
- Contact us: [matomo.org/contact/](https://matomo.org/contact/)
132
-
133
- = Where do I find all other available FAQs? =
134
-
135
- Needing to know more? [Click here to view all of our FAQs on our website](https://matomo.org/faq/wordpress/)
136
-
137
- == Credits ==
138
-
139
- * The entire Matomo team and everyone who contributed
140
- * Andr&eacute; Br&auml;kling who is the Author of the [WP-Matomo plugin](https://github.com/braekling/WP-Matomo)
141
-
142
- == Screenshots ==
143
-
144
- 1. Customizable Matomo Dashboard. Choose from many widgets and adjust layout.
145
- 2. Visits log. See every action your visitors took.
146
- 3. Behaviour insights.
147
- 4. Acquisition insights.
148
- 5. Ecommerce insights.
149
- 6. Configure tracking code without developer knowledge.
150
- 7. Easily give your co-workers access to your Matomo reports.
151
- 8. Define who and what should not be tracked.
152
- 9. Options to anonymize data so you don't track personal data.
153
- 10. Automatically delete old data you no longer need to be privacy compliant and to free your server from not needed data.
154
- 11. Summary page for getting a quick overview.
 
 
 
 
 
 
1
+ === Matomo Analytics - Ethical Stats. Powerful Insights. ===
2
+ Contributors: matomoteam
3
+ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5EJ2LHATAKCJ4&source=url
4
+ Tags: matomo,piwik,analytics,statistics,stats,tracking,ecommerce
5
+ Requires at least: 4.8
6
+ Tested up to: 5.4
7
+ Stable tag: 1.0.3
8
+ Requires PHP: 7.2
9
+ License: GPLv3 or later
10
+ License URI: https://www.gnu.org/licenses/gpl-3.0.html
11
+
12
+ Matomo is the #1 Google Analytics alternative that gives you full control over your data and protects user privacy. Free, secure, and open.
13
+
14
+ == Description ==
15
+
16
+ For all you WordPress website owners wanting an easier way to get customer insights to grow your business, you can now get the solution the professionals use, for free!
17
+
18
+ Matomo Analytics is the #1 used Google Analytics alternative that offers a powerful range of features, security and protects the privacy of your users. This enables you to learn how to improve your website, make the right decisions for your business and stand out in the crowd in a safe and trustworthy way.
19
+
20
+ Matomo’s mission is to give control and data ownership back to the user. By hosting web analytics on your own servers there’s no third-parties taking ownership, no on-selling of data and no-one looking in. This means when you install Matomo in a matter of a few clicks, you’re in full control.
21
+
22
+ It’s also easier for you to get insights from Matomo Analytics with it’s time-saving interface design and out-of-the-box features, which require less manual configuration than Google Analytics.
23
+
24
+ Matomo is free, secure and open - your ethical user insights platform.
25
+
26
+ [youtube https://www.youtube.com/watch?v=puxi_Ey0iLc]
27
+
28
+ **How Matomo Analytics for Wordpress solves problems:**
29
+
30
+ * 100% data ownership, no one else can see your data
31
+ * Super easy to install. No coding or technical knowledge needed #nocode
32
+ * Free to use forever
33
+ * Designed to save you time as an out-of-box solution (including many Ecommerce stores)
34
+ * Protects the privacy of your users
35
+ * GDPR Manager
36
+ * No data sampling
37
+ * Opportunities to extend with an ever-growing marketplace
38
+ * Supports over 50 languages
39
+ * Comes equipped with Matomo Tag Manager
40
+
41
+ **How Matomo focuses on privacy:**
42
+
43
+ * Superb user privacy protection
44
+ * Heaps of features to anonymize data and IP addresses
45
+ * WP shortcode to embed an opt-out feature into your website
46
+ * Features to export and delete data for GDPR
47
+ * Ability to configure data retention
48
+
49
+ **Ultimately, Matomo lets you:** learn who your customers are and their needs; understand what content works and how engaged your audience is; identify which marketing channels give you the highest ROI and invest with confidence in channels that convert for your business; and discover blockages and fix pain points for confused visitors to ensure they become satisfied customers.
50
+
51
+ **Features include:**
52
+
53
+ * Ecommerce features
54
+ * Campaign tracking
55
+ * Visitor profiles
56
+ * Tag Manager
57
+ * Dashboards
58
+ * Segmentation
59
+ * Real time reports
60
+ * Transitions
61
+ * Extensive geolocation reports / maps
62
+ * Many different visualisations
63
+ * Row evolution
64
+ * Report comparisons
65
+ * Export features
66
+ * See the most drastic changes within a given time period
67
+ * Supports WP Rest API
68
+ * And hundreds of other features
69
+ * Easily give your colleagues access to your reports if / when needed
70
+ * Easily exclude certain roles, visitors and pages from being tracked
71
+ * Supports WordPress Multisite. (Note: Tag Manager feature does not work in MultiSite.)
72
+
73
+ **[Premium paid features:](https://plugins.matomo.org/premium?wp=1)**
74
+
75
+ * Heatmaps & Session Recordings
76
+ * Form Analytics
77
+ * Media Analytics
78
+ * Funnels
79
+ * SEO features - Keyword rankings
80
+ * Custom reporting
81
+ * Cohorts
82
+ * Users flow
83
+
84
+ **Prerequisites and technical requirements:**
85
+
86
+ Running Matomo Analytics on your server can use significant resources. Whenever someone visits your WordPress website, your server will need to serve your WordPress pages to the user, as well as tracking the user journey in Matomo, resulting in an additional request for each page view.
87
+
88
+ * The minimum PHP memory limit is 128Mb, but we recommend to use a higher limit (memory_limit = 256M).
89
+ * PHP 7.2 at minimum is required.
90
+ * If you have high traffic website, or manage a lot of websites with WordPress MultiSite, we recommend installing [Matomo On-Premise](https://matomo.org/docs/installation/) or signup to [Matomo Cloud](https://matomo.org/hosting/) and install the [WP-Matomo plugin](https://wordpress.org/plugins/wp-piwik/) instead.
91
+ * Needing to know more before you install? Have a [read through the most popular FAQs to ensure you’re making the right choice for you](https://matomo.org/faq/wordpress/what-are-the-requirements-for-matomo-for-wordpress/).
92
+
93
+ Over 1 million websites in over 190 countries are using Matomo already. Join the revolution too! Install Matomo on your Wordpress website completely free and take back full control of your data!
94
+
95
+ **Third party resources we use:**
96
+
97
+ * After activating this plugin, it will download a Geolocation database (DBIP-City.mmdb) from [DB IP](https://db-ip.com/db/download/ip-to-city-lite?refid=mtm) into your uploads directory. The DB-IP database is distributed under the [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/). This database is needed to detect the location of your visitors based on their IP.
98
+ * When you enter a URL in the SEO ranking widget, then a request with the entered URL may be sent to Google, Alexa, Bing, and other SEO providers.
99
+
100
+ == Installation ==
101
+ * Install & activate the plugin.
102
+ * Go to "Matomo Analytics" in the WordPress Admin Dashboard.
103
+ * Click on "Activate tracking" in the "Get started" page.
104
+ * That's it! You can further customize the tracking in the settings page.
105
+
106
+ == Frequently Asked Questions ==
107
+
108
+ = Is there a demo available?
109
+ Yes, check out the online demo for Matomo at [demo.matomo.org](https://demo.matomo.org)
110
+
111
+ = Does Matomo care about security?
112
+ Security is a top priority at Matomo. As potential issues are discovered, we validate, patch and release fixes as quickly as we can. We have a security bug bounty program in place that rewards researchers for finding security issues and disclosing them to us.
113
+ [Learn more](https://matomo.org/security/) or check out our [HackerOne program](https://hackerone.com/matomo).
114
+
115
+ = How can I get involved?
116
+ We believe in liberating Web Analytics, providing a free platform for simple and advanced analytics. Matomo was built by dozens of people like you,
117
+ and we need your help to make Matomo better… Why not participate in a useful project today? [Learn how you can contribute to Matomo.](https://matomo.org/get-involved)
118
+
119
+ = How do you ensure quality?
120
+ The Matomo project uses an ever-expanding comprehensive set of thousands of unit tests and hundreds of automated integration tests, system tests, JavaScript tests, and screenshot UI tests, running on a continuous integration server as part of its software quality assurance. [Learn more](https://developer.matomo.org/guides/tests)
121
+
122
+ = Can I disable the Tag Manager?
123
+ The Tag Manager can be disabled by placing `define('MATOMO_ENABLE_TAG_MANAGER', false);` in your `wp-config.php`.
124
+
125
+ The Tag Manager does currently not work in WP Multisite mode.
126
+
127
+ = Which MySQL versions are supported?
128
+ Matomo should run on most MySQL versions. However, we only support MySQL 5.5 and newer. It should also work with MariaDB and other MySQL compatible databases.
129
+
130
+ = Which browsers do you support?
131
+ * Tracking: We support pretty much all browsers even very old browsers
132
+ * Admin: The Matomo UI does not support IE9 or older.
133
+
134
+ = What are your contact details?
135
+ Website: [matomo.org](https://matomo.org)
136
+ About us: [matomo.org/team/](https://matomo.org/team/)
137
+ Contact us: [matomo.org/contact/](https://matomo.org/contact/)
138
+
139
+ = Where do I find all other available FAQs? =
140
+
141
+ Needing to know more? [Click here to view all of our FAQs on our website](https://matomo.org/faq/wordpress/)
142
+
143
+ == Credits ==
144
+
145
+ * The entire Matomo team and everyone who contributed
146
+ * Andr&eacute; Br&auml;kling who is the Author of the [WP-Matomo plugin](https://github.com/braekling/WP-Matomo)
147
+
148
+ == Screenshots ==
149
+
150
+ 1. Customizable Matomo Dashboard. Choose from many widgets and adjust layout.
151
+ 2. Visits log. See every action your visitors took.
152
+ 3. Behaviour insights.
153
+ 4. Acquisition insights.
154
+ 5. Ecommerce insights.
155
+ 6. Configure tracking code without developer knowledge.
156
+ 7. Easily give your co-workers access to your Matomo reports.
157
+ 8. Define who and what should not be tracked.
158
+ 9. Options to anonymize data so you don't track personal data.
159
+ 10. Automatically delete old data you no longer need to be privacy compliant and to free your server from not needed data.
160
+ 11. Summary page for getting a quick overview.