(function($){$.fn.magnify=function(options){'use strict';var magnify=new Magnify($(this),options);return magnify;};function Magnify(element,options){var customUserOptions=options||{},$box=$(element),$thumb,that=this,largeWrapper=options.largeWrapper||'.magnifier-preview',$magnifierPreview=$(largeWrapper);curThumb=null,magnifierOptions={x:0,y:0,w:0,h:0,lensW:0,lensH:0,lensBgX:0,lensBgY:0,largeW:0,largeH:0,largeL:0,largeT:0,zoom:2,zoomMin:1.1,zoomMax:5,mode:'outside',eventType:'click',status:0,zoomAttached:false,zoomable:customUserOptions.zoomable!==undefined?customUserOptions.zoomable:false,onthumbenter:customUserOptions.onthumbenter!==undefined?customUserOptions.onthumbenter:null,onthumbmove:customUserOptions.onthumbmove!==undefined?customUserOptions.onthumbmove:null,onthumbleave:customUserOptions.onthumbleave!==undefined?customUserOptions.onthumbleave:null,onzoom:customUserOptions.onzoom!==undefined?customUserOptions.onzoom:null},pos={t:0,l:0,x:0,y:0},gId=0,status=0,curIdx='',curLens=null,curLarge=null,lensbg=customUserOptions.bg!==undefined?customUserOptions.lensbg:true,gZoom=customUserOptions.zoom!==undefined?customUserOptions.zoom:magnifierOptions.zoom,gZoomMin=customUserOptions.zoomMin!==undefined?customUserOptions.zoomMin:magnifierOptions.zoomMin,gZoomMax=customUserOptions.zoomMax!==undefined?customUserOptions.zoomMax:magnifierOptions.zoomMax,gMode=customUserOptions.mode||magnifierOptions.mode,gEventType=customUserOptions.eventType||magnifierOptions.eventType,data={},inBounds=false,isOverThumb=false,rate=1,paddingX=0,paddingY=0,enabled=true,showWrapper=true;var MagnifyCls={magnifyHidden:'magnify-hidden',magnifyOpaque:'magnify-opaque',magnifyFull:'magnify-fullimage'};that.update=function(){updateLensOnLoad();};that.init=function(){_init($box,options);};function _toBoolean(str){if(typeof str==='string'){if(str==='true'){return true;}else if(str==='false'||''){return false;}
console.warn('Wrong type: can\'t be transformed to Boolean');}else if(typeof str==='boolean'){return str;}}
function createLens(thumb){if($(thumb).siblings('.magnify-lens').length){return false;}
var lens=$('
');$(thumb).parent().append(lens);}
function updateLensOnLoad(idSelectorMainImg,thumb,largeImgInMagnifyLens,largeWrapper){var magnifyLensElement=$box.find('.magnify-lens'),textWrapper;if(data[idSelectorMainImg].status===1){textWrapper=$('');magnifyLensElement.className='magnifier-loader magnify-hidden';textWrapper.html('Loading...');magnifyLensElement.html('').append(textWrapper);}else if(data[idSelectorMainImg].status===2){magnifyLensElement.addClass(MagnifyCls.magnifyHidden);magnifyLensElement.html('');largeImgInMagnifyLens.id=idSelectorMainImg+'-large';largeImgInMagnifyLens.style.width=data[idSelectorMainImg].largeImgInMagnifyLensWidth+'px';largeImgInMagnifyLens.style.height=data[idSelectorMainImg].largeImgInMagnifyLensHeight+'px';largeImgInMagnifyLens.className='magnifier-large magnify-hidden';if(data[idSelectorMainImg].mode==='inside'){magnifyLensElement.append(largeImgInMagnifyLens);}else{largeWrapper.html('').append(largeImgInMagnifyLens);}}
data[idSelectorMainImg].lensH=data[idSelectorMainImg].lensH>$thumb.height()?$thumb.height():data[idSelectorMainImg].lensH;if(Math.round(data[idSelectorMainImg].lensW)===0){magnifyLensElement.css('display','none');}else{magnifyLensElement.css({width:Math.round(data[idSelectorMainImg].lensW)+'px',height:Math.round(data[idSelectorMainImg].lensH)+'px',display:''});}}
function getMousePos(){var xPos=pos.x-magnifierOptions.x,yPos=pos.y-magnifierOptions.y,t,l;inBounds=xPos<0||yPos<0||xPos>magnifierOptions.w||yPos>magnifierOptions.h?false:true;l=xPos-magnifierOptions.lensW / 2;t=yPos-magnifierOptions.lensH / 2;if(xPos0){l=magnifierOptions.w-Math.ceil(magnifierOptions.lensW+2);}
if(yPos-magnifierOptions.h+Math.ceil(magnifierOptions.lensH / 2)>0){t=magnifierOptions.h-Math.ceil(magnifierOptions.lensH);}
pos.l=l;pos.t=t;magnifierOptions.lensBgX=pos.l;magnifierOptions.lensBgY=pos.t;if(magnifierOptions.mode==='inside'){magnifierOptions.largeL=Math.round(xPos*(magnifierOptions.zoom-magnifierOptions.lensW / magnifierOptions.w));magnifierOptions.largeT=Math.round(yPos*(magnifierOptions.zoom-magnifierOptions.lensH / magnifierOptions.h));}else{magnifierOptions.largeL=Math.round(magnifierOptions.lensBgX*magnifierOptions.zoom*(magnifierOptions.largeWrapperW / magnifierOptions.w));magnifierOptions.largeT=Math.round(magnifierOptions.lensBgY*magnifierOptions.zoom*(magnifierOptions.largeWrapperH / magnifierOptions.h));}}
function onThumbEnter(){if(_toBoolean(enabled)){magnifierOptions=data[curIdx];curLens=$box.find('.magnify-lens');if(magnifierOptions.status===2){curLens.removeClass(MagnifyCls.magnifyOpaque);curLarge=$('#'+curIdx+'-large');curLarge.removeClass(MagnifyCls.magnifyHidden);}else if(magnifierOptions.status===1){curLens.className='magnifier-loader';}}}
function onThumbLeave(){if(magnifierOptions.status>0){var handler=magnifierOptions.onthumbleave;if(handler!==null){handler({thumb:curThumb,lens:curLens,large:curLarge,x:pos.x,y:pos.y});}
if(!curLens.hasClass(MagnifyCls.magnifyHidden)){curLens.addClass(MagnifyCls.magnifyHidden);if(curLarge!==null){curLarge.addClass(MagnifyCls.magnifyHidden);}}}}
function move(){if(_toBoolean(enabled)){if(status!==magnifierOptions.status){onThumbEnter();}
if(magnifierOptions.status>0){curThumb.className=magnifierOptions.thumbCssClass+' magnify-opaque';if(magnifierOptions.status===1){curLens.className='magnifier-loader';}else if(magnifierOptions.status===2){curLens.removeClass(MagnifyCls.magnifyHidden);curLarge.removeClass(MagnifyCls.magnifyHidden);curLarge.css({left:'-'+magnifierOptions.largeL+'px',top:'-'+magnifierOptions.largeT+'px'});}
var borderOffset=2;pos.t=pos.t<=0?0:pos.t-borderOffset;curLens.css({left:pos.l+paddingX+'px',top:pos.t+paddingY+'px'});if(lensbg){curLens.css({'background-color':'rgba(f,f,f,.5)'});}else{curLens.get(0).style.backgroundPosition='-'+
magnifierOptions.lensBgX+'px -'+
magnifierOptions.lensBgY+'px';}
var handler=magnifierOptions.onthumbmove;if(handler!==null){handler({thumb:curThumb,lens:curLens,large:curLarge,x:pos.x,y:pos.y});}}
status=magnifierOptions.status;}}
function setThumbData(mainImage,mainImageData){var thumbBounds=mainImage.getBoundingClientRect(),w=0,h=0;mainImageData.x=Math.round(thumbBounds.left);mainImageData.y=Math.round(thumbBounds.top);mainImageData.w=Math.round(thumbBounds.right-mainImageData.x);mainImageData.h=Math.round(thumbBounds.bottom-mainImageData.y);if(mainImageData.mode==='inside'){w=mainImageData.w;h=mainImageData.h;}else{w=mainImageData.largeWrapperW;h=mainImageData.largeWrapperH;}
mainImageData.largeImgInMagnifyLensWidth=Math.round(mainImageData.zoom*w);mainImageData.largeImgInMagnifyLensHeight=Math.round(mainImageData.zoom*h);mainImageData.lensW=Math.round(mainImageData.w / mainImageData.zoom);mainImageData.lensH=Math.round(mainImageData.h / mainImageData.zoom);}
function _init($box,options){var opts={};if(options.thumb===undefined){return false;}
$thumb=$box.find(options.thumb);if($thumb.length){for(var key in options){opts[key]=options[key];}
opts.thumb=$thumb;enabled=opts.enabled;if(_toBoolean(enabled)){$magnifierPreview.show().css('display','');$magnifierPreview.addClass(MagnifyCls.magnifyHidden);set(opts);}else{$magnifierPreview.empty().hide();}}
return that;}
function hoverEvents(thumb){$(thumb).on('mouseover',function(e){if(showWrapper){if(magnifierOptions.status!==0){onThumbLeave();}
handleEvents(e);isOverThumb=inBounds;}}).trigger('mouseover');}
function clickEvents(thumb){$(thumb).on('click',function(e){if(showWrapper){if(!isOverThumb){if(magnifierOptions.status!==0){onThumbLeave();}
handleEvents(e);isOverThumb=true;}}});}
function bindEvents(eType,thumb){var eventFlag='hasBoundEvent_'+eType;if(thumb[eventFlag]){return;}
thumb[eventFlag]=true;switch(eType){case'hover':hoverEvents(thumb);break;case'click':clickEvents(thumb);break;}}
function handleEvents(e){var src=e.target;curIdx=src.id;curThumb=src;onThumbEnter(src);setThumbData(curThumb,magnifierOptions);pos.x=e.clientX;pos.y=e.clientY;getMousePos();move();var handler=magnifierOptions.onthumbenter;if(handler!==null){handler({thumb:curThumb,lens:curLens,large:curLarge,x:pos.x,y:pos.y});}}
function set(options){if(data[options.thumb.id]!==undefined){curThumb=options.thumb;return false;}
var thumbObj=new Image(),largeObj=new Image(),$thumb=options.thumb,thumb=$thumb.get(0),idx=thumb.id,largeUrl,largeWrapper=$(options.largeWrapper),zoom=options.zoom||thumb.getAttribute('data-zoom')||gZoom,zoomMin=options.zoomMin||gZoomMin,zoomMax=options.zoomMax||gZoomMax,mode=options.mode||thumb.getAttribute('data-mode')||gMode,eventType=options.eventType||thumb.getAttribute('data-eventType')||gEventType,onthumbenter=options.onthumbenter!==undefined?options.onthumbenter:magnifierOptions.onthumbenter,onthumbleave=options.onthumbleave!==undefined?options.onthumbleave:magnifierOptions.onthumbleave,onthumbmove=options.onthumbmove!==undefined?options.onthumbmove:magnifierOptions.onthumbmove;largeUrl=$thumb.data('original')||customUserOptions.full||$thumb.attr('src');if(thumb.id===''){idx=thumb.id='magnifier-item-'+gId;gId+=1;}
createLens(thumb,idx);if(options.width){largeWrapper.width(options.width);}
if(options.height){largeWrapper.height(options.height);}
if(options.top){if(typeof options.top=='function'){var top=options.top()+'px';}else{var top=options.top+'px';}
if(largeWrapper.length){largeWrapper[0].style.top=top.replace('%px','%');}}
if(options.left){if(typeof options.left=='function'){var left=options.left()+'px';}else{var left=options.left+'px';}
if(largeWrapper.length){largeWrapper[0].style.left=left.replace('%px','%');}}
data[idx]={zoom:zoom,zoomMin:zoomMin,zoomMax:zoomMax,mode:mode,eventType:eventType,thumbCssClass:thumb.className,zoomAttached:false,status:0,largeUrl:largeUrl,largeWrapperId:mode==='outside'?largeWrapper.attr('id'):null,largeWrapperW:mode==='outside'?largeWrapper.width():null,largeWrapperH:mode==='outside'?largeWrapper.height():null,onthumbenter:onthumbenter,onthumbleave:onthumbleave,onthumbmove:onthumbmove};paddingX=($thumb.parent().width()-$thumb.width())/ 2;paddingY=($thumb.parent().height()-$thumb.height())/ 2;showWrapper=false;$(thumbObj).on('load',function(){if(data.length>0){data[idx].status=1;$(largeObj).on('load',function(){if(largeObj.width>largeWrapper.width()||largeObj.height>largeWrapper.height()){showWrapper=true;bindEvents(eventType,thumb);data[idx].status=2;if(largeObj.width>largeObj.height){data[idx].zoom=largeObj.width / largeWrapper.width();}else{data[idx].zoom=largeObj.height / largeWrapper.height();}
setThumbData(thumb,data[idx]);updateLensOnLoad(idx,thumb,largeObj,largeWrapper);}});largeObj.src=data[idx].largeUrl;}});thumbObj.src=thumb.src;}
function onMouseLeave(){onThumbLeave();isOverThumb=false;$magnifierPreview.addClass(MagnifyCls.magnifyHidden);}
function onMousemove(e){pos.x=e.clientX;pos.y=e.clientY;getMousePos();if(gEventType==='hover'){isOverThumb=inBounds;}
if(inBounds&&isOverThumb){if(gMode==='outside'){$magnifierPreview.removeClass(MagnifyCls.magnifyHidden);}
move();}}
function onScroll(){if(curThumb!==null){setThumbData(curThumb,magnifierOptions);}}
$(window).on('scroll',onScroll);$(window).on('resize',function(){_init($box,customUserOptions);});$box.on('mousemove',onMousemove);$box.on('mouseleave',onMouseLeave);_init($box,customUserOptions);}}(jQuery));