Current File : /home/digitaw/www/wp-content/plugins/responsive-lightbox/assets/swipebox/jquery.swipebox.js
/*! Swipebox v1.5.2-patched | Constantin Saguin csag.co | MIT License | github.com/brutaldesign/swipebox */

(function (window, document, $, undefined) {
	$.swipebox = function (elem, options) {
		$(elem).addClass('swipebox'); // fugly but yea, swipebox class all the things

		// 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 = '.swipebox',
			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 =
				'<div id="swipebox-overlay">\
					<div id="swipebox-container">\
						<div id="swipebox-slider"></div>\
						<div id="swipebox-top-bar">\
							<div id="swipebox-title"></div>\
						</div>\
						<div id="swipebox-bottom-bar">\
							<div id="swipebox-arrows">\
								<a id="swipebox-prev"></a>\
								<a id="swipebox-next"></a>\
							</div>\
						</div>\
						<a id="swipebox-close"></a>\
					</div>\
			</div>';

		plugin.settings = {};

		$.swipebox.close = function () {
			ui.closeSlide();
		};

		$.swipebox.extend = function () {
			return ui;
		};

		plugin.init = function () {
			plugin.settings = $.extend({}, defaults, options);

			if (Array.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 (!Array.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('<div class="slide"></div>');
				});

				$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)
					.on('resize', function () {
						$this.setDim();
					})
					.trigger('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')
					.on('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').on('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 right
								} 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;
					})
					.on('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').on('click', function () {
					if (!bars.hasClass('visible-bars')) {
						$this.showBars();
						$this.setTimeout();
					}
				});

				$('#swipebox-bottom-bar')
					.on('mouseenter', function () {
						$this.showBars();
						bars.addClass('visible-bars');
						$this.clearTimeout();
					})
					.on('mouseleave', function () {
						if (plugin.settings.hideBarsDelay > 0) {
							bars.removeClass('visible-bars');
							$this.setTimeout();
						}
					});
			},

			/**
			 * Keyboard navigation
			 */
			keyboard: function () {
				var $this = this;
				$(window).on('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').on(action, function (event) {
						event.preventDefault();
						event.stopPropagation();
						$this.getPrev();
						$this.setTimeout();
					});

					$('#swipebox-next').on(action, function (event) {
						event.preventDefault();
						event.stopPropagation();
						$this.getNext();
						$this.setTimeout();
					});
				}

				$('#swipebox-close').on(action, function (event) {
					event.preventDefault();
					event.stopPropagation();
					$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) {
					title = title.replace(/[^]/g, function (c) {
						return '&#' + c.charCodeAt(0) + ';';
					});
					$('#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) {
						// For custom video URLs, check if embedding is allowed
						if (
							window.RLG &&
							window.RLG.isAllowedEmbedUrl &&
							window.RLG.isAllowedEmbedUrl(src)
						) {
							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 = {};

				try {
					// Decode the URI
					a.href = decodeURIComponent(uri);
				} catch (e) {
					// Malformed URI, return empty
					a.href = '';
				}

				// QueryString to Object
				if (a.search) {
					try {
						if (window.URLSearchParams) {
							var params = new URLSearchParams(a.search);
							params.forEach(function (value, key) {
								qs[key] = value;
							});
						} else {
							// Fallback: safer parsing without JSON
							var pairs = a.search.slice(1).split('&');
							for (var i = 0; i < pairs.length; i++) {
								var pair = pairs[i].split('=');
								if (pair[0]) {
									qs[decodeURIComponent(pair[0])] = pair[1]
										? decodeURIComponent(pair[1])
										: '';
								}
							}
						}
					} catch (e) {
						// Parsing failed, use empty qs
					}
				}

				// 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 =
						'<iframe width="560" height="315" src="https://' +
						youtubeUrl[1] +
						'/embed/' +
						youtubeUrl[2] +
						'?' +
						qs +
						'" frameborder="0" allowfullscreen></iframe>';
				} else if (vimeoUrl) {
					qs = ui.parseUri(url, {
						autoplay: plugin.settings.autoplayVideos ? '1' : '0',
						byline: '0',
						portrait: '0',
						color: plugin.settings.vimeoColor,
					});
					iframe =
						'<iframe width="560" height="315"  src="https://player.vimeo.com/video/' +
						vimeoUrl[1] +
						'?' +
						qs +
						'" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>';
				} else {
					if (
						window.RLG &&
						window.RLG.isAllowedEmbedUrl &&
						window.RLG.isAllowedEmbedUrl(url)
					) {
						iframe =
							'<iframe width="560" height="315" src="' +
							url +
							'" frameborder="0" allowfullscreen></iframe>';
					} else {
						iframe =
							'<div class="swipebox-video-error">Video embedding not allowed for this URL.</div>';
					}
				}

				return (
					'<div class="swipebox-video-container" style="max-width:' +
					plugin.settings.videoMaxWidth +
					'px"><div class="swipebox-video">' +
					iframe +
					'</div></div>'
				);
			},

			/**
			 * Load image
			 */
			loadMedia: function (src, callback) {
				// Inline content
				if (src.trim().indexOf('#') === 0) {
					var $target = $(src);
					if ($target.length > 0) {
						var cloned = $target.clone().toggleClass(plugin.settings.toggleClassOnLoad);
						if (cloned[0]) {
							var sanitizedHtml =
								window.RLG && window.RLG.sanitizeHtml
									? window.RLG.sanitizeHtml(cloned[0].outerHTML)
									: cloned[0].outerHTML;
							callback.call(
								$('<div>', {
									class: 'swipebox-inline-container',
								}).append($(sanitizedHtml))
							);
						} else {
							callback.call(
								$('<div>', { class: 'swipebox-inline-container' }).append(
									$('<div>Content not found</div>')
								)
							);
						}
					} else {
						callback.call(
							$('<div>', { class: 'swipebox-inline-container' }).append(
								$('<div>Content not found</div>')
							)
						);
					}
				}
				// Everything else
				else {
					if (!this.isVideo(src)) {
						if (
							window.RLG &&
							window.RLG.sanitizeConfig &&
							window.RLG.sanitizeConfig.ALLOWED_URI_REGEXP &&
							window.RLG.sanitizeConfig.ALLOWED_URI_REGEXP.test(src)
						) {
							var img = $('<img>')
								.on('load', function () {
									callback.call(img);
								})
								.on('error', function () {
									callback.call($('<div>Image could not be loaded</div>'));
								});

							img.attr('src', src);
						} else {
							// Invalid image source, call callback with placeholder
							callback.call($('<div>Invalid image source</div>'));
						}
					}
				}
			},

			/**
			 * 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).off('keyup');
				$('body').off('touchstart');
				$('body').off('touchmove');
				$('body').off('touchend');
				$('#swipebox-slider').off();
				$('#swipebox-overlay').remove();

				if (!Array.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);