/** * * jQuery Pogo Slider v0.7 * * Copyright 2015, Michael Griffin (mike@fluice.com) * **/ (function ( $, window, document, undefined ) { function appendPrefixedStyles(obj,prop,val) { if (prop.charAt(0) === '*') { obj[prop.substring(1)] = val; } else { obj['-ms-' + prop] = val; obj['-webkit-' + prop] = val; obj[prop] = val; } } $.fn.precss = function (styles) { var prefixedStyles = {}; if (arguments.length === 1) { for (style in styles) { if (styles.hasOwnProperty(style)) { appendPrefixedStyles(prefixedStyles,style,styles[style]); } } } else { appendPrefixedStyles(prefixedStyles,arguments[0],arguments[1]); } this.css(prefixedStyles); return this; } })( jQuery, window, document ); (function ( $, window, document, undefined ) { 'use strict'; var supportsCSSProp = function (featurename) { var feature = false; var domPrefixes = 'Webkit Moz ms O'.split(' '); var elm = document.createElement('div'); var featurenameCapital = null; featurename = featurename.toLowerCase(); if(elm.style[featurename]) { feature = true; } if(feature === false) { featurenameCapital = featurename.charAt(0).toUpperCase() + featurename.substr(1); for(var i = 0; i < domPrefixes.length; i++) { if(elm.style[domPrefixes[i] + featurenameCapital ] !== undefined) { feature = true; break; } } } return feature; }; var supports = {}; supports.animation = supportsCSSProp('animation'); supports.transition = supportsCSSProp('transition'); supports.transform = supportsCSSProp('transform'); var pluginName = 'pogoSlider'; var defaults = { autoplayTimeout: 4000, autoplay: true, baseZindex: 1, displayProgess: true, onSlideStart: null, onSlideEnd: null, onSliderPause: null, onSliderResume: null, slideTransition: 'slide', slideTransitionDuration: 1000, elementTransitionStart: 500, elementTransitionDuration: 1000, elementTransitionIn: 'slideUp', elementTransitionOut: 'slideDown', generateButtons: true, buttonPosition: 'CenterHorizontal', generateNav: true, navPosition: 'Bottom', preserveTargetSize: false, targetWidth: 1000, targetHeight: 300, responsive: false, pauseOnHover: true }; function Plugin ( element, options ) { this.element = element; this.$element = $(element); this.settings = $.extend( {}, defaults, options ); this.currentSlideIndex = 0; this.prevSlideIndex = 0; this.slideTimeoutId = 0; this.slides = []; this.calls = []; this.paused = false; this.navigating = false; this.slideStartTime = null; this.slideTimeRemaining = 0; this._init(); } Plugin.prototype = { // creates the slides object to store all slide data // sets initial state and starts the wheels in motion _init: function () { var self = this; self.$element.find('.pogoSlider-slide').each(function () { var children = []; var elementTransitionDuration = 0; // store the original styles, so that we can restore them later $(this).data('original-styles',$(this).attr('style')); // create the slides object sotring all data $(this).find('.pogoSlider-slide-element').each(function () { var startTime = parseInt($(this).data('start')) !== undefined? $(this).data('start') : self.settings.elementTransitionStart; var duration = parseInt($(this).data('duration')) || self.settings.elementTransitionDuration; if ((startTime + duration) > elementTransitionDuration) { elementTransitionDuration = (startTime + duration); } children.push({ $element: $(this), element: this, startTime: startTime, duration: duration, transitionIn: $(this).data('in') || self.settings.elementTransitionIn, transitionOut: $(this).data('out') || self.settings.elementTransitionOut }); $(this).css('opacity',0); }); var slide = { $element: $(this), element: this, transition: $(this).data('transition') || self.settings.slideTransition, duration: parseInt($(this).data('duration')) || self.settings.slideTransitionDuration, elementTransitionDuration: elementTransitionDuration, totalSlideDuration: self.settings.autoplayTimeout + elementTransitionDuration, children: children }; self.slides.push(slide); }); self.numSlides = self.slides.length; // initialize the first slide self.slides[0].$element.css('opacity',1); // if autoplay set the corrext startTime and time remaining properties if (self.settings.autoplay && self.settings.displayProgess) { self._createProgessBar(); } // set the correct aspect ratio of the slider self.$element.css('padding-bottom',(100 / (self.settings.targetWidth / self.settings.targetHeight)) + '%'); var numImages = self.$element.find('img').length; // if there are images to load if (numImages > 0) { var imagesLoaded = 0; // show a loading div while assets are being loaded self.$element.prepend('
'); // when all images have loaded self.$element.find('img').one('load',function () { if (++imagesLoaded === numImages) { $('.pogoSlider-loading').remove(); self._onSliderReady(); } }).each(function(){ if(this.complete) { $(this).trigger('load'); } }); } else { self._onSliderReady(); } }, _onSliderReady: function () { var self = this; // start the slider if autoplay is true if (self.settings.autoplay) { self.slideStartTime = new Date(); self.slideTimeRemaining = self.slides[0].totalSlideDuration; self._slideTimeout(self.slideTimeRemaining); } if (self.settings.generateButtons && self.slides.length > 1) { self._createDirButtons(); } if (self.settings.generateNav && self.slides.length > 1) { self._createNavigation(); } if (self.settings.preserveTargetSize) { self._preserveTargetSize(); if (self.settings.responsive) { $(window).on('resize', function () { self._preserveTargetSize(); }); } } if (self.settings.pauseOnHover) { self.$element.on('mouseenter', function () { self.pause(); }); self.$element.on('mouseleave', function () { self.resume(); }); } self._onSlideStart(0); }, _createDirButtons: function () { var self = this; self.$element.addClass('pogoSlider--dir' + self.settings.buttonPosition); $('').appendTo(self.$element).on('click', function () { self.prevSlide(); }); $('').appendTo(self.$element).on('click', function () { self.nextSlide(); }); }, _createNavigation: function () { var self = this; self.$element.addClass('pogoSlider--nav' + self.settings.navPosition); var $navContainer = $('').appendTo(self.$element); for (var i = 0;i < self.slides.length;i++) { $('
  • ').appendTo($navContainer).on('click', function () { self.toSlide($(this).data('num')); }); } }, getAppliedProps: function(el) { var styleSheets = document.styleSheets; var stylesReg = new RegExp('{(.+)}'); el.matches = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector || el.oMatchesSelector; var inlineStyles = el.getAttribute('style').replace(/ /g,'').split(';'); var props = []; for (var k = 0;k < inlineStyles.length;k++) { var inlineProp = inlineStyles[k].split(':')[0]; // if this prop is not empty and has a value and is not already in the props array if (inlineProp && props.indexOf(inlineProp) === -1) { props.push(inlineProp); } } for (var sheet in styleSheets) { if (styleSheets.hasOwnProperty(sheet)) { var cssRules = styleSheets[sheet].rules || styleSheets[sheet].cssRules; for (var r in cssRules) { if (el.matches(cssRules[r].selectorText)) { var matchedStyles = stylesReg.exec(cssRules[r].cssText.replace(/ /g,'')); if (matchedStyles) { var styles = matchedStyles[1].split(';'); for (var j = 0;j < styles.length;j++) { var prop = styles[j].split(':')[0]; // if this prop is not empty and has a value and is not already in the props array if (prop && props.indexOf(prop) === -1) { props.push(prop); } } } } } } } return props; }, _preserveTargetSize: function () { var self = this; var unitReg = new RegExp('px|%|em','i'); var numReg = new RegExp('[0-9]*.?[0-9]+'); var pixelReg = new RegExp('px','i'); var scaleFactor = 1; if (this.scaledBy) { scaleFactor = (this.$element.width() / this.settings.targetWidth) / this.scaledBy; } else { scaleFactor = this.$element.width() / this.settings.targetWidth; } this.scaledBy = this.$element.width() / this.settings.targetWidth; this.$element.find('.pogoSlider-slide-element').each(function () { var elementStyles = window.getComputedStyle(this); var appliedProps = self.getAppliedProps(this); var styleObj = {}; // store the oringal styles if (!$.data(self,'originalStyles')) { $.data(self,'originalStyles',$(this).attr('style')); } for (var i = 0;i < appliedProps.length;i++) { var cssVal = elementStyles.getPropertyValue(appliedProps[i]); if (unitReg.test(cssVal) && numReg.test(cssVal)) { // get the number var numVal = numReg.exec(cssVal); // get the unit var unitVal = unitReg.exec(cssVal); // if this is a pixel value if (pixelReg.test(unitVal[0])) { styleObj[appliedProps[i]] = Math.ceil(numVal[0] * scaleFactor) + unitVal[0]; } else { styleObj[appliedProps[i]] = (numVal[0] * scaleFactor) + unitVal[0]; } } } $(this).css(styleObj); }); }, // private method to create the slide progress bar _createProgessBar: function () { var progressHtml = ''; progressHtml += '
    '; progressHtml += '
    '; progressHtml += '
    '; //this.$element.prepend(progressHtml); for (var i = 0;i < this.slides.length;i++) { this.slides[i].$element.prepend(progressHtml); } }, // private method to create a slide pause call _slideTimeout: function (pauseFor) { var self = this; var timeoutId; timeoutId = self.slideTimeoutId = setTimeout(function () { if (!self.paused && timeoutId === self.slideTimeoutId) { self._changeToNext(); } },pauseFor); }, // public method to pause the slider pause: function () { if (this.settings.autoplay) { this.paused = true; clearTimeout(this.slideTimeoutId); if (this.settings.displayProgess) { this.$element.find('.pogoSlider-progressBar-duration').stop(true); } this.slidePauseTime = new Date(); this.slideTimeRemaining = this.slideTimeRemaining - ((new Date()) - this.slideStartTime); for (var i = 0;i < this.slides[this.currentSlideIndex].children.length;i++) { this.slides[this.currentSlideIndex].children[i].$element.precss('animation-play-state','paused'); } if (this.settings.onSliderPause) { this.settings.onSliderPause.apply(this); } } }, // public method to resume the slider resume: function () { if (this.settings.autoplay) { this.paused = false; this.slideStartTime = new Date(); for (var i = 0;i < this.slides[this.currentSlideIndex].children.length;i++) { this.slides[this.currentSlideIndex].children[i].$element.precss('animation-play-state',''); } // only add the additonal pause if there is time remaining if (this.slideTimeRemaining > 0 && !this.navigating) { if (this.settings.displayProgess) { this.$element.find('.pogoSlider-progressBar-duration').animate({'width':'100%'},this.slideTimeRemaining,'linear'); } this._slideTimeout(this.slideTimeRemaining); } if (this.settings.onSliderResume) { this.settings.onSliderResume.apply(this); } } }, // public method to change to the next slide nextSlide: function () { if (!this.navigating) { clearTimeout(this.slideTimeoutId); this.prevSlideIndex = this.currentSlideIndex; if (++this.currentSlideIndex > (this.numSlides - 1)) { this.currentSlideIndex = 0; } this._changeSlide(this.prevSlideIndex,this.currentSlideIndex); } }, // public method to change to previous slide prevSlide: function () { if (!this.navigating) { clearTimeout(this.slideTimeoutId); this.prevSlideIndex = this.currentSlideIndex; if (--this.currentSlideIndex < 0) { this.currentSlideIndex = this.numSlides - 1; } this._changeSlide(this.prevSlideIndex,this.currentSlideIndex); } }, // public method to change to a specified slide toSlide: function (slideIndex) { if (!this.navigating) { clearTimeout(this.slideTimeoutId); // return if the we are already on the called slide, // or the called slide is greater than the nuber of slides if (slideIndex === this.currentSlideIndex || slideIndex > (this.slides.length - 1)) { return; } this.prevSlideIndex = this.currentSlideIndex; this.currentSlideIndex = slideIndex; this._changeSlide(this.prevSlideIndex,this.currentSlideIndex); } }, // public method to destroy the plugin destroy: function () { this.paused = true; clearTimeout(this.slideTimeoutId); $.removeData(this.element, 'plugin_' + pluginName); }, // private method to change to the next slide // used for the autoplay functionality _changeToNext: function () { this.prevSlideIndex = this.currentSlideIndex; if (++this.currentSlideIndex > (this.numSlides - 1)) { this.currentSlideIndex = 0; } this._changeSlide(this.prevSlideIndex,this.currentSlideIndex); }, // private method to change slides _changeSlide: function (prevSlideIndex,currentSlideIndex) { var self = this; var slideTransitions; self._onSlideEnd(prevSlideIndex); self.navigating = true; // check if browser support modern css3 features, fallback to javascript animations if it does not if (supports.animation && supports.transition && supports.transform) { slideTransitions = self.slideTransitions; } else { slideTransitions = self.compatSlideTransitions; } // check if transitions is available, if not fall back to simple slide transition var slideTransition = slideTransitions[self.slides[currentSlideIndex].transition] ? self.slides[currentSlideIndex].transition : 'slide'; var slideTransitionCallback = slideTransitions[slideTransition].apply(self,[prevSlideIndex,currentSlideIndex]); setTimeout(function () { // if this function has a callback, call it if (slideTransitionCallback) { slideTransitionCallback(); } self.navigating = false; self._slideCleanup(prevSlideIndex,false); self._slideElementCleanup(prevSlideIndex); if (self.settings.autoplay) { self._slideTimeout(self.slides[currentSlideIndex].totalSlideDuration); } self._onSlideStart(currentSlideIndex); }, self.slides[currentSlideIndex].duration); }, // private method called on slide start _onSlideStart: function (slideIndex) { this.slides[slideIndex].$element.css('z-index', 1); if (this.settings.autoplay) { // need to set them regardless of whether it is paused or not this.slideStartTime = new Date(); this.slideTimeRemaining = this.slides[slideIndex].totalSlideDuration; if (this.settings.displayProgess && !this.paused) { this.slides[slideIndex].$element.find('.pogoSlider-progressBar-duration').css('width','0').animate({'width':'100%'},this.slideTimeRemaining,'linear'); } } if (this.slides[slideIndex].children.length > 0) { this._slideElementsTransitionIn(slideIndex); } // if slide is paused on change, preserve paused state to next slide if (this.paused) { for (var i = 0;i < this.slides[slideIndex].children.length;i++) { this.slides[slideIndex].children[i].$element.precss('animation-play-state','paused'); } } if (this.settings.generateNav) { this.$element.find('.pogoSlider-nav-btn').removeClass('pogoSlider-nav-btn--selected'); this.$element.find('.pogoSlider-nav-btn').eq(slideIndex).addClass('pogoSlider-nav-btn--selected'); } if (this.settings.onSlideStart) { // run the slideEnd callback this.settings.onSlideStart.apply(this); } }, // private method called on slide end _onSlideEnd: function (slideIndex) { var timeElapsed; if (this.settings.autoplay) { if (this.settings.displayProgess) { this.slides[slideIndex].$element.find('.pogoSlider-progressBar-duration').stop(true).css('width','0'); } } if (this.paused) { timeElapsed = this.slides[slideIndex].totalSlideDuration - this.slideTimeRemaining; for (var i = 0;i < this.slides[slideIndex].children.length;i++) { this.slides[slideIndex].children[i].$element.precss('animation-play-state',''); } } else { timeElapsed = this.slides[slideIndex].totalSlideDuration - (this.slideTimeRemaining - ((new Date()) - this.slideStartTime)); } // transition out, if slides elements have already transitioned in if (this.slides[slideIndex].children.length > 0 && timeElapsed > this.slides[slideIndex].elementTransitionDuration) { //if (this.slides[slideIndex].children.length > 0 && (this.slides[slideIndex].totalSlideDuration - (this.slideTimeRemaining - ((new Date()) - this.slideStartTime))) > this.slides[slideIndex].elementTransitionDuration) { this._slideElementsTransitionOut(slideIndex); } if (this.settings.onSlideEnd) { // run the slideEnd callback this.settings.onSlideEnd.apply(this); } }, // private methosd to animate in elements _slideElementsTransitionIn: function (slideIndex) { for (var i = 0; i < this.slides[slideIndex].children.length ; i++) { var el = this.slides[slideIndex].children[i]; el.$element .precss({ '*opacity': 1, 'animation-duration': el.duration + 'ms', 'animation-delay': el.startTime + 'ms' }) .addClass('pogoSlider-animation-' + el.transitionIn + 'In'); } }, // private methosd to animate out elements _slideElementsTransitionOut: function (slideIndex) { for (var i = 0; i < this.slides[slideIndex].children.length ; i++) { var el = this.slides[slideIndex].children[i]; el.$element .precss('animation-delay','') .removeClass('pogoSlider-animation-' + el.transitionIn + 'In') .addClass('pogoSlider-animation-' + el.transitionOut + 'Out'); } }, // ensure the slide are put back to their origninal state after they have transitioned out _slideCleanup: function (slideIndex,slideVisible) { if (this.slides[slideIndex].$element.find('.pogoSlider-slide-slice').length > 0) { this._removeSlideSlices(slideIndex); } this.slides[slideIndex].$element.attr('style',this.slides[slideIndex].$element.data('original-styles')).css('opacity',slideVisible? '1':'0'); }, // private method to clean up elements after slide ends _slideElementCleanup: function (slideIndex) { var removePogoSlideElementClasses = function (index,className) { return (className.match (/pogoSlider-(?:(?:transition)|(?:animation))(?:-[a-zA-Z0-9]+)?(?:--[a-z]+)?/gi) || []).join(' '); }; var removePogoSlideElementStyles = function (index,style) { return style.replace(/(?:-webkit-)?(?:-ms-)?((?:transition)|(?:animation))[^;]+;/g, ''); }; this.slides[slideIndex].$element.find('.pogoSlider-progressBar-duration').css('width','0'); for (var i = 0; i < this.slides[slideIndex].children.length ; i++) { this.slides[slideIndex].children[i].$element.removeClass(removePogoSlideElementClasses).attr('style',removePogoSlideElementStyles).css('opacity',0); } }, _createSlideSlices: function (slideIndex,rows,cols) { var numSlices = cols * rows; var sliceWidth = 100 / cols; var sliceHeight = 100 / rows; var sliceInnerWidth = 100 * cols; var sliceInnerHeight = 100 * rows; var $el = this.slides[slideIndex].$element; var styleAttr = $el.attr('style'); var timeElapsed; if (this.paused) { timeElapsed = this.slides[slideIndex].totalSlideDuration - this.slideTimeRemaining; } else { timeElapsed = this.slides[slideIndex].totalSlideDuration - (this.slideTimeRemaining - ((new Date()) - this.slideStartTime)); } // if the elements are still transitioning in in the previous slide // set a negative animation delay to prevent the animation from restarting if (slideIndex === this.prevSlideIndex && this.slides[slideIndex].children.length > 0 && timeElapsed < this.slides[slideIndex].elementTransitionDuration) { for (var i = 0;i < this.slides[slideIndex].children.length;i++) { var animationDelay = (this.slides[slideIndex].children[i].startTime - timeElapsed) + 'ms'; // change the animation delay, to reflect the actual amount of time this.slides[slideIndex].children[i].$element.precss('animation-delay',animationDelay); } } $el .children() .wrapAll('
    ') .wrapAll('
    '); $el.attr('style',function (i,style) { return style.replace(/(?:background)[^;]+;/g, ''); }); for (var j = 0; j < numSlices; j++) { var colNum = j % rows; var rowNum = Math.floor(j / rows); var slicePosStyles = 'width:' + sliceWidth + '%;height:' + sliceHeight + '%;top:' + (sliceHeight * colNum )+ '%;left:' + (sliceWidth * rowNum) + '%;'; var sliceInnerPosStyles = 'width:' + sliceInnerWidth + '%;height:' + sliceInnerHeight + '%;top:-' + (100 * colNum) + '%;left:-' + (100 * rowNum) + '%;'; var sliceInnerBackgroundStyles = ''; if(this.settings.preserveTargetSize) { sliceInnerBackgroundStyles = 'background-size:' + this.$element.width() + 'px ' + parseFloat(this.$element.css('padding-bottom')) + 'px;'; } var el = $el.find('.pogoSlider-slide-slice') .last(); if(j != 0) { el = el.clone(true,true) .appendTo(this.slides[slideIndex].element); } el.attr('style',slicePosStyles) .find('.pogoSlider-slide-slice-inner') .attr('style',styleAttr + sliceInnerPosStyles + sliceInnerBackgroundStyles); } }, // remove the slices and restore the slide back to its original state _removeSlideSlices: function (slideIndex) { var self = this; var $el = self.slides[slideIndex].$element; $el.attr('style',$el.data('original-styles')); // remove all slices except the first slide (which was the one we wrapped) $el.find('.pogoSlider-slide-slice').not(':first').remove(); // unwrap the remaining slides (to preserve event handler etc.) $el.find('.pogoSlider-slide-slice-inner').children().unwrap(); $el.find('.pogoSlider-slide-slice').children().unwrap(); }, _generateARandomArray: function (numItems) { var arr = []; for(var i = 0;i < numItems;i++) { arr.push(i); } for (var j = arr.length - 1; j > 0; j--) { var k = Math.floor(Math.random() * (j + 1)); var temp = arr[j]; arr[j] = arr[k]; arr[k] = temp; } return arr; }, // any slide transition effects can be added onto this object slideTransitions: { fade: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; // carry out transiton on previous slide and then clean up this.slides[prevSlideIndex].$element .precss({ '*opacity': '0', 'transition-duration': currentSlide.duration + 'ms' }); // transiton in the current slide currentSlide.$element .precss({ '*opacity': '1', 'transition-duration': currentSlide.duration + 'ms' }); }, slide: function (prevSlideIndex,currentSlideIndex) { var method; if (currentSlideIndex === 0 && prevSlideIndex === this.slides.length - 1) { method = 'slideLeft'; } else if (prevSlideIndex === 0 && currentSlideIndex === this.slides.length - 1) { method = 'slideRight'; } else if (currentSlideIndex > prevSlideIndex) { method = 'slideLeft'; } else { method = 'slideRight'; } return this.slideTransitions[method].apply(this,[prevSlideIndex,currentSlideIndex]); }, verticalSlide: function (prevSlideIndex,currentSlideIndex) { var method; if (currentSlideIndex === 0 && prevSlideIndex === this.slides.length - 1) { method = 'slideUp'; } else if (prevSlideIndex === 0 && currentSlideIndex === this.slides.length - 1) { method = 'slideDown'; } else if (currentSlideIndex > prevSlideIndex) { method = 'slideUp'; } else { method = 'slideDown'; } return this.slideTransitions[method].apply(this,[prevSlideIndex,currentSlideIndex]); }, slideLeft: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.slides[prevSlideIndex].$element .precss('animation-duration',currentSlide.duration + 'ms') .addClass('pogoSlider-animation-leftOut'); currentSlide.$element .precss({ '*opacity': '1', 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-leftIn'); return function () { self.slides[prevSlideIndex].$element.removeClass('pogoSlider-animation-leftOut'); currentSlide.$element.attr('style',currentSlide.$element.data('original-styles')).css('opacity','1').removeClass('pogoSlider-animation-leftIn'); }; }, slideRight: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.slides[prevSlideIndex].$element .precss('animation-duration',currentSlide.duration + 'ms') .addClass('pogoSlider-animation-rightOut'); currentSlide.$element .precss({ '*opacity': '1', 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-rightIn'); return function () { self.slides[prevSlideIndex].$element.removeClass('pogoSlider-animation-rightOut'); currentSlide.$element.attr('style',currentSlide.$element.data('original-styles')).css('opacity','1').removeClass('pogoSlider-animation-rightIn'); }; }, slideUp: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.slides[prevSlideIndex].$element .precss('animation-duration',currentSlide.duration + 'ms') .addClass('pogoSlider-animation-upOut'); currentSlide.$element .precss({ '*opacity': '1', 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-upIn'); return function () { self.slides[prevSlideIndex].$element.removeClass('pogoSlider-animation-upOut'); currentSlide.$element.attr('style',currentSlide.$element.data('original-styles')).css('opacity','1').removeClass('pogoSlider-animation-upIn'); }; }, slideDown: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.slides[prevSlideIndex].$element .precss('animation-duration',currentSlide.duration + 'ms') .addClass('pogoSlider-animation-downOut'); currentSlide.$element .precss({ '*opacity': '1', 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-downIn'); return function () { self.slides[prevSlideIndex].$element.removeClass('pogoSlider-animation-downOut'); currentSlide.$element.attr('style',currentSlide.$element.data('original-styles')).css('opacity','1').removeClass('pogoSlider-animation-downIn'); }; }, slideRevealLeft: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.slides[prevSlideIndex].$element .precss({ '*z-index': self.settings.baseZindex + 1, 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-leftOut'); currentSlide.$element.css({'opacity':1,'z-index':self.settings.baseZindex}); return function () { self.slides[prevSlideIndex].$element.removeClass('pogoSlider-animation-leftOut'); }; }, slideRevealRight: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.slides[prevSlideIndex].$element .precss({ '*z-index': self.settings.baseZindex + 1, 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-rightOut'); currentSlide.$element.css({'opacity':1,'z-index':self.settings.baseZindex}); return function () { self.slides[prevSlideIndex].$element.removeClass('pogoSlider-animation-rightOut'); }; }, slideOverLeft: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; currentSlide.$element .precss({ '*opacity': '1', '*z-index': this.settings.baseZindex + 1, 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-leftIn'); return function () { currentSlide.$element.attr('style',currentSlide.$element.data('original-styles')).css('opacity','1').removeClass('pogoSlider-animation-leftIn'); }; }, slideOverRight: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; currentSlide.$element .precss({ '*opacity': '1', '*z-index': this.settings.baseZindex + 1, 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-rightIn'); return function () { currentSlide.$element.attr('style',currentSlide.$element.data('original-styles')).css('opacity','1').removeClass('pogoSlider-animation-rightIn'); }; }, expandReveal: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.$element.css('overflow','visible'); self.slides[prevSlideIndex].$element .precss({ '*z-index': self.settings.baseZindex + 1, 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-expandReveal'); currentSlide.$element.css({'opacity':1,'z-index':self.settings.baseZindex}); return function () { self.$element.css('overflow',''); self.slides[prevSlideIndex].$element.removeClass('pogoSlider-animation-expandReveal'); }; }, shrinkReveal: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.slides[prevSlideIndex].$element .precss({ '*z-index': self.settings.baseZindex + 1, 'animation-duration': currentSlide.duration + 'ms' }) .addClass('pogoSlider-animation-shrinkReveal'); currentSlide.$element.css({'opacity':1,'z-index':self.settings.baseZindex}); return function () { self.slides[prevSlideIndex].$element.removeClass('pogoSlider-animation-shrinkReveal'); }; }, verticalSplitReveal: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; // init current slide and prev slides position self.slides[prevSlideIndex].$element.css('z-index',self.settings.baseZindex + 1); currentSlide.$element.css({'opacity': 1,'z-index': self.settings.baseZindex}); self._createSlideSlices(prevSlideIndex,1,2); var $slices = self.slides[prevSlideIndex].$element.find('.pogoSlider-slide-slice'); $slices.precss('animation-duration',currentSlide.duration + 'ms'); $slices.eq(0).addClass('pogoSlider-animation-leftOut'); $slices.eq(1).addClass('pogoSlider-animation-rightOut'); }, horizontalSplitReveal: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; // init current slide and prev slides position self.slides[prevSlideIndex].$element.css('z-index',self.settings.baseZindex + 1); currentSlide.$element.css({'opacity': 1,'z-index': self.settings.baseZindex}); self._createSlideSlices(prevSlideIndex,2,1); var $slices = self.slides[prevSlideIndex].$element.find('.pogoSlider-slide-slice'); $slices.precss('animation-duration',currentSlide.duration + 'ms'); $slices.eq(0).addClass('pogoSlider-animation-upOut'); $slices.eq(1).addClass('pogoSlider-animation-downOut'); }, zipReveal: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; // init current slide and prev slides position self.slides[prevSlideIndex].$element.css('z-index',self.settings.baseZindex + 1); currentSlide.$element.css({'opacity': 1,'z-index': self.settings.baseZindex}); self._createSlideSlices(prevSlideIndex,1,Math.round(self.$element.width() / 100)); var $slices = self.slides[prevSlideIndex].$element.find('.pogoSlider-slide-slice'); $slices.precss('animation-duration',currentSlide.duration + 'ms'); //var transitionDelay = currentSlide.duration / ($slices.length + 1); //var transitionDuration = transitionDelay * 2; $slices.each(function (index) { if (index % 2 === 0) { $(this).addClass('pogoSlider-animation-upOut'); } else { $(this).addClass('pogoSlider-animation-downOut'); } }); }, barRevealDown: function (prevSlideIndex,currentSlideIndex) { return this.slideTransitions['barReveal'].apply(this,[prevSlideIndex,currentSlideIndex,'down']); }, barRevealUp: function (prevSlideIndex,currentSlideIndex) { return this.slideTransitions['barReveal'].apply(this,[prevSlideIndex,currentSlideIndex,'up']); }, barReveal: function (prevSlideIndex,currentSlideIndex,direction) { var self = this; var currentSlide = self.slides[currentSlideIndex]; // init current slide and prev slides position self.slides[prevSlideIndex].$element.css('z-index',self.settings.baseZindex + 1); currentSlide.$element.css({'opacity': 1,'z-index': self.settings.baseZindex}); self._createSlideSlices(prevSlideIndex,1,Math.round(self.$element.width() / 100)); var $slices = self.slides[prevSlideIndex].$element.find('.pogoSlider-slide-slice'); var animationDelay = currentSlide.duration / ($slices.length + 1); var animationDuration = animationDelay * 2; $slices.precss('animation-duration',animationDuration + 'ms'); $slices.each(function (index) { if (direction === 'down') { $(this) .addClass('pogoSlider-animation-downOut') .precss('animation-delay',animationDelay * index + 'ms'); } else { $(this) .addClass('pogoSlider-animation-upOut') .precss('animation-delay',animationDelay * index + 'ms'); } }); }, blocksReveal: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; var height = 0; if(self.settings.preserveTargetSize) { height = parseFloat(self.$element.css('padding-bottom')); } else { height = self.$element.height(); } var numRows = Math.round(height / 100); // 100 is the target square size var numCols = Math.round(self.$element.width() / 100); // init current slide and prev slides position self.slides[prevSlideIndex].$element.css('z-index',self.settings.baseZindex + 1); currentSlide.$element.css({'opacity': 1,'z-index': self.settings.baseZindex}); var randArr = self._generateARandomArray(numRows * numCols); self._createSlideSlices(prevSlideIndex,numRows,numCols); var $slices = self.slides[prevSlideIndex].$element.find('.pogoSlider-slide-slice'); var animationDelay = currentSlide.duration / ($slices.length + 1); var animationDuration = animationDelay * 2; $slices.precss('animation-duration',animationDuration + 'ms'); for (var i = 0;i < $slices.length;i++) { $slices.eq(randArr.pop()) .precss('animation-delay',(animationDelay * i) + 'ms') .addClass('pogoSlider-animation-blocksReveal'); } }, fold: function (prevSlideIndex,currentSlideIndex) { var method; if (currentSlideIndex === 0 && prevSlideIndex === this.slides.length - 1) { method = 'foldLeft'; } else if (prevSlideIndex === 0 && currentSlideIndex === this.slides.length - 1) { method = 'foldRight'; } else if (currentSlideIndex > prevSlideIndex) { method = 'foldLeft'; } else { method = 'foldRight'; } return this.slideTransitions[method].apply(this,[prevSlideIndex,currentSlideIndex]); }, foldRight: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; var prevSlide = self.slides[prevSlideIndex]; // init current slide and prev slides position self.$element.css('overflow','visible'); prevSlide.$element.css({'overflow':'visible','z-index': self.settings.baseZindex}); currentSlide.$element.css({'opacity': 1,'overflow':'visible','z-index': self.settings.baseZindex + 1}); self._createSlideSlices(prevSlideIndex,1,2); var $prevSlideSlices = prevSlide.$element.find('.pogoSlider-slide-slice'); self._createSlideSlices(currentSlideIndex,1,2); var $currentSlideSlices = self.slides[currentSlideIndex].$element.find('.pogoSlider-slide-slice'); var $bottomLeft = $prevSlideSlices.eq(0); //var $bottomRight = $prevSlideSlices.eq(1); var $topLeft = $currentSlideSlices.eq(0); var $topRight = $currentSlideSlices.eq(1); currentSlide.$element.prepend($bottomLeft.detach()); prevSlide.$element.prepend($topLeft.detach()); $bottomLeft .addClass('pogoSlider-animation-foldInRight') .precss('animation-duration',currentSlide.duration + 'ms'); $topRight .addClass('pogoSlider-animation-foldOutRight') .precss('animation-duration',currentSlide.duration + 'ms'); return function () { // restore original overflow self.$element.css('overflow',''); // since the original element has been move, restore it to the original position currentSlide.$element.prepend($topLeft.detach()); prevSlide.$element.prepend($bottomLeft.detach()); // need to manually cleanup the current slide self._slideCleanup(currentSlideIndex,true); }; }, foldLeft: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; var prevSlide = self.slides[prevSlideIndex]; // init current slide and prev slides position self.$element.css('overflow','visible'); prevSlide.$element.css({'overflow':'visible','z-index': self.settings.baseZindex}); currentSlide.$element.css({'opacity': 1,'overflow':'visible','z-index': self.settings.baseZindex + 1}); self._createSlideSlices(prevSlideIndex,1,2); var $prevSlideSlices = prevSlide.$element.find('.pogoSlider-slide-slice'); self._createSlideSlices(currentSlideIndex,1,2); var $currentSlideSlices = self.slides[currentSlideIndex].$element.find('.pogoSlider-slide-slice'); //var $bottomLeft = $prevSlideSlices.eq(0); var $bottomRight = $prevSlideSlices.eq(1); var $topLeft = $currentSlideSlices.eq(0); var $topRight = $currentSlideSlices.eq(1); currentSlide.$element.append($bottomRight.detach()); prevSlide.$element.append($topRight.detach()); $bottomRight .addClass('pogoSlider-animation-foldInLeft') .precss('animation-duration',currentSlide.duration + 'ms'); $topLeft .addClass('pogoSlider-animation-foldOutLeft') .precss('animation-duration',currentSlide.duration + 'ms'); return function () { // restore original overflow self.$element.css('overflow',''); // need to manually cleanup the current slide self._slideCleanup(currentSlideIndex,true); }; } }, // plain javascript transitions for older browsers compatSlideTransitions: { fade: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; // carry out transiton on previous slide and then clean up this.slides[prevSlideIndex].$element.animate({opacity:0},currentSlide.duration); // transiton in the current slide currentSlide.$element.animate({opacity:1},currentSlide.duration); }, slide: function (prevSlideIndex,currentSlideIndex) { var method; if (prevSlideIndex > currentSlideIndex && prevSlideIndex === this.slides.length - 1 && currentSlideIndex === 0) { method = 'slideLeft'; } else if (prevSlideIndex < currentSlideIndex && prevSlideIndex === 0 && currentSlideIndex === this.slides.length - 1) { method = 'slideRight'; } else if (prevSlideIndex < currentSlideIndex) { method = 'slideLeft'; } else { method = 'slideRight'; } return this.slideTransitions[method].apply(this,[prevSlideIndex,currentSlideIndex]); }, verticalSlide: function (prevSlideIndex,currentSlideIndex) { var method; if (prevSlideIndex > currentSlideIndex && prevSlideIndex === this.slides.length - 1 && currentSlideIndex === 0) { method = 'slideUp'; } else if (prevSlideIndex < currentSlideIndex && prevSlideIndex === 0 && currentSlideIndex === this.slides.length - 1) { method = 'slideDown'; } else if (prevSlideIndex < currentSlideIndex) { method = 'slideUp'; } else { method = 'slideDown'; } return this.slideTransitions[method].apply(this,[prevSlideIndex,currentSlideIndex]); }, slideLeft: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; this.slides[prevSlideIndex].$element.animate({left:'-100%'},currentSlide.duration); currentSlide.$element.css({left:'100%','opacity':1}).animate({left:0},currentSlide.duration); }, slideRight: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; this.slides[prevSlideIndex].$element.animate({left:'100%'},currentSlide.duration); currentSlide.$element.css({left:'-100%','opacity':1}).animate({left:0},currentSlide.duration); }, slideUp: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; this.slides[prevSlideIndex].$element.animate({top:'-100%'},currentSlide.duration); currentSlide.$element.css({top:'100%','opacity':1}).animate({top:'0'},currentSlide.duration); }, slideDown: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; this.slides[prevSlideIndex].$element.animate({top:'100%'},currentSlide.duration); currentSlide.$element.css({top:'-100%','opacity':1}).animate({top:'0'},currentSlide.duration); }, slideRevealLeft: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; this.slides[prevSlideIndex].$element.css('z-index',this.settings.baseZindex + 1).animate({left:'-100%'},currentSlide.duration); currentSlide.$element.css({'opacity':1,'z-index':this.settings.baseZindex}); }, slideRevealRight: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; this.slides[prevSlideIndex].$element.css('z-index',this.settings.baseZindex + 1).animate({left:'100%'},currentSlide.duration); currentSlide.$element.css({'opacity':1,'z-index':this.settings.baseZindex}); }, slideOverLeft: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; currentSlide.$element.css({'opacity':1,'z-index':this.settings.baseZindex,'left': '100%'}).animate({'left':0},currentSlide.duration); }, slideOverRight: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; currentSlide.$element.css({'opacity':1,'z-index':this.settings.baseZindex,'right': '100%'}).animate({'right':0},currentSlide.duration); }, expandReveal: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; this.slides[prevSlideIndex].$element .css('z-index',this.settings.baseZindex + 1) .animate({ width:'120%', height: '120%', 'left': '-10%', 'top': '-10%', opacity: 0 },currentSlide.duration); currentSlide.$element.css({'opacity':1,'z-index':this.settings.baseZindex}); }, shrinkReveal: function (prevSlideIndex,currentSlideIndex) { var currentSlide = this.slides[currentSlideIndex]; this.slides[prevSlideIndex].$element .css('z-index',this.settings.baseZindex + 1) .animate({ width: '50%', height: '50%', 'left': '25%', 'top': '25%', opacity: 0 },currentSlide.duration); currentSlide.$element.css({'opacity':1,'z-index':this.settings.baseZindex}); }, verticalSplitReveal: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.slides[prevSlideIndex].$element.css('z-index',self.settings.baseZindex + 1); currentSlide.$element.css({'opacity': 1,'z-index': self.settings.baseZindex}); self._createSlideSlices(prevSlideIndex,1,2); var $slices = self.slides[prevSlideIndex].$element.find('.pogoSlider-slide-slice'); $slices.eq(0).animate({'left': '-50%'}, currentSlide.duration); $slices.eq(1).animate({'left': '100%'}, currentSlide.duration); }, horizontalSplitReveal: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; self.slides[prevSlideIndex].$element.css('z-index',self.settings.baseZindex + 1); currentSlide.$element.css({'opacity': 1,'z-index': self.settings.baseZindex}); self._createSlideSlices(prevSlideIndex,2,1); var $slices = self.slides[prevSlideIndex].$element.find('.pogoSlider-slide-slice'); $slices.eq(0).animate({'top': '-50%'}, currentSlide.duration); $slices.eq(1).animate({'top': '100%'}, currentSlide.duration); }, zipReveal: function (prevSlideIndex,currentSlideIndex) { var self = this; var currentSlide = self.slides[currentSlideIndex]; // init prev slide self.slides[prevSlideIndex].$element.css('z-index',self.settings.baseZindex + 1); // init current slide currentSlide.$element.css({'opacity': 1,'z-index': self.settings.baseZindex}); self._createSlideSlices(prevSlideIndex,1,Math.round(self.$element.width() / 100)); var $slices = self.slides[prevSlideIndex].$element.find('.pogoSlider-slide-slice'); var transitionDelay = currentSlide.duration / ($slices.length + 1); var transitionDuration = transitionDelay * 2; $slices.each(function (index) { if (index % 2 === 0) { $(this).delay(transitionDelay * index).animate({'top': '100%'}, transitionDuration); } else { $(this).delay(transitionDelay * index).animate({'top': '-100%'}, transitionDuration); } }); }, barRevealDown: function (prevSlideIndex,currentSlideIndex) { return this.slideTransitions['barReveal'].apply(this,[prevSlideIndex,currentSlideIndex,'down']); }, barRevealUp: function (prevSlideIndex,currentSlideIndex) { return this.slideTransitions['barReveal'].apply(this,[prevSlideIndex,currentSlideIndex,'up']); }, barReveal: function (prevSlideIndex,currentSlideIndex,direction) { var self = this; var currentSlide = self.slides[currentSlideIndex]; // init prev slide self.slides[prevSlideIndex].$element.css('z-index',self.settings.baseZindex + 1); // init current slide currentSlide.$element.css({'opacity': 1,'z-index': self.settings.baseZindex}); self._createSlideSlices(prevSlideIndex,1,Math.round(self.$element.width() / 100)); var $slices = self.slides[prevSlideIndex].$element.find('.pogoSlider-slide-slice'); var transitionDelay = currentSlide.duration / ($slices.length + 1); var transitionDuration = transitionDelay * 2; $slices.each(function (index) { if (direction === 'down') { $(this).delay(transitionDelay * index).animate({'top': '100%'}, transitionDuration); } else { $(this).delay(transitionDelay * index).animate({'top': '-100%'}, transitionDuration); } }); } } }; $.fn[ pluginName ] = function (options) { this.each(function() { if ( !$.data( this, 'plugin_' + pluginName ) ) { $.data( this, 'plugin_' + pluginName, new Plugin( this, options ) ); } }); // chain jQuery functions return this; }; })( jQuery, window, document );