/*--------------------------------------------------------------------------------------------- @author constantin saguin - @brutaldesign @link http://csag.co @github http://github.com/brutaldesign/swipebox @version 1.2.1 @license mit license ----------------------------------------------------------------------------------------------*/ ;(function (window, document, $, undefined) { $.swipebox = function(elem, options) { var defaults = { usecss : true, initialindexonarray : 0, hidebarsdelay : 3000, videomaxwidth : 1140, vimeocolor : 'cccccc', beforeopen: null, afterclose: null }, plugin = this, elements = [], // slides array [{href:'...', title:'...'}, ...], elem = elem, selector = elem.selector, $selector = $(selector), istouch = document.createtouch !== undefined || ('ontouchstart' in window) || ('onmsgesturechange' in window) || navigator.msmaxtouchpoints, supportsvg = !!(window.svgsvgelement), winwidth = window.innerwidth ? window.innerwidth : $(window).width(), winheight = window.innerheight ? window.innerheight : $(window).height(), html = '
\
\
\
\ \ \ \
\
'; plugin.settings = {} plugin.init = function(){ plugin.settings = $.extend({}, defaults, options); if ($.isarray(elem)) { elements = elem; ui.target = $(window); ui.init(plugin.settings.initialindexonarray); }else{ $selector.click(function(e){ elements = []; var index , reltype, relval; 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)); e.preventdefault(); e.stoppropagation(); ui.target = $(e.target); ui.init(index); }); } } plugin.refresh = function() { if (!$.isarray(elem)) { ui.destroy(); $elem = $(selector); ui.actions(); } } var ui = { 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); }, 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' }); } if(supportsvg){ var bg = $('#swipebox-action #swipebox-close').css('background-image'); //bg = bg.replace('png', 'svg'); $('#swipebox-action #swipebox-prev,#swipebox-action #swipebox-next,#swipebox-action #swipebox-close').css({ 'background-image' : bg }); } $.each( elements, function(){ $('#swipebox-slider').append('
'); }); $this.setdim(); $this.actions(); $this.keyboard(); $this.gesture(); $this.animbars(); $this.resize(); }, setdim : function(){ var width, height, slidercss = {}; 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); }, resize : function (){ var $this = this; $(window).resize(function() { $this.setdim(); }).resize(); }, 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 bars = $('#swipebox-caption, #swipebox-action'); bars.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(!bars.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 bars = $('#swipebox-caption, #swipebox-action'); if(this.docsstrans()){ bars.addclass('visible-bars'); }else{ $('#swipebox-caption').animate({ top : 0 }, 500); $('#swipebox-action').animate({ bottom : 0 }, 500); settimeout(function(){ bars.addclass('visible-bars'); }, 1000); } }, hidebars : function(){ var bars = $('#swipebox-caption, #swipebox-action'); if(this.docsstrans()){ bars.removeclass('visible-bars'); }else{ $('#swipebox-caption').animate({ top : '-50px' }, 500); $('#swipebox-action').animate({ bottom : '-50px' }, 500); settimeout(function(){ bars.removeclass('visible-bars'); }, 1000); } }, animbars : function(){ var $this = this; var bars = $('#swipebox-caption, #swipebox-action'); bars.addclass('visible-bars'); $this.settimeout(); $('#swipebox-slider').click(function(e){ if(!bars.hasclass('visible-bars')){ $this.showbars(); $this.settimeout(); } }); $('#swipebox-action').hover(function() { $this.showbars(); bars.addclass('force-visible-bars'); $this.cleartimeout(); },function() { bars.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( elements.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 == elements.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); }, 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); } }, openmedia : function (index){ var $this = this, src = null; if( elements[index] !== undefined ) src = elements[index].href; if(index < 0 || index >= elements.length){ return false; } if( !$this.isvideo(src) ){ $this.loadmedia(src, function(){ $('#swipebox-slider .slide').eq(index).html(this); }); }else{ $('#swipebox-slider .slide').eq(index).html($this.getvideo(src)); } }, settitle : function (index, isfirst){ var title = null; $('#swipebox-caption').empty(); if( elements[index] !== undefined ) title = elements[index].title; if(title){ $('#swipebox-caption').append(title); } }, isvideo : function (src){ if( src ){ if( src.match(/youtube\.com\/watch\?v=([a-za-z0-9\-_]+)/) || src.match(/vimeo\.com\/([0-9]*)/) ){ return true; } } }, getvideo : function(url){ var iframe = ''; var output = ''; var youtubeurl = url.match(/watch\?v=([a-za-z0-9\-_]+)/); var vimeourl = url.match(/vimeo\.com\/([0-9]*)/); if( youtubeurl ){ iframe = ''; }else if(vimeourl){ iframe = ''; } return '
'+iframe+'
'; }, loadmedia : function (src, callback){ if( !this.isvideo(src) ){ 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 < elements.length){ index++; $this.setslide(index); $this.preloadmedia(index+1); } else{ $('#swipebox-slider').addclass('rightspring'); settimeout(function(){ $('#swipebox-slider').removeclass('rightspring'); },500); } }, getprev : function (){ index = $('#swipebox-slider .slide').index($('#swipebox-slider .slide.current')); if(index > 0){ index--; this.setslide(index); this.preloadmedia(index-1); } else{ $('#swipebox-slider').addclass('leftspring'); settimeout(function(){ $('#swipebox-slider').removeclass('leftspring'); },500); } }, closeslide : function (){ $('html').removeclass('swipebox'); $(window).trigger('resize'); this.destroy(); }, 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));