define(['jquery','underscore','magnifier/magnifier'],function($,_){'use strict';return function(config,element){var isTouchEnabled='ontouchstart'in document.documentElement,gallerySelector='[data-gallery-role="gallery"]',magnifierSelector='[data-gallery-role="magnifier"]',magnifierZoomSelector='[data-gallery-role="magnifier-zoom"]',zoomInButtonSelector='[data-gallery-role="fotorama__zoom-in"]',zoomOutButtonSelector='[data-gallery-role="fotorama__zoom-out"]',fullscreenImageSelector='[data-gallery-role="stage-shaft"] [data-active="true"] .fotorama__img--full',imageDraggableClass='fotorama__img--draggable',imageZoommable='fotorama__img--zoommable',zoomInLoaded='zoom-in-loaded',zoomOutLoaded='zoom-out-loaded',zoomInDisabled='fotorama__zoom-in--disabled',zoomOutDisabled='fotorama__zoom-out--disabled',keyboardNavigation,videoContainerClass='fotorama-video-container',hideMagnifier,dragFlag,endX,transitionEnabled,transitionActive=false,tapFlag=0,allowZoomOut=false,allowZoomIn=true;transitionEnabled=document.documentElement.style.transition!==undefined||document.documentElement.style.WebkitTransition!==undefined||document.documentElement.style.MozTransition!==undefined||document.documentElement.style.MsTransition!==undefined||document.documentElement.style.OTransition!==undefined;function getImageSize(img){return{rw:img.naturalWidth,rh:img.naturalHeight};} function calculateMinSize($image){var minHeight,minWidth,height=$image.height(),width=$image.width(),parentHeight=$image.parent().height(),parentWidth=$image.parent().width();if(width>parentWidth||height>parentHeight){if(width / height$image.parent().height()||this.width>$image.parent().width()?hideZoomControls(false):hideZoomControls(true);};img.src=path;} function toggleZoomButtons($image,isTouchScreen,isVideoActiveFrame){var path=$image.attr('src');if(path&&!isTouchScreen&&!isVideoActiveFrame){asyncToggleZoomButtons(path,$image);}else{hideZoomControls(true);}} function resizeHandler(e,$image){var imageSize,parentWidth,parentHeight,isImageSmall,isImageFit;if(!e.data.$image||!e.data.$image.length) return;imageSize=getImageSize($(fullscreenImageSelector)[0]);parentWidth=e.data.$image.parent().width();parentHeight=e.data.$image.parent().height();isImageSmall=parentWidth>=imageSize.rw&&parentHeight>=imageSize.rh;isImageFit=parentWidth>e.data.$image.width()&&parentHeight>e.data.$image.height();toggleZoomButtons(e.data.$image,isTouchEnabled,checkForVideo(e.data.fotorama.activeFrame.$stageFrame));calculateMinSize(e.data.$image);if(e.data.$image.hasClass(imageZoommable)&&!allowZoomOut||isImageSmall||isImageFit){resetVars(e.data.$image);} if(!isImageSmall){toggleStandartNavigation();}} function getTopValue($image,topProp,step,height,containerHeight){var top;if(parseInt($image.css('marginTop'))||parseInt($image.css('marginLeft'))){top=dragFlag?topProp-step / 4:0;top=topheight-containerHeight?height-containerHeight:top;}else{top=topProp+step / 2;top=top0?0:top;if(!dragFlag&&step<0){top=top<(containerHeight-height)/ 2?(containerHeight-height)/ 2:top;}} return top;} function getLeftValue(leftProp,step,width,containerWidth){var left;left=leftProp+step / 2;left=left0?0:left;if(!dragFlag&&step<0){left=left<(containerWidth-width)/ 2?(containerWidth-width)/ 2:left;} return left;} function checkFullscreenImagePosition($image,dimentions,widthStep,heightStep){var $imageContainer,containerWidth,containerHeight,settings,top,left,right,bottom,ratio;if($(gallerySelector).data('fotorama').fullScreen){transitionActive=true;$imageContainer=$image.parent();containerWidth=$imageContainer.width();containerHeight=$imageContainer.height();top=$image.position().top;left=$image.position().left;ratio=$image.width()/ $image.height();dimentions.height=isNaN(dimentions.height)?dimentions.width / ratio:dimentions.height;dimentions.width=isNaN(dimentions.width)?dimentions.height*ratio:dimentions.width;top=dimentions.height>=containerHeight?getTopValue($image,top,heightStep,dimentions.height,containerHeight):0;left=dimentions.width>=containerWidth?getLeftValue(left,widthStep,dimentions.width,containerWidth):0;right=dragFlag&&left<(containerWidth-dimentions.width)/ 2?0:left;bottom=dragFlag?0:top;settings=$.extend(dimentions,{top:top,left:left,right:right});$image.css(settings);}} function toggleStandartNavigation(){var $selectable=$('a[href], area[href], input, select, textarea, button, iframe, object, embed, *[tabindex], *[contenteditable]').not('[tabindex=-1], [disabled], :hidden'),fotorama=$(gallerySelector).data('fotorama'),$focus=$(':focus'),index;if(fotorama.fullScreen){$selectable.each(function(number){if($(this).is($focus)){index=number;}});fotorama.setOptions({swipe:!allowZoomOut,keyboard:!allowZoomOut});if(_.isNumber(index)){$selectable.eq(index).trigger('focus');}}} function zoomIn(e,xStep,yStep){var $image,imgOriginalSize,imageWidth,imageHeight,zoomWidthStep,zoomHeightStep,widthResult,heightResult,ratio,dimentions={};if(allowZoomIn&&(!transitionEnabled||!transitionActive)&&(isTouchEnabled||!$(zoomInButtonSelector).hasClass(zoomInDisabled))){$image=$(fullscreenImageSelector);imgOriginalSize=getImageSize($image[0]);imageWidth=$image.width();imageHeight=$image.height();ratio=imageWidth / imageHeight;allowZoomOut=true;toggleStandartNavigation();if(!$image.hasClass(imageZoommable)){toggleZoomable($image,true);} e.preventDefault();if(imageWidth>=imageHeight){zoomWidthStep=xStep||Math.ceil(imageWidth*parseFloat(config.magnifierOpts.fullscreenzoom)/ 100);widthResult=imageWidth+zoomWidthStep;if(widthResult>=imgOriginalSize.rw){widthResult=imgOriginalSize.rw;zoomWidthStep=xStep||widthResult-imageWidth;allowZoomIn=false;} heightResult=widthResult / ratio;zoomHeightStep=yStep||heightResult-imageHeight;}else{zoomHeightStep=yStep||Math.ceil(imageHeight*parseFloat(config.magnifierOpts.fullscreenzoom)/ 100);heightResult=imageHeight+zoomHeightStep;if(heightResult>=imgOriginalSize.rh){heightResult=imgOriginalSize.rh;zoomHeightStep=yStep||heightResult-imageHeight;allowZoomIn=false;} widthResult=heightResult*ratio;zoomWidthStep=xStep||widthResult-imageWidth;} if(imageWidth>=imageHeight&&imageWidth!==imgOriginalSize.rw){dimentions=$.extend(dimentions,{width:widthResult,height:'auto'});checkFullscreenImagePosition($image,dimentions,-zoomWidthStep,-zoomHeightStep);}else if(imageWidth=imageHeight){zoomWidthStep=xStep||Math.ceil(imageWidth*parseFloat(config.magnifierOpts.fullscreenzoom)/ 100);widthResult=imageWidth-zoomWidthStep;heightResult=widthResult / ratio;zoomHeightStep=yStep||imageHeight-heightResult;}else{zoomHeightStep=yStep||Math.ceil(imageHeight*parseFloat(config.magnifierOpts.fullscreenzoom)/ 100);heightResult=imageHeight-zoomHeightStep;widthResult=heightResult*ratio;zoomWidthStep=xStep||imageWidth-widthResult;} fitIntoParent=function(){if(ratio>parentWidth / parentHeight){widthResult=parentWidth;zoomWidthStep=imageWidth-widthResult;heightResult=widthResult / ratio;zoomHeightStep=imageHeight-heightResult;dimentions={width:widthResult,height:'auto'};}else{heightResult=parentHeight;zoomHeightStep=imageHeight-heightResult;widthResult=heightResult*ratio;zoomWidthStep=imageWidth-widthResult;dimentions={width:'auto',height:heightResult};} checkFullscreenImagePosition($image,dimentions,zoomWidthStep,zoomHeightStep);};if(imageWidth>=imageHeight){if(widthResult>parentWidth){dimentions={width:widthResult,height:'auto'};checkFullscreenImagePosition($image,dimentions,zoomWidthStep,zoomHeightStep);}else if(heightResult>parentHeight){dimentions={width:widthResult,height:'auto'};checkFullscreenImagePosition($image,dimentions,zoomWidthStep,zoomHeightStep);}else{allowZoomOut=dragFlag=false;toggleStandartNavigation();fitIntoParent();}}else if(heightResult>parentHeight){dimentions={width:'auto',height:heightResult};checkFullscreenImagePosition($image,dimentions,zoomWidthStep,zoomHeightStep);}else if(widthResult>parentWidth){dimentions={width:'auto',height:heightResult};checkFullscreenImagePosition($image,dimentions,zoomWidthStep,zoomHeightStep);}else{allowZoomOut=dragFlag=false;toggleStandartNavigation();fitIntoParent();}} return false;} function mousewheel(e,fotorama,element){var $fotoramaStage=fotorama.activeFrame.$stageFrame,fotoramaStage=$fotoramaStage.get(0);function onWheel(e){var delta=e.deltaY||e.wheelDelta,ev=e||window.event;if($(gallerySelector).data('fotorama').fullScreen){if(e.deltaY){if(delta>0){zoomOut(ev);}else{zoomIn(ev);}}else if(delta>0){zoomIn(ev);}else{zoomOut(ev);} e.preventDefault?e.preventDefault():e.returnValue=false;}} if(!$fotoramaStage.hasClass('magnify-wheel-loaded')){if(fotoramaStage&&fotoramaStage.addEventListener){if('onwheel'in document){fotoramaStage.addEventListener('wheel',onWheel,{passive:true});}else if('onmousewheel'in document){fotoramaStage.addEventListener('mousewheel',onWheel);}else{fotoramaStage.addEventListener('MozMousePixelScroll',onWheel);} $fotoramaStage.addClass('magnify-wheel-loaded');}}} function magnifierFullscreen(fotorama){var isDragActive=false,startX,startY,imagePosX,imagePosY,touch,swipeSlide,$gallery=$(gallerySelector),$image=$(fullscreenImageSelector,$gallery),$imageContainer=$('[data-gallery-role="stage-shaft"] [data-active="true"]'),gallery=$gallery.data('fotorama'),pinchDimention;swipeSlide=_.throttle(function(direction){$(gallerySelector).data('fotorama').show(direction);},500,{trailing:false});function getTop($el){return parseInt($el.get(0).style.top);} function shiftImage(dx,dy,e){var top=+imagePosY+dy,left=+imagePosX+dx,swipeCondition=$image.width()/ 10+20;dragFlag=true;if($image.offset().left===$imageContainer.offset().left+$imageContainer.width()-$image.width()&&e.keyCode===39||endX-1<$imageContainer.offset().left+$imageContainer.width()-$image.width()&&dx<0&&_.isNumber(endX)&&(e.type==='mousemove'||e.type==='touchmove'||e.type==='pointermove'||e.type==='MSPointerMove')){endX=null;swipeSlide('>');return;} if($image.offset().left===$imageContainer.offset().left&&dx!==0&&e.keyCode===37||endX===$imageContainer.offset().left&&dx>0&&(e.type==='mousemove'||e.type==='touchmove'||e.type==='pointermove'||e.type==='MSPointerMove')){endX=null;swipeSlide('<');return;} if($image.height()>$imageContainer.height()){if($imageContainer.height()>$image.height()+top){$image.css('top',$imageContainer.height()-$image.height());}else{top=$image.height()-getTop($image)-$imageContainer.height();dy=dy$imageContainer.width()){if($imageContainer.offset().left+$imageContainer.width()>left+$image.width()){left=$imageContainer.offset().left+$imageContainer.width()-$image.width();}else{left=$imageContainer.offset().left'):$(gallerySelector).data('fotorama').show('<');} if($image.width()<=$imageContainer.width()&&allowZoomOut&&(e.type==='mousemove'||e.type==='touchmove'||e.type==='pointermove'||e.type==='MSPointerMove')&&Math.abs(dx)>Math.abs(dy)&&Math.abs(dx)>swipeCondition){dx<0?swipeSlide('>'):swipeSlide('<');}} function dblClickHandler(e){var imgOriginalSize=getImageSize($image[0]),proportions;if(imgOriginalSize.rh<$image.parent().height()&&imgOriginalSize.rw<$image.parent().width()){return;} proportions=imgOriginalSize.rw / imgOriginalSize.rh;if(allowZoomIn){zoomIn(e,imgOriginalSize.rw-$image.width(),imgOriginalSize.rh-$image.height());}else if(proportions>$imageContainer.width()/ $imageContainer.height()){zoomOut(e,imgOriginalSize.rw-$imageContainer.width(),imgOriginalSize.rw / proportions);}else{zoomOut(e,imgOriginalSize.rw*proportions,imgOriginalSize.rh-$imageContainer.height());}} function detectDoubleTap(e){var now=new Date().getTime(),timesince=now-tapFlag;if(timesince<400&×ince>0){transitionActive=false;tapFlag=0;dblClickHandler(e);}else{tapFlag=new Date().getTime();}} if(isTouchEnabled){$image.off('tap');$image.on('tap',function(e){if(e.originalEvent.originalEvent.touches.length===0){detectDoubleTap(e);}});}else{$image.off('dblclick');$image.on('dblclick',dblClickHandler);} if(gallery.fullScreen){toggleZoomButtons($image,isTouchEnabled,checkForVideo(fotorama.activeFrame.$stageFrame));} function getDimention(event){return Math.sqrt((event.touches[0].clientX-event.touches[1].clientX)*(event.touches[0].clientX-event.touches[1].clientX)+ (event.touches[0].clientY-event.touches[1].clientY)*(event.touches[0].clientY-event.touches[1].clientY));} $image.off(isTouchEnabled?'touchstart':'pointerdown mousedown MSPointerDown');$image.on(isTouchEnabled?'touchstart':'pointerdown mousedown MSPointerDown',function(e){if(e&&e.originalEvent.touches&&e.originalEvent.touches.length>=2){e.preventDefault();pinchDimention=getDimention(e.originalEvent);isDragActive=false;if($image.hasClass(imageDraggableClass)){$image.removeClass(imageDraggableClass);}}else if(gallery.fullScreen&&(!transitionEnabled||!transitionActive)){imagePosY=getTop($image);imagePosX=$image.offset().left;if(isTouchEnabled){touch=e.originalEvent.touches[0]||e.originalEvent.changedTouches[0];e.clientX=touch.pageX;e.clientY=touch.pageY;} startX=e.clientX||e.originalEvent.clientX;startY=e.clientY||e.originalEvent.clientY;isDragActive=true;} if($image.offset()&&$image.width()>$imageContainer.width()){endX=$image.offset().left;}});$image.off(isTouchEnabled?'touchmove':'mousemove pointermove MSPointerMove');$image.on(isTouchEnabled?'touchmove':'mousemove pointermove MSPointerMove',function(e){if(e&&e.originalEvent.touches&&e.originalEvent.touches.length>=2){e.preventDefault();var currentDimention=getDimention(e.originalEvent);if($image.hasClass(imageDraggableClass)){$image.removeClass(imageDraggableClass);} if(currentDimentionpinchDimention){zoomIn(e);pinchDimention=currentDimention;}}else{var clientX,clientY;if(gallery.fullScreen&&isDragActive&&(!transitionEnabled||!transitionActive)){if(allowZoomOut&&!$image.hasClass(imageDraggableClass)){$image.addClass(imageDraggableClass);} clientX=e.clientX||e.originalEvent.clientX;clientY=e.clientY||e.originalEvent.clientY;e.preventDefault();if(isTouchEnabled){touch=e.originalEvent.touches[0]||e.originalEvent.changedTouches[0];clientX=touch.pageX;clientY=touch.pageY;} if(allowZoomOut){imagePosY=getTop($(fullscreenImageSelector,$gallery));shiftImage(clientX-startX,clientY-startY,e);}}}});$image.off('transitionend webkitTransitionEnd mozTransitionEnd msTransitionEnd ');$image.on('transitionend webkitTransitionEnd mozTransitionEnd msTransitionEnd',function(){transitionActive=false;});if(keyboardNavigation){$(document).off('keydown',keyboardNavigation);} keyboardNavigation=function(e){var step=40,$focus=$(':focus'),isFullScreen=$(gallerySelector).data('fotorama').fullScreen,initVars=function(){imagePosX=$(fullscreenImageSelector,$gallery).offset().left;imagePosY=getTop($(fullscreenImageSelector,$gallery));};if(($focus.attr('data-gallery-role')||!$focus.length)&&allowZoomOut){if(isFullScreen){imagePosX=$(fullscreenImageSelector,$(gallerySelector)).offset().left;imagePosY=getTop($(fullscreenImageSelector,$(gallerySelector)));} if(e.keyCode===39){if(isFullScreen){initVars();shiftImage(-step,0,e);}} if(e.keyCode===38){if(isFullScreen){initVars();shiftImage(0,step,e);}} if(e.keyCode===37){if(isFullScreen){initVars();shiftImage(step,0,e);}} if(e.keyCode===40){if(isFullScreen){e.preventDefault();initVars();shiftImage(0,-step,e);}}} if(e.keyCode===27&&isFullScreen&&allowZoomOut){$(gallerySelector).data('fotorama').cancelFullScreen();}};$(document).on('keydown',keyboardNavigation);$(document).on(isTouchEnabled?'touchend':'mouseup pointerup MSPointerUp',function(e){if(gallery.fullScreen){if($image.offset()&&$image.width()>$imageContainer.width()){endX=$image.offset().left;} isDragActive=false;$image.removeClass(imageDraggableClass);}});$(window).off('resize',resizeHandler);$(window).on('resize',{$image:$image,fotorama:fotorama},resizeHandler);} hideMagnifier=function(){$(magnifierSelector).empty().hide();$(magnifierZoomSelector).remove();};function checkForVideo($stageFrame){return $stageFrame.hasClass(videoContainerClass);} function behaveOnDrag(e,initPos){var pos=[e.pageX,e.pageY],isArrow=$(e.target).data('gallery-role')==='arrow',isClick=initPos[0]===pos[0]&&initPos[1]===pos[1],isImg=$(e.target).parent().data('active');if(isArrow||isImg&&!isClick){hideMagnifier();}} if(config.magnifierOpts.enabled){$(element).on('pointerdown mousedown MSPointerDown',function(e){var pos=[e.pageX,e.pageY];$(element).on('mousemove pointermove MSPointerMove',function(ev){navigator.msPointerEnabled?hideMagnifier():behaveOnDrag(ev,pos);});$(document).on('mouseup pointerup MSPointerUp',function(){$(element).off('mousemove pointermove MSPointerMove');});});} $.extend(config.magnifierOpts,{zoomable:false,thumb:'.fotorama__img',largeWrapper:'[data-gallery-role="magnifier"]',height:config.magnifierOpts.height||function(){return $('[data-active="true"]').height();},width:config.magnifierOpts.width||function(){var productMedia=$(gallerySelector).parent().parent();return productMedia.parent().width()-productMedia.width()-20;},left:config.magnifierOpts.left||function(){return $(gallerySelector).offset().left+$(gallerySelector).width()+20;},top:config.magnifierOpts.top||function(){return $(gallerySelector).offset().top;}});$(element).on('fotorama:load fotorama:showend fotorama:fullscreenexit fotorama:ready',function(e,fotorama){var $activeStageFrame=$(gallerySelector).data('fotorama').activeFrame.$stageFrame;if(!$activeStageFrame.find(magnifierZoomSelector).length){hideMagnifier();if(config.magnifierOpts){config.magnifierOpts.large=$(gallerySelector).data('fotorama').activeFrame.img;config.magnifierOpts.full=fotorama.data[fotorama.activeIndex].original;!checkForVideo($activeStageFrame)&&$($activeStageFrame).magnify(config.magnifierOpts);}}});$(element).on('gallery:loaded',function(e){var $prevImage;$(element).find(gallerySelector).on('fotorama:ready',function(e,fotorama){var $zoomIn=$(zoomInButtonSelector),$zoomOut=$(zoomOutButtonSelector);if(!$zoomIn.hasClass(zoomInLoaded)){$zoomIn.on('click touchstart',zoomIn);$zoomIn.on('mousedown',function(e){e.stopPropagation();});$zoomIn.on('keyup',function(e){if(e.keyCode===13){zoomIn(e);}});$(window).on('keyup',function(e){if(e.keyCode===107||fotorama.fullscreen){zoomIn(e);}});$zoomIn.addClass(zoomInLoaded);} if(!$zoomOut.hasClass(zoomOutLoaded)){$zoomOut.on('click touchstart',zoomOut);$zoomOut.on('mousedown',function(e){e.stopPropagation();});$zoomOut.on('keyup',function(e){if(e.keyCode===13){zoomOut(e);}});$(window).on('keyup',function(e){if(e.keyCode===109||fotorama.fullscreen){zoomOut(e);}});$zoomOut.addClass(zoomOutLoaded);}}).on('fotorama:fullscreenenter fotorama:showend',function(e,fotorama){hideMagnifier();if(!$(fullscreenImageSelector).is($prevImage)){resetVars($(fullscreenImageSelector));} magnifierFullscreen(fotorama);mousewheel(e,fotorama,element);if($prevImage){calculateMinSize($prevImage);if(!$(fullscreenImageSelector).is($prevImage)){resetVars($prevImage);}} toggleStandartNavigation();}).on('fotorama:load',function(e,fotorama){if($(gallerySelector).data('fotorama').fullScreen){toggleZoomButtons($(fullscreenImageSelector),isTouchEnabled,checkForVideo(fotorama.activeFrame.$stageFrame));} magnifierFullscreen(fotorama);}).on('fotorama:show',function(e,fotorama){$prevImage=_.clone($(fullscreenImageSelector));hideMagnifier();}).on('fotorama:fullscreenexit',function(e,fotorama){resetVars($(fullscreenImageSelector));hideMagnifier();hideZoomControls(true);});});return config;};});