sjq(document).ready(function () {
	ATGSvcs.rec_builder("LEGO_rec_builder", buildRecommendation);
});

LEGO.rec = LEGO.rec || {
	init : function() {
		ATGSvcs.l10n.register("CA", function() {});
		ATGSvcs.l10n.register("US", function() {});
		ATGSvcs.l10n.register("AU", function() {});
		ATGSvcs.l10n.register("DK", function() {});
		ATGSvcs.l10n.register("BE", function() {});
		ATGSvcs.l10n.register("AT", function() {});
		ATGSvcs.l10n.register("FI", function() {});
		ATGSvcs.l10n.register("FR", function() {});
		ATGSvcs.l10n.register("DE", function() {});
		ATGSvcs.l10n.register("IE", function() {});
		ATGSvcs.l10n.register("IT", function() {});
		ATGSvcs.l10n.register("LU", function() {});
		ATGSvcs.l10n.register("NL", function() {});
		ATGSvcs.l10n.register("PT", function() {});
		ATGSvcs.l10n.register("ES", function() {});
		ATGSvcs.l10n.register("NZ", function() {});
		ATGSvcs.l10n.register("SE", function() {});
		ATGSvcs.l10n.register("CH", function() {});
		ATGSvcs.l10n.register("UK", function() {});
		ATGSvcs.l10n.register("PL", function() {});
		ATGSvcs.l10n.register("NO", function() {});
		ATGSvcs.l10n.register("CZ", function() {});
		ATGSvcs.l10n.register("HU", function() {});
		ATGSvcs.l10n.register("KR", function() {});
	},
	recFields : [
	    "title",
	    "link",
	    "image_link",
	    "retail_price",
	    "BV_rating",
	    "currency"
	],
	showQuickViewModal : function (event) {
		event.preventDefault();
		sjq.ajax({
			url: event.currentTarget.href,
			context: document.body,
			success: function(html){
				LEGO.modal.openModal(null, {name:LEGO.modal.quickView, source:html})
			},
			error: function(jqXHR, textStatus, errorThrown){
				throw new Error ("Recommendations:\nError loading async modal:\njqXHR: " + jqXHR + "\ntextStatus: " + textStatus + "\nerrorThrown: " + errorThrown);
			},
			dataType: 'html'
		});
	},
	recDataForLocale : function (rec_data) {
		var locale = LEGO.currentLocale;

		// to keep IE happy
		for (var i = 0; i < this.recFields.length; i++) {
			var fieldBase = this.recFields[i];
			rec_data[fieldBase] = rec_data[fieldBase + "_" + locale];
		};

		// Just in case retail price is 0 (free product?)
		if (!rec_data['retail_price'] && rec_data['retail_price'] !== 0) {
			rec_data['product-unavailable'] = true;
		}
	},
	handleAddToBasket : function(event) {
		event.preventDefault();
		document.addRecToCart.productCode.value = sjq(this).attr('productCode');
		if (LEGO.recommendationFullSubmit) {
			document.addRecToCart.successURL.value = LEGO.recommendationFullSubmitURL;
			document.addRecToCart.errorURL.value = LEGO.recommendationFullSubmitURL;
			sjq("form[name='addRecToCart']").submit();
		} else {
			var form = sjq("form[name='addRecToCart']");
			LEGO.ajax.ajaxForm(form, function(result) {
				LEGO.miniBag.cartItemAdded(result);
			});
		}
	},
	handleAddToWishlist : function(event) {
		event.preventDefault();
		document.addRecToWishList.productCode.value = sjq(this).attr('productCode');
		sjq("form[name='addRecToWishList']").submit();
	},
	showRetailPrice : function(price, retail_price) {
		// don't show price if unset or 0, or same as price
		return (retail_price && retail_price !== price);
	}
}

/*
 Generates Product Thumbnail UI for rec engine results
 NB: Markup generated by this func MUST be kept in sync with productSummary.jsp
 */
function buildRecommendation(slot_name, rec_data) {
	LEGO.rec.recDataForLocale(rec_data);
	var displayType = LEGO.recommendationDisplayType;
	var prodCode = rec_data.productId;
	var productPageUrl = rec_data.link || rec_data.url;
	var quickViewUrl = '/' + LEGO.currentLocale + '/catalog/quickViewProduct.jsp?productCode=' + prodCode;
	var thumbImgUrl = rec_data.image_link || rec_data.image;
	var productTitle = rec_data.title || rec_data.name;
	productTitle = productTitle.replace(/<\/?[a-z][a-z0-9]*[^<>]*>/ig, "");

	var recommendation = sjq('<li class="product-thumbnail test-recommendations-product" />');
	if (rec_data['product-unavailable']) {
		recommendation.addClass('recommendations-product-unavailable');
	}

	//quickview
	sjq('<a/>', {
		id : 'quick-view-product-' + prodCode,
		href : quickViewUrl
	}).addClass('btn-quick-view btn-small white test-quick-view-product-' + prodCode)
      .text(LEGO.quickViewText)
      .appendTo(recommendation);

	//thumbnail image
	var image = sjq('<img/>', {
		src   : thumbImgUrl,
		alt   : productTitle,
		title : productTitle
	});
	sjq('<a/>', {href : productPageUrl})
		.append(image)
		.appendTo(recommendation);

	var itemCode = sjq('<span/>')
		.text(prodCode)
		.addClass('item-code');

	//product title
	var titleLink = sjq('<a/>', {href : productPageUrl})
		.html(productTitle);

	sjq('<h4 class="title" />')
		.append(itemCode)
		.append('&nbsp;')
		.append(titleLink)
		.appendTo(recommendation);

	//price
	var priceUL = sjq('<ul/>');
	var isDiscounted = LEGO.rec.showRetailPrice(rec_data.price, rec_data.retail_price);

	if (isDiscounted) {
		var wasPrice = LEGO.localeCurrencySymbol.replace('&amp;', '&') + (LEGO.currentLocale === 'en-HU' ? rec_data.retail_price : (rec_data.retail_price).toFixed(2));
		sjq('<li class="was-price">' +  LEGO.priceText + ' <em>' + wasPrice + '</em></li>')
			.appendTo(priceUL);
	}

	var nowPrice =LEGO.localeCurrencySymbol.replace('&amp;', '&') + (LEGO.currentLocale === 'en-HU' ? rec_data.price : (rec_data.price).toFixed(2));
	sjq('<li>' + (isDiscounted ? LEGO.salePriceText : LEGO.priceText) + ' <em class="test-recommendations-price">' + nowPrice + '</em></li>')
		.addClass(isDiscounted ? 'now-price' : '')
		.appendTo(priceUL);

	priceUL.appendTo(recommendation);
	//rating should never be greater than 5
	if (rec_data.BV_rating > 5) {
		rec_data.BV_rating = 5;
	}
	var ratingPercentage = (rec_data.BV_rating || 0) * 20;
	sjq('<div class="product-rating"><div class="product-rating-value" style="width:' + ratingPercentage + '%"></div></div>')
		.appendTo(recommendation);


	//'add to cart' button
	var addToButton = sjq('<button>' + LEGO.addToText + '</button>')
		.addClass(displayType === "wish_rec" ? 'add-to-wishlist btn-medium orange' : 'thumb-add-to-cart-recEngine btn-medium orange test-add-to-cart test-add-to-cart-' + prodCode)
		.attr("productCode", rec_data.productId)
		.click(displayType === "wish_rec" ? LEGO.rec.handleAddToWishlist : LEGO.rec.handleAddToBasket)
		.appendTo(recommendation);

	//init thumb ui
	recommendation.productThumbnail();

	// (REQUIRED) set the id and class of the element we will return
	recommendation.id = ATGSvcs.rec_id(slot_name, rec_data.productId);
	recommendation.className = "cs-rec";
	
	return recommendation.get(0);
}

//We do this here as IE has an issue with calling it in the document.ready() function.
LEGO.rec.init();
