');\n }\n\n item.inlineElement = el;\n return el;\n }\n\n mfp.updateStatus('ready');\n mfp._parseMarkup(template, {}, item);\n return template;\n }\n }\n});\n\n/*>>inline*/\n\n/*>>ajax*/\nvar AJAX_NS = 'ajax',\n _ajaxCur,\n _removeAjaxCursor = function() {\n if(_ajaxCur) {\n $(document.body).removeClass(_ajaxCur);\n }\n },\n _destroyAjaxRequest = function() {\n _removeAjaxCursor();\n if(mfp.req) {\n mfp.req.abort();\n }\n };\n\n$.magnificPopup.registerModule(AJAX_NS, {\n\n options: {\n settings: null,\n cursor: 'mfp-ajax-cur',\n tError: '
The content could not be loaded.'\n },\n\n proto: {\n initAjax: function() {\n mfp.types.push(AJAX_NS);\n _ajaxCur = mfp.st.ajax.cursor;\n\n _mfpOn(CLOSE_EVENT+'.'+AJAX_NS, _destroyAjaxRequest);\n _mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest);\n },\n getAjax: function(item) {\n\n if(_ajaxCur) {\n $(document.body).addClass(_ajaxCur);\n }\n\n mfp.updateStatus('loading');\n\n var opts = $.extend({\n url: item.src,\n success: function(data, textStatus, jqXHR) {\n var temp = {\n data:data,\n xhr:jqXHR\n };\n\n _mfpTrigger('ParseAjax', temp);\n\n mfp.appendContent( $(temp.data), AJAX_NS );\n\n item.finished = true;\n\n _removeAjaxCursor();\n\n mfp._setFocus();\n\n setTimeout(function() {\n mfp.wrap.addClass(READY_CLASS);\n }, 16);\n\n mfp.updateStatus('ready');\n\n _mfpTrigger('AjaxContentAdded');\n },\n error: function() {\n _removeAjaxCursor();\n item.finished = item.loadError = true;\n mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src));\n }\n }, mfp.st.ajax.settings);\n\n mfp.req = $.ajax(opts);\n\n return '';\n }\n }\n});\n\n\n\n\n\n\n\n/*>>ajax*/\n\n/*>>image*/\nvar _imgInterval,\n _getTitle = function(item) {\n if(item.data && item.data.title !== undefined)\n return item.data.title;\n\n var src = mfp.st.image.titleSrc;\n\n if(src) {\n if($.isFunction(src)) {\n return src.call(mfp, item);\n } else if(item.el) {\n return item.el.attr(src) || '';\n }\n }\n return '';\n };\n\n$.magnificPopup.registerModule('image', {\n\n options: {\n markup: '
',\n cursor: 'mfp-zoom-out-cur',\n titleSrc: 'title',\n verticalFit: true,\n tError: '
The image could not be loaded.'\n },\n\n proto: {\n initImage: function() {\n var imgSt = mfp.st.image,\n ns = '.image';\n\n mfp.types.push('image');\n\n _mfpOn(OPEN_EVENT+ns, function() {\n if(mfp.currItem.type === 'image' && imgSt.cursor) {\n $(document.body).addClass(imgSt.cursor);\n }\n });\n\n _mfpOn(CLOSE_EVENT+ns, function() {\n if(imgSt.cursor) {\n $(document.body).removeClass(imgSt.cursor);\n }\n _window.off('resize' + EVENT_NS);\n });\n\n _mfpOn('Resize'+ns, mfp.resizeImage);\n if(mfp.isLowIE) {\n _mfpOn('AfterChange', mfp.resizeImage);\n }\n },\n resizeImage: function() {\n var item = mfp.currItem;\n if(!item || !item.img) return;\n\n if(mfp.st.image.verticalFit) {\n var decr = 0;\n // fix box-sizing in ie7/8\n if(mfp.isLowIE) {\n decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10);\n }\n item.img.css('max-height', mfp.wH-decr);\n }\n },\n _onImageHasSize: function(item) {\n if(item.img) {\n\n item.hasSize = true;\n\n if(_imgInterval) {\n clearInterval(_imgInterval);\n }\n\n item.isCheckingImgSize = false;\n\n _mfpTrigger('ImageHasSize', item);\n\n if(item.imgHidden) {\n if(mfp.content)\n mfp.content.removeClass('mfp-loading');\n\n item.imgHidden = false;\n }\n\n }\n },\n\n /**\n * Function that loops until the image has size to display elements that rely on it asap\n */\n findImageSize: function(item) {\n\n var counter = 0,\n img = item.img[0],\n mfpSetInterval = function(delay) {\n\n if(_imgInterval) {\n clearInterval(_imgInterval);\n }\n // decelerating interval that checks for size of an image\n _imgInterval = setInterval(function() {\n if(img.naturalWidth > 0) {\n mfp._onImageHasSize(item);\n return;\n }\n\n if(counter > 200) {\n clearInterval(_imgInterval);\n }\n\n counter++;\n if(counter === 3) {\n mfpSetInterval(10);\n } else if(counter === 40) {\n mfpSetInterval(50);\n } else if(counter === 100) {\n mfpSetInterval(500);\n }\n }, delay);\n };\n\n mfpSetInterval(1);\n },\n\n getImage: function(item, template) {\n\n var guard = 0,\n\n // image load complete handler\n onLoadComplete = function() {\n if(item) {\n if (item.img[0].complete) {\n item.img.off('.mfploader');\n\n if(item === mfp.currItem){\n mfp._onImageHasSize(item);\n\n mfp.updateStatus('ready');\n }\n\n item.hasSize = true;\n item.loaded = true;\n\n _mfpTrigger('ImageLoadComplete');\n\n }\n else {\n // if image complete check fails 200 times (20 sec), we assume that there was an error.\n guard++;\n if(guard < 200) {\n setTimeout(onLoadComplete,100);\n } else {\n onLoadError();\n }\n }\n }\n },\n\n // image error handler\n onLoadError = function() {\n if(item) {\n item.img.off('.mfploader');\n if(item === mfp.currItem){\n mfp._onImageHasSize(item);\n mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );\n }\n\n item.hasSize = true;\n item.loaded = true;\n item.loadError = true;\n }\n },\n imgSt = mfp.st.image;\n\n\n var el = template.find('.mfp-img');\n if(el.length) {\n var img = document.createElement('img');\n img.className = 'mfp-img';\n if(item.el && item.el.find('img').length) {\n img.alt = item.el.find('img').attr('alt');\n }\n item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError);\n img.src = item.src;\n\n // without clone() \"error\" event is not firing when IMG is replaced by new IMG\n // TODO: find a way to avoid such cloning\n if(el.is('img')) {\n item.img = item.img.clone();\n }\n\n img = item.img[0];\n if(img.naturalWidth > 0) {\n item.hasSize = true;\n } else if(!img.width) {\n item.hasSize = false;\n }\n }\n\n mfp._parseMarkup(template, {\n title: _getTitle(item),\n img_replaceWith: item.img\n }, item);\n\n mfp.resizeImage();\n\n if(item.hasSize) {\n if(_imgInterval) clearInterval(_imgInterval);\n\n if(item.loadError) {\n template.addClass('mfp-loading');\n mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );\n } else {\n template.removeClass('mfp-loading');\n mfp.updateStatus('ready');\n }\n return template;\n }\n\n mfp.updateStatus('loading');\n item.loading = true;\n\n if(!item.hasSize) {\n item.imgHidden = true;\n template.addClass('mfp-loading');\n mfp.findImageSize(item);\n }\n\n return template;\n }\n }\n});\n\n\n\n/*>>image*/\n\n/*>>zoom*/\nvar hasMozTransform,\n getHasMozTransform = function() {\n if(hasMozTransform === undefined) {\n hasMozTransform = document.createElement('p').style.MozTransform !== undefined;\n }\n return hasMozTransform;\n };\n\n$.magnificPopup.registerModule('zoom', {\n\n options: {\n enabled: false,\n easing: 'ease-in-out',\n duration: 300,\n opener: function(element) {\n return element.is('img') ? element : element.find('img');\n }\n },\n\n proto: {\n\n initZoom: function() {\n var zoomSt = mfp.st.zoom,\n ns = '.zoom',\n image;\n\n if(!zoomSt.enabled || !mfp.supportsTransition) {\n return;\n }\n\n var duration = zoomSt.duration,\n getElToAnimate = function(image) {\n var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'),\n transition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing,\n cssObj = {\n position: 'fixed',\n zIndex: 9999,\n left: 0,\n top: 0,\n '-webkit-backface-visibility': 'hidden'\n },\n t = 'transition';\n\n cssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition;\n\n newImg.css(cssObj);\n return newImg;\n },\n showMainContent = function() {\n mfp.content.css('visibility', 'visible');\n },\n openTimeout,\n animatedImg;\n\n _mfpOn('BuildControls'+ns, function() {\n if(mfp._allowZoom()) {\n\n clearTimeout(openTimeout);\n mfp.content.css('visibility', 'hidden');\n\n // Basically, all code below does is clones existing image, puts in on top of the current one and animated it\n\n image = mfp._getItemToZoom();\n\n if(!image) {\n showMainContent();\n return;\n }\n\n animatedImg = getElToAnimate(image);\n\n animatedImg.css( mfp._getOffset() );\n\n mfp.wrap.append(animatedImg);\n\n openTimeout = setTimeout(function() {\n animatedImg.css( mfp._getOffset( true ) );\n openTimeout = setTimeout(function() {\n\n showMainContent();\n\n setTimeout(function() {\n animatedImg.remove();\n image = animatedImg = null;\n _mfpTrigger('ZoomAnimationEnded');\n }, 16); // avoid blink when switching images\n\n }, duration); // this timeout equals animation duration\n\n }, 16); // by adding this timeout we avoid short glitch at the beginning of animation\n\n\n // Lots of timeouts...\n }\n });\n _mfpOn(BEFORE_CLOSE_EVENT+ns, function() {\n if(mfp._allowZoom()) {\n\n clearTimeout(openTimeout);\n\n mfp.st.removalDelay = duration;\n\n if(!image) {\n image = mfp._getItemToZoom();\n if(!image) {\n return;\n }\n animatedImg = getElToAnimate(image);\n }\n\n\n animatedImg.css( mfp._getOffset(true) );\n mfp.wrap.append(animatedImg);\n mfp.content.css('visibility', 'hidden');\n\n setTimeout(function() {\n animatedImg.css( mfp._getOffset() );\n }, 16);\n }\n\n });\n\n _mfpOn(CLOSE_EVENT+ns, function() {\n if(mfp._allowZoom()) {\n showMainContent();\n if(animatedImg) {\n animatedImg.remove();\n }\n image = null;\n }\n });\n },\n\n _allowZoom: function() {\n return mfp.currItem.type === 'image';\n },\n\n _getItemToZoom: function() {\n if(mfp.currItem.hasSize) {\n return mfp.currItem.img;\n } else {\n return false;\n }\n },\n\n // Get element postion relative to viewport\n _getOffset: function(isLarge) {\n var el;\n if(isLarge) {\n el = mfp.currItem.img;\n } else {\n el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);\n }\n\n var offset = el.offset();\n var paddingTop = parseInt(el.css('padding-top'),10);\n var paddingBottom = parseInt(el.css('padding-bottom'),10);\n offset.top -= ( $(window).scrollTop() - paddingTop );\n\n\n /*\n\n Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa.\n\n */\n var obj = {\n width: el.width(),\n // fix Zepto height+padding issue\n height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop\n };\n\n // I hate to do this, but there is no another option\n if( getHasMozTransform() ) {\n obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)';\n } else {\n obj.left = offset.left;\n obj.top = offset.top;\n }\n return obj;\n }\n\n }\n});\n\n\n\n/*>>zoom*/\n\n/*>>iframe*/\n\nvar IFRAME_NS = 'iframe',\n _emptyPage = '//about:blank',\n\n _fixIframeBugs = function(isShowing) {\n if(mfp.currTemplate[IFRAME_NS]) {\n var el = mfp.currTemplate[IFRAME_NS].find('iframe');\n if(el.length) {\n // reset src after the popup is closed to avoid \"video keeps playing after popup is closed\" bug\n if(!isShowing) {\n el[0].src = _emptyPage;\n }\n\n // IE8 black screen bug fix\n if(mfp.isIE8) {\n el.css('display', isShowing ? 'block' : 'none');\n }\n }\n }\n };\n\n$.magnificPopup.registerModule(IFRAME_NS, {\n\n options: {\n markup: '
',\n\n srcAction: 'iframe_src',\n\n // we don't care and support only one default type of URL by default\n patterns: {\n youtube: {\n index: 'youtube.com',\n id: 'v=',\n src: '//www.youtube.com/embed/%id%?autoplay=1'\n },\n vimeo: {\n index: 'vimeo.com/',\n id: '/',\n src: '//player.vimeo.com/video/%id%?autoplay=1'\n },\n gmaps: {\n index: '//maps.google.',\n src: '%id%&output=embed'\n }\n }\n },\n\n proto: {\n initIframe: function() {\n mfp.types.push(IFRAME_NS);\n\n _mfpOn('BeforeChange', function(e, prevType, newType) {\n if(prevType !== newType) {\n if(prevType === IFRAME_NS) {\n _fixIframeBugs(); // iframe if removed\n } else if(newType === IFRAME_NS) {\n _fixIframeBugs(true); // iframe is showing\n }\n }// else {\n // iframe source is switched, don't do anything\n //}\n });\n\n _mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() {\n _fixIframeBugs();\n });\n },\n\n getIframe: function(item, template) {\n var embedSrc = item.src;\n var iframeSt = mfp.st.iframe;\n\n $.each(iframeSt.patterns, function() {\n if(embedSrc.indexOf( this.index ) > -1) {\n if(this.id) {\n if(typeof this.id === 'string') {\n embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length);\n } else {\n embedSrc = this.id.call( this, embedSrc );\n }\n }\n embedSrc = this.src.replace('%id%', embedSrc );\n return false; // break;\n }\n });\n\n var dataObj = {};\n if(iframeSt.srcAction) {\n dataObj[iframeSt.srcAction] = embedSrc;\n }\n mfp._parseMarkup(template, dataObj, item);\n\n mfp.updateStatus('ready');\n\n return template;\n }\n }\n});\n\n\n\n/*>>iframe*/\n\n/*>>gallery*/\n/**\n * Get looped index depending on number of slides\n */\nvar _getLoopedId = function(index) {\n var numSlides = mfp.items.length;\n if(index > numSlides - 1) {\n return index - numSlides;\n } else if(index < 0) {\n return numSlides + index;\n }\n return index;\n },\n _replaceCurrTotal = function(text, curr, total) {\n return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total);\n };\n\n$.magnificPopup.registerModule('gallery', {\n\n options: {\n enabled: false,\n arrowMarkup: '
',\n preload: [0,2],\n navigateByImgClick: true,\n arrows: true,\n\n tPrev: 'Previous (Left arrow key)',\n tNext: 'Next (Right arrow key)',\n tCounter: '%curr% of %total%'\n },\n\n proto: {\n initGallery: function() {\n\n var gSt = mfp.st.gallery,\n ns = '.mfp-gallery',\n supportsFastClick = Boolean($.fn.mfpFastClick);\n\n mfp.direction = true; // true - next, false - prev\n\n if(!gSt || !gSt.enabled ) return false;\n\n _wrapClasses += ' mfp-gallery';\n\n _mfpOn(OPEN_EVENT+ns, function() {\n\n if(gSt.navigateByImgClick) {\n mfp.wrap.on('click'+ns, '.mfp-img', function() {\n if(mfp.items.length > 1) {\n mfp.next();\n return false;\n }\n });\n }\n\n _document.on('keydown'+ns, function(e) {\n if (e.keyCode === 37) {\n mfp.prev();\n } else if (e.keyCode === 39) {\n mfp.next();\n }\n });\n });\n\n _mfpOn('UpdateStatus'+ns, function(e, data) {\n if(data.text) {\n data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length);\n }\n });\n\n _mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) {\n var l = mfp.items.length;\n values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : '';\n });\n\n _mfpOn('BuildControls' + ns, function() {\n if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) {\n var markup = gSt.arrowMarkup,\n arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS),\n arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS);\n\n var eName = supportsFastClick ? 'mfpFastClick' : 'click';\n arrowLeft[eName](function() {\n mfp.prev();\n });\n arrowRight[eName](function() {\n mfp.next();\n });\n\n // Polyfill for :before and :after (adds elements with classes mfp-a and mfp-b)\n if(mfp.isIE7) {\n _getEl('b', arrowLeft[0], false, true);\n _getEl('a', arrowLeft[0], false, true);\n _getEl('b', arrowRight[0], false, true);\n _getEl('a', arrowRight[0], false, true);\n }\n\n mfp.container.append(arrowLeft.add(arrowRight));\n }\n });\n\n _mfpOn(CHANGE_EVENT+ns, function() {\n if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout);\n\n mfp._preloadTimeout = setTimeout(function() {\n mfp.preloadNearbyImages();\n mfp._preloadTimeout = null;\n }, 16);\n });\n\n\n _mfpOn(CLOSE_EVENT+ns, function() {\n _document.off(ns);\n mfp.wrap.off('click'+ns);\n\n if(mfp.arrowLeft && supportsFastClick) {\n mfp.arrowLeft.add(mfp.arrowRight).destroyMfpFastClick();\n }\n mfp.arrowRight = mfp.arrowLeft = null;\n });\n\n },\n next: function() {\n mfp.direction = true;\n mfp.index = _getLoopedId(mfp.index + 1);\n mfp.updateItemHTML();\n },\n prev: function() {\n mfp.direction = false;\n mfp.index = _getLoopedId(mfp.index - 1);\n mfp.updateItemHTML();\n },\n goTo: function(newIndex) {\n mfp.direction = (newIndex >= mfp.index);\n mfp.index = newIndex;\n mfp.updateItemHTML();\n },\n preloadNearbyImages: function() {\n var p = mfp.st.gallery.preload,\n preloadBefore = Math.min(p[0], mfp.items.length),\n preloadAfter = Math.min(p[1], mfp.items.length),\n i;\n\n for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) {\n mfp._preloadItem(mfp.index+i);\n }\n for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) {\n mfp._preloadItem(mfp.index-i);\n }\n },\n _preloadItem: function(index) {\n index = _getLoopedId(index);\n\n if(mfp.items[index].preloaded) {\n return;\n }\n\n var item = mfp.items[index];\n if(!item.parsed) {\n item = mfp.parseEl( index );\n }\n\n _mfpTrigger('LazyLoad', item);\n\n if(item.type === 'image') {\n item.img = $('
![]()
').on('load.mfploader', function() {\n item.hasSize = true;\n }).on('error.mfploader', function() {\n item.hasSize = true;\n item.loadError = true;\n _mfpTrigger('LazyLoadError', item);\n }).attr('src', item.src);\n }\n\n\n item.preloaded = true;\n }\n }\n});\n\n/*\nTouch Support that might be implemented some day\n\naddSwipeGesture: function() {\n var startX,\n moved,\n multipleTouches;\n\n return;\n\n var namespace = '.mfp',\n addEventNames = function(pref, down, move, up, cancel) {\n mfp._tStart = pref + down + namespace;\n mfp._tMove = pref + move + namespace;\n mfp._tEnd = pref + up + namespace;\n mfp._tCancel = pref + cancel + namespace;\n };\n\n if(window.navigator.msPointerEnabled) {\n addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n } else if('ontouchstart' in window) {\n addEventNames('touch', 'start', 'move', 'end', 'cancel');\n } else {\n return;\n }\n _window.on(mfp._tStart, function(e) {\n var oE = e.originalEvent;\n multipleTouches = moved = false;\n startX = oE.pageX || oE.changedTouches[0].pageX;\n }).on(mfp._tMove, function(e) {\n if(e.originalEvent.touches.length > 1) {\n multipleTouches = e.originalEvent.touches.length;\n } else {\n //e.preventDefault();\n moved = true;\n }\n }).on(mfp._tEnd + ' ' + mfp._tCancel, function(e) {\n if(moved && !multipleTouches) {\n var oE = e.originalEvent,\n diff = startX - (oE.pageX || oE.changedTouches[0].pageX);\n\n if(diff > 20) {\n mfp.next();\n } else if(diff < -20) {\n mfp.prev();\n }\n }\n });\n},\n*/\n\n\n/*>>gallery*/\n\n/*>>retina*/\n\nvar RETINA_NS = 'retina';\n\n$.magnificPopup.registerModule(RETINA_NS, {\n options: {\n replaceSrc: function(item) {\n return item.src.replace(/\\.\\w+$/, function(m) { return '@2x' + m; });\n },\n ratio: 1 // Function or number. Set to 1 to disable.\n },\n proto: {\n initRetina: function() {\n if(window.devicePixelRatio > 1) {\n\n var st = mfp.st.retina,\n ratio = st.ratio;\n\n ratio = !isNaN(ratio) ? ratio : ratio();\n\n if(ratio > 1) {\n _mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) {\n item.img.css({\n 'max-width': item.img[0].naturalWidth / ratio,\n 'width': '100%'\n });\n });\n _mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) {\n item.src = st.replaceSrc(item, ratio);\n });\n }\n }\n\n }\n }\n});\n\n/*>>retina*/\n\n/*>>fastclick*/\n/**\n * FastClick event implementation. (removes 300ms delay on touch devices)\n * Based on https://developers.google.com/mobile/articles/fast_buttons\n *\n * You may use it outside the Magnific Popup by calling just:\n *\n * $('.your-el').mfpFastClick(function() {\n * console.log('Clicked!');\n * });\n *\n * To unbind:\n * $('.your-el').destroyMfpFastClick();\n *\n *\n * Note that it's a very basic and simple implementation, it blocks ghost click on the same element where it was bound.\n * If you need something more advanced, use plugin by FT Labs https://github.com/ftlabs/fastclick\n *\n */\n\n(function() {\n var ghostClickDelay = 1000,\n supportsTouch = 'ontouchstart' in window,\n unbindTouchMove = function() {\n _window.off('touchmove'+ns+' touchend'+ns);\n },\n eName = 'mfpFastClick',\n ns = '.'+eName;\n\n\n // As Zepto.js doesn't have an easy way to add custom events (like jQuery), so we implement it in this way\n $.fn.mfpFastClick = function(callback) {\n\n return $(this).each(function() {\n\n var elem = $(this),\n lock;\n\n if( supportsTouch ) {\n\n var timeout,\n startX,\n startY,\n pointerMoved,\n point,\n numPointers;\n\n elem.on('touchstart' + ns, function(e) {\n pointerMoved = false;\n numPointers = 1;\n\n point = e.originalEvent ? e.originalEvent.touches[0] : e.touches[0];\n startX = point.clientX;\n startY = point.clientY;\n\n _window.on('touchmove'+ns, function(e) {\n point = e.originalEvent ? e.originalEvent.touches : e.touches;\n numPointers = point.length;\n point = point[0];\n if (Math.abs(point.clientX - startX) > 10 ||\n Math.abs(point.clientY - startY) > 10) {\n pointerMoved = true;\n unbindTouchMove();\n }\n }).on('touchend'+ns, function(e) {\n unbindTouchMove();\n if(pointerMoved || numPointers > 1) {\n return;\n }\n lock = true;\n e.preventDefault();\n clearTimeout(timeout);\n timeout = setTimeout(function() {\n lock = false;\n }, ghostClickDelay);\n callback();\n });\n });\n\n }\n\n elem.on('click' + ns, function() {\n if(!lock) {\n callback();\n }\n });\n });\n };\n\n $.fn.destroyMfpFastClick = function() {\n $(this).off('touchstart' + ns + ' click' + ns);\n if(supportsTouch) _window.off('touchmove'+ns+' touchend'+ns);\n };\n})();\n\n/*>>fastclick*/\n _checkInstance(); }));"]}