(function(){
	jQuery.fn.frescaZoom = function(){	
		$("div#mainImageCont").unbind('mousemove');
		$("div#mainImageCont").unbind('hover');
		$("div#zoomCont").unbind('mouseover');
		$("div#zoomCont, div#mouseWindow, img#zoomProductImg, img#mainImageCont, iframe#zoomFrame").remove();
		$(this).wrap("<div id='mainImageCont'></div>");
		$("<div id='zoomCont'></div>").css({"position":"absolute", "top":"-5000px"}).appendTo("div#mainImageCont");
		$("<div id='mouseWindow'></div>").appendTo("div#mainImageCont");
		var imageSrc = $(this).attr('src');
		var splitSrc = imageSrc.split("xlarge");
		var newSrc = splitSrc[0] + 'zoom' + splitSrc[1];
		$("<img id='zoomProductImg'>").attr("src", newSrc).appendTo($("div#zoomCont"));	
		$("<iframe id='zoomFrame' frameBorder='0'></iframe>").css({"display":"block", "width":$("div#zoomCont").width(), "height":$("div#zoomCont").height()}).prependTo($("div#zoomCont"));
		$("img#zoomProductImg").load(function(){
			var imageRatio = parseFloat($("img#zoomProductImg").height()) / parseFloat($("img#mainProductImage").height());
			var maximumX = -(parseFloat($("img#zoomProductImg").width()) - parseFloat($("div#zoomCont").width()));
			var maximumY = -(parseFloat($("img#zoomProductImg").height()) - parseFloat($("div#zoomCont").height()));
			$("div#mouseWindow").css({"height":(parseFloat($("div#zoomCont").height())/imageRatio + 'px'), "width":(parseFloat($("div#zoomCont").width())/imageRatio + 'px')}).hide();			
			$("div#zoomCont").hide().css({"position":"absolute", "top":"0px"});
			$("div#mainImageCont").mousemove(function(e){
				var yPosition = this.offsetTop;
				var xPosition = this.offsetLeft;		
				var parentElement = this.offsetParent;
				while (parentElement != null){
					yPosition += parentElement.offsetTop;
					xPosition += parentElement.offsetLeft;
					parentElement = parentElement.offsetParent;
				}		
				var mouseXPosition = (e.pageX - xPosition - (parseFloat($("div#mouseWindow").width()) / 2));
				var mouseYPosition = (e.pageY - yPosition - (parseFloat($("div#mouseWindow").height()) / 2));		
				var zoomXPosition = -(e.pageX - xPosition - (parseFloat($("div#mouseWindow").width()) / 2)) * imageRatio;
				var zoomYPosition = -(e.pageY - yPosition - (parseFloat($("div#mouseWindow").height()) / 2)) * imageRatio;				
				if(zoomXPosition > 0){
					zoomXPosition = 0;
					mouseXPosition = 0;
				}
				else if(zoomXPosition < maximumX){
					mouseXPosition = -maximumX/imageRatio;				
					zoomXPosition = maximumX;
				}
				if(zoomYPosition > 0){
					mouseYPosition = 0;
					zoomYPosition = 0;
				}
				else if(zoomYPosition < maximumY){
					mouseYPosition = -maximumY/imageRatio;
					zoomYPosition = maximumY;
				}
				$("img#zoomProductImg").css({"top":zoomYPosition, "left":zoomXPosition});
				$("div#mouseWindow").css({"top":mouseYPosition, "left":mouseXPosition, "border":"1px solid #E2E2E2"});
		
			});		
			$("div#mainImageCont").hover(function(e){
				$("div#mouseWindow, iframe#zoomFrame, div#zoomCont").show();
			},function(e){
				$("div#mouseWindow, iframe#zoomFrame").hide();
				$("div#zoomCont").hide();
			});	
			$("div#zoomCont").mouseover(function(){
				$("div#mouseWindow, div#zoomCont").hide();								
			});
		});
	};
})(jQuery);