jQuery(function ($) {

	//register all templates with partialName defined as a partial
	//ex. <script id="myTemplate" type="text/template" partialName="myPartial">
	$('script[type="text/template"][partialName][partialName!=""]').each(function() {
		Handlebars.registerPartial(this.attributes.partialname.value, this.innerHTML);
	});

	function goToMyOrders() {
		window.location.href = '/Store/ccrz__MyAccount?cartId=' + CCRZ.pagevars.currentCartID + '&viewState=myOrders' + getCSRQueryString();
	}

	Handlebars.registerHelper('formatLeadTime', function(days){
		if(days > 19){
			if(days % 5 >= 2) {
				days = Math.ceil(days / 5);
			} else {
				days = Math.floor(days / 5);
			}
			return Math.round(days) + ' weeks';
		} else {
			return days + ' business days';
		}
	});

	Handlebars.registerHelper('getviewMode', function() {
		let urlParams = new URLSearchParams(window.location.search);
		let viewMode = urlParams.get('viewState');
		return viewMode;
	});

	Handlebars.registerHelper("inc", function(value, options){
		return parseInt(value) + 1;
	});

	Handlebars.registerHelper('any', function () {
		let result = false;
		argList=_.values(arguments);
		argList.pop();
		_.each(argList, function(val, index){
			if(val) result = true;
		});
		return result;
	});
	Handlebars.registerHelper('all', function () {
		let result = true;
		_.each(arguments, function(val, key){
			if(!val) result = false;
		});
		return result;
	});
	Handlebars.registerHelper('colorCode', function (clr) {
		let colorCode = clr;
		if (colorCode) {
			if (colorCode.indexOf('#') != 0 && colorCode.indexOf('rgb') != 0) {
				colorCode = '#' + colorCode;
			} else if (colorCode.indexOf('(') == 0) {
				let colorCodeArray = colorCode.split(',');
				if (colorCodeArray.length == 4) {
					colorCode = 'rgba' + colorCode;
				} else {
					colorCode = 'rgb' + colorCode;
				}
			}
		}
		return colorCode;
	});
	Handlebars.registerHelper('checkNotCheckout', function () {
		let url = window.location.pathname;
		return !url.includes('ccrz__CheckoutNew');
	});
	Handlebars.registerHelper('IsProdStore', function () {
		return B2C_UrlUtility.isProdUrl();
	});
	Handlebars.registerHelper('envStoreUrl', function (url) {
		return B2C_UrlUtility.getEnvironmentUrl(url);
	});
	Handlebars.registerHelper("with", function (context, options) {
		return options.fn(context);
	});
	Handlebars.registerHelper('localeSwitcher', function () {
		if (CCRZ.navLocaleSwitcherView) {
			return CCRZ.navLocaleSwitcherView.model.attributes;
		} else {
			return {};
		}
	});
	Handlebars.registerHelper('checkIfEPPDiscountApplies', function () {
		return !!(sessionStorage.getItem('eppDiscountEnabled')); // != null
	});
	Handlebars.registerHelper('checkIfMessageEnabled', function () {
		return !(sessionStorage.getItem('disableMessage')); // == null
	});
	Handlebars.registerHelper('ifMapHasOneElement', function (map, options) {
		if (Object.keys(map).length == 1) {
			return options.fn(this);
		}
		return options.inverse(this);
	});
	Handlebars.registerHelper('negative', function (value) {
		return '(' + value.replace('-', '') + ')';
	});
	Handlebars.registerHelper('matches', function (left, right) {
		if (left) {
			if (left.string) {
				return left.string.trim() === right.trim();
			}
		}
		return false;
	});
	Handlebars.registerHelper('minus', function (left, right) {
		left = left ? left : 0;
		right = right ? right : 0;
		return left - right;
	});
	Handlebars.registerHelper('increment', function (x) {
		return x + 1;
	});
	Handlebars.registerHelper('isWfh', function () {
		let isWfh = false;
		if (CCRZ.headerModel && CCRZ.headerModel.get('isWfh')) {
			isWfh = true;
		}
		else if (this.isWfh){
			isWfh = true;
		}
		return isWfh;
	});
	Handlebars.registerHelper('checkNotCheckout', function () {
		let url = window.location.pathname;
		return !url.includes('ccrz__CheckoutNew');
	});

	Handlebars.registerHelper('formatCurrency', function(price, theCurrency) {
		return formatPrice(price, theCurrency);
	});

	Handlebars.registerHelper('calcItemTotal', function(value, qty) {
		return (value*qty).toFixed(2);
	});

	Handlebars.registerHelper('displayAsHtml', function(value) {
		return new Handlebars.SafeString(value);
	});

	Handlebars.registerHelper('OpenPDPEdit', function(Cartsfid, SKU) {
		let currURL = window.location.href;
		currURL = currURL+'&sku='+SKU;
		currURL = currURL+'&cartItemId='+Cartsfid;
		if (currURL.includes('viewState=')) {
			currURL= currURL.replace(/(viewState=).*?(&)/,'$1' +'EditView'+ '$2');
		} else{
			currURL += '&viewState=EditView';
		}

		currURL = currURL.replace('ccrz__Cart','ccrz__ProductDetails');
		return encodeURI(currURL);
	});

	Handlebars.registerHelper('setKitData', function(value) {
		kitItemUrl = value.STEXCartImageURL;
		settingsName = value.product.sfdcName;
		settingsQty = value.quantity;
	});

	Handlebars.registerHelper('displayKitData', function(type) {
		if(type=='img'){
			return encodeURI(kitItemUrl);
		}
		else if(type=='settingsName') return settingsName;
		else if(type=='settingsQty') return settingsQty;
	});

	Handlebars.registerHelper('displayKitFeature', function(value) {
		var feature='';
		if(value!=null || value==''){
			var ItemFeature = JSON.parse(value);
			feature += '<p class="cart-detail-text">';
			for(var i = 0; i < ItemFeature.length; i++) {
				feature += ItemFeature[i].ValueName;
				if (i < ItemFeature.length - 1) feature += ', ';
			}
			feature += '</p>';
		}
		return new Handlebars.SafeString(feature);
	});

	Handlebars.registerHelper('isShorterThan', function(relatedProductsList, maxLength, options){
		if (relatedProductsList.length > maxLength) {
			return options.fn(this);
		}
		return options.inverse(this);
	});

	Handlebars.registerHelper('getCartProductName', function(orderMap){
		if(Object.keys(orderMap).length>0){
			for(var key in orderMap){
				return orderMap[key][0]["productName"];
			}
		}
		return "No product name available."
	});

	Handlebars.registerHelper('removePTagFromRichText', function(rT) {
		if (rT.string != undefined) {
			const len = rT.string.length;
			if(len >= 7 &&  rT.string.substring(0,3) === '<p>' && rT.string.substring(len-4, len) === '</p>') {
				return rT.string.substring(3, len-4);
			}
		}
		return rT;
	});

	Handlebars.registerHelper('showIfReviewsDesktopEnabled', function (options) {
		if(CCRZ.pagevars.pageConfig['pd.enableproductreviews'] == "TRUE" && CCRZ.productDetailModel.attributes.showReviews && $(window).width() > 768){
				return options.fn(this);
		}
		return options.inverse(this);
	});
	
	Handlebars.registerHelper('showIfReviewsMobileEnabled', function (options) {
		if(CCRZ.pagevars.pageConfig['pd.enableproductreviews'] == "TRUE" && CCRZ.productDetailModel.attributes.showReviews && $(window).width() <= 768){
				return options.fn(this);
		}
		return options.inverse(this);
    });


    Handlebars.registerHelper('showIfMobileEnabled', function (options) {
		if($(window).width() <= 768){
				return options.fn(this);
		}
		return options.inverse(this);
	});
	
	Handlebars.registerHelper('showIfDesktopEnabled', function (options) {
		if($(window).width() > 768){
				return options.fn(this);
		}
		return options.inverse(this);
	});

	Handlebars.registerHelper('displayImageLazy',function(obj,styleClass,options){
		if(options&&options.hash['src']){
			var imgSrc=_.escape(options.hash['src']);
		} else{
			var imgSrc=CCRZ.processImageURL(obj,styleClass,options);
		}

		var alt="";

		if(options&&options.hash['alt']) alt=_.escape(options.hash['alt']);

		var dataId="";

		if(options&&options.hash['dataId']) dataId=_.escape(options.hash['dataId']);

		if(imgSrc.length>0) return new Handlebars.SafeString("<img loading='lazy' class='"+styleClass+"' src='"+imgSrc+"' alt='"+alt+"' data-id='"+dataId+"' />");
		else return new Handlebars.SafeString("<img loading='lazy' class='"+styleClass+" "+CCRZ.pagevars.userLocale+" noImg' alt='"+alt+"' data-id='"+dataId+"' />");
	});

	Handlebars.registerHelper('pageLabelMapSafe', function(labelName) {
		let params = Array.prototype.slice.call(arguments,1)
		let label = Handlebars.helpers.removePTagFromRichText(
			CCRZ.processPageLabelMap(labelName, params)
		);
		return (typeof label == 'string') ? label : label?.string;
	})

	Handlebars.registerHelper('equals', function(arg1, arg2) {
		return arg1 == arg2;
	});
});
