(function($){

	EYE.mainMenu = function(){
		var currentItem,
			timer,
			visible = false,
			enter = function(){
				currentItem = this;
				if (visible) {
					clearTimeout(timer);
					show();
				} else {
					timer = setTimeout(show, 120);
				}
			},
			show = function(){
				visible = true;
				$(currentItem)
					.addClass('active')
					.find('>div')
						.show();
			},
			leave = function(){
				clearTimeout(timer);
				timer = setTimeout(clear, 80);
				$(this)
					.removeClass('active')
					.find('>div').hide();
			},
			clear = function(){
				currentItem = null;
				visible = false;
			};
		return {
			init: function(){
				Cufon.replace('#mainMenu a.mainItem, div.homepageBoxWrapper h2 a', {hover: true, fontFamily: "majalla", fontSize: 24, fontWeight: 'bold'});
				Cufon.replace('h1', {fontSize: 36});
				Cufon.replace('#left .box h3, div.loginBox h3', {fontSize: 22});
				$('#mainMenu li.mainItem')
					.bind('mouseenter', enter)
					.bind('mouseleave', leave);
			}
		};
	}();
	EYE.register(EYE.mainMenu.init, 'init');

	EYE.search = function() {
		var focusEv = function() {
			if ($('#searchQuery').val() == $('#searchQuery').attr('rel')) {
				$('#searchQuery').val('');
			}
		};
		var el;
		var blurEv = function() {
				if ($('#searchQuery').val() == '') {
					$('#searchQuery').val($('#searchQuery').attr('rel'));
				}
		};
		return {
			init: function() {
				el = $('#searchQuery')
					.bind({
						'focus': focusEv,
						'blur': blurEv
					});
				blurEv();
			}
		};
	}();
	EYE.register(EYE.search.init, 'init');

	EYE.order = function() {
		var timer,
			visible = false;
		var enter = function() {
			clearTimeout(timer);
			if (visible) {
				show();
			} else {
				timer = setTimeout(show, 120);
			}
		};
		var leave = function() {
			clearTimeout(timer);
			timer = setTimeout(clear, 160);
		};
		var show = function(){
			visible = true;
			$('#orderProductsByOptions').show();
		};
		var clear = function(){
			visible = false;
			$('#orderProductsByOptions').hide();
		};
		return {
			init: function() {
				if (document.getElementById('orderProductsBy')) {
					$('#orderProductsBy a, #orderProductsByOptions')
						.bind('mouseenter', enter)
						.bind('mouseleave', leave);
				}
			}
		};
	}();
	EYE.register(EYE.order.init, 'init');


	EYE.productCombos = function () {
		var el,
			selectedOptions = {},
			anySelected = 0,
			currentCombo = '',
			click = function(ev) {
				var targetEl = $(ev.target).closest('a');
				if (targetEl.is('a')) {
					var dat = targetEl.blur().data('opt');
					var near = targetEl.parent().parent().find('a');
					if (!targetEl.is('.disabled') && near.size()>1) {
						if (dat.disabled != true) {
							var sel = !dat.selected;
						}
						targetEl.parent().parent().find('a').removeClass('selected').each(function(){
							$(this).data('opt').selected = false;
						});
						if ((dat.selected = sel)) {
							targetEl.addClass('selected');
							EYE.product.combos[dat.attr_id].selected = dat.id;
						}
						else {
							EYE.product.combos[dat.attr_id].selected = false;
						}
						highlight();
					} else {
						clear();
						EYE.product.combos[dat.attr_id].selected = dat.id;
						dat.selected = true;
						targetEl.addClass('selected');
						highlight();
					}
					return false;
				}
			},
			highlight = function(){
				$('a', el).addClass('disabled');
				selectedOptions = {};
				anySelected = 0;
				currentCombo = '';
				$.each(EYE.product.combos, function(nr, val){
					if (val.selected) {
						selectedOptions[val.id] = val.selected;
						anySelected ++;
					}
				});
				$.each(EYE.product.combo, function(nr, combo){
					var cnt = 0;
					if (anySelected > 0) {
						$.each(selectedOptions, function(attr, opt){
							if (combo.attributes[attr] && combo.attributes[attr] == opt) {
								cnt++;
							}
						});
						combo.available = (cnt == anySelected && combo.quantity > 0);
					} else {
						combo.available = combo.quantity > 0;
					}
					$.each(combo.attributes, function(attr, opt){
						if (combo.available) {
							$('#A'+attr+'O'+opt).removeClass('disabled');
						}
					});
					if (cnt == combo.size) {
						currentCombo = nr;
					}
				});
				if ($('#productCombo option[value='+currentCombo+']').size() != 1) {
					$('#productCombo').val(0);
					$('#productPrice').text(EYE.product.price);
				} else {
					$('#productCombo').val(currentCombo);
					$('#productPrice').text(EYE.product.combo[currentCombo].price);
				}
			},
			setCombo = function(ev){
				if (ev) {
					$('a', el).removeClass('selected').each(function(){
					 $(this).data('opt').selected = false;
					 });
					 $.each(EYE.product.combos, function(nr, combo){
					 combo.selected = false;
					 });
				}
				clear();
				var sel = $('#productCombo')
				var val = sel.val();
				if (val == 0) {
					if (sel.get(0).length == 2) {
						val = sel.find('option:last').attr('value');
						sel.val(val);
					}
				}
				if (EYE.product.combo[val]) {
					$.each(EYE.product.combo[val].attributes, function (attr, opt){
						EYE.product.combos[attr].selected = opt;
						$('#A'+attr+'O'+opt).addClass('selected').data('opt').selected = true;
					});
				}
				highlight();
			},
			submit = function(){
				if (!currentCombo || $('#productCombo option[value='+currentCombo+']').size() != 1) {
					$('#productError')
						.find('em').remove().end()
						.append('<em>'+EYE.product.error+'</em>');
					return false;
				}

				if(pageTracker){
					pageTracker._trackEvent(
						'Add to cart',
						$('h1').text(),
						currentCombo,
						$('#productQuantity').val()
					);
				}
				return true;
			},
			clear = function (){
				var lnks = $('a', el).removeClass('selected');
				var cnt = 0;
				$.each(EYE.product.combos, function(nr, attr){
					var cnt2 = 0, lastOpt;
					$.each(attr.options, function(nr2, opt){
						lnks.eq(cnt).data('opt', $.extend({
							attr_id: attr.id,
							selected: false,
							disabled: false,
							order: nr
						}, opt));
						cnt++;
						cnt2++;
						lastOpt = opt;
					});
					if (cnt2 == 1) {
						lnks.eq(cnt - 1).addClass('selected').data('opt').selected = true;
						attr.selected = lastOpt.id;
					} else {
						attr.selected = false;
					}
				});
			},
			mouseEnter = function(){
			},
			mouseLeave = function(){
			};
		return {
			init: function(){
				if ((el = document.getElementById('productFormCombos'))) {
					$('#productForm').bind('submit', submit);
					setCombo();
					$('#productCombo').bind('change', setCombo);
					$(el).bind('click', click);
					//$('a', el).bind('mouseenter',mouseEnter).bind('mouseleave', mouseLeave);
				}
			}
		};
	}();
	EYE.register(EYE.productCombos.init, 'init');

	EYE.productImages = function() {
		var	original,
			thumbPath = '/images/eshop/products/orig/',
			imagePath = '/images/eshop/products/max/',
			total,
			current = 0,
			preloading = false,
			inzoom = false,
			srcImage = false,
			perSlide = 11;
		var enter = function() {
			var img = $(this).attr('rel');
			$('#productImages a:first')
				.attr('href', imagePath + img)
				.find('img:first')
					.attr('src',thumbPath + img);

		};
		var leave = function() {
			$('#productImages a:first')
				.attr('href', imagePath + EYE.productImages.currentImage)
				.find('img:first')
					.attr('src',thumbPath + EYE.productImages.currentImage);
		};
		var click = function() {
			current = Math.max(0, Math.min(total, current + (this.id == 'productGalleryLeft' ? -perSlide : perSlide)));
			$('#productGallery')
				.stop()
				.animate({
					left: - current * 80
				}, 500);
			this.blur();
			return false;
		};
		var zoomEnter = function() {
			if (!preloading && !inzoom) {
				$('#productZoom').stop().animate({opacity: 0.7}, 400);
			}
		};
		var zoomLeave = function() {
			if (!preloading && !inzoom) {
				$('#productZoom').stop().animate({opacity: 0}, 400);
			}
		};
		var selectImg = function() {
			$('#productGallery a').removeClass('current');
			EYE.productImages.currentImage = $(this).blur().addClass('current').attr('rel');
			$('#productImages a:first')
				.attr('href', imagePath + EYE.productImages.currentImage)
				.find('img:first')
					.attr('src',thumbPath + EYE.productImages.currentImage);
			return false;
		};
		var initPage,zoomScale, viewEl, srcPos, viewPort, viewSize, viewMax ;
		var initZoom = function(ev) {
			this.blur();
			if (inzoom == true) {
				return false;
			}
			zoomLeave();
			initPage = {
				left: ev.pageX,
				top: ev.pageY
			}
			srcImage = new Image();
			$(srcImage).bind('load', finishLoadZoom);
			preloading = true;
			srcImage.src = $(this).attr('href');
			if (srcImage.complete && inzoom === false) {
				$(srcImage).unbind('load', finishLoadZoom);
				finishLoadZoom();
			}
			return false;
		};
		var finishLoadZoom = function() {
			inzoom = true;
			preloading = false;
			viewEl = $('#productImageZoom').css({
				height: Math.max(500, document.getElementById('productInfo').offsetHeight),
				display: 'block',
				opacity: 0
			}).animate({opacity: 1}, 400).append('<img src="'+srcImage.src+'" />');
			zoomScale = $('#productMainImage>img')[0].width/srcImage.width;
			srcPos = $('#productMainImage').append('<span id="productZoomView" />').bind('mouseleave', hideZoom).offset();
			viewSize = {
				width: (viewEl.width() * zoomScale),
				height: (viewEl.height() * zoomScale)
			};
			viewPort = $('#productZoomView').css({
				width: viewSize.width,
				height: viewSize.height,
				opacity: 0
			}).animate({opacity: 0.3}, 400);
			viewMax = {
				left: 450 - viewSize.width,
				top: 450 - viewSize.height
			};
			viewSize.width = viewSize.width/2;
			viewSize.height = viewSize.height/2;
			viewEl = viewEl.find('img');
			$(document).bind('mousemove', zoomMove);
			zoomPosition(initPage.left-srcPos.left, initPage.top-srcPos.top);
		};
		var hideZoom = function() {
			inzoom = false;
			$('#productMainImage').unbind('mouseleave', hideZoom);
			$(document).unbind('mousemove', zoomMove);
			viewPort = false;
			$('#productZoomView').add(viewEl).animate(
				{opacity:0},
				400, function(){
					$(this).remove();
					$('#productImageZoom').hide();
				}
			);
			viewEl = false;
			srcImage = false;
		};
		var zoomMove = function(ev) {
			zoomPosition(ev.pageX - srcPos.left, ev.pageY - srcPos.top);
		};
		var zoomPosition = function(left, top) {
			left = Math.max(0, Math.min(left - viewSize.width, viewMax.left));
			top = Math.max(0, Math.min(top - viewSize.height, viewMax.top));
			viewPort[0].style.left = left+'px';
			viewPort[0].style.top = top+'px';
			viewEl[0].style.left = -left/zoomScale+'px';
			viewEl[0].style.top = -top/zoomScale+'px';
		}
		return {
			init: function() {
				if (document.getElementById('productGallery')) {
					EYE.productImages.currentImage = EYE.product.image;
					total = $('#productGallery a')
								.bind('mouseenter', enter)
								.bind('mouseleave', leave)
								.bind('click', selectImg)
								.filter(':first').addClass('current').end()
								.size();
					if (total > perSlide) {
						$('#productGalleryLeft, #productGalleryRight')
							.show().bind('click', click);
						total -= perSlide;
					}
				}
				$('#productMainImage')
					.bind('mouseleave', zoomLeave)
					.bind('mouseenter', zoomEnter)
					.bind('click', initZoom);
			},
			currentImage: false
		};
	}();
	EYE.register(EYE.productImages.init, 'init');

	EYE.general = function() {
		var accntForm;
		if ((accntForm = document.getElementById('accountForm'))) {
			var swicthAccount = function(ev){
				var el = $(this);
				el
					.parent()
					.parent()
						.find('input, select')
							.not(el)
							.attr('disabled', el.attr('checked'));
			};
			swicthAccount.apply($('input[name=use_contact_info]', accntForm)
				.bind('click', swicthAccount).get(0));
		}

	};
	EYE.register(EYE.general, 'init');

	EYE.checkout = function(){
		var el,
			asCompany = function(ev){
				if ($(this).attr('checked')) {
					$('p.asCompany', el).show();
					$('p.asPerson', el).hide();
				} else {
					$('p.asCompany', el).hide();
					$('p.asPerson', el).show();
				}
			},
			useBilling = function(){
				$(this).parent().parent().find('input, select').not(this).attr('disabled', $(this).attr('checked'));
				changeEv();
			},
			changeEv = function() {
				 if ($('#use_billing').attr('checked')) {
					 $('#checkoutInfo fieldset:first input').each(function(){
						 var targetEl = $('#checkoutInfo fieldset:eq(1) input[name=shipping_' + $(this).attr('name')+']');
						 if (targetEl.size() == 1) {
							 targetEl.val(this.value);
						 }
					 });
				 }
			};
		return {
			init: function(){
				if ((el = document.getElementById('checkoutInfo'))) {
					asCompany.apply($('#as_company').bind('click', asCompany).get(0));
					useBilling.apply($('#use_billing').bind('click', useBilling).get(0));
					$('#checkoutInfo fieldset:eq(0) input').bind('change', changeEv);
				}
			}
		};
	}();
	EYE.register(EYE.checkout.init, 'init');

	EYE.productInfo = function() {
		var click = function() {
			if ($(this).parent().attr('id') == 'productMoreInfo') {
				$('#productForm, #productFormCombos, #productMoreInfo').addClass('hidden');
				$('#requestInfo').removeClass('hidden');
			} else {
				$('#productForm, #productFormCombos, #productMoreInfo').removeClass('hidden');
				$('#requestInfo').addClass('hidden');
			}
			return false;
		};
		return {
			init: function() {
				if (document.getElementById('productMoreInfo')) {
					$('#productMoreInfo a, #productBackCart a')
						.bind('click', click);
				}
			}
		};
	}();
	EYE.register(EYE.productInfo.init, 'init');

	EYE.overlay = function(){
		var currentBind = false;
		var resizeEv = function() {
			$('#overlay').css({
				width: $(document).width(),
				height: $(document).height()
			});
		};
		return {
			show: function() {
				$('#overlay').css({
					width: $(document).width(),
					height: $(document).height(),
					display: 'block'
				});
				$(window).bind('resize', resizeEv);
			},
			hide: function() {
				$('#overlay').hide();
				if (currentBind) {
					$('#overlay').unbind(currentBind);
					currentBind = false;
				}
				$(window).unbind('resize', resizeEv);
			},
			bind: function(type, fnc) {
				currentBind = type;
				$('#overlay').bind(type, fnc);
			}
		};
	}();

	EYE.window = function() {
		var close = function() {
			$('#window').hide();
			EYE.overlay.hide();
			return false;
		};
		var resizeEv = function() {
			$('#windowContent').css('height', Math.max($(window).height() - 180, 300));
		};
		return {
			init: function() {
				$('#windowHeader a').bind('click', close);
			},
			show: function(title, content) {
				$('#windowHeader span').text(title);
				$('#windowContent').html(content);
				resizeEv();
				EYE.overlay.show();
				EYE.overlay.bind('click', close);
				$('#window').show();
				$(window).bind('resize', resizeEv);
			}
		}
	}();
	EYE.register(EYE.window.init, 'init');

	EYE.productExtra = function() {
		var clickEv = function(ev) {
			var targetEl = $(ev.target).closest('a');
			if (targetEl.size() == 1) {
				EYE.window.show(targetEl.text(), $('#'+targetEl.attr('rel')).html());
				return false;
			}
		};
		return {
			init: function() {
				if (document.getElementById('productExtra')) {
					$('#productExtra').bind('click', clickEv);
				}
			}
		};
	}();
	EYE.register(EYE.productExtra.init, 'init');

	EYE.cart = function(){
		var clickEv = function(ev) {
			var targetEl = $(ev.target).closest('a');
			if (targetEl.size() == 1) {
				if (targetEl.is('.changeModel')) {
					targetEl.hide().parent()
						.find('ul').hide().end()
						.find('select, a.changeModelBack').show();
					return false;
				} else if (targetEl.is('.changeModelBack')) {
					targetEl.hide().parent()
						.find('select').hide().end()
						.find('ul, a.changeModel').show();
					return false;
				} else if (targetEl.is('.cartDelete')) {
					$('#cartForm tbody:first input:checkbox').attr('checked', false);
					targetEl.closest('tr').find('input:checkbox').attr('checked', true);
					$('#cartForm tfoot:first button:first').trigger('click');
					return false;
				}
			}
		};
		var submitEv = function(){
			if (pageTracker) {
				pageTracker._trackEvent(
					'Checkout'
				);
			}
		};
		return {
			init: function() {
				$('#cartForm tbody:first').bind('click', clickEv);
				$('#cartForm').bind('submit', submitEv);
			}
		};
	}();
	EYE.register(EYE.cart.init, 'init');

})(jQuery);
