/*!
 * modecashop.js
 *
 * Copyright (c) 2010 BlueBear Internet Solutions (www.bluebear.nl)
 * Licensed under the MIT license.
 *
 * Based on MooTools 1.2.x
 * Provides: [bijouxstore.cart, bijouxstore.Request, bijouxstore.imageSlider, bijouxstore.checkboxes, bijouxstore.pager]
 */

var modecashop = {};

modecashop.cart = new Class({
	Extends: Request,
	options: {
		'url': window.location.href,
		'method': 'post',
		'onRequest': function() {
			if (this.errorContainer) {
				this.errorContainer.addClass('hidden');
			}
		},
		'onSuccess': function(responseText) {
			var response = JSON.decode(responseText);
			if (this.cartContainer) {
				var cinfo = this.cartContainer.getElement('.info');
				if (cinfo) {
					var newCInfo = MooTools.lang.get('modecashop').get('articles')+': '+response.number;
					if (response.number && $type(response.total)) {
						newCInfo += '<br />'+MooTools.lang.get('modecashop').get('totalprice')+': &euro; '+(response.total / 100).toFixed(2).replace('.', ',');
					}
					cinfo.set('html', newCInfo);
					this.highlights[0].start('.dark').start('.default');
				}
				if (this.cartContainer.getElement('.line') && $type(response.total)) {
					this.cartContainer.getElements('#cNumber').set('html', (response.number / 100).toFixed(2).replace('.', ','));
					this.cartContainer.getElements('#cPrice').set('html', (response.price / 100).toFixed(2).replace('.', ','));
					this.cartContainer.getElements('#cDiscount').set('html', (response.discount / 100).toFixed(2).replace('.', ','));
					this.cartContainer.getElements('#cSubtotal').set('html', (response.subtotal / 100).toFixed(2).replace('.', ','));
					this.cartContainer.getElements('#cVat').set('html', (response.vat / 100).toFixed(2).replace('.', ','));
					this.cartContainer.getElements('#cShipping').set('html', (response.shipping / 100).toFixed(2).replace('.', ','));
					this.cartContainer.getElements('#cTotal').set('html', (response.total / 100).toFixed(2).replace('.', ','));
					this.highlights[0].start('.dark').start('.default');
				}
			}
			if (this.wishContainer) {
				var winfo = this.wishContainer.getElement('.info a');
				if (winfo) {
					var wishlistsTranslation = (response.wishlistCount == 1) ? MooTools.lang.get('modecashop').get('wishlist') : MooTools.lang.get('modecashop').get('wishlists');
					var newWInfo = response.wishlistCount + ' ' + wishlistsTranslation;
					winfo.set('html', newWInfo);
				}
				this.highlights[1].start('.dark').start('.default');
			}
			if (response.error && this.errorContainer) {
				var einfo = this.errorContainer.getElement('span');
				if (!einfo) {
					einfo = this.errorContainer;
				}
				var errorText = MooTools.lang.get('modecashop').get(response.error);
				if (!errorText) {
					errorText = response.error;
				}
				einfo.set('html', errorText);
				this.errorContainer.fade('hide').removeClass('hidden').fade('in');
			}
			var cart = $('cart');
			if (response.orders && cart) {
				var deleted_ids = [];
				cart.getElements('tr[id]').each(function(tr) {
					var id = tr.get('id').substr(5).toInt();
					deleted_ids[id] = tr;
				});
				response.orders.each(function(o) {
					var info = cart.getElement('tr#order'+o.id);
					if (info) {
						info.getElements('input.oNumber').set('value', o.number);
						if ($type(o.aprice)) {
							info.getElements('.aPrice').set('html', (o.aprice / 100).toFixed(2).replace('.', ','));
						}
						var price = info.getElement('.oPrice');
						if ($type(o.price) && price) {
							oprice = (o.price / 100).toFixed(2).replace('.', ',');
							if (price.get('html') != oprice) {
								price.set('html', oprice).set('morph', {
									'duration': 1000,
									'link': 'chain'
								});
								price.get('morph').set('.light').start('.medium').start('.light');
							}
						}
						deleted_ids[o.id] = undefined;
					}
				}.bind(this));
				deleted_ids.each(function(tr) {
					if (tr) {
						var border = tr.getNext('tr');
						if (border) {
							if (!border.get('id')) {
								border.destroy();
							}
						}
						tr.destroy();
					}
				});
			}
		}
	},
	initialize: function(cartContainer, wishContainer, errorContainer, options) {
		this.parent(options);
		this.containers = [];
		this.highlights = [];
		if (cartContainer) {
			this.cartContainer = $(cartContainer);
		} else {
			this.cartContainer = false;
		}
		if (this.cartContainer) {
			this.highlights[0] = new Fx.Morph(this.cartContainer, {
				'link': 'chain',
				'duration': 1000
			});
		}
		if (wishContainer) {
			this.wishContainer = $(wishContainer);
		} else {
			this.wishContainer = false;
		}
		if (this.wishContainer) {
			this.highlights[1] = new Fx.Morph(this.wishContainer, {
				'link': 'chain',
				'duration': 1000
			});
		}
		if (errorContainer) {
			this.errorContainer = $(errorContainer);
		} else {
			this.errorContainer = false;
		}
		if (this.errorContainer) {
			if (this.errorContainer.get('html')) {
				this.errorContainer.fade('show');
			} else {
				this.errorContainer.fade('hide');
			}
		}
	},
	addArticle: function(form) {
		if (form.getElement('input[name=a]').getProperty('value') == 'addtocart') {
			this.send(form.toQueryString());
		}
	},
	update: function(form) {
		if (form.getElements('input[name=a]').filter(function(i) { return i.getProperty('value') == 'savecart' }).length) {
			this.send(form.toQueryString());
		}
	},
	empty: function() {
		if (confirm(MooTools.lang.get('modecashop').get('confirm_empty_cart'))) {
			this.send('a=emptycart');
		}
	},
	wishlistmanager: function() {
		var cart = $('cart');
		if (cart) {
			var rows = cart.getElements('tr.wishlist');
			if (Browser.Engine.trident4) {
				rows.setStyle('cursor', 'hand');
			} else {
				rows.setStyle('cursor', 'pointer');
			}
			rows.addEvents({
				'mouseenter': function() {
					this.addClass('light');
				},
				'mouseleave': function() {
					this.removeClass('light');
				},
				'click': function(e) {
					var link = this.getElement('a.select_wishlist');
					if (link) {
						window.location = link.getProperty('href');
					}
				}
			});
			var
				titleContainer = cart.getElement('th.wishlistTitle');
			if (titleContainer) {
				var
					title = titleContainer.getElement('h2.rename'),
					edit = title.getNext('input[name=name]'),
					inputs = titleContainer.getElements('input')
				;
				if (title && edit) {
					edit.addEvents({
						'blur': function() {
							if (this.get('value') != title.get('text')) {
								titleContainer.send(window.location.href);
								title.set('html', this.get('value'));
							}
							this.addClass('hidden');
							inputs.set('disabled', true);
							title.removeClass('hidden');
						},
						'keydown': function(e) {
							if (e.key == 'enter' || e.key == 'esc') {
								e.stop();
								this.blur();
							}
						}
					});
					title.addEvent('click', function() {
						this.addClass('hidden');
						inputs.set('disabled', null);
						edit.set('value', this.get('text')).removeClass('hidden').focus();
					});
				}
			}
		}
	},
	addOrderToCartButtons: function(parent) {
		if (!parent) { parent = 'cart'; }
		parent = $(parent);
		var typeEl = parent.getElement('input[name=type]');
		if (typeEl) {
			var cartType = typeEl.getProperty('value');
			parent.getElements('input[name^=addordertocart]').each(function(input) {
				// Get Parent row, if any.
				var tr = input.getParent('tr');
				if (tr) {
					var numberEl = tr.getElement('input.oNumber');
				}

				// Attach events.
				if (!input.disabled) {
					input.addEvent('click', function(e) {
						if (e) { e.stop(); }
						var queryString = input.getProperty('name') + '=1&a=savecart&type=' + cartType;
						if (numberEl) {
							queryString += '&' + numberEl.getProperty('name') + '=' + numberEl.getProperty('value');
						}
						this.send(queryString);
					}.bind(this));
				}
			}, this);
		}
	},
	addWishlistToCartButtons: function(parent) {
		if (!parent) { parent = 'cart'; }
		parent = $(parent);
		var buttons = parent.getElement('input[name=addwishlisttocart]').map(function(el) {
			return el.getNext('input[type=submit]');
		});
		if (buttons.length) {
			buttons.each(function(btn, i) {
				btn.addEvent('click', function(e) {
					if (e) { e.stop(); }
					var type = btn.getPrevious('input[name=type]').value;
					var queryString = 'a=addwishlisttocart&type=' + type;
					this.send(queryString);
				}.bind(this));
			}, this);
		}
	}
});

modecashop.Request = new Class({
	Extends: Request,
	initialize: function(options) {
		this.parent(options);
		this.form = this.options.form;
		this.loader = this.form.getElement('div.loader');
	},
	newFilters: function(response) {
		this.form.getElements('div.filter').each(function(filter) {
			var list = filter.getElement('ul');
			list.empty();
			var filterName = filter.getProperty('id').substr(7);
			response[filterName].each(function(f) {
				// Create elements.
				var item = new Element('li', {
					'class': 'dark'
				});
				var input = new Element('input', {
					'type': 'checkbox',
					'id': 'check_'+f.id,
					'name': filterName+'[]',
					'class': 'check',
					'value': f.id,
					'disabled': !f.enabled,
					'checked': !!f.checked
				});
				var label = new Element('label', {
					'for': 'check_'+f.id
				});
				// Set element properties.
				if (f.enabled) {
					item.addClass('enabled');
				} else {
					item.addClass('disabled');
				}
				if (filterName == 'supply') {
					item.addClass('dark');
					label.set('html', MooTools.lang.get('modecashop').get('supplyonly'));
				} else {
					item.addClass('dark');
					label.set('html', f.name);
				}
				// Inject elements.
				item.adopt(input, label);
				list.grab(item);
			});
		}, this);
		checkboxes.initialize(this.form);
	},
	newArticles: function(response) {
		var articles = $('items').getElement('ul');
		if ($type(modecaTips)) {
			modecaTips.detach('a.info');
		}
		articles.empty();
		response.each(function(item, i) {
			var a = response[i];
			// Create base elements.
			var article = new Element('li', {
				'class': 'item light'
			});
			if (!((i+1)%4)) {
				article.addClass('last');
			}
			var image = new Element('div', {
				'class': 'img',
				'html': '<span class="title_overlay"></span><span class="title">' + a.artcode + '</span>'
			}), imgcount = a.images.length;

			// Build controls.
			var controlTitle = MooTools.lang.get('modecashop').get('artcode')+': '+a.artcode;
			var controlHtml = '';
			if (a.offer) {
				controlHtml += '<li><a href="#" class="offer" title="'+controlTitle+'"></a></li>';
			}
			controlHtml += '<li><a href="#" class="info" title="'+controlTitle+'"></a></li>';
			controlHtml += '<li>';
			if (imgcount) {
				image.setStyle('background-image', "url('" + a.images[0] + "_small.jpg')");
				controlHtml += '<a href="'+a.images[0]+'_large.jpg" class="image" rel="milkbox[art_'+a.artcode+']" title="'+controlTitle+'"></a>';
				if (a.imgcount > 1) {
					for (var j = 1; j < imgcount; ++j) {
						controlHtml += '<a href="'+a.images[j]+'_large.jpg" class="hidden" rel="milkbox[art_'+a.artcode+']" title="'+controlTitle+'"></a>';
					}
				}
			}
			controlHtml += '</li>';
			controlHtml += '<li><a href="/shop/show/'+a.id+'-'+a.artcode+'" class="more" title="'+controlTitle+'"></a></li>';

			var controls = new Element('ul', {
				'class': 'controls',
				'html': controlHtml
			});

			// Build info.
			var infoHtml = '<ul><li>'+MooTools.lang.get('modecashop').get('year')+': '+a.year.name+'</li><li>'+MooTools.lang.get('modecashop').get('season')+': '+a.season.name+'</li><li>'+MooTools.lang.get('modecashop').get('fabric')+': '+a.fabric.name+'</li></ul>';
			var info = new Element('div', {
				'class': 'info',
				'html': infoHtml
			});

			// Inject elements.
			article.adopt(image, controls, info);
			articles.grab(article);
		}, this);
		if ($type(milkbox)) {
			milkbox.initialize();
		}
		if ($type(modecaTips)) {
			modecaTips.attach('a.info');
		}
	},
	updatePager: function(current, total, filterstring) {
		if (filterstring) {
			filterstring = '?'+filterstring+'&';
		} else {
			filterstring = '?';
		}
		var pager = $('pager');
		pagerContainer = pager.getElement('span.pager');
//		pager.getElement('span.of_pages').set('html', MooTools.lang.get('modecashop').get('of_pages').replace('[COUNT]', total));
		pagerContainer.getElements('a').destroy();
		for(var i=1;i<=total;i++) {
			var html = i;
			if (i < 10) { html = '0' + i; }
			p = new Element('a', {
				'class': 'highlight',
				'title': 'articlespage='+i,
				'href': filterstring+'articlespage='+i,
				'html': html
			});
			if (current == i) {
				p.addClass('active');
			}
			pagerContainer.grab(p);
		}
		modecaPager.initialize();
	},
	updateLink: function(container, link) {
		var property = 'html';
		if (container.get('tag') == 'input' || container.get('tag') == 'textarea') {
			property = 'value';
		}
		container.set(property, link);
	}
});

modecashop.imageSlider = function(parent) {
	var image = parent.getElement('img');
	image.addEvent('load', function() {
		imageHeight = image.getSize().y;
		viewHeight = parent.getStyle('height').toInt();
		previewHeight = $('preview').getStyle('height').toInt();
		$('scroll').setStyle('height', viewHeight*previewHeight/imageHeight);
		slider = new Slider('preview', 'scroll', {
			'mode': 'vertical',
			'onChange': function(y) {
				image.setStyle('top', -(y*(imageHeight-viewHeight)/100));
			}
		});
	});
};

modecashop.checkboxes = new Class({
	initialize: function(parent) {
		if (!parent) { parent = $('container'); }
		parent.getElements('input.check').each(function(input) {
			// Create and inject new (fancy) span.
			span = new Element('span', {
				'id': input.getProperty('id')+'_span',
				'class': 'check'
			});
			if (input.getProperty('type') == 'radio') {
				span.addClass('input_'+input.getProperty('name'));
			}
			if (input.checked) {
				span.addClass('highlight');
			}
			span.inject(input, 'after');

			// Hide input element.
			input.setStyle('display', 'none');

			// Attach events.
			if (!input.disabled) {
				if (input.getParent('li')) {
					input.getParent('li').addEvent('click', this.click.bind(this, [input, span]));
				} else {
					span.addEvent('click', this.click.bind(this, [input, span]));
				}
			}
		}, this);
		parent.getElements('a.reset_filter').each(function(reset) {
			reset.setStyle('display', 'block');
			reset.addEvent('click', function(e) {
				if (e) { e.stop(); }
				var ul = reset.getNext('ul');
				if (ul) {
					ul.getElements('input').each(function(input) {
						input.checked = false;
					});
				} else if (reset.getParent('div#filter_model')) {
					parent.getElements('div#select_model input').each(function(input) {
						input.checked = false;
					});
				}
				this.doFilter();
			}.bind(this));
		}, this);

		// Create Ajax request for filters
		if ($('filters') && Browser.Features.xhr && typeof this.ajaxFilter == 'undefined') {
			this.createFilterRequest();
		}
	},
	click: function(input, span) {
		if (input.checked) {
			if (input.getProperty('type') != 'radio') {
				input.checked = false;
				span.removeClass('highlight');
			}
		} else {
			if (input.getProperty('type') == 'radio') {
				$$('span.input_'+input.getProperty('name')).removeClass('highlight');
			}
			input.checked = true;
			span.addClass('highlight');
		}
		if (span.getParent('div#filters') && span.getParent('form')) {
			if (typeof this.filterTimer != 'undefined') {
				$clear(this.filterTimer);
			}
			this.filterTimer = this.doFilter.delay(1000, this);
		}
	},
	doFilter: function() {
		if (Browser.Features.xhr) {
			this.ajaxFilter.send(span.getParent('form').toQueryString());
		} else {
			span.getParent('form').submit();
		}
	},
	createFilterRequest: function() {
		this.ajaxFilter = new modecashop.Request({
			form: $('filterform'),
			url: $('filterform').getProperty('action'),
			method: 'get',
			onSuccess: function(responseText) {
				var response = JSON.decode(responseText);
				this.newFilters(response.filters);
				this.newArticles(response.articles);
				this.updatePager(response.pager.current, response.pager.total, this.form.toQueryString());
				$('items').getElements('span.count').set('html', response.count+' '+MooTools.lang.get('modecashop').get('results_found'));
			},
			onFailure: function() {
				this.form.submit();
			},
			onRequest: function() {
				this.loader.setStyle('display', 'block');
			},
			onComplete: function() {
				(function(){this.loader.setStyle('display', 'none');}.bind(this)).delay(500);
			}
		});
	},
	sortChange: function(newValue) {
		var sort = $('filters').getElement('input#sort');
		if (sort) {
			sort.set('value', newValue);
		}
		if (typeof this.filterTimer != 'undefined') {
			$clear(this.filterTimer);
		}
		this.doFilter();
	}
});

modecashop.pager = new Class({
	initialize: function(pager) {
		if (!pager) { pager = $('pager'); }

		if (pager && $('filters')) {
			pager.getElements('a').each(function(p) {
				p.addEvent('click', function(e) {
					if (e) { e.stop(); }
					this.doPage(p.getProperty('title'));
				}.bind(this));
			}, this);
			$$('div.shopnav div.prevnext a').each(function(p) {
				p.addEvent('click', function(e) {
					if (e) { e.stop(); }
					this.doPage(p.getProperty('title'));
				}.bind(this));
			}, this);

			// Create Ajax request for pager.
			if (Browser.Features.xhr && typeof this.ajaxPager == 'undefined') {
				this.createPagerRequest();
			}
		}
	},
	doPage: function(page) {
		if (Browser.Features.xhr) {
			this.ajaxPager.page = page;
			this.ajaxPager.send(this.ajaxPager.form.toQueryString()+'&'+page);
		} else {
			window.location = '?'+$('filterform').toQueryString()+'&'+page;
		}
	},
	createPagerRequest: function() {
		this.ajaxPager = new modecashop.Request({
			form: $('filterform'),
			url: window.location.pathname,
			method: 'get',
			onSuccess: function(responseText) {
				var response = JSON.decode(responseText);
				this.newArticles(response.articles);
				this.updatePager(response.pager.current, response.pager.total, this.form.toQueryString());
			},
			onFailure: function() {
				window.location = this.url+'?'+this.form.toQueryString()+'&'+this.page;
			},
			onRequest: function() {
				this.loader.setStyle('display', 'block');
			},
			onComplete: function() {
				(function(){this.loader.setStyle('display', 'none');}.bind(this)).delay(500);
			}
		});
	}
});

modecashop.downloadIcons = function(elements) {
	els = elements ? $$(elements) : $$('a[rel=enclosure]');
	els.each(function(el) {
		var ext = el.getProperty('href').replace(/^.*\./, '');
		var icon;
		switch (ext) {
			case 'txt':
			case 'rtf':
			case 'doc':
			case 'docx':
				icon = 'doc';
				break;
			case 'xlsx':
			case 'xls':
				icon = 'xls';
				break;
			case 'pdf':
				icon = 'pdf';
				break;
			case 'jpg':
			case 'jpeg':
			case 'gif':
			case 'png':
				icon = 'image';
				break;
			default:
				icon = 'default';
		}
		el.addClass('enclosure').setStyle('background-image', 'url(/skin/icon/' + icon + '.png)');
	});
};

