//**************************************************************
// jQZoom allows you to realize a small magnifier window,close
// to the image or images on your web page easily.
//
// jqZoom version 2.2
// Author Doc. Ing. Renzi Marco(www.mind-projects.it)
// First Release on Dec 05 2007
// i'm looking for a job,pick me up!!!
// mail: renzi.mrc@gmail.com
//**************************************************************

(function($){

	$.fn.jqueryzoom = function(options)
	{
		var settings = {
				xzoom: 200,		//zoomed width default width
				yzoom: 200,		//zoomed div default width
				offset: 10,		//zoomed div default offset
				top_offset: 0,
				position: "right" ,//zoomed div default position,offset position is to the right of the image
				lens:1, //zooming lens over the image,by default is 1;
				preload: 1,
				jqimg_attr: 'longdesc', //usually uses a 'jqimg' attr, not valid html
				track: false,	// false, smooth, or delay (buggy)
				trackThreshold: 150 // #px offset for delay tracking jump
 			};

		if(options) {
			$.extend(settings, options);
		}
		
		//window.animateZoomDiv = false;

	    var noalt = '';

	    this.hoverIntent(function()
	    {
		    var $this = jQuery(this);
	    	var zoomdiv = jQuery('div.zoomdiv');
	    
		    var imageLeft = $this.offset().left;                
		    var imageTop = $this.offset().top + 1; // account for 1px border on zoomdiv
		    
		    var image = jQuery('img', $this);
		    
		    // if this image is in the middle of a transition, don't show zoomdiv
		    if (image.css('opacity') < .2)
				return;
               
		    var imageWidth = image.get(0).offsetWidth;
		    var imageHeight = image.get(0).offsetHeight;
			
            noalt = image.attr("alt");
			
		    var bigimage = image.attr(settings.jqimg_attr);
			
            image.attr("alt",'');
			
			// if no zoomdiv, means new mouseover, create zoomdiv and zoombubble
		    if( zoomdiv.length == 0)
		    {
			    $this.after("<div class='zoomdiv'><img class='bigimg' src='" + bigimage + "' /></div>")
					.append("<div class='jqZoomBubble'>&nbsp;</div>");
			    
			    zoomdiv = jQuery('div.zoomdiv');
		    }
		    
			// set up initial coordinates based on settings
		    if( settings.position == "right" )
		    {
		    	var rightedge = imageLeft + imageWidth + settings.offset + settings.xzoom;
		    	
	            if ( rightedge > screen.width )
	            	leftpos = imageLeft  - settings.offset - settings.xzoom;
	            else
					leftpos = imageLeft + imageWidth + settings.offset;
		    }
		    else
		    {
			    var leftpos = imageLeft - settings.xzoom - settings.offset;
			    
			    if ( leftpos < 0 )
	            	leftpos = imageLeft + imageWidth  + settings.offset;

		    }

			// style zoomdiv
		    zoomdiv.css({ 
		    	top: imageTop + settings.top_offset
		    ,	left: leftpos 
			,	width:settings.xzoom
			,	height:settings.yzoom
			}).show();
			
            if( ! settings.lens ){
				$this.css('cursor','crosshair');
			}
			
			$(document.body).mousemove(
			function(e)
			{
				var mouse = new MouseEvent(e);
				var bigimg = jQuery('.bigimg');
				var zoomBubble = jQuery('div.jqZoomBubble');
				var zoomdiv = jQuery('div.zoomdiv');

				var bigwidth = bigimg.get(0).offsetWidth;
				var bigheight = bigimg.get(0).offsetHeight;
				
				var scaley = (bigwidth/imageWidth);
				var scalex = (bigheight/imageHeight);
				
				// in ff, bigimg gives wrong size intially, scale becomes infitesmal, zoomBubble becomes large
				if (scalex < 1) scalex = 2;
				if (scaley < 1) scaley = 2;
				
				var zoomWidth = (settings.xzoom)/scalex;
				var hzoomWidth = zoomWidth/2;
				
				var zoomHeight = (settings.yzoom)/scaley;
				var hzoomHeight = zoomHeight/2;
				
				// get vertical scroll offset
				var vpYOffset = window.pageYOffset;
				var zoomTop = zoomdiv.css('top');
				
				// set size of zoom lens based on img to zoomimg size ratio
				zoomBubble.width(zoomWidth).height(zoomHeight);

				// show lens
				if(settings.lens && ! zoomBubble.is(':visible'))
					zoomBubble.css('visibility','visible');
				
				xpos = mouse.x - hzoomWidth - imageLeft;
				ypos = mouse.y - hzoomHeight - imageTop;
				
				// calculate new lens position
				if( settings.lens )
				{
					if (mouse.x - hzoomWidth < imageLeft ) 
						xpos = 0;
					else if (mouse.x + hzoomWidth > imageWidth + imageLeft )
						xpos = (imageWidth - zoomWidth - 2);
						
					if (mouse.y - hzoomHeight < imageTop )
						ypos = 0;
					else if (mouse.y + hzoomHeight  > imageHeight + imageTop ) 
						ypos = (imageHeight - zoomHeight - 2);
								
					zoomBubble.css({ top: ypos,left: xpos });
				}
					
				// calculate new zoomdiv position
				if ( settings.track == 'smooth' )
				{
					if (ypos > 0)
						newTop = ypos - zoomBubble.height()/2 + imageTop;
					else newTop = imageTop;
					
					// check boundaries
					// don't move edges of zoomdiv above or below main image
					if (newTop < imageTop) 
						newTop = imageTop;
					else if ((newTop + zoomdiv.height()) > (imageTop + imageHeight))
						newTop = imageTop + imageHeight - zoomdiv.height();
					
					zoomdiv.css({ top: newTop });
				}
				else
				{
					//TODO: refactor zoomdiv placement to have a 'boundary' fn, pass heights and offsets and get new ones returned DRY!
					// check if top of zoomdiv is above top of viewport
					var defOffset = imageTop + parseInt(settings.top_offset);
					
					newTop = defOffset;
					
					if (vpYOffset + 10 > defOffset)
						newTop = vpYOffset + 10;
					// don't move edges of zoomdiv above or below main image
					else if (newTop <= defOffset)
						newTop = defOffset;
					else if ((newTop + zoomdiv.height()) > (imageTop + imageHeight))
						newTop = imageTop + imageHeight - zoomdiv.height();
					
					zoomdiv.css({ top: newTop });
				}
				
				var scrollTop = ypos * scaley;
				zoomdiv.get(0).scrollTop = scrollTop;

				var scrollLeft = xpos * scalex;
				zoomdiv.get(0).scrollLeft = scrollLeft;

  			});
			    
	    },
	    function() // offHover
	    {
			jQuery('img', jQuery(this)).attr("alt",noalt);
			
			$(document.body).unbind("mousemove");

			if(settings.lens){
				jQuery('div.jqZoomBubble').remove();
			}
			
			jQuery('div.zoomdiv').remove();
	    });

		count = 0;

		if( settings.preload )
		{
			$('body').append("<div style='display:none;' class='jqPreload" + count + "'>&nbsp;</div>");

			this.each(function()
			{
				var imagetopreload= jQuery('img', jQuery(this)).attr(settings.jqimg_attr);

				var content = jQuery('div.jqPreload' + count).html();
				
				var newHtml = content + '<img src="' + imagetopreload + '" />';
				jQuery('div.jqPreload'+count+'').html(newHtml);
			});

		}

	} // end fn.jqueryzoom()
		
})(jQuery);

function MouseEvent(e) {
	this.x = e.pageX;
	this.y = e.pageY;
}



