From 5361d919d2ed5d0540ff432683203ddc44a9eb66 Mon Sep 17 00:00:00 2001 From: Alexander Kellner Date: Fri, 26 Jul 2024 23:25:46 +0200 Subject: [PATCH] [FEATURE] Add push service in JavaScript for virtual page visits and searches On some pages with multiple pages that do only exist via JavaScript or for sliders, accordions, etc... it can be useful to push an individual path via JavaScript. That can be done now via: ``` const lux = LuxSingleton.getInstance(); lux.push('page/step1', 'virtualPageRequest'); ``` With the same commit, we can now also push searchterms via JavaScript. This is helpful if the searchword is not delivered as GET parameter (e.g. with an AJAX searchresult page, etc...). This can be done now via: ``` const lux = LuxSingleton.getInstance(); lux.push('any searchterm', 'searchRequest'); ``` --- Classes/Controller/FrontendController.php | 115 +++++++++++++----- Classes/Domain/LogEventListeners/Log.php | 12 ++ Classes/Domain/Model/Log.php | 6 + Classes/Domain/Service/LogService.php | 12 ++ Classes/Domain/Tracker/DownloadTracker.php | 4 +- Classes/Domain/Tracker/LinkClickTracker.php | 4 +- Classes/Domain/Tracker/NewsTracker.php | 4 +- Classes/Domain/Tracker/PageTracker.php | 4 +- Classes/Domain/Tracker/SearchTracker.php | 37 ++++-- Classes/Domain/Tracker/UtmTracker.php | 4 +- Classes/Domain/Tracker/VirtualPageTracker.php | 23 ++++ .../Events/Log/VirtualPageTrackerEvent.php | 35 ++++++ Configuration/Services.yaml | 4 + .../Lux/01_TrackingConfiguration.typoscript | 2 +- Documentation/Technical/Analysis/Index.md | 33 ++++- .../Private/Build/JavaScript/Frontend/Lux.js | 24 ++++ .../Private/Language/de.locallang_db.xlf | 4 + Resources/Private/Language/locallang_db.xlf | 3 + .../Partials/Box/Miscellaneous/Log.html | 6 + Resources/Public/JavaScript/Lux/Lux.min.js | 2 +- 20 files changed, 274 insertions(+), 64 deletions(-) create mode 100644 Classes/Domain/Tracker/VirtualPageTracker.php create mode 100644 Classes/Events/Log/VirtualPageTrackerEvent.php diff --git a/Classes/Controller/FrontendController.php b/Classes/Controller/FrontendController.php index 433af8c6..3c1ae339 100644 --- a/Classes/Controller/FrontendController.php +++ b/Classes/Controller/FrontendController.php @@ -7,6 +7,7 @@ use Doctrine\DBAL\Exception as ExceptionDbal; use In2code\Lux\Domain\Factory\VisitorFactory; use In2code\Lux\Domain\Model\Visitor; +use In2code\Lux\Domain\Repository\PagevisitRepository; use In2code\Lux\Domain\Service\ConfigurationService; use In2code\Lux\Domain\Service\Email\SendAssetEmail4LinkService; use In2code\Lux\Domain\Tracker\AbTestingTracker; @@ -19,6 +20,7 @@ use In2code\Lux\Domain\Tracker\NewsTracker; use In2code\Lux\Domain\Tracker\PageTracker; use In2code\Lux\Domain\Tracker\SearchTracker; +use In2code\Lux\Domain\Tracker\VirtualPageTracker; use In2code\Lux\Events\AfterTrackingEvent; use In2code\Lux\Exception\ActionNotAllowedException; use In2code\Lux\Exception\ConfigurationException; @@ -41,11 +43,44 @@ class FrontendController extends ActionController { + protected ConfigurationService $configurationService; + protected CompanyTracker $companyTracker; + protected PageTracker $pageTracker; + protected VirtualPageTracker $virtualPageTracker; + protected NewsTracker $newsTracker; + protected SearchTracker $searchTracker; protected $eventDispatcher; protected LoggerInterface $logger; + protected array $allowedActions = [ + 'pageRequest', + 'virtualPageRequest', + 'searchRequest', + 'fieldListeningRequest', + 'formListeningRequest', + 'email4LinkRequest', + 'downloadRequest', + 'linkClickRequest', + 'redirectRequest', + 'abTestingRequest', + 'abTestingConversionFulfilledRequest', + ]; - public function __construct(EventDispatcherInterface $eventDispatcher, LoggerInterface $logger) - { + public function __construct( + ConfigurationService $configurationService, + CompanyTracker $companyTracker, + PageTracker $pageTracker, + VirtualPageTracker $virtualPageTracker, + NewsTracker $newsTracker, + SearchTracker $searchTracker, + EventDispatcherInterface $eventDispatcher, + LoggerInterface $logger + ) { + $this->configurationService = $configurationService; + $this->companyTracker = $companyTracker; + $this->pageTracker = $pageTracker; + $this->virtualPageTracker = $virtualPageTracker; + $this->newsTracker = $newsTracker; + $this->searchTracker = $searchTracker; $this->eventDispatcher = $eventDispatcher; $this->logger = $logger; } @@ -57,19 +92,8 @@ public function __construct(EventDispatcherInterface $eventDispatcher, LoggerInt */ public function initializeDispatchRequestAction(): void { - $allowedActions = [ - 'pageRequest', - 'fieldListeningRequest', - 'formListeningRequest', - 'email4LinkRequest', - 'downloadRequest', - 'linkClickRequest', - 'redirectRequest', - 'abTestingRequest', - 'abTestingConversionFulfilledRequest', - ]; $action = $this->request->getArgument('dispatchAction'); - if (!in_array($action, $allowedActions)) { + if (!in_array($action, $this->allowedActions)) { throw new ActionNotAllowedException('Action not allowed', 1518815149); } } @@ -87,8 +111,7 @@ public function dispatchRequestAction( string $identificator, array $arguments ): ResponseInterface { - $configurationService = GeneralUtility::makeInstance(ConfigurationService::class); - if ($configurationService->getTypoScriptSettingsByPath('general.enable') !== '0') { + if ($this->configurationService->getTypoScriptSettingsByPath('general.enable') !== '0') { return (new ForwardResponse($dispatchAction)) ->withArguments(['identificator' => $identificator, 'arguments' => $arguments]); } @@ -106,14 +129,50 @@ public function pageRequestAction(string $identificator, array $arguments): Resp try { $visitor = $this->getVisitor($identificator); $this->callAdditionalTrackers($visitor, $arguments); - $companyTracker = GeneralUtility::makeInstance(CompanyTracker::class); - $companyTracker->track($visitor); - $pageTracker = GeneralUtility::makeInstance(PageTracker::class); - $pagevisit = $pageTracker->track($visitor, $arguments); - $newsTracker = GeneralUtility::makeInstance(NewsTracker::class); - $newsTracker->track($visitor, $arguments, $pagevisit); - $searchTracker = GeneralUtility::makeInstance(SearchTracker::class); - $searchTracker->track($visitor, $arguments, $pagevisit); + $this->companyTracker->track($visitor); + $pagevisit = $this->pageTracker->track($visitor, $arguments); + $this->newsTracker->track($visitor, $arguments, $pagevisit); + $this->searchTracker->track($visitor, $arguments, $pagevisit); + return $this->jsonResponse(json_encode($this->afterAction($visitor))); + } catch (Throwable $exception) { + return $this->jsonResponse(json_encode($this->getError($exception))); + } + } + + /** + * Is typically called manually in own JavaScript + * + * @param string $identificator + * @param array $arguments + * @return ResponseInterface + * @noinspection PhpUnused + */ + public function virtualPageRequestAction(string $identificator, array $arguments): ResponseInterface + { + try { + $visitor = $this->getVisitor($identificator); + $this->virtualPageTracker->track($visitor, $arguments); + return $this->jsonResponse(json_encode($this->afterAction($visitor))); + } catch (Throwable $exception) { + return $this->jsonResponse(json_encode($this->getError($exception))); + } + } + + /** + * Is typically called manually in own JavaScript + * + * @param string $identificator + * @param array $arguments + * @return ResponseInterface + * @noinspection PhpUnused + */ + public function searchRequestAction(string $identificator, array $arguments): ResponseInterface + { + try { + $visitor = $this->getVisitor($identificator); + $pagevisitRepository = GeneralUtility::makeInstance(PagevisitRepository::class); + $pagevisit = $pagevisitRepository->findByUid((int)$arguments['pageUid']); + $this->searchTracker->track($visitor, $arguments, $pagevisit); return $this->jsonResponse(json_encode($this->afterAction($visitor))); } catch (Throwable $exception) { return $this->jsonResponse(json_encode($this->getError($exception))); @@ -389,17 +448,13 @@ protected function callAdditionalTrackers(Visitor $visitor, array $arguments): v protected function afterAction(Visitor $visitor): array { /** @var AfterTrackingEvent $event */ - $event = $this->eventDispatcher->dispatch( - GeneralUtility::makeInstance(AfterTrackingEvent::class, $visitor, $this->actionMethodName) - ); + $event = $this->eventDispatcher->dispatch(new AfterTrackingEvent($visitor, $this->actionMethodName)); return $event->getResults(); } protected function getError(Throwable $exception): array { - $this->eventDispatcher->dispatch( - GeneralUtility::makeInstance(AfterTrackingEvent::class, new Visitor(), 'error', ['error' => $exception]) - ); + $this->eventDispatcher->dispatch(new AfterTrackingEvent(new Visitor(), 'error', ['error' => $exception])); if (BackendUtility::isBackendAuthentication() === false) { // Log error to var/log/typo3_[hash].log $this->logger->warning('Error in FrontendController happened', [ diff --git a/Classes/Domain/LogEventListeners/Log.php b/Classes/Domain/LogEventListeners/Log.php index e91143e3..34005aeb 100644 --- a/Classes/Domain/LogEventListeners/Log.php +++ b/Classes/Domain/LogEventListeners/Log.php @@ -16,6 +16,7 @@ use In2code\Lux\Events\Log\LogVisitorIdentifiedByLuxletterlinkEvent; use In2code\Lux\Events\Log\SearchEvent; use In2code\Lux\Events\Log\UtmEvent; +use In2code\Lux\Events\Log\VirtualPageTrackerEvent; use TYPO3\CMS\Core\SingletonInterface; use TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException; use TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException; @@ -121,6 +122,17 @@ public function logEmail4LinkEmailFailed(LogEmail4linkSendEmailFailedEvent $even $this->logService->logEmail4LinkEmailFailed($event->getVisitor(), $event->getHref()); } + /** + * @param VirtualPageTrackerEvent $event + * @return void + * @throws IllegalObjectTypeException + * @throws UnknownObjectException + */ + public function logVirtualPageRequest(VirtualPageTrackerEvent $event): void + { + $this->logService->logVirtualPageRequest($event->getVisitor(), $event->getParameter()); + } + /** * @param DownloadEvent $event * @return void diff --git a/Classes/Domain/Model/Log.php b/Classes/Domain/Model/Log.php index 48c41fab..270bf4a6 100644 --- a/Classes/Domain/Model/Log.php +++ b/Classes/Domain/Model/Log.php @@ -31,6 +31,7 @@ class Log extends AbstractModel public const STATUS_PAGEVISIT3 = 41; public const STATUS_PAGEVISIT4 = 42; public const STATUS_PAGEVISIT5 = 43; + public const STATUS_VIRTUALPAGEVISIT = 48; public const STATUS_DOWNLOAD = 50; public const STATUS_SEARCH = 55; public const STATUS_ACTION = 60; @@ -166,6 +167,11 @@ public function getSearch(): ?Search return $searchRepository->findByIdentifier($searchUid); } + public function getVirtualPath(): string + { + return $this->getPropertyByKey('virtualPath'); + } + public function getLinklistener(): ?Linklistener { $linklistenerUid = (int)$this->getPropertyByKey('linklistener'); diff --git a/Classes/Domain/Service/LogService.php b/Classes/Domain/Service/LogService.php index 55d717d5..7fb61fec 100644 --- a/Classes/Domain/Service/LogService.php +++ b/Classes/Domain/Service/LogService.php @@ -114,6 +114,18 @@ public function logEmail4LinkEmailFailed(Visitor $visitor, string $href): void $this->log(Log::STATUS_IDENTIFIED_EMAIL4LINK_SENDEMAILFAILED, $visitor, ['href' => $href]); } + /** + * @param Visitor $visitor + * @param string $parameter + * @return void + * @throws IllegalObjectTypeException + * @throws UnknownObjectException + */ + public function logVirtualPageRequest(Visitor $visitor, string $parameter): void + { + $this->log(Log::STATUS_VIRTUALPAGEVISIT, $visitor, ['virtualPath' => $parameter]); + } + /** * @param Download $download * @return void diff --git a/Classes/Domain/Tracker/DownloadTracker.php b/Classes/Domain/Tracker/DownloadTracker.php index 59b478ee..5939af3f 100644 --- a/Classes/Domain/Tracker/DownloadTracker.php +++ b/Classes/Domain/Tracker/DownloadTracker.php @@ -50,9 +50,7 @@ public function addDownload(string $href, int $pageIdentifier): void $download->setVisitor($this->visitor); $this->visitorRepository->update($this->visitor); $this->visitorRepository->persistAll(); - $this->eventDispatcher->dispatch( - GeneralUtility::makeInstance(DownloadEvent::class, $this->visitor, $download) - ); + $this->eventDispatcher->dispatch(new DownloadEvent($this->visitor, $download)); } } diff --git a/Classes/Domain/Tracker/LinkClickTracker.php b/Classes/Domain/Tracker/LinkClickTracker.php index 57cabd1e..e92ef659 100644 --- a/Classes/Domain/Tracker/LinkClickTracker.php +++ b/Classes/Domain/Tracker/LinkClickTracker.php @@ -60,9 +60,7 @@ public function addLinkClick(int $linkclickIdentifier, int $pageUid): void $this->linkclickRepository->add($linkclick); $this->linkclickRepository->persistAll(); - $this->eventDispatcher->dispatch( - GeneralUtility::makeInstance(LinkClickEvent::class, $this->visitor, $linklistener, $pageUid) - ); + $this->eventDispatcher->dispatch(new LinkClickEvent($this->visitor, $linklistener, $pageUid)); } } } diff --git a/Classes/Domain/Tracker/NewsTracker.php b/Classes/Domain/Tracker/NewsTracker.php index 4957f4c8..6f717d2c 100644 --- a/Classes/Domain/Tracker/NewsTracker.php +++ b/Classes/Domain/Tracker/NewsTracker.php @@ -49,9 +49,7 @@ public function track(Visitor $visitor, array $arguments, Pagevisit $pagevisit = $visitor->addNewsvisit($newsvisit); $this->visitorRepository->update($visitor); $this->visitorRepository->persistAll(); - $this->eventDispatcher->dispatch( - GeneralUtility::makeInstance(NewsTrackerEvent::class, $visitor, $newsvisit, $arguments) - ); + $this->eventDispatcher->dispatch(new NewsTrackerEvent($visitor, $newsvisit, $arguments)); } } diff --git a/Classes/Domain/Tracker/PageTracker.php b/Classes/Domain/Tracker/PageTracker.php index afc10eb8..0c30663c 100644 --- a/Classes/Domain/Tracker/PageTracker.php +++ b/Classes/Domain/Tracker/PageTracker.php @@ -52,9 +52,7 @@ public function track(Visitor $visitor, array $arguments): ?Pagevisit $visitor->setVisits($visitor->getNumberOfUniquePagevisits()); $this->visitorRepository->update($visitor); $this->visitorRepository->persistAll(); - $this->eventDispatcher->dispatch( - GeneralUtility::makeInstance(PageTrackerEvent::class, $visitor, $pagevisit, $arguments) - ); + $this->eventDispatcher->dispatch(new PageTrackerEvent($visitor, $pagevisit, $arguments)); return $pagevisit; } return null; diff --git a/Classes/Domain/Tracker/SearchTracker.php b/Classes/Domain/Tracker/SearchTracker.php index 8bc89ed1..cae19d46 100644 --- a/Classes/Domain/Tracker/SearchTracker.php +++ b/Classes/Domain/Tracker/SearchTracker.php @@ -43,29 +43,27 @@ public function __construct(VisitorRepository $visitorRepository, EventDispatche public function track(Visitor $visitor, array $arguments, Pagevisit $pagevisit = null): void { if ($this->isTrackingActivated($visitor, $arguments)) { - $searchTerm = $this->getSearchTerm($arguments['currentUrl']); $queryBuilder = DatabaseUtility::getQueryBuilderForTable(Search::TABLE_NAME); $properties = [ - 'searchterm' => $searchTerm, + 'searchterm' => $this->getSearchTerm($arguments), 'visitor' => $visitor->getUid(), 'crdate' => time(), 'tstamp' => time(), + 'sys_language_uid' => -1, ]; if ($pagevisit !== null) { $properties['pagevisit'] = $pagevisit->getUid(); } $queryBuilder->insert(Search::TABLE_NAME)->values($properties)->executeStatement(); $searchUid = $queryBuilder->getConnection()->lastInsertId(); - $this->eventDispatcher->dispatch( - GeneralUtility::makeInstance(SearchEvent::class, $visitor, (int)$searchUid) - ); + $this->eventDispatcher->dispatch(new SearchEvent($visitor, (int)$searchUid)); } } protected function isTrackingActivated(Visitor $visitor, array $arguments): bool { return $visitor->isNotBlacklisted() && $this->isTrackingActivatedInSettings() - && $this->isSearchTermGiven($arguments['currentUrl']); + && $this->isAnySearchTermGiven($arguments); } /** @@ -75,22 +73,37 @@ protected function isTrackingActivated(Visitor $visitor, array $arguments): bool */ protected function isTrackingActivatedInSettings(): bool { - return !empty($this->settings['tracking']['search']['_enable']) - && $this->settings['tracking']['search']['_enable'] === '1'; + return ($this->settings['tracking']['search']['_enable'] ?? false) === '1'; + } + + protected function isAnySearchTermGiven(array $arguments): bool + { + return $this->getSearchTerm($arguments) !== ''; + } + + protected function getSearchTerm(array $arguments): string + { + if (isset($arguments['parameter'])) { + return $arguments['parameter']; + } + if ($this->isSearchTermGivenInUrl($arguments['currentUrl'])) { + return $this->getSearchTermFromUrl($arguments['currentUrl']); + } + return ''; } - protected function isSearchTermGiven(string $currentUrl): bool + protected function isSearchTermGivenInUrl(string $currentUrl): bool { - return $this->getSearchTerm($currentUrl) !== ''; + return $this->getSearchTermFromUrl($currentUrl) !== ''; } /** - * Read the searchterm from URL GET parameters + * Read searchterm from URL GET parameters * * @param string $currentUrl * @return string */ - protected function getSearchTerm(string $currentUrl): string + protected function getSearchTermFromUrl(string $currentUrl): string { $parsed = parse_url($currentUrl); if (!empty($parsed['query']) && !empty($this->settings['tracking']['search']['getParameters'])) { diff --git a/Classes/Domain/Tracker/UtmTracker.php b/Classes/Domain/Tracker/UtmTracker.php index d459620e..ae8f9a75 100644 --- a/Classes/Domain/Tracker/UtmTracker.php +++ b/Classes/Domain/Tracker/UtmTracker.php @@ -41,7 +41,7 @@ public function trackPage(PageTrackerEvent $event): void try { $this->utmRepository->add($utm); $this->utmRepository->persistAll(); - $this->eventDispatcher->dispatch(GeneralUtility::makeInstance(UtmEvent::class, $utm)); + $this->eventDispatcher->dispatch(new UtmEvent($utm)); } catch (Throwable $exception) { // Do nothing } @@ -56,7 +56,7 @@ public function trackNews(NewsTrackerEvent $event): void try { $this->utmRepository->add($utm); $this->utmRepository->persistAll(); - $this->eventDispatcher->dispatch(GeneralUtility::makeInstance(UtmEvent::class, $utm)); + $this->eventDispatcher->dispatch(new UtmEvent($utm)); } catch (Throwable $exception) { // Do nothing } diff --git a/Classes/Domain/Tracker/VirtualPageTracker.php b/Classes/Domain/Tracker/VirtualPageTracker.php new file mode 100644 index 00000000..429ecedf --- /dev/null +++ b/Classes/Domain/Tracker/VirtualPageTracker.php @@ -0,0 +1,23 @@ +eventDispatcher = $eventDispatcher; + } + + public function track(Visitor $visitor, array $arguments) + { + $this->eventDispatcher->dispatch(new VirtualPageTrackerEvent($visitor, $arguments['parameter'], $arguments)); + } +} diff --git a/Classes/Events/Log/VirtualPageTrackerEvent.php b/Classes/Events/Log/VirtualPageTrackerEvent.php new file mode 100644 index 00000000..155433b9 --- /dev/null +++ b/Classes/Events/Log/VirtualPageTrackerEvent.php @@ -0,0 +1,35 @@ +visitor = $visitor; + $this->parameter = $parameter; + $this->arguments = $arguments; + } + + public function getVisitor(): Visitor + { + return $this->visitor; + } + + public function getParameter(): string + { + return $this->parameter; + } + + public function getArguments(): array + { + return $this->arguments; + } +} diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index 8ac40fbe..bf6ab82c 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -181,6 +181,10 @@ services: identifier: 'lux/logEmail4linkSendEmailFailedEvent' method: 'logEmail4LinkEmailFailed' event: In2code\Lux\Events\Log\LogEmail4linkSendEmailFailedEvent + - name: 'event.listener' + identifier: 'lux/logVirtualPageRequest' + method: 'logVirtualPageRequest' + event: In2code\Lux\Events\Log\VirtualPageTrackerEvent - name: 'event.listener' identifier: 'lux/logDownload' method: 'logDownload' diff --git a/Configuration/TypoScript/Lux/01_TrackingConfiguration.typoscript b/Configuration/TypoScript/Lux/01_TrackingConfiguration.typoscript index 1ec39e3d..a3eee585 100644 --- a/Configuration/TypoScript/Lux/01_TrackingConfiguration.typoscript +++ b/Configuration/TypoScript/Lux/01_TrackingConfiguration.typoscript @@ -24,7 +24,7 @@ lib.lux.settings { _enable = {$plugin.tx_lux.settings.tracking.search} # Define GET params for searchterms (e.g. "tx_solr[q]") - getParameters = tx_solr[q],tx_indexedsearch[sword],tx_indexedsearch_pi2[search][sword],tx_kesearch_pi1[sword] + getParameters = q,tx_solr[q],tx_indexedsearch[sword],tx_indexedsearch_pi2[search][sword],tx_kesearch_pi1[sword] } company { diff --git a/Documentation/Technical/Analysis/Index.md b/Documentation/Technical/Analysis/Index.md index 3f29da92..7e49d53e 100644 --- a/Documentation/Technical/Analysis/Index.md +++ b/Documentation/Technical/Analysis/Index.md @@ -117,11 +117,20 @@ lib.lux.settings { If you choose the content view (see top left to switch from dashboard to content), you will see the 100 most interesting pages and assets for your leads. - - Clicking on an asset or a page will open a detail page to this item, where you can exactly see which lead was interested in this item. + + +**Technical note:** Page visits will be automatically be tracked with LUX on normal TYPO3 pages. In some rare scenarios +you may want to push a virtual pagevisit to LUX. This can be helpful if you want to track accordion opens, multistep +forms or other content changes without page reload and without a different URL. You can push such a visit via JavaScript: + +``` +const lux = LuxSingleton.getInstance(); +lux.push('applicationProcess/step1', 'virtualPageRequest'); +``` + #### News If you have installed the great news extension (georgringer/news), then you can also choose this view. @@ -180,7 +189,7 @@ new Listener. That's all. Now all clicks on this link are tracked now. #### Search -With LUX 16 we started to introduce an own search view. +Searchterms can be tracked to improve search evaluation on your website. If there are entries in the search table, editors can see and click the search view button in analysis backend module. The view starts with a list of used searchterms of your websearch. @@ -189,11 +198,23 @@ You can use the filter on the top for a perfect analysis in a timeframe or for a a row in the table you will see the latest leads in a preview. If you click on "Show details" then, you will see all leads that used the search term. -**Note:** Websearch tracking is activated by default for solr, indexed_search and ke_search but can be extended or -modified in TypoScript configuration. - +To **track searchterms**, there are basically two different ways: + +1) Ensure, that there is a GET parameter in the current URL, that can be recognized by LUX. +Parameters for solr, indexed_search and ke_search are automatically configured. If you need an individual +parameter, you have to extend the TypoScript configuration. So e.g. a URL like +`https://website.com/?q=searchterm` or `https://website.com/?tx_solr[q]=searchterm` will automatically be tracked here. + +2) If you don't have the searchterm as GET parameter available in the URL, you can push a searchterm +via JavaScript manually to LUX. This can be e.g. helpful if your search results are only loaded via AJAX. +See this example how to push a searchterm via JS: +``` +const lux = LuxSingleton.getInstance(); +lux.push('any searchterm', 'searchRequest'); +``` + ### TYPO3 Dashboard Module diff --git a/Resources/Private/Build/JavaScript/Frontend/Lux.js b/Resources/Private/Build/JavaScript/Frontend/Lux.js index 83eac06a..56f36bc7 100644 --- a/Resources/Private/Build/JavaScript/Frontend/Lux.js +++ b/Resources/Private/Build/JavaScript/Frontend/Lux.js @@ -72,6 +72,30 @@ function LuxMain() { } }; + /** + * Allow to push virtual page requests or search requests to LUX + * + * @params {string} Any parameter. Typically, a virtual page like "antragsstrecke/step1" or searchterm like "product" + * @params {string} "virtualPageRequest" or "searchRequest" + * @returns {void} + * @api + */ + this.push = function(parameter, to) { + const parameters = { + 'tx_lux_fe[dispatchAction]': to || 'virtualPageRequest', + 'tx_lux_fe[identificator]': identification.getIdentificator(), + 'tx_lux_fe[arguments][pageUid]': getPageUid(), + 'tx_lux_fe[arguments][languageUid]': getLanguageUid(), + 'tx_lux_fe[arguments][referrer]': getReferrer(), + 'tx_lux_fe[arguments][currentUrl]': encodeURIComponent(window.location.href), + 'tx_lux_fe[arguments][parameter]': parameter || '[empty]', + }; + if (getNewsUid() > 0) { + parameters['tx_lux_fe[arguments][newsUid]'] = getNewsUid(); + } + ajaxConnection(parameters, getRequestUri(), 'generalWorkflowActionCallback', null); + }; + /** * Close any lightbox * diff --git a/Resources/Private/Language/de.locallang_db.xlf b/Resources/Private/Language/de.locallang_db.xlf index 94a2cfa5..1961df75 100644 --- a/Resources/Private/Language/de.locallang_db.xlf +++ b/Resources/Private/Language/de.locallang_db.xlf @@ -1103,6 +1103,10 @@ Fifth page visit Fรผnfter Seitenbesuch + + Virtual page visit + Virtueller Seitenbesuch + LUX tracked a download LUX hat einen Download aufgezeichnet diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf index 0ca0b58d..8da22b1f 100644 --- a/Resources/Private/Language/locallang_db.xlf +++ b/Resources/Private/Language/locallang_db.xlf @@ -834,6 +834,9 @@ Fifth page visit + + Virtual page visit + LUX tracked a download diff --git a/Resources/Private/Partials/Box/Miscellaneous/Log.html b/Resources/Private/Partials/Box/Miscellaneous/Log.html index a3f69083..f86afcf9 100644 --- a/Resources/Private/Partials/Box/Miscellaneous/Log.html +++ b/Resources/Private/Partials/Box/Miscellaneous/Log.html @@ -86,6 +86,12 @@

+ + "{log.virtualPath}" + + + + ({log.visitor.fullName}) diff --git a/Resources/Public/JavaScript/Lux/Lux.min.js b/Resources/Public/JavaScript/Lux/Lux.min.js index 0a345562..c3e9a046 100644 --- a/Resources/Public/JavaScript/Lux/Lux.min.js +++ b/Resources/Public/JavaScript/Lux/Lux.min.js @@ -1 +1 @@ -!function(){"use strict";function e(e,i){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var i=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=i){var n,a,o,r,l=[],u=!0,s=!1;try{if(o=(i=i.call(e)).next,0===t){if(Object(i)!==i)return;u=!1}else for(;!(u=(n=o.call(i)).done)&&(l.push(n.value),l.length!==t);u=!0);}catch(e){s=!0,a=e}finally{try{if(!u&&null!=i.return&&(r=i.return(),Object(r)!==r))return}finally{if(s)throw a}}return l}}(e,i)||t(e,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function t(e,t){if(e){if("string"==typeof e)return i(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i1&&void 0!==arguments[1]&&arguments[1],i=document.createElement("div");return i.innerHTML=e.trim(),!0===t?i.children:i.firstChild},a=function(e,t){var i=e.children;return 1===i.length&&i[0].tagName===t},o=function(e){return null!=(e=e||document.querySelector(".basicLightbox"))&&!0===e.ownerDocument.body.contains(e)};i.visible=o,i.create=function(e,t){var i=function(e,t){var i=n('\n\t\t
\n\t\t\t\n\t\t
\n\t')),o=i.querySelector(".basicLightbox__placeholder");e.forEach((function(e){return o.appendChild(e)}));var r=a(o,"IMG"),l=a(o,"VIDEO"),u=a(o,"IFRAME");return!0===r&&i.classList.add("basicLightbox--img"),!0===l&&i.classList.add("basicLightbox--video"),!0===u&&i.classList.add("basicLightbox--iframe"),i}(e=function(e){var t="string"==typeof e,i=e instanceof HTMLElement==1;if(!1===t&&!1===i)throw new Error("Content must be a DOM element/node or string");return!0===t?Array.from(n(e,!0)):"TEMPLATE"===e.tagName?[e.content.cloneNode(!0)]:Array.from(e.children)}(e),t=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(null==(e=Object.assign({},e)).closable&&(e.closable=!0),null==e.className&&(e.className=""),null==e.onShow&&(e.onShow=function(){}),null==e.onClose&&(e.onClose=function(){}),"boolean"!=typeof e.closable)throw new Error("Property `closable` must be a boolean");if("string"!=typeof e.className)throw new Error("Property `className` must be a string");if("function"!=typeof e.onShow)throw new Error("Property `onShow` must be a function");if("function"!=typeof e.onClose)throw new Error("Property `onClose` must be a function");return e}(t)),r=function(e){return!1!==t.onClose(l)&&function(e,t){return e.classList.remove("basicLightbox--visible"),setTimeout((function(){return!1===o(e)||e.parentElement.removeChild(e),t()}),410),!0}(i,(function(){if("function"==typeof e)return e(l)}))};!0===t.closable&&i.addEventListener("click",(function(e){e.target===i&&r()}));var l={element:function(){return i},visible:function(){return o(i)},show:function(e){return!1!==t.onShow(l)&&function(e,t){return document.body.appendChild(e),setTimeout((function(){requestAnimationFrame((function(){return e.classList.add("basicLightbox--visible"),t()}))}),10),!0}(i,(function(){if("function"==typeof e)return e(l)}))},close:r};return l}},{}]},{},[1])(1);var r={exports:{}};!function(e,t){!function(i,n){var a="function",o="undefined",r="object",l="string",u="major",s="model",c="name",d="type",f="vendor",g="version",h="architecture",m="console",p="mobile",b="tablet",w="smarttv",v="wearable",x="embedded",y="Amazon",A="Apple",T="ASUS",S="BlackBerry",k="Browser",C="Chrome",E="Firefox",O="Google",_="Huawei",B="LG",L="Microsoft",I="Motorola",M="Opera",D="Samsung",P="Sharp",N="Sony",R="Xiaomi",F="Zebra",U="Facebook",G="Chromium OS",H="Mac OS",V=function(e){for(var t={},i=0;i0?2===u.length?typeof u[1]==a?this[u[0]]=u[1].call(this,c):this[u[0]]=u[1]:3===u.length?typeof u[1]!==a||u[1].exec&&u[1].test?this[u[0]]=c?c.replace(u[1],u[2]):n:this[u[0]]=c?u[1].call(this,c,u[2]):n:4===u.length&&(this[u[0]]=c?u[3].call(this,c.replace(u[1],u[2])):n):this[u]=c||n;d+=2}},X=function(e,t){for(var i in t)if(typeof t[i]===r&&t[i].length>0){for(var a=0;a2&&(e[s]="iPad",e[d]=b),e},this.getEngine=function(){var e={};return e[c]=n,e[g]=n,z.call(e,w,x.engine),e},this.getOS=function(){var e={};return e[c]=n,e[g]=n,z.call(e,w,x.os),y&&!e[c]&&v&&"Unknown"!=v.platform&&(e[c]=v.platform.replace(/chrome os/i,G).replace(/macos/i,H)),e},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return w},this.setUA=function(e){return w=typeof e===l&&e.length>500?W(e,500):e,this},this.setUA(w),this};J.VERSION="0.7.37",J.BROWSER=V([c,g,u]),J.CPU=V([h]),J.DEVICE=V([s,f,d,m,p,w,b,v,x]),J.ENGINE=J.OS=V([c,g]),e.exports&&(t=e.exports=J),t.UAParser=J;var Y=typeof i!==o&&(i.jQuery||i.Zepto);if(Y&&!Y.ua){var $=new J;Y.ua=$.getResult(),Y.ua.get=function(){return $.getUA()},Y.ua.set=function(e){$.setUA(e);var t=$.getResult();for(var i in t)Y.ua[i]=t[i]}}}("object"==typeof window?window:n)}(r,r.exports);var l=r.exports,u={exports:{}};!function(e){var t,i;t=n,i=function(){void 0===Array.isArray&&(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)});var e=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]+t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]+t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]+t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]+t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},t=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]*t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]*t[3],i[1]+=i[2]>>>16,i[2]&=65535,i[2]+=e[3]*t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]*t[3],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[2]*t[2],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[3]*t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},i=function(e,t){return 32==(t%=64)?[e[1],e[0]]:t<32?[e[0]<>>32-t,e[1]<>>32-t]:(t-=32,[e[1]<>>32-t,e[0]<>>32-t])},n=function(e,t){return 0==(t%=64)?e:t<32?[e[0]<>>32-t,e[1]<>>1]),e=t(e,[4283543511,3981806797]),e=a(e,[0,e[0]>>>1]),e=t(e,[3301882366,444984403]),e=a(e,[0,e[0]>>>1])},r=function(r,l){l=l||0;for(var u=(r=r||"").length%16,s=r.length-u,c=[0,l],d=[0,l],f=[0,0],g=[0,0],h=[2277735313,289559509],m=[1291169091,658871167],p=0;p>>0).toString(16)).slice(-8)+("00000000"+(c[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)},l={preprocessor:null,audio:{timeout:1e3,excludeIOS11:!0},fonts:{swfContainerId:"fingerprintjs2",swfPath:"flash/compiled/FontList.swf",userDefinedFonts:[],extendedJsFonts:!1},screen:{detectScreenOrientation:!0},plugins:{sortPluginsFor:[/palemoon/i],excludeIE:!1},extraComponents:[],excludes:{enumerateDevices:!0,pixelRatio:!0,doNotTrack:!0,fontsFlash:!0,adBlock:!0},NOT_AVAILABLE:"not available",ERROR:"error",EXCLUDED:"excluded"},u=function(e,t){if(Array.prototype.forEach&&e.forEach===Array.prototype.forEach)e.forEach(t);else if(e.length===+e.length)for(var i=0,n=e.length;it.name?1:e.name=0?"Windows Phone":t.indexOf("windows")>=0||t.indexOf("win16")>=0||t.indexOf("win32")>=0||t.indexOf("win64")>=0||t.indexOf("win95")>=0||t.indexOf("win98")>=0||t.indexOf("winnt")>=0||t.indexOf("wow64")>=0?"Windows":t.indexOf("android")>=0?"Android":t.indexOf("linux")>=0||t.indexOf("cros")>=0||t.indexOf("x11")>=0?"Linux":t.indexOf("iphone")>=0||t.indexOf("ipad")>=0||t.indexOf("ipod")>=0||t.indexOf("crios")>=0||t.indexOf("fxios")>=0?"iOS":t.indexOf("macintosh")>=0||t.indexOf("mac_powerpc)")>=0?"Mac":"Other",("ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0)&&"Windows"!==e&&"Windows Phone"!==e&&"Android"!==e&&"iOS"!==e&&"Other"!==e&&-1===t.indexOf("cros"))return!0;if(void 0!==i){if((i=i.toLowerCase()).indexOf("win")>=0&&"Windows"!==e&&"Windows Phone"!==e)return!0;if(i.indexOf("linux")>=0&&"Linux"!==e&&"Android"!==e)return!0;if(i.indexOf("mac")>=0&&"Mac"!==e&&"iOS"!==e)return!0;if((-1===i.indexOf("win")&&-1===i.indexOf("linux")&&-1===i.indexOf("mac"))!=("Other"===e))return!0}return n.indexOf("win")>=0&&"Windows"!==e&&"Windows Phone"!==e||(n.indexOf("linux")>=0||n.indexOf("android")>=0||n.indexOf("pike")>=0)&&"Linux"!==e&&"Android"!==e||(n.indexOf("mac")>=0||n.indexOf("ipad")>=0||n.indexOf("ipod")>=0||n.indexOf("iphone")>=0)&&"Mac"!==e&&"iOS"!==e||!(n.indexOf("arm")>=0&&"Windows Phone"===e)&&!(n.indexOf("pike")>=0&&t.indexOf("opera mini")>=0)&&((n.indexOf("win")<0&&n.indexOf("linux")<0&&n.indexOf("mac")<0&&n.indexOf("iphone")<0&&n.indexOf("ipad")<0&&n.indexOf("ipod")<0)!=("Other"===e)||void 0===navigator.plugins&&"Windows"!==e&&"Windows Phone"!==e)},L=function(){var e,t=navigator.userAgent.toLowerCase(),i=navigator.productSub;if(t.indexOf("edge/")>=0||t.indexOf("iemobile/")>=0)return!1;if(t.indexOf("opera mini")>=0)return!1;if(("Chrome"==(e=t.indexOf("firefox/")>=0?"Firefox":t.indexOf("opera/")>=0||t.indexOf(" opr/")>=0?"Opera":t.indexOf("chrome/")>=0?"Chrome":t.indexOf("safari/")>=0?t.indexOf("android 1.")>=0||t.indexOf("android 2.")>=0||t.indexOf("android 3.")>=0||t.indexOf("android 4.")>=0?"AOSP":"Safari":t.indexOf("trident/")>=0?"Internet Explorer":"Other")||"Safari"===e||"Opera"===e)&&"20030107"!==i)return!0;var n,a=eval.toString().length;if(37===a&&"Safari"!==e&&"Firefox"!==e&&"Other"!==e)return!0;if(39===a&&"Internet Explorer"!==e&&"Other"!==e)return!0;if(33===a&&"Chrome"!==e&&"AOSP"!==e&&"Opera"!==e&&"Other"!==e)return!0;try{throw"a"}catch(e){try{e.toSource(),n=!0}catch(e){n=!1}}return n&&"Firefox"!==e&&"Other"!==e},I=function(){var e=document.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))},M=function(){if(!I()||!window.WebGLRenderingContext)return!1;var e=U();if(e){try{G(e)}catch(e){}return!0}return!1},D=function(){return"Microsoft Internet Explorer"===navigator.appName||!("Netscape"!==navigator.appName||!/Trident/.test(navigator.userAgent))},P=function(){return("msWriteProfilerMark"in window)+("msLaunchUri"in navigator)+("msSaveBlob"in navigator)>=2},N=function(){return void 0!==window.swfobject},R=function(){return window.swfobject.hasFlashPlayerVersion("9.0.0")},F=function(e,t){var i="___fp_swf_loaded";window[i]=function(t){e(t)};var n=t.fonts.swfContainerId;!function(e){var t=document.createElement("div");t.setAttribute("id",e.fonts.swfContainerId),document.body.appendChild(t)}();var a={onReady:i};window.swfobject.embedSWF(t.fonts.swfPath,n,"1","1","9.0.0",!1,a,{allowScriptAccess:"always",menu:"false"},{})},U=function(){var e=document.createElement("canvas"),t=null;try{t=e.getContext("webgl")||e.getContext("experimental-webgl")}catch(e){}return t||(t=null),t},G=function(e){var t=e.getExtension("WEBGL_lose_context");null!=t&&t.loseContext()},H=[{key:"userAgent",getData:function(e){e(navigator.userAgent)}},{key:"webdriver",getData:function(e,t){e(null==navigator.webdriver?t.NOT_AVAILABLE:navigator.webdriver)}},{key:"language",getData:function(e,t){e(navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||t.NOT_AVAILABLE)}},{key:"colorDepth",getData:function(e,t){e(window.screen.colorDepth||t.NOT_AVAILABLE)}},{key:"deviceMemory",getData:function(e,t){e(navigator.deviceMemory||t.NOT_AVAILABLE)}},{key:"pixelRatio",getData:function(e,t){e(window.devicePixelRatio||t.NOT_AVAILABLE)}},{key:"hardwareConcurrency",getData:function(e,t){e(v(t))}},{key:"screenResolution",getData:function(e,t){e(d(t))}},{key:"availableScreenResolution",getData:function(e,t){e(f(t))}},{key:"timezoneOffset",getData:function(e){e((new Date).getTimezoneOffset())}},{key:"timezone",getData:function(e,t){window.Intl&&window.Intl.DateTimeFormat?e((new window.Intl.DateTimeFormat).resolvedOptions().timeZone||t.NOT_AVAILABLE):e(t.NOT_AVAILABLE)}},{key:"sessionStorage",getData:function(e,t){e(p(t))}},{key:"localStorage",getData:function(e,t){e(b(t))}},{key:"indexedDb",getData:function(e,t){e(w(t))}},{key:"addBehavior",getData:function(e){e(!!window.HTMLElement.prototype.addBehavior)}},{key:"openDatabase",getData:function(e){e(!!window.openDatabase)}},{key:"cpuClass",getData:function(e,t){e(x(t))}},{key:"platform",getData:function(e,t){e(y(t))}},{key:"doNotTrack",getData:function(e,t){e(A(t))}},{key:"plugins",getData:function(e,t){D()?t.plugins.excludeIE?e(t.EXCLUDED):e(h(t)):e(g(t))}},{key:"canvas",getData:function(e,t){I()?e(S(t)):e(t.NOT_AVAILABLE)}},{key:"webgl",getData:function(e,t){M()?e(k()):e(t.NOT_AVAILABLE)}},{key:"webglVendorAndRenderer",getData:function(e){M()?e(C()):e()}},{key:"adBlock",getData:function(e){e(E())}},{key:"hasLiedLanguages",getData:function(e){e(O())}},{key:"hasLiedResolution",getData:function(e){e(_())}},{key:"hasLiedOs",getData:function(e){e(B())}},{key:"hasLiedBrowser",getData:function(e){e(L())}},{key:"touchSupport",getData:function(e){e(T())}},{key:"fonts",getData:function(e,t){var i=["monospace","sans-serif","serif"],n=["Andale Mono","Arial","Arial Black","Arial Hebrew","Arial MT","Arial Narrow","Arial Rounded MT Bold","Arial Unicode MS","Bitstream Vera Sans Mono","Book Antiqua","Bookman Old Style","Calibri","Cambria","Cambria Math","Century","Century Gothic","Century Schoolbook","Comic Sans","Comic Sans MS","Consolas","Courier","Courier New","Geneva","Georgia","Helvetica","Helvetica Neue","Impact","Lucida Bright","Lucida Calligraphy","Lucida Console","Lucida Fax","LUCIDA GRANDE","Lucida Handwriting","Lucida Sans","Lucida Sans Typewriter","Lucida Sans Unicode","Microsoft Sans Serif","Monaco","Monotype Corsiva","MS Gothic","MS Outlook","MS PGothic","MS Reference Sans Serif","MS Sans Serif","MS Serif","MYRIAD","MYRIAD PRO","Palatino","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Segoe UI Light","Segoe UI Semibold","Segoe UI Symbol","Tahoma","Times","Times New Roman","Times New Roman PS","Trebuchet MS","Verdana","Wingdings","Wingdings 2","Wingdings 3"];t.fonts.extendedJsFonts&&(n=n.concat(["Abadi MT Condensed Light","Academy Engraved LET","ADOBE CASLON PRO","Adobe Garamond","ADOBE GARAMOND PRO","Agency FB","Aharoni","Albertus Extra Bold","Albertus Medium","Algerian","Amazone BT","American Typewriter","American Typewriter Condensed","AmerType Md BT","Andalus","Angsana New","AngsanaUPC","Antique Olive","Aparajita","Apple Chancery","Apple Color Emoji","Apple SD Gothic Neo","Arabic Typesetting","ARCHER","ARNO PRO","Arrus BT","Aurora Cn BT","AvantGarde Bk BT","AvantGarde Md BT","AVENIR","Ayuthaya","Bandy","Bangla Sangam MN","Bank Gothic","BankGothic Md BT","Baskerville","Baskerville Old Face","Batang","BatangChe","Bauer Bodoni","Bauhaus 93","Bazooka","Bell MT","Bembo","Benguiat Bk BT","Berlin Sans FB","Berlin Sans FB Demi","Bernard MT Condensed","BernhardFashion BT","BernhardMod BT","Big Caslon","BinnerD","Blackadder ITC","BlairMdITC TT","Bodoni 72","Bodoni 72 Oldstyle","Bodoni 72 Smallcaps","Bodoni MT","Bodoni MT Black","Bodoni MT Condensed","Bodoni MT Poster Compressed","Bookshelf Symbol 7","Boulder","Bradley Hand","Bradley Hand ITC","Bremen Bd BT","Britannic Bold","Broadway","Browallia New","BrowalliaUPC","Brush Script MT","Californian FB","Calisto MT","Calligrapher","Candara","CaslonOpnface BT","Castellar","Centaur","Cezanne","CG Omega","CG Times","Chalkboard","Chalkboard SE","Chalkduster","Charlesworth","Charter Bd BT","Charter BT","Chaucer","ChelthmITC Bk BT","Chiller","Clarendon","Clarendon Condensed","CloisterBlack BT","Cochin","Colonna MT","Constantia","Cooper Black","Copperplate","Copperplate Gothic","Copperplate Gothic Bold","Copperplate Gothic Light","CopperplGoth Bd BT","Corbel","Cordia New","CordiaUPC","Cornerstone","Coronet","Cuckoo","Curlz MT","DaunPenh","Dauphin","David","DB LCD Temp","DELICIOUS","Denmark","DFKai-SB","Didot","DilleniaUPC","DIN","DokChampa","Dotum","DotumChe","Ebrima","Edwardian Script ITC","Elephant","English 111 Vivace BT","Engravers MT","EngraversGothic BT","Eras Bold ITC","Eras Demi ITC","Eras Light ITC","Eras Medium ITC","EucrosiaUPC","Euphemia","Euphemia UCAS","EUROSTILE","Exotc350 Bd BT","FangSong","Felix Titling","Fixedsys","FONTIN","Footlight MT Light","Forte","FrankRuehl","Fransiscan","Freefrm721 Blk BT","FreesiaUPC","Freestyle Script","French Script MT","FrnkGothITC Bk BT","Fruitger","FRUTIGER","Futura","Futura Bk BT","Futura Lt BT","Futura Md BT","Futura ZBlk BT","FuturaBlack BT","Gabriola","Galliard BT","Gautami","Geeza Pro","Geometr231 BT","Geometr231 Hv BT","Geometr231 Lt BT","GeoSlab 703 Lt BT","GeoSlab 703 XBd BT","Gigi","Gill Sans","Gill Sans MT","Gill Sans MT Condensed","Gill Sans MT Ext Condensed Bold","Gill Sans Ultra Bold","Gill Sans Ultra Bold Condensed","Gisha","Gloucester MT Extra Condensed","GOTHAM","GOTHAM BOLD","Goudy Old Style","Goudy Stout","GoudyHandtooled BT","GoudyOLSt BT","Gujarati Sangam MN","Gulim","GulimChe","Gungsuh","GungsuhChe","Gurmukhi MN","Haettenschweiler","Harlow Solid Italic","Harrington","Heather","Heiti SC","Heiti TC","HELV","Herald","High Tower Text","Hiragino Kaku Gothic ProN","Hiragino Mincho ProN","Hoefler Text","Humanst 521 Cn BT","Humanst521 BT","Humanst521 Lt BT","Imprint MT Shadow","Incised901 Bd BT","Incised901 BT","Incised901 Lt BT","INCONSOLATA","Informal Roman","Informal011 BT","INTERSTATE","IrisUPC","Iskoola Pota","JasmineUPC","Jazz LET","Jenson","Jester","Jokerman","Juice ITC","Kabel Bk BT","Kabel Ult BT","Kailasa","KaiTi","Kalinga","Kannada Sangam MN","Kartika","Kaufmann Bd BT","Kaufmann BT","Khmer UI","KodchiangUPC","Kokila","Korinna BT","Kristen ITC","Krungthep","Kunstler Script","Lao UI","Latha","Leelawadee","Letter Gothic","Levenim MT","LilyUPC","Lithograph","Lithograph Light","Long Island","Lydian BT","Magneto","Maiandra GD","Malayalam Sangam MN","Malgun Gothic","Mangal","Marigold","Marion","Marker Felt","Market","Marlett","Matisse ITC","Matura MT Script Capitals","Meiryo","Meiryo UI","Microsoft Himalaya","Microsoft JhengHei","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Uighur","Microsoft YaHei","Microsoft Yi Baiti","MingLiU","MingLiU_HKSCS","MingLiU_HKSCS-ExtB","MingLiU-ExtB","Minion","Minion Pro","Miriam","Miriam Fixed","Mistral","Modern","Modern No. 20","Mona Lisa Solid ITC TT","Mongolian Baiti","MONO","MoolBoran","Mrs Eaves","MS LineDraw","MS Mincho","MS PMincho","MS Reference Specialty","MS UI Gothic","MT Extra","MUSEO","MV Boli","Nadeem","Narkisim","NEVIS","News Gothic","News GothicMT","NewsGoth BT","Niagara Engraved","Niagara Solid","Noteworthy","NSimSun","Nyala","OCR A Extended","Old Century","Old English Text MT","Onyx","Onyx BT","OPTIMA","Oriya Sangam MN","OSAKA","OzHandicraft BT","Palace Script MT","Papyrus","Parchment","Party LET","Pegasus","Perpetua","Perpetua Titling MT","PetitaBold","Pickwick","Plantagenet Cherokee","Playbill","PMingLiU","PMingLiU-ExtB","Poor Richard","Poster","PosterBodoni BT","PRINCETOWN LET","Pristina","PTBarnum BT","Pythagoras","Raavi","Rage Italic","Ravie","Ribbon131 Bd BT","Rockwell","Rockwell Condensed","Rockwell Extra Bold","Rod","Roman","Sakkal Majalla","Santa Fe LET","Savoye LET","Sceptre","Script","Script MT Bold","SCRIPTINA","Serifa","Serifa BT","Serifa Th BT","ShelleyVolante BT","Sherwood","Shonar Bangla","Showcard Gothic","Shruti","Signboard","SILKSCREEN","SimHei","Simplified Arabic","Simplified Arabic Fixed","SimSun","SimSun-ExtB","Sinhala Sangam MN","Sketch Rockwell","Skia","Small Fonts","Snap ITC","Snell Roundhand","Socket","Souvenir Lt BT","Staccato222 BT","Steamer","Stencil","Storybook","Styllo","Subway","Swis721 BlkEx BT","Swiss911 XCm BT","Sylfaen","Synchro LET","System","Tamil Sangam MN","Technical","Teletype","Telugu Sangam MN","Tempus Sans ITC","Terminal","Thonburi","Traditional Arabic","Trajan","TRAJAN PRO","Tristan","Tubular","Tunga","Tw Cen MT","Tw Cen MT Condensed","Tw Cen MT Condensed Extra Bold","TypoUpright BT","Unicorn","Univers","Univers CE 55 Medium","Univers Condensed","Utsaah","Vagabond","Vani","Vijaya","Viner Hand ITC","VisualUI","Vivaldi","Vladimir Script","Vrinda","Westminster","WHITNEY","Wide Latin","ZapfEllipt BT","ZapfHumnst BT","ZapfHumnst Dm BT","Zapfino","Zurich BlkEx BT","Zurich Ex BT","ZWAdobeF"])),n=(n=n.concat(t.fonts.userDefinedFonts)).filter((function(e,t){return n.indexOf(e)===t}));var a=document.getElementsByTagName("body")[0],o=document.createElement("div"),r=document.createElement("div"),l={},u={},s=function(){var e=document.createElement("span");return e.style.position="absolute",e.style.left="-9999px",e.style.fontSize="72px",e.style.fontStyle="normal",e.style.fontWeight="normal",e.style.letterSpacing="normal",e.style.lineBreak="auto",e.style.lineHeight="normal",e.style.textTransform="none",e.style.textAlign="left",e.style.textDecoration="none",e.style.textShadow="none",e.style.whiteSpace="normal",e.style.wordBreak="normal",e.style.wordSpacing="normal",e.innerHTML="mmmmmmmmmmlli",e},c=function(e,t){var i=s();return i.style.fontFamily="'"+e+"',"+t,i},d=function(e){for(var t=!1,n=0;n=e.components.length)t(i.data);else{var r=e.components[n];if(e.excludes[r.key])a(!1);else{if(!o&&r.pauseBefore)return n-=1,void setTimeout((function(){a(!0)}),1);try{r.getData((function(e){i.addPreprocessedComponent(r.key,e),a(!1)}),e)}catch(e){i.addPreprocessedComponent(r.key,String(e)),a(!1)}}}};a(!1)},V.getPromise=function(e){return new Promise((function(t,i){V.get(e,t)}))},V.getV18=function(e,t){return null==t&&(t=e,e={}),V.get(e,(function(i){for(var n=[],a=0;a',i.lightboxInstance=o.exports.create(a,{className:"basicLightbox--iframe"}),f(e.configuration.delay,"lightboxOpen",e)},this.lightboxOpenAfterDelay=function(){i.lightboxInstance.show(),s()};var s=function(){for(var e=document.querySelectorAll('[data-lux-action-lightbox="close"]'),t=0;t=o&&(a=!0,setTimeout((function(){try{i[t+"AfterDelay"](n)}catch(e){console.log(e)}}),parseInt(e.time)))}},this.mouseLeaveDelayFunction=function(e,t,n){var a=!1;window.addEventListener("mouseout",(function(o){!1===a&&(o.pageY<0||o.pageY>window.innerHeight||o.pageX<0||o.pageX>window.innerWidth)&&(a=!0,setTimeout((function(){try{i[t+"AfterDelay"](n)}catch(e){console.log(e)}}),parseInt(e.time)))}),!1)},this.inactiveTabDelayFunction=function(e,t,n){var a,o,r=!1;void 0!==document.hidden?(a="hidden",o="visibilitychange"):void 0!==document.msHidden?(a="msHidden",o="msvisibilitychange"):void 0!==document.webkitHidden&&(a="webkitHidden",o="webkitvisibilitychange"),void 0===document.addEventListener||void 0===a?console.log("This function requires a modern browser such as Google Chrome or Firefox withPage Visibility API"):document.addEventListener(o,(function(){!1===r&&document[a]&&setTimeout((function(){try{r=!0,i[t+"AfterDelay"](n)}catch(e){console.log(e)}}),parseInt(e.time))}),!1)},this.getIdentification=function(){return r};var g=function(){!1===a&&(r.setIdentificator(Z()),h(),a=!0)},h=function e(){r.isIdentificatorSet()?(b(),i.addFieldListeners(),i.addFormListeners(),v(),x(),y(),A()):++l<200?setTimeout(e,100):console.log("Fingerprint could not be calculated within 20s")},m=function(){for(var e=document.querySelectorAll('[data-lux-trackingoptout="checkbox"]'),t=0;t0&&(e["tx_lux_fe[arguments][newsUid]"]=H()),j(e,q(),"generalWorkflowActionCallback",null)}};this.addFieldListeners=function(){document.querySelectorAll('form:not([data-lux-form-identification]):not([data-lux-form-initialized]) input:not([data-lux-disable]):not([type="hidden"]):not([type="submit"]), form:not([data-lux-form-identification]):not([data-lux-form-initialized]) textarea:not([data-lux-disable]), form:not([data-lux-form-identification]):not([data-lux-form-initialized]) select:not([data-lux-disable]), form:not([data-lux-form-identification]):not([data-lux-form-initialized]) radio:not([data-lux-disable]), form:not([data-lux-form-identification]):not([data-lux-form-initialized]) check:not([data-lux-disable])').forEach((function(e){"password"!==e.type&&L(e)&&(e.addEventListener("change",(function(e){E(e.target)})),e.form.setAttribute("data-lux-form-initialized",1))}))},this.addFormListeners=function(){document.querySelectorAll("form[data-lux-form-identification]:not([data-lux-form-initialized])").forEach((function(e){e.addEventListener("submit",(function(e){O(e.target),S(e,"formListening","preventDefault"!==e.target.getAttribute("data-lux-form-identification"))})),e.setAttribute("data-lux-form-initialized",1)}))};var w=function(){for(var e=document.querySelectorAll("[data-lux-email4link-title]"),t=0;t=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,l=!0,u=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){u=!0,r=e},f:function(){try{l||null==n.return||n.return()}finally{if(u)throw r}}}}(new FormData(d).entries());try{for(g.s();!(l=g.n()).done;){var h=e(l.value,2),m=h[0],p=h[1];if(m.startsWith("email4link["))f[m.split("[")[1].split("]")[0]]=p}}catch(e){g.e(e)}finally{g.f()}ee(f.email)?(J(),j({"tx_lux_fe[dispatchAction]":"email4LinkRequest","tx_lux_fe[identificator]":r.getIdentificator(),"tx_lux_fe[arguments][sendEmail]":"true"===c,"tx_lux_fe[arguments][href]":u,"tx_lux_fe[arguments][pageUid]":U(),"tx_lux_fe[arguments][values]":encodeURIComponent(JSON.stringify(f))},q(),"email4LinkLightboxSubmitCallback",{sendEmail:"true"===c,href:u,target:s})):Q(i.lightboxInstance.element().querySelector('[data-lux-email4link="errorEmailAddress"]'))};this.email4LinkLightboxSubmitCallback=function(e,t){Y(),!0===e.error?Q(i.lightboxInstance.element().querySelector('[data-lux-email4link="errorEmailAddress"]')):!0===t.sendEmail?($(i.lightboxInstance.element().querySelector('[data-lux-email4link="form"]')),Q(i.lightboxInstance.element().querySelector('[data-lux-email4link="successMessageSendEmail"]')),setTimeout((function(){i.lightboxInstance.close()}),2e3)):setTimeout((function(){var e=null;i.lightboxInstance.close(),""!==t.target&&null!==t.target&&(e=window.open(t.href,t.target)),null===e&&(window.location=t.href)}),500)};var E=function(e){var t=I(e,P()),i=e.value;j({"tx_lux_fe[dispatchAction]":"fieldListeningRequest","tx_lux_fe[identificator]":r.getIdentificator(),"tx_lux_fe[arguments][key]":t,"tx_lux_fe[arguments][value]":i,"tx_lux_fe[arguments][pageUid]":U()},q(),"generalWorkflowActionCallback",null)},O=function(e){for(var t={},i=0;i()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)},te=function(e){var t=e.replace(/^.*[\\\/]/,"");return ie(ne(t).toLowerCase(),["pdf","txt","doc","docx","xls","xlsx","ppt","pptx","jpg","png","zip"])&&(e=t),e},ie=function(e,t){for(var i=t.length,n=0;ne.length)&&(t=e.length);for(var i=0,n=new Array(t);i1&&void 0!==arguments[1]&&arguments[1],i=document.createElement("div");return i.innerHTML=e.trim(),!0===t?i.children:i.firstChild},a=function(e,t){var i=e.children;return 1===i.length&&i[0].tagName===t},r=function(e){return null!=(e=e||document.querySelector(".basicLightbox"))&&!0===e.ownerDocument.body.contains(e)};i.visible=r,i.create=function(e,t){var i=function(e,t){var i=n('\n\t\t
\n\t\t\t\n\t\t
\n\t')),r=i.querySelector(".basicLightbox__placeholder");e.forEach((function(e){return r.appendChild(e)}));var o=a(r,"IMG"),l=a(r,"VIDEO"),u=a(r,"IFRAME");return!0===o&&i.classList.add("basicLightbox--img"),!0===l&&i.classList.add("basicLightbox--video"),!0===u&&i.classList.add("basicLightbox--iframe"),i}(e=function(e){var t="string"==typeof e,i=e instanceof HTMLElement==1;if(!1===t&&!1===i)throw new Error("Content must be a DOM element/node or string");return!0===t?Array.from(n(e,!0)):"TEMPLATE"===e.tagName?[e.content.cloneNode(!0)]:Array.from(e.children)}(e),t=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(null==(e=Object.assign({},e)).closable&&(e.closable=!0),null==e.className&&(e.className=""),null==e.onShow&&(e.onShow=function(){}),null==e.onClose&&(e.onClose=function(){}),"boolean"!=typeof e.closable)throw new Error("Property `closable` must be a boolean");if("string"!=typeof e.className)throw new Error("Property `className` must be a string");if("function"!=typeof e.onShow)throw new Error("Property `onShow` must be a function");if("function"!=typeof e.onClose)throw new Error("Property `onClose` must be a function");return e}(t)),o=function(e){return!1!==t.onClose(l)&&function(e,t){return e.classList.remove("basicLightbox--visible"),setTimeout((function(){return!1===r(e)||e.parentElement.removeChild(e),t()}),410),!0}(i,(function(){if("function"==typeof e)return e(l)}))};!0===t.closable&&i.addEventListener("click",(function(e){e.target===i&&o()}));var l={element:function(){return i},visible:function(){return r(i)},show:function(e){return!1!==t.onShow(l)&&function(e,t){return document.body.appendChild(e),setTimeout((function(){requestAnimationFrame((function(){return e.classList.add("basicLightbox--visible"),t()}))}),10),!0}(i,(function(){if("function"==typeof e)return e(l)}))},close:o};return l}},{}]},{},[1])(1);var o={exports:{}};!function(e,t){!function(i,n){var a="function",r="undefined",o="object",l="string",u="major",s="model",c="name",d="type",f="vendor",g="version",m="architecture",h="console",p="mobile",b="tablet",w="smarttv",v="wearable",x="embedded",y="Amazon",A="Apple",T="ASUS",S="BlackBerry",k="Browser",C="Chrome",E="Firefox",_="Google",O="Huawei",B="LG",L="Microsoft",I="Motorola",M="Opera",D="Samsung",P="Sharp",R="Sony",N="Xiaomi",U="Zebra",F="Facebook",G="Chromium OS",H="Mac OS",V=function(e){for(var t={},i=0;i0?2===u.length?typeof u[1]==a?this[u[0]]=u[1].call(this,c):this[u[0]]=u[1]:3===u.length?typeof u[1]!==a||u[1].exec&&u[1].test?this[u[0]]=c?c.replace(u[1],u[2]):n:this[u[0]]=c?u[1].call(this,c,u[2]):n:4===u.length&&(this[u[0]]=c?u[3].call(this,c.replace(u[1],u[2])):n):this[u]=c||n;d+=2}},X=function(e,t){for(var i in t)if(typeof t[i]===o&&t[i].length>0){for(var a=0;a2&&(e[s]="iPad",e[d]=b),e},this.getEngine=function(){var e={};return e[c]=n,e[g]=n,z.call(e,w,x.engine),e},this.getOS=function(){var e={};return e[c]=n,e[g]=n,z.call(e,w,x.os),y&&!e[c]&&v&&"Unknown"!=v.platform&&(e[c]=v.platform.replace(/chrome os/i,G).replace(/macos/i,H)),e},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return w},this.setUA=function(e){return w=typeof e===l&&e.length>500?j(e,500):e,this},this.setUA(w),this};J.VERSION="0.7.37",J.BROWSER=V([c,g,u]),J.CPU=V([m]),J.DEVICE=V([s,f,d,h,p,w,b,v,x]),J.ENGINE=J.OS=V([c,g]),e.exports&&(t=e.exports=J),t.UAParser=J;var Y=typeof i!==r&&(i.jQuery||i.Zepto);if(Y&&!Y.ua){var $=new J;Y.ua=$.getResult(),Y.ua.get=function(){return $.getUA()},Y.ua.set=function(e){$.setUA(e);var t=$.getResult();for(var i in t)Y.ua[i]=t[i]}}}("object"==typeof window?window:n)}(o,o.exports);var l=o.exports,u={exports:{}};!function(e){var t,i;t=n,i=function(){void 0===Array.isArray&&(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)});var e=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]+t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]+t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]+t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]+t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},t=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]*t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]*t[3],i[1]+=i[2]>>>16,i[2]&=65535,i[2]+=e[3]*t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]*t[3],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[2]*t[2],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[3]*t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},i=function(e,t){return 32==(t%=64)?[e[1],e[0]]:t<32?[e[0]<>>32-t,e[1]<>>32-t]:(t-=32,[e[1]<>>32-t,e[0]<>>32-t])},n=function(e,t){return 0==(t%=64)?e:t<32?[e[0]<>>32-t,e[1]<>>1]),e=t(e,[4283543511,3981806797]),e=a(e,[0,e[0]>>>1]),e=t(e,[3301882366,444984403]),e=a(e,[0,e[0]>>>1])},o=function(o,l){l=l||0;for(var u=(o=o||"").length%16,s=o.length-u,c=[0,l],d=[0,l],f=[0,0],g=[0,0],m=[2277735313,289559509],h=[1291169091,658871167],p=0;p>>0).toString(16)).slice(-8)+("00000000"+(c[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)},l={preprocessor:null,audio:{timeout:1e3,excludeIOS11:!0},fonts:{swfContainerId:"fingerprintjs2",swfPath:"flash/compiled/FontList.swf",userDefinedFonts:[],extendedJsFonts:!1},screen:{detectScreenOrientation:!0},plugins:{sortPluginsFor:[/palemoon/i],excludeIE:!1},extraComponents:[],excludes:{enumerateDevices:!0,pixelRatio:!0,doNotTrack:!0,fontsFlash:!0,adBlock:!0},NOT_AVAILABLE:"not available",ERROR:"error",EXCLUDED:"excluded"},u=function(e,t){if(Array.prototype.forEach&&e.forEach===Array.prototype.forEach)e.forEach(t);else if(e.length===+e.length)for(var i=0,n=e.length;it.name?1:e.name=0?"Windows Phone":t.indexOf("windows")>=0||t.indexOf("win16")>=0||t.indexOf("win32")>=0||t.indexOf("win64")>=0||t.indexOf("win95")>=0||t.indexOf("win98")>=0||t.indexOf("winnt")>=0||t.indexOf("wow64")>=0?"Windows":t.indexOf("android")>=0?"Android":t.indexOf("linux")>=0||t.indexOf("cros")>=0||t.indexOf("x11")>=0?"Linux":t.indexOf("iphone")>=0||t.indexOf("ipad")>=0||t.indexOf("ipod")>=0||t.indexOf("crios")>=0||t.indexOf("fxios")>=0?"iOS":t.indexOf("macintosh")>=0||t.indexOf("mac_powerpc)")>=0?"Mac":"Other",("ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0)&&"Windows"!==e&&"Windows Phone"!==e&&"Android"!==e&&"iOS"!==e&&"Other"!==e&&-1===t.indexOf("cros"))return!0;if(void 0!==i){if((i=i.toLowerCase()).indexOf("win")>=0&&"Windows"!==e&&"Windows Phone"!==e)return!0;if(i.indexOf("linux")>=0&&"Linux"!==e&&"Android"!==e)return!0;if(i.indexOf("mac")>=0&&"Mac"!==e&&"iOS"!==e)return!0;if((-1===i.indexOf("win")&&-1===i.indexOf("linux")&&-1===i.indexOf("mac"))!=("Other"===e))return!0}return n.indexOf("win")>=0&&"Windows"!==e&&"Windows Phone"!==e||(n.indexOf("linux")>=0||n.indexOf("android")>=0||n.indexOf("pike")>=0)&&"Linux"!==e&&"Android"!==e||(n.indexOf("mac")>=0||n.indexOf("ipad")>=0||n.indexOf("ipod")>=0||n.indexOf("iphone")>=0)&&"Mac"!==e&&"iOS"!==e||!(n.indexOf("arm")>=0&&"Windows Phone"===e)&&!(n.indexOf("pike")>=0&&t.indexOf("opera mini")>=0)&&((n.indexOf("win")<0&&n.indexOf("linux")<0&&n.indexOf("mac")<0&&n.indexOf("iphone")<0&&n.indexOf("ipad")<0&&n.indexOf("ipod")<0)!=("Other"===e)||void 0===navigator.plugins&&"Windows"!==e&&"Windows Phone"!==e)},L=function(){var e,t=navigator.userAgent.toLowerCase(),i=navigator.productSub;if(t.indexOf("edge/")>=0||t.indexOf("iemobile/")>=0)return!1;if(t.indexOf("opera mini")>=0)return!1;if(("Chrome"==(e=t.indexOf("firefox/")>=0?"Firefox":t.indexOf("opera/")>=0||t.indexOf(" opr/")>=0?"Opera":t.indexOf("chrome/")>=0?"Chrome":t.indexOf("safari/")>=0?t.indexOf("android 1.")>=0||t.indexOf("android 2.")>=0||t.indexOf("android 3.")>=0||t.indexOf("android 4.")>=0?"AOSP":"Safari":t.indexOf("trident/")>=0?"Internet Explorer":"Other")||"Safari"===e||"Opera"===e)&&"20030107"!==i)return!0;var n,a=eval.toString().length;if(37===a&&"Safari"!==e&&"Firefox"!==e&&"Other"!==e)return!0;if(39===a&&"Internet Explorer"!==e&&"Other"!==e)return!0;if(33===a&&"Chrome"!==e&&"AOSP"!==e&&"Opera"!==e&&"Other"!==e)return!0;try{throw"a"}catch(e){try{e.toSource(),n=!0}catch(e){n=!1}}return n&&"Firefox"!==e&&"Other"!==e},I=function(){var e=document.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))},M=function(){if(!I()||!window.WebGLRenderingContext)return!1;var e=F();if(e){try{G(e)}catch(e){}return!0}return!1},D=function(){return"Microsoft Internet Explorer"===navigator.appName||!("Netscape"!==navigator.appName||!/Trident/.test(navigator.userAgent))},P=function(){return("msWriteProfilerMark"in window)+("msLaunchUri"in navigator)+("msSaveBlob"in navigator)>=2},R=function(){return void 0!==window.swfobject},N=function(){return window.swfobject.hasFlashPlayerVersion("9.0.0")},U=function(e,t){var i="___fp_swf_loaded";window[i]=function(t){e(t)};var n=t.fonts.swfContainerId;!function(e){var t=document.createElement("div");t.setAttribute("id",e.fonts.swfContainerId),document.body.appendChild(t)}();var a={onReady:i};window.swfobject.embedSWF(t.fonts.swfPath,n,"1","1","9.0.0",!1,a,{allowScriptAccess:"always",menu:"false"},{})},F=function(){var e=document.createElement("canvas"),t=null;try{t=e.getContext("webgl")||e.getContext("experimental-webgl")}catch(e){}return t||(t=null),t},G=function(e){var t=e.getExtension("WEBGL_lose_context");null!=t&&t.loseContext()},H=[{key:"userAgent",getData:function(e){e(navigator.userAgent)}},{key:"webdriver",getData:function(e,t){e(null==navigator.webdriver?t.NOT_AVAILABLE:navigator.webdriver)}},{key:"language",getData:function(e,t){e(navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||t.NOT_AVAILABLE)}},{key:"colorDepth",getData:function(e,t){e(window.screen.colorDepth||t.NOT_AVAILABLE)}},{key:"deviceMemory",getData:function(e,t){e(navigator.deviceMemory||t.NOT_AVAILABLE)}},{key:"pixelRatio",getData:function(e,t){e(window.devicePixelRatio||t.NOT_AVAILABLE)}},{key:"hardwareConcurrency",getData:function(e,t){e(v(t))}},{key:"screenResolution",getData:function(e,t){e(d(t))}},{key:"availableScreenResolution",getData:function(e,t){e(f(t))}},{key:"timezoneOffset",getData:function(e){e((new Date).getTimezoneOffset())}},{key:"timezone",getData:function(e,t){window.Intl&&window.Intl.DateTimeFormat?e((new window.Intl.DateTimeFormat).resolvedOptions().timeZone||t.NOT_AVAILABLE):e(t.NOT_AVAILABLE)}},{key:"sessionStorage",getData:function(e,t){e(p(t))}},{key:"localStorage",getData:function(e,t){e(b(t))}},{key:"indexedDb",getData:function(e,t){e(w(t))}},{key:"addBehavior",getData:function(e){e(!!window.HTMLElement.prototype.addBehavior)}},{key:"openDatabase",getData:function(e){e(!!window.openDatabase)}},{key:"cpuClass",getData:function(e,t){e(x(t))}},{key:"platform",getData:function(e,t){e(y(t))}},{key:"doNotTrack",getData:function(e,t){e(A(t))}},{key:"plugins",getData:function(e,t){D()?t.plugins.excludeIE?e(t.EXCLUDED):e(m(t)):e(g(t))}},{key:"canvas",getData:function(e,t){I()?e(S(t)):e(t.NOT_AVAILABLE)}},{key:"webgl",getData:function(e,t){M()?e(k()):e(t.NOT_AVAILABLE)}},{key:"webglVendorAndRenderer",getData:function(e){M()?e(C()):e()}},{key:"adBlock",getData:function(e){e(E())}},{key:"hasLiedLanguages",getData:function(e){e(_())}},{key:"hasLiedResolution",getData:function(e){e(O())}},{key:"hasLiedOs",getData:function(e){e(B())}},{key:"hasLiedBrowser",getData:function(e){e(L())}},{key:"touchSupport",getData:function(e){e(T())}},{key:"fonts",getData:function(e,t){var i=["monospace","sans-serif","serif"],n=["Andale Mono","Arial","Arial Black","Arial Hebrew","Arial MT","Arial Narrow","Arial Rounded MT Bold","Arial Unicode MS","Bitstream Vera Sans Mono","Book Antiqua","Bookman Old Style","Calibri","Cambria","Cambria Math","Century","Century Gothic","Century Schoolbook","Comic Sans","Comic Sans MS","Consolas","Courier","Courier New","Geneva","Georgia","Helvetica","Helvetica Neue","Impact","Lucida Bright","Lucida Calligraphy","Lucida Console","Lucida Fax","LUCIDA GRANDE","Lucida Handwriting","Lucida Sans","Lucida Sans Typewriter","Lucida Sans Unicode","Microsoft Sans Serif","Monaco","Monotype Corsiva","MS Gothic","MS Outlook","MS PGothic","MS Reference Sans Serif","MS Sans Serif","MS Serif","MYRIAD","MYRIAD PRO","Palatino","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Segoe UI Light","Segoe UI Semibold","Segoe UI Symbol","Tahoma","Times","Times New Roman","Times New Roman PS","Trebuchet MS","Verdana","Wingdings","Wingdings 2","Wingdings 3"];t.fonts.extendedJsFonts&&(n=n.concat(["Abadi MT Condensed Light","Academy Engraved LET","ADOBE CASLON PRO","Adobe Garamond","ADOBE GARAMOND PRO","Agency FB","Aharoni","Albertus Extra Bold","Albertus Medium","Algerian","Amazone BT","American Typewriter","American Typewriter Condensed","AmerType Md BT","Andalus","Angsana New","AngsanaUPC","Antique Olive","Aparajita","Apple Chancery","Apple Color Emoji","Apple SD Gothic Neo","Arabic Typesetting","ARCHER","ARNO PRO","Arrus BT","Aurora Cn BT","AvantGarde Bk BT","AvantGarde Md BT","AVENIR","Ayuthaya","Bandy","Bangla Sangam MN","Bank Gothic","BankGothic Md BT","Baskerville","Baskerville Old Face","Batang","BatangChe","Bauer Bodoni","Bauhaus 93","Bazooka","Bell MT","Bembo","Benguiat Bk BT","Berlin Sans FB","Berlin Sans FB Demi","Bernard MT Condensed","BernhardFashion BT","BernhardMod BT","Big Caslon","BinnerD","Blackadder ITC","BlairMdITC TT","Bodoni 72","Bodoni 72 Oldstyle","Bodoni 72 Smallcaps","Bodoni MT","Bodoni MT Black","Bodoni MT Condensed","Bodoni MT Poster Compressed","Bookshelf Symbol 7","Boulder","Bradley Hand","Bradley Hand ITC","Bremen Bd BT","Britannic Bold","Broadway","Browallia New","BrowalliaUPC","Brush Script MT","Californian FB","Calisto MT","Calligrapher","Candara","CaslonOpnface BT","Castellar","Centaur","Cezanne","CG Omega","CG Times","Chalkboard","Chalkboard SE","Chalkduster","Charlesworth","Charter Bd BT","Charter BT","Chaucer","ChelthmITC Bk BT","Chiller","Clarendon","Clarendon Condensed","CloisterBlack BT","Cochin","Colonna MT","Constantia","Cooper Black","Copperplate","Copperplate Gothic","Copperplate Gothic Bold","Copperplate Gothic Light","CopperplGoth Bd BT","Corbel","Cordia New","CordiaUPC","Cornerstone","Coronet","Cuckoo","Curlz MT","DaunPenh","Dauphin","David","DB LCD Temp","DELICIOUS","Denmark","DFKai-SB","Didot","DilleniaUPC","DIN","DokChampa","Dotum","DotumChe","Ebrima","Edwardian Script ITC","Elephant","English 111 Vivace BT","Engravers MT","EngraversGothic BT","Eras Bold ITC","Eras Demi ITC","Eras Light ITC","Eras Medium ITC","EucrosiaUPC","Euphemia","Euphemia UCAS","EUROSTILE","Exotc350 Bd BT","FangSong","Felix Titling","Fixedsys","FONTIN","Footlight MT Light","Forte","FrankRuehl","Fransiscan","Freefrm721 Blk BT","FreesiaUPC","Freestyle Script","French Script MT","FrnkGothITC Bk BT","Fruitger","FRUTIGER","Futura","Futura Bk BT","Futura Lt BT","Futura Md BT","Futura ZBlk BT","FuturaBlack BT","Gabriola","Galliard BT","Gautami","Geeza Pro","Geometr231 BT","Geometr231 Hv BT","Geometr231 Lt BT","GeoSlab 703 Lt BT","GeoSlab 703 XBd BT","Gigi","Gill Sans","Gill Sans MT","Gill Sans MT Condensed","Gill Sans MT Ext Condensed Bold","Gill Sans Ultra Bold","Gill Sans Ultra Bold Condensed","Gisha","Gloucester MT Extra Condensed","GOTHAM","GOTHAM BOLD","Goudy Old Style","Goudy Stout","GoudyHandtooled BT","GoudyOLSt BT","Gujarati Sangam MN","Gulim","GulimChe","Gungsuh","GungsuhChe","Gurmukhi MN","Haettenschweiler","Harlow Solid Italic","Harrington","Heather","Heiti SC","Heiti TC","HELV","Herald","High Tower Text","Hiragino Kaku Gothic ProN","Hiragino Mincho ProN","Hoefler Text","Humanst 521 Cn BT","Humanst521 BT","Humanst521 Lt BT","Imprint MT Shadow","Incised901 Bd BT","Incised901 BT","Incised901 Lt BT","INCONSOLATA","Informal Roman","Informal011 BT","INTERSTATE","IrisUPC","Iskoola Pota","JasmineUPC","Jazz LET","Jenson","Jester","Jokerman","Juice ITC","Kabel Bk BT","Kabel Ult BT","Kailasa","KaiTi","Kalinga","Kannada Sangam MN","Kartika","Kaufmann Bd BT","Kaufmann BT","Khmer UI","KodchiangUPC","Kokila","Korinna BT","Kristen ITC","Krungthep","Kunstler Script","Lao UI","Latha","Leelawadee","Letter Gothic","Levenim MT","LilyUPC","Lithograph","Lithograph Light","Long Island","Lydian BT","Magneto","Maiandra GD","Malayalam Sangam MN","Malgun Gothic","Mangal","Marigold","Marion","Marker Felt","Market","Marlett","Matisse ITC","Matura MT Script Capitals","Meiryo","Meiryo UI","Microsoft Himalaya","Microsoft JhengHei","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Uighur","Microsoft YaHei","Microsoft Yi Baiti","MingLiU","MingLiU_HKSCS","MingLiU_HKSCS-ExtB","MingLiU-ExtB","Minion","Minion Pro","Miriam","Miriam Fixed","Mistral","Modern","Modern No. 20","Mona Lisa Solid ITC TT","Mongolian Baiti","MONO","MoolBoran","Mrs Eaves","MS LineDraw","MS Mincho","MS PMincho","MS Reference Specialty","MS UI Gothic","MT Extra","MUSEO","MV Boli","Nadeem","Narkisim","NEVIS","News Gothic","News GothicMT","NewsGoth BT","Niagara Engraved","Niagara Solid","Noteworthy","NSimSun","Nyala","OCR A Extended","Old Century","Old English Text MT","Onyx","Onyx BT","OPTIMA","Oriya Sangam MN","OSAKA","OzHandicraft BT","Palace Script MT","Papyrus","Parchment","Party LET","Pegasus","Perpetua","Perpetua Titling MT","PetitaBold","Pickwick","Plantagenet Cherokee","Playbill","PMingLiU","PMingLiU-ExtB","Poor Richard","Poster","PosterBodoni BT","PRINCETOWN LET","Pristina","PTBarnum BT","Pythagoras","Raavi","Rage Italic","Ravie","Ribbon131 Bd BT","Rockwell","Rockwell Condensed","Rockwell Extra Bold","Rod","Roman","Sakkal Majalla","Santa Fe LET","Savoye LET","Sceptre","Script","Script MT Bold","SCRIPTINA","Serifa","Serifa BT","Serifa Th BT","ShelleyVolante BT","Sherwood","Shonar Bangla","Showcard Gothic","Shruti","Signboard","SILKSCREEN","SimHei","Simplified Arabic","Simplified Arabic Fixed","SimSun","SimSun-ExtB","Sinhala Sangam MN","Sketch Rockwell","Skia","Small Fonts","Snap ITC","Snell Roundhand","Socket","Souvenir Lt BT","Staccato222 BT","Steamer","Stencil","Storybook","Styllo","Subway","Swis721 BlkEx BT","Swiss911 XCm BT","Sylfaen","Synchro LET","System","Tamil Sangam MN","Technical","Teletype","Telugu Sangam MN","Tempus Sans ITC","Terminal","Thonburi","Traditional Arabic","Trajan","TRAJAN PRO","Tristan","Tubular","Tunga","Tw Cen MT","Tw Cen MT Condensed","Tw Cen MT Condensed Extra Bold","TypoUpright BT","Unicorn","Univers","Univers CE 55 Medium","Univers Condensed","Utsaah","Vagabond","Vani","Vijaya","Viner Hand ITC","VisualUI","Vivaldi","Vladimir Script","Vrinda","Westminster","WHITNEY","Wide Latin","ZapfEllipt BT","ZapfHumnst BT","ZapfHumnst Dm BT","Zapfino","Zurich BlkEx BT","Zurich Ex BT","ZWAdobeF"])),n=(n=n.concat(t.fonts.userDefinedFonts)).filter((function(e,t){return n.indexOf(e)===t}));var a=document.getElementsByTagName("body")[0],r=document.createElement("div"),o=document.createElement("div"),l={},u={},s=function(){var e=document.createElement("span");return e.style.position="absolute",e.style.left="-9999px",e.style.fontSize="72px",e.style.fontStyle="normal",e.style.fontWeight="normal",e.style.letterSpacing="normal",e.style.lineBreak="auto",e.style.lineHeight="normal",e.style.textTransform="none",e.style.textAlign="left",e.style.textDecoration="none",e.style.textShadow="none",e.style.whiteSpace="normal",e.style.wordBreak="normal",e.style.wordSpacing="normal",e.innerHTML="mmmmmmmmmmlli",e},c=function(e,t){var i=s();return i.style.fontFamily="'"+e+"',"+t,i},d=function(e){for(var t=!1,n=0;n=e.components.length)t(i.data);else{var o=e.components[n];if(e.excludes[o.key])a(!1);else{if(!r&&o.pauseBefore)return n-=1,void setTimeout((function(){a(!0)}),1);try{o.getData((function(e){i.addPreprocessedComponent(o.key,e),a(!1)}),e)}catch(e){i.addPreprocessedComponent(o.key,String(e)),a(!1)}}}};a(!1)},V.getPromise=function(e){return new Promise((function(t,i){V.get(e,t)}))},V.getV18=function(e,t){return null==t&&(t=e,e={}),V.get(e,(function(i){for(var n=[],a=0;a0&&(i["tx_lux_fe[arguments][newsUid]"]=H()),W(i,q(),"generalWorkflowActionCallback",null)},this.closeLightbox=function(){null!==i.lightboxInstance&&i.lightboxInstance.close()},this.optIn=function(){o.setTrackingOptInStatus(),g()},this.optOut=function(){o.setTrackingOptOutStatus()},this.optOutAndReload=function(){this.optOut(),location.reload()},this.generalWorkflowActionCallback=function(e){for(var t=0;t',i.lightboxInstance=r.exports.create(a,{className:"basicLightbox--iframe"}),f(e.configuration.delay,"lightboxOpen",e)},this.lightboxOpenAfterDelay=function(){i.lightboxInstance.show(),s()};var s=function(){for(var e=document.querySelectorAll('[data-lux-action-lightbox="close"]'),t=0;t=r&&(a=!0,setTimeout((function(){try{i[t+"AfterDelay"](n)}catch(e){console.log(e)}}),parseInt(e.time)))}},this.mouseLeaveDelayFunction=function(e,t,n){var a=!1;window.addEventListener("mouseout",(function(r){!1===a&&(r.pageY<0||r.pageY>window.innerHeight||r.pageX<0||r.pageX>window.innerWidth)&&(a=!0,setTimeout((function(){try{i[t+"AfterDelay"](n)}catch(e){console.log(e)}}),parseInt(e.time)))}),!1)},this.inactiveTabDelayFunction=function(e,t,n){var a,r,o=!1;void 0!==document.hidden?(a="hidden",r="visibilitychange"):void 0!==document.msHidden?(a="msHidden",r="msvisibilitychange"):void 0!==document.webkitHidden&&(a="webkitHidden",r="webkitvisibilitychange"),void 0===document.addEventListener||void 0===a?console.log("This function requires a modern browser such as Google Chrome or Firefox withPage Visibility API"):document.addEventListener(r,(function(){!1===o&&document[a]&&setTimeout((function(){try{o=!0,i[t+"AfterDelay"](n)}catch(e){console.log(e)}}),parseInt(e.time))}),!1)},this.getIdentification=function(){return o};var g=function(){!1===a&&(o.setIdentificator(Z()),m(),a=!0)},m=function e(){o.isIdentificatorSet()?(b(),i.addFieldListeners(),i.addFormListeners(),v(),x(),y(),A()):++l<200?setTimeout(e,100):console.log("Fingerprint could not be calculated within 20s")},h=function(){for(var e=document.querySelectorAll('[data-lux-trackingoptout="checkbox"]'),t=0;t0&&(e["tx_lux_fe[arguments][newsUid]"]=H()),W(e,q(),"generalWorkflowActionCallback",null)}};this.addFieldListeners=function(){document.querySelectorAll('form:not([data-lux-form-identification]):not([data-lux-form-initialized]) input:not([data-lux-disable]):not([type="hidden"]):not([type="submit"]), form:not([data-lux-form-identification]):not([data-lux-form-initialized]) textarea:not([data-lux-disable]), form:not([data-lux-form-identification]):not([data-lux-form-initialized]) select:not([data-lux-disable]), form:not([data-lux-form-identification]):not([data-lux-form-initialized]) radio:not([data-lux-disable]), form:not([data-lux-form-identification]):not([data-lux-form-initialized]) check:not([data-lux-disable])').forEach((function(e){"password"!==e.type&&L(e)&&(e.addEventListener("change",(function(e){E(e.target)})),e.form.setAttribute("data-lux-form-initialized",1))}))},this.addFormListeners=function(){document.querySelectorAll("form[data-lux-form-identification]:not([data-lux-form-initialized])").forEach((function(e){e.addEventListener("submit",(function(e){_(e.target),S(e,"formListening","preventDefault"!==e.target.getAttribute("data-lux-form-identification"))})),e.setAttribute("data-lux-form-initialized",1)}))};var w=function(){for(var e=document.querySelectorAll("[data-lux-email4link-title]"),t=0;t=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,l=!0,u=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){u=!0,o=e},f:function(){try{l||null==n.return||n.return()}finally{if(u)throw o}}}}(new FormData(d).entries());try{for(g.s();!(l=g.n()).done;){var m=e(l.value,2),h=m[0],p=m[1];if(h.startsWith("email4link["))f[h.split("[")[1].split("]")[0]]=p}}catch(e){g.e(e)}finally{g.f()}ee(f.email)?(J(),W({"tx_lux_fe[dispatchAction]":"email4LinkRequest","tx_lux_fe[identificator]":o.getIdentificator(),"tx_lux_fe[arguments][sendEmail]":"true"===c,"tx_lux_fe[arguments][href]":u,"tx_lux_fe[arguments][pageUid]":F(),"tx_lux_fe[arguments][values]":encodeURIComponent(JSON.stringify(f))},q(),"email4LinkLightboxSubmitCallback",{sendEmail:"true"===c,href:u,target:s})):Q(i.lightboxInstance.element().querySelector('[data-lux-email4link="errorEmailAddress"]'))};this.email4LinkLightboxSubmitCallback=function(e,t){Y(),!0===e.error?Q(i.lightboxInstance.element().querySelector('[data-lux-email4link="errorEmailAddress"]')):!0===t.sendEmail?($(i.lightboxInstance.element().querySelector('[data-lux-email4link="form"]')),Q(i.lightboxInstance.element().querySelector('[data-lux-email4link="successMessageSendEmail"]')),setTimeout((function(){i.lightboxInstance.close()}),2e3)):setTimeout((function(){var e=null;i.lightboxInstance.close(),""!==t.target&&null!==t.target&&(e=window.open(t.href,t.target)),null===e&&(window.location=t.href)}),500)};var E=function(e){var t=I(e,P()),i=e.value;W({"tx_lux_fe[dispatchAction]":"fieldListeningRequest","tx_lux_fe[identificator]":o.getIdentificator(),"tx_lux_fe[arguments][key]":t,"tx_lux_fe[arguments][value]":i,"tx_lux_fe[arguments][pageUid]":F()},q(),"generalWorkflowActionCallback",null)},_=function(e){for(var t={},i=0;i()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)},te=function(e){var t=e.replace(/^.*[\\\/]/,"");return ie(ne(t).toLowerCase(),["pdf","txt","doc","docx","xls","xlsx","ppt","pptx","jpg","png","zip"])&&(e=t),e},ie=function(e,t){for(var i=t.length,n=0;n