{"version":3,"sources":["jsdelivr-header.js","/npm/islider-h5@0.3.0/src/islider.js"],"names":[],"mappings":"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","file":"/npm/islider-h5@0.3.0/src/islider.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/islider-h5@0.3.0/src/islider.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * A simple, efficent mobile slider solution\n * @file iSlider.js\n\n/**\n * @constructor\n * @param {Object}      opts                参数集\n * @param {Element}     opts.dom            外层元素        Outer wrapper\n * @param {Object}      opts.data           数据列表        Content data\n */\n'use strict';\n\nimport isliderAnimate from './ext/islider_animate.js';\n\n/**\n * Check in array\n * @param oElement\n * @param aSource\n * @returns {boolean}\n */\nfunction inArray(oElement, aSource) {\n    return aSource.indexOf(oElement) > -1;\n};\n\n/**\n * Check is array\n * @param o\n * @returns {boolean}\n */\nfunction isArray(o) {\n    return Object.prototype.toString.call(o) === '[object Array]';\n};\n\n/**\n * @param obj\n * @param cls\n * @returns {Array|{index: number, input: string}}\n */\nfunction hasClass(obj, cls) {\n    return obj.className.match(new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'));\n}\n\n/**\n * @param obj\n * @param cls\n */\nfunction addClass(obj, cls) {\n    if (!hasClass(obj, cls)) {\n        obj.className += ' ' + cls;\n    }\n}\n\n/**\n * @param obj\n * @param cls\n */\nfunction removeClass(obj, cls) {\n    if (hasClass(obj, cls)) {\n        obj.className = obj.className.replace(RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'), '');\n    }\n}\n\n/**\n * Checck is url\n * @param {string} url\n * @returns {boolean}\n */\nfunction isUrl(url) {\n    if (/<\\/?[^>]*>/g.test(url))\n        return false;\n\n    let regex = '^' +\n        '(((https|http|ftp|rtsp|mms):)?//)?' +\n        '(([0-9a-z_!~*\\'().&=+$%-]+: )?[0-9a-z_!~*\\'().&=+$%-]+@)?' +\n        '(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-z_!~*\\'()-]+.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].[a-z]{2,6})?' +\n        '(:[0-9]{1,4})?' +\n        '([^\\?#]+)?' +\n        '(\\\\\\?[^#]+)?' +\n        '(#.+)?' +\n        '$';\n    return new RegExp(regex).test(url);\n}\n\n\n/**\n * @constructor\n *\n * iSlicer([[{Element} container,] {Array} datalist,] {object} options)\n *\n * @param {Element} container\n * @param {Array} datalist\n * @param {Object} options\n *\n * @description\n *  options.dom > container\n *  options.data > datalist\n */\nclass iSlider {\n    //ES6中新型构造器\n    constructor() {\n\n        let args = Array.prototype.slice.call(arguments, 0, 3);\n\n        if (!args.length) {\n            throw new Error('Parameters required!');\n        }\n\n        let opts = Object.prototype.toString.call(args.slice(-1)[0]) === '[object Object]' ? args.pop() : {};\n\n        switch (args.length) {\n            case 2:\n                opts.data = opts.data || args[1];\n            case 1:\n                opts.dom = opts.dom || args[0];\n        }\n\n        if (!opts.dom) {\n            throw new Error('Container can not be empty!');\n        }\n\n        if (!opts.data || !opts.data.length) {\n            throw new Error('Data must be an array and must have more than one element!');\n        }\n\n        /**\n         * Options\n         * @private\n         */\n        this._opts = opts;\n\n        /**\n         * listener\n         * @type {{}}\n         * @private\n         */\n        this._LSN = {};\n\n        /**\n         * Event handle\n         * @type {{}}\n         * @private\n         */\n        this._EventHandle = {};\n\n        opts = args = null;\n\n        /**\n         * Event white list\n         * @type {Array}\n         * @protected\n         */\n        this.EVENTS = 'initialize slide slideStart slideEnd slideChange slideChanged slideRestore slideRestored reloadData destroy'.split(' ');\n\n        /**\n         * Easing white list\n         * @type [Array, RegExp[]]\n         * @protected\n         */\n        this.EASING = [\n            'linear ease ease-in ease-out ease-in-out'.split(' '),\n            /cubic-bezier\\(([^\\d]*(\\d+.?\\d*)[^\\,]*\\,?){4}\\)/\n        ];\n\n        /**\n         * TAGS whitelist on fixpage mode\n         * @type {Array}\n         * @protected\n         */\n        this.FIX_PAGE_TAGS = 'SELECT INPUT TEXTAREA BUTTON LABEL'.split(' ');\n\n\n        /**\n         * Plugins\n         * @type {{}}\n         * @protected\n         */\n        this.plugins = {};\n\n        /**\n         * animation parmas:\n         *\n         * @param {Element}      dom             图片的外层<li>容器       Img wrapper\n         * @param {String}       axis            动画方向                animate direction\n         * @param {Number}       scale           容器宽度                Outer wrapper\n         * @param {Number}       i               <li>容器index          Img wrapper's index\n         * @param {Number}       offset          滑动距离                move distance\n         * @protected\n         */\n        this._animateFuncs = {\n            'default': function(dom, axis, scale, i, offset) {\n                dom.style.webkitTransform = 'translateZ(0) translate' + axis + '(' + (offset + scale * (i - 1)) + 'px)';\n            }\n        };\n\n        console.log(isliderAnimate)\n\n        // 扩展动画\n        this.extend(this._animateFuncs, isliderAnimate);\n\n        console.log(this._animateFuncs)\n\n        this._transitionEndEvent();\n        this._setting();\n\n        this.fire('initialize');\n        this._renderWrapper();\n        this._initPlugins();\n        this._bindHandler();\n    }\n\n    /**\n     * The empty function\n     * @private\n     */\n    EMPTY_FUNCTION() {\n\n    }\n\n    /**\n     * Extend\n     * @public\n     */\n    extend() {\n        let main, extend, args = arguments;\n\n        switch (args.length) {\n            case 0:\n                return;\n            case 1:\n                main = this;\n                extend = args[0];\n                break;\n            case 2:\n                main = args[0];\n                extend = args[1];\n                break;\n        }\n\n        for (let property in extend) {\n            if (extend.hasOwnProperty(property)) {\n                main[property] = extend[property];\n            }\n        }\n    }\n\n    /**\n     * @param name\n     * @param plugin\n     * @public\n     */\n    regPlugin(name, plugin) {\n        this.plugins[name] = this.plugins[name] || plugin;\n    }\n\n    /**\n     * @returns {string}\n     * @private\n     */\n    _transitionEndEvent() {\n        let evtName;\n        return function() {\n            if (evtName) {\n                return evtName;\n            }\n            let el = document.createElement('fakeElement');\n            let transitions = {\n                transition: 'transitionend',\n                OTransition: 'oTransitionEnd',\n                MozTransition: 'transitionend',\n                WebkitTransition: 'webkitTransitionEnd'\n            };\n            for (let t in transitions) {\n                if (transitions.hasOwnProperty(t) && el.style[t] !== undefined) {\n                    return (evtName = transitions[t]);\n                }\n            }\n        }\n    }\n\n\n    /**\n     * setting parameters for slider\n     * @private\n     */\n    _setting() {\n\n        /**\n         * The plugins\n         * @type {Array|{}|*}\n         * @private\n         */\n        this._plugins = this.plugins;\n\n        /**\n         *\n         * @type {{default: Function}|*}\n         * @private\n         */\n        this._animateFuncs = this._animateFuncs;\n\n        /**\n         * @type {boolean}\n         * @private\n         */\n        this.holding = false;\n\n        /**\n         * @type {boolean}\n         * @private\n         */\n        this.locking = false;\n\n        // --------------------------------\n        // - Set options\n        // --------------------------------\n\n        let opts = this._opts;\n\n        /**\n         * dom element wrapping content\n         * @type {Element}\n         * @public\n         */\n        this.wrap = opts.dom;\n\n        /**\n         * Data list\n         * @type {Array}\n         * @public\n         */\n        this.data = opts.data;\n\n        /**\n         * default slide direction\n         * @type {boolean}\n         * @public\n         */\n        this.isVertical = !!opts.isVertical;\n\n        /**\n         * Overspread mode\n         * @type {boolean}\n         * @public\n         */\n        this.isOverspread = !!opts.isOverspread;\n\n        /**\n         * Play time gap\n         * @type {number}\n         * @public\n         */\n        this.duration = opts.duration || 2000;\n\n        /**\n         * start from initIndex or 0\n         * @type {number}\n         * @public\n         */\n        this.initIndex = opts.initIndex > 0 && opts.initIndex < opts.data.length - 1 ? opts.initIndex : 0;\n\n        /**\n         * touchstart prevent default to fixPage\n         * @type {boolean}\n         * @public\n         */\n        this.fixPage = opts.fixPage == null ? true : !!opts.fixPage;\n\n        /**\n         * slideIndex\n         * @type {number}\n         * @private\n         */\n        this.slideIndex = this.slideIndex || this.initIndex || 0;\n\n        /**\n         * Axis\n         * @type {string}\n         * @public\n         */\n        this.axis = this.isVertical ? 'Y' : 'X';\n\n        /**\n         * reverseAxis\n         * @type {string}\n         * @private\n         */\n        this.reverseAxis = this.axis === 'Y' ? 'X' : 'Y';\n\n        /**\n         * Wrapper width\n         * @type {number}\n         * @private\n         */\n        this.width = this.wrap.clientWidth;\n\n        /**\n         * Wrapper height\n         * @type {number}\n         * @private\n         */\n        this.height = this.wrap.clientHeight;\n\n        /**\n         * Ratio height:width\n         * @type {number}\n         * @private\n         */\n        this.ratio = this.height / this.width;\n\n        /**\n         * Scale, size rule\n         * @type {number}\n         * @private\n         */\n        this.scale = this.isVertical ? this.height : this.width;\n\n        /**\n         * On slide offset position\n         * @type {{X: number, Y: number}}\n         * @private\n         */\n        this.offset = this.offset || {\n            X: 0,\n            Y: 0\n        };\n\n        /**\n         * Enable/disable touch events\n         * @type {boolean}\n         * @private\n         */\n        this.isTouchable = opts.isTouchable == null ? true : !!opts.isTouchable;\n\n        /**\n         * looping logic adjust\n         * @type {boolean}\n         * @private\n         */\n        this.isLooping = opts.isLooping && this.data.length > 1 ? true : false;\n\n        /**\n         * AutoPlay waitting milsecond to start\n         * @type {number}\n         * @private\n         */\n        this.delay = opts.delay || 0;\n\n        /**\n         * autoplay logic adjust\n         * @type {boolean}\n         * @private\n         */\n        this.isAutoplay = opts.isAutoplay && this.data.length > 1 ? true : false;\n\n        /**\n         * Animate type\n         * @type {string}\n         * @private\n         */\n        console.log(opts.animateType)\n        console.log(opts.animateType in this._animateFuncs)\n        this.animateType = opts.animateType in this._animateFuncs ? opts.animateType : 'default';\n\n        /**\n         * @protected\n         */\n        this._animateFunc = this._animateFuncs[this.animateType];\n\n        // little trick set, when you chooce tear & vertical same time\n        // iSlider overspread mode will be set true autometicly\n        if (this.isVertical && this.animateType === 'card') {\n            this.isOverspread = true;\n        }\n\n        /**\n         * Debug mode\n         * @type {function}\n         * @private\n         */\n        this.log = opts.isDebug ? function() {\n            global.console.log.apply(global.console, arguments);\n        } : this.EMPTY_FUNCTION;\n\n        // set Damping function\n        this._setUpDamping();\n\n        // stop autoplay when window blur\n        // this._setPlayWhenFocus();\n\n        /**\n         * animate process time (ms), default: 300ms\n         * @type {number}\n         * @public\n         */\n        this.animateTime = opts.animateTime != null && opts.animateTime > -1 ? opts.animateTime : 300;\n\n        /**\n         * animate effects, default: ease\n         * @type {string}\n         * @public\n         */\n        this.animateEasing =\n            inArray(opts.animateEasing, this.EASING[0]) || this.EASING[1].test(opts.animateEasing) ? opts.animateEasing : 'ease';\n\n        /**\n         * In slide animation\n         * @type {number}\n         * @private\n         */\n        this.inAnimate = 0;\n\n        /**\n         * Fix touch/mouse events\n         * @type {{hasTouch, startEvt, moveEvt, endEvt}}\n         * @private\n         */\n        this.deviceEvents = (function() {\n            let hasTouch = !!(('ontouchstart' in global) || global.DocumentTouch && document instanceof global.DocumentTouch);\n            return {\n                hasTouch: hasTouch,\n                startEvt: hasTouch ? 'touchstart' : 'mousedown',\n                moveEvt: hasTouch ? 'touchmove' : 'mousemove',\n                endEvt: hasTouch ? 'touchend' : 'mouseup'\n            };\n        })();\n\n        /**\n         * Init events\n         * @type {{}}\n         * @private\n         */\n        this.events = {};\n\n        // --------------------------------\n        // - Register events\n        // --------------------------------\n\n        // Callback function when your finger is moving\n        this.on('slide', opts.onslide, 1);\n\n        // Callback function when your finger touch the screen\n        this.on('slideStart', opts.onslidestart, 1);\n\n        // Callback function when the finger move out of the screen\n        this.on('slideEnd', opts.onslideend, 1);\n\n        // Callback function when slide to next/prev scene\n        this.on('slideChange', opts.onslidechange, 1);\n\n        // Callback function when next/prev scene, while animation has completed\n        this.on('slideChanged', opts.onslidechanged, 1);\n\n        // Callback function when restore to the current scene\n        this.on('slideRestore', opts.onsliderestore, 1);\n\n        // Callback function when restore to the current scene, while animation has completed\n        this.on('slideRestored', opts.onsliderestored, 1);\n\n        // --------------------------------\n        // - Plugins\n        // --------------------------------\n\n        /**\n         * @type {object}\n         * @private\n         */\n        this.pluginConfig = (function() {\n            if (isArray(opts.plugins)) {\n                let config = {};\n                opts.plugins.forEach(function pluginConfigEach(plugin) {\n                    if (isArray(plugin)) {\n                        config[plugin[0]] = plugin.slice(1);\n                    } else if (typeof plugin === 'string') {\n                        config[plugin] = [];\n                    }\n                });\n                return config;\n            } else {\n                return {}\n            }\n        })();\n\n        // Autoplay mode\n        this.delay ? global.setTimeout(this._autoPlay.bind(this), this.delay) : this._autoPlay();\n    };\n\n    /**\n     * Init plugins\n     * @private\n     */\n    _initPlugins() {\n        let config = this.pluginConfig;\n        let plugins = this._plugins;\n        for (let i in config) {\n            if (config.hasOwnProperty(i) && plugins.hasOwnProperty(i)) {\n                this.log('[INIT PLUGIN]:', i, plugins[i]);\n                plugins[i] && typeof plugins[i] === 'function' && typeof plugins[i].apply && plugins[i].apply(this, config[i]);\n            }\n        }\n    };\n\n    /**\n     * enable damping when slider meet the edge\n     * @private\n     */\n    _setUpDamping() {\n        let oneIn2 = this.scale >> 1;\n        let oneIn4 = oneIn2 >> 1;\n        let oneIn16 = oneIn4 >> 2;\n\n        /**\n         * init damping function\n         * @param distance\n         * @returns {*}\n         * @private\n         */\n        this._damping = function(distance) {\n            let dis = Math.abs(distance);\n            let result;\n\n            if (dis < oneIn2) {\n                result = dis >> 1;\n            } else if (dis < oneIn2 + oneIn4) {\n                result = oneIn4 + ((dis - oneIn2) >> 2);\n            } else {\n                result = oneIn4 + oneIn16 + ((dis - oneIn2 - oneIn4) >> 3);\n            }\n\n            return distance > 0 ? result : -result;\n        };\n    };\n\n    /**\n     * Get item type\n     * @param {number} index\n     * @returns {string}\n     * @private\n     */\n    _itemType(item) {\n        if (!isNaN(item)) {\n            item = this.data[item];\n        }\n        if (item.hasOwnProperty('type')) {\n            return item.type;\n        }\n        let content = item.content;\n        let type;\n        if (content == null) {\n            type = 'empty';\n        } else {\n            if (Boolean(content.nodeName) && Boolean(content.nodeType)) {\n                type = 'node';\n            } else if (typeof content === 'string') {\n                if (isUrl(content)) {\n                    type = 'pic';\n                } else {\n                    type = 'html';\n                }\n            } else {\n                type = 'unknown';\n            }\n        }\n\n        item.type = type;\n\n        return type;\n    };\n\n    /**\n     * render single item html by idx\n     * @param {HTMLElement} el ..\n     * @param {number} dataIndex  ..\n     * @private\n     */\n    _renderItem(el, dataIndex) {\n\n        let item,\n            self = this,\n            len = this.data.length;\n\n        let insertImg = function renderItemInsertImg() {\n            let simg = ' src=\"' + item.content + '\"';\n            // auto scale to full screen\n            if (item.height / item.width > self.ratio) {\n                simg += ' height=\"100%\"';\n            } else {\n                simg += ' width=\"100%\"';\n            }\n            if (self.isOverspread) {\n                el.style.background = 'url(' + item.content + ') no-repeat 50% 50%/cover';\n                simg += ' style=\"display:block;opacity:0;height:100%;width:100%;\"'\n            }\n            // for right button, save picture\n            el.innerHTML = '<img' + simg + ' />';\n        };\n\n        // clean scene\n        el.innerHTML = '';\n        el.style.background = '';\n\n        // get the right item of data\n        if (!this.isLooping && this.data[dataIndex] == null) {\n            // Stop slide when item is empty\n            return;\n        } else {\n            dataIndex = (len /* * Math.ceil(Math.abs(dataIndex / len))*/ + dataIndex) % len;\n            item = this.data[dataIndex];\n        }\n\n        let type = this._itemType(item);\n\n        this.log('[Render ITEM]:', type, dataIndex, item);\n\n        el.className = 'islider-' + type;\n\n        switch (type) {\n            case 'pic':\n                if (item.load === 2) {\n                    insertImg();\n                } else {\n                    let currentImg = new Image();\n                    currentImg.src = item.content;\n                    currentImg.onload = function() {\n                        item.height = currentImg.height;\n                        item.width = currentImg.width;\n                        insertImg();\n                        item.load = 2;\n                    };\n                }\n                break;\n            case 'dom':\n            case 'html':\n                el.innerHTML = item.content;\n                break;\n            case 'node':\n            case 'element':\n                // fragment, create container\n                if (item.content.nodeType === 11) {\n                    let entity = document.createElement('div');\n                    entity.appendChild(item.content);\n                    item.content = entity;\n                }\n                el.appendChild(item.content);\n                break;\n            default:\n                // do nothing\n                break;\n        }\n\n        this.fire('renderComplete');\n    };\n\n    /**\n     * Postponing the intermediate scene rendering\n     * until the target scene is completely rendered (render in event slideChanged)\n     * to avoid a jumpy feel when switching between scenes\n     * given that the distance of sliding is more than 1.\n     * e.g. ```this.slideTo(>+-1)```\n     *\n     * @private\n     */\n    _renderIntermediateScene() {\n        if (this._intermediateScene != null) {\n            this._renderItem.apply(this, this._intermediateScene);\n            this._intermediateScene = null;\n        }\n    };\n\n    /**\n     * Apply styles on changed\n     * @private\n     */\n    _changedStyles() {\n        let slideStyles = ['islider-prev', 'islider-active', 'islider-next'];\n        this.els.forEach(function changeStypeEach(el, index) {\n            removeClass(el, '(' + slideStyles.join('|') + ')');\n            addClass(el, slideStyles[index])\n        });\n    };\n\n    /**\n     * render list html\n     * @private\n     */\n    _renderWrapper() {\n        this.outer && (this.outer.innerHTML = '');\n        // initail ul element\n        let outer = this.outer || document.createElement('ul');\n        outer.className = 'islider-outer';\n\n        // storage li elements, only store 3 elements to reduce memory usage\n        /**\n         * Slider elements x3\n         * @type {Array}\n         * @public\n         */\n        this.els = [];\n\n        for (let i = 0; i < 3; i++) {\n            let li = document.createElement('li');\n            this.els.push(li);\n\n            // prepare style animation\n            this._animateFunc(li, this.axis, this.scale, i, 0);\n\n            // auto overflow in none fixPage mode\n            if (!this.fixPage) {\n                li.style.overflow = 'auto';\n            }\n\n            this.isVertical && (this.animateType === 'rotate' || this.animateType === 'flip') ? this._renderItem(li, 1 - i + this.slideIndex) : this._renderItem(li, i - 1 + this.slideIndex);\n\n            outer.appendChild(li);\n        }\n\n        this._changedStyles();\n\n        // Preload picture [ may be pic :) ]\n        global.setTimeout(function() {\n            this._preloadImg(this.slideIndex);\n        }.bind(this), 200);\n\n        // append ul to div#canvas\n        if (!this.outer) {\n            /**\n             * @type {Element}\n             * @public\n             */\n            this.outer = outer;\n            this.wrap.appendChild(outer);\n        }\n    };\n\n    /**\n     * Preload img when slideChange\n     * From current index +2, -2 scene\n     * @param {number} dataIndex means which image will be load\n     * @private\n     */\n    _preloadImg(dataIndex) {\n        if (this.data.length > 3) {\n            let data = this.data;\n            let len = data.length;\n            let self = this;\n            let loadImg = function preloadImgLoadingProcess(index) {\n                let item = data[index];\n                if (self._itemType(item) === 'pic' && !item.load) {\n                    let preloadImg = new Image();\n                    preloadImg.src = item.content;\n                    preloadImg.onload = function() {\n                        item.width = preloadImg.width;\n                        item.height = preloadImg.height;\n                        item.load = 2;\n                    };\n                    item.load = 1;\n                }\n            };\n\n            loadImg((dataIndex + 2) % len);\n            loadImg((dataIndex - 2 + len) % len);\n        }\n    };\n\n    /**\n     * Watch event transitionEnd\n     * @private\n     */\n    _watchTransitionEnd(time, eventType) {\n\n        let self = this;\n        let args = Array.prototype.slice.call(arguments, 1);\n        let lsn;\n        this.log('Event:', 'watchTransitionEnd::stuck::pile', this.inAnimate);\n\n        function handle(evt) {\n            if (lsn) {\n                global.clearTimeout(lsn);\n            }\n            self.inAnimate--;\n            self.log('Event:', 'watchTransitionEnd::stuck::release', self.inAnimate);\n            if (self.inAnimate === 0) {\n                //self.inAnimate = 0;\n                if (eventType === 'slideChanged') {\n                    self._changedStyles();\n                }\n                self.fire.apply(self, args);\n                self._renderIntermediateScene();\n            }\n            unWatch();\n        };\n\n        function unWatch() {\n            self.els.forEach(function translationEndUnwatchEach(el) {\n                el.removeEventListener(self._transitionEndEvent(), handle);\n            });\n            self.isAnimating = false;\n        }\n\n        if (time > 0) {\n            self.els.forEach(function translationEndElsEach(el) {\n                el.addEventListener(self._transitionEndEvent(), handle);\n            });\n        }\n        lsn = global.setTimeout(handle, time);\n        self.inAnimate++;\n    };\n\n    /**\n     * bind all event handler, when on PC, disable drag event\n     * @private\n     */\n    _bindHandler() {\n        let outer = this.outer;\n\n        if (this.isTouchable) {\n            let device = this.deviceEvents;\n            if (!device.hasTouch) {\n                outer.style.cursor = 'pointer';\n                // disable drag\n                outer.ondragstart = function(evt) {\n                    if (evt) {\n                        return false;\n                    }\n                    return true;\n                };\n            }\n            outer.addEventListener(device.startEvt, this);\n            outer.addEventListener(device.moveEvt, this);\n            outer.addEventListener(device.endEvt, this);\n            !this.deviceEvents.hasTouch && outer.addEventListener('mouseout', this);\n        }\n\n        global.addEventListener('orientationchange', this);\n        global.addEventListener('resize', this);\n\n        // Fix android device\n        global.addEventListener('focus', this, false);\n        global.addEventListener('blur', this, false);\n    };\n\n    /**\n     *  Uniformity admin event\n     *  Event router\n     *  @param {object} evt event object\n     *  @protected\n     */\n    handleEvent(evt) {\n        let device = this.deviceEvents;\n        switch (evt.type) {\n            case 'mousedown':\n                // block mouse buttons except left\n                if (evt.button !== 0) break;\n            case 'touchstart':\n                this.startHandler(evt);\n                break;\n            case device.moveEvt:\n                this.moveHandler(evt);\n                break;\n            case device.endEvt:\n            case 'mouseout': // mouseout event, trigger endEvent\n            case 'touchcancel':\n                this.endHandler(evt);\n                break;\n            case 'orientationchange':\n                this.orientationchangeHandler();\n                break;\n            case 'focus':\n                this._autoPlay();\n                break;\n            case 'blur':\n                this.pause();\n                break;\n            case 'resize':\n                this.resizeHandler();\n                break;\n        }\n    };\n\n    /**\n     *  touchstart callback\n     *  @param {object} evt event object\n     *  @protected\n     */\n    startHandler(evt) {\n        if (this.fixPage) {\n            if (this.FIX_PAGE_TAGS.indexOf(evt.target.tagName) < 0) {\n                evt.preventDefault();\n            }\n        }\n        if (this.holding || this.locking) {\n            return;\n        }\n        let device = this.deviceEvents;\n        this.isMoving = true;\n        this.pause();\n\n        this.log('Event: start');\n        this.fire('slideStart', evt, this);\n\n        this.startTime = new Date().getTime();\n        this.startX = device.hasTouch ? evt.targetTouches[0].pageX : evt.pageX;\n        this.startY = device.hasTouch ? evt.targetTouches[0].pageY : evt.pageY;\n    };\n\n    /**\n     *  touchmove callback\n     *  @param {object} evt event object\n     *  @protected\n     */\n    moveHandler(evt) {\n        if (!this.isMoving) {\n            return;\n        }\n        this.log('Event: moving');\n        let device = this.deviceEvents;\n        let len = this.data.length;\n        let axis = this.axis;\n        let reverseAxis = this.reverseAxis;\n        let offset = {\n            X: device.hasTouch ? (evt.targetTouches[0].pageX - this.startX) : (evt.pageX - this.startX),\n            Y: device.hasTouch ? (evt.targetTouches[0].pageY - this.startY) : (evt.pageY - this.startY)\n        };\n\n        this.offset = offset;\n\n        if (Math.abs(offset[axis]) - Math.abs(offset[reverseAxis]) > 10) {\n\n            evt.preventDefault();\n\n            this.fire('slide', evt, this);\n\n            if (!this.isLooping) {\n                if (offset[axis] > 0 && this.slideIndex === 0 || offset[axis] < 0 && this.slideIndex === len - 1) {\n                    offset[axis] = this._damping(offset[axis]);\n                }\n            }\n\n            for (let i = 0; i < 3; i++) {\n                let item = this.els[i];\n                item.style.webkitTransition = 'all 0s';\n                this._animateFunc(item, axis, this.scale, i, offset[axis]);\n            }\n        }\n    };\n\n    /**\n     *  touchend callback\n     *  @param {Object} evt event object\n     *  @protected\n     */\n    endHandler(evt) {\n        if (!this.isMoving) {\n            return;\n        }\n        this.log('Event: end');\n        this.isMoving = false;\n        let offset = this.offset;\n        let axis = this.axis;\n        let boundary = this.scale / 2;\n        let endTime = new Date().getTime();\n\n        // a quick slide time must under 300ms\n        // a quick slide should also slide at least 14 px\n        boundary = endTime - this.startTime > 300 ? boundary : 14;\n\n        let absOffset = Math.abs(offset[axis]);\n        let absReverseOffset = Math.abs(offset[this.reverseAxis]);\n\n        let getLink = function(el) {\n            if (el.tagName === 'A') {\n                if (el.href) {\n                    global.location.href = el.href\n                    return false;\n                }\n            } else if (el.className !== 'islider-pic') {\n                return false;\n            } else {\n                getLink(el.parentNode);\n            }\n        }\n\n        this.log(boundary, offset[axis], absOffset, absReverseOffset, this);\n\n        if (offset[axis] >= boundary && absReverseOffset < absOffset) {\n            this.slideTo(this.slideIndex - 1);\n        } else if (offset[axis] < -boundary && absReverseOffset < absOffset) {\n            this.slideTo(this.slideIndex + 1);\n        } else {\n            this.slideTo(this.slideIndex);\n        }\n\n        // create tap event if offset < 10\n        if (Math.abs(this.offset.X) < 10 && Math.abs(this.offset.Y) < 10) {\n            this.tapEvt = document.createEvent('Event');\n            this.tapEvt.initEvent('tap', true, true);\n            if (this.fixPage) {\n                evt.target && getLink(evt.target);\n            }\n            if (!evt.target.dispatchEvent(this.tapEvt)) {\n                evt.preventDefault();\n            }\n        }\n\n        this.offset.X = this.offset.Y = 0;\n\n        this._autoPlay();\n\n        this.fire('slideEnd', evt, this);\n    };\n\n    /**\n     *  orientationchange callback\n     *  @protected\n     */\n    orientationchangeHandler() {\n        global.setTimeout(function() {\n            this.reset();\n            this.log('Event: orientationchange');\n        }.bind(this), 100);\n    };\n\n    /**\n     * resize callback\n     * @protected\n     */\n    resizeHandler() {\n        if (this.height !== this.wrap.clientHeight || this.width !== this.wrap.clientWidth) {\n            this._LSN.resize && global.clearTimeout(this._LSN.resize);\n            this._LSN.resize = global.setTimeout(function() {\n                this.reset();\n                this.log('Event: resize');\n                this._LSN.resize && global.clearTimeout(this._LSN.resize);\n            }.bind(this), 500);\n        }\n    };\n\n    /**\n     *  slide logical, goto data index\n     *  @param {number} dataIndex the goto index\n     *  @public\n     */\n    slideTo(dataIndex, opts) {\n        if (this.locking) {\n            return;\n        }\n        this.unhold();\n        let animateTime = this.animateTime;\n        let animateType = this.animateType;\n        let animateFunc = this._animateFunc;\n        let data = this.data;\n        let els = this.els;\n        let idx = dataIndex;\n        let n = dataIndex - this.slideIndex;\n        let offset = this.offset;\n        let eventType;\n\n        if (typeof opts === 'object') {\n            if (opts.animateTime > -1) {\n                animateTime = opts.animateTime;\n            }\n            if (typeof opts.animateType === 'string' && opts.animateType in this._animateFuncs) {\n                animateType = opts.animateType;\n                animateFunc = this._animateFuncs[animateType];\n            }\n        }\n\n        // In the slide process, animate time is squeezed\n        let squeezeTime = Math.abs(offset[this.axis]) / this.scale * animateTime;\n\n        if (Math.abs(n) > 1) {\n            this._renderItem(n > 0 ? this.els[2] : this.els[0], idx);\n        }\n\n        // preload when slide\n        this._preloadImg(idx);\n\n        // get right item of data\n        if (data[idx]) {\n            this.slideIndex = idx;\n        } else {\n            if (this.isLooping) {\n                this.slideIndex = n > 0 ? 0 : data.length - 1;\n            } else {\n                this.slideIndex = this.slideIndex;\n                n = 0;\n            }\n        }\n\n        this.log('Index:' + this.slideIndex);\n\n        // keep the right order of items\n        let headEl, tailEl, step;\n\n        // slidechange should render new item\n        // and change new item style to fit animation\n        if (n === 0) {\n            // Restore to current scene\n            eventType = 'slideRestore';\n        } else {\n\n            if ((this.isVertical && (animateType === 'rotate' || animateType === 'flip')) ^ (n > 0)) {\n                els.push(els.shift());\n                headEl = els[2];\n                tailEl = els[0];\n                step = 1;\n            } else {\n                els.unshift(els.pop());\n                headEl = els[0];\n                tailEl = els[2];\n                step = -1;\n            }\n\n            if (Math.abs(n) === 1) {\n                this._renderIntermediateScene();\n                this._renderItem(headEl, idx + n);\n            } else if (Math.abs(n) > 1) {\n                this._renderItem(headEl, idx + step);\n                this._intermediateScene = [tailEl, idx - step];\n            }\n\n            headEl.style.webkitTransition = 'none';\n            headEl.style.visibility = 'hidden';\n\n            global.setTimeout(function() {\n                headEl.style.visibility = 'visible';\n            }, 200);\n\n            // Minus squeeze time\n            squeezeTime = animateTime - squeezeTime;\n\n            eventType = 'slideChange';\n        }\n\n        this.fire(eventType, this.slideIndex, els[1], this);\n        this._watchTransitionEnd(squeezeTime, eventType + 'd', this.slideIndex, els[1], this);\n\n        // do the trick animation\n        for (let i = 0; i < 3; i++) {\n            if (els[i] !== headEl) {\n                // Only applies to \"transform\"\n                els[i].style.webkitTransition = 'all ' + (squeezeTime / 1000) + 's ' + this.animateEasing;\n            }\n            animateFunc.call(this, els[i], this.axis, this.scale, i, 0);\n        }\n\n        // If not looping, stop playing when meet the end of data\n        if (this.isAutoplay && !this.isLooping && this.slideIndex === data.length - 1) {\n            this.pause();\n        }\n    };\n\n    /**\n     * Slide to next scene\n     * @public\n     */\n    slideNext() {\n        this.slideTo.apply(this, [this.slideIndex + 1].concat(Array.prototype.slice.call(arguments)));\n    };\n\n    /**\n     * Slide to previous scene\n     * @public\n     */\n    slidePrev() {\n        this.slideTo.apply(this, [this.slideIndex - 1].concat(Array.prototype.slice.call(arguments)));\n    };\n\n    /**\n     * Register plugin (run time mode)\n     * @param {string} name\n     * @param {function} plugin\n     * @param {...}\n     * @public\n     */\n    /* regPlugin() {\n         let args = Array.prototype.slice.call(arguments);\n         let name = args.shift(),\n             plugin = args[0];\n\n         if (!this._plugins.hasOwnProperty(name) && typeof plugin !== 'function') {\n             return;\n         }\n         if (typeof plugin === 'function') {\n             this._plugins[name] = plugin;\n             args.shift();\n         }\n\n         // Auto enable and init plugin when at run time\n         if (!inArray(name, this._opts.plugins)) {\n             this._opts.plugins.push(args.length ? [].concat([name], args) : name);\n             typeof this._plugins[name] === 'function' && this._plugins[name].apply(this, args);\n         }\n     };*/\n\n    /**\n     *  simple event delegate method\n     *  @param {string} evtType event name\n     *  @param {string} selector the simple css selector like jQuery\n     *  @param {function} callback event callback\n     *  @public\n     */\n    bind(evtType, selector, callback) {\n        function delegatedEventCallbackHandle(e) {\n            let evt = global.event ? global.event : e;\n            let target = evt.target;\n            let eleArr = document.querySelectorAll(selector);\n            for (let i = 0; i < eleArr.length; i++) {\n                if (target === eleArr[i]) {\n                    callback.call(target);\n                    break;\n                }\n            }\n        }\n\n        this.wrap.addEventListener(evtType, delegatedEventCallbackHandle, false);\n\n        let key = evtType + ';' + selector;\n        if (!this._EventHandle.hasOwnProperty(key)) {\n            this._EventHandle[key] = [\n                [callback],\n                [delegatedEventCallbackHandle]\n            ]\n        } else {\n            this._EventHandle[key][0].push(callback);\n            this._EventHandle[key][1].push(delegatedEventCallbackHandle);\n        }\n    };\n\n    delegate(evtType, selector, callback) {\n        function delegatedEventCallbackHandle(e) {\n            let evt = global.event ? global.event : e;\n            let target = evt.target;\n            let eleArr = document.querySelectorAll(selector);\n            for (let i = 0; i < eleArr.length; i++) {\n                if (target === eleArr[i]) {\n                    callback.call(target);\n                    break;\n                }\n            }\n        }\n\n        this.wrap.addEventListener(evtType, delegatedEventCallbackHandle, false);\n\n        let key = evtType + ';' + selector;\n        if (!this._EventHandle.hasOwnProperty(key)) {\n            this._EventHandle[key] = [\n                [callback],\n                [delegatedEventCallbackHandle]\n            ]\n        } else {\n            this._EventHandle[key][0].push(callback);\n            this._EventHandle[key][1].push(delegatedEventCallbackHandle);\n        }\n    };\n\n    /**\n     * remove event delegate from wrap\n     *\n     * @param {string} evtType event name\n     * @param {string} selector the simple css selector like jQuery\n     * @param {function} callback event callback\n     * @public\n     */\n    unbind(evtType, selector, callback) {\n        let key = evtType + ';' + selector;\n        if (this._EventHandle.hasOwnProperty(key)) {\n            let i = this._EventHandle[key][0].indexOf(callback);\n            if (i > -1) {\n                this.wrap.removeEventListener(evtType, this._EventHandle[key][1][i]);\n                this._EventHandle[key][0][i] = this._EventHandle[key][1][i] = null;\n                // delete this._EventHandle[key][0][i];\n                // delete this._EventHandle[key][1][i];\n                return true;\n            }\n        }\n\n        return false\n    };\n\n    unDelegate(evtType, selector, callback) {\n        let key = evtType + ';' + selector;\n        if (this._EventHandle.hasOwnProperty(key)) {\n            let i = this._EventHandle[key][0].indexOf(callback);\n            if (i > -1) {\n                this.wrap.removeEventListener(evtType, this._EventHandle[key][1][i]);\n                this._EventHandle[key][0][i] = this._EventHandle[key][1][i] = null;\n                // delete this._EventHandle[key][0][i];\n                // delete this._EventHandle[key][1][i];\n                return true;\n            }\n        }\n\n        return false\n    };\n\n    /**\n     * removeEventListener to release the memory\n     * @public\n     */\n    destroy() {\n        let outer = this.outer;\n        let device = this.deviceEvents;\n\n        this.fire('destroy');\n\n        // Clear events\n        if (this.isTouchable) {\n            outer.removeEventListener(device.startEvt, this);\n            outer.removeEventListener(device.moveEvt, this);\n            outer.removeEventListener(device.endEvt, this);\n            !this.deviceEvents.hasTouch && outer.removeEventListener('mouseout', this);\n        }\n        global.removeEventListener('orientationchange', this);\n        global.removeEventListener('focus', this);\n        global.removeEventListener('blur', this);\n\n        // Clear delegate events\n        for (let n in this._EventHandle) {\n            let handList = this._EventHandle[n][1];\n            for (let i = 0; i < handList.length; i++) {\n                if (typeof handList[i] === 'function') {\n                    this.wrap.removeEventListener(n.substr(0, n.indexOf(';')), handList[i]);\n                }\n            }\n        }\n        this._EventHandle = null;\n\n        // Clear timer\n        for (let n in this._LSN)\n            this._LSN.hasOwnProperty(n) && this._LSN[n] && global.clearTimeout(this._LSN[n]);\n\n        this._LSN = null;\n\n        this.wrap.innerHTML = '';\n    };\n\n    /**\n     * Register event callback\n     * @param {string} eventName\n     * @param {function} func\n     * @public\n     */\n    on(eventName, func, force) {\n        if (inArray(eventName, this.EVENTS) && typeof func === 'function') {\n            !(eventName in this.events) && (this.events[eventName] = []);\n            if (!force) {\n                this.events[eventName].push(func);\n            } else {\n                this.events[eventName].unshift(func);\n            }\n        }\n    };\n\n    /**\n     * Find callback function position\n     * @param eventName\n     * @param func\n     * @returns {number}\n     * @public\n     */\n    has(eventName, func) {\n        if (eventName in this.events) {\n            return this.events[eventName].indexOf(func);\n        }\n        return -1;\n    };\n\n    /**\n     * Remove event callback\n     * @param {string} eventName\n     * @param {function} func\n     * @public\n     */\n\n    off(eventName, func) {\n        let index = this.has(eventName, func);\n        if (index > -1) {\n            delete this.events[eventName][index];\n        }\n    };\n\n    /**\n     * Trigger event callbacks\n     * @param {string} eventName\n     * @param {*} args\n     * @public\n     */\n    fire(eventName) {\n        this.log('[EVENT FIRE]:', eventName, arguments);\n        if (eventName in this.events) {\n            let funcs = this.events[eventName];\n            for (let i = 0; i < funcs.length; i++) {\n                typeof funcs[i] === 'function' && funcs[i].apply && funcs[i].apply(this, Array.prototype.slice.call(arguments, 1));\n            }\n        }\n    };\n\n    /**\n     * reset & rerender\n     * @public\n     */\n    reset() {\n        this.pause();\n        this._setting();\n        this._renderWrapper();\n        this.delay && global.setTimeout(this._autoPlay.bind(this), this.delay);\n    };\n\n    /**\n     * reload Data & render\n     * @public\n     */\n    loadData(data, initIndex) {\n        this.pause();\n        this.slideIndex = initIndex || 0;\n        this.data = data;\n        this._renderWrapper();\n        this.fire('reloadData');\n        this.delay && global.setTimeout(this._autoPlay.bind(this), this.delay);\n    };\n\n    /**\n     * auto check to play and bind events\n     * @private\n     */\n    _autoPlay() {\n        // enable\n        if (this.isAutoplay) {\n            this.has('slideChanged', this.play) < 0 && this.on('slideChanged', this.play, 1);\n            this.has('slideRestored', this.play) < 0 && this.on('slideRestored', this.play, 1);\n            this.play();\n        } else {\n            this.off('slideChanged', this.play);\n            this.off('slideRestored', this.play);\n        }\n    };\n\n    /**\n     * Start autoplay\n     * @public\n     */\n    play() {\n        this._LSN.autoPlay && global.clearTimeout(this._LSN.autoPlay);\n        this._LSN.autoPlay = global.setTimeout(this.slideNext.bind(this), this.duration);\n    };\n\n    /**\n     * pause autoplay\n     * @public\n     */\n    pause() {\n        this._LSN.autoPlay && global.clearTimeout(this._LSN.autoPlay);\n    };\n\n    /**\n     * Maintaining the current scene\n     * Disable touch events, except for the native method.\n     * @public\n     */\n    hold() {\n        this.holding = true;\n    };\n\n    /**\n     * Release current scene\n     * unlock at same time\n     * @public\n     */\n    unhold() {\n        this.holding = false;\n        this.unlock();\n    };\n\n    /**\n     * You can't do anything on this scene\n     * lock native method calls\n     * hold at same time\n     * @public\n     */\n    lock() {\n        this.hold();\n        this.locking = true;\n    };\n\n    /**\n     * unlock native method calls\n     * @public\n     */\n    unlock() {\n        this.locking = false;\n    };\n\n}\n\nwindow['iSlider'] = iSlider;\n"]}