%PDF- %PDF- 403WebShell
403Webshell
Server IP : 37.220.80.31  /  Your IP : 3.15.239.209
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64
User : www-root ( 1010)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/www-root/data/www/dev.artlot24.ru/bitrix/js/landing/event-tracker/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/js/landing/event-tracker//event-tracker.js
;(function() {
	"use strict";

	BX.namespace("BX.Landing");

	var bind = BX.Landing.Utils.bind;
	var data = BX.Landing.Utils.data;
	var isEmpty = BX.Landing.Utils.isEmpty;
	var isPlainObject = BX.Landing.Utils.isPlainObject;
	var slice = BX.Landing.Utils.slice;
	var findParent = BX.Landing.Utils.findParent;
	var trim = BX.Landing.Utils.trim;
	var join = BX.Landing.Utils.join;
	var attr = BX.Landing.Utils.attr;


	/**
	 * Reduces tracking events
	 * @param {BX.Landing.EventTracker} tracker
	 * @param {HTMLElement} element
	 * @param {string} event
	 * @return {*}
	 */
	function trackingReducer(tracker, element, event)
	{
		switch (event)
		{
			case "show":
				return trackShowEvent(tracker, element);
			case "click":
				return trackClickEvent(tracker, element);
			default:
				return (function() {});
		}
	}


	/**
	 * Tracks shows element event
	 * @param {BX.Landing.EventTracker} tracker
	 * @param {HTMLElement} element
	 */
	function trackShowEvent(tracker, element)
	{
		if (!tracker.blockWiewMap.has(element))
		{
			tracker.intersectionObserver.observe(element);
			tracker.blockWiewMap.set(element, null);
		}
	}


	/**
	 * Track clicks on link or child links
	 * @param {BX.Landing.EventTracker} tracker
	 * @param {HTMLElement} element
	 */
	function trackClickEvent(tracker, element)
	{
		var items = [].concat(
			slice(element.querySelectorAll("a")),
			slice(element.querySelectorAll("button")),
			slice(element.querySelectorAll("[data-pseudo-url]"))
		);

		items.forEach(function(item) {
			if (!tracker.clickMap.has(item))
			{
				bind(item, "click", onClick.bind(null, tracker, item));
				tracker.clickMap.set(item, null);
			}
		});
	}


	/**
	 * Handles click events
	 * @param {BX.Landing.EventTracker} tracker
	 * @param item
	 */
	function onClick(tracker, item)
	{
		var block = findParent(item, {className: "block-wrapper"});

		var gaData = {
			type: "click",
			category: join("#", block.id),
			label: trim(item.innerText)
		};

		if (tracker.options.labelFrom === 'href')
		{
			if (item.tagName === 'A' && BX.Type.isStringFilled(item.href))
			{
				gaData.label = item.href;
			}
			else
			{
				var pseudoUrl = BX.Landing.Utils.data(item, 'data-pseudo-url');
				if (
					BX.Type.isPlainObject(pseudoUrl)
					&& pseudoUrl.enabled
					&& BX.Type.isStringFilled(pseudoUrl.href)
				)
				{
					gaData.label = pseudoUrl.href;
				}
			}
		}
		else if (!BX.Type.isStringFilled(gaData.label))
		{
			if (item.tagName === "IMG" && attr(item, "alt"))
			{
				gaData.label = attr(item, "alt");
			}
			else
			{
				var firstChild = item.firstElementChild;
				if (firstChild && firstChild.tagName === "IMG" && attr(firstChild, "alt"))
				{
					gaData.label = attr(firstChild, "alt");
				}
			}
		}

		tracker.push(gaData);
	}



	/**
	 * Fetches tracking options from element
	 * @param {HTMLElement} element
	 * @return {{
	 * 		[event]: string[]
	 * }}
	 */
	function fetchOptionsFromElement(element)
	{
		var sourceOptions = data(element);
		var resultOptions = {};

		if (isPlainObject(sourceOptions) && !isEmpty(sourceOptions))
		{
			resultOptions.event = sourceOptions["data-event-tracker"] || [];
			resultOptions.labelFrom = sourceOptions["data-event-tracker-label-from"] || "text";
		}

		return resultOptions;
	}


	/**
	 * Runs intersection timer
	 * @param {BX.Landing.EventTracker} tracker
	 * @param {HTMLElement} element
	 */
	function runIntersectionTimer(tracker, element)
	{
		clearIntersectionTimer(tracker, element);

		var timerId = setTimeout(function() {
			var block = findParent(element, {className: "block-wrapper"});
			tracker.push({category: "Block", type: "show", label: "#" + block.id});
		}, 1000);

		tracker.blockWiewMap.set(element, timerId);
	}


	/**
	 * Clears intersection timer
	 * @param {BX.Landing.EventTracker} tracker
	 * @param {HTMLElement} element
	 */
	function clearIntersectionTimer(tracker, element)
	{
		clearTimeout(tracker.blockWiewMap.get(element));
		tracker.blockWiewMap.set(element, 0);
	}


	/**
	 * Gets ration for IntersectionObserverEntry
	 * @param {IntersectionObserverEntry} entry
	 * @return {number}
	 */
	function getMinIntersectionRatio(entry)
	{
		var windowHeight = window.innerHeight;

		if (entry.boundingClientRect.height <= (windowHeight / 2))
		{
			return .9;
		}

		if (entry.boundingClientRect.height >= windowHeight)
		{
			var ratio = (
				Math.min(entry.boundingClientRect.height, windowHeight) /
				Math.max(entry.boundingClientRect.height, windowHeight)
			);

			return ratio - ((ratio / 100) * 10);
		}

		return 0.70;
	}


	/**
	 * Handles intersection event
	 * @param {BX.Landing.EventTracker} tracker
	 * @param {IntersectionObserverEntry[]} entries
	 */
	function onIntersect(tracker, entries)
	{
		entries.forEach(function(entry) {
			if (entry.intersectionRatio >= getMinIntersectionRatio(entry))
			{
				runIntersectionTimer(tracker, entry.target);
				return;
			}

			clearIntersectionTimer(tracker, entry.target);
		})
	}


	/**
	 * Implements interface for works with page events for analytics
	 * @constructor
	 */
	BX.Landing.EventTracker = function()
	{
		this.intersectionObserver = new IntersectionObserver(
			onIntersect.bind(null, this),
			{threshold: [0, .05, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]}
		);
		this.blockWiewMap = new WeakMap();
		this.clickMap = new WeakMap();
		this.services = [
			new BX.Landing.EventTracker.Service.GoogleAnalytics()
		];
		this.options = fetchOptionsFromElement(document.body);
	};


	/**
	 * Gets instance of BX.Landing.EventTracker
	 * @return {*}
	 */
	BX.Landing.EventTracker.getInstance = function()
	{
		return (
			BX.Landing.EventTracker.instance ||
			(BX.Landing.EventTracker.instance = new BX.Landing.EventTracker())
		);
	};


	BX.Landing.EventTracker.prototype = {
		/**
		 * Observes element events
		 * @param {HTMLElement} element
		 */
		observe: function(element)
		{
			var options = fetchOptionsFromElement(document.body);

			if (isPlainObject(options) && !isEmpty(options))
			{
				options.event.forEach(trackingReducer.bind(null, this, element));
			}
		},


		/**
		 * Pushes event to analytics services
		 * @param {{type: string, category: string, label: string, [...]}} data
		 */
		push: function(data)
		{
			this.services.forEach(function(service) {
				service.push(data);
			});
		},


		/**
		 * Runs events tracking
		 */
		run: function()
		{
			slice(document.querySelectorAll(".block-wrapper > *:first-child"))
				.forEach(this.observe, this);
		}
	};
})();

Youez - 2016 - github.com/yon3zu
LinuXploit