diff --git a/src/css/swipebox.css b/src/css/swipebox.css index 37d06218..32b16a49 100644 --- a/src/css/swipebox.css +++ b/src/css/swipebox.css @@ -1,295 +1,296 @@ -/*! Swipebox v1.3.0 | Constantin Saguin csag.co | MIT License | github.com/brutaldesign/swipebox */ -html.swipebox-html.swipebox-touch { - overflow: hidden !important; -} - -#swipebox-overlay img { - border: none !important; -} - -#swipebox-overlay { - width: 100%; - height: 100%; - position: fixed; - top: 0; - left: 0; - z-index: 99999 !important; - overflow: hidden; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -#swipebox-container { - position: relative; - width: 100%; - height: 100%; -} - -#swipebox-slider { - -webkit-transition: -webkit-transform 0.4s ease; - transition: transform 0.4s ease; - height: 100%; - left: 0; - top: 0; - width: 100%; - white-space: nowrap; - position: absolute; - display: none; - cursor: pointer; -} -#swipebox-slider .slide { - height: 100%; - width: 100%; - line-height: 1px; - text-align: center; - display: inline-block; -} -#swipebox-slider .slide:before { - content: ""; - display: inline-block; - height: 50%; - width: 1px; - margin-right: -1px; -} -#swipebox-slider .slide img, -#swipebox-slider .slide .swipebox-video-container, -#swipebox-slider .slide .swipebox-inline-container { - display: inline-block; - max-height: 100%; - max-width: 100%; - margin: 0; - padding: 0; - width: auto; - height: auto; - vertical-align: middle; -} -#swipebox-slider .slide .swipebox-video-container { - background: none; - max-width: 1140px; - max-height: 100%; - width: 100%; - padding: 5%; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -#swipebox-slider .slide .swipebox-video-container .swipebox-video { - width: 100%; - height: 0; - padding-bottom: 56.25%; - overflow: hidden; - position: relative; -} -#swipebox-slider .slide .swipebox-video-container .swipebox-video iframe { - width: 100% !important; - height: 100% !important; - position: absolute; - top: 0; - left: 0; -} -#swipebox-slider .slide-loading { - background: url(../img/loader.gif) no-repeat center center; -} - -#swipebox-bottom-bar, -#swipebox-top-bar { - -webkit-transition: 0.5s; - transition: 0.5s; - position: absolute; - left: 0; - z-index: 999; - height: 50px; - width: 100%; -} - -#swipebox-bottom-bar { - bottom: -50px; -} -#swipebox-bottom-bar.visible-bars { - -webkit-transform: translate3d(0, -50px, 0); - transform: translate3d(0, -50px, 0); -} - -#swipebox-top-bar { - top: -50px; -} -#swipebox-top-bar.visible-bars { - -webkit-transform: translate3d(0, 50px, 0); - transform: translate3d(0, 50px, 0); -} - -#swipebox-title { - display: block; - width: 100%; - text-align: center; -} - -#swipebox-prev, -#swipebox-next, -#swipebox-close { - background-image: url(../img/icons.png); - background-repeat: no-repeat; - border: none !important; - text-decoration: none !important; - cursor: pointer; - width: 50px; - height: 50px; - top: 0; -} - -#swipebox-arrows { - display: block; - margin: 0 auto; - width: 100%; - height: 50px; -} - -#swipebox-prev { - background-position: -32px 13px; - float: left; -} - -#swipebox-next { - background-position: -78px 13px; - float: right; -} - -#swipebox-close { - top: 0; - right: 0; - position: absolute; - z-index: 9999; - background-position: 15px 12px; -} - -.swipebox-no-close-button #swipebox-close { - display: none; -} - -#swipebox-prev.disabled, -#swipebox-next.disabled { - opacity: 0.3; -} - -.swipebox-no-touch #swipebox-overlay.rightSpring #swipebox-slider { - -webkit-animation: rightSpring 0.3s; - animation: rightSpring 0.3s; -} -.swipebox-no-touch #swipebox-overlay.leftSpring #swipebox-slider { - -webkit-animation: leftSpring 0.3s; - animation: leftSpring 0.3s; -} - -.swipebox-touch #swipebox-container:before, .swipebox-touch #swipebox-container:after { - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-transition: all .3s ease; - transition: all .3s ease; - content: ' '; - position: absolute; - z-index: 999; - top: 0; - height: 100%; - width: 20px; - opacity: 0; -} -.swipebox-touch #swipebox-container:before { - left: 0; - -webkit-box-shadow: inset 10px 0px 10px -8px #656565; - box-shadow: inset 10px 0px 10px -8px #656565; -} -.swipebox-touch #swipebox-container:after { - right: 0; - -webkit-box-shadow: inset -10px 0px 10px -8px #656565; - box-shadow: inset -10px 0px 10px -8px #656565; -} -.swipebox-touch #swipebox-overlay.leftSpringTouch #swipebox-container:before { - opacity: 1; -} -.swipebox-touch #swipebox-overlay.rightSpringTouch #swipebox-container:after { - opacity: 1; -} - -@-webkit-keyframes rightSpring { - 0% { - left: 0; - } - - 50% { - left: -30px; - } - - 100% { - left: 0; - } -} - -@keyframes rightSpring { - 0% { - left: 0; - } - - 50% { - left: -30px; - } - - 100% { - left: 0; - } -} -@-webkit-keyframes leftSpring { - 0% { - left: 0; - } - - 50% { - left: 30px; - } - - 100% { - left: 0; - } -} -@keyframes leftSpring { - 0% { - left: 0; - } - - 50% { - left: 30px; - } - - 100% { - left: 0; - } -} -@media screen and (min-width: 800px) { - #swipebox-close { - right: 10px; - } - - #swipebox-arrows { - width: 92%; - max-width: 800px; - } -} -/* Skin ---------------------------*/ -#swipebox-overlay { - background: #0d0d0d; -} - -#swipebox-bottom-bar, -#swipebox-top-bar { - text-shadow: 1px 1px 1px black; - background: #000; - opacity: 0.95; -} - -#swipebox-top-bar { - color: white !important; - font-size: 15px; - line-height: 43px; - font-family: Helvetica, Arial, sans-serif; -} +/*! Swipebox v1.3.0 | Constantin Saguin csag.co | MIT License | github.com/brutaldesign/swipebox */ +html.swipebox-html.swipebox-touch { + overflow: hidden !important; +} + +#swipebox-overlay img { + border: none !important; +} + +#swipebox-overlay { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + z-index: 99999 !important; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#swipebox-container { + position: relative; + width: 100%; + height: 100%; +} + +#swipebox-slider { + -webkit-transition: -webkit-transform 0.4s ease; + transition: transform 0.4s ease; + height: 100%; + left: 0; + top: 0; + width: 100%; + white-space: nowrap; + position: absolute; + display: none; + cursor: pointer; +} +#swipebox-slider .slide { + height: 100%; + width: 100%; + line-height: 1px; + text-align: center; + display: inline-block; +} +#swipebox-slider .slide:before { + content: ""; + display: inline-block; + height: 50%; + width: 1px; + margin-right: -1px; +} +#swipebox-slider .slide img, +#swipebox-slider .slide .swipebox-video-container, +#swipebox-slider .slide .swipebox-inline-container { + display: inline-block; + max-height: 100%; + max-width: 100%; + margin: 0; + padding: 0; + width: auto; + height: auto; + vertical-align: middle; +} +#swipebox-slider .slide .swipebox-video-container { + background: none; + max-width: 1140px; + max-height: 100%; + width: 100%; + padding: 5%; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +#swipebox-slider .slide .swipebox-video-container .swipebox-video { + width: 100%; + height: 0; + padding-bottom: 56.25%; + overflow: hidden; + position: relative; +} +#swipebox-slider .slide .swipebox-video-container .swipebox-video iframe { + width: 100% !important; + height: 100% !important; + position: absolute; + top: 0; + left: 0; +} +#swipebox-slider .slide-loading { + background: url(../img/loader.gif) no-repeat center center; +} + +#swipebox-bottom-bar, +#swipebox-top-bar { + -webkit-transition: 0.5s; + transition: 0.5s; + position: absolute; + left: 0; + z-index: 999; + height: 50px; + width: 100%; +} + +#swipebox-bottom-bar { + bottom: -50px; +} +#swipebox-bottom-bar.visible-bars { + -webkit-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); +} + +#swipebox-top-bar { + top: -50px; +} +#swipebox-top-bar.visible-bars { + -webkit-transform: translate3d(0, 50px, 0); + transform: translate3d(0, 50px, 0); +} + +#swipebox-title { + display: block; + width: 100%; + text-align: center; +} + +#swipebox-prev, +#swipebox-next, +#swipebox-close { + background-image: url(../img/icons.png); + background-repeat: no-repeat; + border: none !important; + text-decoration: none !important; + cursor: pointer; + width: 50px; + height: 50px; + top: 0; +} + +#swipebox-arrows { + display: block; + margin: 0 auto; + width: 100%; + height: 50px; +} + +#swipebox-prev { + background-position: -32px 13px; + float: left; +} + +#swipebox-next { + background-position: -78px 13px; + float: right; +} + +#swipebox-close { + top: 0; + right: 0; + position: absolute; + z-index: 9999; + background-position: 15px 12px; + touch-action: none; +} + +.swipebox-no-close-button #swipebox-close { + display: none; +} + +#swipebox-prev.disabled, +#swipebox-next.disabled { + opacity: 0.3; +} + +.swipebox-no-touch #swipebox-overlay.rightSpring #swipebox-slider { + -webkit-animation: rightSpring 0.3s; + animation: rightSpring 0.3s; +} +.swipebox-no-touch #swipebox-overlay.leftSpring #swipebox-slider { + -webkit-animation: leftSpring 0.3s; + animation: leftSpring 0.3s; +} + +.swipebox-touch #swipebox-container:before, .swipebox-touch #swipebox-container:after { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transition: all .3s ease; + transition: all .3s ease; + content: ' '; + position: absolute; + z-index: 999; + top: 0; + height: 100%; + width: 20px; + opacity: 0; +} +.swipebox-touch #swipebox-container:before { + left: 0; + -webkit-box-shadow: inset 10px 0px 10px -8px #656565; + box-shadow: inset 10px 0px 10px -8px #656565; +} +.swipebox-touch #swipebox-container:after { + right: 0; + -webkit-box-shadow: inset -10px 0px 10px -8px #656565; + box-shadow: inset -10px 0px 10px -8px #656565; +} +.swipebox-touch #swipebox-overlay.leftSpringTouch #swipebox-container:before { + opacity: 1; +} +.swipebox-touch #swipebox-overlay.rightSpringTouch #swipebox-container:after { + opacity: 1; +} + +@-webkit-keyframes rightSpring { + 0% { + left: 0; + } + + 50% { + left: -30px; + } + + 100% { + left: 0; + } +} + +@keyframes rightSpring { + 0% { + left: 0; + } + + 50% { + left: -30px; + } + + 100% { + left: 0; + } +} +@-webkit-keyframes leftSpring { + 0% { + left: 0; + } + + 50% { + left: 30px; + } + + 100% { + left: 0; + } +} +@keyframes leftSpring { + 0% { + left: 0; + } + + 50% { + left: 30px; + } + + 100% { + left: 0; + } +} +@media screen and (min-width: 800px) { + #swipebox-close { + right: 10px; + } + + #swipebox-arrows { + width: 92%; + max-width: 800px; + } +} +/* Skin +--------------------------*/ +#swipebox-overlay { + background: #0d0d0d; +} + +#swipebox-bottom-bar, +#swipebox-top-bar { + text-shadow: 1px 1px 1px black; + background: #000; + opacity: 0.95; +} + +#swipebox-top-bar { + color: white !important; + font-size: 15px; + line-height: 43px; + font-family: Helvetica, Arial, sans-serif; +} \ No newline at end of file diff --git a/src/js/jquery.swipebox.js b/src/js/jquery.swipebox.js index f2fd0155..7246b072 100644 --- a/src/js/jquery.swipebox.js +++ b/src/js/jquery.swipebox.js @@ -1,958 +1,959 @@ -/*! Swipebox v1.4.4 | Constantin Saguin csag.co | MIT License | github.com/brutaldesign/swipebox */ - -;( function ( window, document, $, undefined ) { - - $.swipebox = function( elem, options ) { - - // Default options - var ui, - defaults = { - useCSS : true, - useSVG : true, - initialIndexOnArray : 0, - removeBarsOnMobile : true, - hideCloseButtonOnMobile : false, - hideBarsDelay : 3000, - videoMaxWidth : 1140, - vimeoColor : 'cccccc', - beforeOpen: null, - afterOpen: null, - afterClose: null, - afterMedia: null, - nextSlide: null, - prevSlide: null, - loopAtEnd: false, - autoplayVideos: false, - queryStringData: {}, - toggleClassOnLoad: '' - }, - - plugin = this, - elements = [], // slides array [ { href:'...', title:'...' }, ...], - $elem, - selector = elem.selector, - isMobile = navigator.userAgent.match( /(iPad)|(iPhone)|(iPod)|(Android)|(PlayBook)|(BB10)|(BlackBerry)|(Opera Mini)|(IEMobile)|(webOS)|(MeeGo)/i ), - isTouch = isMobile !== null || document.createTouch !== undefined || ( 'ontouchstart' in window ) || ( 'onmsgesturechange' in window ) || navigator.msMaxTouchPoints, - supportSVG = !! document.createElementNS && !! document.createElementNS( 'http://www.w3.org/2000/svg', 'svg').createSVGRect, - winWidth = window.innerWidth ? window.innerWidth : $( window ).width(), - winHeight = window.innerHeight ? window.innerHeight : $( window ).height(), - currentX = 0, - /* jshint multistr: true */ - html = '
\ -
\ -
\ -
\ -
\ -
\ -
\ -
\ - \ - \ -
\ -
\ - \ -
\ -
'; - - plugin.settings = {}; - - $.swipebox.close = function () { - ui.closeSlide(); - }; - - $.swipebox.extend = function () { - return ui; - }; - - plugin.init = function() { - - plugin.settings = $.extend( {}, defaults, options ); - - if ( $.isArray( elem ) ) { - - elements = elem; - ui.target = $( window ); - ui.init( plugin.settings.initialIndexOnArray ); - - } else { - - $( document ).on( 'click', selector, function( event ) { - - // console.log( isTouch ); - - if ( event.target.parentNode.className === 'slide current' ) { - - return false; - } - - if ( ! $.isArray( elem ) ) { - ui.destroy(); - $elem = $( selector ); - ui.actions(); - } - - elements = []; - var index, relType, relVal; - - // Allow for HTML5 compliant attribute before legacy use of rel - if ( ! relVal ) { - relType = 'data-rel'; - relVal = $( this ).attr( relType ); - } - - if ( ! relVal ) { - relType = 'rel'; - relVal = $( this ).attr( relType ); - } - - if ( relVal && relVal !== '' && relVal !== 'nofollow' ) { - $elem = $( selector ).filter( '[' + relType + '="' + relVal + '"]' ); - } else { - $elem = $( selector ); - } - - $elem.each( function() { - - var title = null, - href = null; - - if ( $( this ).attr( 'title' ) ) { - title = $( this ).attr( 'title' ); - } - - - if ( $( this ).attr( 'href' ) ) { - href = $( this ).attr( 'href' ); - } - - elements.push( { - href: href, - title: title - } ); - } ); - - index = $elem.index( $( this ) ); - event.preventDefault(); - event.stopPropagation(); - ui.target = $( event.target ); - ui.init( index ); - } ); - } - }; - - ui = { - - /** - * Initiate Swipebox - */ - init : function( index ) { - if ( plugin.settings.beforeOpen ) { - plugin.settings.beforeOpen(); - } - this.target.trigger( 'swipebox-start' ); - $.swipebox.isOpen = true; - this.build(); - this.openSlide( index ); - this.openMedia( index ); - this.preloadMedia( index+1 ); - this.preloadMedia( index-1 ); - if ( plugin.settings.afterOpen ) { - plugin.settings.afterOpen(index); - } - }, - - /** - * Built HTML containers and fire main functions - */ - build : function () { - var $this = this, bg; - - $( 'body' ).append( html ); - - if ( supportSVG && plugin.settings.useSVG === true ) { - bg = $( '#swipebox-close' ).css( 'background-image' ); - bg = bg.replace( 'png', 'svg' ); - $( '#swipebox-prev, #swipebox-next, #swipebox-close' ).css( { - 'background-image' : bg - } ); - } - - if ( isMobile && plugin.settings.removeBarsOnMobile ) { - $( '#swipebox-bottom-bar, #swipebox-top-bar' ).remove(); - } - - $.each( elements, function() { - $( '#swipebox-slider' ).append( '
' ); - } ); - - $this.setDim(); - $this.actions(); - - if ( isTouch ) { - $this.gesture(); - } - - // Devices can have both touch and keyboard input so always allow key events - $this.keyboard(); - - $this.animBars(); - $this.resize(); - - }, - - /** - * Set dimensions depending on windows width and height - */ - setDim : function () { - - var width, height, sliderCss = {}; - - // Reset dimensions on mobile orientation change - if ( 'onorientationchange' in window ) { - - window.addEventListener( 'orientationchange', function() { - if ( window.orientation === 0 ) { - width = winWidth; - height = winHeight; - } else if ( window.orientation === 90 || window.orientation === -90 ) { - width = winHeight; - height = winWidth; - } - }, false ); - - - } else { - - width = window.innerWidth ? window.innerWidth : $( window ).width(); - height = window.innerHeight ? window.innerHeight : $( window ).height(); - } - - sliderCss = { - width : width, - height : height - }; - - $( '#swipebox-overlay' ).css( sliderCss ); - - }, - - /** - * Reset dimensions on window resize envent - */ - resize : function () { - var $this = this; - - $( window ).resize( function() { - $this.setDim(); - } ).resize(); - }, - - /** - * Check if device supports CSS transitions - */ - supportTransition : function () { - - var prefixes = 'transition WebkitTransition MozTransition OTransition msTransition KhtmlTransition'.split( ' ' ), - i; - - for ( i = 0; i < prefixes.length; i++ ) { - if ( document.createElement( 'div' ).style[ prefixes[i] ] !== undefined ) { - return prefixes[i]; - } - } - return false; - }, - - /** - * Check if CSS transitions are allowed (options + devicesupport) - */ - doCssTrans : function () { - if ( plugin.settings.useCSS && this.supportTransition() ) { - return true; - } - }, - - /** - * Touch navigation - */ - gesture : function () { - - var $this = this, - index, - hDistance, - vDistance, - hDistanceLast, - vDistanceLast, - hDistancePercent, - vSwipe = false, - hSwipe = false, - hSwipMinDistance = 10, - vSwipMinDistance = 50, - startCoords = {}, - endCoords = {}, - bars = $( '#swipebox-top-bar, #swipebox-bottom-bar' ), - slider = $( '#swipebox-slider' ); - - bars.addClass( 'visible-bars' ); - $this.setTimeout(); - - $( 'body' ).bind( 'touchstart', function( event ) { - - $( this ).addClass( 'touching' ); - index = $( '#swipebox-slider .slide' ).index( $( '#swipebox-slider .slide.current' ) ); - endCoords = event.originalEvent.targetTouches[0]; - startCoords.pageX = event.originalEvent.targetTouches[0].pageX; - startCoords.pageY = event.originalEvent.targetTouches[0].pageY; - - $( '#swipebox-slider' ).css( { - '-webkit-transform' : 'translate3d(' + currentX +'%, 0, 0)', - 'transform' : 'translate3d(' + currentX + '%, 0, 0)' - } ); - - $( '.touching' ).bind( 'touchmove',function( event ) { - event.preventDefault(); - event.stopPropagation(); - endCoords = event.originalEvent.targetTouches[0]; - - if ( ! hSwipe ) { - vDistanceLast = vDistance; - vDistance = endCoords.pageY - startCoords.pageY; - if ( Math.abs( vDistance ) >= vSwipMinDistance || vSwipe ) { - var opacity = 0.75 - Math.abs(vDistance) / slider.height(); - - slider.css( { 'top': vDistance + 'px' } ); - slider.css( { 'opacity': opacity } ); - - vSwipe = true; - } - } - - hDistanceLast = hDistance; - hDistance = endCoords.pageX - startCoords.pageX; - hDistancePercent = hDistance * 100 / winWidth; - - if ( ! hSwipe && ! vSwipe && Math.abs( hDistance ) >= hSwipMinDistance ) { - $( '#swipebox-slider' ).css( { - '-webkit-transition' : '', - 'transition' : '' - } ); - hSwipe = true; - } - - if ( hSwipe ) { - - // swipe left - if ( 0 < hDistance ) { - - // first slide - if ( 0 === index ) { - // console.log( 'first' ); - $( '#swipebox-overlay' ).addClass( 'leftSpringTouch' ); - } else { - // Follow gesture - $( '#swipebox-overlay' ).removeClass( 'leftSpringTouch' ).removeClass( 'rightSpringTouch' ); - $( '#swipebox-slider' ).css( { - '-webkit-transform' : 'translate3d(' + ( currentX + hDistancePercent ) +'%, 0, 0)', - 'transform' : 'translate3d(' + ( currentX + hDistancePercent ) + '%, 0, 0)' - } ); - } - - // swipe rught - } else if ( 0 > hDistance ) { - - // last Slide - if ( elements.length === index +1 ) { - // console.log( 'last' ); - $( '#swipebox-overlay' ).addClass( 'rightSpringTouch' ); - } else { - $( '#swipebox-overlay' ).removeClass( 'leftSpringTouch' ).removeClass( 'rightSpringTouch' ); - $( '#swipebox-slider' ).css( { - '-webkit-transform' : 'translate3d(' + ( currentX + hDistancePercent ) +'%, 0, 0)', - 'transform' : 'translate3d(' + ( currentX + hDistancePercent ) + '%, 0, 0)' - } ); - } - - } - } - } ); - - return false; - - } ).bind( 'touchend',function( event ) { - event.preventDefault(); - event.stopPropagation(); - - $( '#swipebox-slider' ).css( { - '-webkit-transition' : '-webkit-transform 0.4s ease', - 'transition' : 'transform 0.4s ease' - } ); - - vDistance = endCoords.pageY - startCoords.pageY; - hDistance = endCoords.pageX - startCoords.pageX; - hDistancePercent = hDistance*100/winWidth; - - // Swipe to bottom to close - if ( vSwipe ) { - vSwipe = false; - if ( Math.abs( vDistance ) >= 2 * vSwipMinDistance && Math.abs( vDistance ) > Math.abs( vDistanceLast ) ) { - var vOffset = vDistance > 0 ? slider.height() : - slider.height(); - slider.animate( { top: vOffset + 'px', 'opacity': 0 }, - 300, - function () { - $this.closeSlide(); - } ); - } else { - slider.animate( { top: 0, 'opacity': 1 }, 300 ); - } - - } else if ( hSwipe ) { - - hSwipe = false; - - // swipeLeft - if( hDistance >= hSwipMinDistance && hDistance >= hDistanceLast) { - - $this.getPrev(); - - // swipeRight - } else if ( hDistance <= -hSwipMinDistance && hDistance <= hDistanceLast) { - - $this.getNext(); - } - - } else { // Top and bottom bars have been removed on touchable devices - // tap - if ( ! bars.hasClass( 'visible-bars' ) ) { - $this.showBars(); - $this.setTimeout(); - } else { - $this.clearTimeout(); - $this.hideBars(); - } - } - - $( '#swipebox-slider' ).css( { - '-webkit-transform' : 'translate3d(' + currentX + '%, 0, 0)', - 'transform' : 'translate3d(' + currentX + '%, 0, 0)' - } ); - - $( '#swipebox-overlay' ).removeClass( 'leftSpringTouch' ).removeClass( 'rightSpringTouch' ); - $( '.touching' ).off( 'touchmove' ).removeClass( 'touching' ); - - } ); - }, - - /** - * Set timer to hide the action bars - */ - setTimeout: function () { - if ( plugin.settings.hideBarsDelay > 0 ) { - var $this = this; - $this.clearTimeout(); - $this.timeout = window.setTimeout( function() { - $this.hideBars(); - }, - - plugin.settings.hideBarsDelay - ); - } - }, - - /** - * Clear timer - */ - clearTimeout: function () { - window.clearTimeout( this.timeout ); - this.timeout = null; - }, - - /** - * Show navigation and title bars - */ - showBars : function () { - var bars = $( '#swipebox-top-bar, #swipebox-bottom-bar' ); - if ( this.doCssTrans() ) { - bars.addClass( 'visible-bars' ); - } else { - $( '#swipebox-top-bar' ).animate( { top : 0 }, 500 ); - $( '#swipebox-bottom-bar' ).animate( { bottom : 0 }, 500 ); - setTimeout( function() { - bars.addClass( 'visible-bars' ); - }, 1000 ); - } - }, - - /** - * Hide navigation and title bars - */ - hideBars : function () { - var bars = $( '#swipebox-top-bar, #swipebox-bottom-bar' ); - if ( this.doCssTrans() ) { - bars.removeClass( 'visible-bars' ); - } else { - $( '#swipebox-top-bar' ).animate( { top : '-50px' }, 500 ); - $( '#swipebox-bottom-bar' ).animate( { bottom : '-50px' }, 500 ); - setTimeout( function() { - bars.removeClass( 'visible-bars' ); - }, 1000 ); - } - }, - - /** - * Animate navigation and top bars - */ - animBars : function () { - var $this = this, - bars = $( '#swipebox-top-bar, #swipebox-bottom-bar' ); - - bars.addClass( 'visible-bars' ); - $this.setTimeout(); - - $( '#swipebox-slider' ).click( function() { - if ( ! bars.hasClass( 'visible-bars' ) ) { - $this.showBars(); - $this.setTimeout(); - } - } ); - - $( '#swipebox-bottom-bar' ).hover( function() { - $this.showBars(); - bars.addClass( 'visible-bars' ); - $this.clearTimeout(); - - }, function() { - if ( plugin.settings.hideBarsDelay > 0 ) { - bars.removeClass( 'visible-bars' ); - $this.setTimeout(); - } - - } ); - }, - - /** - * Keyboard navigation - */ - keyboard : function () { - var $this = this; - $( window ).bind( 'keyup', function( event ) { - event.preventDefault(); - event.stopPropagation(); - - if ( event.keyCode === 37 ) { - - $this.getPrev(); - - } else if ( event.keyCode === 39 ) { - - $this.getNext(); - - } else if ( event.keyCode === 27 ) { - - $this.closeSlide(); - } - } ); - }, - - /** - * Navigation events : go to next slide, go to prevous slide and close - */ - actions : function () { - var $this = this, - action = 'touchend click'; // Just detect for both event types to allow for multi-input - - if ( elements.length < 2 ) { - - $( '#swipebox-bottom-bar' ).hide(); - - if ( undefined === elements[ 1 ] ) { - $( '#swipebox-top-bar' ).hide(); - } - - } else { - $( '#swipebox-prev' ).bind( action, function( event ) { - event.preventDefault(); - event.stopPropagation(); - $this.getPrev(); - $this.setTimeout(); - } ); - - $( '#swipebox-next' ).bind( action, function( event ) { - event.preventDefault(); - event.stopPropagation(); - $this.getNext(); - $this.setTimeout(); - } ); - } - - $( '#swipebox-close' ).bind( action, function() { - $this.closeSlide(); - } ); - }, - - /** - * Set current slide - */ - setSlide : function ( index, isFirst ) { - - isFirst = isFirst || false; - - var slider = $( '#swipebox-slider' ); - - currentX = -index*100; - - if ( this.doCssTrans() ) { - slider.css( { - '-webkit-transform' : 'translate3d(' + (-index*100)+'%, 0, 0)', - 'transform' : 'translate3d(' + (-index*100)+'%, 0, 0)' - } ); - } else { - slider.animate( { left : ( -index*100 )+'%' } ); - } - - $( '#swipebox-slider .slide' ).removeClass( 'current' ); - $( '#swipebox-slider .slide' ).eq( index ).addClass( 'current' ); - this.setTitle( index ); - - if ( isFirst ) { - slider.fadeIn(); - } - - $( '#swipebox-prev, #swipebox-next' ).removeClass( 'disabled' ); - - if ( index === 0 ) { - $( '#swipebox-prev' ).addClass( 'disabled' ); - } else if ( index === elements.length - 1 && plugin.settings.loopAtEnd !== true ) { - $( '#swipebox-next' ).addClass( 'disabled' ); - } - }, - - /** - * Open slide - */ - openSlide : function ( index ) { - $( 'html' ).addClass( 'swipebox-html' ); - if ( isTouch ) { - $( 'html' ).addClass( 'swipebox-touch' ); - - if ( plugin.settings.hideCloseButtonOnMobile ) { - $( 'html' ).addClass( 'swipebox-no-close-button' ); - } - } else { - $( 'html' ).addClass( 'swipebox-no-touch' ); - } - $( window ).trigger( 'resize' ); // fix scroll bar visibility on desktop - this.setSlide( index, true ); - }, - - /** - * Set a time out if the media is a video - */ - preloadMedia : function ( index ) { - var $this = this, - src = null; - - if ( elements[ index ] !== undefined ) { - src = elements[ index ].href; - } - - if ( ! $this.isVideo( src ) ) { - setTimeout( function() { - $this.openMedia( index ); - }, 1000); - } else { - $this.openMedia( index ); - } - }, - - /** - * Open - */ - openMedia : function ( index ) { - var $this = this, - src, - slide; - - if ( elements[ index ] !== undefined ) { - src = elements[ index ].href; - } - - if ( index < 0 || index >= elements.length ) { - return false; - } - - slide = $( '#swipebox-slider .slide' ).eq( index ); - - if ( ! $this.isVideo( src ) ) { - slide.addClass( 'slide-loading' ); - $this.loadMedia( src, function() { - slide.removeClass( 'slide-loading' ); - slide.html( this ); - - if ( plugin.settings.afterMedia ) { - plugin.settings.afterMedia( index ); - } - } ); - } else { - slide.html( $this.getVideo( src ) ); - - if ( plugin.settings.afterMedia ) { - plugin.settings.afterMedia( index ); - } - } - - }, - - /** - * Set link title attribute as caption - */ - setTitle : function ( index ) { - var title = null; - - $( '#swipebox-title' ).empty(); - - if ( elements[ index ] !== undefined ) { - title = elements[ index ].title; - } - - if ( title ) { - $( '#swipebox-top-bar' ).show(); - $( '#swipebox-title' ).append( title ); - } else { - $( '#swipebox-top-bar' ).hide(); - } - }, - - /** - * Check if the URL is a video - */ - isVideo : function ( src ) { - - if ( src ) { - if ( src.match( /(youtube\.com|youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/) || src.match( /vimeo\.com\/([0-9]*)/ ) || src.match( /youtu\.be\/([a-zA-Z0-9\-_]+)/ ) ) { - return true; - } - - if ( src.toLowerCase().indexOf( 'swipeboxvideo=1' ) >= 0 ) { - - return true; - } - } - - }, - - /** - * Parse URI querystring and: - * - overrides value provided via dictionary - * - rebuild it again returning a string - */ - parseUri : function (uri, customData) { - var a = document.createElement('a'), - qs = {}; - - // Decode the URI - a.href = decodeURIComponent( uri ); - - // QueryString to Object - if ( a.search ) { - qs = JSON.parse( '{"' + a.search.toLowerCase().replace('?','').replace(/&/g,'","').replace(/=/g,'":"') + '"}' ); - } - - // Extend with custom data - if ( $.isPlainObject( customData ) ) { - qs = $.extend( qs, customData, plugin.settings.queryStringData ); // The dev has always the final word - } - - // Return querystring as a string - return $ - .map( qs, function (val, key) { - if ( val && val > '' ) { - return encodeURIComponent( key ) + '=' + encodeURIComponent( val ); - } - }) - .join('&'); - }, - - /** - * Get video iframe code from URL - */ - getVideo : function( url ) { - var iframe = '', - youtubeUrl = url.match( /((?:www\.)?youtube\.com|(?:www\.)?youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/ ), - youtubeShortUrl = url.match(/(?:www\.)?youtu\.be\/([a-zA-Z0-9\-_]+)/), - vimeoUrl = url.match( /(?:www\.)?vimeo\.com\/([0-9]*)/ ), - qs = ''; - if ( youtubeUrl || youtubeShortUrl) { - if ( youtubeShortUrl ) { - youtubeUrl = youtubeShortUrl; - } - qs = ui.parseUri( url, { - 'autoplay' : ( plugin.settings.autoplayVideos ? '1' : '0' ), - 'v' : '' - }); - iframe = ''; - - } else if ( vimeoUrl ) { - qs = ui.parseUri( url, { - 'autoplay' : ( plugin.settings.autoplayVideos ? '1' : '0' ), - 'byline' : '0', - 'portrait' : '0', - 'color': plugin.settings.vimeoColor - }); - iframe = ''; - - } else { - iframe = ''; - } - - return '
' + iframe + '
'; - }, - - /** - * Load image - */ - loadMedia : function ( src, callback ) { - // Inline content - if ( src.trim().indexOf('#') === 0 ) { - callback.call( - $('
', { - 'class' : 'swipebox-inline-container' - }) - .append( - $(src) - .clone() - .toggleClass( plugin.settings.toggleClassOnLoad ) - ) - ); - } - // Everything else - else { - if ( ! this.isVideo( src ) ) { - var img = $( '' ).on( 'load', function() { - callback.call( img ); - } ); - - img.attr( 'src', src ); - } - } - }, - - /** - * Get next slide - */ - getNext : function () { - var $this = this, - src, - index = $( '#swipebox-slider .slide' ).index( $( '#swipebox-slider .slide.current' ) ); - if ( index + 1 < elements.length ) { - - src = $( '#swipebox-slider .slide' ).eq( index ).contents().find( 'iframe' ).attr( 'src' ); - $( '#swipebox-slider .slide' ).eq( index ).contents().find( 'iframe' ).attr( 'src', src ); - index++; - $this.setSlide( index ); - $this.preloadMedia( index+1 ); - if ( plugin.settings.nextSlide ) { - plugin.settings.nextSlide(index); - } - } else { - - if ( plugin.settings.loopAtEnd === true ) { - src = $( '#swipebox-slider .slide' ).eq( index ).contents().find( 'iframe' ).attr( 'src' ); - $( '#swipebox-slider .slide' ).eq( index ).contents().find( 'iframe' ).attr( 'src', src ); - index = 0; - $this.preloadMedia( index ); - $this.setSlide( index ); - $this.preloadMedia( index + 1 ); - if ( plugin.settings.nextSlide ) { - plugin.settings.nextSlide(index); - } - } else { - $( '#swipebox-overlay' ).addClass( 'rightSpring' ); - setTimeout( function() { - $( '#swipebox-overlay' ).removeClass( 'rightSpring' ); - }, 500 ); - } - } - }, - - /** - * Get previous slide - */ - getPrev : function () { - var index = $( '#swipebox-slider .slide' ).index( $( '#swipebox-slider .slide.current' ) ), - src; - if ( index > 0 ) { - src = $( '#swipebox-slider .slide' ).eq( index ).contents().find( 'iframe').attr( 'src' ); - $( '#swipebox-slider .slide' ).eq( index ).contents().find( 'iframe' ).attr( 'src', src ); - index--; - this.setSlide( index ); - this.preloadMedia( index-1 ); - if ( plugin.settings.prevSlide ) { - plugin.settings.prevSlide(index); - } - } else { - $( '#swipebox-overlay' ).addClass( 'leftSpring' ); - setTimeout( function() { - $( '#swipebox-overlay' ).removeClass( 'leftSpring' ); - }, 500 ); - } - }, - /* jshint unused:false */ - nextSlide : function ( index ) { - // Callback for next slide - }, - - prevSlide : function ( index ) { - // Callback for prev slide - }, - - /** - * Close - */ - closeSlide : function () { - $( 'html' ).removeClass( 'swipebox-html' ); - $( 'html' ).removeClass( 'swipebox-touch' ); - $( window ).trigger( 'resize' ); - this.destroy(); - }, - - /** - * Destroy the whole thing - */ - destroy : function () { - $( window ).unbind( 'keyup' ); - $( 'body' ).unbind( 'touchstart' ); - $( 'body' ).unbind( 'touchmove' ); - $( 'body' ).unbind( 'touchend' ); - $( '#swipebox-slider' ).unbind(); - $( '#swipebox-overlay' ).remove(); - - if ( ! $.isArray( elem ) ) { - elem.removeData( '_swipebox' ); - } - - if ( this.target ) { - this.target.trigger( 'swipebox-destroy' ); - } - - $.swipebox.isOpen = false; - - if ( plugin.settings.afterClose ) { - plugin.settings.afterClose(); - } - } - }; - - plugin.init(); - }; - - $.fn.swipebox = function( options ) { - - if ( ! $.data( this, '_swipebox' ) ) { - var swipebox = new $.swipebox( this, options ); - this.data( '_swipebox', swipebox ); - } - return this.data( '_swipebox' ); - - }; - -}( window, document, jQuery ) ); +/*! Swipebox v1.4.4 | Constantin Saguin csag.co | MIT License | github.com/brutaldesign/swipebox */ + +; (function (window, document, $, undefined) { + + $.swipebox = function (elem, options) { + + // Default options + var ui, + defaults = { + useCSS: true, + useSVG: false, + initialIndexOnArray: 0, + removeBarsOnMobile: true, + hideCloseButtonOnMobile: false, + hideBarsDelay: 3000, + videoMaxWidth: 1140, + vimeoColor: 'cccccc', + beforeOpen: null, + afterOpen: null, + afterClose: null, + afterMedia: null, + nextSlide: null, + prevSlide: null, + loopAtEnd: false, + autoplayVideos: false, + queryStringData: {}, + toggleClassOnLoad: '' + }, + + plugin = this, + elements = [], // slides array [ { href:'...', title:'...' }, ...], + $elem, + selector = elem.selector, + isMobile = navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(Android)|(PlayBook)|(BB10)|(BlackBerry)|(Opera Mini)|(IEMobile)|(webOS)|(MeeGo)/i), + isTouch = isMobile !== null || document.createTouch !== undefined || ('ontouchstart' in window) || ('onmsgesturechange' in window) || navigator.msMaxTouchPoints, + supportSVG = !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect, + winWidth = window.innerWidth ? window.innerWidth : $(window).width(), + winHeight = window.innerHeight ? window.innerHeight : $(window).height(), + currentX = 0, + /* jshint multistr: true */ + html = '
\ +
\ +
\ +
\ +
\ +
\ +
\ +
\ + \ + \ +
\ +
\ + \ +
\ +
'; + + plugin.settings = {}; + + $.swipebox.close = function () { + ui.closeSlide(); + }; + + $.swipebox.extend = function () { + return ui; + }; + + plugin.init = function () { + + plugin.settings = $.extend({}, defaults, options); + + if ($.isArray(elem)) { + + elements = elem; + ui.target = $(window); + ui.init(plugin.settings.initialIndexOnArray); + + } else { + + $(document).on('click', selector, function (event) { + + // console.log( isTouch ); + + if (event.target.parentNode.className === 'slide current') { + + return false; + } + + if (!$.isArray(elem)) { + ui.destroy(); + $elem = $(selector); + ui.actions(); + } + + elements = []; + var index, relType, relVal; + + // Allow for HTML5 compliant attribute before legacy use of rel + if (!relVal) { + relType = 'data-rel'; + relVal = $(this).attr(relType); + } + + if (!relVal) { + relType = 'rel'; + relVal = $(this).attr(relType); + } + + if (relVal && relVal !== '' && relVal !== 'nofollow') { + $elem = $(selector).filter('[' + relType + '="' + relVal + '"]'); + } else { + $elem = $(selector); + } + + $elem.each(function () { + + var title = null, + href = null; + + if ($(this).attr('title')) { + title = $(this).attr('title'); + } + + + if ($(this).attr('href')) { + href = $(this).attr('href'); + } + + elements.push({ + href: href, + title: title + }); + }); + + index = $elem.index($(this)); + event.preventDefault(); + event.stopPropagation(); + ui.target = $(event.target); + ui.init(index); + }); + } + }; + + ui = { + + /** + * Initiate Swipebox + */ + init: function (index) { + if (plugin.settings.beforeOpen) { + plugin.settings.beforeOpen(); + } + this.target.trigger('swipebox-start'); + $.swipebox.isOpen = true; + this.build(); + this.openSlide(index); + this.openMedia(index); + this.preloadMedia(index + 1); + this.preloadMedia(index - 1); + if (plugin.settings.afterOpen) { + plugin.settings.afterOpen(index); + } + }, + + /** + * Built HTML containers and fire main functions + */ + build: function () { + var $this = this, bg; + + $('body').append(html); + + if (supportSVG && plugin.settings.useSVG === true) { + bg = $('#swipebox-close').css('background-image'); + bg = bg.replace('png', 'svg'); + $('#swipebox-prev, #swipebox-next, #swipebox-close').css({ + 'background-image': bg + }); + } + + if (isMobile && plugin.settings.removeBarsOnMobile) { + $('#swipebox-bottom-bar, #swipebox-top-bar').remove(); + } + + $.each(elements, function () { + $('#swipebox-slider').append('
'); + }); + + $this.setDim(); + $this.actions(); + + if (isTouch) { + $this.gesture(); + } + + // Devices can have both touch and keyboard input so always allow key events + $this.keyboard(); + + $this.animBars(); + $this.resize(); + + }, + + /** + * Set dimensions depending on windows width and height + */ + setDim: function () { + + var width, height, sliderCss = {}; + + // Reset dimensions on mobile orientation change + if ('onorientationchange' in window) { + + window.addEventListener('orientationchange', function () { + if (window.orientation === 0) { + width = winWidth; + height = winHeight; + } else if (window.orientation === 90 || window.orientation === -90) { + width = winHeight; + height = winWidth; + } + }, false); + + + } else { + + width = window.innerWidth ? window.innerWidth : $(window).width(); + height = window.innerHeight ? window.innerHeight : $(window).height(); + } + + sliderCss = { + width: width, + height: height + }; + + $('#swipebox-overlay').css(sliderCss); + + }, + + /** + * Reset dimensions on window resize envent + */ + resize: function () { + var $this = this; + + $(window).resize(function () { + $this.setDim(); + }).resize(); + }, + + /** + * Check if device supports CSS transitions + */ + supportTransition: function () { + + var prefixes = 'transition WebkitTransition MozTransition OTransition msTransition KhtmlTransition'.split(' '), + i; + + for (i = 0; i < prefixes.length; i++) { + if (document.createElement('div').style[prefixes[i]] !== undefined) { + return prefixes[i]; + } + } + return false; + }, + + /** + * Check if CSS transitions are allowed (options + devicesupport) + */ + doCssTrans: function () { + if (plugin.settings.useCSS && this.supportTransition()) { + return true; + } + }, + + /** + * Touch navigation + */ + gesture: function () { + + var $this = this, + index, + hDistance, + vDistance, + hDistanceLast, + vDistanceLast, + hDistancePercent, + vSwipe = false, + hSwipe = false, + hSwipMinDistance = 10, + vSwipMinDistance = 50, + startCoords = {}, + endCoords = {}, + bars = $('#swipebox-top-bar, #swipebox-bottom-bar'), + slider = $('#swipebox-slider'); + + bars.addClass('visible-bars'); + $this.setTimeout(); + + $('body').bind('touchstart', function (event) { + + $(this).addClass('touching'); + index = $('#swipebox-slider .slide').index($('#swipebox-slider .slide.current')); + endCoords = event.originalEvent.targetTouches[0]; + startCoords.pageX = event.originalEvent.targetTouches[0].pageX; + startCoords.pageY = event.originalEvent.targetTouches[0].pageY; + + $('#swipebox-slider').css({ + '-webkit-transform': 'translate3d(' + currentX + '%, 0, 0)', + 'transform': 'translate3d(' + currentX + '%, 0, 0)' + }); + + $('.touching').bind('touchmove', function (event) { + event.preventDefault(); + event.stopPropagation(); + endCoords = event.originalEvent.targetTouches[0]; + + if (!hSwipe) { + vDistanceLast = vDistance; + vDistance = endCoords.pageY - startCoords.pageY; + if (Math.abs(vDistance) >= vSwipMinDistance || vSwipe) { + var opacity = 0.75 - Math.abs(vDistance) / slider.height(); + + slider.css({ 'top': vDistance + 'px' }); + slider.css({ 'opacity': opacity }); + + vSwipe = true; + } + } + + hDistanceLast = hDistance; + hDistance = endCoords.pageX - startCoords.pageX; + hDistancePercent = hDistance * 100 / winWidth; + + if (!hSwipe && !vSwipe && Math.abs(hDistance) >= hSwipMinDistance) { + $('#swipebox-slider').css({ + '-webkit-transition': '', + 'transition': '' + }); + hSwipe = true; + } + + if (hSwipe) { + + // swipe left + if (0 < hDistance) { + + // first slide + if (0 === index) { + // console.log( 'first' ); + $('#swipebox-overlay').addClass('leftSpringTouch'); + } else { + // Follow gesture + $('#swipebox-overlay').removeClass('leftSpringTouch').removeClass('rightSpringTouch'); + $('#swipebox-slider').css({ + '-webkit-transform': 'translate3d(' + (currentX + hDistancePercent) + '%, 0, 0)', + 'transform': 'translate3d(' + (currentX + hDistancePercent) + '%, 0, 0)' + }); + } + + // swipe rught + } else if (0 > hDistance) { + + // last Slide + if (elements.length === index + 1) { + // console.log( 'last' ); + $('#swipebox-overlay').addClass('rightSpringTouch'); + } else { + $('#swipebox-overlay').removeClass('leftSpringTouch').removeClass('rightSpringTouch'); + $('#swipebox-slider').css({ + '-webkit-transform': 'translate3d(' + (currentX + hDistancePercent) + '%, 0, 0)', + 'transform': 'translate3d(' + (currentX + hDistancePercent) + '%, 0, 0)' + }); + } + + } + } + }); + + return false; + + }).bind('touchend', function (event) { + event.preventDefault(); + event.stopPropagation(); + + $('#swipebox-slider').css({ + '-webkit-transition': '-webkit-transform 0.4s ease', + 'transition': 'transform 0.4s ease' + }); + + vDistance = endCoords.pageY - startCoords.pageY; + hDistance = endCoords.pageX - startCoords.pageX; + hDistancePercent = hDistance * 100 / winWidth; + + // Swipe to bottom to close + if (vSwipe) { + vSwipe = false; + if (Math.abs(vDistance) >= 2 * vSwipMinDistance && Math.abs(vDistance) > Math.abs(vDistanceLast)) { + var vOffset = vDistance > 0 ? slider.height() : -slider.height(); + slider.animate({ top: vOffset + 'px', 'opacity': 0 }, + 300, + function () { + $this.closeSlide(); + }); + } else { + slider.animate({ top: 0, 'opacity': 1 }, 300); + } + + } else if (hSwipe) { + + hSwipe = false; + + // swipeLeft + if (hDistance >= hSwipMinDistance && hDistance >= hDistanceLast) { + + $this.getPrev(); + + // swipeRight + } else if (hDistance <= -hSwipMinDistance && hDistance <= hDistanceLast) { + + $this.getNext(); + } + + } else { // Top and bottom bars have been removed on touchable devices + // tap + if (!bars.hasClass('visible-bars')) { + $this.showBars(); + $this.setTimeout(); + } else { + $this.clearTimeout(); + $this.hideBars(); + } + } + + $('#swipebox-slider').css({ + '-webkit-transform': 'translate3d(' + currentX + '%, 0, 0)', + 'transform': 'translate3d(' + currentX + '%, 0, 0)' + }); + + $('#swipebox-overlay').removeClass('leftSpringTouch').removeClass('rightSpringTouch'); + $('.touching').off('touchmove').removeClass('touching'); + + }); + }, + + /** + * Set timer to hide the action bars + */ + setTimeout: function () { + if (plugin.settings.hideBarsDelay > 0) { + var $this = this; + $this.clearTimeout(); + $this.timeout = window.setTimeout(function () { + $this.hideBars(); + }, + + plugin.settings.hideBarsDelay + ); + } + }, + + /** + * Clear timer + */ + clearTimeout: function () { + window.clearTimeout(this.timeout); + this.timeout = null; + }, + + /** + * Show navigation and title bars + */ + showBars: function () { + var bars = $('#swipebox-top-bar, #swipebox-bottom-bar'); + if (this.doCssTrans()) { + bars.addClass('visible-bars'); + } else { + $('#swipebox-top-bar').animate({ top: 0 }, 500); + $('#swipebox-bottom-bar').animate({ bottom: 0 }, 500); + setTimeout(function () { + bars.addClass('visible-bars'); + }, 1000); + } + }, + + /** + * Hide navigation and title bars + */ + hideBars: function () { + var bars = $('#swipebox-top-bar, #swipebox-bottom-bar'); + if (this.doCssTrans()) { + bars.removeClass('visible-bars'); + } else { + $('#swipebox-top-bar').animate({ top: '-50px' }, 500); + $('#swipebox-bottom-bar').animate({ bottom: '-50px' }, 500); + setTimeout(function () { + bars.removeClass('visible-bars'); + }, 1000); + } + }, + + /** + * Animate navigation and top bars + */ + animBars: function () { + var $this = this, + bars = $('#swipebox-top-bar, #swipebox-bottom-bar'); + + bars.addClass('visible-bars'); + $this.setTimeout(); + + $('#swipebox-slider').click(function () { + if (!bars.hasClass('visible-bars')) { + $this.showBars(); + $this.setTimeout(); + } + }); + + $('#swipebox-bottom-bar').hover(function () { + $this.showBars(); + bars.addClass('visible-bars'); + $this.clearTimeout(); + + }, function () { + if (plugin.settings.hideBarsDelay > 0) { + bars.removeClass('visible-bars'); + $this.setTimeout(); + } + + }); + }, + + /** + * Keyboard navigation + */ + keyboard: function () { + var $this = this; + $(window).bind('keyup', function (event) { + event.preventDefault(); + event.stopPropagation(); + + if (event.keyCode === 37) { + + $this.getPrev(); + + } else if (event.keyCode === 39) { + + $this.getNext(); + + } else if (event.keyCode === 27) { + + $this.closeSlide(); + } + }); + }, + + /** + * Navigation events : go to next slide, go to prevous slide and close + */ + actions: function () { + var $this = this, + action = 'touchend click'; // Just detect for both event types to allow for multi-input + + if (elements.length < 2) { + + $('#swipebox-bottom-bar').hide(); + + if (undefined === elements[1]) { + $('#swipebox-top-bar').hide(); + } + + } else { + $('#swipebox-prev').bind(action, function (event) { + event.preventDefault(); + event.stopPropagation(); + $this.getPrev(); + $this.setTimeout(); + }); + + $('#swipebox-next').bind(action, function (event) { + event.preventDefault(); + event.stopPropagation(); + $this.getNext(); + $this.setTimeout(); + }); + } + + $('#swipebox-close').bind(action, function (e) { + e.preventDefault(); + $this.closeSlide(); + }); + }, + + /** + * Set current slide + */ + setSlide: function (index, isFirst) { + + isFirst = isFirst || false; + + var slider = $('#swipebox-slider'); + + currentX = -index * 100; + + if (this.doCssTrans()) { + slider.css({ + '-webkit-transform': 'translate3d(' + (-index * 100) + '%, 0, 0)', + 'transform': 'translate3d(' + (-index * 100) + '%, 0, 0)' + }); + } else { + slider.animate({ left: (-index * 100) + '%' }); + } + + $('#swipebox-slider .slide').removeClass('current'); + $('#swipebox-slider .slide').eq(index).addClass('current'); + this.setTitle(index); + + if (isFirst) { + slider.fadeIn(); + } + + $('#swipebox-prev, #swipebox-next').removeClass('disabled'); + + if (index === 0) { + $('#swipebox-prev').addClass('disabled'); + } else if (index === elements.length - 1 && plugin.settings.loopAtEnd !== true) { + $('#swipebox-next').addClass('disabled'); + } + }, + + /** + * Open slide + */ + openSlide: function (index) { + $('html').addClass('swipebox-html'); + if (isTouch) { + $('html').addClass('swipebox-touch'); + + if (plugin.settings.hideCloseButtonOnMobile) { + $('html').addClass('swipebox-no-close-button'); + } + } else { + $('html').addClass('swipebox-no-touch'); + } + $(window).trigger('resize'); // fix scroll bar visibility on desktop + this.setSlide(index, true); + }, + + /** + * Set a time out if the media is a video + */ + preloadMedia: function (index) { + var $this = this, + src = null; + + if (elements[index] !== undefined) { + src = elements[index].href; + } + + if (!$this.isVideo(src)) { + setTimeout(function () { + $this.openMedia(index); + }, 1000); + } else { + $this.openMedia(index); + } + }, + + /** + * Open + */ + openMedia: function (index) { + var $this = this, + src, + slide; + + if (elements[index] !== undefined) { + src = elements[index].href; + } + + if (index < 0 || index >= elements.length) { + return false; + } + + slide = $('#swipebox-slider .slide').eq(index); + + if (!$this.isVideo(src)) { + slide.addClass('slide-loading'); + $this.loadMedia(src, function () { + slide.removeClass('slide-loading'); + slide.html(this); + + if (plugin.settings.afterMedia) { + plugin.settings.afterMedia(index); + } + }); + } else { + slide.html($this.getVideo(src)); + + if (plugin.settings.afterMedia) { + plugin.settings.afterMedia(index); + } + } + + }, + + /** + * Set link title attribute as caption + */ + setTitle: function (index) { + var title = null; + + $('#swipebox-title').empty(); + + if (elements[index] !== undefined) { + title = elements[index].title; + } + + if (title) { + $('#swipebox-top-bar').show(); + $('#swipebox-title').append(title); + } else { + $('#swipebox-top-bar').hide(); + } + }, + + /** + * Check if the URL is a video + */ + isVideo: function (src) { + + if (src) { + if (src.match(/(youtube\.com|youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/) || src.match(/vimeo\.com\/([0-9]*)/) || src.match(/youtu\.be\/([a-zA-Z0-9\-_]+)/)) { + return true; + } + + if (src.toLowerCase().indexOf('swipeboxvideo=1') >= 0) { + + return true; + } + } + + }, + + /** + * Parse URI querystring and: + * - overrides value provided via dictionary + * - rebuild it again returning a string + */ + parseUri: function (uri, customData) { + var a = document.createElement('a'), + qs = {}; + + // Decode the URI + a.href = decodeURIComponent(uri); + + // QueryString to Object + if (a.search) { + qs = JSON.parse('{"' + a.search.toLowerCase().replace('?', '').replace(/&/g, '","').replace(/=/g, '":"') + '"}'); + } + + // Extend with custom data + if ($.isPlainObject(customData)) { + qs = $.extend(qs, customData, plugin.settings.queryStringData); // The dev has always the final word + } + + // Return querystring as a string + return $ + .map(qs, function (val, key) { + if (val && val > '') { + return encodeURIComponent(key) + '=' + encodeURIComponent(val); + } + }) + .join('&'); + }, + + /** + * Get video iframe code from URL + */ + getVideo: function (url) { + var iframe = '', + youtubeUrl = url.match(/((?:www\.)?youtube\.com|(?:www\.)?youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/), + youtubeShortUrl = url.match(/(?:www\.)?youtu\.be\/([a-zA-Z0-9\-_]+)/), + vimeoUrl = url.match(/(?:www\.)?vimeo\.com\/([0-9]*)/), + qs = ''; + if (youtubeUrl || youtubeShortUrl) { + if (youtubeShortUrl) { + youtubeUrl = youtubeShortUrl; + } + qs = ui.parseUri(url, { + 'autoplay': (plugin.settings.autoplayVideos ? '1' : '0'), + 'v': '' + }); + iframe = ''; + + } else if (vimeoUrl) { + qs = ui.parseUri(url, { + 'autoplay': (plugin.settings.autoplayVideos ? '1' : '0'), + 'byline': '0', + 'portrait': '0', + 'color': plugin.settings.vimeoColor + }); + iframe = ''; + + } else { + iframe = ''; + } + + return '
' + iframe + '
'; + }, + + /** + * Load image + */ + loadMedia: function (src, callback) { + // Inline content + if (src.trim().indexOf('#') === 0) { + callback.call( + $('
', { + 'class': 'swipebox-inline-container' + }) + .append( + $(src) + .clone() + .toggleClass(plugin.settings.toggleClassOnLoad) + ) + ); + } + // Everything else + else { + if (!this.isVideo(src)) { + var img = $('').on('load', function () { + callback.call(img); + }); + + img.attr('src', src); + } + } + }, + + /** + * Get next slide + */ + getNext: function () { + var $this = this, + src, + index = $('#swipebox-slider .slide').index($('#swipebox-slider .slide.current')); + if (index + 1 < elements.length) { + + src = $('#swipebox-slider .slide').eq(index).contents().find('iframe').attr('src'); + $('#swipebox-slider .slide').eq(index).contents().find('iframe').attr('src', src); + index++; + $this.setSlide(index); + $this.preloadMedia(index + 1); + if (plugin.settings.nextSlide) { + plugin.settings.nextSlide(index); + } + } else { + + if (plugin.settings.loopAtEnd === true) { + src = $('#swipebox-slider .slide').eq(index).contents().find('iframe').attr('src'); + $('#swipebox-slider .slide').eq(index).contents().find('iframe').attr('src', src); + index = 0; + $this.preloadMedia(index); + $this.setSlide(index); + $this.preloadMedia(index + 1); + if (plugin.settings.nextSlide) { + plugin.settings.nextSlide(index); + } + } else { + $('#swipebox-overlay').addClass('rightSpring'); + setTimeout(function () { + $('#swipebox-overlay').removeClass('rightSpring'); + }, 500); + } + } + }, + + /** + * Get previous slide + */ + getPrev: function () { + var index = $('#swipebox-slider .slide').index($('#swipebox-slider .slide.current')), + src; + if (index > 0) { + src = $('#swipebox-slider .slide').eq(index).contents().find('iframe').attr('src'); + $('#swipebox-slider .slide').eq(index).contents().find('iframe').attr('src', src); + index--; + this.setSlide(index); + this.preloadMedia(index - 1); + if (plugin.settings.prevSlide) { + plugin.settings.prevSlide(index); + } + } else { + $('#swipebox-overlay').addClass('leftSpring'); + setTimeout(function () { + $('#swipebox-overlay').removeClass('leftSpring'); + }, 500); + } + }, + /* jshint unused:false */ + nextSlide: function (index) { + // Callback for next slide + }, + + prevSlide: function (index) { + // Callback for prev slide + }, + + /** + * Close + */ + closeSlide: function () { + $('html').removeClass('swipebox-html'); + $('html').removeClass('swipebox-touch'); + $(window).trigger('resize'); + this.destroy(); + }, + + /** + * Destroy the whole thing + */ + destroy: function () { + $(window).unbind('keyup'); + $('body').unbind('touchstart'); + $('body').unbind('touchmove'); + $('body').unbind('touchend'); + $('#swipebox-slider').unbind(); + $('#swipebox-overlay').remove(); + + if (!$.isArray(elem)) { + elem.removeData('_swipebox'); + } + + if (this.target) { + this.target.trigger('swipebox-destroy'); + } + + $.swipebox.isOpen = false; + + if (plugin.settings.afterClose) { + plugin.settings.afterClose(); + } + } + }; + + plugin.init(); + }; + + $.fn.swipebox = function (options) { + + if (!$.data(this, '_swipebox')) { + var swipebox = new $.swipebox(this, options); + this.data('_swipebox', swipebox); + } + return this.data('_swipebox'); + + }; + +}(window, document, jQuery));