//=======================================================================
// 
// "Blocks" Store : store.js
// Copyright (c) 2005-2008 Indie Labs, LLC. All rights reserved.
// 
//=======================================================================

function observeOnFocus(element, frequency, callback) {
	element.observe('focus', function() {
		element.observer = new Form.Element.Observer(element, frequency, callback);
	});
	element.observe('blur', function() {
		element.observer.stop();
		element.observer = null;
	});
}

Effect.BlindFade = function(element) {
	element = $(element);
	return new Effect.Parallel([ new Effect.BlindUp(element), new Effect.Fade(element) ],
		Object.extend({ duration: 0.5, afterFinishInternal: function(effect) {
			if($(element.id)) element.remove();
		} 
	}, arguments[1] || { }));
};

var Store = {
	
	error_div:				'error',
	currency_sign:			'$',
	item_singular:			'item',
	item_plural:			'items',
	discount_off:			'% off',
	show_shipping:	false,
	
	initialize: function() {
		
		var owner = this;
		var id	  = document.body.id;
		
		API.onError = function(error) {
			owner.onError(error);
		}
		
		this.detectCookies();
		
		if(id == 'product') {
			this.initProductPage();
		} else if(id == 'cart') {
			this.initCartPage();
		} else if(id == 'contact') {
			this.initContactPage();
		} else if(id == 'tulips') {
			this.initTulipPage();
		} else if(id == 'home') {
			this.initTulipPage();
		}
	},
	
	onError: function(error) {
		if(error instanceof Array) error = error.join("</li><li>");
		
		error	= "<li>" + error + "</li>";
		var div = $(this.error_div);
		
		if(div) {
			div.update('<ul>' + error + '</ul>');
		} else {
			$('page_name').insert({ after: '<div class="' + this.error_div + '" id="' + this.error_div + '"><ul>' + error + '</ul></div>' });
			div = $(this.error_div);
		}
		
		div.hide();
		div.scrollTo();
		
		div.blindDown({ duration: 0.3 });
		
		var add = $('adding_to_cart');
		var add2= $('adding_to_cart2');
		var add3= $('adding_to_cart_frame');
		if(add) add.hide();
		if(add2) add2.hide()
		if(add3) add3.hide()
	},
	
	clearErrors: function() {
		var div = $(this.error_div);
		if(div) div.remove();
	},
	
	detectCookies: function() {
		var cookieEnabled = navigator.cookieEnabled;

		if(typeof navigator.cookieEnabled=="undefined" && !cookieEnabled) { 
			document.cookie = "testcookie"
			cookieEnabled = document.cookie.indexOf("testcookie") != -1;
		}

		if(!cookieEnabled) {
			this.onError("Cookies must be enabled to use this store");
		}
	},
		
	initProductPage: function() {
		var owner	  	= this;
		var adding	  	= $('adding_to_cart');
		var frameadd  	= $('adding_to_cart_frame');
		var frameadd2 	= $('adding_to_cart_frame2');
		var frameadd3 	= $('adding_to_cart_frame3');
		var added	  	= $('added_to_cart');
		var frameadded  = $('added_to_cart_frame');
		var frameadded2 = $('added_to_cart_frame2');
		var frameadded3 = $('added_to_cart_frame3');
		var form	  	= $('product_form');
		var frameform  	= $('frame_form');
		var frameform2	= $('frame_form2');
		var frameform3	= $('frame_form3');
		var mini	  	= $('minicart');
		var options   	= { duration: .25, queue: { position: 'end', scope: 'add' }};
        		
		// preload product images
		var img = new Image();
		$$('#product_images a').each(function(elm) {
			img.src = elm.href;
		});
		
		setupZoom();   
		
		if(form) {
			form.onsubmit = function() {				
				owner.clearErrors();
				adding.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding.hide();
						added.show();
						added.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(frameform) {
			frameform.onsubmit = function() {				
				owner.clearErrors();
				frameadd.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						frameadd.hide();
						frameadded.show();
						frameadded.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(frameform2) {
			frameform2.onsubmit = function() {				
				owner.clearErrors();
				frameadd2.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						frameadd2.hide();
						frameadded2.show();
						frameadded2.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(frameform3) {
			frameform3.onsubmit = function() {				
				owner.clearErrors();
				frameadd3.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						frameadd3.hide();
						frameadded3.show();
						frameadded3.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
	},

	updateMiniCart: function(cart) {
		this.updateAmount($('minicart_count'), Format.pluralize(cart.item_count, this.item_singular, this.item_plural));
	},

	initTulipPage: function() {
		var owner		= this;
		var adding		= $('adding_to_cart');
		var adding2 	= $('adding_to_cart2');
		var adding3 	= $('adding_to_cart3');
		var adding4 	= $('adding_to_cart4');
		var adding5 	= $('adding_to_cart5');
		var adding6 	= $('adding_to_cart6');
		var adding7 	= $('adding_to_cart7');
		var adding8 	= $('adding_to_cart8');
		var adding9 	= $('adding_to_cart9');
		var adding10 	= $('adding_to_cart10');
		var adding11 	= $('adding_to_cart_frame');
		var adding12 	= $('adding_to_cart_frame2');
		var added		= $('added_to_cart');				
		var added2		= $('added_to_cart2');
		var added3		= $('added_to_cart3');				
		var added4		= $('added_to_cart4');				
		var added5		= $('added_to_cart5');				
		var added6		= $('added_to_cart6');				
		var added7		= $('added_to_cart7');				
		var added8		= $('added_to_cart8');				
		var added9		= $('added_to_cart9');				
		var added10		= $('added_to_cart10');
		var added11  	= $('added_to_cart_frame');
		var added12  	= $('added_to_cart_frame2');
		var form		= $('tulip_form');
		var form2   	= $('tulip_form2');
		var form3   	= $('tulip_form3');
		var form4   	= $('tulip_form4');
		var form5   	= $('tulip_form5');
		var form6   	= $('tulip_form6');
		var form7   	= $('tulip_form7');
		var form8   	= $('tulip_form8');
		var form9   	= $('tulip_form9');
		var form10   	= $('tulip_form10');
		var form11		= $('frame_form');
		var form12		= $('frame_form2');
		var mini		= $('minicart');
		var options = { duration: .25, queue: { position: 'end', scope: 'add, add2'}};
        		
		// preload product images
		var img = new Image();
		$$('#product_images a').each(function(elm) {
			img.src = elm.href;
		});
		
		setupZoom();   
		
		if(form) {
			form.onsubmit = function() {				
				owner.clearErrors();
				adding.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding.hide();
						added.show();
						added.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form2) {
			form2.onsubmit = function() {				
				owner.clearErrors();
				adding2.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding2.hide();
						added2.show();
						added2.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form3) {
			form3.onsubmit = function() {				
				owner.clearErrors();
				adding3.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding3.hide();
						added3.show();
						added3.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form4) {
			form4.onsubmit = function() {				
				owner.clearErrors();
				adding4.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding4.hide();
						added4.show();
						added4.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form5) {
			form5.onsubmit = function() {				
				owner.clearErrors();
				adding5.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding5.hide();
						added5.show();
						added5.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form6) {
			form6.onsubmit = function() {				
				owner.clearErrors();
				adding6.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding6.hide();
						added6.show();
						added6.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form7) {
			form7.onsubmit = function() {				
				owner.clearErrors();
				adding7.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding7.hide();
						added7.show();
						added7.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form8) {
			form8.onsubmit = function() {				
				owner.clearErrors();
				adding8.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding8.hide();
						added8.show();
						added8.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form9) {
			form9.onsubmit = function() {				
				owner.clearErrors();
				adding9.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding9.hide();
						added9.show();
						added9.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form10) {
			form10.onsubmit = function() {				
				owner.clearErrors();
				adding10.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding10.hide();
						added10.show();
						added10.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form11) {
			form11.onsubmit = function() {				
				owner.clearErrors();
				adding11.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding11.hide();
						added11.show();
						added11.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
		if(form12) {
			form12.onsubmit = function() {				
				owner.clearErrors();
				adding12.appear({ duration: 0.25 });
				Cart.addItem(this.serialize(true)['cart[add][id]'], 1, function(cart) {
					mini.slideUp(Object.extend(options, { afterFinish: function() {						
						owner.updateMiniCart(cart);						
					}}));
					
					mini.slideDown(Object.extend(options, { afterFinish: function() {		  
						adding12.hide();
						added12.show();
						added12.fade({ duration: 0.3, delay: 3 });
					}}));
				});
				return false;
			}
		}
	},
	
	initCartPage: function() {
		var owner = this;
		
		$$('#cart_contents input').each(function(element) {
			observeOnFocus(element, 0.3, owner.updateCart.bind(owner));
		});
		
		$$('#cart_discount_code, #country').each(function(element) {
			element.onchange = function(){ owner.updateCart(); }
			observeOnFocus(element, 5, function() {
				// trigger onchange event
				element.blur();
				element.focus();
			});
		});
	},
	
	updateCart: function() {
		this.clearErrors();
		Cart.updateFromForm('cart_form', this.onCartUpdate.bind(this));
	},
	
	removeItem: function(id) {
		var owner = this;
		this.clearErrors();
		new Effect.BlindFade('item_' + id, { afterFinish: function() {
			Cart.removeItem(id, owner.onCartUpdate.bind(owner));
		}});
	},
	
	removeCart: function() {
		this.clearErrors();
		var cart_form = $('cart_form');
		if(!cart_form) return;
		cart_form.fade({ duration: 0.3 });
		$('cart_empty').appear({ delay: 0.3, duration: 0.3, afterFinish: function(){ cart_form.remove(); }});
	},
	
	onCartUpdate: function(cart) {
		var owner	 = this;
		var shipping = $('shipping_total');
		var discount = $('discount_total');
		var price	 = $('cart_price');
		var removed	 = 0;
		
		this.updateMiniCart(cart);
		
		if(cart.item_count > 0) {
			
			// update item prices
			$$('.item_total').each(function(div, index) {
				var id	 = Number(div.id.split('_')[1]);
				var item = cart.items[index - removed];
				if(item && id == item.id) {
					owner.updateAmount(div, owner.toMoney(item.price));
				} else {
					removed++;
					new Effect.BlindFade('item_' + id);
				}
			});
			
			// update shipping
			if(this.show_shipping && shipping && cart.shipping) {				
				cart.shipping.pending ? shipping.hide() : shipping.show();
				this.updateAmount(shipping, this.toMoney(cart.shipping.amount));
			}
			
			// update discount			
			if(discount && cart.discount) {
				discount.show();
				this.updateAmount($('discount_entry'), cart.discount.percent + this.discount_off)
				this.updateAmount(discount, this.toMoney(cart.discount.amount));
			} else if(discount) {
				discount.hide();
			}
			
			//	update total price
			this.updateAmount(price, this.show_shipping ? this.toMoney(cart.total) : this.toMoney(cart.price));
		
		} else {
			setTimeout(function(){ owner.removeCart(); }, 500);
		}
	},
	
	updateAmount: function(elm, html) {
		var before = elm.innerHTML;
		elm.update(html);
		if(before != elm.innerHTML) elm.pulsate({ pulses: 1, duration: 0.25 });
	},
	
	toMoney: function(n) {
		return '<span class="currency_sign">' + this.currency_sign + '</span>' + Format.money(n, true);
	},
	
	initContactPage: function() {
		try { document.forms[0].focusFirstElement(); } catch(e) { }
	}
		
};
	
Event.observe(window, 'load', function(){ Store.initialize(); }, false);
