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: '',
	element_price_new: '',
	
	price_old: 0,
	price_new: 0,
	price_tax: 0,
	
	price_total: 0,
	
	amount: 1,
	
	versions: [],
	version: 0,
	
	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();
	},
	
	setElementOldPrice: function(id) {
		this.element_price_old = id;
	},
	
	setElementNewPrice: function(id) {
		this.element_price_new = 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).hide();
		}
		
		if($(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();



/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
 
var Base64 = {
 
	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = Base64._utf8_encode(input);
 
		while (i < input.length) {
 
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
 
			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
		}
 
		return output;
	},
 
	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
 
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 
			output = output + String.fromCharCode(chr1);
 
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
 
		}
 
		output = Base64._utf8_decode(output);
 
		return output;
 
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
 
}
