/*--------------------------------------------------------------------------------------------- @author Constantin Saguin - @brutaldesign @link http://bsign.co @github http://github.com/brutaldesign/swipebox @version 1.1.2 @license MIT License ----------------------------------------------------------------------------------------------*/ ;(function (window, document, $, undefined) { $.swipebox = function(elem, options) { var defaults = { useCSS : true, hideBarsDelay : 3000 }, plugin = this, $elem = $(elem), elem = elem, selector = elem.selector, $selector = $(selector), isTouch = document.createTouch !== undefined || ('ontouchstart' in window) || ('onmsgesturechange' in window) || navigator.msMaxTouchPoints, supportSVG = !!(window.SVGSVGElement), html = '
\
\
\
\ \ \ \
\
'; plugin.settings = {} plugin.init = function(){ plugin.settings = $.extend({}, defaults, options); $selector.click(function(e){ e.preventDefault(); e.stopPropagation(); index = $elem.index($(this)); ui.target = $(e.target); ui.init(index); }); } var ui = { init : function(index){ this.target.trigger('swipebox-start'); this.build(); this.openSlide(index); this.openImg(index); this.preloadImg(index+1); this.preloadImg(index-1); }, build : function(){ var $this = this; $('body').append(html); if($this.doCssTrans()){ $('#swipebox-slider').css({ '-webkit-transition' : 'left 0.4s ease', '-moz-transition' : 'left 0.4s ease', '-o-transition' : 'left 0.4s ease', '-khtml-transition' : 'left 0.4s ease', 'transition' : 'left 0.4s ease' }); $('#swipebox-overlay').css({ '-webkit-transition' : 'opacity 1s ease', '-moz-transition' : 'opacity 1s ease', '-o-transition' : 'opacity 1s ease', '-khtml-transition' : 'opacity 1s ease', 'transition' : 'opacity 1s ease' }); $('#swipebox-action, #swipebox-caption').css({ '-webkit-transition' : '0.5s', '-moz-transition' : '0.5s', '-o-transition' : '0.5s', '-khtml-transition' : '0.5s', 'transition' : '0.5s' }); } var bg = $('#swipebox-action #swipebox-close').css('background-image'); if(bg != 'none'){ if(supportSVG){ if(bg.match(/\.png/i)){ this.setBgImage(bg.replace('png', 'svg')); }else{ this.selectBgImage(bg, bg.replace('svg', 'png')); } }else{ if(bg.match(/\.svg/i)){ this.setBgImage(bg.replace('svg', 'png')); } } } $elem.each(function(){ $('#swipebox-slider').append('
'); }); $this.setDim(); $this.actions(); $this.keyboard(); $this.gesture(); $this.animBars(); $(window).resize(function() { $this.setDim(); }).resize(); }, setBgImage : function(bgImage){ var url = bgImage.replace(/url\(\"?([^\"\)]+)\"?\)/, "$1"); img = new Image(); img.onload = function() { $('#swipebox-action #swipebox-prev,#swipebox-action #swipebox-next,#swipebox-action #swipebox-close').css({ 'background-image' : bgImage }); } img.src = url; }, selectBgImage : function(orgBg, altBg){ var $this = this; var url = orgBg.replace(/url\(\"?([^\"\)]+)\"?\)/, "$1"); img = new Image(); img.onerror = function() { $this.setBgImage(altBg); } img.src = url; }, setDim : function(){ var sliderCss = { width : $(window).width(), height : window.innerHeight ? window.innerHeight : $(window).height() // fix IOS bug } $('#swipebox-overlay').css(sliderCss); }, supportTransition : function() { var prefixes = 'transition WebkitTransition MozTransition OTransition msTransition KhtmlTransition'.split(' '); for(var i = 0; i < prefixes.length; i++) { if(document.createElement('div').style[prefixes[i]] !== undefined) { return prefixes[i]; } } return false; }, doCssTrans : function(){ if(plugin.settings.useCSS && this.supportTransition() ){ return true; } }, gesture : function(){ if ( isTouch ){ var $this = this, distance = null, swipMinDistance = 10, startCoords = {}, endCoords = {}; var b = $('#swipebox-caption, #swipebox-action'); b.addClass('visible-bars'); $this.setTimeout(); $('body').bind('touchstart', function(e){ $(this).addClass('touching'); endCoords = e.originalEvent.targetTouches[0]; startCoords.pageX = e.originalEvent.targetTouches[0].pageX; $('.touching').bind('touchmove',function(e){ e.preventDefault(); e.stopPropagation(); endCoords = e.originalEvent.targetTouches[0]; }); return false; }).bind('touchend',function(e){ e.preventDefault(); e.stopPropagation(); distance = endCoords.pageX - startCoords.pageX; if( distance >= swipMinDistance ){ // swipeLeft $this.getPrev(); } else if( distance <= - swipMinDistance ){ // swipeRight $this.getNext(); }else{ // tap if(!b.hasClass('visible-bars')){ $this.showBars(); $this.setTimeout(); }else{ $this.clearTimeout(); $this.hideBars(); } } $('.touching').off('touchmove').removeClass('touching'); }); } }, setTimeout: function(){ if(plugin.settings.hideBarsDelay > 0){ var $this = this; $this.clearTimeout(); $this.timeout = window.setTimeout( function(){ $this.hideBars() }, plugin.settings.hideBarsDelay ); } }, clearTimeout: function(){ window.clearTimeout(this.timeout); this.timeout = null; }, showBars : function(){ var b = $('#swipebox-caption, #swipebox-action'); if(this.doCssTrans()){ b.addClass('visible-bars'); }else{ $('#swipebox-caption').animate({ top : 0 }, 500); $('#swipebox-action').animate({ bottom : 0 }, 500); setTimeout(function(){ b.addClass('visible-bars'); }, 1000); } }, hideBars : function(){ var b = $('#swipebox-caption, #swipebox-action'); if(this.doCssTrans()){ b.removeClass('visible-bars'); }else{ $('#swipebox-caption').animate({ top : '-50px' }, 500); $('#swipebox-action').animate({ bottom : '-50px' }, 500); setTimeout(function(){ b.removeClass('visible-bars'); }, 1000); } }, animBars : function(){ var $this = this; var b = $('#swipebox-caption, #swipebox-action'); b.addClass('visible-bars'); $this.setTimeout(); $('#swipebox-slider').click(function(e){ if(!b.hasClass('visible-bars')){ $this.showBars(); $this.setTimeout(); } }); $('#swipebox-action').hover(function() { $this.showBars(); b.addClass('force-visible-bars'); $this.clearTimeout(); },function() { b.removeClass('force-visible-bars'); $this.setTimeout(); }); }, keyboard : function(){ var $this = this; $(window).bind('keyup', function(e){ e.preventDefault(); e.stopPropagation(); if (e.keyCode == 37){ $this.getPrev(); } else if (e.keyCode==39){ $this.getNext(); } else if (e.keyCode == 27) { $this.closeSlide(); } }); }, actions : function(){ var $this = this; if( $elem.length < 2 ){ $('#swipebox-prev, #swipebox-next').hide(); }else{ $('#swipebox-prev').bind('click touchend', function(e){ e.preventDefault(); e.stopPropagation(); $this.getPrev(); $this.setTimeout(); }); $('#swipebox-next').bind('click touchend', function(e){ e.preventDefault(); e.stopPropagation(); $this.getNext(); $this.setTimeout(); }); } $('#swipebox-close').bind('click touchend', function(e){ $this.closeSlide(); }); }, setSlide : function (index, isFirst){ isFirst = isFirst || false; var slider = $('#swipebox-slider'); if(this.doCssTrans()){ slider.css({ left : (-index*100)+'%' }); }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 == $elem.length - 1 ){ $('#swipebox-next').addClass('disabled'); } }, openSlide : function (index){ $('html').addClass('swipebox'); $(window).trigger('resize'); // fix scroll bar visibility on desktop this.setSlide(index, true); }, preloadImg : function (index){ var $this = this; setTimeout(function(){ $this.openImg(index); }, 1000); }, openImg : function (index){ var $this = this; if(index < 0 || index >= $elem.length){ return false; } $this.loadImg($elem.eq(index).attr('href'), function(){ $('#swipebox-slider .slide').eq(index).html(this); }); }, setTitle : function(index, isFirst){ $('#swipebox-caption').empty(); if($elem.eq(index).attr('title')){ $('#swipebox-caption').append($elem.eq(index).attr('title')); } }, loadImg : function (src, callback){ var img = $('').on('load', function(){ callback.call(img); }); img.attr('src',src); }, getNext : function (){ var $this = this; index = $('#swipebox-slider .slide').index($('#swipebox-slider .slide.current')); if(index+1 < $elem.length){ index++; $this.setSlide(index); $this.preloadImg(index+1); } else{ $('#swipebox-slider').addClass('rightSpring'); setTimeout(function(){ $('#swipebox-slider').removeClass('rightSpring'); },500); } }, getPrev : function (){ var $this = this; index = $('#swipebox-slider .slide').index($('#swipebox-slider .slide.current')); if(index > 0){ index--; $this.setSlide(index); $this.preloadImg(index-1); } else{ $('#swipebox-slider').addClass('leftSpring'); setTimeout(function(){ $('#swipebox-slider').removeClass('leftSpring'); },500); } }, closeSlide : function (){ var $this = this; $(window).trigger('resize'); $('html').removeClass('swipebox'); $this.destroy(); }, destroy : function(){ var $this = this; $(window).unbind('keyup'); $('body').unbind('touchstart'); $('body').unbind('touchmove'); $('body').unbind('touchend'); $('#swipebox-slider').unbind(); $('#swipebox-overlay').remove(); $elem.removeData('_swipebox'); $this.target.trigger('swipebox-destroy'); } } plugin.init(); } $.fn.swipebox = function(options){ if (!$.data(this, "_swipebox")) { var swipebox = new $.swipebox(this, options); this.data('_swipebox', swipebox); } } }(window, document, jQuery));