(function($) { "use strict"; // ------------------------------------------------------------------------------------------- // aviaccordion slideshow // // accordion slider script // ------------------------------------------------------------------------------------------- $.aviaccordionslider = function(options, slider) { this.$slider = $( slider ); this.$inner = this.$slider.find('.aviaccordion-inner'); this.$slides = this.$inner.find('.aviaccordion-slide'); this.$images = this.$inner.find('.aviaccordion-image'); this.$last = this.$slides.filter(':last'); this.$titles = this.$slider.find('.aviaccordion-preview'); this.$titlepos = this.$slider.find('.aviaccordion-preview-title-pos'); this.$titlewrap = this.$slider.find('.aviaccordion-preview-title-wrap'); this.$win = $( window ); if($.avia_utilities.supported.transition === undefined) { $.avia_utilities.supported.transition = $.avia_utilities.supports('transition'); } this.browserprefix = $.avia_utilities.supported.transition; this.cssactive = this.browserprefix !== false ? true : false; this.transform3d = document.documentelement.classname.indexof('avia_transform3d') !== -1 ? true : false; this.ismobile = $.avia_utilities.ismobile; this.property = this.browserprefix + 'transform', this.count = this.$slides.length; this.open = false; this.autoplay = false; this.increasetitle = this.$slider.is(".aviaccordion-title-on-hover"); // this.cssactive = false; //testing no css3 browser this._init( options ); } $.aviaccordionslider.prototype = { _init: function( options ) { var _self = this; _self.options = $.extend({}, options, this.$slider.data()); $.avia_utilities.preload({container: this.$slider , single_callback: function(){ _self._kickoff(); }}); }, _kickoff: function() { var _self = this; _self._calcmovement(); _self._bindevents(); _self._showimages(); _self._autoplay(); }, _autoplay: function() { var _self = this; if(_self.options.autoplay) { _self.autoplay = setinterval(function() { _self.open = _self.open === false ? 0 : _self.open + 1; if(_self.open >= _self.count) _self.open = 0; _self._move({}, _self.open); }, _self.options.interval * 1000) } }, _showimages: function() { var _self = this, counter = 0, delay = 300, title_delay = this.count * delay; if(this.cssactive) { settimeout(function(){ _self.$slider.addclass('av-animation-active'); } , 10); } this.$images.each(function(i) { var current = $(this), timer = delay * (i + 1); settimeout(function() { current.avia_animate({opacity:1}, 400, function() { current.css($.avia_utilities.supported.transition + "transform", "none"); }); },timer); }); if(_self.increasetitle) title_delay = 0; this.$titlepos.each(function(i) { var current = $(this), new_timer = title_delay + 100 * (i + 1); settimeout(function() { current.avia_animate({opacity:1}, 200, function() { current.css($.avia_utilities.supported.transition + "transform", "none"); }); },new_timer); }); }, _bindevents: function() { var trigger = this.ismobile ? "click" : "mouseenter"; this.$slider.on(trigger,'.aviaccordion-slide', $.proxy( this._move, this)); this.$slider.on('mouseleave','.aviaccordion-inner', $.proxy( this._move, this)); this.$win.on('debouncedresize', $.proxy( this._calcmovement, this)); this.$slider.on('av-prev av-next', $.proxy( this._moveto, this)); if(this.ismobile) { this.$slider.avia_swipe_trigger({next: this.$slider, prev: this.$slider, event:{prev: 'av-prev', next: 'av-next'}}); } }, _titleheight: function() { var th = 0; this.$titlewrap.css({'height':'auto'}).each(function() { var new_h = $(this).outerheight(); if( new_h > th) th = new_h; }).css({'height':th + 2}); }, _calcmovement: function(event, allow_repeat) { var _self = this, containerwidth = this.$slider.width(), defaultpos = this.$last.data('av-left'), imgwidth = this.$images.filter(':last').width() || containerwidth, imgwidthpercent = math.floor((100 / containerwidth) * imgwidth), allimagewidth = imgwidthpercent * _self.count, modifier = 3, // 10 - _self.count, tempminleft = 100 - imgwidthpercent, minleft = tempminleft > defaultpos / modifier ? tempminleft : 0, oneleft = minleft / (_self.count -1 ), titlewidth = imgwidth; if(allimagewidth < 110 && allow_repeat !== false) { //set height if necessary var slideheight = this.$slider.height(), maxheight = (slideheight / allimagewidth) * 110 ; this.$slider.css({'max-height': maxheight}); _self._calcmovement(event, false); return; } //backup so the minimized slides dont get too small if(oneleft < 2) minleft = 0; this.$slides.each(function(i) { var current = $(this), newleft = 0, newright = 0, defaultleft = current.data('av-left'); if( minleft !== 0) { newleft = oneleft * i; newright = imgwidthpercent + newleft - oneleft; } else { newleft = defaultleft / math.abs(modifier); newright = 100 - ((newleft / i) * (_self.count - i)); } if(i == 1 && _self.increasetitle) { titlewidth = newright + 1; } if(_self.cssactive) { //if we are not animating based on the css left value but on css transform we need to subtract the left value newleft = newleft - defaultleft; newright = newright - defaultleft; defaultleft = 0; } current.data('av-calc-default', defaultleft); current.data('av-calc-left', newleft); current.data('av-calc-right', newright); }); if(_self.increasetitle) { _self.$titles.css({width: titlewidth + "%"});} }, _moveto: function(event) { var direction = event.type == "av-next" ? 1 : -1, nextslide = this.open === false ? 0 : this.open + direction; if(nextslide >= 0 && nextslide < this.$slides.length) this._move(event, nextslide); }, _move: function(event, direct_open) { var _self = this, slide = event.currenttarget, itemno = typeof direct_open != "undefined" ? direct_open : this.$slides.index(slide); this.open = itemno; if(_self.autoplay && typeof slide != "undefined") { clearinterval(_self.autoplay); _self.autoplay = false; } this.$slides.removeclass('aviaccordion-active-slide').each(function(i) { var current = $(this), dataset = current.data(), trans_val = i <= itemno ? dataset.avcalcleft : dataset.avcalcright, transition = {}, reset = event.type == 'mouseleave' ? 1 : 0, active = itemno === i ? _self.$titlewrap.eq(i) : false; if(active) current.addclass('aviaccordion-active-slide'); if(reset) { trans_val = dataset.avcalcdefault; this.open = false; } if(_self.cssactive) //do a css3 animation { //move the slides transition[_self.property] = _self.transform3d ? "translate3d(" + trans_val + "%, 0, 0)" : "translate(" + trans_val + "%,0)"; //3d or 2d transform? current.css(transition); } else { transition.left = trans_val + "%"; current.stop().animate(transition, 700, 'easeoutquint'); } }); } }; $.fn.aviaccordion = function( options ) { return this.each(function() { var active = $.data( this, 'aviaccordionslider' ); if(!active) { //make sure that the function doesnt get aplied a second time $.data( this, 'aviaccordionslider', 1 ); //create the preparations for fullscreen slider new $.aviaccordionslider( options, this ); } }); } })(jquery);