/*! uikit 2.25.0 | http://www.getuikit.com | (c) 2014 yootheme | mit license */ (function(addon) { var component; if (window.uikit) { component = addon(uikit); } if (typeof define == "function" && define.amd) { define("uikit-slider", ["uikit"], function(){ return component || addon(uikit); }); } })(function(ui){ "use strict"; var dragging, delayidle, anchor, dragged, store = {}; ui.component('slider', { defaults: { center : false, threshold : 10, infinite : true, autoplay : false, autoplayinterval : 7000, pauseonhover : true, activecls : 'uk-active' }, boot: function() { // init code ui.ready(function(context) { settimeout(function(){ ui.$('[data-uk-slider]', context).each(function(){ var ele = ui.$(this); if (!ele.data('slider')) { ui.slider(ele, ui.utils.options(ele.attr('data-uk-slider'))); } }); }, 0); }); }, init: function() { var $this = this; this.container = this.element.find('.uk-slider'); this.focus = 0; ui.$win.on('resize load', ui.utils.debounce(function() { $this.resize(true); }, 100)); this.on('click.uk.slider', '[data-uk-slider-item]', function(e) { e.preventdefault(); var item = ui.$(this).attr('data-uk-slider-item'); if ($this.focus == item) return; // stop autoplay $this.stop(); switch(item) { case 'next': case 'previous': $this[item=='next' ? 'next':'previous'](); break; default: $this.updatefocus(parseint(item, 10)); } }); this.container.on({ 'touchstart mousedown': function(evt) { if (evt.originalevent && evt.originalevent.touches) { evt = evt.originalevent.touches[0]; } // ignore right click button if (evt.button && evt.button==2 || !$this.active) { return; } // stop autoplay $this.stop(); anchor = ui.$(evt.target).is('a') ? ui.$(evt.target) : ui.$(evt.target).parents('a:first'); dragged = false; if (anchor.length) { anchor.one('click', function(e){ if (dragged) e.preventdefault(); }); } delayidle = function(e) { dragged = true; dragging = $this; store = { touchx : parseint(e.pagex, 10), dir : 1, focus : $this.focus, base : $this.options.center ? 'center':'area' }; if (e.originalevent && e.originalevent.touches) { e = e.originalevent.touches[0]; } dragging.element.data({ 'pointer-start': {x: parseint(e.pagex, 10), y: parseint(e.pagey, 10)}, 'pointer-pos-start': $this.pos }); $this.container.addclass('uk-drag'); delayidle = false; }; delayidle.x = parseint(evt.pagex, 10); delayidle.threshold = $this.options.threshold; }, mouseenter: function() { if ($this.options.pauseonhover) $this.hovering = true; }, mouseleave: function() { $this.hovering = false; } }); this.resize(true); this.on('display.uk.check', function(){ if ($this.element.is(":visible")) { $this.resize(true); } }); // prevent dragging links + images this.element.find('a,img').attr('draggable', 'false'); // set autoplay if (this.options.autoplay) { this.start(); } }, resize: function(focus) { var $this = this, pos = 0, maxheight = 0, item, width, cwidth, size; this.items = this.container.children().filter(':visible'); this.vp = this.element[0].getboundingclientrect().width; this.container.css({'min-width': '', 'min-height': ''}); this.items.each(function(idx){ item = ui.$(this); size = item.css({'left': '', 'width':''})[0].getboundingclientrect(); width = size.width; cwidth = item.width(); maxheight = math.max(maxheight, size.height); item.css({'left': pos, 'width':width}).data({'idx':idx, 'left': pos, 'width': width, 'cwidth':cwidth, 'area': (pos+width), 'center':(pos - ($this.vp/2 - cwidth/2))}); pos += width; }); this.container.css({'min-width': pos, 'min-height': maxheight}); if (this.options.infinite && (pos <= (2*this.vp) || this.items.length < 5) && !this.itemsresized) { // fill with cloned items this.container.children().each(function(idx){ $this.container.append($this.items.eq(idx).clone(true).attr('id', '')); }).each(function(idx){ $this.container.append($this.items.eq(idx).clone(true).attr('id', '')); }); this.itemsresized = true; return this.resize(); } this.cw = pos; this.pos = 0; this.active = pos >= this.vp; this.container.css({ '-ms-transform': '', '-webkit-transform': '', 'transform': '' }); if (focus) this.updatefocus(this.focus); }, updatepos: function(pos) { this.pos = pos; this.container.css({ '-ms-transform': 'translatex('+pos+'px)', '-webkit-transform': 'translatex('+pos+'px)', 'transform': 'translatex('+pos+'px)' }); }, updatefocus: function(idx, dir) { if (!this.active) { return; } dir = dir || (idx > this.focus ? 1:-1); var item = this.items.eq(idx), area, i; if (this.options.infinite) { this.infinite(idx, dir); } if (this.options.center) { this.updatepos(item.data('center')*-1); this.items.filter('.'+this.options.activecls).removeclass(this.options.activecls); item.addclass(this.options.activecls); } else { if (this.options.infinite) { this.updatepos(item.data('left')*-1); } else { area = 0; for (i=idx;i this.vp) { this.updatepos(item.data('left')*-1); } else { if (dir == 1) { area = 0; for (i=this.items.length-1;i>=0;i--) { area += this.items.eq(i).data('width'); if (area == this.vp) { idx = i; break; } if (area > this.vp) { idx = (i < this.items.length-1) ? i+1 : i; break; } } if (area > this.vp) { this.updatepos((this.container.width() - this.vp) * -1); } else { this.updatepos(this.items.eq(idx).data('left')*-1); } } } } } // mark elements var left = this.items.eq(idx).data('left'); this.items.removeclass('uk-slide-before uk-slide-after').each(function(i){ if (i!==idx) { ui.$(this).addclass(ui.$(this).data('left') < left ? 'uk-slide-before':'uk-slide-after'); } }); this.focus = idx; this.trigger('focusitem.uk.slider', [idx,this.items.eq(idx),this]); }, next: function() { var focus = this.items[this.focus + 1] ? (this.focus + 1) : (this.options.infinite ? 0:this.focus); this.updatefocus(focus, 1); }, previous: function() { var focus = this.items[this.focus - 1] ? (this.focus - 1) : (this.options.infinite ? (this.items[this.focus - 1] ? this.items-1:this.items.length-1):this.focus); this.updatefocus(focus, -1); }, start: function() { this.stop(); var $this = this; this.interval = setinterval(function() { if (!$this.hovering) $this.next(); }, this.options.autoplayinterval); }, stop: function() { if (this.interval) clearinterval(this.interval); }, infinite: function(baseidx, direction) { var $this = this, item = this.items.eq(baseidx), i, z = baseidx, move = [], area = 0; if (direction == 1) { for (i=0;i this.vp) { break; } z = z+1 == this.items.length ? 0:z+1; } if (move.length) { move.foreach(function(itm){ var left = item.data('area'); itm.css({'left': left}).data({ 'left' : left, 'area' : (left+itm.data('width')), 'center': (left - ($this.vp/2 - itm.data('cwidth')/2)) }); item = itm; }); } } else { for (i=this.items.length-1;i >-1 ;i--) { area += this.items.eq(z).data('width'); if (z != baseidx) { move.push(this.items.eq(z)); } if (area > this.vp) { break; } z = z-1 == -1 ? this.items.length-1:z-1; } if (move.length) { move.foreach(function(itm){ var left = item.data('left') - itm.data('width'); itm.css({'left': left}).data({ 'left' : left, 'area' : (left+itm.data('width')), 'center': (left - ($this.vp/2 - itm.data('cwidth')/2)) }); item = itm; }); } } } }); // handle dragging ui.$doc.on('mousemove.uk.slider touchmove.uk.slider', function(e) { if (e.originalevent && e.originalevent.touches) { e = e.originalevent.touches[0]; } if (delayidle && math.abs(e.pagex - delayidle.x) > delayidle.threshold) { if (!window.getselection().tostring()) { delayidle(e); } else { dragging = delayidle = false; } } if (!dragging) { return; } var x, xdiff, pos, dir, focus, item, next, diff, i, z, itm; if (e.clientx || e.clienty) { x = e.clientx; } else if (e.pagex || e.pagey) { x = e.pagex - document.body.scrollleft - document.documentelement.scrollleft; } focus = store.focus; xdiff = x - dragging.element.data('pointer-start').x; pos = dragging.element.data('pointer-pos-start') + xdiff; dir = x > dragging.element.data('pointer-start').x ? -1:1; item = dragging.items.eq(store.focus); if (dir == 1) { diff = item.data('left') + math.abs(xdiff); for (i=0,z=store.focus;i diff) { focus = z; break; } z = z+1 == dragging.items.length ? 0:z+1; } } else { diff = item.data('left') - math.abs(xdiff); for (i=0,z=store.focus;i store.diff) { focus = z; break; } z = z+1 == dragging.items.length ? 0:z+1; } } else { for (i=0,z=store.focus;i