// Main object
var BLANK_IMAGE_PATH = '/images/blank.png';

var IE6 = (Browser.Engine.trident && Browser.Engine.version < 5);

Element.implement({

  makeClickable: function(){
		var anchor = this.getElement('a');
		if (anchor){
			this.setStyle('cursor', 'pointer');
			this.addEvent('click', function(event){
			  if (document.id(event.target) != anchor) window.location = anchor.href;
			});
		}
	}

});

Font.replace({
		  '#section-left-menu h2': { fontFamily: '75cl Text' },
			'#menu > li > a': {hover: {color: '#CC3333'}, fontFamily: '75cl Text' },
			'#basket': { fontFamily: '75cl Text' },
			'#block-vouchers h2': { letterSpacing: '-0.5px', fontFamily: '75cl Text' },
			'div.page-category h1': { fontFamily: '75cl Text'},
			'div.page-static h1, div.page-static h2': { fontFamily: '75cl Text'},
			'div.page-voucher h1, div.page-voucher p.intro, div.page-voucher h2, div.page-voucher label': { fontFamily: '75cl Text'},
			'div.top-products > h2, div.special-products > h2': { fontFamily: '75cl Text'},
			'#form-product-filter button span span': { fontFamily: '75cl Text'},
			'#form-product-filter h2': { fontFamily: '75cl Text'},
			'div.page-detail h1, div.product-description h2': { fontFamily: '75cl Text'},
			'#form-buy h2': { fontFamily: '75cl Text'},
			'#wide h1': { fontFamily: '75cl Text'},
			'#form-user legend': { fontFamily: '75cl Text'},
			'div.price p.current': { letterSpacing: '-3px', fontFamily: '75cl Text' },
			'div.price p.old': { fontFamily: '75cl Text'},
			'#boxes h2': { fontSize: '15.5px', fontFamily: '75cl Text' },
			'div.page-confirmation h1': { fontFamily: '75cl Text'},
			'div.page-confirmation div.product-info h2': { fontFamily: '75cl Text'},
			'ul.about-wine-list li a, ul.partner-list li a': { fontFamily: '75cl Text'},
			'div.set-content h2': { fontFamily: '75cl Text'},
			'ul.product-list .price-label': { fontFamily: '75clBold' },
			'dl.faq dt': { fontFamily: '75cl Text'}
});

var Shop = {
	
	init: function(){

		if (document.id('product-set')){
			Shop.reflect({
				'div.page-detail ul.product-list img': {height: 1/15, opacity: 0.5, bgcolor: '#F7F7F7'}
			});
		} else {
			Shop.reflect({
				'ul.product-list img': {height: 1/15, opacity: 0.5, bgcolor: '#F7F7F7'},
				'div.page-detail div.product-image img': {height: 1/14, opacity: 0.5, bgcolor: '#F5F5F5'}
			});
		}

		// Automatic form loader
		Shop.Form.init();
		
		// Tabs
		$$('div.tabs').each(function(tabs){
		  new Tabs(tabs);
		});
		
		// IE6 PNG Fix
		/*
		if (IE6){
			var images = $$('ul.product-list div.img img');
			images.each(function(image){
			  image.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + image.src + '")';
				image.src = BLANK_IMAGE_PATH;
			});
		}*/
		
		// Rollers
		$$('div.page-detail div.tab-panel').each(function(element){
			new Roller(element, {
				wrapper: 'div.position',
				content: 'ul.product-list',
				tools: 'p.tools',
				item: {
					element: 'li',
					template: '<div class="img"><img src="{image}" height="210" alt="{title}" /></div><p class="desc"><a href="{url}">{title}</a> <span class="info">{info}</span> <span class="price">{price} Kč <em>'+Messages.get('INC_VAT')+'</em></span> <span class="price-label discount '+LANG+'"><span class="arrow">{percentage}</span></span> <span class="price-label '+LANG+'"><span class="arrow">'+Messages.get('PRICE')+'</span></span></p>',
					data: {
						image: '/images/blank.png',
						title: '',
						url: '',
						info: '',
						price: 0
					},
					width: 255
				},
				button: {
					next: 'p.tools span.button-next',
					prev: 'p.tools span.button-prev'
				},
				output: {
					element: 'p.tools span.status',
					template: '{from}&ndash;{to}/{total}'
				},
				api: {
					read: '/catalog/roller/',
          data: {product: document.id('main-content').getElement('div.page-detail').get('id').replace('product-id-', '')}
				},
				total: element.getElement('p.tools span.status').get('text').replace(/[^\/]*\/(.*)/, '$1').toInt(),
				onAddItem: function(item){
					// if IE6 - no reflection, but png fix
					if (IE6){
						var img = item.getElement('img');
						var src = img.src;
						img.src = BLANK_IMAGE_PATH;
						img.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")';
					} else {
						item.getElement('img').reflect({height: 1/15, opacity: 0.5, bgcolor: '#F7F7F7'});
					}
					var discount = item.getElement('span.discount');
					if (!discount.get('text').trim()){
						discount  = discount.destroy();
					} else {
						// format discount
						if (LANG == 'en'){
							discount.set('html', '<span class="arrow">' + discount.get('text')+'% off </span>');
						} else {
							discount.set('html', '<span class="arrow">'+discount.get('text')+'% Sleva</span>');
						}
						item.getElements('span.price-label')[1].destroy();
					}
				},
				onCheck: function(){
						Cufon.refresh('ul.product-list .price-label');
				}
			});
		});
		
		if (document.id('login-layer')) Shop.LoginLayer.init();
		if (document.id('basket')) Shop.Basket.init();
		if (document.id('user-menu')) Shop.User.Menu.init();
		if (document.id('send-to-friend')) Shop.SendToFriend.init();
		if (document.id('price')) Shop.ProductDetail.init();
		
		// product description hover layer
		$$('div.product-description').each(function(element){
		  new Shop.HoverLayer(element);
		});
		
		if (document.id('flash-logos')){
			new Swiff('/flash/nadace.swf', {
			  width: 90,
				height: 50,
				container: 'flash-logos',
				params: {
					wmode: 'transparent'
				}
			});
		}
		
		// block voucher
		this.blockVouchers = document.id('block-vouchers');
		if (this.blockVouchers){
			this.blockVouchers.setStyle('cursor', 'pointer');
			var anchor = this.blockVouchers.getElement('a');
			this.blockVouchers.addEvent('click', function(event){
			  if (event.target != anchor) window.location = anchor.get('href');
			});
		}
		
		// product lists
		this.productLists = document.id(document.body).getElements('ul.product-list');
		if (this.productLists.length > 0) Shop.ProductList.init(this.productLists);
		
		$$('ul.about-wine-list li, #boxes div.box').makeClickable();

		
	},
	
	reflect: function(settings){
		if (!IE6){
			var settings = new Hash(settings);
			settings.each(function(options, selector){
				$$(selector).reflect(options);
			});
		}
	}
	
 };

Shop.Basket = {
	
	init: function(){
		
		this.container = document.id('basket').setStyle('cursor', 'pointer');
		this.anchor = this.container.getElement('a');
		
		this.price = this.container.getElement('p.price');
		
		this.alternateBg = this.container.getElement('div#basket-highlight');
		this.highlightFx = new Fx.Tween(this.alternateBg, {property: 'opacity', duration: 350, link: 'chain'});
		this.highlightFx.set(0);
		
		this.container.addEvent('click', function(event){
		  if (event.target != this.anchor) window.location = this.anchor.get('href');
		}.bind(this));
		
	},
	
	setPrice: function(price){
		var price = price + ',-';
		this.price.set('text', price);
		Font.replace({'#basket p.price': {}});
		this.highlight();
	},
	
	highlight: function(){
		for (var i = 0; i < 1; i++){
			this.highlightFx.start(1);
			this.highlightFx.start(0);
		}
	}
	
 };

Shop.ProductList = {
	
	init: function(lists){
		
		this.lists = lists;
		
		this.lists.each(function(list){
		  list.addEvent('click', function(event){
				var target = document.id(event.target);
				if (target.get('tag') != 'a'){
					var parent = target.getParent('li');
					if (parent) window.location = target.getParent('li').getElement('a').href;					
				}
			});
			if (IE6){
				var imgWrappers = list.getElements('span.img-wrapper');
				imgWrappers.each(function(element){
					var img = element.getElement('img').setStyle('visibility', 'hidden');
					element.setStyles({
						'width': img.width+'px',
						'filter': 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + img.src + '")'
					});
				});
			}
			
		});
		
	}
 };
 
Shop.ProductDetail = {

  init: function(){
		
		this.Price.init();
		this.Image.init();
		
	}
 };

Shop.ProductDetail.Image = {
	
	init: function(){
		
		this.container = document.id('main-content').getElement('div.product-image');
		
		if (!this.container) return;
		
		this.image = this.container.getElement('img');
		
		// png fix
		/*
		if (IE6){
			var src = this.image.get('src');
			this.image.src = BLANK_IMAGE_PATH;
			this.image.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")';
		}*/
		
		this.price = Shop.ProductDetail.Price.toElement();
		
  }
 };

Shop.ProductDetail.Price = {
	
	init: function(){
		
		this.container = document.id('price');
		
		this.bg = this.container.getElement('div.price-bg');
		
		// has flash installed
		if (Browser.Plugins.Flash.version > 8){
			this.container.addClass('ready');
			var file = '/flash/price.swf';
			var options = {
				container: this.bg,
				width: 145,
				height: 145
			}
		  if (this.container.hasClass('expensive')){
				file = '/flash/price1000.swf';
				options.width = 175;
			}
			new Swiff(file, options);
		}
	},
	
	toElement: function(){
		return this.container;
	}
 };

Shop.Form = {

  init: function(){
		
		this.forms = document.getElements('form');

		this.forms.each(function(form){
			var formID = form.get('id');
			if (formID){
				var objectTitle = formID.replace('form-','').camelCase().capitalize();
				if (Shop.Form[objectTitle]) Shop.Form[objectTitle].init();
			}
		});
		
	}

 };

Shop.Form.ProductListOptions = {
	
	init: function(){
		this.form = document.id('form-product-list-options');
		this.form.getElements('select').each(function(element){
		  element.addEvent('change', function(){ this.form.submit(); }.bind(this));
		}, this);
	}
	
 };
 
Shop.Form.ProductFilter = {
	
	init: function(){
		var self = this;
		this.form = document.id('form-product-filter');
		
		new DoubleSlider('price-range', {
		  knob: {
				suffix: ',-'
			},
			diff: 50,
			steps: 150
		});
				
		new SelectFilter('form-product-filter-country', 'form-product-filter-region');
		
		this.checkboxes = this.form.getElements('input[type=checkbox]');
		this.checkboxes.each(function(checkbox){
			new Checkbox(checkbox);
		});
		
		
		if (document.id('form-product-filter-category') && document.id('form-product-filter-subcategory')){
			new SelectFilter('form-product-filter-category', 'form-product-filter-subcategory');
		}
		
		var filterToggle = document.id('filter-toggle');
		if (filterToggle){
			this.slider = this.form.getParent('div.slide');
			if (this.slider){
				this.slider.set('slide', {duration: 400, transition: 'quint:out', link: 'cancel'});
				if (!this.form.hasClass('open')) this.slider.slide('hide');
				filterToggle.addEvent('click', function(event){
					event.preventDefault();
					self.slider.slide('toggle');
				});
				this.form.addEvent('click:relay(a.close)', function(event){
					event.preventDefault();
					self.slider.slide('out');
				});
			}
		}

	}
	
 };
 
Shop.Form.User = {

  validators: {
		'email': {required: true, tests: {regexp: /[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/, message: Messages.get('EMAIL_INVALID')}},
		'password': {required: true },
		'password-confirm': {required: true },
		'name': {required: true},
		'lastname': {required: true},
		'phone': {required: true, tests: {regexp: /^[0-9 ]{9,12}$|^[0-9\+ ]{13,16}$/, message: Messages.get('PHONE_INVALID')}},
		'invoice-company': {required: true, trigger: 'form-user-invoice-trigger', triggerStatus: true},
		'invoice-ic': { required: true, trigger: 'form-user-invoice-trigger', triggerStatus: true},
		'invoice-dic': { required: true, trigger: 'form-user-invoice-trigger', triggerStatus: true},
		'invoice-street': {required: true, trigger: 'form-user-delivery-trigger', triggerStatus: false},
		'invoice-city': {required: true, trigger: 'form-user-delivery-trigger', triggerStatus: false},
		'invoice-zip': {required: true,	tests: {regexp: /[0-9 ]{5,6}/,	message: Messages.get('ZIP_INVALID')}, trigger: 'form-user-delivery-trigger', triggerStatus: false},
		'delivery-street': {required: true},
		'delivery-city': {required: true},
		'delivery-zip': {required: true, tests: {regexp: /[0-9 ]{5,6}/,	message: Messages.get('ZIP_INVALID')}}
	},
	
	// used when password trigger is available => user profile edit
	dependentValidators: {
		passwordTrigger: {
			'password': {required: true, trigger: 'form-user-password-trigger', triggerStatus: true },
			'password-confirm': {required: true, trigger: 'form-user-password-trigger', triggerStatus: true }
		}
	},
	
	init: function(){
		this.form = document.id('form-user');
		
		this.prefix = 'form-user-';
		
		// invoice slider
		this.invoice = {
			slide: document.id('form-user-invoice-slide').getElement('div.slide'),
			trigger: document.id('form-user-invoice-slide').getElement('input[type=checkbox]')
		}

		this.invoice.fx = new Fx.Slide(this.invoice.slide, { duration: 300, link: 'cancel', transition: Fx.Transitions.Quad.easeOut });

    	this.invoice.checkbox = new Checkbox(this.invoice.trigger, {
		  onChange: function(checkbox){
				checkbox.checked ? this.invoice.fx.slideIn() : this.invoice.fx.slideOut();
			}.bind(this)
		});
		this.invoice.checkbox.checked ? this.invoice.fx.show() : this.invoice.fx.hide();
		
		// delivery slider
		this.delivery = {
			trigger: document.id('form-user-delivery-trigger')
		}
		this.delivery.slide = this.delivery.trigger.getParent('fieldset').getElement('div.slide');
		this.delivery.fx = new Fx.Slide(this.delivery.slide, { duration: 300, link: 'cancel', transition: Fx.Transitions.Quad.easeOut });

		this.delivery.checkbox = new Checkbox(this.delivery.trigger, {
		  onChange: function(checkbox){
				checkbox.checked ? this.delivery.fx.slideOut() : this.delivery.fx.slideIn();
			}.bind(this)
		});
		this.delivery.checkbox.checked ? this.delivery.fx.hide() : this.delivery.fx.show();
		
		// password slide
		if (document.id('form-user-password-slide')){
			this.password = {
				slide: document.id('form-user-password-slide').getElement('div.slide'),
				trigger: document.id('form-user-password-slide').getElement('input[type=checkbox]')
			}
			
			this.password.fx = new Fx.Slide(this.password.slide, { duration: 300, link: 'cancel', transition: Fx.Transitions.Quad.easeOut });
			
			this.password.checkbox = new Checkbox(this.password.trigger, {
				onChange: function(checkbox){
					checkbox.checked ? this.password.fx.slideIn() : this.password.fx.slideOut();
				}.bind(this)
			});
			this.password.checkbox.checked ? this.password.fx.show() : this.password.fx.hide();
		}
		
		// validators
		if (document.id('form-user-password-trigger')) $extend(this.validators, this.dependentValidators.passwordTrigger);
		this.validators = new Hash(this.validators);
		this.validatedItems = new Hash();
		this.validators.each(function(settings, name){
			var field = document.id(this.getID(name));
			if (field) this.validatedItems.set(name, new InputValidator(this.getID(name), settings));
		}, this);
		
		// agreement
		if (this.form.getElement('input#form-user-agreement')){
			this.agreement = new Checkbox(this.form.getElement('input#form-user-agreement'));
			this.agreement.element.getParent('label').getElement('a').addEvent('click', function(event){ event.stop(); window.open(this.href); });
		} else {
			this.agreement = null;
		}
		
		// newsletter
		this.newsletterEl = this.form.getElement('input#form-user-newsletter');
		if (this.newsletterEl){
			new Checkbox(this.newsletterEl);
		}
		
		this.form.addEvent('submit', function(event){
		  event.stop();
		  if (this.isValid()){
				if (this.agreement){
					if (this.agreement.checked){
						this.form.submit();
					} else {
						alert(Messages.get('AGREEMENT_WARNING'));
					}
				} else {
					this.form.submit();
				}
			} else {
				alert(Messages.get('VALIDATION_FAILED'));
			}
		}.bind(this));
		
	},
	
	isValid: function(){
		var errors = 0;
		this.validatedItems.each(function(item, name){
			item.validate();
			errors += item.getError().length;
		});
		
		return !errors;
	},
	
	getID: function(name){
		return this.prefix + name;
	}
	
 };
 
Shop.Form.Login = {
	
	init: function(){
		this.form = document.id('form-login');
		
		this.error = this.form.getElement('span.error');
		
		this.errorFx = new Fx.Slide(this.error, { duration: 100, link: 'cancel' });
		this.errorFx.hide();
		
		this.request = new Request.JSON({
		  url: this.form.get('action'),
			onSuccess: function(responseJSON){
				if ($type(responseJSON) == 'object' && responseJSON.result == true){
					window.location = (responseJSON.url ? responseJSON.url : '/');
				} else {
					this.errorFx.slideIn();
				}
			}.bind(this),
			onFailure: function(){
        this.form.submit();
			}
		});
		
		this.form.addEvent('submit', function(event){
			event.stop();
			var inputs = this.form.getElements('input[type!=image]');
			var values = new Object();
			inputs.each(function(input){
			  values[input.get('name')] = input.value;
			});
			this.request.get(values);
		}.bind(this));
		
	},
	
	show: function(){
		this.errorFx.hide();
		this.form.show();
		return this;
	},
	
	hide: function(){
		this.form.hide();
		return this;
	},
	
	getValue: function(element){
	  return document.id(element).value;
	},
	
	setValue: function(element, value){
		document.id(element).value = value;
	}
	
 };

Shop.Form.Password = {
	
	init: function(){
		this.form = document.id('form-password');
	},
	
	show: function(){
		this.form.show();
		return this;
	},
	
	hide: function(){
		this.form.hide();
		return this;
	},
	
	getValue: function(element){
	  return document.id(element).value;
	},
	
	setValue: function(element, value){
		document.id(element).value = value;
	}
	
 };

Shop.Form.Buy = {
	
	init: function(){
		
		this.form = document.id('form-buy');
		
		this.button = this.form.getElement('input[type=image]');
		
		this.confirmation = this.form.getElement('#form-buy-confirm');
		this.confirmationFx = new Fx.Tween(this.confirmation, { property: 'opacity', duration: 500, link: 'chain' });
		this.confirmationFx.set(0);
		
		this.radioGroup = new RadioGroup(this.form.getElements('input[type=radio]'), {
		  onCheck: function(radio, index){
				radio.getParent('label').addClass('selected');
			},
			onUncheck: function(radio, index){
				radio.getParent('label').removeClass('selected');
			}
		});
		
		this.labels = this.form.getElements('label');
		
		this.labels.each(function(label){
		  var selectBox = label.getElement('select');
			var text = label.getElement('em span');
			selectBox.addEvent('change', function(event){
			  this.check(selectBox, label);
			}.bind(this));
		}, this);
		
		this.request = new Request.JSON({
		  url: this.form.get('action'),
			onSuccess: function(responseJSON){
				if (responseJSON.totalPrice) Shop.Basket.setPrice(responseJSON.totalPrice);
				this.confirmationFx.start(1);
				this.button.fade('out');
				if (responseJSON.info != null) alert(responseJSON.info);
				(function(){
				this.confirmationFx.start(0);
				this.button.fade('in');
				}).delay(3000, this);
			}.bind(this)
		});
		
		/*
		this.button.addEvent('click', function(event){
		  event.preventDefault();
			this.confirmationFx.set(0);
			this.update();
		}.bind(this));
		*/
		
	},
	
	check: function(element, label){
		var value = element.get('value').toInt();
		var text = label.getElement('em span');
		var type = (label.hasClass('pack') ? 'pack' : (label.hasClass('set') ? 'set' : 'one'));
		var newText = '';
		switch (type){
			case 'pack': newText = Messages.get('PACK1'); break;
			case 'set' : newText = Messages.get('SET1'); break;
			case 'one' : newText = Messages.get('BOTTLE1'); break;
		}
		if (!isNaN(value)){
			if (value > 1){
				switch (type){
					case 'pack': newText = Messages.get('PACK24'); break;
					case 'set' : newText = Messages.get('SET24'); break;
					case 'one' : newText = Messages.get('BOTTLE24'); break;
				}
			}
			if (value > 4){
				switch (type){
					case 'pack': newText = Messages.get('PACK5'); break;
					case 'set' : newText = Messages.get('SET5'); break;
					case 'one' : newText = Messages.get('BOTTLE5'); break;
				}
			}
		}
		text.set('text', newText);
	},
	
	update: function(){
		this.request.get(new URI('?'+this.form.toQueryString()).getData());
	}
	
 };
 
Shop.Form.Voucher = {
	
	init: function(){
		
		this.form = document.id('form-voucher');
		
		this.radioGroup = new RadioGroup(this.form.getElements('input[type=radio]'), {
		  onCheck: function(radio, index){
				var label = radio.getParent('label');
				var price = label.getElement('span.price');
				label.addClass('selected');
				Cufon.replace(price, {fontFamily: '75cl Text'});
			},
			onUncheck: function(radio, index){
				var label = radio.getParent('label');
				var price = label.getElement('span.price');
				label.removeClass('selected');
				Cufon.replace(price, {fontFamily: '75cl Text'});
			}
		});
		
		this.priceInput = this.form.getElement('span.price input');
		new Input(this.priceInput, { type: 'numbers' });
	}
 };
 
Shop.Form.Contact = {

  validators: {
		'email': {required: true, tests: {regexp: /[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/, message: Messages.get('EMAIL_INVALID')}},
		'name': {required: true},
		'phone': {tests: {regexp: /^[0-9 ]{9,12}$|^[0-9\+ ]{13,16}$/, message: Messages.get('PHONE_INVALID')}},
		'message': {required: true}
	},
	
	init: function(){
		this.form = document.id('form-contact');
		
		this.prefix = 'form-contact-';
		
		// validators
		this.validators = new Hash(this.validators);
		this.validatedItems = new Hash();
		this.validators.each(function(settings, name){
			var field = document.id(this.getID(name));
			if (field) this.validatedItems.set(name, new InputValidator(this.getID(name), settings));
		}, this);
		
		this.form.addEvent('submit', function(event){
		  event.stop();
		  if (this.isValid()){
				this.form.submit();
			} else {
				alert(Messages.get('VALIDATION_FAILED'));
			}
		}.bind(this));
		
	},
	
	isValid: function(){
		var errors = 0;
		this.validatedItems.each(function(item, name){
			item.validate();
			errors += item.getError().length;
		});
		
		return !errors;
	},
	
	getID: function(name){
		return this.prefix + name;
	}

 };
 
Shop.LoginLayer = {
	
	init: function(){
		
		this.layer = document.id('login-layer');
		this.trigger = document.id('toolbar').getElement('li.sign-in a');
		
		if (!this.trigger) return;
		
		this.form = {
			login: Shop.Form.Login.show(),
			password: Shop.Form.Password.hide()
		}
		
		this.opened = false;
		this.offset = 115;
		
		this.trigger.addEvent('click', function(event){
		  event.stop();
			this.open();
		}.bind(this));
		
		this.layer.addEvent('click', function(event){
		  event.stopPropagation();
		});
		
		this.passwordTrigger = this.layer.getElement('a.new-password');
		this.passwordTrigger.addEvent('click', function(event){
		  event.stop();
			this.form.login.hide();
			this.form.password.show();
			this.form.password.setValue('form-login-reset-email', this.form.login.getValue('form-login-email'));
		}.bind(this));
		
	},
	
	open: function(){
		this.position = this.trigger.getPosition('header');
  	this.layer.setStyle('left', this.position.x-this.offset).show();
		this.opened = true;
		Observer.register(this.close, this);
	},
	
	close: function(){
		if (this.opened){
			this.layer.hide()
			this.form.login.show();
			this.form.password.hide();
			this.opened = false;
		}
	}
 };
 
Shop.HoverLayer = new Class({

  Implements: Options,
	
	options: {
		contentSelector: 'div.content',
		wrapperSelector: 'div.content-wrapper'
	},
	
  initialize: function(container, options){
		
		this.container = document.id(container);
		
		this.setOptions(options);
		
		this.wrapper = this.container.getElement(this.options.wrapperSelector);
		this.content = this.wrapper.getElement(this.options.contentSelector);
		
		if (this.wrapper.getSize().y >= this.content.getSize().y) return this;
	
		this.more = new Element('p', {
			'class': 'more',
			'html': '<a>{label} &raquo;</a>'.substitute({ label: Messages.get('MORE') }),
			'events': {
				'mouseenter': this.show.bind(this)
			}
		});
		
		this.content.addEvent('mouseleave', this.hide.bind(this));
		
		this.more.inject(this.container);
		
	},
	
	show: function(){
		this.wrapper.addClass('hover');
	},
	
	hide: function(){
		this.wrapper.removeClass('hover');
	}

});

Shop.User = {};

Shop.User.Menu = {
	
	init: function(){
		
		this.element = document.id('user-menu').hide();
		
		this.trigger = document.id('toolbar').getElement('li.user-info a');
		
		this.offset = 8;
		
		if (!this.trigger) return null;
		
		this.trigger.addEvent('click', function(event){
		  event.stop();
			this.open();
		}.bind(this));
		
		// hold clicks inside container
		this.element.addEvent('click', function(event){ event.stopPropagation(); });

	},
	
	open: function(){
		// element position
		this.position = this.trigger.getPosition('header');
  	this.element.setStyle('left', this.position.x-this.offset).show();
		Observer.register(this.close, this);
	},
	
	close: function(){
		this.element.hide();
	}
	
 };
 
Shop.SendToFriend = {

  validators: {
		'your-email': {required: true, tests: {regexp: /[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/, message: Messages.get('EMAIL_INVALID')}},
		'your-name': {required: true },
		'email': {required: true, tests: {regexp: /[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/, message: Messages.get('EMAIL_INVALID')}},
		'message': {required: true}
	},
	
	init: function(){
		this.container = document.id('send-to-friend');
		
		this.layer = document.id('send-to-friend-layer').inject(document.body);
		
		this.selects = new Array();
		if (IE6){
			this.selects = $$('select');
		}
		
  	this.layerFx = new Fx.Tween(this.layer, { property: 'opacity', link: 'cancel', duration: 200 }).set(0);
				
		this.form = document.id('form-send-to-friend');
		this.prefix = 'form-send-to-friend-';
		
		this.isOpen = false;
		
		this.message = {
			success: this.layer.getElement('p.on-success').hide(),
			failure: this.layer.getElement('p.on-failure').hide()
		};
		
		this.layer.addEvents({
		  'click:relay(a.trigger)': function(event){
				event.preventDefault();
				this.dispatch(event);
			}.bind(this),
		  'mousewheel': function(event){
				event.stopPropagation();
			}
		});
		
		this.container.addEvents({
		  'click:relay(a.trigger)': function(event){
				event.preventDefault();
				this.dispatch(event);
			}.bind(this)
		});
		
		this.spinner = new Spinner(this.form);
		
		this.request = new Request.JSON({
		  url: this.form.get('action'),
			useSpinner: false,
			onRequest: function(){
				this.spinner.show();
			}.bind(this),
			onSuccess: function(){
				this.spinner.hide();
				this.form.hide();
				this.message.success.show();
				this.close(true);
			}.bind(this),
			onFailure: function(){
				this.spinner.hide();
				this.form.hide();
				this.message.failure.show();
				this.close(true);
			}.bind(this)
		});
		
		this.validators = new Hash(this.validators);
		this.validatedItems = new Hash();
		this.validators.each(function(settings, name){
			var field = document.id(this.getID(name));
			if (field) this.validatedItems.set(name, new InputValidator(this.getID(name), settings));
		}, this);
		
		this.form.addEvent('submit', function(event){
		  event.stop();
			if (this.isValid()){
				this.request.send(this.form.toQueryString());
			} else {
				alert(Messages.get('VALIDATION_FAILED'));
			}
		}.bind(this));
			
	},
	
	dispatch: function(event){
		var trigger = document.id(event.target);
		if (trigger.hasClass('open')) this.open();
		if (trigger.hasClass('close')) this.close(false);
	},
	
	open: function(){
		if (this.selects.length) this.selects.setStyle('visibility', 'hidden');
		if (IE6){
			this.layer.setStyles({
			  width: window.getSize().x,
				height: window.getSize().y
			});
		}
		this.layer.show();
		this.message.success.hide();
		this.message.failure.hide();
		this.form.show();
		this.isOpen = true;
		this.layerFx.set(1);
		this.layer.setStyle('height', this.layer.getStyle('height'));
		this.form.getElement('input[type=text]').focus();
	},
	
	close: function(delay){
		if (delay){
			if (this.isOpen){
				this.layerFx.set.delay(3000, this.layerFx, 0);
				this.layer.hide.delay(3200, this.layer);
			}
		} else {
			this.layerFx.set(0).chain(function(){ this.layer.hide(); }.bind(this));
		}
		this.isOpen = false;
		if (this.selects.length) this.selects.setStyle('visibility', 'visible');
		
		// remove errors
		this.validatedItems.each(function(item){
		  item.removeErrors();
		});
	},
	
	isValid: function(){
		var errors = 0;
		this.validatedItems.each(function(item, name){
			item.validate();
			errors += item.getError().length;
		});
		
		return !errors;
	},
	
	getID: function(name){
		return this.prefix + name;
	}
 };

Shop.Menu = {
	
	init: function(){
		
		this.menu = document.id('menu');
		
		this.mainItems = document.search('#menu > li a');
		
		this.mainItems.addClass('top');
		this.preventClose = false;
		
		this.menu.addEvents('click:relay(a.top)',  function(event){ this.render(event); }.bind(this));
		
		this.mainItems.addEvents({
		  'mouseenter': function(event){ this.preventClose = true; this.render(event); }.bind(this),
			'mouseleave': function(){ this.close(); }.bind(this)
		});
		
		this.items = document.search('#menu > li');
		this.items.addEvents({
		  'mouseenter': function(){ this.preventClose = true; }.bind(this),
			'mouseleave': function(){ this.preventClose = false; this.close(); }.bind(this)
		});

	},
	
	render: function(event){
    var link = document.id(event.target);
		var item = link.getParent('li');
		var submenu = item.getElement('div');
		if (!submenu) return;
		
		event.stop();
		Observer.register(this.close, this);
		item.addClass('open');
		
	},
	
	close: function(){
		var openElement = this.menu.getElement('li.open');
		if (openElement && !this.preventClose) openElement.removeClass('open');
	}
	
 };


window.addEvent('domready', function(){

  Observer.init();

  Shop.init();

});

// IE 6 PNG fix
if (IE6){
	DD_belatedPNG.fix('ul.product-list div.img img, div.product-image img');
}

