/*
* jQuery.fn.imageZoom( options );
*
* Turns a simple image to a super sweet zoomable image
*
* $('.element').imageZoom({
*     small: 'the small image to show',
*     original: 'The image we show when over',
*     viewpoint: {
*         width: 'width of viewpoint',
*         height: 'height of viewpoint'
*     }
* });
*
* Version 0.2.2
* www.labs.skengdon.com/imageZoom
* www.labs.skengdon.com/imageZoom/js/imageZoom.min.js
*/
;(function($){
	$.fn.imageZoom = function( options ) {
		var settings = {
			viewpoint: {
				width: 150,
				height: 100
			}
		};
		$.extend(true, settings, options);
		return this.each(function() {
			var $loader = document.createElement('div');
			$(this).append($loader);
			
			var $image = document.createElement('img');
			$(this).append($image);
			
			var $viewpoint = document.createElement('div');
			$(this).append($viewpoint);
			
			var $loader = $($loader);
			var $image = $($image);
			var $viewpoint = $($viewpoint);
			var $viewpointImage = new Image;
			
			var pos = ( $(this).css('position') == 'static' ) ? 'relative' : $(this).css('position');
			$(this).css({
				position: pos,
				overflow: 'hidden'
			});
			
			$loader.addClass('imageZoom_loading');
			$loader.text('Loading...');
			$loader.css({
				'margin': '100px',
				'padding': '30px 70px',
				'text-align': 'center',
				'background': '#222',
				
				'border-radius': '10px',
				'-o-border-radius': '10px',
				'-moz-border-radius': '10px',
				'-webkit-border-radius': '10px'
			});
			
			$image.attr('src', settings.small);
			$image.css({
				width: $(this).width() 
			});
			
			$viewpointImage.src = settings.original;
			$viewpoint.addClass('imageZoom_viewpoint');
			$viewpoint.css({
				width: settings.viewpoint.width,
				height: settings.viewpoint.height,
				display: 'none',
				position: 'absolute',
				background: 'url(' + $viewpointImage.src + ') 0 0 no-repeat',
				'border': '1px solid #222',
				'box-shadow': '0 0 20px #000',
				'-o-box-shadow': '0 0 20px #000',
				'-moz-box-shadow': '0 0 20px #000',
				'-webkit-box-shadow': '0 0 20px #000'
			});
			
			var $this = $(this);
			
			var interval = setInterval(function(){
				
				$image.hide();
				$loader.show();
				
				if ( $viewpointImage.complete ) {
					clearInterval(interval);
					$loader.hide();
					$image.show();
					$this.mousemove(function( event ){
						$viewpoint.hide();
						
						var vars = {};
						vars.width2height = $(this).width() / $(this).height();
						vars.image2viewpoint = $image.width() / $viewpointImage.width;
						vars.mouse = {};
						vars.mouse.top = event.pageY - $(this).offset().top;
						vars.mouse.left = event.pageX - $(this).offset().left;
						
						vars.viewpoint = {};
						vars.viewpoint.position = {};
						vars.viewpoint.position.top = vars.mouse.top - $viewpoint.height() / 2;
						vars.viewpoint.position.left = vars.mouse.left - $viewpoint.width() / 2;
						vars.viewpoint.image = {};
						vars.viewpoint.image.top = - vars.mouse.top / vars.image2viewpoint + $viewpoint.height() / 2;
						vars.viewpoint.image.left = - vars.mouse.left / vars.image2viewpoint + $viewpoint.width() / 2;
						
						$viewpoint.css({
							top: vars.viewpoint.position.top,
							left: vars.viewpoint.position.left
						});
						$viewpoint.css({
							'background-position': vars.viewpoint.image.left + 'px ' + vars.viewpoint.image.top + 'px'
						});
						
						$viewpoint.show();
					});
					$this.mouseout(function(){
						$viewpoint.hide();
					});
				}
			},50);
		});
	};
})(jQuery);

