//////////////////////////////////////////////////////////////////////////////////
// Cloud Zoom V1.0.2
// (c) 2010 by R Cecco. <http://www.professorcloud.com>
// MIT License
//
// Please retain this copyright header in all versions of the software
//////////////////////////////////////////////////////////////////////////////////
(function($) {
	$(document).ready(function() {
		$('.cloud-zoom, .cloud-zoom-gallery').CloudZoom()
	});
	function format(str) {
		for ( var i = 1; i < arguments.length; i++) {
			str = str.replace('%' + (i - 1), arguments[i])
		}
		return str
	}
	function CloudZoom(jWin, opts) {
		var sImg = $('img', jWin);
		var img1;
		var img2;
		var zoomDiv = null;
		var $mouseTrap = null;
		var lens = null;
		var $tint = null;
		var softFocus = null;
		var $ie6Fix = null;
		var zoomImage;
		var controlTimer = 0;
		var cw, ch;
		var destU = 0;
		var destV = 0;
		var currV = 0;
		var currU = 0;
		var filesLoaded = 0;
		var mx, my;
		var ctx = this, zw;
		setTimeout(
				function() {
					if ($mouseTrap === null) {
						var w = jWin.width();
						jWin
								.parent()
								.append(
										format(
												'<div style="width:%0px;position:absolute;top:75%;left:%1px;text-align:center" class="cloud-zoom-loading" >Loading...</div>',
												w / 3, (w / 2) - (w / 6)))
								.find(':last').css('opacity', 0.5)
					}
				}, 200);
		var ie6FixRemove = function() {
			if ($ie6Fix !== null) {
				$ie6Fix.remove();
				$ie6Fix = null
			}
		};
		this.removeBits = function() {
			if (lens) {
				lens.remove();
				lens = null
			}
			if ($tint) {
				$tint.remove();
				$tint = null
			}
			if (softFocus) {
				softFocus.remove();
				softFocus = null
			}
			ie6FixRemove();
			$('.cloud-zoom-loading', jWin.parent()).remove()
		};
		this.destroy = function() {
			jWin.data('zoom', null);
			if ($mouseTrap) {
				$mouseTrap.unbind();
				$mouseTrap.remove();
				$mouseTrap = null
			}
			if (zoomDiv) {
				zoomDiv.remove();
				zoomDiv = null
			}
			this.removeBits()
		};
		this.fadedOut = function() {
			if (zoomDiv) {
				zoomDiv.remove();
				zoomDiv = null
			}
			this.removeBits()
		};
		this.controlLoop = function() {
			if (lens) {
				var x = (mx - sImg.offset().left - (cw * 0.5)) >> 0;
				var y = (my - sImg.offset().top - (ch * 0.5)) >> 0;
				if (x < 0) {
					x = 0
				} else if (x > (sImg.outerWidth() - cw)) {
					x = (sImg.outerWidth() - cw)
				}
				if (y < 0) {
					y = 0
				} else if (y > (sImg.outerHeight() - ch)) {
					y = (sImg.outerHeight() - ch)
				}
				lens.css({
					left : x,
					top : y
				});
				lens.css('background-position', (-x) + 'px ' + (-y) + 'px');
				destU = (((x) / sImg.outerWidth()) * zoomImage.width) >> 0;
				destV = (((y) / sImg.outerHeight()) * zoomImage.height) >> 0;
				currU += (destU - currU) / opts.smoothMove;
				currV += (destV - currV) / opts.smoothMove;
				zoomDiv.css('background-position', (-(currU >> 0) + 'px ')
						+ (-(currV >> 0) + 'px'))
			}
			controlTimer = setTimeout(function() {
				ctx.controlLoop()
			}, 30)
		};
		this.init2 = function(img, id) {
			filesLoaded++;
			if (id === 1) {
				zoomImage = img
			}
			if (filesLoaded === 2) {
				this.init()
			}
		};
		this.init = function() {
			$('.cloud-zoom-loading', jWin.parent()).remove();
			$mouseTrap = jWin
					.parent()
					.append(
							format(
									"<div class='mousetrap' style='background-image:url(\".\");z-index:999;position:absolute;width:%0px;height:%1px;\'></div>",
									sImg.outerWidth(), sImg.outerHeight()))
					.find(':last');
			$mouseTrap.bind('mousemove', this, function(event) {
				mx = event.pageX;
				my = event.pageY
			});
			$mouseTrap.bind('mouseleave', this, function(event) {
				clearTimeout(controlTimer);
				if (lens) {
					lens.fadeOut(299)
				}
				if ($tint) {
					$tint.fadeOut(299)
				}
				if (softFocus) {
					softFocus.fadeOut(299)
				}
				zoomDiv.fadeOut(300, function() {
					ctx.fadedOut()
				});
				return false
			});
			$mouseTrap
					.bind(
							'mouseenter',
							this,
							function(event) {
								mx = event.pageX;
								my = event.pageY;
								zw = event.data;
								if (zoomDiv) {
									zoomDiv.stop(true, false);
									zoomDiv.remove()
								}
								var xPos = opts.adjustX, yPos = opts.adjustY;
								var siw = sImg.outerWidth();
								var sih = sImg.outerHeight();
								var w = opts.zoomWidth;
								var h = opts.zoomHeight;
								if (opts.zoomWidth == 'auto') {
									w = siw
								}
								if (opts.zoomHeight == 'auto') {
									h = sih
								}
								var appendTo = jWin.parent();
								switch (opts.position) {
								case 'top':
									yPos -= h;
									break;
								case 'right':
									xPos += siw;
									break;
								case 'bottom':
									yPos += sih;
									break;
								case 'left':
									xPos -= w;
									break;
								case 'inside':
									w = siw;
									h = sih;
									break;
								default:
									appendTo = $('#' + opts.position);
									if (!appendTo.length) {
										appendTo = jWin;
										xPos += siw;
										yPos += sih
									} else {
										w = appendTo.innerWidth();
										h = appendTo.innerHeight()
									}
								}
								zoomDiv=$('div.detail-image').append(format('<div id="cloud-zoom-big" class="cloud-zoom-big" style="display:none;position:absolute;left:400px;top:-1px;width:590px;height:420px;background-image:url(\'%4\');background-repeat:no-repeat;background-color:#ffffff;z-index:99;"></div>',xPos,yPos,w,h,zoomImage.src)).find(':last');if(sImg.attr('title')&&opts.showTitle){zoomDiv.append(format('<div class="cloud-zoom-title">%0</div>',sImg.attr('title'))).find(':last').css('opacity',opts.titleOpacity)}if($.browser.msie&&$.browser.version<7){$ie6Fix=$('<iframe frameborder="0" src="#"></iframe>').css({position:"absolute",left:xPos,top:yPos,zIndex:99,width:w,height:h}).insertBefore(zoomDiv)}zoomDiv.fadeIn(500);if(lens){lens.remove();lens=null}cw=(sImg.outerWidth()/zoomImage.width)*zoomDiv.width();ch=(sImg.outerHeight()/zoomImage.height)*zoomDiv.height();lens=jWin.append(format("<div class = 'cloud-zoom-lens' style='display:none;z-index:98;position:absolute;width:%0px;height:%1px;'></div>",cw,ch)).find(':last');$mouseTrap.css('cursor',lens.css('cursor'));var noTrans=false;if(opts.tint){lens.css({'background' : 'url("'+sImg.attr('src')+'")', 'background-repeat' : 'no-repeat'});$tint=jWin.append(format('<div style="display:none;position:absolute; left:0px; top:0px; width:%0px; height:%1px; background-color:%2;" />',sImg.outerWidth(),sImg.outerHeight(),opts.tint)).find(':last');$tint.css('opacity',opts.tintOpacity);noTrans=true;$tint.fadeIn(500)}if(opts.softFocus){lens.css('background','url("'+sImg.attr('src')+'")');softFocus=jWin.append(format('<div style="position:absolute;display:none;top:2px; left:2px; width:%0px; height:%1px;" />',sImg.outerWidth()-2,sImg.outerHeight()-2,opts.tint)).find(':last');softFocus.css('background','url("'+sImg.attr('src')+'")');softFocus.css('opacity',0.5);noTrans=true;softFocus.fadeIn(500)}if(!noTrans){lens.css('opacity',opts.lensOpacity)}if(opts.position!=='inside'){lens.fadeIn(500)}zw.controlLoop();return})};img1=new Image();$(img1).load(function(){ctx.init2(this,0)});img1.src=sImg.attr('src');img2=new Image();$(img2).load(function(){ctx.init2(this,1)});img2.src=jWin.attr('href')}$.fn.CloudZoom=function(options){try{document.execCommand("BackgroundImageCache",false,true)}catch(e){}this.each(function(){var relOpts,opts;eval('var	a = {'+$(this).attr('rel')+'}');relOpts=a;if($(this).is('.cloud-zoom')){$(this).css({'position':'relative','display':'block'});$('img',$(this)).css({'display':'block'});if($(this).parent().attr('id')!='wrap'){$(this).wrap('<div id="wrap"></div>')}opts=$.extend({},$.fn.CloudZoom.defaults,options);opts=$.extend({},opts,relOpts);$(this).data('zoom',new CloudZoom($(this),opts))}else if($(this).is('.cloud-zoom-gallery')){
									opts=$.extend({},relOpts,options);
									$(this).data('relOpts',opts);
									$(this).bind('mouseenter', $(this), function (event) {
					                    var data = event.data.data('relOpts');
					                    // Destroy the previous zoom
					                    $('#' + data.useZoom).data('zoom').destroy();
					                    // Change the biglink to point to the new big image.
					                    $('#' + data.useZoom).attr('href', event.data.attr('href'));
					                    // Change the small image to point to the new small image.
					                    $('#' + data.useZoom + ' img').attr('src', event.data.data('relOpts').smallImage);
					                    // Init a new zoom with the new images.                            
					                    $('#' + event.data.data('relOpts').useZoom).CloudZoom();
					                    $('div.detail-thumb').removeClass('is-active');
					                    $(this).parents('div.detail-thumb').addClass('is-active');
					                    return false;
					                });
									$(this).bind('click',$(this),function(event){

										return false
										})
									}
								});
								return this};
										$.fn.CloudZoom.defaults={zoomWidth:'auto',zoomHeight:'auto',position:'right',tint:false,tintOpacity:0.5,lensOpacity:0.5,softFocus:false,smoothMove:3,showTitle:true,titleOpacity:0.5,adjustX:0,adjustY:0}})
									(jQuery);
