//////////////////////////////////////////////////////////////////////////////////
// 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 id='gallery' class='mousetrap' style='background-image:url(\".\");z-index:999;position:absolute;width:%0px;height:%1px;left:%2px;top:%3px;\'></div>",sImg.outerWidth(),sImg.outerHeight(),0,0)).find(':last');
						$mouseTrap.bind('mousemove',this,function(event){
							mx=event.pageX;my=event.pageY
						});
						
						//$mouseTrap.bind('click',this,function(event){ $('#gallery a').lightBox(); });
						$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;case'inside':w='800';h='400';
								break;
								default:appendTo=$('#'+opts.position);
								if(!appendTo.length){
									appendTo=jWin;
									xPos+=siw;
									yPos+=sih
								}else{
									w=appendTo.innerWidth();
									h=appendTo.innerHeight()
								}
							}
							zoomDiv=appendTo.append(format('<div id="cloud-zoom-big" class="cloud-zoom-big" style="display:none;position:absolute;left:%0px;top:%1px;width:%2px;height:%3px;background-image:url(\'%4\');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')+'")');
									$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" style="top:0px;z-index:9999;position:relative;"></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('mouseover',$(this),function(event){
										var data=event.data.data('relOpts');
										$('#'+data.useZoom).data('zoom').destroy();
										$('#'+data.useZoom).attr('href',event.data.attr('href'));
										$('#'+data.useZoom+' img').attr('src',event.data.data('relOpts').smallImage);
										$('#'+data.useZoom+' a').attr('href',event.data.data('relOpts').smallImage);
										$('#'+event.data.data('relOpts').useZoom).CloudZoom();
										return false
										})
									/*$(this).bind('click',$(this),function(event){
										var data=event.data.data('relOpts');
										$('#'+data.useZoom).data('zoom').destroy();
										$('#'+data.useZoom).attr('href',event.data.attr('href'));
										$('#'+data.useZoom+' img').attr('src',event.data.data('relOpts').smallImage);
										$('#'+event.data.data('relOpts').useZoom).CloudZoom();
										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);
