var dove;
if (!dove) {
	dove = {};
}
if (!dove.widget) {
	dove.widget = {};
}
dove.widget.productBrowser = {
	element: ".productBrowser, .productRecommender",
	tabContainer: "tabsCont",
	tabListing: "tabListing",
	panelContainer: "panelCont",
	productData: null,
	categoryLanding: null,
	productRecommender: false,
	// headingResults: '<p class="heading HeadingResults">I&acute;m looking for {{CATEGORY}} (#{{RESULTS}} Results) :</p>',
	headingResults : '<p class="heading HeadingResults">I\'m looking for {{CATEGORY}} products: {{PRODUCTTYPE}} {{RESULTS}} Results.</p>',
	fetchProductData: function (category, params) {
		var	methodData, methodLink, tb = this;
		if (category !== "") {
			categoryName = tb.productData[category].CategoryName;
		} else if (tb.categoryLanding === "true") {
			if ($("input#categoryName").length > 0) {
				categoryName = $("input#categoryName").val();
			}
		} else {
			categoryName = "";
		}
		methodData = {
			allProducts: "{\"subCategoryName\" : \"\"}",
			categoryProducts: "{\"subCategoryName\" : \"" + categoryName + "\"}",
			ProductsType: "{\"CategoryName\":\"" + categoryName + "\",\"subProductNeed\":\"\",\"subProductType\":\"" + params.value + "\"}",
			ProductsNeed: "{\"CategoryName\":\"" + categoryName + "\",\"subProductNeed\":\"" + params.value + "\",\"subProductType\":\"\"}"
		};
		methodLink = {
			allProducts: "/ProductService.svc/LoadProductCategoryLanding",
			categoryProducts: "/ProductService.svc/LoadCategoryLanding",
			ProductsType: "/ProductService.svc/LoadProductCategoryTypewise",
			ProductsNeed: "/ProductService.svc/LoadProductCategoryTypewise"
		};
		
		$.ajax({
			type: "POST",
			url: methodLink[params.type],
			data: methodData[params.type],
			contentType: "application/json; charset=utf-8",
			success: function (data) {
				if (!data.hasOwnProperty("d")) {
					return false;
				}
				var obj = jQuery.parseJSON(data.d);
				
				if (params.isSearchdData === "true") {
					if (typeof obj !== "undefined" && obj.length > 0) {
						tb.productData[category].searchData = obj[0].ProductList;
						//if(tb.updatePanelWithSearchPanel(category,{})){tb.bindWithDoveUITabs();}
						tb.createUpdatePanelComponents(category, {
							eventType: "updateSearch",
							label : params.label	
						});
					} else {
						tb.updatePanelWithSearchError(category, {});
					}
				} else {
					if (typeof obj !== "undefined" && obj.length > 0) {
						tb.productData = obj;
						tb.totalCategories = obj.length;
						if (tb.processData()) {
							if (tb.productRecommender) {
								tb.bindWithDoveUITabs();
								setTimeout(function () {
									$(".innerTabsCont a[title=" + decodeURI(tb.defaultRecommenderCategory) + "]").click();
								}, 50);
								setTimeout(function () {
									tb.preload.hide();
								}, 50);
							} else {
								tb.bindWithDoveUITabs();
								tb.preload.hide();
							}
						}
					}
				}
			},
			error: function (xhr, status, error) {
				dove.log("Error");
			}
		});
	},
	bindWithDoveUITabs: function () {
		var tb = this;
		setTimeout(function () {
			$(tb.element).doveUITabs({
				tabClickCallBack: function (params) {
					ntptEventTag("ev=RightProduct&link=" + tb.productData[params.index].CategoryName );
					tb.updatePanelData(params.index, "");
				}
			});
		}, 50);
	},
	processData: function (data) {
		var tb = this;
		$(tb.productData).each(function (i) {
			this.searchData = {};
			this.hasSearchData = "false";
			tb.panelContainer.append(tb.createPanel(i, {}));
		});
		// Load First Panel
		tb.createUpdatePanelComponents(0, {
			eventType: "create"
		});
		return true;
	},
	processSearch: function (category, params) {
		var tb = this;
		if (params.value !== "") {
			this.fetchProductData(category, {
				type: params.type,
				value: params.value,
				label : params.label,
				isSearchdData: "true"
			});
		}
	},
	createUpdatePanelComponents: function (category, params) {
		var tb = this,
			categoryPanel = $(".categoryPanel-" + category, tb.element),
			searchCont = categoryPanel.find(".searchContainer"),
			productListing = categoryPanel.find(".productListingContainer"),
			recommendedProducts = null,
			productCarousel,count,heading;
			
			categoryPanel.attr("data-haslisting", "true");
		
		if (params.eventType === "create") {
			categoryPanel.attr("data-hassearchdata", "false");
			productCarousel = tb.createListingOfProducts(tb.productData[category].ProductList);
			$(searchCont).append(tb.createSearchParameters(category));
			$(productListing).append(productCarousel);
			productCarousel.jcarousel();
			if (tb.productRecommender && tb.productData[category].RecommendedProducts.length > 0) {
				recommendedProducts = categoryPanel.find(".recommendedProductsContainer");
				$(recommendedProducts).append(tb.createRelatedProductsSection(category));
			}
		} else if (params.eventType === "updateAll") {
			categoryPanel.attr("data-hassearchdata", "false");
			if (tb.productRecommender) {
				count = tb.productData[category].ProductList.length;
				heading = tb.headingResults
				.replace(/\{\{RESULTS\}\}/, count)
				.replace(/\{\{CATEGORY\}\}/, tb.productData[category].CategoryName)
				.replace(/\{\{PRODUCTTYPE\}\}/, "");
				
				$("p.HeadingResults", categoryPanel).replaceWith(heading);
			}
				productCarousel = tb.createListingOfProducts(tb.productData[category].ProductList);
				var productListingCar = $(productListing).find(".jcarousel-container-horizontal").remove();
			$(productListing).append(productCarousel);
			productCarousel.jcarousel();
		} else if (params.eventType === "updateSearch") {
			if (tb.productRecommender) {
				count = tb.productData[category].searchData.length;
				heading = tb.headingResults
				.replace(/\{\{RESULTS\}\}/, count)
				.replace(/\{\{CATEGORY\}\}/, tb.productData[category].CategoryName)
				.replace(/\{\{PRODUCTTYPE\}\}/, params.label);;
				
				
				$("p.HeadingResults", categoryPanel).replaceWith(heading);
			}
			categoryPanel.attr("data-hassearchdata", "true");
				productCarousel = tb.createListingOfProducts(tb.productData[category].searchData);
				var productListingCar = $(productListing).find(".jcarousel-container-horizontal").remove();
			$(productListing).append(productCarousel);
			productCarousel.jcarousel();
		}
	},
	updatePanelData: function (category, params) {
		var tb = this;
		var panel = $(".categoryPanel-" + category, tb.element);
		if (panel.attr("data-haslisting") === "false" && panel.attr("data-hassearchdata") === "false") {
			tb.createUpdatePanelComponents(category, {
				eventType: "create"
			});
		} else if (panel.attr("data-hassearchdata") === "true" && panel.attr("data-haslisting") === "true") {
			tb.createUpdatePanelComponents(category, {
				eventType: "updateAll"
			});
		}
	},
	updatePanelWithSearchError: function (category, params) {
		var tb = this;
		var categoryPanel = $(".categoryPanel-" + category, tb.element).attr("data-hassearchdata", "true");
		var panel = '<ul class="jcarousel-container-horizontal searchError"><li>No Results Found</li></ul>';
		$(".categoryPanel-" + category + " .jcarousel-container-horizontal", tb.element).replaceWith(panel);
		
		if (tb.productRecommender) {
			var heading = tb.headingResults
			.replace(/\{\{RESULTS\}\}/, 0)
			.replace(/\{\{PRODUCTTYPE\}\}/, "")
			.replace(/\{\{CATEGORY\}\}/, tb.productData[category].CategoryName);
			$("p.HeadingResults", categoryPanel).replaceWith(heading);
		}
	},
	createListingOfProducts: function (dataArray) {
		var tb = this;
		var ul = $("<ul>").addClass("productListing");
		var data = dataArray;
		$(data).each(function (i) {
			var productDescription = "",
				learnmoreLink = "",
				ProductBuyURL = "",
				buynowLink = "",
				productTitle = "",
				productImage = "";
			if (typeof this.ProductDescription === "string" && this.ProductDescription.replace(/ /g, "") !== "")
				{productDescription = '<p class="desc">' + this.ProductDescription + '</p>';}
			if (typeof this.LinkURl === "string" && this.LinkURl.replace(/ /g, "") !== "") 
				{learnmoreLink = '<a title="Learn More" href="' + this.LinkURl + '" class="learn-more">' + this.LinkText + '</a>';}
			if (typeof this.ProductBuyURL === "string" && this.ProductBuyURL.replace(/ /g, "") !== "") 
				{buynowLink = '<a title="Buy Now" target="_parent" href="' + this.ProductBuyURL + '" class="CTA-buttons buyNowAlign"><span><span>' + this.ProductBuyText + '</span></span></a>';}
				
			if (!tb.productRecommender) {
				productTitle = '<h3 title ="' + this.ProductTitle + '" data-tcm="' + this.tcmURI + '" data-sku="' + this.ProductSKU + '">' + this.ProductName + '</h3>';
				productImage = '<img class="pImage-' + i + '" data-loaded="true" data-src="/Resources/Images/slider.png" src="' + this.SmallImageURL + '" alt="' + this.ProductTitle + '" title="' + this.ProductTitle + '" />';
			} else {
				if (typeof this.LinkURl === "string" && this.LinkURl.replace(/ /g, "") !== "") {
					productTitle = '<h3 title ="' + this.ProductTitle + '" data-tcm="' + this.tcmURI + '" data-sku="' + this.ProductSKU + '">';
					productTitle += '<a target="_parent" href="' + this.LinkURl + '" title="' + this.ProductName + '">' + this.ProductName + ' <img src="/Resources/Images/background/more-arrow.png" alt="" title="" />' + '</a>';
					productTitle += '</h3>';
				} else {
					productTitle = '<h3 title ="' + this.ProductTitle + '" data-tcm="' + this.tcmURI + '" data-sku="' + this.ProductSKU + '">' + this.ProductName + '</h3>';
				}
				productImage = '<img class="pImage-' + i + '" data-loaded="true" data-src="/Resources/Images/slider.png" src="' + this.ThumbnailImageURL + '" alt="' + this.ProductTitle + '" title="' + this.ProductTitle + '" />';
			}
			
			var imageLinkURL = this.LinkURl || "javascript:void(0);"
			
			var html = '<div class="carousel-products productImages"><a target="_parent" href="'+imageLinkURL+'">' + productImage + '</a></div>' + '<div class="carousel-prod-details">' + productTitle + productDescription + learnmoreLink + buynowLink + '</div>';
			var li = $("<li>").addClass("product").html(html).appendTo(ul);
		});
		return ul;
	},
	createSearchParameters: function (category, params) {
		var tb = this,
			searchCont = "";
		if ((tb.productData[category].ProductsNeed.length > 0 && typeof tb.productData[category].ProductsNeed !== "undefined") || (tb.productData[category].ProductsType.length > 0 && typeof tb.productData[category].ProductsType !== "undefined")) {
			searchCont = $("<div>").addClass("searchCont");
			if (tb.productData[category].ProductsNeed.length > 0 && typeof tb.productData[category].ProductsNeed !== "undefined") {
				var productsNeed = tb.createProductSearchFeilds(category, {
					type: "ProductsNeed",
					label: "By Need"
				});
				productsNeed.appendTo(searchCont);
			}
			if (tb.productData[category].ProductsType.length > 0 && typeof tb.productData[category].ProductsType !== "undefined") {
				var productsType = tb.createProductSearchFeilds(category, {
					type: "ProductsType",
					label: "By Product"
				});
				productsType.appendTo(searchCont);
			}
			var categoryLinkCont = $('<div>').addClass("categoryLinkCont")
.html('<span class="or">OR</span><a title="Explore the Whole Line" class="CTAButtons" href="javascript:dove.widget.productBrowser.callExplorePage(\''+tb.productData[category].CategoryPageURL+'\')"><span><span>Explore the Whole Line</span></span></a>').appendTo(searchCont);
		}
		
		
			return searchCont;
		},
	callExplorePage : function(url)
		{
			ntptEventTag("ev=RightProduct&link=ExploretheWholeLine"); 
			setTimeout(function(){window.location = url;},50)		
		},
	createProductSearchFeilds: function (category, params) {
		var tb = this;
		var searchFieldCont = $("<div>").addClass("searchFeildCont");
		var searchSelect = $("<select>").addClass("searchSelect " + params.type).appendTo(searchFieldCont);
		var searchInput = $('<a>').val("go").attr("title", "Search").addClass("searchButton searchSmallButton").html("<span></span>").appendTo(searchFieldCont).click(function (e) {
			e.preventDefault();			
			$("select", tb.element).each(function(i){			
				if(!$(this).hasClass(params.type))
					{
						$(this).val(0);
					}			
			});
			
			ntptEventTag("ev=RightProduct&link=" +params.type);
			
			tb.processSearch(category, {
				type: params.type,
				value: searchSelect.val(),
				label : searchSelect.val()
			});
		});
		var option = '<option value="">' + params.label + '</option>';
		searchSelect.append(option);
		$(tb.productData[category][params.type]).each(function (i) {
			var keyValue = this.split("###"), option = '<option value="' + keyValue[0] + '">' + keyValue[1] + '</option>';
			searchSelect.append(option);
		});
		return searchFieldCont;
	},
	createRelatedProductsSection: function (category) {
		var reletedProducts = $("<div>").addClass("wCurve reletedProducts").html('<span class="top-left" style="background-image: url(/Resources/Images/background/curve-8px.png); background-repeat: no-repeat;"></span><span class="top-right" style="background-image: url(/Resources/Images/background/curve-8px.png); background-repeat: no-repeat;"></span><span class="btm-left" style="background-image: url(/Resources/Images/background/curve-8px.png); background-repeat: no-repeat;"></span><span class="btm-right" style="background-image: url(/Resources/Images/background/curve-8px.png); background-repeat: no-repeat;"></span><h2>Other Products you may enjoy</h2>');
		tb = this;
		$(tb.productData[category].RecommendedProducts).each(function (i) {
			var data = this,
				html = '<div class=\"product\">' + '<div class="figure">' + '<img src="' + data.ThumbnailImageURL + '" alt="" title="' + data.ProductName + '" />' + '</div>' + '<div class="aside">' + '<h3>' + '<a href="">' + data.ProductName + ' <img src="/Resources/Images/background/more-arrow.png" alt="" title="" />' + '</a>' + '</h3>' + '<a class="CTA-buttons buyNowAlign" href="' + data.ProductBuyURL + '" title="' + data.ProductBuyText + '"><span><span>' + data.ProductBuyText + '</span></span></a>' + '</div>' + '</div>';
			reletedProducts.append(html);
		});
		return reletedProducts;
	},
	createPanel: function (category, params) {
		var tb = this, searchCont, html = '<div class="searchContainer">';
		if (tb.productRecommender) {
			html = html + '<p class="heading">To find the right products just for you, select the symptom or product category you&acute;re looking for:</p>';
		}
		html = html + '</div>' + '<div class="productListingContainer">';
		if (tb.productRecommender) {
			var heading = tb.headingResults
			.replace(/\{\{RESULTS\}\}/, tb.productData[category].ProductList.length)
			.replace(/\{\{PRODUCTTYPE\}\}/, "")
			.replace(/\{\{CATEGORY\}\}/, tb.productData[category].CategoryName);
			html = html + heading;
		}
		html = html + '</div>';
		if (tb.productRecommender) {
			html = html + '<div class="recommendedProductsContainer"></div>';
		}
		var panel = $("<div>").addClass("panel UITabPanel categoryPanel-" + category).attr("title", tb.productData[category].CategoryName).attr("data-hassearchdata", "false").attr("data-haslisting", "false").html(html);
		return panel;
	},
	preload: {
		show: function () {
			$(".preloader", this.element).show();
		},
		hide: function () {
			setTimeout(function () {
				$(".preloader", this.element).fadeOut(250);
			}, 50);
		}
	},
	getQueryString: function (key, default_) {
		if (default_ === null) {default_ = "";}
		key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
		var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
		var qs = regex.exec(window.location.href);
		if (qs === null) {return default_;}
		else {return qs[1];}
	},
	init: function () {
		var tb = this;
		if (tb.productRecommender) {
			tb.defaultRecommenderCategory = tb.getQueryString("category");
		}
		if (tb.categoryLanding === "true") {
			this.fetchProductData("", {
				type: "categoryProducts"
			});
		} else {
			this.fetchProductData("", {
				type: "allProducts"
			});
		}
		this.element = $(tb.element);
		this.panelContainer = $("<div>").addClass(tb.panelContainer + " wCurveWithoutTop");
		this.panelContainer.appendTo(this.element);
	}
};
