$(function(){ var view = $( "#view" ); var image = $( "#social-image-id" ); var size = HHJsLib.getImageSize("http://localhost:8080/xyrj-socail/public/resource/images/1359876033390RSMAF92WIU.jpg"); // Create the ZOOM element - this will be added with // Javascript since it's more of an "effect". var zoom = $( "<a id='zoom'><span><br /></span></a>" ); // Before we start messing with the scripts, let's // update the display to allow for the absolute // positioning of the image and zoomer. // Set an explicit height / width on the view based // on the initial size of the image. view.width( image.width() ); view.height( image.height() ); // Now that the view has an explicit width and height, // we can change the displays for positioning. image.css( "position", "absolute" ); // Set an exlicit height on the image (to make sure // that some of the later calcualtions don't get // messed up - I saw some irradic caculated-height // behavior). image.height( image.height() ); // Before we add the zoom square, we need it to match // the aspect ratio of the image. zoom.width( Math.floor( image.width() / 2 ) ); zoom.height( Math.floor( image.height() / 2 ) ); // Now, add the zoom square to the view. view.append( zoom ); // ---------------------------------------------- // // ---------------------------------------------- // // Now that we have our UI set up physically, we need // to bind the event handlers. // We want to show and hide the zoom only when the // user hovers over the view. view.hover( function( event ){ // Show the soom. zoom.show(); }, function( event ){ // Hide the zoom. zoom.hide(); } ); // As the user mouses over the view, we can get the // mouse coordinates in terms of the page; we need // to be able to translate those into VIEW-based // X and Y cooridates. As such, let's get the offset // of the view as our base 0x0 coordinate. // // NOTE: We are doing this here so that we do it once, // rather than every time the mouse moves. viewOffset = view.offset(); // Get the jQuery-ed version of the window as we will // need to access it's scroll offsets every time the // mouse moves over the div. // // NOTE: This will change the change the refernce to // "window" for all of the code in this closure. var window = $( window ); // As the user moves across the view, we want to move // the zoom square with them. view.mousemove( function( event ){ // Get the window scroll top; the mouse // position is relative to the window, NOT // the document. var windowScrollTop = window.scrollTop(); var windowScrollLeft = window.scrollLeft(); // Translate the mouse X / Y into view-local // coordinates that can be used to position // the zoom box. setZoomPosition( Math.floor( event.clientX - viewOffset.left + windowScrollLeft ), Math.floor( event.clientY - viewOffset.top + windowScrollTop ) ); } ); // I position the zoom box within the view based on // the given view-local mouse coordinates. var setZoomPosition = function( mouseLeft, mouseTop ){ // Ideally, we want to keep the zoom box centered // on the mouse. As such, we want the given mouse // left and mouse top coordiantes to be in the // middle of the zoom box. var zoomLeft = (mouseLeft - (zoom.width() / 2)); var zoomTop = (mouseTop - (zoom.height() / 2)) // As we move the zoom box around, however, we // never want it to go out of bounds of the view. // Protect the top-left bounds. zoomLeft = Math.max( zoomLeft, 0 ); zoomTop = Math.max( zoomTop, 0 ); // Protect the bottom-right bounds. Because the // bottom and right need to take the dimensions // of the zoom box into account, be sure to use // the outer width to include the border. zoomLeft = Math.min( zoomLeft, (view.width() - zoom.outerWidth()) ); zoomTop = Math.min( zoomTop, (view.height() - zoom.outerHeight()) ); // Position the zoom box in the bounds of the // image view box. zoom.css({ left: (zoomLeft + "px"), top: (zoomTop + "px") }); }; // Now that we have the mouse movements being tracked // properly, we need to track the click on the zoom to // zoom in the image on demand. To do that, however, // we need to start storing some information with the // image so we can manipulate it as needed. image.data({ zoomFactor: (view.width() / zoom.width()), zoom: 1, top: 0, left: 0, image.width(), height: image.height(), originalWidth: image.width(), originalHeight: image.height() }); // Now, let's attach the click event handler to the // zoom box. zoom.click( function( event ){ // First, prevent the default since this is // not a navigational link. event.preventDefault(); // Let's pass the position of the zoom box // off to the function that is responsible // for zooming the image. zoomImage( zoom.position().left, zoom.position().top ); var top = $("#social-image-id" ).offset().top; var left = $("#social-image-id").offset().left; var pointX = left + ($( "#social-image-id" ).width()/2); var pointY = top + ($( "#social-image-id" ).height()/2); var width = event.clientX - pointX; var height = pointY - event.clientY; var reaX = size.width; width = width * (reaX/$( "#social-image-id" ).width()); height = height * (reaX/$( "#social-image-id" ).width()); $("#position_y_id").val(parseInt(height)); $("#position_x_id").val(parseInt(width)); } ); // I take the zoom box coordinates and translate them // into an actual image zoom based on the existing // zoom and offset of the image. // // NOTE: We don't care about the dimensions of the // zoom box itself as those should have already been // properly translated into the zoom *factor*. var zoomImage = function( zoomLeft, zoomTop ){ // Get a reference to the image data object so we // don't need to keep retreiving it. var imageData = image.data(); // Check to see if we have reached the max zoom // or if the image is currently animating. // If so, just return out. if ( (imageData.zoom == 5) || (image.is( ":animated" )) ){ // Zooming in beyond this is pointless (and // can cause the browser to mis-render the // image). return; } // Scale the image up based on the zoom factor. imageData.width = (image.width() * imageData.zoomFactor); imageData.height = (image.height() * imageData.zoomFactor); // Change the offset set data to re-position the // 0,0 coordinate back up in the top left. imageData.left = ((imageData.left - zoomLeft) * imageData.zoomFactor); imageData.top = ((imageData.top - zoomTop) * imageData.zoomFactor); // Increase the zoom. imageData.zoom++; // Animate the zoom. image.animate( { imageData.width, height: imageData.height, left: imageData.left, top: imageData.top }, 500 ); }; // I reset the image zoom. var resetZoom = function(){ // Get a reference to the image data object so we // don't need to keep retreiving it. var imageData = image.data(); // Reset the image data. imageData.zoom = 1; imageData.top = 0; imageData.left = 0; imageData.width = imageData.originalWidth; imageData.height = imageData.originalHeight; // Animate the zoom. image.animate( { imageData.width, height: imageData.height, left: imageData.left, top: imageData.top }, 300 ); }; // As a final step, to make sure that the image can // be zoomed out, bind the mousedown to the document. $( document ).mousedown( function( event ){ // Check to see if the view is in the event // bubble chain for the mouse down. If it is, // then this click was in the view or its // child elements. var closestView = $( event.target ).closest( "#view" ); // Check to see if this mouse down was in the // image view. if (!closestView.size()){ // The view was not found in the chain. // This was clicked outside of the view. // Reset the image zoom. resetZoom(); } } ); });