window.addEvents({
	'domready': function() {
		$('menu').getElements('a').addEvents({
			'mouseenter': function(event) {
				var target = $(event.target);
				var a = target.get('tag') == 'a' ? target : target.getParent();
				if (a.hasClass('on')) return;
				
				if (!a.fx) a.fx = new Fx.Tween(a);
				a.fx.cancel();
				a.setStyle('background-color', '#5e462d');
			},
			'mouseleave': function(event) {
				var target = $(event.target);
				var a = target.get('tag') == 'a' ? target : target.getParent();
				if (a.hasClass('on')) return;
				
				if (!a.fx) a.fx = new Fx.Tween(a);
				a.fx.cancel();
				a.fx.start('background-color', '#de7d22');
			}
		});
		
		if ($('about-us')) {
			scroller = new Scroller($('about-us').getElement('.scroller'));
			if ($('about-us').getElement('.photos')) {
				var idx = location.href.match(/#\d+$/);
				if (idx)
					idx = idx[0].replace(/#/, '');
				else
					idx = 0;
				new PhotoGallery('about-us', idx);
			}
		}
		
		if ($('prods')) {
			$$('#prods .prod').addEvents({
				'mouseenter': function() {
					this.addClass('prod-on');
				},
				'mouseleave': function() {
					this.removeClass('prod-on');
				},
				'click': function(event) {
					if ($(event.target).tagName == 'A') {
						Cart.add(this.id.replace(/prod/, ''));
						return;
					}

					var img = this.getElement('img');
					if (img.get('src').indexOf('prod-img.gif') == -1)
						imgLoader.loadImg('prod-large', img.get('src') + '-l');
					else
						imgLoader.loadImg('prod-large', '/images/spacer.gif');
						
					if ($('prods').clicked) {
						$('prods').clicked.removeClass('prod-on');
						$('prods').clicked.removeClass('prod-clicked');
					}
					$('prods').clicked = this;
					$('prods').clicked.addClass('prod-clicked');
				}
			});
		}
		
		if ($('cart'))
			$('cart').addEvents({
				'mouseenter': function() {
					if (!$('cart').getElement('div')) return;
					
					if (!$('cart').effect) {
						$('cart').effect = {};
						$('cart').effect.fx = new Fx.Morph('cart', { link: 'cancel' });
						$('cart').effect.min = 20;
						$('cart').effect.max = $('cart').getScrollSize().y - (Browser.Engine.trident ? 5 : Browser.Engine.name == 'presto' ? 0 : 6);
						$('cart').effect.interval = null;
					}
					if ($('cart').effect.interval) $clear($('cart').effect.interval);
					$('cart').effect.fx.start({
						'height': $('cart').effect.max,
						'border-color': '#5e462d'
					});
				},
				'mouseleave': function() {
					if (!$('cart').getElement('div') || !$('cart').effect) return;
					
					$('cart').effect.interval = $('cart').effect.fx.start.delay(500, $('cart').effect.fx, {
						'height': $('cart').effect.min,
						'border-color': '#fff'
					});
				}
			});
			
		if ($('cart-review')) {
			$$('#cart-review table tr').addEvents({
				'mouseover': function() {
					if (this.hasClass('cat') || this.hasClass('checked')) return;
					this.addClass('on');
				},
				'mouseout': function() {
					if (this.hasClass('cat') || this.hasClass('checked')) return;
					this.removeClass('on');
				}
			});
			
			$$('#cart-review input[type=checkbox]').addEvent('click', function() {
				if (this.name.indexOf('del') != -1)
					$('cart-item' + this.value).toggleClass('checked');
				else {
					$$('#cart-review input[type=checkbox]').set('checked', this.checked);
					$$('#cart-review tr.cart-item').set('class', 'cart-item');
					if (this.checked)
						$$('#cart-review tr.cart-item').addClass('checked');
					this.getParent('tr').removeClass('checked');
				}
			});
			
			$$('#cart-review input[type=text]').addEvent('keyup', function() {
				if (!$('cart-review').reqUpdate)
					$('cart-review').reqUpdate = new Request({
						url: '/cart/update',
						link: 'cancel',
						onComplete: function(response) {
							if ($('cart-review-total')) {
								response = response.replace(/\|([^\|]+)$/, '|<strong>$1</strong>');
								$('cart-review-total').set('html', response.replace(/\|/g, '<br>'));
							}
						}
					});
				$('cart-review').reqUpdate.options.data = $('form-cart-review').toQueryString();
				
				$('cart-review-total').set('text', 'calculating...');
				if ($('cart-review').intUpdate) $clear($('cart-review').intUpdate);
				$('cart-review').intUpdate = $('cart-review').reqUpdate.send.delay(500, $('cart-review').reqUpdate);
			});
		}
		
		if ($('checkout')) {
			$$('#checkout input[type=radio]').addEvent('click', function() {
				var match = this.name.match(/(\w+)\[address_id\]/)
				if (match) {
					$('new-' + match[1] + '-address').setStyle('display', this.value == 'new' ? 'block' : 'none');
					var fields = {};
					fields[match[1] + '[address][street]'] = { Filled: true };
					fields[match[1] + '[address][city]'] = { Filled: true };
					fields[match[1] + '[address][state_id]'] = { Filled: true };
					fields[match[1] + '[address][zip]'] = { Filled: true };
					if (this.value == 'new')
						fv.addRules(fields);
					else {
						for (var field in fields) {
							fields[field] = null;
							this.form.elements[field].value = '';
						}
						fv.removeRules(fields);
					}
				}
			});
		}
		
		if ($('orders'))
			$$('#orders a').addEvent('click', function() {
				$('cont-right-wrapper').set('html', 'Please wait...');
				new Request.HTML({
					'update': 'cont-right-wrapper',
					'url': this.href
				}).get();
				return false;
			});
	},
	'load': function() {
		if ($('prods')) {
			var height = $('cont-left').getSize().y;
			if (Browser.Engine.trident && Browser.Engine.version == 4)
				$('cont-right').tween('height', height);
			else
				$('cont-right').tween('min-height', height);
		}
	}
});

var SlideShow = new Class({
	Extends: Options,
	options: {
		mode: 'down',
		files: []
	},

	initialize: function(cont, options) {
		this.cont = typeof(cont) == 'string' ? $(cont) : cont;
		this.setOptions(options);
		
		this.idx = 0;
		this.cont.setStyle('background', 'url(' + this.options.folder + this.options.files[this.idx] + ')');
		var img = new Element('img').setStyle('display', 'none').inject(this.cont);
		
		this.height = this.cont.getSize().y;
		this.fx = new Fx.Tween(img, { duration: 'long', onComplete: this.hide.bind(this) });
		
		this.change.periodical(5000, this);
		preload(this.options.folder + this.options.files[this.idx + 1]);
	},
	
	change: function() {
		this.idx = (this.idx + 1) % this.options.files.length;
		preload(this.options.folder + this.options.files[(this.idx + 1) % this.options.files.length]);
		
		this.cont.getElement('img').set('src', this.options.folder + this.options.files[this.idx]).setStyles({ 'margin-top': (this.options.mode == 'down' ? 0 - this.height : this.height), 'display': 'inline' });
		this.fx.start('margin-top', 0);
	},
	
	hide: function() {
		this.cont.setStyle('background', 'url(' + this.options.folder + this.options.files[this.idx] + ')');
		this.cont.getElement('img').setStyle('display', 'none');
	}

});

var PhotoGallery = new Class({

	initialize: function(cont, idx) {
		this.cont = typeof(cont) == 'string' ? $(cont) : cont;
		
		this.thumbs = this.cont.getElements('.thumb');
		this.numbers = this.cont.getElements('.scroll a');
		this.larges = this.cont.getElements('.large img');
		
		this.top = this.cont.getElement('.top');
		this.bottom = this.cont.getElement('.bottom');
		this.large = this.cont.getElement('.large');
		this.largeHeight = this.cont.getElement('.large').getSize().y;
		this.largePosY = this.cont.getElement('.large').getPosition().y;
		this.fx = new Fx.Scroll(this.large);
		
		this.numbers.addEvents({
			'mouseenter': this.numberOn.bind(this),
			'mouseleave': this.numberOff.bind(this),
			'click': this.numberClick.bind(this)
		});
		this.large.addEvents({
			'mousemove': this.largeMouseMove.bind(this),
			'mouseleave': this.largeMouseLeave.bind(this),
			'click': this.largeClick.bind(this)
		});
		this.top.addEvent('click', this.largeClick.bind(this));
		this.bottom.addEvent('click', this.largeClick.bind(this));
		
		this.idx = idx - 1 > 0 && idx - 1 < this.thumbs.length ? idx - 1 : 0;
		if (this.idx != 0) {
			new Fx.Scroll(this.large, { duration: 0 }).toElement(this.larges[this.idx]);
			
			var posX = this.numbers[this.idx].getPosition(this.cont.getElement('.scroll')).x;
			while (posX > scroller.amount + scroller.width) scroller.next();
		}
		this.numbers[this.idx].set('class', 'on');
	},
	
	numberOn: function(event) {
		var elem = $(event.target);
		var no = elem.get('text').toInt() - 1;
		this.thumbs[no].setStyle('display', 'block');
		
		var pos = elem.getPosition();
		if (!elem.size) elem.x = elem.getSize().x;
		this.thumbs[no].setStyles({ 'left': pos.x + elem.x / 2 - 30, 'top': pos.y - 75 });
	},
	
	numberOff: function(event) {
		var elem = $(event.target);
		var no = elem.get('text').toInt() - 1;
		this.thumbs[no].setStyles({ 'display': 'none' });
	},
	
	numberClick: function(event) {
		var elem = $(event.target);
		var no = elem.get('text').toInt() - 1;
		
		this.updateNumberHighlight(no);
		
		this.fx.cancel();
		this.fx.toElement(this.larges[this.idx]);
	},
	
	largeMouseMove: function(event) {
		this.inc = event.page.y - this.largePosY <= this.largeHeight / 2 ? -1 : 1;
		if ((this.inc == -1 && this.idx == 0) || (this.inc == 1 && this.idx == this.thumbs.length - 1)) {
			this.large.setStyle('cursor', 'auto');
			this.top.setStyle('display', 'none');
			this.bottom.setStyle('display', 'none');
		}
		else {
			this.large.setStyle('cursor', 'pointer');
			this.top.setStyle('display', this.inc == -1 ? 'block' : 'none');
			this.bottom.setStyle('display', this.inc == 1 ? 'block' : 'none');
		}
	},
	
	largeMouseLeave: function(event) {
		if ($(event.relatedTarget) && ($(event.relatedTarget).hasClass('top') || $(event.relatedTarget).hasClass('bottom'))) return;
		
		this.large.setStyle('cursor', 'auto');
		this.top.setStyle('display', 'none');
		this.bottom.setStyle('display', 'none');
	},
	
	largeClick: function(event) {
		if (this.large.getStyle('cursor') != 'pointer') return;
		
		this.updateNumberHighlight(this.idx + this.inc);
		if (this.idx == 0) this.top.setStyle('display', 'none');
		if (this.idx == this.thumbs.length - 1) this.bottom.setStyle('display', 'none');
		if (this.idx == 0 || this.idx == this.thumbs.length - 1)
			this.large.setStyle('cursor', 'auto');
		
		this.fx.cancel();
		this.fx.toElement(this.larges[this.idx]);
		
		location.href = '#' + (this.idx + 1);
		var posX = this.numbers[this.idx].getPosition(this.cont.getElement('.scroll')).x;
		if (posX < scroller.amount)
			scroller.prev();
		else if (posX > scroller.amount + scroller.width)
			scroller.next();
	},
	
	updateNumberHighlight: function(idx) {
		this.numbers[this.idx].set('class', '');
		this.idx = idx;
		this.numbers[this.idx].set('class', 'on');
	}

});

var Scroller = new Class({

	initialize: function(cont) {
		this.cont = typeof(cont) == 'string' ? $(cont) : cont;
		this.scroller = this.cont.getElement('.scroll');
		this.cont.scrollLeft = 0;
		this.amount = this.cont.scrollLeft;
		
		this.cPrev = this.cont.getElement('.prev').setStyle('visibility', 'hidden');
		this.cNext = this.cont.getElement('.next').setStyle('visibility', 'hidden');
		
		this.widthScroll = this.scroller.getScrollSize().x;
		this.width = this.scroller.getSize().x;
		this.scrollMax = this.widthScroll - this.width;
		if (this.scrollMax <= 0) {
			this.cNext.setStyle('display', 'none');
			this.scroller.setStyles({ 'width': 'auto', 'margin-right': 6 });
			return;
		}
		this.cNext.setStyle('visibility', 'visible');
		
		this.fx = new Fx.Scroll(this.scroller);
		this.cPrev.addEvent('click', this.prev.bind(this));
		this.cNext.addEvent('click', this.next.bind(this));
	},
	
	prev: function() {
		this.amount -= this.width;
		this.cPrev.setStyle('visibility', 'visible');
		this.cNext.setStyle('visibility', 'visible');
		if (this.amount <= 0) {
			this.amount = 0;
			this.cPrev.setStyle('visibility', 'hidden');
		}
		
		this.fx.cancel();
		this.fx.start(this.amount);
		
		if (arguments.length == 1) arguments[0].stop();
	},
	
	next: function() {
		this.amount += this.width;
		this.cPrev.setStyle('visibility', 'visible');
		this.cNext.setStyle('visibility', 'visible');
		if (this.amount >= this.scrollMax) {
			this.amount = this.scrollMax;
			this.cNext.setStyle('visibility', 'hidden');
		}
		
		this.fx.cancel();
		this.fx.start(this.amount);
		
		if (arguments.length == 1) arguments[0].stop();
	}

});

var ScrollContent = new Class({
	Extends: Options,
	
	options: {
	},

	initialize: function(cont, options) {
		this.cont = typeof(cont) == 'string' ? $(cont) : cont;
		this.setOptions(options);
		
		this.height = this.cont.getSize().y;
		this.heightScroll = this.cont.getScrollSize().y;
		if (this.heightScroll <= this.height) return;
		this.width = this.cont.getSize().x;
		
		var knobHeight = this.height * this.height / this.heightScroll;
		knobHeight = knobHeight < 20 ? 20 : knobHeight;
		this.sliderCont = new Element('div', { 'class': 'slider-cont' }).setStyles({ 'height': this.height, 'margin-left': this.width + 3 });
		this.sliderKnob = new Element('div', { 'class': 'slider-knob' }).setStyles({ 'height': knobHeight });
		this.sliderCont.grab(this.sliderKnob);
		this.cont.grab(this.sliderCont, 'top');
		var slider = new Slider(this.sliderCont, this.sliderKnob, {
			'mode': 'vertical',
			'range': [0, this.heightScroll - this.height],
			'onChange': this.doScroll.bind(this)
		});
	},
	
	doScroll: function(step) {
		this.cont.scrollTop = step;
		if (Browser.Engine.gecko) this.sliderCont.setStyle('margin-top', step);
	}

});

/* functions */
var Client = {};
Client.login = function(button) {
	new AjaxSubmit('form-login', {
		url: '/client/login',
		button: button,
		onSuccess: function() {
			var url = $('form-login').url.value;
			if (url) {
				location.href = url;
				return;
			}
			
			$('top-right').set('text', 'Client');
			Client.area();
			Cart.reqCart.get();
		}
	});
}
Client.fpass = function(button) {
	new AjaxSubmit('form-fpass', {
		url: '/client/fpass',
		button: button,
		onSuccess: function() {
			alert('An e-mail with your password has been sent to your e-mail address!');
			$('client-fpass').setStyle('display', 'none');
			$('client-login').setStyle('display', 'inline');
		}
	});
}
Client.signUp = function(button) {
	new AjaxSubmit('form-sign-up', {
		url: '/client/sign-up',
		button: button,
		onSuccess: function() {
			$('sign-up').set('tween', {
				onComplete: function() {
					Client.area();
					$('sign-up').set('html', $('success').get('html')).set('tween', {}).tween('opacity', 1);
				}
			}).tween('opacity', 0);
		}
	});
}
Client.update = function(button) {
	new AjaxSubmit('form-account', {
		url: '/client/account',
		button: button,
		onSuccess: function() {
			if (!$('form-account')) return;
			$('form-account').passwd.value = '';
			$('form-account').confirm_passwd.value = '';
			
			alert('The account data has been succesfully updated!');
			Client.area();
		}
	});
}
Client.area = function() {
	$('user-area').set('html', 'Please wait...');
	new Request.HTML({
		update: 'user-area',
		url: '/client/area'
	}).send();
}
Client.confirm = function(button) {
	new AjaxSubmit('form-confirm', {
		url: '/client/confirm-required',
		button: button,
		onSuccess: function() {
			alert('The confirmation e-mail has been sent!');
			$('form-confirm').reset();
			$('code').set('src', '/code/confirm/' + (new Date()));
		}
	});
}

var Addresses = {};
Addresses.list = function() {
	if (!$('addresses')) return;
	$('addresses').set('html', 'Please wait...');
	new Request.HTML({
		update: 'addresses',
		url: '/addresses'
	}).send();
}
Addresses.form = function() {
	$('addresses').set('html', 'Please wait...');
	new Request.HTML({
		update: 'addresses',
		url: '/addresses/form' + (arguments.length == 1 ? '/' + arguments[0] : '')
	}).send();
}
Addresses.save = function(button) {
	new AjaxSubmit('form-address', {
		url: '/addresses/save',
		button: button,
		onSuccess: function() {
			alert('The address has been succesfully added/updated!');
			Addresses.list();
		}
	});
}
Addresses.remove = function(id) {
	if (!confirm('Confirm removing this address?')) return;
	
	$('address' + id)
		.set('tween', { onComplete: function(li) { li.dispose() } })
		.tween('opacity', 0);
	new Request({ url: '/addresses/remove/' + id }).send();
}

var Cart = {};
Cart.reqCart = new Request.HTML({
	update: 'cart',
	link: 'cancel',
	url: '/cart',
	onRequest: function() { if ($('cart')) $('cart').set('html', 'updating cart...'); }
});
Cart.reqCalculate = new Request({
	link: 'cancel',
	url: '/cart/total',
	onRequest: function() { if ($('cart-total')) $('cart-total').set('text', 'calculating...'); },
	onComplete: function(response) { if ($('cart-total')) $('cart-total').set('text', response); }
});
Cart.add = function(id) {
	var prod = $('prod' + id);
	if (!prod.pos1) {
		prod.pos1 = prod.getPosition();
		prod.pos2 = $('shopping-cart').getPosition();
	}
	
	var p = new Element('p', { id: 'floating' + id }).setStyles({ 'background': 'url(' + prod.getElement('img').src + ')', 'margin-left': Browser.Engine.trident ? -92 : 0 });
	p.inject(prod, 'top');
	p.set('morph', {
		transition: 'expo:in',
		onComplete: function(elem) {
			new Request({
				url: '/cart/add/' + elem.id.replace(/floating/, ''),
				onComplete: function() { Cart.reqCart.get(); }
			}).send();
			
			elem.set('tween', {
				onComplete: function(elem) {
					elem.dispose();
				}
			}).tween('opacity', 0);
		}
	}).morph({ 
		'margin-left': prod.pos2.x - prod.pos1.x - (Browser.Engine.trident ? 100 : 8),
		'margin-top': prod.pos2.y - prod.pos1.y
	});
}
Cart.remove = function(id) {
	new Request({ 
		url: '/cart/remove/' + id,
		onComplete: function() { if ($('cart-total')) Cart.reqCalculate.get(); }
	}).send();
	
	var items = $('cart-no-items');
	if (items.get('text').toInt() > 1)
		items.set('text', items.get('text').toInt() - 1);
	else {
		$('cart').effect.fx.cancel();
		$('cart').set('html', 'no products').setStyles({ height: 20, 'border-color': '#fff' });
		return;
	}
	
	var tr = $('cart-item' + id);
	var trPrev = tr.getPrevious('tr');
	var trNext = tr.getNext('tr');
	tr.dispose();
	
	if (trPrev.id.indexOf('cart-item') == -1 && (!trNext || trNext.id.indexOf('cart-item') == -1)) {
		if (trPrev.id.indexOf('first-cat') == -1 && trNext) {
			trPrev.getElement('td.cat').set('html', trNext.getElement('td.cat').get('html'));
			trNext.dispose();
		}
		else
			trPrev.dispose();
	}
}