/* Minification failed. Returning unminified contents.
(269,43-44): run-time error JS1006: Expected ')': {
(269,83-84): run-time error JS1004: Expected ';': {
(282,3-4): run-time error JS1195: Expected expression: )
(369,15-16): run-time error JS1003: Expected ':': ,
(369,23-24): run-time error JS1003: Expected ':': }
(388,1-2): run-time error JS1107: Expecting more source characters
(268,1-43): run-time error JS1301: End of file encountered before function is properly closed: function getAdmissionItemInfo(productData)
(43,3-13): run-time error JS1300: Strict-mode does not allow assignment to undefined variables: singleItem
 */
'use strict';

/*jslint regexp: true, nomen: true, sloppy: true */
/*global require, define, alert, applicationConfig, location, document, window,  setTimeout, Countable */
$(document).ready(function () {
	if (window.gtmStarted === true) {
		$(document).on('click', '.js-add-to-cart', addToCart);
		$(document).on('click', '.js-remove-from-cart', removeFromCart);
		$(document).on('click', '.js-remove-from-cart-all', removeFromCartAll);
		$(document).on('click', '.js-gtm-increase-cart-item-quantity', increaseCartItemQuantity);
		$(document).on('click', '.js-gtm-decrease-cart-item-quantity', decreaseCartItemQuantity);
		$(document).on('click', '.js-add-to-cart-session', addToCartSession);
		$(document).on('click', '.js-remove-from-cart-session', removeFromCartSession);
	} else {
		console.log('gtm container NOT initialized');
	}
});

function addToCart(e) {
	var dataElement = $('[name=cartItemData]');

	// products data for gtm
	var data = {};

	// items data for gtm
	var items = {};

	if (dataElement.length === 0) {
		if ($('.rec-item__controls').length > 0) {
			data = getMultipleAddOnInfo();
		} else {
			data = getAdmissionInfo();
			items = getAdmissionItemInfo(data);
		}
	} else if (dataElement.length > 1) {
		if (window.location.href.toLowerCase().indexOf('membershipdetails') > 0) {
			data = [getSelectedMembership($(this))];
			items = getAdmissionItemInfo(data);
		} else {
			data = getSingleAddOnInfo($(this).closest('.rec-item__controls'));
		}
	} else {
		singleItem = JSON.parse(dataElement.val());

		if (singleItem.price === undefined) {
			singleItem.price = $('[name=Price]').val();
		}

		data = [singleItem];
	}
	
	var event = {
		'event': 'addToCart',
		'ecommerce': {
			'add': {
				'products': data,
				'items': items
			}
		}
	}

	var dataLayer = window.dataLayer = window.dataLayer || [];
	dataLayer.push(event);
}

function removeFromCart(e) {
	var data = getCartItemData.call(this);
	var items = getCartItemData2.call(this);
	var event = {
		'event': 'removeFromCart',
		'ecommerce': {
			'remove': {
				'products': [data],
				'items': [items]
			}
		}
	}

	var dataLayer = window.dataLayer = window.dataLayer || [];
	dataLayer.push(event);
}

function removeFromCartAll(e) {
	var data = $('[name=cartItemData]').map(function (index, item) {
		return JSON.parse($(item).val());
	}).toArray();

	var items = $('[name=cartItemData2]').map(function (index, item) {
		var parsedItem = JSON.parse($(item).val());
		return {
			'item_id': parsedItem.itemId,
			'name': parsedItem.name,
			'price': parsedItem.price,
			'item_category': parsedItem.itemCategory,
			'item_category2': parsedItem.itemCategory2,
			'item_category3': parsedItem.itemCategory3,
			'item_category4': parsedItem.itemCategory4
		}
	}).toArray();

	var event = {
		'event': 'removeFromCart',
		'ecommerce': {
			'remove': {
				'products': [data],
				'items': [items]
			}
		}
	};

	var dataLayer = window.dataLayer = window.dataLayer || [];
	dataLayer.push(event);
}

function increaseCartItemQuantity() {
	var data = getCartItemData.call(this);
	var items = getCartItemData2.call(this);

	var event = {
		'event': 'addToCart',
		'ecommerce': {
			'add': {
				'products': [data],
				'items': [items]
			}
		}
	}

	var dataLayer = window.dataLayer = window.dataLayer || [];
	dataLayer.push(event);
}

function decreaseCartItemQuantity() {
	var data = getCartItemData.call(this);
	var items = getCartItemData2.call(this);

	var event = {
		'event': 'removeFromCart',
		'ecommerce': {
			'remove': {
				'products': [data],
				'items': [items]
			}
		}
	}

	var dataLayer = window.dataLayer = window.dataLayer || [];
	dataLayer.push(event);
}

function getTicketType(externalId)
{
	if (externalId === undefined || externalId === null) return 'Other';
	switch (externalId.toLowerCase())
	{
		case "visit":
			return 'Admission';
		case "memb":
			return 'Membership';
		case "addon":
			return 'AddOn';
		case "exhibitions":
			return 'Exhibition';
		case "events":
			return 'Events';
		default:
			return 'Other';
	}
}

function getAdmissionInfo() {
	var data = $('.prices-table__quantity').map(function (index, item) {
		var priceElement = $('.prices-table__price:visible').slice(index, index + 1);
		return {
			'id': priceElement.attr('id'),
			'name': ($('[name="Title"]').val() || '').toLowerCase(),
			'price': (parseFloat(priceElement.text().trim().replace('$', '')) || 0).toFixed(2),
			'quantity': $(item).find('[name="Tickets[' + index + '].Quantity"]').val(),
			'category': (getTicketType($('#ExternalId').val() || $('[name$="ExternalId"]').val()) || '').toLowerCase(),
			'variant': ($(item).find('[name="Tickets[' + index + '].Title"]').val() || '').trim().toLowerCase(),
		};
	}).filter(function (index, item) {
		return item.quantity > 0;
	}).toArray();

	var eventsSelected = $('.js-check:checked').length;
	if (eventsSelected > 0) {
		var isEntireSeriesSelected = $('.js-check-all:checked').length === 1;
		if (isEntireSeriesSelected) {
			var seriesPrice = parseFloat($('.price-data').data('packagePrice'));
			var seriesPlu = $('[name$="PackagePlu"]').val();
			data.forEach(function(item) {
				item.id = seriesPlu;
				item.price = seriesPrice;
				item.category = 'Series';
			});
			return data;
		} else {
			data.forEach(function(item) {
				item.price = item.price / eventsSelected;
			});
			var dataToFill = data;
			for (var i = 1; i < eventsSelected; i++) {
				data = data.concat(dataToFill);
			}
		}
	}

	return data;
}

function getMultipleAddOnInfo(selector) {
	return $('.rec-item__controls').map(function (index, item) {
		return {
			'id': $(item).find('[name="Items[' + index + '].PLU"]').val(),
			'name': ($(item).find('[name="Items[' + index + '].Title"]').val() || '').toLowerCase(),
			'price': parseFloat($(item).find('[name="Items[' + index + '].Price"]').val()).toFixed(2),
			'quantity': $(item).find('[name="Items[' + index + '].Quantity"]').val(),
			'category': 'addon',
			'variant': $(item).find('[name="Items[' + index + '].MemberOnly"]').val() === "True" ? 'member' : 'retail',
		};
	}).filter(function (index, item) {
		return item.quantity > 0;
	}).toArray();
}

function getSingleAddOnInfo(selector) {
	return selector.map(function (index, item) {
		return {
			'id': $(item).find('[name="PLU"]').val(),
			'name': ($(item).find('[name="Title"]').val() || '').toLowerCase(),
			'price': parseFloat($(item).find('[name="Price"]').val()).toFixed(2),
			'quantity': $(item).find('[name="Quantity"]').val(),
			'category': 'addon',
			'variant': $(item).find('[name="MemberOnly"]').val() === "True" ? 'member' : 'retail',
		};
	}).toArray();
}

function getSelectedMembership(selector) {
	if (selector.closest('.account__membership').length > 0) {
		return JSON.parse(selector.closest('.account__membership').find('[name=cartItemData]').val());
	}

	return JSON.parse(selector.closest('.card').find('[name=cartItemData]').val());
}

function getCartItemData() {
	return JSON.parse($(this).closest('.cart-item').find('[name=cartItemData]').val());
}

function getCartItemData2() {
	var item = JSON.parse($(this).closest('.cart-item').find('[name=cartItemData2]').val());

	var mappedItem = {
		'item_id': item.itemId,
		'name': item.name,
		'price': item.price,
		'item_category': item.itemCategory,
		'item_category2': item.itemCategory2,
		'item_category3': item.itemCategory3,
		'item_category4': item.itemCategory4,
	};

	return mappedItem;
}

function getAdmissionItemInfo(productData) {
	var itemData = productData.map(function ({ id, name, price, category, variant }) {
		var mappedItem = {
			'item_id': id,
			'name': name,
			'price': price,
			'item_category': 'Sales',
			'item_category2': category === 'Series' ? 'events' : category,
			'item_category3': category === 'Series' ? 'recurring' : category === 'events' ? 'one-time' : variant
		};

		if (category === 'admission' && $('.tour-operator') == null) mappedItem.item_category4 = $('#' + id).attr('data-label').toLowerCase();

		return mappedItem;
	});
	return itemData;
}

function removeFromTourOperatorCart() {
	// products data for gtm
	var data = {};

	// items data for gtm
	var items = {};

	data = getAdmissionInfo();
	items = getAdmissionItemInfo(data);

	var event = {
		'event': 'removeFromCart',
		'ecommerce': {
			'remove': {
				'products': [data],
				'items': [items]
			}
		}
	}

	var dataLayer = window.dataLayer = window.dataLayer || [];
	dataLayer.push(event);
}

function addToCartSession() {
	var gtm = getGtmInfo();

	var event = {
		'event': 'addToCart',
		'ecommerce': {
			'add': {
				'products': gtm.data,
				'items': gtm.items
			}
		}
	}

	var dataLayer = window.dataLayer = window.dataLayer || [];
	dataLayer.push(event);
}

function toJson(element) {
	var contribution = 'contribution';
	var donation = 'donation';
	var zeroPrice = '0.00';
	var json = JSON.parse($(element).val());

	if (json.price === zeroPrice && (json.category == contribution || json.name == donation)) {
		json.price = getOtherDonationAmount();
	}

	return json;
}

function getOtherDonationAmount() {
	var amount = $('input[name=other-amount]').val();

	return Number(amount).toFixed(2);
}

function getGtmInfo() {
	// products data for gtm
	var data = [];

	// items data for gtm
	var items = [];

	var selectedItems = $('input:checked').filter(function () {
		return this.value !== '';
	});
	var selectedItemsData = selectedItems.siblings('[name=cartItemData]');
	var selectedItemsData2 = selectedItems.siblings('[name=cartItemData2]');

	selectedItemsData.each(function () {
		var json = toJson(this);
		data.push(json);
	});

	selectedItemsData2.each(function () {
		var json = toJson(this);
		items.push(json);
	});

	return { data, items };
}

function removeFromCartSession() {
	var gtm = getGtmInfo();

	var event = {
		'event': 'removeFromCart',
		'ecommerce': {
			'add': {
				'products': gtm.data,
				'items': gtm.items
			}
		}
	}

	var dataLayer = window.dataLayer = window.dataLayer || [];
	dataLayer.push(event);
};
