var Shop = Class.create();   
Shop.prototype = {
	initialize: function() {
		this.Cart = new Shop_Cart();
	}
}

var Cart_Timeout;

Shop_Cart = Class.create();
Shop_Cart.prototype = {
	idCartWindow: 'cartwindow', // div
	idCartItem: 'cartLi', // li
	idCartLink: 'cartHref', // li > a
	
	initialize: function() {

	},
	
	show: function(event) {
		
		var element = event.element();
		
		// Clear timeout
		clearTimeout(Cart_Timeout);
				
		$(this.idCartWindow).style.top = ($(this.idCartItem).positionedOffset().top + 24) + "px";
		$(this.idCartWindow).style.left = ($(this.idCartItem).positionedOffset().left) + "px";
		
		// Mouseover event:
		Event.stopObserving(this.idCartWindow, 	'mouseover', 	this.bindShow);
		
		// Mouseout event:
		Event.stopObserving(this.idCartWindow, 	'mouseout', 	this.bindHide);
		Event.stopObserving(this.idCartItem, 	'mouseout', 	this.bindHide);
		
		$(this.idCartWindow).show();
		$(this.idCartItem).addClassName('cart-hover');
		$(this.idCartLink).addClassName('cart-hover');
		
		// Mouseover event:
		Event.observe(this.idCartWindow, 	'mouseover', 	this.bindShow);
		Event.observe(this.idCartItem, 		'mouseover', 	this.bindShow);
		
		// Mouseout event:
		Event.observe(this.idCartWindow, 	'mouseout', 	this.bindHide);
		Event.observe(this.idCartItem, 		'mouseout', 	this.bindHide);
	},

	hide: function(event) {
		Cart_Timeout = setTimeout(function() {
			$(Shop.Cart.idCartWindow).hide();
			$(Shop.Cart.idCartItem).removeClassName('cart-hover');
			$(Shop.Cart.idCartLink).removeClassName('cart-hover');
			
			// Mouseover event:
			Event.stopObserving(Shop.Cart.idCartWindow, 'mouseover', 	this.bindShow);

			// Mouseout event:
			Event.stopObserving(Shop.Cart.idCartWindow, 'mouseout', 	this.bindHide);
			Event.stopObserving(Shop.Cart.idCartItem, 	'mouseout', 	this.bindHide);
		}, 200);
	},
	
	updateProductCount: function(count) {
		//$(this.idCartLink).update($(this.idCartLink).innerHTML = '<span class=\"cart-product-count\">' + count + ' </span>' + $(this.idCartLink).innerHTML);
	}
}

Shop_Product = Class.create();
Shop_Product.prototype = {
	product_id: 0,
	
	element_price_old: null,
	element_price_new: null,
	element_variant: null,
	element_variant_column1: null,
	element_variant_column2: null,
	
	price_old: 0,
	price_new: 0,
	price_tax: 0,
	
	price_total: 0,
	
	amount: 1,
	
	versions: [],
	version: 0,
	
	variants: [],
	variant: 0,
	variant1: null,
	variant2: null,
	when_out_of_stock: 'show',
	
	variantCallback: function(object) {
		
	},
	
	setVariantCallback: function(callback) {
		this.variantCallback = callback;
	},
	
	initialize: function(product_id) {
		this.product_id = product_id;
	},
	
	/* Setters */	
	setOldPrice: function(price) {
		this.price_old = price;
	},
	
	setNewPrice: function(price) {
		this.price_new = price;
		this.price_total = price;
	},

	setAmount: function(amount) {
		this.amount = amount;
		
		this.updatePrice();
	},
	
	setVersions: function(versions) {
		this.versions = versions;
	},
	
	setVersion: function(version) {
		this.version = version;
		
		this.price_new = this.versions[version];
		
		this.updatePrice();
	},
	
	setVariants: function(variants) {
		this.variants = variants;
	},
	
	setVariant1: function(variant1) {
		this.variant1 = variant1;
	},
	
	setVariant2: function(variant2) {
		this.variant2 = variant2;
	},
	
	refreshVariantList: function(variant) {
		if(this.variants[variant])
		{
			this.variant1 = variant;
			
			var options = [];
			var first = true;
			var object = this;
			Object.values(this.variants[variant]).each(function(variant2) {
				options.push('<option value="' + variant2.title + '">' + variant2.title + ((variant2.stock < 1 || variant2.stock === false) && this.when_out_of_stock != 'hide' ? ' &mdash; Uitverkocht' : '') + '</option>');
				
				if(first) object.setVariant(variant2.title);
				
				first = false;
			});
			
			$(this.element_variant_column2).update(options.join());
			
			if($(this.element_variant_column2).hasClassName('jqTransformHidden'))
			{
				$(this.element_variant_column2).removeClassName('jqTransformHidden');
				
				$($(this.element_variant_column2).parentNode).replace($(this.element_variant_column2));

				transformForm($j);
			}
		}
	},
	
	setVariant: function(variantColumn2, disableCallback) {
		
		if(this.variant1 == null && this.element_variant_column1)
			this.variant1 = $(this.element_variant_column1).value;
		
		var variantColumn1 = this.variant1;
		
		if(variant = this.variants[variantColumn1][variantColumn2])
		{
			this.variant = variant.variant_id;
			this.variant2 = variantColumn2;
			
			if(this.element_variant && $(this.element_variant))
				$(this.element_variant).value = variant.variant_id;
		
			this.price_new = variant.price;
			this.price_old = variant.price_old;
		
			this.updatePrice();
			
			if(disableCallback !== true)
				this.variantCallback(this);
		}
	},
	
	setSingleVariant: function(variantColumn1, disableCallback) {
		this.variant2 = '';

		if(variant = this.variants[variantColumn1][this.variant2])
		{
			this.variant1 = variantColumn1;
			
			this.variant = variant.variant_id;
			
			if(this.element_variant && $(this.element_variant))
				$(this.element_variant).value = variant.variant_id;
		
			this.price_new = variant.price;
			this.price_old = variant.price_old;
		
			this.updatePrice();
			
			if(disableCallback !== true)
				this.variantCallback(this);
		}
	},
	
	whenVariantIsOutOfStock: function(action) {
		this.when_out_of_stock = action;
	},
	
	setElementOldPrice: function(id) {
		this.element_price_old = id;
	},
	
	setElementNewPrice: function(id) {
		this.element_price_new = id;
	},
	
	setElementVariant: function(id) {
		this.element_variant = id;
	},
	
	setElementVariantColumn1: function(id) {
		this.element_variant_column1 = id;
	},
	
	setElementVariantColumn2: function(id) {
		this.element_variant_column2 = id;
	},
	
	/* Updaters */
	updatePrice: function() {
		this.price_total = this.amount * this.price_new;
		
		this.visualUpdatePrice();
	},
	
	/* Visual updaters */
	visualUpdatePrice: function() {
		if(this.element_price_old && $(this.element_price_old))
		{			
			if(this.price_old > 0)
			{
				$(this.element_price_old).update('&euro; ' + Shop_Utils.commaFormatted (Shop_Utils.currencyFormatted (this.amount * this.price_old)));
				$(this.element_price_old).show();
			}
			else
				$(this.element_price_old).hide();
		}

		if(this.element_price_new && $(this.element_price_new))
		{
			$(this.element_price_new).update('&euro; ' + Shop_Utils.commaFormatted (Shop_Utils.currencyFormatted (this.price_total)));
		}
	}
}

var Shop_Utils = {
	
	currencyFormatted: function(amount)	{
		var i = parseFloat(amount);
		if(isNaN(i)) { i = 0.00; }
		var minus = '';
		if(i < 0) { minus = '-'; }
		i = Math.abs(i);
		i = parseInt((i + .005) * 100);
		i = i / 100;
		s = new String(i);
		if(s.indexOf('.') < 0) { s += '.00'; }
		if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
		s = minus + s;
		return s;
	},

	commaFormatted: function(amount) {
		var delimiter = "."; // replace comma if desired
		var a = amount.split('.',2);
		var d = a[1];
		var i = parseInt(a[0]);
		if(isNaN(i)) { return ''; }
		var minus = '';
		if(i < 0) { minus = '-'; }
		i = Math.abs(i);
		var n = new String(i);
		var a = [];
		while(n.length > 3)
		{
			var nn = n.substr(n.length-3);
			a.unshift(nn);
			n = n.substr(0,n.length-3);
		}
		if(n.length > 0) { a.unshift(n); }
		n = a.join(delimiter);
		if(d.length < 1) { amount = n; }
		else { amount = n + ',' + d; }
		amount = minus + amount;
		return amount;
	}
	
}

function confirm_message(message, url)
{
	if (confirm(message)) document.location = url;
	
	return void(0);
}

Event.observe(window, 'load', function() {
	$$('input').each(function(element) {
		Event.observe(element, 'keydown', function(event) {
			if(event.keyCode == Event.KEY_RETURN) Event.element(event).form.submit();
		});
	});
	
	// Check if div#cartwindow exists:
	if($('cartwindow'))
	{
		Shop.Cart.bindShow = Shop.Cart.show.bindAsEventListener(Shop.Cart);
		Shop.Cart.bindHide = Shop.Cart.hide.bindAsEventListener(Shop.Cart);
	
		Event.observe(Shop.Cart.idCartItem, 'mouseover', Shop.Cart.bindShow);
	}
});

var Shop = new Shop();