| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* eslint-disable */ |
| |
| |
| 'use strict' |
| |
| // require('./gesture') |
| import 'cubicbezier' |
| import 'animationjs' |
| import './carrousel.css' |
| |
| var doc = window.document |
| var ua = window.navigator.userAgent |
| var Firefox = !!ua.match(/Firefox/i) |
| var IEMobile = !!ua.match(/IEMobile/i) |
| var cssPrefix = Firefox ? '-moz-' : IEMobile ? '-ms-' : '-webkit-' |
| var stylePrefix = Firefox ? 'Moz' : IEMobile ? 'ms' : 'webkit' |
| |
| import * as timer from './timer' |
| var setTimeout = timer.setTimeout |
| var clearTimeout = timer.clearTimeout |
| |
| function getTransformOffset(element) { |
| var offset = { x: 0, y: 0 } |
| var transform = getComputedStyle(element)[stylePrefix + 'Transform'] |
| var regMatrix3d = new RegExp('^matrix3d\\((?:[-\\d.]+,\\s*){12}([-\\d.]+),' |
| + '\\s*([-\\d.]+)(?:,\\s*[-\\d.]+){2}\\)') |
| var regMatrix = /^matrix\((?:[-\d.]+,\s*){4}([-\d.]+),\s*([-\d.]+)\)$/ |
| var matched |
| |
| if (transform !== 'none') { |
| if ((matched = transform.match(regMatrix3d) |
| || transform.match(regMatrix))) { |
| offset.x = parseFloat(matched[1]) || 0 |
| offset.y = parseFloat(matched[2]) || 0 |
| } |
| } |
| |
| return offset |
| } |
| |
| var CSSMatrix = IEMobile ? 'MSCSSMatrix' : 'WebKitCSSMatrix' |
| var has3d = !!Firefox || CSSMatrix in window && 'm11' in new window[CSSMatrix]() |
| function getTranslate(x, y) { |
| x = parseFloat(x) |
| y = parseFloat(y) |
| |
| if (x != 0) { |
| x += 'px' |
| } |
| |
| if (y != 0) { |
| y += 'px' |
| } |
| |
| if (has3d) { |
| return 'translate3d(' + x + ', ' + y + ', 0)' |
| } |
| |
| return 'translate(' + x + ', ' + y + ')' |
| } |
| |
| var slice = Array.prototype.slice |
| function ArrayFrom(a) { |
| return slice.call(a) |
| } |
| |
| var incId = 0 |
| function Carrousel(element, options) { |
| var that = this |
| var views = [] |
| var pages = {} |
| var id = Date.now() + '-' + (++incId) |
| var root = document.createDocumentFragment() |
| |
| if (arguments.length === 1 && !(arguments[0] instanceof HTMLElement)) { |
| options = arguments[0] |
| element = null |
| } |
| |
| if (!element) { |
| element = document.createElement('ul') |
| root.appendChild(element) |
| } |
| options = options || {} |
| |
| element.setAttribute('data-ctrl-name', 'carrousel') |
| element.setAttribute('data-ctrl-id', id) |
| |
| function fireEvent(name, extra) { |
| var ev = doc.createEvent('HTMLEvents') |
| ev.initEvent(name, false, false) |
| if (extra) { |
| for (var key in extra) { |
| ev[key] = extra[key] |
| } |
| } |
| root.dispatchEvent(ev) |
| } |
| |
| element.style.position = 'relative' |
| element.style[stylePrefix + 'Transform'] = getTranslate(0, 0) |
| |
| var transformOffset = 0 |
| var items = {} |
| var itemLength = 0 |
| var itemStep = options.step || element.getBoundingClientRect().width |
| var itemIndex = 0 |
| |
| items.add = function (html) { |
| var li = document.createElement('li') |
| li.style.display = 'none' |
| li.style.float = 'left' |
| li.index = itemLength |
| if (typeof html === 'string') { |
| li.innerHTML = html |
| } else if (html instanceof HTMLElement) { |
| li.appendChild(html) |
| } |
| element.appendChild(li) |
| |
| Object.defineProperty(items, itemLength + '', { |
| get: function () { |
| return li |
| } |
| }) |
| |
| itemLength++ |
| return li |
| } |
| |
| function normalizeIndex(index) { |
| while (index < 0) { |
| index += itemLength |
| } |
| |
| while (index >= itemLength) { |
| index -= itemLength |
| } |
| |
| return index |
| } |
| |
| items.get = function (index) { |
| return items[normalizeIndex(index)] |
| } |
| |
| items.getCloned = function (index) { |
| var index = normalizeIndex(index) |
| var item = element.querySelector('[cloned="cloned-' + index + '"]') |
| var originalItem = items[index] |
| |
| // If there a _listeners attribute on the dom element |
| // then clone the _listeners as well for the events' binding |
| function cloneEvents(origin, clone, deep) { |
| var listeners = origin._listeners |
| if (listeners) { |
| clone._listeners = listeners |
| for (var type in listeners) { |
| clone.addEventListener(type, listeners[type]) |
| } |
| } |
| if (deep && origin.children && origin.children.length) { |
| for (var i = 0, l = origin.children.length; i < l; i++) { |
| cloneEvents(origin.children[i], clone.children[i], deep) |
| } |
| } |
| } |
| |
| if (!item) { |
| item = originalItem.cloneNode(true) |
| cloneEvents(originalItem, item, true) |
| |
| element.appendChild(item) |
| item.setAttribute('cloned', 'cloned-' + index) |
| item.index = index |
| } |
| |
| return item |
| } |
| |
| function activate(index) { |
| if (itemLength === 0) { |
| return |
| } |
| |
| var curItem = items.get(index) |
| var prevItem |
| var nextItem |
| |
| if (itemLength > 1) { |
| prevItem = items.get(index - 1) |
| |
| if (itemLength === 2) { |
| nextItem = items.getCloned(index + 1) |
| } else { |
| nextItem = items.get(index + 1) |
| } |
| |
| curItem.style.left = -transformOffset + 'px' |
| prevItem.style.left = (-transformOffset - itemStep) + 'px' |
| nextItem.style.left = (-transformOffset + itemStep) + 'px' |
| } |
| |
| itemIndex = curItem.index |
| |
| fireEvent('change', { |
| prevItem: prevItem, |
| curItem: curItem, |
| nextItem: nextItem |
| }) |
| } |
| |
| items.slide = function (index) { |
| if (itemLength === 0) { |
| return |
| } |
| |
| if (itemLength === 1) { |
| index = 0 |
| } |
| |
| var startOffset = getTransformOffset(element).x |
| var endOffset = transformOffset + itemStep * (-index) |
| var interOffset = endOffset - startOffset |
| |
| if (interOffset === 0) { |
| return |
| } |
| |
| var anim = new lib.animation( |
| 400, |
| lib.cubicbezier.ease, |
| function (i1, i2) { |
| element.style[stylePrefix + 'Transform'] |
| = getTranslate(startOffset + interOffset * i2, 0) |
| }).play().then(function () { |
| transformOffset = endOffset |
| element.style[stylePrefix + 'Transform'] = getTranslate(endOffset, 0) |
| index && activate(itemIndex + index) |
| }) |
| } |
| |
| items.next = function () { |
| items.slide(1) |
| } |
| |
| items.prev = function () { |
| items.slide(-1) |
| } |
| |
| ArrayFrom(element.children).forEach(function (el) { |
| el.style.position = 'absolute' |
| el.style.top = '0' |
| el.style.left = itemLength * itemStep + 'px' |
| el.style.float = 'left' |
| el.index = itemLength |
| Object.defineProperty(items, itemLength + '', { |
| get: function () { |
| return el |
| } |
| }) |
| |
| itemLength++ |
| }) |
| |
| Object.defineProperty(this, 'items', { |
| get: function () { |
| return items |
| } |
| }) |
| |
| Object.defineProperty(items, 'length', { |
| get: function () { |
| return itemLength |
| } |
| }) |
| |
| Object.defineProperty(items, 'index', { |
| get: function () { |
| return itemIndex |
| } |
| }) |
| |
| Object.defineProperty(items, 'step', { |
| get: function () { |
| return itemStep |
| }, |
| |
| set: function (v) { |
| itemStep = v |
| } |
| }) |
| |
| var starting = false |
| var playing = false |
| var isSliding = false |
| this.play = function () { |
| if (!starting) { |
| starting = true |
| return activate(0) |
| } |
| |
| if (!!playing) { |
| return |
| } |
| |
| playing = setTimeout(function play() { |
| isSliding = true |
| items.next() |
| setTimeout(function () { |
| isSliding = false |
| }, 500) |
| playing = setTimeout(play, 400 + playInterval) |
| }, 400 + playInterval) |
| } |
| |
| this.stop = function () { |
| if (!playing) { |
| return |
| } |
| clearTimeout(playing) |
| setTimeout(function () { |
| playing = false |
| }, 500) |
| } |
| |
| var autoplay = false |
| var readyToPlay = false |
| Object.defineProperty(this, 'autoplay', { |
| get: function () { |
| return autoplay |
| }, |
| set: function (v) { |
| autoplay = !!v |
| if (readyToPlay) { |
| clearTimeout(readyToPlay) |
| readyToPlay = false |
| } |
| if (autoplay) { |
| readyToPlay = setTimeout(function () { |
| that.play() |
| }, 2000) |
| } else { |
| that.stop() |
| } |
| } |
| }) |
| this.autoplay = !!options.autoplay |
| |
| var playInterval = 1500 |
| Object.defineProperty(this, 'playInterval', { |
| get: function () { |
| return playInterval |
| }, |
| set: function (n) { |
| playInterval = n |
| } |
| }) |
| this.playInterval = !!options.playInterval || 1500 |
| |
| if (options.useGesture) { |
| var panning = false |
| var displacement |
| element.addEventListener('panstart', function (e) { |
| if (!e.isVertical && !(panning && isSliding)) { |
| e.preventDefault() |
| e.stopPropagation() |
| |
| if (autoplay) { |
| that.stop() |
| } |
| |
| displacement = 0 |
| panning = true |
| } |
| }) |
| |
| element.addEventListener('panmove', function (e) { |
| if (!e.isVertical && panning) { |
| e.preventDefault() |
| e.stopPropagation() |
| displacement = e.displacementX |
| element.style[stylePrefix + 'Transform'] |
| = getTranslate(transformOffset + displacement, 0) |
| } |
| }) |
| |
| element.addEventListener('panend', function (e) { |
| if (!e.isVertical && panning) { |
| e.preventDefault() |
| e.stopPropagation() |
| panning = false |
| if (e.isSwipe) { |
| if (displacement < 0) { |
| items.next() |
| } else { |
| items.prev() |
| } |
| } else { |
| if (Math.abs(displacement) < itemStep / 2) { |
| items.slide(0) |
| } else { |
| items.slide(displacement < 0?1:-1) |
| } |
| } |
| |
| if (autoplay) { |
| setTimeout(function () { |
| that.play() |
| }, 2000) |
| } |
| } |
| }, false) |
| |
| element.addEventListener('swipe', function (e) { |
| if (!e.isVertical) { |
| e.preventDefault() |
| e.stopPropagation() |
| } |
| }) |
| } |
| |
| this.addEventListener = function (name, handler) { |
| this.root.addEventListener(name, handler, false) |
| } |
| |
| this.removeEventListener = function (name, handler) { |
| this.root.removeEventListener(name, handler, false) |
| } |
| |
| this.root = root |
| this.element = element |
| } |
| |
| !lib && (lib = {}) |
| lib.carrousel = Carrousel |
| |