
var cartx;

var Cart = new Class({

	initialize: function() {
		this.COOKIE = 'cart';
		this.models = {};
		var m = window.location.href.match(/[&\?]malli=([^&#]+)/);
		if (m && m[1]) this.current_model = m[1];
		this.load();
	},
	
	exact_model_price: function(exact_model) {
		var td = $$('.pickable-car tr.selected td:nth-child(3)');
		if (td.length > 0)
			return parseInt(td[0].get('text'));
	},
	
	pick_car: function(exact_model, version) {
		this.init_model(version);
		if (this.models[this.current_model].version != version) {
			if (confirm('Voit valita varusteita vain yhdestä varustelutasosta kerrallaan. Vaihdetaanko varustelutasoksi ' + version + '?')) {
				this.models[this.current_model].items = {};
			} else return false;
		}
		this.models[this.current_model].exact_model = exact_model;
		this.models[this.current_model].version = version;
		this.save();

		// Open "varusteet" table and show help bubble
		$$('tr[rel=Varusteet]').setStyle('display', '');
		$$('p[rel=Varusteet]').setStyle('display', '');
		$$('tr[class=infoheader2]').getElement('th').toggleClass('minus');
		
		var h2 = $$('.pickable')[0].getParents('div.varusteet')[0].getPrevious();
		if (h2 && ! h2.hasClass('selected')) {
			h2.fireEvent('click');
			new Fx.Scroll(window).toElement(h2);
			var found = false;
			$$('.pickable td.price').each(function(td) {
				if (found) return;
				var th = $(td).getParents('.pickable')[0].getElements('th.selected')[0];
				if (th) {
					var version = th.get('text');
					if (cartx.get_version_for_cell(td) == version) {
						var pos = td.getPosition();
						var bubble = new Element('div', { 'class': 'help-bubble', 'html': '<strong>Voit valita hintalaskuriin varusteita klikkaamalla hintakenttää valitun varustetason sarakkeesta. Valitun varusteen voit poistaa klikkaamalla hintakenttää uudelleen.</strong> Kun olet valmis, siirry hintalaskuriin nähdäksesi auton ja varusteiden kokonaishinnan veroineen. Jos haluat vaihtaa varusteluokkaa, valitse automalli uudelleen hinnastotaulukosta.' });
						bubble.setStyles({ top: pos.y - 50, left: pos.x - 385 }).inject($$('body')[0]);
						found = true;
						window.setTimeout(function() {
							bubble.fade('out');
						}, 10000);
						return false;
					}
				}
			});
		}

		return true;
	},
	
	init_model: function(version, overwrite) {
		var m = this.current_model;
		var overwrite = overwrite || false;
		if (! this.models[m] || overwrite) {
			//var thumb = $('model-thumb').get('src');
			this.models[m] =  { version: version, items: {}, exact_model: null };
			this.refresh();
		}	
	},
	
	pick: function(elem, version, id, name, price) {
		var m = this.current_model;
		if (! this.models[m]) {
			alert('Valitse ensin automalli Hinnasto-osiosta.');
		}
		this.init_model(version);
		if (this.models[m].version != version) {
			return false;  // version can be changed only by re-selecting the car
			if (confirm('Voit valita varusteita vain yhdestä varustelutasosta kerrallaan. Vaihdetaanko varustelutasoksi ' + version + '?')) {
				this.models[m] = null;
				this.pick(elem, version, id, name, price);
			}
		} else {
			if (! this.models[m].items[id]) {
				// Add item
				$(elem).addClass('price-selected').removeClass('selectable');
				$(elem).set('title', 'Poista keräilykorista');
				this.add_item(m, id, name, price);
			} else {
				// Remove item
				$(elem).removeClass('price-selected').addClass('selectable');
				$(elem).set('title', 'Lisää keräilykoriin');
				this.remove_item(m, id);
			}
		}
	},
	
	remove_item: function(model, id) {
		this.models[model].items[id] = null;
		this.draw();
		if (window.calcx) calcx.calculate();
		this.save();
	},
	
	hide_help: function() {
		$$('#cart .tab-help').addClass('hidden');
		$$('#cart .tab-cart').removeClass('hidden');
	},
	
	add_item: function(model, id, name, price) {
		this.models[model].items[id] = {
			'name': name,
			'price': price
			//url: window.location.href.replace(/#[^#]*$/, '') + '#' + id
		};
		var table = $(id).getParents('.pickable')[0];
		var pick_one = table.hasClass('pick-one');
		if (pick_one) {
			table.getElements('.price-selected').each(function(sibling) {
				var sibling_id = $(sibling).getParent().get('id');
				if (sibling_id != id) {
					cartx.remove_item(model, sibling_id);
					cartx.refresh();
				}
			});
		}
		this.hide_help();
		this.draw();
		if (window.calcx) calcx.calculate();
		this.save();
	},

	empty: function() {
		//this.models[this.current_model].items = {};
		this.models = {};
		this.refresh();
		this.draw();
		this.save();
		if (window.calcx)
			calcx.calculate();
	},
	
	save: function() {
		Cookie.write(this.COOKIE, JSON.encode(this.models));	
	},
	
	load: function() {
		var cookie_val = JSON.decode(Cookie.read(this.COOKIE));
		if (cookie_val) {
			this.models = cookie_val;
		}
		this.refresh();
		this.draw();
	},
	
	is_enabled: function() {
		var models = JSON.decode(Cookie.read(this.COOKIE));
		return window.location.href.indexOf('/hinnat_ja_varusteet') != -1 && (! models || models[this.current_model]);
	},
	
	draw: function() {
		if (! this.is_enabled()) return false;
		var m = this.models[this.current_model];
		if (true || m && m.items) {
			if (! $('cart')) {
				var cart_ui = new Element('div', { id: 'cart' })
					.set('html',
						'<div class="head">' + 
							'<a class="close" title="Sulje" href="#close">X</a>' +
						'</div><div class="body">' +
							'<div class="tab tab-cart hidden">' +
								'<a class="choose-extras" href="/autot/esittely/tekniset_tiedot?malli=' + encodeURIComponent(this.current_model) + '">Valitse varusteet</a>' +
								'<a class="choose-color" href="/autot/esittely/varit_ja_sisustus?malli=' + encodeURIComponent(this.current_model) + '">Valitse väri</a>' +
								'<div class="car"></div>' +
								'<div class="items"></div>' +
								'<div class="total"></div>' +
								'<a class="calc" href="#">Laske autoverollinen hinta</a>' +
							'</div>' +
							'<div class="tab tab-help"><strong>Laske autosi kokonaishinta varusteineen!</strong><br/>' +
								'Valitse hintalaskuriin haluamasi auto sekä varusteet ja laske paljonko ne tulisivat autoverollisina maksamaan.' +
								'<ol><li>Valitse hinnastosta haluamasi malli</li>' +
								'<li>Poimi varustelistasta haluamasi varusteet</li>' +
								'<li>Tuplaklikkaa poistaaksesi väärät valinnat</li>' +
								'<li>Klikkaa <strong>laske</strong> kun haluamasi kokonaisuus on koossa</li></ol>' +
							'</div>' +
						'</div>'
					)
					.inject(document.body)
					.fade('hide').fade('in');
					if (Browser.Engine.trident && Browser.Engine.version < 5) {
						window.onscroll = function() {
							var cart = $('cart');
							if (cart) cart.setStyle('top', window.getScroll().y + window.getSize().y - 10 - cart.getSize().y);
						}
					}
					$$('#cart .close').addEvent('click', function(e) {
						var help = $$('#cart .tab-help')[0];
						if (help.hasClass('hidden') || ! cartx.models[cartx.current_model]) {
							if (cartx.models[cartx.current_model]) {
								if (confirm('Sulkeminen tyhjentää keräilykorin. Haluatko varmasti sulkea?')) {
									cartx.empty();
									$('cart').fade('out');
									window.location.reload();

								}
							} else {
								$('cart').fade('out');
							}
						} else {
							help.addClass('hidden');
							$$('#cart .tab-cart').removeClass('hidden');
						}
						return false;
					});
			} else {
				$('cart').fade('in');
			}
			if (m) {
				var car_price = this.exact_model_price(m.exact_model);
				$$('#cart .car')[0].set('html', '<span class="price">' + car_price + ' €</span>' + m.exact_model);
				$$('#cart .calc')[0].set('href', '/autot/esittely/hintalaskuri?malli=' + encodeURIComponent(this.current_model));
				var item_container = $$('#cart .items')[0];
				item_container.getElements('.item').dispose();
				new Hash(m.items).each(function(item, id) {
					if (item) {
						var text = item.name + ' ';
						var short_text = text.length > 40 ? text.substr(0, 38) + '...' : text;
						var a = new Element('a', { 'href': '#' + id, 'text': short_text, 'class': 'item', 'title': text });
						var price = new Element('span', { 'text': item.price + ' €' });
						price.inject(a, 'top');
						a.inject(item_container);
						a.addEvent('click', function() {
							var m = $(this).get('href').match(/#(.*)/);
							if (m && m[1])
								var item_id = m[1];
							else return false;
							var item = $(item_id);
							if (! item) {
								var item_obj = cartx.models[cartx.current_model].items[item_id];
								if (item_obj) window.location.href = item_obj.url;
							} else {
								new Fx.Scroll(window)
									.toElement(item.getParents('.pickable')[0].getPrevious('h2'))
									.addEvent('complete', function() {
										// Highlight the corresponding row for a moment
										var bg = item.getStyle('backgroundColor');
										var orig = bg == 'transparent' ? '#fff' : bg;
										var fx = new Fx.Tween(item, { duration: 500 }).addEvent('complete', function() {
											window.setTimeout(function() { new Fx.Tween(item, { duration: 2000 }).start('backgroundColor', orig) }, 1500);
										}).start('backgroundColor', orig, '#ff8');
									});
							}
							return false;
						});
					}
				});
				var total_sum = parseInt($$('#cart .car .price')[0].get('text'));
				item_container.getElements('.item SPAN').each(function(item) {
					total_sum += parseInt(item.get('text'));
				});
				$$('#cart .total')[0].set('html', '<span class="price">' + total_sum + ' €</span>' + 'Autoveroton hinta sis. alv 23% ');
				this.hide_help();
			}
		}
	},

	refresh: function() {
		var that = this;
		var m = this.models[this.current_model];
		if (m) {		
			// Hilite selected items
			$$('.pickable .price').removeClass('price-selected');
			new Hash(m.items).each(function(item, id) {
				if (item != null) {
					var cell = that.get_cell(id, m.version);
					$$(cell).addClass('price-selected');
				}
			});
			this.activate_version(m.version);
						
			// Hilite selected car
			$$('.pickable-car TR').removeClass('selected');
			var exact_model = this.models[this.current_model].exact_model;
			if (exact_model) {
				$$('.pickable-car TR TD:first-child').each(function(td) {
					if ($(td).get('title') == exact_model) {
						$(td).getParent().addClass('selected');
					}
				});
			}
			
			// Open tables containing selected items
			$$('.pickable').each(function(table) {
				if ($(table).getElements('.price-selected').length > 0) {
					$$('tr[rel=Varusteet]').setStyle('display', '');
					$$('p[rel=Varusteet]').setStyle('display', '');
					/*
					var h2 = $(table).getParent().getPrevious('h2');
					if (h2 && ! h2.hasClass('selected'))
						h2.fireEvent('click');
						*/
				}
			});
		}
	},
	
	open_table: function(item_id) {
		var table = $(item_id).getParents('.pickable')[0];
		/*
		var h2 = $(table).getParent().getPrevious('h2');
		if (! h2.hasClass('selected'))
			h2.fireEvent('click');*/
	},
	
	activate_version: function(version) {
		$$('.pickable th.varustetaso').each(function(th) {
			var table = th.getParents('table.pickable')[0];
			var index = $(th).getAllPrevious().length;
			if ($(th).get('text') == version) {
				$(th).addClass('selected').removeClass('disabled');
				table.getElements('TD.price:nth-child(' + ++index + ')')
					.addClass('selectable')
					.removeClass('disabled')
					.each(function(td) {
						var icon_add = new Element('div', { 'class': 'icon icon-add' });
						var icon_del = new Element('div', { 'class': 'icon icon-del' });
						td.grab(icon_add, 'top');
						td.grab(icon_del, 'top');
					});
			} else {
				$(th).addClass('disabled').removeClass('selected');
				$$('.pickable TD.price:nth-child(' + ++index + ')')
				.addClass('disabled')
				.removeClass('selectable');
			}
		});
	},
	
	get_cell: function(id, version) {
		var elem;
		var row = $(id);
		if (window.calcx) {
		if (row) {
			row.getParents('.pickable')[0]
 			.getElements('tr')[0].getChildren().each(function(th) {
 				if ($(th).get('text') == version) {
 					var idx = $(th).getAllPrevious().length;
 					elem = $(id).getChildren()[idx];
 				}
 			});
	 	}
	 	} else {
		if (row) {
			row.getParents('.pickable')[0]
 			.getElements('tr')[1].getChildren().each(function(th) {
 				if ($(th).get('text') == version) {
 					var idx = $(th).getAllPrevious().length;
 					elem = $(id).getChildren()[idx];
 				}
 			});
	 	}
	 	}
 		return elem;
	},
	
	process_url: function() {
		var m = window.location.href.match(/#(.*)$/);
		if (m && m.length > 1) {
			var item_id = m[1];
			var item_row = $(item_id);
			if (item_row) {
				cartx.open_table(item_id);
				$$('#cart .items .item[href$=' + item_id + ']').fireEvent('click');
			}
		}
	},
	
	get_version_for_cell: function(td) {
	if (window.calcx) {
		var version = $(td).getParents('.pickable')[0]
			.getElements('tr')[0]
			.getChildren()[$(td).getAllPrevious().length]
			.get('text');
	} else {
		var version = $(td).getParents('.pickable')[0]
			.getElements('tr')[1]
			.getChildren()[$(td).getAllPrevious().length]
			.get('text');
	}	
		return version;
	},
	
	bind_prices: function() {
		$$('.pickable .price').addEvent('click', function() {
			
			// First element of current column, i.e. vertical row
			var version = cartx.get_version_for_cell(this);
	
			// id of current row
			var id = $(this).getParent().get('id');
	
			// Text of first cell of current row
			var name = $(this).getParent().getChildren()[0].get('text');
	
			// Text of current cell
			var price = parseInt($(this).get('text'));
			
			cartx.pick(this, version, id, name, price);
	
		}).set('title', 'Lisää keräyskoriin');
	}	
});


window.addEvent('domready', function() {

	cartx = new Cart();
	
	$$('.pickable-car TD').addEvent('click', function() {
		var tr = $(this).getParent();
		var exact_model = tr.getElements('TD')[0].get('title');
		var version = tr.get('title');
		if (cartx.pick_car(exact_model, version)) {
			$(this).getParents('.pickable-car')[0].getElements('TR').removeClass('selected');
			tr.addClass('selected');
			cartx.draw();
			cartx.refresh();
			cartx.hide_help();
		}
	});
	
	$$('.pickable-car TD.last-child').each(function(td) {
		var icon = new Element('div', { 'class': 'icon icon-add' });
		icon.inject(td, 'top');
	});

	cartx.bind_prices();
	cartx.process_url();
	
});

