(function($,p){
	var max_selection_opacity = 1.0;
	var fade_animation_speed = 200,
		
	ZOOMLEVEL_OUT = 0, ZOOMLEVEL_IN = 1,
	ANIMATE_UP = 0, ANIMATE_DOWN = 1;
	
	var Image_viewer = {
		detached: true,
		minimum_detached_margin: 10,
		scdown: 0,
		scup: 0,
		
		small_width: undefined,
		small_height: undefined,
		
		large_width: 786,
		large_height: 735,
		
		trackSlide : 0,
		
		zoom_level: ZOOMLEVEL_OUT,
		
		update: function(){
			$('#image-viewer-wrapper').removeClass('transparent_class');
			$('#image-viewer-wrapper').show();
			$('#image-selector').scrollTop(0);
			if($('#image-selector')[0].scrollHeight <= 370){
				$('#image-viewer-up-arrow img').hide();
				$('#image-viewer-down-arrow img').hide();
			}
			Image_viewer.showZoom($('#thumbnail_0').get(0));
			$('#image-viewer-wrapper').hide();
			Image_viewer.update_viewer_position();
			
			// Window must be bound (even after init) because it has to be unbound during Image_viewer.hide()
			$(window).bind('resize scroll', Image_viewer.update_viewer_position);
			$('#image-viewer-wrapper').fadeIn();
		},
		showZoom: function(e){
			
			// Hide the zoom in control if no zoom image is available
			if($(e).attr('660') == undefined){
				$('.zoom-container').fadeOut();
			}else{
				if($('.zoom-container').css('display') != 'none')
				{
					$('.zoom-container').css('display', 'block');
				}else{
					$('.zoom-container').fadeIn();
				}
			}
			
			if($(e).attr('330') != null || $(e).attr('330') != 'undefined'){
				if(Image_viewer.zoom_level == ZOOMLEVEL_IN){
					Image_viewer.zoom($('#zoom-image')[0]);
					$('#zoom-image').load(function(){
						$('#zoom-image').attr('src', $(e).attr('330'));
						$('#zoom-image').attr('title', $(e).attr('title'));
						$('#zoom-image').attr('alt', $(e).attr('title'));
						$('#zoom-image').attr('referring_element', e.identify());
						$('#zoom-title').html($(e).attr('title'));
						$(Image_viewer).unbind('load');
					});
				}else{
					$('#zoom-image').attr('src', $(e).attr('330'));
					$('#zoom-image').attr('title', $(e).attr('title'));
					$('#zoom-image').attr('alt', $(e).attr('title'));
					$('#zoom-image').attr('referring_element', e.identify());
					$('#zoom-title').html($(e).attr('title'));
				}
			}
		},
		zoom: function(e){
			var element_refer = $(e).attr('referring_element');
			
			// Do not zoom in if there is no zoom image available
			
			if($('#'+element_refer).attr('660') != undefined){
				Image_viewer.detached = false;
				if(e.src != $('#'+element_refer).attr('660')){
					$('#image-display').fadeOut(function(){
						
						$('.zoom-out').css('display', 'block');
						$('.zoom-in').css('display', 'none');
						
						$(e).addClass('large').attr('src',$('#'+element_refer).attr('660')).load(function(){
							$(e).css('cursor', '-moz-zoom-out');
							var fade_in_element = $("#image-display"),
								viewer_height = $('#image-viewer-wrapper').height(),
								page_y = $(window).scrollTop(),
								window_height = $(window).height(),
								window_left = $('#image-viewer-wrapper').position().left - ((Image_viewer.large_width - Image_viewer.small_width) / 2),
								window_top = $('#image-viewer-wrapper').position().top -((Image_viewer.large_height - Image_viewer.small_height) / 2),
								animate_to = {
									'width': Image_viewer.large_width,
									'height': Image_viewer.large_height
								},
								animate_selector = {'height': Image_viewer.large_height-50};
							
							if (window_top < page_y + Image_viewer.minimum_detached_margin){
								window_top = page_y + Image_viewer.minimum_detached_margin;
							}
							
							
							if (Image_viewer.detached == true){
								animate_to['left'] = window_left;
								animate_to['top'] = window_top;
							}
							
							$('#image-viewer-wrapper').stop().animate(
								animate_to,
								function(){
									$(fade_in_element).fadeIn();
									$('#image-selector').scrollTop(0);
									$('#image-selector').animate(animate_selector);
								}
							);
							Image_viewer.zoom_level = ZOOMLEVEL_IN;
							$(e).unbind('load');
						});
					});
				}else{
					if ($('.zoom-out').css('display') == 'none') return false;
					
					$('#image-display').fadeOut(function(){
						
						$('.zoom-out').css('display', 'none');
						$('.zoom-in').css('display', 'block');
						
						$(e).removeClass('large').attr('src', $('#'+element_refer).attr('330')).load(function()
						{
							$(e).css('cursor', '-moz-zoom-in');
							
							var fade_in_element = $('#image-display'),
								animate_to = {
									'width': Image_viewer.small_width,
									'height': Image_viewer.small_height
								};
							
							if (Image_viewer.detached == true){
								animate_to['left'] = $('#image-viewer-wrapper').position().left + ((Image_viewer.large_width - Image_viewer.small_width) / 2);
								animate_to['top'] = $('#image-viewer-wrapper').position().top + ((Image_viewer.large_height - Image_viewer.small_height) / 2);
							}
							$('#image-viewer-wrapper').stop().animate(
								animate_to,
								function(){
									$(fade_in_element).fadeIn();
									$('#image-selector').css('height', Image_viewer.small_height-50+'px');
								}
							);
							Image_viewer.zoom_level = ZOOMLEVEL_OUT;
							$(e).unbind('load');
						});
					});
				}
				Image_viewer.detached = true;
			}else return false;
		},
		
		// Leave cursor as default if no zoom image is available
		check_for_zoom: function(e){
			var referring = $('#zoom-image').attr('referring_element'),
				element = $('#'+referring),
				event = e.originalEvent.type;
			
			if(event == 'mouseover'){
				if($(element).attr('660') == undefined){
					$('#zoom-image').css('cursor', 'default');
				}
			}else if(event == 'mouseout'){
				if($(element).attr('660') == undefined)
				{
					$('#zoom-image').css('cursor', '-moz-zoom-in');
				}
			}
			
		},
		scroll_down: function(){
			$('#image-viewer-up-arrow img').addClass('fifty');
			$('#image-viewer-up-arrow img').removeClass('ten');
			Image_viewer.scdown = setInterval('Image_viewer.scroll_down_hold(2)', 10);
		},
		
		scroll_down_hold: function(m){
			var scrollElementDown = $('#image-selector');
			$(scrollElementDown).scrollTop($(scrollElementDown).scrollTop()+m); 
			if($(scrollElementDown).scrollTop() >= $(scrollElementDown).get(0).scrollHeight-$(scrollElementDown).height())
			{
				$(scrollElementDown).scrollTop($(scrollElementDown).get(0).scrollHeight-$(scrollElementDown).height());
				$('#image-viewer-down-arrow img').addClass('ten');
				$('#image-viewer-down-arrow img').removeClass('fifty');
				Image_viewer.scroll_down_stop();
			}
		},
		scroll_down_stop: function(){
			clearInterval(Image_viewer.scdown);
		},
		
		scroll_up: function(){
			$('#image-viewer-down-arrow img').addClass('fifty');
			$('#image-viewer-down-arrow img').removeClass('ten');
			Image_viewer.scup = setInterval("Image_viewer.scroll_up_hold(2)", 10);
		},
		
		scroll_up_hold: function(m){
			var scrollElementUp = $('#image-selector');
			$(scrollElementUp).scrollTop($(scrollElementUp).scrollTop()-m);
			if($(scrollElementUp).scrollTop()<= 0){
				$(scrollElementUp).scrollTop(0);
				$('#image-viewer-up-arrow img').addClass('ten');
				$('#image-viewer-up-arrow img').removeClass('fifty');
				Image_viewer.scroll_up_stop();
			}
		},
		
		scroll_up_stop: function(){
			clearInterval(Image_viewer.scup);
		},
		
		// For changing the link text underneath the product image. Emily wants it to say something different for 
		// every possible scenario that could creep up. This function accomplishes just that.
		change_link: function(){
			var imageCount = 0,
				link 		= $('#image-viewer-enable'), // the link used to display the zoom image viewer
				original 	= $('#thumbnail_0'); // ID of the first image in the "zoom image viewer" -- image selector box
			
			$('.zoom-image-thumbs').each(function(){
				++imageCount;
				
				if(imageCount > 1){
					if(typeof $(original).attr('660') == 'undefined'){
						if(typeof $(this).attr('660') != 'undefined'){
							$(link).html('view more');
							return;
						}
					}
					else if(typeof $(original).attr('660') != 'undefined'){
						if($(original).attr('isDefault')){
							$(link).html('view larger &amp; more');
							return;
						}
						else {
							$(link).html('view more &amp; larger');
							return;
						}
					}
				} 
			});
			
			if (imageCount == 1 && typeof $(original).attr('660') != 'undefined'){
				if($(original).attr('isDefault')){
					$(link).html('view larger');
				}
				else {
					$(link).html('view more &amp; larger');
				}
			}
		},
		
		hide: function(){
			// Must unbind the window to keep it from firing the update_viewer_position during the fade out.
			// If it is not unbound then the opacity will be frozen at the current fadeOut level upon scrolling
			// during the fadeOut animation
			$(window).unbind('resize scroll', Image_viewer.update_viewer_position);
			
			$('#image-viewer-wrapper').stop(true).fadeOut();
			if(Image_viewer.zoom_level == ZOOMLEVEL_IN)
			{
				Image_viewer.zoom($('#zoom-image').get(0));
			}
		},
		
		update_viewer_position: function(e){
			if(Image_viewer.detached !== true) return false;
			
			var viewer_height = $('#image-viewer-wrapper').height(),
				viewer_width = $('#image-viewer-wrapper').width(),
				page_y = $(window).scrollTop(),
				page_x = $(window).scrollLeft(),
				window_width = $(window).width(),
				window_height = $(window).height(),
				window_top = (page_y -10) + ((window_height / 2) - (viewer_height/2)),
				window_left = page_x + ((window_width / 2) - (viewer_width/2));
			if(window_top < page_y + Image_viewer.minimum_detached_margin){
				window_top = page_y + Image_viewer.minimum_detached_margin;
			}
			
			
			$('#image-viewer-wrapper').css('left', window_left+'px');
			
			// Set timer that will move the wrapper div to the target position (as set)
			if($('#image-viewer-wrapper').css('display') != 'none')
				setTimeout(function(){Image_viewer.slider_set();}, 100);
			else {
				viewer_height = $('#image-viewer-wrapper').height()
				$('#image-viewer-wrapper').css('top', page_y + ((window_height - viewer_height) /2)+'px');
			}
		},
		
		slider_set : function(){
			if(Image_viewer.trackSlide == 0) {
				Image_viewer.trackSlide = setInterval(function(){Image_viewer.slider();}, 50);
			}
		},
		
		// Custom animation function for moving the image wrapper div when scrolling or resizing
		slider : function(){
			var page_y = $(window).scrollTop(),
				move_element = $('#image-viewer-wrapper')[0],
				movement_speed = 45,
				viewer_top = $(move_element).position().top,
				viewer_height = $(move_element).height();
				window_height = $(window).height(),
				target_pos = page_y + ((window_height - viewer_height) /2);
				
				if(viewer_top != target_pos){
					if(viewer_top+movement_speed < target_pos){
						$(move_element).css('top', (viewer_top+movement_speed)+'px');
					}
					else if(viewer_top-movement_speed > target_pos){
						$(move_element).css('top', (viewer_top-movement_speed)+'px');
					}
					else {
						$(move_element).css('top', target_pos+'px');
					}
				}
				else if (viewer_top == target_pos){
					window.clearInterval(Image_viewer.trackSlide);
					Image_viewer.trackSlide = 0;
				}
			
		},
		
		init: function(e){
			$('#image-viewer-wrapper').addClass('transparent_class');
			if(typeof $('#image-viewer-enable').get(0) == 'undefined'){
				$('#product-image-zoomer').css('cursor', 'default');
			}
			// hide the image viewer wrapper and remove the transparent_class from it
			$('#image-viewer-wrapper').hide();
			Image_viewer.small_width = $('#image-viewer-wrapper').width();
			Image_viewer.small_height = $('#image-viewer-wrapper').height();
			$('#image-selector').css('height', Image_viewer.small_height-50+'px')
			$('#zoom-image').bind('mouseover mouseout', Image_viewer.check_for_zoom)
			$('#image-viewer-down-arrow').bind('mousedown', Image_viewer.scroll_down).bind('mouseup', Image_viewer.scroll_down_stop);
			$('#image-viewer-up-arrow').bind('mousedown', Image_viewer.scroll_up).bind('mouseup', Image_viewer.scroll_up_stop);
			
			if (typeof $('#image-viewer-wrapper').get(0) != 'undefined'){
				Image_viewer.update_viewer_position();
				$(window).bind('resize scroll', Image_viewer.update_viewer_position);
			}
			Image_viewer.change_link(); // change the enabling link to match the circumstance of images available for zooming (Emily's request)
		}
	};
	
	window.Image_viewer = window.Image_viewer || Image_viewer;
	$(document).ready(Image_viewer.init);
})(jQuery,$);
