//setup the namespace
if (typeof crumbs == "undefined" || !crumbs) {
    var crumbs = {};
}

crumbs.Modal.Product = Class.create(crumbs.Modal, {
	initialize: function() {
		this.containerId = "product-modal";
		this.eventLoadComplete = this.attachJavascripts.bindAsEventListener(this);
		var options = {
			className: "product-modal",
			zIndex: 1000,
			showEffect:Effect.Appear,
			hideEffect: Effect.Fade,
			useOverlay: true,
			onClose: this.hideWindow.bindAsEventListener(this),
			destroyOnClose: false,
			recenterAuto: false
		}

		// set Object options
		var myoptions = Object.clone(this.options);
		var myLoadOptions = Object.clone(this.loadOptions);
		for (var i in options) {
			myoptions[i] = options[i];
		}
		
		/* Somehow, the javascript object inheritence is trashed and setting showEffectOptions
		 on this modal sets it for all, which is a no-go. */
		myoptions['showEffectOptions'] = { afterFinish: this.eventLoadComplete, duration: 0.2 };
		if (myoptions["useOverlay"] && myoptions["useOverlay"] === true) 
			this.useOverlay = true;		
		myLoadOptions['destroyOnClose'] = myoptions['destroyOnClose'];
		
		this.window = new Window(this.containerId, myoptions);
		this.loadWindow = new Window(this.containerId + "-load", myLoadOptions);
		
		if($('product-modal-templates')) {
			this.templates = {
				master: new Template($('product-modal-master').innerHTML),
				subproducts: new Template($('product-modal-assoc-products').innerHTML),
				subproducts_outstock: new Template($('product-modal-assoc-products-outstock').innerHTML),
				simpleproduct: new Template($('product-modal-simple-product').innerHTML),
				giftcertproduct: new Template($('product-modal-giftcert-product').innerHTML),
				not_saleable: new Template($('product-modal-not-saleable').innerHTML),
				gallery: new Template($('product-modal-gallery').innerHTML),
				related_sells: new Template($('product-modal-related-products').innerHTML),
				ratings: new Template($('product-modal-ratings').innerHTML),
				no_ratings: new Template($('product-modal-no-ratings').innerHTML),
				option_text: new Template($('product-modal-option-text').innerHTML),
				option_area: new Template($('product-modal-option-area').innerHTML),
				/*reviews: new Template($('product-modal-reviews').innerHTML),*/
				tags: new Template($('product-modal-tags').innerHTML)
			}
		}
		this.displayOrder = 0;
		this.previousDisplayOrder = false;
		this.nextDisplayOrder = false;
		this.product = null;
		this.sizeChart = null;
		
		//this.productZoom = null;
	},

	setId: function(id) {
		this.id = id;
	},
	
	setDisplayOrder: function(order) {
		this.displayOrder = order;
	},

	hideWindow: function ($super, triggerHide) {
		screenManager.restorePageTitle();
		$super(triggerHide);
	},
	
	loadSuccess: function($super, transport) {
		//console.log('Product load successful, processing response.');
		var resp = new String(transport.responseText).evalJSON();
		this.product = resp.product;
		var message = resp.messages;
		
		/* LOG THE RESPONSE OBJECT */
		//console.dir(this.product);
		
		/* Track the event in GA and update the window URL */
		screenManager.trackEvent("Product Modal", "Open", this.product.name);
		screenManager.trackPageview(this.url);
		screenManager.getLocation().addProduct(this.product.entity_id);
		screenManager.appendToPageTitle(this.product.name);

		if(this.product.type_id=="grouped" && this.product.associated_products && this.product.associated_products.length && this.product.is_saleable) {
			try {
				var assocArray = new Array();
				for (var i=0; i<this.product.associated_products.length; i++) {
					if(this.product.associated_products[i].is_saleable) {
					    assocArray[i] = this.templates.subproducts.evaluate(this.product.associated_products[i]);
					} else {
						//console.log("Simple Product " + this.product.associated_products[i].name + " is out of stock.");
						assocArray[i] = this.templates.subproducts_outstock.evaluate(this.product.associated_products[i]);
					}
				}
				this.product.associated_products = assocArray.join("\n");
				//console.log(this.product.associated_products);
			} catch (e) {
				//console.error(e);
			}
		} else if(this.product.type_id=="simple" && this.product.is_saleable) {
			this.product.associated_products = this.templates.simpleproduct.evaluate(this.product);
		} else if(this.product.type_id=="ugiftcert" && this.product.is_saleable) {
			this.product.associated_products = this.templates.giftcertproduct.evaluate(this.product);
		} else {
			//console.log("Grouped Product " + this.product.entity_id + " out of stock.");
			this.product.associated_products = this.templates.not_saleable.evaluate(this.product);
		}
		
		if(this.product.related_sell.length) {
			try {
				var relatedArray = new Array();
				for (var i=0; i<this.product.related_sell.length; i++) {
					relatedArray[i] = this.templates.related_sells.evaluate(this.product.related_sell[i]);
				}
				this.product.related_sells = relatedArray.join("\n");
				//console.log(this.product.related_sells);
			} catch (e) {
				//console.error(e);
			}
		}

		if (this.product.custom_options.length) {
			try {
				var optionsArray = new Array();
				for (var i=0; i<this.product.custom_options.length; i++) {
					if (this.product.custom_options[i].type == "text") 
						optionsArray[i] = this.templates.option_text.evaluate(this.product.custom_options[i]);
					else if (this.product.custom_options[i].type == "area") 
						optionsArray[i] = this.templates.option_area.evaluate(this.product.custom_options[i]);
				}
				this.product.custom_options_html = optionsArray.join("\n");
			}
			catch (e) {
				//console.error(e);
			}
		}
		
		/*
		if(this.product.has_ratings) {
			this.product.rating_text = this.templates.ratings.evaluate(this.product);
		} else {
			this.product.rating_text = this.templates.no_ratings.evaluate(this.product);
		}
		*/
		
		/*
		if(this.product.reviews.length) {
			try {
				var reviewArray = new Array();
				for (var i=0; i<this.product.reviews.length; i++) {
					reviewArray[i] = this.templates.reviews.evaluate(this.product.reviews[i]);
				}
				this.product.reviews = reviewArray.join("\n");
				//console.log(this.product.reviews);
			} catch (e) {
				//console.error(e)
			}
		}
		*/
		/*
		if(this.product.tags.length) {
			try {
				var tagArray = new Array();
				for (var i=0; i<this.product.tags.length; i++) {
					tagArray[i] = this.templates.tags.evaluate(this.product.tags[i]);
				}
				this.product.tags = tagArray.join("\n");
				this.product.tags = this.product.tags.substr(0, this.product.tags.length-2);
				//console.log(this.product.tags);
			} catch (e) {
				//console.error(e);
			}
		}
		*/
		
		//var reviewsString = this.templates.reviews.evaluate(this.product.reviews);
		//var tagString = this.templates.tags.evaluate(this.product.tags);
		
		var responseString = this.templates.master.evaluate(this.product);
		
		this.loadWindow.hide();
		this.window.getContent().innerHTML = responseString;
		this.addingToCart = 0;
		this.showWindow();
	},
	
	assocQtyKeyPress: function(event, input) {
		if (   (event.keyCode >= 48 && event.keyCode <= 57)  // 0 - 9
			|| (event.keyCode >= 96 && event.keyCode <= 105)  // 0 - 9 with numlock
			|| (event.keyCode == 8)  // backspace
			|| (event.keyCode == 9)  // tab
			|| (event.keyCode == 12)  // ?
			|| (event.keyCode == 27)  // esc
			|| (event.keyCode == 37)  // arrow left
			|| (event.keyCode == 39)  // arrow right
			|| (event.keyCode == 46) ) {  // delete
			window.setTimeout(function () {screenManager.getProductModal().updateAssocPrice(input);}, 100);  // allow the input to change
			return true;
		}
		else if (event.keyCode == 13) {  // enter
			this.submitProductForm(null);
			return false;
		}
		return false;
	},

	assocQtyBlur: function (event) {
		var input = Event.element(event);
		this.updateAssocPrice(input);
	},

	hasNextProduct: function() {
		if(!screenManager.getCatalog()) return false;
		return (this.displayOrder < (screenManager.getCatalog().products.length-1));
	},
	hasPreviousProduct: function() {
		return this.displayOrder > 0;
	},
	switchProduct: function(event, direction) {
		if(direction=="next" && this.hasNextProduct()) {
			order = this.displayOrder + 1;
		} else if (direction=="prev" && this.hasPreviousProduct()) {
			order = this.displayOrder - 1;
		} else {
			//console.log("Not switching product - no adjacent product.")
			return false;
		}
		//console.log("Switch product to "+direction+", "+order);
		screenManager.switchProductModal(order);
	},
	
	switchProductToId: function(event) {
		//console.log("Switch product to ");
		screenManager.switchProductModalToId(this.getAttribute('id'), this.getAttribute('url'));
	},
	
	toggleAddTagForm: function(event, addTagLink) {
		
		var addTagForm = $('addTagForm');
		//user logged in
		var tagParagraph = $$('.product-info-tag .tag-paragraph');
		if(tagParagraph && tagParagraph[0]) {
			var tagParagraphHeight = Math.max(tagParagraph[0].offsetHeight, addTagForm.offsetHeight);
		} else {
			var tagParagraphHeight = addTagForm.offsetHeight;
		}
		addTagForm.setStyle({height: tagParagraphHeight+"px"});
		
		Effect.toggle('addTagForm', 'appear', { duration: 0.3 });
		var addTagForm = $('addTagForm');
		if(addTagForm.getAttribute('is_open')== 1) {
			addTagLink.innerHTML = "Add your own";
			addTagForm.setAttribute('is_open', 0);
		} else {
			addTagLink.innerHTML = "Back to Tags";
			addTagForm.setAttribute('is_open', 1);
		}
	},
	
	addTagSubmitClick: function(event, addTagForm) {
		this.eventAddTagSuccess = this.addTagSuccess.bindAsEventListener(this);
		this.eventAddTagFailure = this.addTagFailure.bindAsEventListener(this);
		var parms = Form.serialize(addTagForm);
		var options = {
			method: "get",
			parameters: parms,
			onSuccess: this.eventAddTagSuccess,
			onFailure: this.eventAddTagFailure
		};
		this.addTagAjaxRequest = new crumbs.Ajax.Request(addTagForm.action, options);
		var instructMsg = addTagForm.select('.instruct');
		instructMsg = instructMsg[0];
		instructMsg.setStyle({display: 'none'});
			
		var successMsg = addTagForm.select(".success");
		successMsg = successMsg[0];
		successMsg.setStyle({display: 'none'});
		
		var loading = addTagForm.select('.loading');
		loading = loading[0];
		loading.setStyle({display: 'block'});
		Event.stop(event);
		return;
	},
	
	addTagSuccess: function(response) {
		//TODO: Do this properly.
		var addTagForm = $('addTagForm');
		if(response.responseText=="success") {
			//console.log('successfully added tag.');
			var loading = addTagForm.select('.loading');
			loading = loading[0];
			loading.setStyle({display: 'none'});
			
			var successMsg = addTagForm.select(".success");
			successMsg = successMsg[0];
			successMsg.setStyle({display: 'block'});
			
			var input = addTagForm.select("input");
			input = input[0];
			input.value = "";
		} else {
			this.addTagFailure(response);
		}
	},
	
	addTagFailure: function(response) {
		var addTagForm = $('addTagForm');
		var loading = addTagForm.select('.loading');
		loading = loading[0];
		loading.setStyle({display: 'none'});
		
		var failureMsg = addTagForm.select(".failure");
		failureMsg = failureMsg[0];
		failureMsg.setStyle({display: 'block'});
		
		var input = addTagForm.select("input");
		input = input[0];
		input.value = "";
	},
	
	showAllTags: function(event, button) {
		var hiddenTags = $$('.product-info-tag p .hidden-tags');
		var hiddenTags = hiddenTags[0];
		if(hiddenTags.getStyle("display")=="inline") {
			//console.log('hide all tags');
			hiddenTags.setStyle({display: 'none'});
			button.innerHTML = "More";
		} else {
			//console.log('show all tags');
			hiddenTags.setStyle({display: 'inline'});
			button.innerHTML = "Less";
		}
	},
	
	/*
	toggleAddReviewForm: function() {
		Effect.toggle('addReviewForm', 'appear', { duration: 0.3 });
	},
	
	addReviewSubmitClick: function(event, addReviewForm) {
		this.eventAddReviewSuccess = this.addReviewSuccess.bindAsEventListener(this);
		this.eventAddReviewFailure = this.addReviewFailure.bindAsEventListener(this);
		var parms = Form.serialize(addReviewForm);
		var options = {
			method: "get",
			parameters: parms,
			onSuccess: this.eventAddReviewSuccess,
			onFailure: this.eventAddReviewFailure
		};
		this.addReviewAjaxRequest = new crumbs.Ajax.Request(addReviewForm.action, options);
		var button = addReviewForm.select('button');
		button = button[0];
		button.setStyle({display: 'none'});
		var loading = addReviewForm.select('.loading');
		loading = loading[0];
		loading.setStyle({display: 'block'});
		Event.stop(event);
		return;
	},
	
	addReviewSuccess: function(response) {
		//TODO: Do this properly.
		var addReviewForm = $('addReviewForm');
		if(response.responseText=="success") {
			//console.log('successfully added review.');
			var successMsg = addReviewForm.select(".success-msg");
			successMsg = successMsg[0];
			successMsg.setStyle({display: 'block'});
			
			var button = addReviewForm.select('button');
			button = button[0];
			button.setStyle({display: 'inline'});
			var loading = addReviewForm.select('.loading');
			loading = loading[0];
			loading.setStyle({display: 'none'});
		} else {
			this.addReviewFailure(response);
		}
	},
	
	addReviewFailure: function(response) {
		var addReviewForm = $('addReviewForm');
		var failureMsg = addReviewForm.select(".failure-msg");
		failureMsg = failureMsg[0];
		failureMsg.setStyle({display: 'block'});
		
		var button = addReviewForm.select('button');
		button = button[0];
		button.setStyle({display: 'inline'});
		var loading = addReviewForm.select('.loading');
		loading = loading[0];
		loading.setStyle({display: 'none'});
	},
	*/
	submitRating: function(event) {
		var elm = Event.element(event);
		var rating = elm.getAttribute('rating');
		var addRatingForm = $('addRatingForm');
		
		$('rating_input').value = rating;
		
		this.eventAddRatingSuccess = this.addRatingSuccess.bindAsEventListener(this);
		this.eventAddRatingFailure = this.addRatingFailure.bindAsEventListener(this);
		var parms = Form.serialize(addRatingForm);
		var options = {
			method: "get",
			parameters: parms,
			onSuccess: this.eventAddRatingSuccess,
			onFailure: this.eventAddRatingFailure
		};
		this.addRatingAjaxRequest = new crumbs.Ajax.Request(addRatingForm.action, options);
		this.disableRatingLinks();
	},

	addRatingSuccess: function(response) {
		var stars = parseInt($('rating_input').value);
		this.ratingText.innerHTML = stars.toString() + " Stars";
		var newWidth = (stars * 20).toString() + "%";
		this.currentRating.setStyle({width: newWidth});
	},
	
	addRatingFailure: function(response) {
	},

	disableRatingLinks: function () {
		if (this.addRatingLinks) {
			for (var i = 0; i < this.addRatingLinks.length; i++) {
				Event.stopObserving(this.addRatingLinks[i], 'click');
			}
		}
	},
	
	updateAssocPrice: function(input) {
		//console.log('key pressed, calculate for '+input.value);
		var grandparent = $(input.parentNode.parentNode);
		var outputs = grandparent.select(".assoc-product-calccost span");
		if(outputs.length==0) {
			//console.log('no outputs for this price');
			return;
		}
		var inputVal = parseInt(input.value);
		if (inputVal || inputVal === 0) {
			var outputValue = (input.getAttribute('multiplier') * inputVal).toFixed(2);
			outputs[0].innerHTML = outputValue;
		}
		else
			outputs[0].innerHTML = "0.00";
	},
	
	submitProductForm: function(event) {
		if (!this.addingToCart) {
			this.addingToCart = 1;
			//console.log("adding to cart...");
			screenManager.trackEvent("Product Modal", "Add to Cart", this.product.name);
			screenManager.getCart().addProductModalToCart($('product-modal-form'));
			//screenManager.getProductModal().hideWindow();
			Windows.close("product-modal", event);
		}
	},
	swapZoomImage: function(event) {
		//console.dir(mylink);
		$('image').src = this.getAttribute('imgsrc');
	},

	sizeChartHoverOver: function (event) {
		this.sizeChart.show();
	},

	sizeChartHoverOut: function (event) {
		this.sizeChart.hide();
	},

	applyOptionMaxlength: function (event) {
		var el = event.element();
		var max = parseInt(el.getAttribute("maxlength"));
		if (el.value.length > max) {
			el.addClassName("over-flow");
		}
		else {
			el.removeClassName("over-flow");
		}
	},
	
	attachJavascripts: function(event) {
		//console.log('Product response parsed, attaching javascript functionality to elements.');
		
		/* Gallery */
		if($('image') && $('track') && $('handle')) {
			//firefox has a problem with this because before the object starts to appear, it has 
			// no offsetHeight or offsetWidth
			setTimeout(function() { product_zoom = new Product.Zoom('image', 'track', 'handle', 'zoom_in', 'zoom_out', 'track_hint')}, 500);
			//product_zoom = new Product.Zoom('image', 'track', 'handle', 'zoom_in', 'zoom_out', 'track_hint');
			var moreViewLinks = $$('.more-views li a');
			if(moreViewLinks.size()>0) {
				for(var i=0; i<moreViewLinks.size(); i++ ) {
					this.eventSwapZoomImage = this.swapZoomImage.bindAsEventListener(moreViewLinks[i]);
					Event.observe(moreViewLinks[i], "click", this.eventSwapZoomImage);
				}
			}
		} else {
			//console.log("No image, track, and/or handle found.");
		}
		
		/* Associate Products */
		var inputs = $$('#product-modal-form .assoc-product-qty input');
		//var outputs = $$('#product-modal-form .assoc-product-calccost span')
		if(inputs.length) {
			try {
				for(var i=0; i<inputs.length; i++) {
					this.eventAssocQtyKeyPress = this.assocQtyKeyPress.bindAsEventListener(this, inputs[i]);
					Event.observe(inputs[i], 'keydown', this.eventAssocQtyKeyPress);
					Event.observe(inputs[i], 'blur', this.assocQtyBlur.bindAsEventListener(this));
					
					//this.eventUpdateAssocPrice = this.updateAssocPrice.bindAsEventListener(inputs[i]);
					//Event.observe(inputs[i], 'blur', this.eventAssocQtyKeyPress);
					//Event.observe(inputs[i], 'change', this.eventAssocQtyKeyPress);
				}
			} catch (e) {
				//console.error(e);
			}
		}
		
		/* Related-Sell Products */
		var relatedImgs = $$('.product-info-cross ul li img');
		for(var i=0; i<relatedImgs.length; i++) {
			relatedImgs[i].setAttribute('src', relatedImgs[i].getAttribute('mysrc'));
			this.eventRelatedSellClick = this.switchProductToId.bindAsEventListener(relatedImgs[i]);
			Event.observe(relatedImgs[i], 'click', this.eventRelatedSellClick);
		}

		/* Custom Product Options */
		
		/* Tags */
		//var tagLinks = $$('.product-info-tag p a');
		var showAllLinks = $$('.product-info-tag p a.show-all-tags');
		if(showAllLinks[0]) {
			var showAllLink = showAllLinks[0];
			this.eventShowAllTags = this.showAllTags.bindAsEventListener(this, showAllLink);
			Event.observe(showAllLink, 'click', this.eventShowAllTags);
		}
		
		/* Hands */
		var prevHand = $("prev-product-link");
		if(!this.hasPreviousProduct()) {
			prevHand.addClassName("disabled");
			prevHand.setOpacity(0.6);
		}
		this.eventPrevHandClick = this.switchProduct.bindAsEventListener(this, "prev");
		Event.observe(prevHand, 'click', this.eventPrevHandClick);
		var nextHand = $("next-product-link");
		if(!this.hasNextProduct()) {
			nextHand.addClassName("disabled");
			nextHand.setOpacity(0.6);
		}
		this.eventNextHandClick = this.switchProduct.bindAsEventListener(this, "next");
		Event.observe(nextHand, 'click', this.eventNextHandClick);
		
		/* Rating Stars, Link */
		this.currentRating = $$('.star-rating .current-rating');
		this.currentRating = this.currentRating[0];
		this.ratingText = $$('.cont-right-details .rating-text');
		this.ratingText = this.ratingText[0];

		if(this.product.has_rating) {
			this.currentRating.setStyle({width: this.product.rating_percent+"%"});
		} else {
			this.currentRating.setStyle({width: '0px'});
		}
		if(this.product.can_rate) {
			this.addRatingLinks = $$('.product-info-cont .star-rating li a');
			if(this.addRatingLinks.length>0) {
				this.eventSubmitRating = this.submitRating.bindAsEventListener(this);
				for(var i=0; i<this.addRatingLinks.length; i++) {
					Event.observe(this.addRatingLinks[i], 'click', this.eventSubmitRating);
				}
			}
		} else {
			this.ratingText.innerHTML = this.ratingText.getAttribute("logintext");
		}
		
		/* Tag Link */
		var addTagLink = $$('.product-info-tag a.add-tag');
		var addTagForm = $('addTagForm');
		if(addTagForm) {
			/*
			//user logged in
			var tagParagraph = $$('.product-info-tag .tag-paragraph');
			if(tagParagraph && tagParagraph[0]) {
				var tagParagraphHeight = Math.max(tagParagraph[0].offsetHeight, addTagForm.offsetHeight);
			} else {
				var tagParagraphHeight = addTagForm.offsetHeight;
			}
			addTagForm.setStyle({height: tagParagraphHeight+"px"});
			*/
			addTagLink[0].href = "javascript:;";
			this.eventToggleAddTagForm = this.toggleAddTagForm.bindAsEventListener(this, addTagLink[0]);
			Event.observe(addTagLink[0], "click", this.eventToggleAddTagForm);
			
			//listener to submit button to do things ajax
			this.eventAddTagSubmitClick = this.addTagSubmitClick.bindAsEventListener(this, addTagForm);
			var button = addTagForm.select('.form-button-alt');
			button = button[0];
			Event.observe(button, 'click', this.eventAddTagSubmitClick);
		} else {
			addTagLink[0].innerHTML = addTagLink[0].getAttribute("logintext");
			addTagLink[0].href = LOGIN_PATH;
		}
		
		/* Review Link */
		/*
		var addReviewLink = $$('.product-info-reviews a.add-review');
		var addReviewForm = $('addReviewForm');
		if(addReviewForm) {
			//user logged in
			var reviewParagraph = $$('.product-info-reviews .review_group');
			if(reviewParagraph) {
				var reviewParagraphHeight = Math.max(reviewParagraph[0].offsetHeight, addReviewForm.offsetHeight);
			} else {
				var reviewParagraphHeight = addReviewForm.offsetHeight;
			}
			addReviewForm.setStyle({height: reviewParagraphHeight+"px"});
			addReviewLink[0].href = "javascript:;";
			this.eventToggleAddReviewForm = this.toggleAddReviewForm.bindAsEventListener(this);
			Event.observe(addReviewLink[0], "click", this.eventToggleAddReviewForm);
			
			//listener to submit button to do things ajax
			this.eventAddReviewSubmitClick = this.addReviewSubmitClick.bindAsEventListener(this, addReviewForm);
			var button = addReviewForm.select('.form-button-alt');
			button = button[0];
			Event.observe(button, 'click', this.eventAddReviewSubmitClick);
		} else {
			addReviewLink[0].innerHTML = addReviewLink[0].getAttribute("logintext");
			addReviewLink[0].href = LOGIN_PATH;
		}
		*/
		
		/* Add To My Order Link */
		var addToOrderLinks = $$('#product-modal-form .action-buttons .add-to-order');
		if(addToOrderLinks.length) {
			this.eventSubmitProductForm = this.submitProductForm.bindAsEventListener(this);
			addToOrderLinks[0].href = "javascript:;";
			Event.observe(addToOrderLinks[0], 'click', this.eventSubmitProductForm);
		}

		/* Cupcake Size Chart modal */
		var sizeChartLinks = $("product-modal").select("a.size-chart-popup");
		if (this.product.flavor_name) {  // cupcake
			this.sizeChart = $('product-modal-size-chart');
			if (sizeChartLinks.length) {
				//console.dir(this.product);
				sizeChartLinks[0].setStyle({display: 'block'});
				sizeChartLinks[0].href = "javascript:;";
				Event.observe(sizeChartLinks[0], 'mouseover', this.sizeChartHoverOver.bindAsEventListener(this));
				Event.observe(sizeChartLinks[0], 'mouseout', this.sizeChartHoverOut.bindAsEventListener(this));
			}
		}
		// else 'other' product, don't how link

		if (this.product.custom_options.length) {
			var optionsContainers = $("product-modal").select(".product-option-container");
			var optionsContainer = optionsContainers[0];
			optionsContainer.setStyle({display: "block"});
			var parentContainer = $("product-modal").select('.cont-right-details');
			parentContainer[0].addClassName("has-product-options");
		}

		/* Product Options */
		var optionTextareas = $("product-modal").select(".product-option-row textarea");
		for (var i = 0; i < optionTextareas.length; i++) {
			Event.observe(optionTextareas[i], "keypress", this.applyOptionMaxlength.bindAsEventListener(this));
			Event.observe(optionTextareas[i], "paste", this.applyOptionMaxlength.bindAsEventListener(this));
		}
	}
});