/**
 * Javascript for add to registry functionality in PDP Pages Usage :
*/

BLOOMIES.namespace("BLOOMIES.addToRegistry");

BLOOMIES.addToRegistry.weddingAddToRegistryUrl = "/registry/wedding/addtoregistry";
BLOOMIES.addToRegistry.viewRegistryUrl = "/registry/wedding/registrant";
BLOOMIES.addToRegistry.registrySignIn = "/registry/wedding/registrysignin";
BLOOMIES.addToRegistry.registryClaim ="";

BLOOMIES.addToRegistry.button = function(id) {
	this.button = YAHOO.util.Dom.get(id);
	YAHOO.util.Dom.removeClass(this.button, "hiddenAddToReg");
	YAHOO.util.Event.addListener(this.button, "click", this.click, this, true);
	this.busy = false;
	if (YAHOO.util.Dom.hasClass(this.button.parentNode.parentNode, "pdp_master_add_to_bag")) { 	 
		this.validate = this.validateMaster; 
	}
};
BLOOMIES.addToRegistry.button.prototype.click = function(e) {
	BLOOMIES.addToRegistry.registryClaim="";
	YAHOO.util.Event.preventDefault(e);
	BLOOMIES.loading.show();
	this.validate();
	
};

////////////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.button.prototype.validateMaster = function() {
	// var activeTabName = BLOOMIES.masterTab.getActiveTabName();
	
	var masterTable= YAHOO.util.Dom.getElementsByClassName("pdp_product_list_container")[0];
	/*if (activeTabName) {
		masterTableId = activeTabName + "_content";
	}*/
	var masterProductRows = YAHOO.util.Dom.getElementsByClassName(
			"pdp_pricetc_master", "div", YAHOO.util.Dom.get(masterTable));
	
	var products = [];
	//var coremetricsCategoryId=(window.location.href.indexOf("registry/wedding") != -1)?"MWEDD_"+document.productAttributeDropdown.CategoryID.value : document.productAttributeDropdown.CategoryID.value;
	for ( var i = 0; i < masterProductRows.length; i++) {
		var product = this._getProduct(masterProductRows[i]);
		if (product) {
			product.productId = YAHOO.util.Dom.getElementsByClassName("productId", "input", masterProductRows[i])[0].value;
			product.name = YAHOO.util.Dom.getElementsByClassName("pdp_product_txt", "div", masterProductRows[i])[0].innerHTML;
			//cmCreateConversionEventTag(product.ID, 1, "Add to Registry", product.quantity, "-_--_-"+product.price+"-_-"+YAHOO.util.Dom.get("coremetricsDepthPath").value+"-_-"+product.name);
			BLOOMIES.coremetrics.cmCreateConversionEventTag(product.ID, CONVERSION_INITIATE, "Item added to Registry",  product.Quantity, "-_--_-"+product.price.replace(',','')+"-_-"+YAHOO.util.Dom.get("coremetricsDepthPath").value+"-_-"+product.name+"-_-"+product.price.replace(',','')*product.Quantity);
			
			products.push(product);
		}
	}
	
	if (products && products.length > 0) {
		YAHOO.util.Connect.asyncRequest(
						'POST',
						BLOOMIES.addToRegistry.weddingAddToRegistryUrl+BLOOMIES.addToRegistry.registryClaim,
						{
							success : this.handleJsonResponse,
							failure : function(o) {
								BLOOMIES.loading.hide();
								BLOOMIES.addToRegistry.showErrMsg("Error occured while processing your request.");
							},
							scope : this,
							argument : products
						}, this.buildProductPost(products));
	} else {
		BLOOMIES.loading.hide();
		BLOOMIES.addToRegistry
				.showErrMsg('Please ensure that you have selected a quantity/color/size/type for the item that you are trying to add. Then click Add to Registry again.');
		
	}
};

//////////////////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.button.prototype.validate = function() {
	var product = this._getProduct(YAHOO.util.Dom.get('Quantity').parentNode.parentNode.parentNode);
	if (product) {
		product.productId = YAHOO.util.Dom.get("ID").value;
		product.name = YAHOO.util.Dom.getElementsBy(function() {
			return true;
		}, "h1")[0].innerHTML;
		
		var products = [ product ];
		//cmCreateConversionEventTag(product.productId, 1, "Add to Registry", product.Quantity, "-_--_-"+product.price+"-_-"+YAHOO.util.Dom.get("coremetricsDepthPath").value+"-_-"+product.name);
		BLOOMIES.coremetrics.cmCreateConversionEventTag(product.productId, CONVERSION_INITIATE, "Item added to Registry",  product.Quantity, "-_--_-"+product.price.replace(',','')+"-_-"+YAHOO.util.Dom.get("coremetricsDepthPath").value+"-_-"+product.name+"-_-"+product.price.replace(',','')*product.Quantity);
		YAHOO.util.Connect
				.asyncRequest(
						'POST',
						BLOOMIES.addToRegistry.weddingAddToRegistryUrl+BLOOMIES.addToRegistry.registryClaim,
						{
							success : this.handleJsonResponse,
							failure : function(o) {								
								BLOOMIES.loading.hide();
								BLOOMIES.addToRegistry.showErrMsg("Error occured while processing your request.");
							},
							
							scope : this,
							argument : products
						}, this.buildProductPost(products));
	} else{
		BLOOMIES.loading.hide();
		BLOOMIES.addToRegistry.showErrMsg('Please ensure that you have selected a quantity/color/size/type for the item that you are trying to add. Then click Add to Registry again.');
	}
};

////////////////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.button.prototype._getProduct = function(row) {
	var name, product = {};
	var numberReg = /[0-9]/;
	var selects = YAHOO.util.Dom.getElementsBy(function(node) {
		if (node.nodeName == 'INPUT' || node.nodeName == 'SELECT')
			return true;
		return false;
	}, null, row);
	
	var incompleteProduct = false;
	for ( var i = 0; i < selects.length; i++) {
		if(selects[i].name.charAt(0).match(numberReg)) continue;
		if(selects[i].id) {
			name = selects[i].id.split(numberReg)[0];
		} else {
			name = selects[i].name.split(numberReg)[0];
		}
		if (!name) continue;
		if (selects[i].value != "NOSELECTION") {
			product[name] = selects[i].value || "NA";
		} else {
			return false;
		}
	}
	
	// some master templates don't have color for some reason.
	if (!product.color) product.color = "NA";
	if (!product.size) product.sizer = "NA";
	if (!product.price) product.price = "NA";
	if (product.Quantity && product.Quantity != "NA" && product.price) {
		return product;
	}
	return false;
};

//////////////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.button.prototype.buildProductPost = function(products) {
	var colors = [], sizes = [], qty = [], ids = [];
	for ( var i = 0; i < products.length; i++) {
		colors.push(products[i].color);
		sizes.push(products[i].size);
		qty.push(products[i].Quantity);
		ids.push(products[i].productId);
	}
	
	return "productId=" + ids.join(",") + "&color=" + colors.join(",")    
			+ "&size=" + sizes.join(",") + "&quantity=" + qty.join(",");
};

////////////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.button.prototype.handleJsonResponse = function(response) {
	BLOOMIES.loading.hide();
	BLOOMIES.addToRegistry.overlay.init();
	var errMsg = BLOOMIES.addToRegistry.showErrMsg;
	var overlay = BLOOMIES.addToRegistry.overlay;
	var responseObj = {};
	try {
		responseObj = YAHOO.lang.JSON.parse(response.responseText);
	
	if(responseObj && responseObj["HAS_REGISTRY"]) {
		if(responseObj["HAS_REGISTRY"] == 'NO') {
			BLOOMIES.addToRegistry.overlayClaim.show();
			return;
		}		
	} else if(responseObj && responseObj["REDIRECT"]) {
		window.location = responseObj["REDIRECT"];
		return;
	}
	if (responseObj["ERROR_MSG"]) {
		errMsg(responseObj["ERROR_MSG"]);
		BLOOMIES.resetForm();
		return;
	}
	if (!responseObj.nonRegistrableUPCs && (!responseObj.registrantInfo || !responseObj.imgMap)) {
		errMsg("Unknown error occured while processing your request.");
		BLOOMIES.resetForm();
		return;
	} else if(responseObj.nonRegistrableUPCs && (!responseObj.registrantInfo || !responseObj.imgMap)) {
		this.handleNonRegUPCResponse(responseObj);
		return;
	}
	if (responseObj["registryItemsCount"]) {
		YAHOO.util.Dom.get('totalQty').innerHTML = responseObj["registryItemsCount"];
	}
	
	BLOOMIES.addToRegistry.hideErrMsg();
	//overlay.clearProducts();
	overlay.setRegistryId(responseObj.registrantInfo.registryId);
	
	var productContainer = YAHOO.util.Dom.getElementsByClassName("itemRow")[0];
	//resetting the overlay items to empty
	if(productContainer){
		productContainer.innerHTML = "";
	}	
	var itemsAddedCount = 0;
	var productList = response.argument.length;
	
	BLOOMIES.coremetrics.cmCreatePageviewTag(cmAddToRegistryPageID, cmCatID, "", "");
	
	var productItemsList = 0;
	
	for ( var i = 0; i < response.argument.length; i++) {
		if(responseObj.imgMap[response.argument[i].productId]) {
		addedProduct = response.argument[i];
		/* argument is the list of products added */
		BLOOMIES.coremetrics.cmCreateConversionEventTag(addedProduct.productId, CONVERSION_COMPLETE, "Item added to Registry",  addedProduct.Quantity, "-_-"+addedProduct.price.replace(',','')+"-_-"+YAHOO.util.Dom.get("coremetricsDepthPath").value+"-_-"+addedProduct.name+"-_-"+addedProduct.price.replace(',','')*addedProduct.Quantity);
		itemsAddedCount += parseInt(response.argument[i].Quantity);
		var row = overlay.addProduct(
				responseObj.imgMap[response.argument[i].productId],response.argument[i]);
		}	
		productItemsList ++;
		
		if( productItemsList > 2 ){
			YAHOO.util.Dom.setStyle( 'bagDivContent', 'height' , '210px'); 
		}
		else{
			YAHOO.util.Dom.setStyle( 'bagDivContent', 'height' , '100%');
		}
		
	}
	
	if(responseObj.nonRegistrableUPCs && responseObj.nonRegistrableCount > 0) {
		overlay.setAddedCount(itemsAddedCount,responseObj.nonRegistrableCount);		
		this.handleNonRegUPCResponse(responseObj);		
	} else {
		overlay.setAddedCount(itemsAddedCount,0);
	}
	YAHOO.util.Dom.addClass(row, "noborder");
	
	if (itemsAddedCount) {
		overlay.setRegistryLink(responseObj);
		overlay.show();
	} else {
		errMsg("Error occured while processing your request.");
	}
	BLOOMIES.resetForm();
	} 
	catch (ex) {
	errMsg("Error occured while processing your request.");
	BLOOMIES.resetForm();
	return;
  }		
};

///////////////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.button.prototype.handleNonRegUPCResponse = function(responseObj) {
	var nonRegProductIds = new Array();
	var nonRegUpcAttr = new Array();

	for (var i=0;i<responseObj.nonRegistrableUPCs.length;i++) {
		var nonRegistrableUPC = responseObj.nonRegistrableUPCs[i];
		var productId = nonRegistrableUPC.substring( 0, nonRegistrableUPC.indexOf(',') );
		var upcAtrr = nonRegistrableUPC.substring( nonRegistrableUPC.indexOf(',') + 1 );
		nonRegProductIds.push( productId );
		nonRegUpcAttr.push( upcAtrr );
	}

	if( nonRegProductIds.length != 0 && nonRegUpcAttr.length != 0 ) {
		/*for (var i=0;i<nonRegProductIds.length;i++) {
			if( YAHOO.util.Dom.get( 'nonRegUpcMarker_'+ nonRegProductIds[i])) {
				YAHOO.util.Dom.setStyle( 'nonRegUpcMarker_'+ nonRegProductIds[i], 'display' , 'block');
			}
		}*/
		
		if( responseObj && responseObj.nonRegistrableCount == 1 ) {
			BLOOMIES.addToRegistry.showErrMsg("We're sorry. 1 item has not been added to your registry because it is not available for registry.");
		}
		else if(responseObj && responseObj.nonRegistrableCount > 1){
			var errMsgStr = "We're sorry."+responseObj.nonRegistrableCount+" items have not been added to your registry because they are not available for registry.";
			BLOOMIES.addToRegistry.showErrMsg(errMsgStr);
		}
	}
	
	BLOOMIES.resetForm();
};

///////////////////////////////////////////////////////////////////////////

BLOOMIES.masterTab = (function() {
	self.init = function() {
		this.container = YAHOO.util.Dom.getElementsByClassName("pdp_product_list_container");
		if (this.container)
			this.container = this.container[0];
	}
	self.getActiveTabName = function() {
		if (!this.container) return;
		tab = YAHOO.util.Dom.getElementsByClassName("activeTab", "div", this.container);
		if (!tab.length) return;
		return tab[0].id.split("_holder")[0];
	}
	return self;
})();


///////////////////////////////////////////////////////////////////////////

BLOOMIES.resetForm = function(){
	var forms = document.getElementsByTagName("form");
	for(var i=0; i< forms.length; i++){
		forms[i].reset();
	}
};

////////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.overlay = (function() {
	var self = {};
	self.init = function() {
		this.panel = new YAHOO.widget.Panel("addToRegOvelay", {
			effect:{effect:YAHOO.widget.ContainerEffect.FADE, duration:0.2},
			fixedcenter:"contained",
			modal:true,
			close: false,
			underlay: "shadow",
			monitorresize: false,
			draggable:false
		});
		
	};
	self.show = function() {
		self.init();
		this.panel.setBody(document.getElementById("addToRegistryModal").innerHTML);
		this.panel.render(document.body);
		this.panel.show();
		
		YAHOO.util.Event.addListener("bagDivClose", "click", self.hide);
		YAHOO.util.Event.addListener("continueShopping", "click", self.hide);
		YAHOO.util.Event.addListener("viewRegistry", "click", self.goToRegistry);
	};
	self.hide = function() {
		self.panel.destroy();
		BLOOMIES.resetForm();
		//clearAllNonRegUPCMarker();
	};
	
	self.goToRegistry = function(e) {
		if (self.registryId){
			window.location = BLOOMIES.addToRegistry.viewRegistryUrl;
		}
		self.hide();
		BLOOMIES.loading.show();
	};
	self.setRegistryLink = function(obj) {
		var link1 = YAHOO.util.Dom.getElementsByClassName("registryLink", "a");
		var link2 = YAHOO.util.Dom.getElementsByClassName("regLink", "a")[0];
		if(obj.registrantInfo) {
			for(var i=0; i<link1.length; i++){
				link1[i].innerHTML = obj.registrantInfo.registrantName +" & " + obj.registrantInfo.coRegistrantName+"'s registry";
			}
			link2.innerHTML = obj.registrantInfo.registrantName +" & " + obj.registrantInfo.coRegistrantName+"'s Registry";
		}
	};
	self.setAddedCount = function(count, nonRegCount) {
		var qtyInfo = YAHOO.util.Dom.getElementsByClassName("totalQtyInfo", "span");
		if (qtyInfo && qtyInfo.length > 0)
			qtyInfo[0].innerHTML = (count == 1 ? '1 item has' : count + ' items have') + " been added to your registry";
		if(nonRegCount > 0) {
			qtyInfo = YAHOO.util.Dom.getElementsByClassName("nonRegQtyInfoDiv", "div")[0];
			if(qtyInfo) {
				YAHOO.util.Dom.removeClass(qtyInfo,"hiddenNonReg");
				qtyInfo = YAHOO.util.Dom.getElementsByClassName("nonRegQtyInfoSpan", "span")[0];
				if(qtyInfo) {
					qtyInfo.innerHTML = (nonRegCount == 1 ? '1 item has ' : nonRegCount + ' items have ') + "not been added to your registry";
				}
			}
		} else {
			qtyInfo = YAHOO.util.Dom.getElementsByClassName("nonRegQtyInfoDiv", "div")[0];
			if(qtyInfo) {
				YAHOO.util.Dom.addClass(qtyInfo,"hiddenNonReg");
			}
		}
	};

	self.setRegistryId = function(registryId) {
		this.registryId = registryId;		
	};

	self.addProduct = function(imageSrc, product) {
		var container = YAHOO.util.Dom.getElementsByClassName("itemRow", "div")[0];
		var totalprice = parseFloat(product.price.replace(',', '')) * parseInt(product.Quantity);
		var itemTableRow = document.createElement("div");
		YAHOO.util.Dom.addClass(itemTableRow, "regItemsSeperator");
		
		itemTableRow.innerHTML = '<div class="itemContent">'
				+ '<div class="itemImg"><img border="1" width="60" src="'
				+ pdpAssetServer + '' + imageSrc
				+ '?wid=60"/></div>'
				+ '<div class="itemInfo">'
				+ '<div class="itemName">'
				+ product.name
				+ '</div>'
				+ '<div class="itemColorSize">'
				+ (product.color != 'NA' ? '<span class="itemColor"><strong>Color:</strong> <span>' + product.color + '</span>'
						: '')
				+ (product.size != 'NA' ? '<span class="itemSize"><strong>Size:</strong> <span>' + product.size + '</span>'
						: '')
				+ '</div>'
				+ '<div class="registrantInfo">'
				+ '<img class="registryImg" src="' + assetsServer + '/web20/assets/img/registry/r_brown_bag_logo.jpg" alt="The Registry" border="0" align="absmiddle" width="86" height="19"/>'
				+ '<div class="registrantNames">'
				+ '<a href="/registry/wedding/registrant" class="registryLink"></a>'
				+ '</div></div></div><div class="clearBoth"></div></div>'
				+ '<div class="itemPrice"><span id="salePrice">' + '$' + product.price + '</span></div>'
				+ '<div class="itemQuantity"><span id="qty">' + product.Quantity + '</span></div>'
				+ '<div class="itemTotalPrice">'
				+'<span id="total">' + '$' + totalprice.toFixed(2).replace(/\d\d\d\d\./, function(m){return m.charAt(0) + ',' + m.substring(1,5);}) + '</span></div>'
				+ '<div class="clearBoth"></div>';
	
		return container.appendChild(itemTableRow);
			
	};

	self.clearProducts = function() {
		var table = YAHOO.util.Dom.getElementsByClassName("itemsTable", "div",
				this.panel.element)[0];
		var row = YAHOO.util.Dom.getElementsBy(function(){return true;}, "tr", table)[0];
		var toRemove = YAHOO.util.Dom.getNextSibling(row);
		while (toRemove) {
			if (toRemove.nodeName == "TR") {
				toRemove.parentNode.removeChild(toRemove);
			} else
				break;
			toRemove = YAHOO.util.Dom.getNextSibling(row);
		}
	};

	return self;
})();


///////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.overlayClaim = (function() {
	var self = {};
	self.init = function() {
		YAHOO.util.Dom.removeClass(YAHOO.util.Dom.get("registryClaim"),
				"hiddenClaim");
		this.panel = new YAHOO.widget.Panel("registryClaim", {
			effect:{effect:YAHOO.widget.ContainerEffect.FADE, duration:0.2},
			modal : true,
			fixedcenter:true,
			underlay : "shadow",
			draggable : false,
			monitorresize: false,
			close : false
		});
	};
	self.show = function() {
		self.init();
		this.panel.render();
		this.panel.show();

		YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName(
				"registryClaimClose", "a", this.panel.element), "click", this.hide,
				this, true);
		YAHOO.util.Event.addListener("accessRegistryButton", "click", this.goToClaim,
				this, true);
		YAHOO.util.Event.addListener("createRegistryButton", "click", this.goToCreate,
				this, true);
	};
	self.hide = function(e) {
		if (e)
			YAHOO.util.Event.preventDefault(e);
		this.panel.hide();
		BLOOMIES.resetForm();
	};
	self.goToClaim = function(e) {
		if (e)
			YAHOO.util.Event.preventDefault(e);		
		self.hide();
		var form = YAHOO.util.Dom.get("registryClaimForm");
		if(form) {
			form.action = BLOOMIES.addToRegistry.weddingAddToRegistryUrl + "?registryClaim=YES"
			form.submit();
		}		
		return;
	};
	self.goToCreate = function(e) {
		if (e)
			YAHOO.util.Event.preventDefault(e);
		this.hide();
		var form = YAHOO.util.Dom.get("registryClaimForm");
		if(form) {
			form.action = BLOOMIES.addToRegistry.weddingAddToRegistryUrl + "?registryClaim=NO"
			form.submit();
		}	
		return;
	};

	return self;
})();

///////////////////////////////////////////////////////////////////////////

BLOOMIES.loading = {
	show: function(){
			loadingWheelOverlay = new YAHOO.widget.Panel("loading", {
				fixedcenter:true,
				modal:true,
				close: false,
				underlay: "none",
				monitorresize: false,
				draggable:true });
			loadingWheelOverlay.setBody('<img src="' + assetsServer + '/web20/assets/img/ajax-loader.gif" />');
			loadingWheelOverlay.render(document.body);
			loadingWheelOverlay.show();
	},

	hide: function(){
		loadingWheelOverlay.destroy();
	}
};

///////////////////////////////////////////////////////////////////////////

YAHOO.util.Event.onDOMReady(function() {
	//BLOOMIES.addToRegistry.overlayClaim.init();
	//BLOOMIES.masterTab.init();
	new BLOOMIES.addToRegistry.button("ADDTOREG_BUTTON");
});

///////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.showErrMsg = function(errMsg) {
	window.scroll(0, 0);
	YAHOO.util.Dom.get('errMsg').innerHTML = errMsg;
	YAHOO.util.Dom.setStyle('errMsg', 'display', 'block');
};

///////////////////////////////////////////////////////////////////////////

BLOOMIES.addToRegistry.hideErrMsg = function() {
	YAHOO.util.Dom.get('errMsg').innerHTML = "";
	YAHOO.util.Dom.setStyle('errMsg', 'display', 'none');
};
