(function($) {

	$.fn.joeZoom = function(options) {
		
		var imageOpen = false;
		
		/* // ------ @todo ------ 
		$('body').click(function() {
			if(imageOpen) {
				var zoomedImage = $('img.zoom:visible');
				var originalImage = zoomedImage.siblings('img').prevAll('img');
				close_image(originalImage, zoomedImage);
			}
		});
		*/
		
		return this.each(function() {
			
			var anc = $(this),
			img = anc.find('img'),
			nativeWidth,
			nativeHeight,
			zoomImg = anc.find('img.zoom'),
			span = anc.siblings('span');
			
			anc.add(span).click(function(e) {
				
				e.preventDefault();
				e.stopPropagation();
				
				if(zoomImg.is(':animated')) {
					return;
				}
				
				if(zoomImg.is(':visible')) {
				
					close_image(img, zoomImg, span);
				
				} else if($('.product-images a img.zoom:visible').length) {
					close_image(img, zoomImg, span);
				} else if(!zoomImg.length) {
					
					img.after('<img src="#" class="zoom" />');
					img.after('<div class="loading">&nbsp;</div>');
					zoomImg = anc.find('img.zoom');
					zoomImg.attr('src', anc.attr('href'));
					
					var loading = anc.find('.loading');
					loading.fadeTo(200, 0.3);
		
					zoomImg[0].onload = function() {
					
						loading.fadeOut(200, function() {
							$(this).remove();
							img.data('nativeWidth', anc.attr('data-zoomwidth'));
							img.data('nativeHeight', anc.attr('data-zoomheight'));
							zoom_image(img, zoomImg, span);
						});
						
					};
				
				} else {
				
					zoom_image(img, zoomImg, span);
				
				}
	
			});

		
		});
		
				
		function zoom_image(img, zoomImg, span) {
			
			/* $('.product-images a').each(function() {
				close_image($(this).find('img:first'), $(this).find('img.zoom'), $(this).siblings('span'));
			}); */
			
			zoomImg.fadeIn(function() {
				span.fadeOut(100, function() {
					zoomImg.animate({
						width: img.data('nativeWidth'),
						height: img.data('nativeHeight'),
						top: (img.height() / 4) * -1,
						left: (img.width() / 4) * -1
					}, {
						duration: 500,
						easing: 'easeOutExpo',
						complete: function() {
							span.css({
								width: img.data('nativeWidth'),
								height: img.data('nativeHeight'),
								top: (img.height() / 4) * -1,
								left: (img.width() / 4) * -1,
								backgroundImage: "url('../img/close.png')",
								zIndex: 1000
							}).fadeIn(100);
						}
					});
				});
				
			});
			
			imageOpen = true;
		
		}
		
		function close_image(img, zoomImg, span) {
			
			if(zoomImg.length) {
			
				span.fadeOut(100, function() {
					zoomImg.animate({
						width: img.width(),
						height: img.height(),
						top: 0,
						left: 0
					}, {
						duration: 500,
						easing: 'easeOutExpo',
						complete: function() {
							zoomImg.fadeOut();
							span.attr('style', '');
						}
					});
				});
				
				imageOpen = false;
				
			}
			
		}
		
	};
	
})(jQuery);
