document.addEventListener("DOMContentLoaded", function ()
{
	KAEC.domInit();
});

window.addEventListener("load", function ()
{
	KAEC.documentLoadInit();
});

var KAEC =
{
	//------------------------------------------------------------------------------------

	//Кол-во элементов отправляемых в событии  GA
	gaEventMaxProduct: 5,

	scrollTopEventData:
	{
		//25% документа в пикселях
		"scrollTop25": null,
		//50% документа в пикселях
		"scrollTop50": null,
		//75% документа в пикселях
		"scrollTop75": null,
		//Ключ, что событие просмотра 25% документа уже отправлено
		"scrollTop25Key": false,
		//Ключ, что событие просмотра 50% документа уже отправлено
		"scrollTop50Key": false,
		//Ключ, что событие просмотра 75% документа уже отправлено
		"scrollTop75Key": false,
	},
	
	//------------------------------------------------------------------------------------

	//DOM модель сформирована
	domInit: function ()
	{
		this.initGA();
		this.initFBPixel();
	},

	//------------------------------------------------------------------------------------
	
	//Страница со всеми ресурсами загружена
	documentLoadInit: function ()
	{
		this.initScrollTopEvent();
	},
	
	//------------------------------------------------------------------------------------

	initGA: function(counter)
	{
		var counter = counter || 0;

		//Если было уже 7 попыток, то выходим
		if( 8 === counter )
		{
			return;
		}

		//Если gtag не объявлен, то ждем 250мс и пытаемся повторно
		if( "undefined" == typeof(gtag) )
		{
			setTimeout(function ()
			{
				KAEC.initGA(counter + 1);
			}, 250);

			return;
		}

		this.sendGAViewItemList();
		this.sendGAViewItem();
		this.sendGAViewCart();
		this.sendGAPurchase();
		this.sendGAPAECPageType();
	},

	//------------------------------------------------------------------------------------

	initFBPixel: function(counter)
	{
		var counter = counter || 0;

		//Если было уже 7 попыток, то выходим
		if( 8 === counter )
		{
			return;
		}

		//Если gtag не обьявлен то ждем 250мс и пытаемся повторно
		if( "undefined" == typeof(fbq) )
		{
			setTimeout(function ()
			{
				KAEC.initFBPixel(counter + 1);
			}, 250);

			return;
		}

		//this.sendFBViewContentForList();
		this.sendFBViewContentForOffer();
		this.sendFBViewContentForCart();
		this.sendFBPurchase();
	},

	//------------------------------------------------------------------------------------

	//Отправляет информацию в GA о просмотренных списках товаров
	sendGAViewItemList: function()
	{
		//Проверка обязательных переменных
		if( "undefined" == typeof(_kaecPageType) || "undefined" == typeof(_kaecOfferModList) )
		{
			return;
		}

		//Если мы находимся на странице товара, корзины, оформленного заказа, то ничего не делаем
		if( _kaecPageType == "offer" || _kaecPageType == "cart" || _kaecPageType == "cartSuccess" )
		{
			return;
		}

		//Счетчик, отвечает за позицию товара в списке
		var counter = 0;
		//Массив информации о товарах для GA
		var itemArray = [];

		//Обходим массив данных о товарах
		for( var key in _kaecOfferModList )
		{
			//Счетчик выводимых товаров
			counter++;

			//Cобираем массив с информацией о модификациях для отправки в ga
			itemArray.push(
			{
				"item_id": _kaecOfferModList[key].offerModId,
				"item_name": _kaecOfferModList[key].offerTitle,
				"item_category": _kaecOfferModList[key].catalogTitle,
				"item_brand": _kaecOfferModList[key].offerBrand,
				"item_list_name": this.getGAListName(),
				"index": counter,
				"price": _kaecOfferModList[key].gaOfferModPrice
			});
		}

		//Обходим массив информации о товарах и отправляем информацию частями, по несколько товаров за раз
		while(itemArray.length > 0)
		{
			//Достаем часть элементов массива
			var tmpItemArray = itemArray.splice(0, this.gaEventMaxProduct);

			//Отправляем информацию о просмотренных товарах
			var data =
			{
				"items": tmpItemArray
			};
			KAEC.sendGAEvent("view_item_list", data);
		}
	},

	//------------------------------------------------------------------------------------

	//Отправляет информацию в GA о просматриваемом товаре
	sendGAViewItem: function()
	{
		//Веходим если мы находимся НЕ на странице "товара"
		if( "undefined" == typeof(_kaecPageType) || _kaecPageType !== "offer" )
		{
			return;
		}

		//Проверка обязательных переменных
		if( "undefined" == typeof(_kaecOfferModList) || "undefined" == typeof(_kaecOfferPageOfferModKeyList) )
		{
			return;
		}

		//Счетчик, отвечает за позицию товара в списке
		var counter = 0;
		//Массив информации о товарах для GA
		var itemArray = [];
		//Общая стоимость просматриваемых товаров
		var totalValue = 0;

		//Обходим массив id модификуаций просматриваемого товара
		for( var i = 0; i < _kaecOfferPageOfferModKeyList.length; i++ )
		{
			var key = _kaecOfferPageOfferModKeyList[i];
			//Счетчик выводимых товаров
			counter++;

			//Cобираем массив с информацией о модификациях для отправки в ga
			itemArray.push(
			{
				"item_id": _kaecOfferModList[key].offerModId,
				"item_name": _kaecOfferModList[key].offerTitle,
				"item_category": _kaecOfferModList[key].catalogTitle,
				"item_brand": _kaecOfferModList[key].offerBrand,
				"item_list_name": this.getGAListName(),
				"index": counter,
				"price": _kaecOfferModList[key].gaOfferModPrice
			});

			//Подсчитываем общую ценность просматриваемых товаров
			totalValue = totalValue + _kaecOfferModList[key].gaOfferModPrice;
		}

		//Отправляем информацию о просматриваемом товаре
		var data =
		{
			"currency": _kaecGACurrencyCode,
			"value": totalValue,
			"items": itemArray
		};
		KAEC.sendGAEvent("view_item", data);
	},

	//------------------------------------------------------------------------------------

	//Отправляет информацию в GA о просмотренной корзине
	sendGAViewCart: function()
	{
		//Веходим если мы находимся НЕ на странице "корзина"
		if( "undefined" == typeof(_kaecPageType) || _kaecPageType != "cart" )
		{
			return;
		}

		//Проверка обязательных переменных
		if( "undefined" == typeof(_kaecViewCartOfferModList) )
		{
			return;
		}

		//Счетчик, отвечает за позицию товара в списке
		var counter = 0;
		//Массив информации о товарах
		var itemArray = [];
		//Общая стоимость просматриваемых товаров
		var totalValue = 0;

		//Обходим массив данных о товарах
		for( var key in _kaecViewCartOfferModList )
		{
			//Счетчик выводимых товаров
			counter++;

			//Cобираем массив с информацией о модификациях для отправки в ga
			itemArray.push(
			{
				"item_id": _kaecViewCartOfferModList[key].offerModId,
				"item_name": _kaecViewCartOfferModList[key].offerTitle,
				"item_category": _kaecViewCartOfferModList[key].catalogTitle,
				"item_brand": _kaecViewCartOfferModList[key].offerBrand,
				"item_list_name": this.getGAListName(),
				"index": counter,
				"price": _kaecViewCartOfferModList[key].gaOfferModPrice,
				"quantity": _kaecViewCartOfferModList[key].offerModAmount
			});

			//Подсчитываем общую ценность просматриваемых товаров
			totalValue = totalValue + (_kaecViewCartOfferModList[key].gaOfferModPrice * _kaecViewCartOfferModList[key].offerModAmount);
		}

		//Отправляем информацию о товарах в корзине
		var data =
		{
			"currency": _kaecGACurrencyCode,
			"value": totalValue,
			"items": itemArray
		};
		KAEC.sendGAEvent("view_cart", data);
	},

	//------------------------------------------------------------------------------------

	//Отправляет информацию в GA об оформленном заказе
	sendGAPurchase: function()
	{
		//Выходим, если мы находимся НЕ на странице "спасибо за заказ"
		if( "undefined" == typeof(_kaecPageType) || _kaecPageType != "cartSuccess" )
		{
			return;
		}

		//Проверка обязательных переменных
		if( "undefined" == typeof(_kaecPurchaseOfferModList) || "undefined" == typeof(_kaecPurchaseOrderCode) || "undefined" == typeof(_kaecPurchaseOrderDeliveryPrice) )
		{
			return;
		}

		//Счетчик, отвечает за позицию товара в списке
		var counter = 0;
		//Массив информации о товарах для GA
		var itemArray = [];
		//Общая стоимость просматриваемых товаров
		var totalValue = 0;

		//Обходим массив данных о товарах
		for( var key in _kaecPurchaseOfferModList )
		{
			//Счетчик выводимых товаров
			counter++;

			//Cобираем массив с ифномарцией о модификациях для отправки в ga
			itemArray.push(
			{
				"item_id": _kaecPurchaseOfferModList[key].offerModId,
				"item_name": _kaecPurchaseOfferModList[key].offerTitle,
				"item_category": _kaecPurchaseOfferModList[key].catalogTitle,
				"item_brand": _kaecPurchaseOfferModList[key].offerBrand,
				"item_list_name": this.getGAListName(),
				"index": counter,
				"price": _kaecPurchaseOfferModList[key].gaOfferModPrice,
				"quantity": _kaecPurchaseOfferModList[key].offerModAmount
			});

			//Подсчитываем общую ценность просматриваемых товаров
			totalValue = totalValue + (_kaecPurchaseOfferModList[key].gaOfferModPrice * _kaecPurchaseOfferModList[key].offerModAmount);
		}

		//Отправляем информацию о просматриваемом товаре
		var data =
		{
			"transaction_id": _kaecPurchaseOrderCode,
			"currency": _kaecGACurrencyCode,
			"shipping": _kaecPurchaseOrderDeliveryPrice,
			"value": totalValue,
			"items": itemArray,
		};
		KAEC.sendGAEvent("purchase", data);
	},

	//------------------------------------------------------------------------------------
	
	//Отправляет информацию в FB о просмотренных товарах
	sendFBViewContentForList: function()
	{
		//Проверка обьязательных переменных
		if( "undefined" == typeof(_kaecPageType) || "undefined" == typeof(_kaecOfferModList) )
		{
			return;
		}

		//Если мы находимся на странице товара, то не отправляем данные о просматриваемых списках товаров
		if( _kaecPageType == "offer" )
		{
			return;
		}

		//Массив ID модификаций
		var offerModIdArray = [];

		//Обходим массив данных о товарах
		for( var key in _kaecOfferModList )
		{
			//Собираем массив ID модификаций
			offerModIdArray.push(_kaecOfferModList[key].offerModId);
		}

		//Отправляем информацию о просмотренных товарах
		var data =
		{
			"content_ids": offerModIdArray,
			"content_type": "product"
		};
		KAEC.sendFBEvent("ViewContent", data);
	},

	//------------------------------------------------------------------------------------

	//Отправляет информацию в FB о просматриваемом товаре
	sendFBViewContentForOffer: function()
	{
		//Веходим если мы находимся НЕ на странице "спасибо за заказ"
		if( "undefined" == typeof(_kaecPageType) || _kaecPageType != "offer" )
		{
			return;
		}

		//Проверка обьязательных переменных
		if( "undefined" == typeof(_kaecOfferModList) || "undefined" == typeof(_kaecOfferPageOfferModKeyList) )
		{
			return;
		}

		//Массив ID модификаций
		var offerModIdArray = [];

		//Обходим массив id модификуаций просматриваемого товара
		for( var i = 0; i < _kaecOfferPageOfferModKeyList.length; i++ )
		{
			var key = _kaecOfferPageOfferModKeyList[i];

			//Собираем массив ID модификаций
			offerModIdArray.push(_kaecOfferModList[key].offerModId);
		}

		//Отправляем информацию о просмотренных товарах
		var data =
		{
			"content_ids": offerModIdArray,
			"content_type": "product"
		};
		KAEC.sendFBEvent("ViewContent", data);
	},

	//------------------------------------------------------------------------------------

	sendFBViewContentForCart: function()
	{
		//Веходим если мы находимся НЕ на странице "спасибо за заказ"
		if( "undefined" == typeof(_kaecPageType) || _kaecPageType != "cart" )
		{
			return;
		}

		//Проверка обьязательных переменных
		if( "undefined" == typeof(_kaecViewCartOfferModList) )
		{
			return;
		}

		//Массив ID модификаций
		var offerModIdArray = [];

		//Обходим массив данных о товарах
		for( var key in _kaecViewCartOfferModList )
		{
			//Собираем массив ID модификаций
			offerModIdArray.push(_kaecViewCartOfferModList[key].offerModId);
		}

		//Отправляем информацию о просмотренных товарах
		var data =
		{
			"content_ids": offerModIdArray,
			"content_type": "product"
		};
		KAEC.sendFBEvent("ViewContent", data);
	},

	//------------------------------------------------------------------------------------

	//Отправляет информацию в FB о оформленном заказе
	sendFBPurchase: function()
	{
		//Веходим если мы находимся НЕ на странице "спасибо за заказ"
		if( "undefined" == typeof(_kaecPageType) || _kaecPageType != "cartSuccess" )
		{
			return;
		}

		//Проверка обьязательных переменных
		if( "undefined" == typeof(_kaecPurchaseOfferModList) || "undefined" == typeof(_kaecPurchaseOrderCode) || "undefined" == typeof(_kaecPurchaseOrderDeliveryPrice) )
		{
			return;
		}

		//Массив ID модификаций
		var offerModIdArray = [];
		//Общая стоимость просматриваемых товаров
		var totalValue = 0;

		//Обходим массив данных о товарах
		for( var key in _kaecPurchaseOfferModList )
		{
			//Собираем массив ID модификаций
			offerModIdArray.push(_kaecPurchaseOfferModList[key].offerModId);

			//Подсчитываем общую ценность просматриваемых товаров
			totalValue = totalValue + (_kaecPurchaseOfferModList[key].fbOfferModPrice * _kaecPurchaseOfferModList[key].offerModAmount);
		}

		//Отправляем информацию о просмотренных товарах
		var data =
		{
			"currency": _kaecFBCurrencyCode,
			"value": totalValue,
			"content_ids": offerModIdArray,
			"content_type": "product"
		};
		KAEC.sendFBEvent("Purchase", data);
	},

	//------------------------------------------------------------------------------------
	
	//Отправляет информацию в GA и FB о добавлении товара в корзину
	/** @deprecated Неправильное имя метода addToCart. Оставлен для совместимости */
	addToCard: function(offerModId, amount)
	{
		KAEC.addToCart(offerModId, amount);
	},
	
	//------------------------------------------------------------------------------------
	
	//Отправляет информацию в GA и FB о добавлении товара в корзину
	addToCart: function(offerModId, amount)
	{
		KAEC.addTo("addToCart", offerModId, amount);
	},
	
	//------------------------------------------------------------------------------------
	
	//Отправляет информацию в GA и FB о добавлении товара в список желаний
	addToWishlist: function(offerModId, amount)
	{
		KAEC.addTo("addToWishlist", offerModId, amount);
	},
	
	//------------------------------------------------------------------------------------
	
	//Отправляет информацию в GA и FB о добавлении модификации в корзину
	addTo: function(type, offerModId, amount)
	{
		var amount = amount || 1;

		//Проверка обязательных переменных
		if( "undefined" == typeof(_kaecPageType) || "undefined" == typeof(_kaecOfferModList) )
		{
			return;
		}

		//Формируем имя свойства
		var key = "_" + offerModId;

		//Проверяем наличие данных о модификации которую добавляют в корзину
		if( "undefined" == typeof(_kaecOfferModList[key]) )
		{
			return;
		}
		
		var itemArray = [];
		
		//Информация о модификации для отправки в ga
		itemArray.push(
		{
			"item_id": _kaecOfferModList[key].offerModId,
			"item_name": _kaecOfferModList[key].offerTitle,
			"item_category": _kaecOfferModList[key].catalogTitle,
			"item_brand": _kaecOfferModList[key].offerBrand,
			"item_list_name": this.getGAListName(),
			"quantity": amount,
			"price": _kaecOfferModList[key].gaOfferModPrice
		});

		//Отправляем информацию в ga о добавлении модификации в корзину
		var data =
		{
			"currency": _kaecGACurrencyCode,
			"value": _kaecOfferModList[key].gaOfferModPrice * amount,
			"items": itemArray
		};
		KAEC.sendGAEvent(KAEC.getGAAddEventName(type), data);

		//Отправляем информацию в fb о добавлении модификации в корзину
		var data =
		{
			"currency": _kaecFBCurrencyCode,
			"value": _kaecOfferModList[key].fbOfferModPrice * amount,
			"contents": [
			{
				"id": _kaecOfferModList[key].offerModId,
				"quantity": amount
			}],
			"content_type": "product"
		};
		KAEC.sendFBEvent(KAEC.getFBAddEventName(type), data);
	},

	//------------------------------------------------------------------------------------
	
	//Вовзраащет имя события add_to_* для GA
	getGAAddEventName: function(type)
	{
		var eventName = "add_to_cart";
		
		if( type == "addToWishlist" )
		{
			eventName = "add_to_wishlist";
		}
		
		return eventName;
	},
	
	//------------------------------------------------------------------------------------
	
	//Вовзраащет имя события add_to_* для FB
	getFBAddEventName: function(type)
	{
		var eventName = "AddToCart";
		
		if( type == "addToWishlist" )
		{
			eventName = "AddToWishlist";
		}
		
		return eventName;
	},
	
	//------------------------------------------------------------------------------------
	
	//Отправляет информацию в GA о логине пользователя
	userLogin: function(method)
	{
		var method = method || "site";
		
		//Отправляем информацию в GA
		var data =
		{
			"method": method
		};
		KAEC.sendGAEvent("login", data);
	},
	
	//------------------------------------------------------------------------------------
	
	//Отправляет информацию в GA и FB о регистрации пользователя
	userSignUp: function (method)
	{
		var method = method || "site";
		
		//Отправляем информацию в GA
		var data =
		{
			"method": method
		};
		KAEC.sendGAEvent("sign_up", data);
		
		//Отправляем информацию в FB
		KAEC.sendFBEvent("CompleteRegistration");
		
	},
	
	//------------------------------------------------------------------------------------
	
	//Отправляет информацию в GA и FB о поисковом запросе пользователя
	search: function(searchString)
	{
		//Отправляем информацию в GA
		var data =
		{
			"search_term": searchString
		};
		KAEC.sendGAEvent("search", data);
		
		//Отправляем информацию в FB
		var data =
		{
			"search_string": searchString
		};
		KAEC.sendFBEvent("search", data);
	},
	
	//------------------------------------------------------------------------------------
	
	//Отправялет событие в GA
	sendGAEvent: function(eventName, data)
	{
		if( "undefined" == typeof(gtag) )
		{
			return;
		}
		
		var data = data || null;
		
		//Отправляем данные в GA
		if( data )
		{
			gtag("event", eventName, data);
		}
		else
		{
			gtag("event", eventName);
		}
		
		window.console.log("GA#" + eventName);
		window.console.log(data);
	},

	//------------------------------------------------------------------------------------

	//Отправялет событие в FB
	sendFBEvent: function(action, data)
	{
		var data = data || null;
		
		if( "undefined" == typeof(fbq) )
		{
			return;
		}
		
		//Отправляем данные в FB
		if( null == data )
		{
			fbq("track", action);
		}
		else
		{
			fbq("track", action, data);
		}
		
		window.console.log("FB#" + action);
		window.console.log(data);
	},

	//------------------------------------------------------------------------------------
	
	sendGAPAECPageType: function()
	{
		var pageType = "";

		switch( _kaecPageType )
		{
			case "index":
			{
				pageType = "index";
				break;
			}

			case "catalog":
			case "brand":
			case "catalogBrand":
			case "smartFilter":
			{
				pageType = "category";
				break;
			}

			case "offer":
			{
				pageType = "product";
				break;
			}

			case "cart":
			{
				pageType = "cart";
				break;
			}

			case "cartSuccess":
			{
				pageType = "cart_success";
				break;
			}

			default:
			{
				pageType = "other";
				break;
			}
		}
		
		var data =
		{
			"page_type": pageType
		};
		KAEC.sendGAEvent("paec_page_type", data);
	},

	//------------------------------------------------------------------------------------

	//Возвращает название списка товаров для электронной торговли google
	getGAListName: function()
	{
		var listName = "";

		switch( _kaecPageType )
		{
			case "index":
			{
				listName = "Index Page";
				break;
			}

			case "catalog":
			{
				listName = "Catalog Page";
				break;
			}

			case "brand":
			{
				listName = "Brand Page";
				break;
			}

			case "catalogBrand":
			{
				listName = "Catalog Brand Page";
				break;
			}

			case "smartFilter":
			{
				listName = "Smart Filter Page";
				break;
			}

			case "offer":
			{
				listName = "Offer Page";
				break;
			}

			case "page":
			{
				listName = "Static Page";
				break;
			}

			case "cart":
			{
				listName = "Cart Page";
				break;
			}

			case "cartSuccess":
			{
				listName = "Cart Success Page";
				break;
			}

			default:
			{
				listName = "Other Page";
			}
		}

		return listName;
	},

	//------------------------------------------------------------------------------------
	
	//Инициализация данных для работы события отслеживания глубины прокрутки
	initScrollTopEvent: function ()
	{
		//Высота отображаемой области документа в браузере
		var documentScrollHeight = document.body.scrollHeight;
		
		this.scrollTopEventData.scrollTop25 = parseInt(documentScrollHeight * 0.25);
		this.scrollTopEventData.scrollTop50 = parseInt(documentScrollHeight * 0.50);
		this.scrollTopEventData.scrollTop75 = parseInt(documentScrollHeight * 0.75);
		
		//Вешаем событие прокрутки
		window.addEventListener("scroll", this.pageScrollTop);
	},
	
	//------------------------------------------------------------------------------------
	
	pageScrollTop: function ()
	{
		//Текущая высота контентной области, которую просмотрел пользователь
		//Высота области отображение сайта + прокрутка от верха тсраницы
		var visibleContentScrollTop = window.innerHeight + window.scrollY;
		
		if( visibleContentScrollTop >= KAEC.scrollTopEventData.scrollTop25 && !KAEC.scrollTopEventData.scrollTop25Key )
		{
			KAEC.scrollTopEventData.scrollTop25Key = true;
			KAEC.sendGAEvent("paec_scroll_top_25");
		}
		
		if( visibleContentScrollTop >= KAEC.scrollTopEventData.scrollTop50 && !KAEC.scrollTopEventData.scrollTop50Key )
		{
			KAEC.scrollTopEventData.scrollTop50Key = true;
			KAEC.sendGAEvent("paec_scroll_top_50");
		}
		
		if( visibleContentScrollTop >= KAEC.scrollTopEventData.scrollTop75 && !KAEC.scrollTopEventData.scrollTop75Key )
		{
			KAEC.scrollTopEventData.scrollTop75Key = true;
			KAEC.sendGAEvent("paec_scroll_top_75");
		}
	}
	
	//------------------------------------------------------------------------------------
};
