<file_sep>/**
 * # Popup
 *
 * 对话框.
 */

/**
 * @require [core](./core.js.html)
 * @require [Lite](./lite.js.html)
 */
var core = require('./core'),
    $ = require('./lite'),
    template = require('./tpl/popup')

/**
 * ## Popup Constructor
 *
 * Popup 构造函数。
 *
 * 使用：
 * ```js
 *   var popup = new Kub.Popup({
 *       message:'popup dialog'
 *   })
 * ```
 */
function Popup(options) {
    this.options = core.extend({}, _prototype.defaults, options || {})
    init(this)
}

var ANIMATION_CLASS = 'kub-popup-animation',
    EVENT_NAME = 'click',
    POPUP_SELECTOR = '.J_popup'

var $body

var _prototype = Popup.prototype

var render = function(popup,data) {
    var html = template(data)

    popup.$element = $(html).appendTo($body)
    return this
}

var bindEvents = function(popup){
    popup.$element.on(EVENT_NAME, function(e) {
        if($(e.target).closest(POPUP_SELECTOR).length){
            return
        }
        popup.close()
    })
}

var init = function(popup) {
    !$body && ($body = $(document.body))

    //渲染数据
    render(popup, popup.options)

    bindEvents(popup)

    popup.show()
}

/**
 * ## Popup.prototype.defaults
 *
 * 默认配置项。
 *
 * 配置项说明：
 *
 * * `message` : `String` 弹窗内容。
 *
 * * `className` : `String` 弹窗类名。
 *
 */
_prototype.defaults = {
    message: '',
    className: '',
    duration:350
}

/**
 * ## Popup.prototype.show
 *
 * 显示弹窗。
 * @return {instance} 返回当前实例
 */
_prototype.show = function() {

    clearTimeout(this._timer)
    this.$element.show().addClass(ANIMATION_CLASS)

    return this
}

/**
 * ## Popup.prototype.hide
 *
 * 隐藏弹窗。
 * @return {instance} 返回当前实例
 */
_prototype.hide = function(callback) {
    var self = this,
        $element = self.$element

    function handler(){
        $element.hide()
        callback && callback()
    }

    $element.removeClass(ANIMATION_CLASS)

    clearTimeout(self._timer)
    self._timer = setTimeout(function(){
        handler()
    },self.options.duration)

    return self
}

/**
 * ## Popup.prototype.close
 *
 * 关闭弹窗。
 * @return {instance} 返回当前实例
 */
_prototype.close = function() {
    var self = this,
        opts = self.options

    if (opts.closeHandler && opts.closeHandler.call(self) === false) {
        return self
    }

    self.hide(function(){
        self.$element.remove()
    })

    return self
}

module.exports = Popup
<file_sep>/**
 * # Lite
 *
 * 类似于`Zepto`，提供部分与Dom相关的方法，方法使用保持与`Zepto`一致。
 *
 */

/**
 * @require [polyfill](./polyfill.js.html)
 */
require('./polyfill')
var $, Lite

var ELEMENT_NODE = 1

var slice = Array.prototype.slice,
    readyRE = /complete|loaded|interactive/,
    idSelectorRE = /^#([\w-]+)$/,
    classSelectorRE = /^\.([\w-]+)$/,
    tagSelectorRE = /^[\w-]+$/,
    spaceRE = /\s+/g

var _document = document,
    _window = window,
    _undefined = undefined

function wrap(dom, selector) {
    dom = dom || []

    Object.setPrototypeOf ? Object.setPrototypeOf(dom, $.fn) : (dom.__proto__ = $.fn)

    dom.selector = selector || ''
    return dom
}

var isArray = Array.isArray ||
    function(object) {
        return object instanceof Array
    }

$ = Lite = function(selector, context) {
    context = context || _document
    var type = typeof selector

    if (!selector) {
        return wrap()
    }

    if (type === 'function') {
        return $.ready(selector)
    }

    if (selector._l) {
        return selector
    }

    if (isArray(selector)) {
        //$([document,document.body])
        return wrap(slice.call(selector).filter(function(item) {
            return item != null
        }), selector)
    }

    if (type === 'object') {
        //$(document)
        return wrap([selector], '')
    }

    if (type === 'string') {
        selector = selector.trim()

        if (selector[0] === '<') {
            var nodes = $.fragment(selector)
            return wrap(nodes, '')
        }

        if (idSelectorRE.test(selector)) {
            var found = _document.getElementById(RegExp.$1)

            return wrap(found ? [found] : [], selector)
        }

        return wrap($.qsa(selector, context), selector)
    }

    return wrap()
}

var createDelegator = function(handler, selector, element) {
    return function(e) {
        var match = $(e.target).closest(selector)

        // 1、存在代理节点
        // 2、排除$('.className').on('click','.className',handler) 情况
        if (match.length && match[0] !== element) {
            handler.apply(match[0], arguments)
        }
    }
}

!(function() {

    this.qsa = function(selector, context) {
        //querySelectorAll，如果存在两个相同ID，在ios7下，限定范围内查询 id 会返回两个节点
        context = context || _document
        selector = selector.trim()
        return slice.call(classSelectorRE.test(selector) ? context.getElementsByClassName(RegExp.$1) : tagSelectorRE.test(selector) ? context.getElementsByTagName(selector) : context.querySelectorAll(selector))
    }

    this.fragment = function(html) {
        var div = _document.createElement('div'),
            nodes
        div.innerHTML = html
        nodes = div.children
        div = null
        return slice.call(nodes)
    }

    this.ready = function(callback) {
        if (readyRE.test(_document.readyState) && _document.body) {
            callback($)
        } else {
            _document.addEventListener('DOMContentLoaded', function() {
                callback($)
            }, false)
        }
        return this
    }

    this.Event = function(type, props) {

        return new _window.CustomEvent(type, props)
    }

    this.fn = this.prototype = {

        _l: true,

        /**
         * ## Lite.prototype.each
         *
         * 循环所有节点。
         */
        each: function(callback) {
            var l = this.length,
                i, t
            for (i = 0; i < l; i++) {
                t = this[i]

                if (callback.call(t, i, t) === false) {
                    return this
                }
            }
            return this
        },

        /**
         * ## Lite.prototype.slice
         *
         * 切割节点。
         */
        slice: function() {
            return $(slice.apply(this, arguments))
        },

        /**
         * ## Lite.prototype.is
         *
         * 判断是否是指定的节点。
         */
        is: function(selector, element) {
            element = element ? element : this[0]

            if (element && element.nodeType === ELEMENT_NODE) {
                return element === selector ? true : typeof selector === 'string' && element.matches(selector)
            }

            return false
        },

        /**
         * ## Lite.prototype.closest
         *
         * 查找最近的节点。
         *
         * 原生closest不包含本身，`jQuery`与`Zepto`包含本身，保持与`Zepto`一致。
         *
         */
        closest: function(selector) {
            var element = this[0],dom

            dom = element && typeof selector === 'string' ? element.closest(selector) : this.is(selector, element) ? element : null

            return $(dom)
        },

        /**
         * ## Lite.prototype.find
         *
         * 查找节点，只支持选择器查找.
         */
        find: function(selector) {
            var dom = []

            this.each(function() {
                if (this.nodeType !== ELEMENT_NODE) return

                var elements = $.qsa(selector, this),
                    elementsLen = elements.length

                for (var i = 0; i < elementsLen; i++) {
                    dom.indexOf(elements[i]) === -1 && dom.push(elements[i])
                }
            })
            return $(dom)
        },

        /**
         * ## Lite.prototype.show
         *
         * 显示。
         */
        show: function() {
            return this.each(function() {

                this.style.display === 'none' && (this.style.display = '')

                $(this).css('display') === 'none' && (this.style.display = 'block')
            })
        },

        /**
         * ## Lite.prototype.hide
         *
         * 隐藏。
         */
        hide: function() {
            return this.each(function() {
                this.style.display = 'none'
            })
        },

        /**
         * ## Lite.prototype.css
         *
         * 修改或获取节点样式。
         */
        css: function(property, value) {
            var isObject = typeof property === 'object'

            //get
            if (value == null && !isObject) {
                var el = this[0]

                //not element
                if (el.nodeType !== ELEMENT_NODE) return

                return _window.getComputedStyle(el).getPropertyValue(property)
            }

            var css = ''
            if (isObject) {
                for (var key in property) {
                    property[key] == null ? this.each(function() {
                        this.style.removeProperty(key)
                    }) : (css += key + ':' + property[key] + ';')
                }
            } else {
                css += key + ':' + property[key] + ';'
            }

            //set
            css && this.each(function() {
                this.style.cssText += ';' + css
            })

            return this;
        },

        /**
         * ## Lite.prototype.offset
         *
         * 获取节点的`offset`，只支持获取，不支持设置。
         */
        offset: function() {
            if (!this.length) return null

            var ele = this[0],
                obj = ele.getBoundingClientRect()

            //why window.pageXOffset
            //http://www.cnblogs.com/hutaoer/archive/2013/02/25/3078872.html
            return {
                left: obj.left + _window.pageXOffset,
                top: obj.top + _window.pageYOffset,
                width: ele.offsetWidth,
                height: ele.offsetHeight
            }
        },

        /**
         * ## Lite.prototype.addClass
         *
         * 添加`class`。
         */
        addClass: function(name) {
            if (name == _undefined) return this

            return this.each(function() {
                if (!('className' in this)) return

                var classList = [],
                    className = this.className.trim(),
                    classNameList = className.split(spaceRE)

                name.trim().split(spaceRE).forEach(function(klass) {
                    classNameList.indexOf(klass) === -1 && classList.push(klass)
                })
                classList.length && (this.className = (className && (className + ' ')) + classList.join(' '))
            })
        },

        /**
         * ## Lite.prototype.removeClass
         *
         * 移除`class`。
         */
        removeClass: function(name) {
            return this.each(function() {
                if (!('className' in this)) return

                if (name === _undefined) return this.className = ''

                var className = this.className

                name.trim().split(spaceRE).forEach(function(klass) {
                    //zepto
                    className = className.replace(new RegExp('(^|\\s)' + klass + '(\\s|$)', 'g'), ' ')
                })

                this.className = className
            })
        },

        /**
         * ## Lite.prototype.eq
         *
         * 获取指定索引节点。
         */
        eq: function(idx) {
            idx = idx < 0 ? idx + this.length : idx
            return $(this[idx])
        },

        /**
         * ## Lite.prototype.off
         *
         * 取消绑定事件，不支持移除代理事件。
         */
        off: function(type, handler) {
            var types = type && type.trim().split(spaceRE)

            types && this.each(function() {
                var element = this

                types.forEach(function(name) {

                    if (handler) {

                        element.removeEventListener(name, handler.delegator || handler, false)
                    } else {
                        var handlers = element.listeners && element.listeners[name]

                        handlers && handlers.forEach(function(_handler) {

                            element.removeEventListener(name, _handler.delegator || _handler, false)
                        })
                    }
                })
            })

            return this
        },

        /**
         * ## Lite.prototype.on
         *
         * 监听事件，支持事件代理。
         *
         */
        on: function(type, selector, handler) {
            var f = true

            if (typeof selector !== 'string') {
                f = false
                handler = selector
            }

            if (typeof handler == 'function') {
                var types = type && type.trim().split(spaceRE)

                types && this.each(function() {
                    var element = this, listeners

                    if (f) {
                        handler.delegator = createDelegator(handler, selector, element)
                    }

                    listeners = element.listeners || {}

                    types.forEach(function(event) {

                        if (!listeners[event]) {
                            listeners[event] = []
                        }
                        listeners[event].push(handler)

                        element.addEventListener(event, handler.delegator || handler, false)
                    })
                    element.listeners = listeners
                })
            }

            return this
        },

        /**
         * ## Lite.prototype.trigger
         *
         * 触发事件。
         */
        trigger: function(type, detail) {
            return this.each(function() {
                this && this.dispatchEvent && this.dispatchEvent($.Event(type, {
                    detail: detail,
                    bubbles: true,
                    cancelable: true
                }))
            })
        },

        /**
         * ## Lite.prototype.attr
         *
         * 获取或者设置节点属性。
         */
        attr: function(name, value) {
            var result,
                type = typeof name

            if(type === 'string' && value == null) {

                if(!this.length || this[0].nodeType !== ELEMENT_NODE){
                    return _undefined
                }else{
                    return (!(result = this[0].getAttribute(name)) && name in this[0]) ? this[0][name] : result
                }
            }else{
                return this.each(function() {
                    if (this.nodeType !== ELEMENT_NODE) return

                    if (type === 'object') {
                        for (key in name) {
                            this.setAttribute(key, name[key])
                        }
                    } else {
                        this.setAttribute(name, value)
                    }
                })
            }
        },

        /**
         * ## Lite.prototype.removeAttr
         *
         * 移除节点属性。
         */
        removeAttr: function(name) {
            return this.each(function() {
                var self = this
                this.nodeType === ELEMENT_NODE && name.split(spaceRE).forEach(function(attribute) {
                    self.removeAttribute(attribute)
                })
            })
        },

        /**
         * ## Lite.prototype.remove
         *
         * 删除节点。
         */
        remove: function() {
            return this.each(function() {
                var parentNode = this.parentNode
                parentNode && parentNode.removeChild(this)
            })
        },

        /**
         * ## Lite.prototype.appendTo
         *
         * 将html插入到Dom节点内底部。
         */
        appendTo: function(target) {
            var dom = [],
                self = this

            target.each(function() {
                var node = this
                self.each(function() {
                    dom.push(node.appendChild(this))
                })
            })

            return $(dom)
        },

        /**
         * ## Lite.prototype.after
         *
         * 在Dom节点之后插入html。
         */
        after: function(html) {
            return this.each(function() {
                this.insertAdjacentHTML('afterend', html)
            })
        },

        /**
         * ## Lite.prototype.before
         *
         * 在Dom节点之前插入html。
         */
        before: function(html) {
            return this.each(function() {
                this.insertAdjacentHTML('beforebegin', html)
            })
        },

        /**
         * ## Lite.prototype.append
         *
         * 在Dom节点内底部插入html。
         */
        append: function(html) {
            return this.each(function() {
                this.insertAdjacentHTML('beforeend', html)
            })
        },

        /**
         * ## Lite.prototype.prepend
         *
         * 在Dom节点内头部插入html。
         */
        prepend: function(html) {
            return this.each(function() {
                this.insertAdjacentHTML('afterbegin', html)
            })
        },

        /**
         * ## Lite.prototype.html
         *
         * 设置或获取Dom html。
         *
         */
        html: function(html) {
            return html != _undefined ?
                this.each(function() {
                    this.innerHTML = html
                }) :
                (this[0] ? this[0].innerHTML : null)
        },

        /**
         * ## Lite.prototype.text
         * 设置或获取Dom文本内容。
         */
        text: function(text) {
            return text != _undefined ?
                this.each(function() {
                    this.textContent = text
                }) :
                (this[0] ? this[0].textContent : null)
        }
    }
}).call(Lite)

module.exports = _window.Zepto || Lite
<file_sep>/**
 * # Loader
 *
 * 加载等待框。
 *
 */

/**
 * @require [core](./core.js.html)
 * @extend [Dialog](./dialog.js.html)
 */
var core = require('./core'),
    Dialog = require('./dialog')

/**
 * ## Loader Constructor
 *
 * 继承于`Dialog`，可使用`Dialog`类中的方法。
 *
 * 使用方法：
 *
 * ```js
 * var loader = new Kub.Loader()
 *
 * //隐藏loader
 * loader.hide()
 *
 * var loader = new Kub.Loader({
 *     message: '定制提示内容'
 * })
 *
 * ```
 */
function Loader(options) {
    var opts = this.options = core.extend({}, _prototype.defaults, options || {}, {
        showHeader: false,
        buttons: null
    })

    Dialog.call(this, opts)
}

var _prototype = Loader.prototype = Object.create(Dialog.prototype)

_prototype.constructor = Loader

/**
 * ## Loader.prototype.defaults
 *
 * `Loader` 默认配置项。
 *
 * 配置项说明：
 *
 * * `className`: `String` 弹窗类名，修改时需加上`kub-loader`默认类名。
 *
 * * `message` : `String` 提示内容。
 *
 * * `modal` : `Boolean` 是否显示遮罩层。
 */
_prototype.defaults = {
    className: 'kub-loader',
    modal: true,
    message: '加载中…'
}

module.exports = Loader
<file_sep>/**
 * # Toast
 *
 * 提示框
 */

/**
 * @require [core](./core.js.html)
 * @extend [Dialog](./dialog.js.html)
 */
var core = require('./core'),
    Dialog = require('./dialog')

/**
 * ## Toast Constructor
 *
 * 继承于`Dialog`，可使用`Dialog`类中的方法。
 *
 * 使用方法：
 * ```js
 * var toast = new Kub.Toast({
 *     message:'操作成功。'
 * })
 * ```
 */
function Toast(options){
    var self = this,
        opts = this.options = core.extend({}, _prototype.defaults, options||{},{
            showHeader:false,
            buttons:null
        })

    Dialog.call(this, opts)

    //自动关闭
    setTimeout(function(){
        self.close()
    }, opts.delay)
}

var _prototype = Toast.prototype = Object.create(Dialog.prototype)

_prototype.constructor = Toast

/**
 * ## Toast.prototype.defaults
 *
 * `Toast`默认配置项。
 *
 * 配置项说明：
 *
 * * `message` : `String` 提示内容。
 *
 * * `className` : `String` 弹窗类名，修改时需加上`kub-toast`默认类名。
 *
 * * `top` : `Number` 距离顶部高度。
 *
 * * `delay` : `Number` 延迟时间。
 *
 * * `modal` : `Boolean` 是否显示遮罩层。
 */
_prototype.defaults = {
    message:'',
    className:'kub-toast',
    top:50,
    delay:2000,
    modal:false
}

_prototype.setPosition = function(){
    var top = this.options.top

    this.$element.css({
        top:core.isNumber(top) ? top + 'px' : top
    })
    return this
}

module.exports = Toast
<file_sep># 更新日志

## V2.4.0

### 新增功能

0. `lazyload` 组件新增校验是否支持webp格式方法`lazyload.prototype.isSoupportWebp`;
1. `lazyload` 组件初始化入参新增`imgToWebp`配置项，是否开启webp格式；

### 解决的bug

0. 修复`Datepicker`组件 && `swiper`组件在andriod7.0机型上面时间轴浮层滚动透传的问题；
1. `Datepicker`界面样式渐变属性`linear-gradient`写法向上兼容；

## v2.3.0

### 新增功能

0. 新增 `Popup` 组件；

1. 将 `Datepicker` 界面从 `Dialog` 换成 `Popup`;

## v2.2.0

### 解决的bug

0. 修复 `Datepicker.prototype.getDate` 方法返回多余时间区间问题；

1. 修复 `Dialog` 代码放到 `head` 区域时，无法插入节点；

2. 修复 `Lite.prototype.html` 无法插入 0 问题；

3. 修复 `Lite.prototype.text` 无法插入 0 问题；

4. 修复 `LazyLoad.prototype.isVisible` 对不可见元素检测失败问题；

### 新增功能

0. `LazyLoad` 组件增加`load`加载事件；

## v2.1.0

### 解决的bug

0. 修复`core.setQuerystring`在获取中文参数编码错误问题；

1. 修复`LazyLoad.prototype.load` 链式调用问题；

2. 修复`Lite`事件代理`this`指针指向问题；

3. 修复`Lite`事件代理不允许代理自身问题；

4. 修复`Lite.prototype.remove`无法移除文本节点问题；

### 优化点

0. 将兼容性解决代码抽离到`polyfill.js`中；

### 新增功能

0. 增加`Touch`移动事件组件；

1. 增加`Kub.version`版本号；

2. `Kub.Swiper`增加`auto`自动滚动功能；

## v2.0.3

### 解决的bug

0. 修复`Datepicker`键盘会弹出问题；

1. 修复`core.setQuerystring`会生成不符合规范的`a&a=1`地址；

## v2.0.2

### 解决的bug

0. 修复`Lite.prototype.text`问题；

## v2.0.1

### 解决的bug

0. 修复`swiper`组件切换失效问题；

1. 修复`core.extend`递归问题；

### 优化点

0. 去除`zepto`、`underscore`、`hammerjs`依赖；

1. 去除多余组件；

2. 去除多余不常用的API；

3. 将`os`模块抽离出`core`模块；

4. 增加`Lite`模块；

5. 增加嵌入样式到js中；

6. `Loader`组件增加可配置文案功能；

7. `setQuerystring`方法中`append`默认设置为`true`;

8. 增加样式可配置功能；
<file_sep>/**
 * # DatePicker
 *
 * 时间选择器。格式化参照 [`DateHelper`](./date.js.html)
 *
 */

/**
 * @require [core](./core.js.html)
 * @require [Lite](./lite.js.html)
 * @require [detect](./detect.js.html)
 * @require [Popup](./popup.js.html)
 * @require [DateHelper](./date.js.html)
 */
var core = require('./core'),
    $ = require('./lite'),
    os = require('./detect'),
    Popup = require('./popup'),
    template = require('./tpl/datepicker');

require('./date')

var HEIGHT_UNIT = 54,
    DURATION = 200,
    COLUMN_SELECTOR = '.kub-datepicker-column',
    POPUP_CLASS_NAME = 'kub-datepicker-popup',
    DIALOG_BUTTON_SELECTOR = '.J_dialogButton',
    COLUMN_ITEM_SELECTOR = 'li',
    COLUMN_CONTAINER_SELECTOR = 'ul'

var $document = $(document),
    isTouch = os.mobile

var START_EVENT = isTouch ? 'touchstart' : 'mousedown',
    MOVE_EVENT = isTouch ? 'touchmove' : 'mousemove',
    END_EVENT = isTouch ? 'touchend' : 'mouseup',
    EVENT_NAME = 'click'

//渲染对话框
var render = function(datepicker) {

    var options = datepicker.options,
        html = template(options)

    var popup = datepicker.$element[0].popup = new Popup({
        title: options.title,
        message: html,
        className: options.className || '' + ' ' + POPUP_CLASS_NAME,
        closeHandler:function(){
            this.hide()
            return false
        }
    })

    var handlers = [
        function(e) {
            var cancel = options.cancel
            cancel ? cancel.call(this, e, datepicker) : popup.hide()
        },
        function(e) {
            var confirm = options.confirm,
                formatDate = datepicker.getDate().format(options.format)

            confirm ? confirm.call(this, e, datepicker, formatDate) : function() {
                datepicker.$element[0].value = formatDate
                popup.hide()
            }()
        }
    ]

    //注册按钮事件
    popup.$element.find(DIALOG_BUTTON_SELECTOR).on(EVENT_NAME, function(e) {
        var index = parseInt($(this).attr('data-index')),
            handler = handlers[index]

        handler && handler.call(this, e, popup)
    })
}

/**
 * ## DatePicker Constructor
 *
 * `DatePicker` 构造函数。
 *
 * 使用：
 * ```js
 *  //采用默认的format yyyy-MM-dd
 *  var datepicker = new Kub.DatePicker($('#J_datepicker'))
 *
 *  //采用默认的format yyyy-MM-dd
 *  //可配置title 与 本地化
 *  var datepicker1 = new Kub.DatePicker($('#J_datepicker1'),{
 *      title:'Date Picker',
 *      locale:'en'
 *  })
 *
 *  //自定义format
 *  var datepicker2 = new Kub.DatePicker($('#J_datepicker2'),{
 *      title:'选择时间',
 *      format:'yyyy-MM-dd,HH:mm:ss',
 *      confirm:function(e,datepicker,formatDate){
 *          //格式化后的 formatDate
 *          //手动关闭选择器
 *          datepicker.hide()
 *      }
 *  })
 * ```
 */

var _prototype

//获取触摸点
var getCoords = function(event) {
    var touches = event.touches,
        data = touches && touches.length ? touches : event.changedTouches

    return {
        x: isTouch ? data[0].pageX : event.pageX,
        y: isTouch ? data[0].pageY : event.pageY
    }
}

//获取偏移
var getDistance = function(event, startCoords) {
    var coords = getCoords(event),
        x = coords.x - startCoords.x,
        y = coords.y - startCoords.y

    return {
        distanceX: x,
        distanceY: y
    }
}

var returnFalse = function() {
    return false
}

//获取当月最大天数
var getDays = function(year, month) {
    return new Date(year, month + 1, 0).getDate()
}

//根据偏移量算出索引值
var getIndexByDistance = function(y, max) {
    //去掉空白的两行
    max = max - 5
    y = y > 0 ? 0 : y
    var index = Math.round(Math.abs(y) / HEIGHT_UNIT)
    return index > max ? max : index
}

//设置偏移速度
var setDuration = function($this, duration) {
    var $container = $this[0].$container,
        transition = 'transform ' + duration + 'ms ease-out',
        webkiTransition = '-webkit-transform ' + duration + 'ms ease-out'

    $container.css({
        '-webkit-transition': duration != null ? webkiTransition : duration,
        'transition': duration != null ? transition : duration
    })
}

//设置偏移速度
var setTranslate = function($this, x, y) {
    var $container = $this[0].$container,
        t

    core.isNumber(x) && (x += 'px')
    core.isNumber(y) && (y += 'px')

    t = 'translate3d(' + x + ',' + y + ',0)'

    !$container && ($container = $this[0].$container = $this.find(COLUMN_CONTAINER_SELECTOR))

    $container.css({
        '-webkit-transform': t,
        'transform': t
    })
}


//设置时间选择器中某一列的值，可设置年、月、日、时、分、秒的值
var setValue = function(datepicker, name, value) {
    var $this = datepicker._ui[name],
        index, $item

    if ($this && ($item = $this.find(COLUMN_ITEM_SELECTOR + '[data-value="' + value + '"]')).length) {
        index = parseInt($item.attr('data-index'))

        $this[0].index = index

        setTranslate($this, 0, -index * HEIGHT_UNIT)
    }

}

//获取时间选择器中某一列的值，可获取年、月、日、时、分、秒的值
var getValue = function(datepicker, name) {
    var $this = datepicker._ui[name],
        $items, index, value

    if ($this) {
        $items = $this.find(COLUMN_ITEM_SELECTOR)
        index = $this[0].index+2
        value = parseInt($items.eq(index).attr('data-value'))
    }

    return value ? value : 0
}

//移除不需要的列
var removeColumns = function(format, ui) {
    format.indexOf('y') === -1 && (ui.year.remove(), ui.year = null)
    format.indexOf('M') === -1 && (ui.month.remove(), ui.month = null)
    format.indexOf('d') === -1 && (ui.day.remove(), ui.day = null)
    format.indexOf('H') === -1 && (ui.hour.remove(), ui.hour = null)
    format.indexOf('m') === -1 && (ui.minute.remove(), ui.minute = null)
    format.indexOf('s') === -1 && (ui.second.remove(), ui.second = null)
}



//重置每月最大天数
var setActualDays = function(datepicker, year, month) {
    var days = getDays(year, month),
        day = getValue(datepicker, 'day')

    days < day && setValue(datepicker, 'day', days)
}

//绑定输入框聚焦事件
var bindInputFocusEvent = function(datepicker) {
    datepicker.$element.on(EVENT_NAME, function(event) {
        //使输入框失去焦点
        datepicker.$element[0].blur()

        datepicker.show()

        event.preventDefault()
    })
}

//绑定事件
var bindEvents = function(datepicker) {
    var flag = false,
        $activeElement,
        $element = datepicker.$element[0].popup.$element

    var start = function(event) {
            flag = true
            event = event.originalEvent || event

            this.startCoords = getCoords(event)

            $activeElement = $(this)

            setDuration($activeElement, null)
        },
        move = function(event) {
            if (!flag) return
            event = event.originalEvent || event

            var distance = getDistance(event, $activeElement[0].startCoords)

            setTranslate($activeElement, 0, distance.distanceY - HEIGHT_UNIT * $activeElement[0].index)

            event.preventDefault()
        },
        end = function(event) {
            if (!flag) return
            flag = false
            event = event.originalEvent || event

            var distance = getDistance(event, $activeElement[0].startCoords),
                max = $activeElement.find(COLUMN_ITEM_SELECTOR).length,
                index = getIndexByDistance(distance.distanceY - HEIGHT_UNIT * $activeElement[0].index, max)

            $activeElement[0].index = Math.abs(index)

            //验证是否存在31,30,29天
            setActualDays(datepicker, getValue(datepicker, 'year'), getValue(datepicker, 'month'))

            setDuration($activeElement, DURATION)

            setTranslate($activeElement, 0, -HEIGHT_UNIT * $activeElement[0].index)
        }

    datepicker._ui.columns.each(function() {

        $(this).on(START_EVENT, function() {
            start.apply(this, arguments)
        })

        this.onselectstart = returnFalse
        this.ondragstart = returnFalse
    })

    $element.on(MOVE_EVENT, move)
    $element.on(END_EVENT, end)

    bindInputFocusEvent(datepicker)
}

function init(datepicker) {
    var options = datepicker.options,
        $element,
        ui

    //创建对话框
    render(datepicker)

    $element = datepicker.$element[0].popup.$element

    //缓存dom
    ui = datepicker._ui = {
        year: $element.find('.year'),
        month: $element.find('.month'),
        day: $element.find('.day'),
        hour: $element.find('.hour'),
        minute: $element.find('.minute'),
        second: $element.find('.second')
    }
    ui.columns = $element.find(COLUMN_SELECTOR)

    //设置块高度
    HEIGHT_UNIT = ui.columns.find(COLUMN_ITEM_SELECTOR)[0].offsetHeight || HEIGHT_UNIT

    //隐藏对话框
    datepicker.hide()

    //移除
    removeColumns(options.format, ui)

    //设置本地化
    $element.addClass('kub-datepicker-' + options.locale)

    //设置默认时间
    datepicker.setDate(options.date)

    //绑定事件
    bindEvents(datepicker)
}

function DatePicker(element, options) {
    this.$element = $(element)
    this.options = core.extend({}, _prototype.defaults, options || {})

    init(this)
}

_prototype = DatePicker.prototype

/**
 * ## DatePicker.prototype.defaults
 *
 * 默认配置项
 *
 * 配置项说明：
 *
 * * `locale`: `String` 本地化。本地化采用CSS实现。
 *
 * * `title`: `String` 时间选择器弹窗名称。
 *
 * * `confirmText`: `String` 确认按钮名称。
 *
 * * `confirm`: `Function` 单击确认按钮时触发的事件。
 *
 * > 如果未传递，单击时会默认关闭弹窗，并对输入框赋值。
 * >
 * > 如果传递，需调用`datepicker.close()`手动关闭弹窗，并且需要对输入框赋值。
 *
 * * `cancelText`: `String` 取消按钮名称。
 *
 * * `cancel`: `Function` 单击取消按钮时触发的事件。
 *
 * > 如果未传递，单击时会默认关闭弹窗。
 * >
 * > 如果传递，需调用`datepicker.close()`关闭弹窗。
 *
 * * `format`: `String` 日期格式。
 *
 * * `className`: `String` 弹窗类名，修改时需加上`kub-datepicker-popup`默认类名。
 *
 * * `date`: `Date` 默认显示时间。
 *
 * * `yearRange`: `Array` 年份显示区间。
 */
_prototype.defaults = {
    locale: 'zh',
    title: '',
    confirmText: '确定',
    confirm: null,
    cancelText: '取消',
    cancel: null,
    format: 'yyyy-MM-dd',
    className: '',
    date: new Date(),
    yearRange: [1970, 2050]
}

/**
 * ## DatePicker.prototype.setDate
 *
 * 设置时间选择器时间。
 *
 * @param {Date} date 时间
 * @return {instance} 当前实例
 */
_prototype.setDate = function(date) {
    var self = this,
        year = date.getFullYear(),
        month = date.getMonth()

    setValue(self, 'year', year)

    setValue(self, 'month', month)

    setValue(self, 'day', date.getDate())

    setValue(self, 'hour', date.getHours())

    setValue(self, 'minute', date.getMinutes())

    setValue(self, 'second', date.getSeconds())

    return self
}

/**
 * ## DatePicker.prototype.getDate
 *
 * 获取时间选择器选择的时间。
 *
 * @return {Date} 获取到的时间
 */
_prototype.getDate = function() {
    var values = {
        year: getValue(this, 'year'),
        month: getValue(this, 'month'),
        day: getValue(this, 'day'),
        hour: getValue(this, 'hour'),
        minute: getValue(this, 'minute'),
        second: getValue(this, 'second')
    }
    return new Date(values.year, values.month, values.day, values.hour, values.minute, values.second)
}

/**
 * ## DatePicker.prototype.close
 *
 * 关闭时间选择器。
 *
 * @return {instance} 当前实例
 */
_prototype.close = function() {
    this.$element[0].popup.close()
    return this
}

/**
 * ## DatePicker.prototype.show
 *
 * 显示时间选择器。
 *
 * @return {instance} 当前实例
 */
_prototype.show = function() {
    this.$element[0].popup.show()
    return this
}

/**
 * ## DatePicker.prototype.hide
 *
 * 隐藏时间选择器。
 *
 * @return {instance} 当前实例
 */
_prototype.hide = function() {
    this.$element[0].popup.hide()
    return this
}

module.exports = DatePicker
<file_sep>/**
 * # Swiper
 *
 * 切换组件
 */

/**
 * @require [core](./core.js.html)
 * @require [os](./detect.js.html)
 * @require [Lite](./lite.js.html)
 */
var core = require('./core'),
    os = require('./detect'),
    $ = require('./lite')

/**
 * ## Swiper Constructor
 *
 * `Swiper`类。
 *
 * 使用方法：
 * ```js
 * new Kub.Swiper('.swiper',{
 *      slideSelector:'.slide',
 *      slideActiveClass:'active',
 *      paginationSelector:'.pagination li',
 *      paginationActiveClass:'pagination-active',
 *      slide:function(index){
 *          //当前滚动索引
 *      }
 * })
 * ```
 */

function Swiper(element, options) {

    this.options = core.extend(true, {}, _prototype.defaults, options || {})
    this.$element = $(element)

    var ui = this._ui = {
        slides: $(options.slideSelector),
        paginations: $(options.paginationSelector)
    }

    ui.slidesLength = ui.slides.length

    init(this)
}

var $document = $(document),
    isTouch = os.mobile

var START_EVENT = isTouch ? 'touchstart' : 'mousedown',
    MOVE_EVENT = isTouch ? 'touchmove' : 'mousemove',
    END_EVENT = isTouch ? 'touchend' : 'mouseup',
    RESIZE_EVENT = 'resize',
    TRANSITIONEND_EVENT = 'transitionend',
    WEBKIT_TRANSITIONEND_EVENT = 'webkitTransitionEnd',
    HORIZONTAL = 'horizontal',
    //粘性
    VISCOSITY = 5,
    //触摸点偏移量
    TOUCH_THRESHOLD = 5

var _window = window,
    _prototype = Swiper.prototype

//获取触摸点
var getCoords = function(event) {
    var touches = event.touches,
        data = touches && touches.length ? touches : event.changedTouches

    return {
        x: isTouch ? data[0].pageX : event.pageX,
        y: isTouch ? data[0].pageY : event.pageY
    }
}

//获取偏移
var getDistance = function(event, startCoords) {
    var coords = getCoords(event),
        x = coords.x - startCoords.x,
        y = coords.y - startCoords.y

    return {
        distanceX: x,
        distanceY: y
    }
}

//获取位置与索引
var getCoordinates = function(swiper, distanceX, distanceY) {
    var element = swiper._ui.slides[0],
        w = element.offsetWidth,
        h = element.offsetHeight,
        l = swiper._ui.slidesLength,
        index = swiper._ui.active,
        active = index,
        threshold = swiper.options.threshold,
        reach,
        _distanceY = Math.abs(distanceY),
        _distanceX = Math.abs(distanceX)

    if (swiper.options.direction === HORIZONTAL) {

        //达到门槛
        reach = threshold < _distanceX

        //横向
        if (distanceX > 0 && index == 0) {
            //最左侧
            distanceX = distanceX / VISCOSITY

            index = 0

        } else if (distanceX < 0 && index == l - 1) {
            //最右侧
            distanceX = distanceX / VISCOSITY

            index = l - 1

        } else if (reach) {
            //达到最小偏移量

            //取整
            var s = Math.round(_distanceX / w)

            s = s == 0 ? 1 : s

            //向右或者向左
            index = distanceX > 0 ? index - s : index + s
        }

        return {
            x: distanceX + (-w * active),
            y: 0,
            index: index,
            isDefaultPrevented: !(!reach && _distanceX < _distanceY && TOUCH_THRESHOLD < _distanceY)
        }

    } else {

        //达到门槛
        reach = threshold < _distanceY

        //垂直
        if (distanceY > 0 && index == 0) {
            //最上
            distanceY = distanceY / VISCOSITY
            index = 0

        } else if (distanceY < 0 && index == l - 1) {
            //最下
            distanceY = distanceY / VISCOSITY
            index = l - 1

        } else if (reach) {
            //达到最小偏移
            var s = Math.round(_distanceY / h)

            s = s == 0 ? 1 : s

            index = distanceY > 0 ? index - s : index + s
        }

        return {
            x: 0,
            y: distanceY + (-h * active),
            index: index,
            isDefaultPrevented: true
        }
    }
}

var returnFalse = function() {
    return false
}

//添加重复子节点
var appendCloneChildren = function(swiper) {

    if (swiper.options.infinite) {
        var $slides = swiper._ui.slides,
            first = $slides[0],
            last = $slides[swiper._ui.slidesLength - 1],
            parentElement = first.parentElement

        parentElement.insertBefore(last.cloneNode(true), first)
        parentElement.appendChild(first.cloneNode(true))

        swiper._ui.slidesLength += 2
    }
}

//重置索引值
var resetSlideIndex = function(swiper) {
    var index = swiper._ui.active,
        length = swiper._ui.slidesLength

    if (swiper.options.infinite) {

        if (index === length - 1) {
            swiper.slide(1, 0)
        }

        if (index === 0) {
            swiper.slide(length - 2, 0)
        }
    }
}

//设置偏移量
var setTranslate = function($element, x, y) {
    core.isNumber(x) && (x += 'px')
    core.isNumber(y) && (y += 'px')

    var t = 'translate3d(' + x + ',' + y + ',0)'

    $element.css({
        '-webkit-transform': t,
        'transform': t
    })
}

//设置偏移速度
var setDuration = function($element, duration) {
    core.isNumber(duration) && (duration += 'ms')

    $element.css({
        '-webkit-transition-duration': duration,
        'transition-duration': duration
    })
}

var getActualIndex = function(index, length) {
    return index < 0 ? 0 : index >= length ? length - 1 : index
}

//设置容器偏移量
var setContainerTranslate = function(swiper, x, y, duration) {
    var $element = swiper.$element

    duration = duration || 0

    setDuration($element, duration)
    setTranslate($element, x, y)
}

//添加选中类
var setActiveClass = function(swiper, index) {
    var options = swiper.options,
        slideActiveClass = options.slideActiveClass,
        paginationActiveClass = options.paginationActiveClass

    //添加选中的class
    swiper._ui.slides.removeClass(slideActiveClass).eq(index).addClass(slideActiveClass)

    swiper._ui.paginations.removeClass(paginationActiveClass).eq(index).addClass(paginationActiveClass)
}

//监听slide完成事件
var bindTransitionEndEvent = function(swiper) {
    var $element = swiper.$element

    var handler = function() {
        var options = swiper.options,
            callback = options.slide,
            index = swiper._ui.active

        resetSlideIndex(swiper)

        //计算出真实索引值
        options.infinite && (index = swiper._ui.active - 1)

        callback && callback.call(swiper, index)
    }

    //duration == 0 无法触发
    //translate 值未改变也无法触发
    $element.on(TRANSITIONEND_EVENT, handler).on(WEBKIT_TRANSITIONEND_EVENT, handler)
}

//监听横竖屏切换
var bindOrientationChangeEvent = function(swiper) {
    var timer

    function handler() {
        timer && clearTimeout(timer)
        timer = setTimeout(function() {
            swiper.slide(swiper._ui.active)
        }, 200)
    }
    $(_window).on(RESIZE_EVENT, handler)
}

//绑定事件
var bindEvents = function(swiper) {
    var flag = false,
        startCoords

    var start = function(event) {
            stopAuto(swiper)

            flag = true
            event = event.originalEvent || event

            resetSlideIndex(swiper)

            startCoords = getCoords(event)

            setDuration(swiper.$element, null)
        },
        move = function(event) {
            if (!flag) return
            event = event.originalEvent || event

            var distance = getDistance(event, startCoords),
                coordinates = getCoordinates(swiper, distance.distanceX, distance.distanceY)

            coordinates.isDefaultPrevented && (event.preventDefault(),setTranslate(swiper.$element, coordinates.x, coordinates.y))
        },
        end = function(event) {
            if (!flag) return
            flag = false

            event = event.originalEvent || event

            var distance = getDistance(event, startCoords),
                index = getCoordinates(swiper, distance.distanceX, distance.distanceY).index

            swiper.slide(index)

            beginAuto(swiper)
        }

    //监听横竖屏
    bindOrientationChangeEvent(swiper)

    //触发回调函数
    bindTransitionEndEvent(swiper)

    swiper.$element.on(START_EVENT, start)
    swiper.$element.on(MOVE_EVENT, move)
    swiper.$element.on(END_EVENT, end)

    swiper.$element[0].onselectstart = returnFalse
    swiper.$element[0].ondragstart = returnFalse
}

//偏移到指定的位置
var slideTo = function(swiper, index, duration) {
    var element = swiper._ui.slides[0]

    //由于移动端浏览器 transition 动画不支持百分比，所以采用像素值
    if (swiper.options.direction === HORIZONTAL) {
        //横向
        var w = element.offsetWidth

        setContainerTranslate(swiper, -index * w, 0, duration)
    } else {
        //垂直
        var h = element.offsetHeight

        setContainerTranslate(swiper, 0, -index * h, duration)
    }
}

// 开始自动切换
var beginAuto = function(swiper){
    var options = swiper.options,
        _ui = swiper._ui,
        auto = options.auto

    auto && (swiper._timer = setInterval(function(){
        // 由于一些特殊设计
        // 对非循环滚动采用自动计算索引值的方式
        options.infinite ? swiper.next() : swiper.slide( (_ui.active + 1) % _ui.slidesLength )
    }, auto))
}

// 停止自动切换
var stopAuto = function(swiper){
    var timer = swiper._timer

    timer && clearInterval(timer)
}

//初始化
var init = function(swiper) {
    var options = swiper.options

    appendCloneChildren(swiper)

    //设置默认样式
    swiper.$element.css(options.style.swiper)

    var initialSlide = options.initialSlide || 0
    options.infinite && (initialSlide = initialSlide + 1)

    //滚动到默认位置
    swiper.slide(initialSlide, 0)

    beginAuto(swiper)

    //绑定事件
    bindEvents(swiper)
}

/**
 * ## Swiper.prototype.defaults
 *
 * `Swiper`默认配置项。
 *
 * 配置项说明：
 *
 * * `direction`: `String` 切换方向。horizontal ：横向， vertical ：纵向。
 *
 * * `threshold`: `Number` 最小触发距离。手指移动距离必须超过`threshold`才允许切换。
 *
 * * `duration`: `Number` 切换速度。
 *
 * * `auto`: `Number` 自动切换速度。0表示不自动切换，默认为0 。
 *
 * * `infinite`: `Boolean` 是否循环滚动 true ：循环 false ：不循环。
 *
 * * `initialSlide`: `Number` 初始化滚动位置。
 *
 * * `slideSelector`: `Selector` 滚动元素。
 *
 * * `slideActiveClass`: `String` 滚动元素选中时的类名。
 *
 * * `paginationSelector`: `Selector` 缩略图或icon。
 *
 * * `paginationActiveClass`: `String` 缩略图或icon选中时的类名。
 *
 * * `slide`: `Function` 切换回调函数。
 */

_prototype.defaults = {
    //vertical
    direction: HORIZONTAL,
    threshold: 50,
    duration: 300,
    infinite: false,
    initialSlide: 0,
    slideSelector: '',
    slideActiveClass: '',
    paginationSelector: '',
    paginationActiveClass: '',
    slide: null,
    style: {
        swiper: {
            '-webkit-transition-property': '-webkit-transform',
            'transition-property': 'transform',
            '-webkit-transition-timing-function': 'ease-out',
            'transition-timing-function': 'ease-out'
        }
    }
}

/**
 * ## Swiper.prototype.slide
 *
 * 滚动到指定索引值位置
 *
 * @param  {index} index 滚动索引值
 * @param  {duration} duration 滚动速度，默认配置的`duration`。
 * @return {instance}    当前实例
 */
_prototype.slide = function(index, duration) {
    var options = this.options

    //如果speed为空，则取默认值
    duration = duration == null ? options.duration : duration

    //取出实际的索引值,保存当前索引值
    this._ui.active = index = getActualIndex(index, this._ui.slidesLength)

    //通过索引值设置偏移
    slideTo(this, index, duration)

    //设置选中状态Class
    setActiveClass(this, options.infinite ? index - 1 : index)

    return this
}

/**
 * ## Swiper.prototype.next
 *
 * 切换到下一个
 *
 * @param  {duration} duration 滚动速度，默认配置的`duration`。
 * @return {instance}    当前实例
 */
_prototype.next = function(duration) {
    return this.slide(this._ui.active + 1, duration)
}

/**
 * ## Swiper.prototype.prev
 *
 * 切换到上一个
 *
 * @param  {duration} duration 滚动速度，默认配置的`duration`。
 * @return {instance}    当前实例
 */
_prototype.prev = function(duration) {
    return this.slide(this._ui.active - 1, duration)
}

module.exports = Swiper
<file_sep>var _window = window,
    _document = document

var ELEMENT_NODE = 1,
    ELEMENT_PROTOTYPE = Element.prototype

//CustomEvent polyfill
//android 4.3
if (!_window.CustomEvent) {
    var CustomEvent = function(event, params) {
        var evt
        params = params || {
            bubbles: false,
            cancelable: false,
            detail: undefined
        }
        evt = _document.createEvent("CustomEvent")
        evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)
        return evt
    }
    CustomEvent.prototype = _window.Event.prototype
    _window.CustomEvent = CustomEvent
}

//Element.prototype.matches polyfill
if (typeof ELEMENT_PROTOTYPE.matches !== 'function') {
    ELEMENT_PROTOTYPE.matches = ELEMENT_PROTOTYPE.msMatchesSelector || ELEMENT_PROTOTYPE.mozMatchesSelector || ELEMENT_PROTOTYPE.webkitMatchesSelector || function matches(selector) {
        var element = this,
            // 查找当前节点的根节点时，必须使用element.ownerDocument
            // 当节点插入到iframe中时，该节点的document就不是父窗口中的document，而是iframe中的document
            // 会造成 document.querySelectorAll(selector) 查询不到改节点，所以需要element.ownerDocument替代document
            elements = element.ownerDocument.querySelectorAll(selector),
            index = 0

        while (elements[index] && elements[index] !== element) {
            ++index
        }

        return !!elements[index]
    }
}

//Element.prototype.closest polyfill
if (typeof ELEMENT_PROTOTYPE.closest !== 'function') {
    ELEMENT_PROTOTYPE.closest = function closest(selector) {
        var element = this

        while (element && element.nodeType === ELEMENT_NODE) {
            if (element.matches(selector)) {
                return element
            }

            element = element.parentNode
        }

        return null
    }
}
<file_sep>/**
 * # os
 *
 * 检测系统类型与版本，包含系统类型与版本信息。
 *
 * 只检测Android 与 IOS, window phone（window phone 未进行完全测试）
 *
 * `os` 返回以下相关属性：
 *
 * `android` ：是否是Android
 *
 * `ios` ：是否是IOS系统
 *
 * `ipad` ：是否是iPad
 *
 * `iphone` ：是否是iPhone
 *
 * `ipod` ：是否是iPod
 *
 * `mobile` ：是否是移动端
 *
 * `phone` ：是否是手机
 *
 * `tablet` ：是否是平板
 *
 * `version` ：系统版本
 *
 * `wp` ： 是否是window phone
 *
 */

var ua = navigator.userAgent,
    android = ua.match(/(Android);?[\s\/]+([\d.]+)?/),
    ipad = ua.match(/(iPad).*OS\s([\d_]+)/),
    ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/),
    iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/),
    wp = ua.match(/Windows Phone ([\d.]+)/),
    os = {}

//android
android ? (os.android = true, os.version = android[2]) : (os.android = false)

//iphone
iphone && !ipod ? ( os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.') ) : (os.iphone  = false)

//ipad
ipad ? ( os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.') ) : (os.ipad  = false)

//ipod
ipod ? ( os.ios = os.ipod = true, os.version = ipod[3].replace(/_/g, '.') ) : (os.ipod = false)

//window phone
wp ? ( os.wp = true, os.version = wp[1]) : (os.wp = false)

//ios
!os.iphone && !os.ipad && !os.ipod && (os.ios = false)

//手机
os.phone = os.android && /mobile/i.test(ua) || os.iphone || os.wp ? true : false

//平板
os.tablet = !os.phone && ( os.android || os.ipad || /window/i.test(ua) && /touch/i.test(ua) ) ? true : false

//移动端
os.mobile = os.phone || os.tablet

module.exports = os
<file_sep>module.exports = function(data){
var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
__p+=''+
((__t=(data.message))==null?'':__t)+
' <div class="kub-prompt-input-wrapper"><input placeholder="'+
((__t=( data.placeholder))==null?'':__t)+
'" type="'+
((__t=( data.inputType))==null?'':__t)+
'" value="'+
((__t=( data.defaultValue))==null?'':__t)+
'" class="kub-prompt-input J_input"></div>';
return __p;
};<file_sep>/**
 * # Kub
 *
 * 与`Kub`对象一致，增加样式文件。
 *
 */
require('../less/kub.less')

module.exports = require('./kub')
<file_sep>var Kub = window.Kub;
var core = Kub.core;

describe("core module:", function() {

    xdescribe("os", function(){});

    describe("core.extend()", function(){
        var target, source, source1, sourceWithProto;

        beforeEach(function(){
            target = {
                samename: "fisrtname",
                uniquename: "uniquename"
            };            
            source = {
                samename: "secondname",
                extendArr: [3, 4],
                extendObj: {
                    a: 1,
                    b: [1, 2]
                },
            };
            source1 = {
                extendName: "source1",
                extendArr: [1, 2]
            };

            function F(){
                this.instanceProperty = "instanceProperty";
            }
            F.prototype.protoProperty = "protoProperty";
            sourceWithProto = new F();
        });

        it("should support basic copy and rewrite if conflict", function(){
            var res = core.extend(target, source);
            expect(res.samename).toBe(source.samename);
            expect(res.extendArr).toBe(source.extendArr);
            expect(res.extendObj).toBe(source.extendObj);
        });

        xit("should support deep clone", function(){
            var res = core.extend(true, target, source);
            expect(res.extend).not.toBe(source.extend);
        });

        it("should have side effect with the target parameter", function(){
            var res = core.extend(target, source);
            expect(target).toBe(res);
        });

        it("does not work with prototype property, only with own perperty", function(){
            var res = core.extend(target, sourceWithProto);
            expect(res.instanceProperty).toBe(sourceWithProto.instanceProperty);
            expect(res.protoProperty).toBeUndefined();
        });
    });
});






<file_sep># 轻量级移动端组件库 Kub

## 设计

0. Kub 由多个组件构成，组件之间依赖较低；

1. 组件尽量做到轻量且扩展性良好；

2. 组件对外提供稳定的API，在使用时可通过参数配置或者继承实现定制化的组件；

3. 组件采用`commonjs`规范，采用`webpack`编译，对外提供源文件与编译后的文件；

4. 提供模板源文件与预编译后的文件；

5. `Kub`对外提供暴露全局的`Kub`变量，所有组件绑定在该变量中；

6. 样式采用`less`编写，对外提供源文件与编译后的文件；

7. 样式可统一在`variables.less`文件中配置；

8. 对外提供不包含样式的`kub.js`以及包含样式的`kub.style.js`;

## 兼容性

0. ios7及以上版本；

1. Android4.0及以上版本；

## 版本

0. 遵循[语义化版本规范](http://semver.org/lang/zh-CN/)；

1. `master`分支为最新的稳定的发布版本；

2. `tags`中的分支对应每一个发布版本；

3. 其余分支为开发分支，为不稳定版本；

4. `1.*` 版本将不再升级与维护，除非有重大bug；

## 安装

### CDN

```
<link rel="stylesheet" type="text/css" href="//assets.geilicdn.com/v-components/kubjs/2.4.0/index.css">

<script type="text/javascript" src="//assets.geilicdn.com/v-components/kubjs/2.4.0/index.js"></script>

<script type="text/javascript" src="//assets.geilicdn.com/v-components/kubjs/2.4.0/index.style.js"></script>
```

### git

```
git clone https://github.com/longjiarun/kubjs.git kub
```

### npm

```
npm install kub --save

//指定版本
npm install kub@version --save
```

### bower

```
bower install kub --save

//指定版本
bower install kub#version --save
```

## 使用

### 使用编译后的文件`kub.js`及`kub.style.js`。

1、如果组件名称首字母大小，则暴露的是类，需实例化；

```
//组件为类
var dialog = new Kub.Dialog({
    //配置参数
});
```

2、如果组件名称首字母小写，则暴露的是对象或函数，无需实例化；

```
//组件为实例化后的对象
Kub.dateHelper.format(new Date(),'yyyy-MM-dd')

//组件为函数
Kub.cookie('name','kub');

//组件为对象
Kub.os.ios
```

### 使用源文件。

1、bower

```
//引用kub.js
var Kub = require('../../bower_components/kub/src/js/kub')

new Kub.Dialog()

//引用单个组件
var Dialog = require('../../bower_components/kub/src/js/dialog')

new Dialog()

//使用less
require('../../bower_components/kub/src/less/dialog.less')
```

2、npm

```
//引用kub.js
var Kub = require('kub')

new Kub.Dialog()

//引用单个组件
var Dialog = require('kub/src/js/dialog')

new Dialog()

//使用less
require('kub/src/less/dialog.less')
```

## 与V1版本的区别

描述与版本V1的区别，方便迁移到版本V2。

0. 模块规范由`umd`修改为`commonjs`;

1. 去除`zepto`、`underscore`、`hammerjs`依赖；

2. 去除`js/extend`目录中的组件；

3. 去除`calculator`组件；

4. 将`os`模块迁移到`detect`中，绑定由`Kub.core.os`迁移到`Kub.os`;

5. 增加`kub.js`与`kub.style.js`文件；

6. 将模板从组件中抽离，提供模板预编译文件；

7. 去除多余API，详见API文档；

8. 将`css`文件夹名称修改为`less`；

9. 将样式可配置项统一配置在`variables.less`中；

10. 在`variables.less`中提供单位可配置变量`@unit: 1px;`;

## 问题

0. 通过[Github issues](https://github.com/longjiarun/kubjs/issues)反馈；

1. 通过[Email](mailto:<EMAIL>)反馈；

## API文档

[查看文档](http://h5.weidian.com/v-components/kubjs/docs/v2.4.0/kub.js.html)
<file_sep>/**
 * # DateHelper
 *
 * 日期格式化组件。
 *
 * 格式化字符:
 *
    yyyy : 四位年。例如：2015

    yy   : 二位年份，最后两位。例如 15

    MMMM : 全称月份。例如 January

    MMM  : 简称月份。例如 Jan

    MM   : 两位月份，小于10显示03。例如：11

    M    : 一位月份，小于10显示3.例如：3或者11

    dddd : 全称星期。例如：星期一，Sunday

    ddd  : 简称星期。例如：一，Sun

    dd   : 两位天数。类似于MM

    d    : 一位天数。类似于M

    HH   : 两位小时。类似于MM

    H    : 一位小时。类似于M

    mm   : 两位分钟。类似于MM

    m    : 一位分钟。类似于M

    ss   : 两位秒数。类似于MM

    s    : 一位秒数。类似于M

    aa   : 全称上午或者下午。例如A.M.，P.M.

    a    : 简称上午或者下午。例如AM.
*/

/**
 * ## DateHelper Constructor
 *
 * `DateHelper` 模块，对外提供的是实例化的对象。
 *
 * 使用：
 * ```js
 * //String to Date
 *
 * '2015-05-20'.parseDate('yyyy-MM-dd')
 *
 * //格式化日期
 * new Date().format('yyyy-MM-dd,HH:mm:ss')
 *
 * ```
 */
function DateHelper() {

}

var _prototype = DateHelper.prototype

var get2Year = function(date) {
    return (date.getFullYear() + '').replace(/\d{2}$/, '00') - 0
}

var get2 = function(value) {
    return value < 10 ? '0' + value : value
}

var getAmPm = function(date) {
    return date.getHours() < 12 ? 0 : 1
}

//获取相对应的日期相关数据
var getValueByPattern = function(datehelper, fmt, date) {

    var patterns = {
        yyyy: date.getFullYear(),
        yy: date.getFullYear() - get2Year(date),
        MMMM: datehelper.i18n[datehelper.locale].month.full[date.getMonth()],
        MMM: datehelper.i18n[datehelper.locale].month.abbr[date.getMonth()],
        MM: get2(date.getMonth() + 1),
        M: date.getMonth() + 1,
        dddd: datehelper.i18n[datehelper.locale].day.full[date.getDay()],
        ddd: datehelper.i18n[datehelper.locale].day.abbr[date.getDay()],
        dd: get2(date.getDate()),
        d: date.getDate(),
        HH: get2(date.getHours()),
        H: date.getHours(),
        mm: get2(date.getMinutes()),
        m: date.getMinutes(),
        ss: get2(date.getSeconds()),
        s: date.getSeconds(),
        aa: datehelper.i18n[datehelper.locale].amPm.full[getAmPm(date)],
        a: datehelper.i18n[datehelper.locale].amPm.abbr[getAmPm(date)]
    }
    return patterns[fmt]
}

//本地化，目前包含`en`与`zh`
_prototype.i18n = {
    en: {
        month: {
            abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
            full: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
        },
        day: {
            abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
            full: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
        },
        amPm: {
            abbr: ['AM', 'PM'],
            full: ['A.M.', 'P.M.']
        }
    },
    zh: {
        month: {
            abbr: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
            full: ['一月份', '二月份', '三月份', '四月份', '五月份', '六月份', '七月份', '八月份', '九月份', '十月份', '十一月份', '十二月份']
        },
        day: {
            abbr: ['日', '一', '二', '三', '四', '五', '六'],
            full: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
        },
        amPm: {
            abbr: ['上午', '下午'],
            full: ['上午', '下午']
        }
    }
}

//默认中文
_prototype.locale = 'zh'

/**
 * ## DateHelper.prototype.addLocale
 *
 * 添加本地化
 *
 * @param {String} name   本地化名称
 * @param {Object} locale 本地化数据
 * @return {instance}     当前实例
 */
_prototype.addLocale = function(name, locale) {
    name && locale && (this.i18n[name] = locale)
    return this
}

/**
 * ## DateHelper.prototype.setLocale
 *
 * 设置默认本地化
 *
 * @param {String} name   本地化名称
 * @return {instance}     当前实例
 */
_prototype.setLocale = function(name) {
    this.locale = name
    return this
}

/**
 * ## DateHelper.prototype.format
 *
 * 格式化日期。
 *
 * @param {Date} date      日期
 * @param {String} format  日期格式
 * @return {String}        格式化以后的日期
 */
_prototype.format = function(date, format) {
    var self = this
    if (!date) return

    format = format || 'yyyy-MM-dd'

    format = format.replace(/(yyyy|yy|MMMM|MMM|MM|M|dddd|ddd|dd|d|HH|H|mm|m|ss|s|aa|a)/g, function(part) {
        return getValueByPattern(self, part, date)
    })
    return format
}

/**
 * ## DateHelper.prototype.parse
 *
 * 转换日期。
 *
 * 此方法存在一个BUG，例如：
 *
 * ```js
 *
 * //1112会被计算在MM内。
 * dateHelper.parse('2015-1112','yyyy-MMdd')
 *
 *
 * //所以在使用parse方法时，每一个串使用字符分隔开。类似于：
 *
 * dateHelper.parse('2015-11-12','yyyy-MM-dd')
 *
 * ```
 *
 * @param {String} input   字符串
 * @param {String} format  格式化字符串
 * @return {Date}          格式化的日期
 */
_prototype.parse = function(input, format) {
    if (!input || !format) return
    var parts = input.match(/(\d+)/g),
        i = 0,
        fmt = {}

    // extract date-part indexes from the format
    format.replace(/(yyyy|yy|MM|M|dd|d|HH|H|mm|m|ss|s)/g, function(part) {
        fmt[part] = i++
    })

    var year = parts[fmt['yyyy']] || (parseInt(parts[fmt['yy']], 10) + get2Year(new Date())) || 0,

        month = (parts[fmt['MM']] - 1) || (parts[fmt['M']] - 1) || 0,

        day = parts[fmt['dd']] || parts[fmt['d']] || 0,

        hour = parts[fmt['HH']] || parts[fmt['H']] || 0,

        minute = parts[fmt['mm']] || parts[fmt['m']] || 0,

        second = parts[fmt['ss']] || parts[fmt['s']] || 0

    return new Date(year, month, day, hour, minute, second)
}

var dateHelper = new DateHelper()

// 将 parseDate 方法绑定在 `String` 原型上
String.prototype.parseDate = function(format) {
    return dateHelper.parse(this, format)
}

// 将 format 方法绑定在 `Date` 原型上
Date.prototype.format = function(format) {
    return dateHelper.format(this, format)
}

module.exports = dateHelper
<file_sep>/**
 * # Prompt
 *
 * prompt 输入框。
 */

/**
 * @require [core](./core.js.html)
 * @extend [Dialog](./dialog.js.html)
 */
var core = require('./core'),
    Dialog = require('./dialog'),
    template = require('./tpl/prompt')

var INPUT_SELECTOR = '.J_input'

/**
 * ## Prompt Constructor
 *
 * 继承于`Dialog`，可使用`Dialog`类中的方法。
 *
 * 使用方法：
 * ```js
 * var prompt = new Kub.Prompt({
 *     confirm:function(event,dialog,value){
 *         //输入框输入的值 value
 *     }
 * })
 * ```
 */
function Prompt(options) {
    var opts = this.options = core.extend({}, _prototype.defaults, options || {})

    opts.buttons = [{
        text: opts.cancelText,
        handler: opts.cancel || function(e, dialog) {
            dialog.close()
        }
    }, {
        text: opts.confirmText,
        handler: function(e, dialog) {
            var value = dialog.$element.find(INPUT_SELECTOR)[0].value
            opts.confirm && opts.confirm.call(this, e, dialog, value)
        }
    }]

    opts.message = template(opts)

    Dialog.call(this, opts)
}

var _prototype = Prompt.prototype = Object.create(Dialog.prototype)

_prototype.constructor = Prompt

/**
 * ## Prompt.prototype.defaults
 *
 * `Prompt`默认配置项。
 *
 * 配置项说明：
 *
 * * `confirmText` : `String` 确认按钮名称。
 *
 * * `confirm` : `Function` 单击确认按钮时触发的事件。用于用户单击确认按钮执行事件。需调用`dialog.close()`手动关闭弹窗。
 *
 * * `cancelText` : `String` 取消按钮名称。
 *
 * * `cancel` : `Function` 单击取消按钮时触发的事件。
 *
 *    > 如果未传递，单击时会默认关闭弹窗。
 *    >
 *    > 如果传递，需调用 `dialog.close()`关闭弹窗。
 *
 * * `showHeader` : `Boolean` 是否显示头部。
 *
 * * `className` : `String` 弹窗类名，修改时需加上`kub-prompt`默认类名。
 *
 * * `modal` : `Boolean` 是否显示遮罩层。
 *
 * * `message` : `String` 提示内容。
 *
 * * `inputType` : `String` 输入框类型。
 *
 * * `placeholder` : `String` 输入框 `placeholder` 属性。
 *
 * * `defaultValue` : `String` 输入框默认值。
 */
_prototype.defaults = {
    confirmText: '确定',
    confirm: null,
    cancelText: '取消',
    cancel: null,
    showHeader: false,
    className: 'kub-prompt',
    modal: true,
    message:'',
    inputType: 'text',
    placeholder: '',
    defaultValue: ''
}

module.exports = Prompt
<file_sep>/**
 * # Touch
 *
 * 移动端事件组件。
 *
 * 支持的事件包含：
 *
 * `tap` `longtap`
 *
 * `panstart` `panmove` `panup` `pandown` `panleft` `panright` `panend`
 *
 * `swipeleft` `swiperight` `swipeup` `swipedown`
 *
 */

/**
 * @require [polyfill](./polyfill.js.html)
 */

require('./polyfill')

var MOBILE_REGEXP = /mobile|tablet|ip(ad|hone|od)|android/i

var _window = window,
    isTouch = 'ontouchstart' in _window && MOBILE_REGEXP.test(navigator.userAgent)

var EVENTS_METHODS = [
    'preventDefault',
    'stopImmediatePropagation',
    'stopPropagation'
]

var SWIPE_THRESHOLD = 10,
    SWIPE_VELOCITY = 0.25,
    SWIPE_MAX_MOVEMENT = 6,

    TAP_TIMEOUT = 200,
    TAP_THRESHOLD = 9,

    LONGTAP_TIMEOUT = 500,

    START_EVENT = isTouch ? 'touchstart' : 'mousedown',
    MOVE_EVENT = isTouch ? 'touchmove' : 'mousemove',
    END_EVENT = isTouch ? 'touchend' : 'mouseup',

    DIRECTION_ANGLE = 25,
    DIRECTIONS = ['up', 'right', 'down', 'left'],
    SWIPE_EVENT = 'swipe',

    PAN_EVENT = 'pan',
    PAN_START_EVENT = 'panstart',
    PAN_MOVE_EVENT = 'panmove',
    PAN_END_EVENT = 'panend',

    TAP_EVENT = 'tap',

    LONGTAP_EVENT = 'longtap'

// 获取位移量
var distance = function(p1, p2) {
    return Math.round(Math.sqrt(Math.pow((p1.x - p2.x), 2) + Math.pow((p1.y - p2.y), 2)))
}

// 获取角度，通过获取角度从而获取方向
var angle = function(p1, p2) {
    var d = Math.abs(p2.x - p1.x)
    return Math.round(Math.acos(d / Math.sqrt(Math.pow(d, 2) + Math.pow(p2.y - p1.y, 2))) * 57.3)
}

// 获取方向
var direction = function(p1, p2) {
    return (angle(p1, p2) > DIRECTION_ANGLE) ? ((p1.y < p2.y) ? 2 : 0) : ((p1.x < p2.x) ? 1 : 3)
}

// 如果触摸点位移大于 SWIPE_THRESHOLD 而且速度大于 SWIPE_VELOCITY
var matchSwipe = function(threshold, interval) {
    return threshold != null && threshold > SWIPE_THRESHOLD && threshold / interval > SWIPE_VELOCITY
}

// 如果触摸点位置大于 TAP_THRESHOLD 而且间隔时间小于 TAP_TIMEOUT
var matchTap = function(threshold, interval) {
    return threshold != null && threshold < TAP_THRESHOLD && interval < TAP_TIMEOUT
}

// 获取触摸点数据
var getCoords = function(event) {
    var touches = event.touches,
        data = touches && touches.length ? touches : event.changedTouches
    return {
        x: isTouch ? data[0].clientX : event.clientX,
        y: isTouch ? data[0].clientY : event.clientY,
        e: isTouch ? data[0].target : event.target
    }
}

// 获取事件位置数据
var getEventDetail = function(coords) {
    return {
        x: coords.x,
        y: coords.y
    }
}

// 获取偏移值与时间间隔
var getThresholdAndInterval = function(p1,p2){
    return {
        threshold : p1 && p2 && distance(p1, p2),
        interval  : p1 && p2 && (p2.t.getTime() - p1.t.getTime())
    }
}

// 触发事件
var trigger = function(element, type, originalEvent, detail) {
    var event = new _window.CustomEvent(type, {
        detail: detail,
        bubbles: true,
        cancelable: true
    })

    // 存储原事件对象
    event.originalEvent = originalEvent

    EVENTS_METHODS.forEach(function(name){
        event[name] = function(){
            originalEvent[name].apply(originalEvent,arguments)
        }
    })

    element && element.dispatchEvent && element.dispatchEvent(event)
}

var on = function(element, type, handler) {
    element.addEventListener(type, handler, false)
}

var clearTime = function(timer) {
    timer && clearTimeout(timer)
    timer = null
}

var findMatchedDirection = function(actions){
    var index = 0, max = actions[index]

    actions.forEach(function(value,i){
        value > max && (max = value, index = i)
    })

    return index
}

/**
 * ## Touch Constructor
 *
 * `Touch`类。
 *
 * 使用方法：
 * ```js
 *
 * new Kub.Touch(element)
 *
 * // swipeleft 事件，支持事件代理
 * element.addEventListener('swipeleft','div',function(){
 *     //do something
 * })
 *
 * // tap 事件
 * element.addEventListener('tap',function(){
 *     //do something
 * })
 *
 * ```
 */
function Touch(element) {
    var moveFlag = false,
        target,
        p1,
        p2,
        longTapTimer,
        cancelTap = false,
        actions,
        actionsLength

    on(element, START_EVENT, function(event) {
        var coords = getCoords(event)
        p1 = coords
        p1.t = new Date()
        p2 = p1

        actions = [0,0,0,0]
        actionsLength = 0

        cancelTap = false

        target = coords.e

        //触发 longtap 事件
        isTouch && (longTapTimer = setTimeout(function() {
            trigger(target, LONGTAP_EVENT, event)
        }, LONGTAP_TIMEOUT))

    })

    on(element, MOVE_EVENT, function(event) {
        if(!target){
            return
        }

        var coords = getCoords(event),
            detail = getEventDetail(coords),
            thresholdAndInterval,
            direct

        p2 = coords
        p2.t = new Date()

        thresholdAndInterval = getThresholdAndInterval(p1,p2)

        // 如果触摸点不符合 longtap 触发条件，则取消长按事件
        if(!cancelTap && !matchTap(thresholdAndInterval.threshold, thresholdAndInterval.interval)){
            clearTime(longTapTimer)
            cancelTap = true
        }

        //触发 panstart 事件
        !moveFlag && trigger(target, PAN_START_EVENT, event, detail)

        direct = direction(p1, p2)

        // 取出前SWIPE_MAX_MOVEMENT移动记录
        actionsLength < SWIPE_MAX_MOVEMENT && (actions[direct] += 1, actionsLength += 1)

        //触发 pan['up', 'right', 'down', 'left'] 事件
        trigger(target, PAN_EVENT + DIRECTIONS[direct], event, detail)

        //触发 panmove 事件
        trigger(target, PAN_MOVE_EVENT, event, detail)

        moveFlag = true
    })

    on(element, END_EVENT, function(event) {
        // 取消 longtap 事件定时器
        clearTime(longTapTimer)

        var coords = getCoords(event), thresholdAndInterval

        p2 = coords
        p2.t = new Date()

        thresholdAndInterval = getThresholdAndInterval(p1,p2)

        // 如果达到 swipe 事件条件
        if (matchSwipe(thresholdAndInterval.threshold, thresholdAndInterval.interval)) {

            //触发 swipe['up', 'right', 'down', 'left'] 事件
            trigger(target, SWIPE_EVENT + DIRECTIONS[findMatchedDirection(actions)], event)
        } else if (!cancelTap && isTouch && matchTap(thresholdAndInterval.threshold, thresholdAndInterval.interval)) {

            // 触发 tap 事件
            trigger(target, TAP_EVENT, event)
        }

        // 触发 panend 事件
        target && moveFlag && trigger(target, PAN_END_EVENT, event, getEventDetail(coords))

        target = null
        moveFlag = false
    })
}

module.exports = Touch
<file_sep>/**
 * # Kub
 *
 * `Kub` 对象。kub 框架对外暴露的全局变量，所有组件均绑在`Kub`对象中。
 *
 */
var _window = window,
    Kub = _window.Kub = _window.Kub || {}

Kub.version = '2.3.0'

/**
 * ## Kub.$
 *
 * 类 `Zepto` 模块。
 */
Kub.$ = require('./lite')

/**
 * ## Kub.core
 */
Kub.core = require('./core')

/**
 * ## Kub.os
 */
Kub.os = require('./detect')

/**
 * ## Kub.dateHelper
 */
Kub.dateHelper = require('./date')

/**
 * ## Kub.cookie
 */
Kub.cookie = require('./cookie')

/**
 * ## Kub.LazyLoad
 */
Kub.LazyLoad = require('./lazyload')

/**
 * ## Kub.Dialog
 */
Kub.Dialog = require('./dialog')

/**
 * ## Kub.Alert
 */
Kub.Alert = require('./alert')

/**
 * ## Kub.Confirm
 */
Kub.Confirm = require('./confirm')

/**
 * ## Kub.Prompt
 */
Kub.Prompt = require('./prompt')

/**
 * ## Kub.Toast
 */
Kub.Toast = require('./toast')

/**
 * ## Kub.Loader
 */
Kub.Loader = require('./loader')

/**
 * ## Kub.Swiper
 */
Kub.Swiper = require('./swiper')

/**
 * ## Kub.DatePicker
 */
Kub.DatePicker = require('./datepicker')

/**
 * ## Kub.Touch
 */
Kub.Touch = require('./touch')

/**
 * ## Kub.Popup
 */
Kub.Popup = require('./popup')

module.exports = Kub
<file_sep>/*! Kub Mobile JavaScript Components Library v2.4.0.*/
/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};

/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {

/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;

/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};

/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;

/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}


/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;

/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;

/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";

/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__(6);


/***/ }),
/* 1 */,
/* 2 */,
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Kub
	 *
	 * `Kub` 对象。kub 框架对外暴露的全局变量，所有组件均绑在`Kub`对象中。
	 *
	 */
	var _window = window,
	    Kub = _window.Kub = _window.Kub || {}

	Kub.version = '2.3.0'

	/**
	 * ## Kub.$
	 *
	 * 类 `Zepto` 模块。
	 */
	Kub.$ = __webpack_require__(7)

	/**
	 * ## Kub.core
	 */
	Kub.core = __webpack_require__(9)

	/**
	 * ## Kub.os
	 */
	Kub.os = __webpack_require__(10)

	/**
	 * ## Kub.dateHelper
	 */
	Kub.dateHelper = __webpack_require__(11)

	/**
	 * ## Kub.cookie
	 */
	Kub.cookie = __webpack_require__(12)

	/**
	 * ## Kub.LazyLoad
	 */
	Kub.LazyLoad = __webpack_require__(13)

	/**
	 * ## Kub.Dialog
	 */
	Kub.Dialog = __webpack_require__(14)

	/**
	 * ## Kub.Alert
	 */
	Kub.Alert = __webpack_require__(16)

	/**
	 * ## Kub.Confirm
	 */
	Kub.Confirm = __webpack_require__(17)

	/**
	 * ## Kub.Prompt
	 */
	Kub.Prompt = __webpack_require__(18)

	/**
	 * ## Kub.Toast
	 */
	Kub.Toast = __webpack_require__(20)

	/**
	 * ## Kub.Loader
	 */
	Kub.Loader = __webpack_require__(21)

	/**
	 * ## Kub.Swiper
	 */
	Kub.Swiper = __webpack_require__(22)

	/**
	 * ## Kub.DatePicker
	 */
	Kub.DatePicker = __webpack_require__(23)

	/**
	 * ## Kub.Touch
	 */
	Kub.Touch = __webpack_require__(27)

	/**
	 * ## Kub.Popup
	 */
	Kub.Popup = __webpack_require__(24)

	module.exports = Kub


/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Lite
	 *
	 * 类似于`Zepto`，提供部分与Dom相关的方法，方法使用保持与`Zepto`一致。
	 *
	 */

	/**
	 * @require [polyfill](./polyfill.js.html)
	 */
	__webpack_require__(8)
	var $, Lite

	var ELEMENT_NODE = 1

	var slice = Array.prototype.slice,
	    readyRE = /complete|loaded|interactive/,
	    idSelectorRE = /^#([\w-]+)$/,
	    classSelectorRE = /^\.([\w-]+)$/,
	    tagSelectorRE = /^[\w-]+$/,
	    spaceRE = /\s+/g

	var _document = document,
	    _window = window,
	    _undefined = undefined

	function wrap(dom, selector) {
	    dom = dom || []

	    Object.setPrototypeOf ? Object.setPrototypeOf(dom, $.fn) : (dom.__proto__ = $.fn)

	    dom.selector = selector || ''
	    return dom
	}

	var isArray = Array.isArray ||
	    function(object) {
	        return object instanceof Array
	    }

	$ = Lite = function(selector, context) {
	    context = context || _document
	    var type = typeof selector

	    if (!selector) {
	        return wrap()
	    }

	    if (type === 'function') {
	        return $.ready(selector)
	    }

	    if (selector._l) {
	        return selector
	    }

	    if (isArray(selector)) {
	        //$([document,document.body])
	        return wrap(slice.call(selector).filter(function(item) {
	            return item != null
	        }), selector)
	    }

	    if (type === 'object') {
	        //$(document)
	        return wrap([selector], '')
	    }

	    if (type === 'string') {
	        selector = selector.trim()

	        if (selector[0] === '<') {
	            var nodes = $.fragment(selector)
	            return wrap(nodes, '')
	        }

	        if (idSelectorRE.test(selector)) {
	            var found = _document.getElementById(RegExp.$1)

	            return wrap(found ? [found] : [], selector)
	        }

	        return wrap($.qsa(selector, context), selector)
	    }

	    return wrap()
	}

	var createDelegator = function(handler, selector, element) {
	    return function(e) {
	        var match = $(e.target).closest(selector)

	        // 1、存在代理节点
	        // 2、排除$('.className').on('click','.className',handler) 情况
	        if (match.length && match[0] !== element) {
	            handler.apply(match[0], arguments)
	        }
	    }
	}

	!(function() {

	    this.qsa = function(selector, context) {
	        //querySelectorAll，如果存在两个相同ID，在ios7下，限定范围内查询 id 会返回两个节点
	        context = context || _document
	        selector = selector.trim()
	        return slice.call(classSelectorRE.test(selector) ? context.getElementsByClassName(RegExp.$1) : tagSelectorRE.test(selector) ? context.getElementsByTagName(selector) : context.querySelectorAll(selector))
	    }

	    this.fragment = function(html) {
	        var div = _document.createElement('div'),
	            nodes
	        div.innerHTML = html
	        nodes = div.children
	        div = null
	        return slice.call(nodes)
	    }

	    this.ready = function(callback) {
	        if (readyRE.test(_document.readyState) && _document.body) {
	            callback($)
	        } else {
	            _document.addEventListener('DOMContentLoaded', function() {
	                callback($)
	            }, false)
	        }
	        return this
	    }

	    this.Event = function(type, props) {

	        return new _window.CustomEvent(type, props)
	    }

	    this.fn = this.prototype = {

	        _l: true,

	        /**
	         * ## Lite.prototype.each
	         *
	         * 循环所有节点。
	         */
	        each: function(callback) {
	            var l = this.length,
	                i, t
	            for (i = 0; i < l; i++) {
	                t = this[i]

	                if (callback.call(t, i, t) === false) {
	                    return this
	                }
	            }
	            return this
	        },

	        /**
	         * ## Lite.prototype.slice
	         *
	         * 切割节点。
	         */
	        slice: function() {
	            return $(slice.apply(this, arguments))
	        },

	        /**
	         * ## Lite.prototype.is
	         *
	         * 判断是否是指定的节点。
	         */
	        is: function(selector, element) {
	            element = element ? element : this[0]

	            if (element && element.nodeType === ELEMENT_NODE) {
	                return element === selector ? true : typeof selector === 'string' && element.matches(selector)
	            }

	            return false
	        },

	        /**
	         * ## Lite.prototype.closest
	         *
	         * 查找最近的节点。
	         *
	         * 原生closest不包含本身，`jQuery`与`Zepto`包含本身，保持与`Zepto`一致。
	         *
	         */
	        closest: function(selector) {
	            var element = this[0],dom

	            dom = element && typeof selector === 'string' ? element.closest(selector) : this.is(selector, element) ? element : null

	            return $(dom)
	        },

	        /**
	         * ## Lite.prototype.find
	         *
	         * 查找节点，只支持选择器查找.
	         */
	        find: function(selector) {
	            var dom = []

	            this.each(function() {
	                if (this.nodeType !== ELEMENT_NODE) return

	                var elements = $.qsa(selector, this),
	                    elementsLen = elements.length

	                for (var i = 0; i < elementsLen; i++) {
	                    dom.indexOf(elements[i]) === -1 && dom.push(elements[i])
	                }
	            })
	            return $(dom)
	        },

	        /**
	         * ## Lite.prototype.show
	         *
	         * 显示。
	         */
	        show: function() {
	            return this.each(function() {

	                this.style.display === 'none' && (this.style.display = '')

	                $(this).css('display') === 'none' && (this.style.display = 'block')
	            })
	        },

	        /**
	         * ## Lite.prototype.hide
	         *
	         * 隐藏。
	         */
	        hide: function() {
	            return this.each(function() {
	                this.style.display = 'none'
	            })
	        },

	        /**
	         * ## Lite.prototype.css
	         *
	         * 修改或获取节点样式。
	         */
	        css: function(property, value) {
	            var isObject = typeof property === 'object'

	            //get
	            if (value == null && !isObject) {
	                var el = this[0]

	                //not element
	                if (el.nodeType !== ELEMENT_NODE) return

	                return _window.getComputedStyle(el).getPropertyValue(property)
	            }

	            var css = ''
	            if (isObject) {
	                for (var key in property) {
	                    property[key] == null ? this.each(function() {
	                        this.style.removeProperty(key)
	                    }) : (css += key + ':' + property[key] + ';')
	                }
	            } else {
	                css += key + ':' + property[key] + ';'
	            }

	            //set
	            css && this.each(function() {
	                this.style.cssText += ';' + css
	            })

	            return this;
	        },

	        /**
	         * ## Lite.prototype.offset
	         *
	         * 获取节点的`offset`，只支持获取，不支持设置。
	         */
	        offset: function() {
	            if (!this.length) return null

	            var ele = this[0],
	                obj = ele.getBoundingClientRect()

	            //why window.pageXOffset
	            //http://www.cnblogs.com/hutaoer/archive/2013/02/25/3078872.html
	            return {
	                left: obj.left + _window.pageXOffset,
	                top: obj.top + _window.pageYOffset,
	                width: ele.offsetWidth,
	                height: ele.offsetHeight
	            }
	        },

	        /**
	         * ## Lite.prototype.addClass
	         *
	         * 添加`class`。
	         */
	        addClass: function(name) {
	            if (name == _undefined) return this

	            return this.each(function() {
	                if (!('className' in this)) return

	                var classList = [],
	                    className = this.className.trim(),
	                    classNameList = className.split(spaceRE)

	                name.trim().split(spaceRE).forEach(function(klass) {
	                    classNameList.indexOf(klass) === -1 && classList.push(klass)
	                })
	                classList.length && (this.className = (className && (className + ' ')) + classList.join(' '))
	            })
	        },

	        /**
	         * ## Lite.prototype.removeClass
	         *
	         * 移除`class`。
	         */
	        removeClass: function(name) {
	            return this.each(function() {
	                if (!('className' in this)) return

	                if (name === _undefined) return this.className = ''

	                var className = this.className

	                name.trim().split(spaceRE).forEach(function(klass) {
	                    //zepto
	                    className = className.replace(new RegExp('(^|\\s)' + klass + '(\\s|$)', 'g'), ' ')
	                })

	                this.className = className
	            })
	        },

	        /**
	         * ## Lite.prototype.eq
	         *
	         * 获取指定索引节点。
	         */
	        eq: function(idx) {
	            idx = idx < 0 ? idx + this.length : idx
	            return $(this[idx])
	        },

	        /**
	         * ## Lite.prototype.off
	         *
	         * 取消绑定事件，不支持移除代理事件。
	         */
	        off: function(type, handler) {
	            var types = type && type.trim().split(spaceRE)

	            types && this.each(function() {
	                var element = this

	                types.forEach(function(name) {

	                    if (handler) {

	                        element.removeEventListener(name, handler.delegator || handler, false)
	                    } else {
	                        var handlers = element.listeners && element.listeners[name]

	                        handlers && handlers.forEach(function(_handler) {

	                            element.removeEventListener(name, _handler.delegator || _handler, false)
	                        })
	                    }
	                })
	            })

	            return this
	        },

	        /**
	         * ## Lite.prototype.on
	         *
	         * 监听事件，支持事件代理。
	         *
	         */
	        on: function(type, selector, handler) {
	            var f = true

	            if (typeof selector !== 'string') {
	                f = false
	                handler = selector
	            }

	            if (typeof handler == 'function') {
	                var types = type && type.trim().split(spaceRE)

	                types && this.each(function() {
	                    var element = this, listeners

	                    if (f) {
	                        handler.delegator = createDelegator(handler, selector, element)
	                    }

	                    listeners = element.listeners || {}

	                    types.forEach(function(event) {

	                        if (!listeners[event]) {
	                            listeners[event] = []
	                        }
	                        listeners[event].push(handler)

	                        element.addEventListener(event, handler.delegator || handler, false)
	                    })
	                    element.listeners = listeners
	                })
	            }

	            return this
	        },

	        /**
	         * ## Lite.prototype.trigger
	         *
	         * 触发事件。
	         */
	        trigger: function(type, detail) {
	            return this.each(function() {
	                this && this.dispatchEvent && this.dispatchEvent($.Event(type, {
	                    detail: detail,
	                    bubbles: true,
	                    cancelable: true
	                }))
	            })
	        },

	        /**
	         * ## Lite.prototype.attr
	         *
	         * 获取或者设置节点属性。
	         */
	        attr: function(name, value) {
	            var result,
	                type = typeof name

	            if(type === 'string' && value == null) {

	                if(!this.length || this[0].nodeType !== ELEMENT_NODE){
	                    return _undefined
	                }else{
	                    return (!(result = this[0].getAttribute(name)) && name in this[0]) ? this[0][name] : result
	                }
	            }else{
	                return this.each(function() {
	                    if (this.nodeType !== ELEMENT_NODE) return

	                    if (type === 'object') {
	                        for (key in name) {
	                            this.setAttribute(key, name[key])
	                        }
	                    } else {
	                        this.setAttribute(name, value)
	                    }
	                })
	            }
	        },

	        /**
	         * ## Lite.prototype.removeAttr
	         *
	         * 移除节点属性。
	         */
	        removeAttr: function(name) {
	            return this.each(function() {
	                var self = this
	                this.nodeType === ELEMENT_NODE && name.split(spaceRE).forEach(function(attribute) {
	                    self.removeAttribute(attribute)
	                })
	            })
	        },

	        /**
	         * ## Lite.prototype.remove
	         *
	         * 删除节点。
	         */
	        remove: function() {
	            return this.each(function() {
	                var parentNode = this.parentNode
	                parentNode && parentNode.removeChild(this)
	            })
	        },

	        /**
	         * ## Lite.prototype.appendTo
	         *
	         * 将html插入到Dom节点内底部。
	         */
	        appendTo: function(target) {
	            var dom = [],
	                self = this

	            target.each(function() {
	                var node = this
	                self.each(function() {
	                    dom.push(node.appendChild(this))
	                })
	            })

	            return $(dom)
	        },

	        /**
	         * ## Lite.prototype.after
	         *
	         * 在Dom节点之后插入html。
	         */
	        after: function(html) {
	            return this.each(function() {
	                this.insertAdjacentHTML('afterend', html)
	            })
	        },

	        /**
	         * ## Lite.prototype.before
	         *
	         * 在Dom节点之前插入html。
	         */
	        before: function(html) {
	            return this.each(function() {
	                this.insertAdjacentHTML('beforebegin', html)
	            })
	        },

	        /**
	         * ## Lite.prototype.append
	         *
	         * 在Dom节点内底部插入html。
	         */
	        append: function(html) {
	            return this.each(function() {
	                this.insertAdjacentHTML('beforeend', html)
	            })
	        },

	        /**
	         * ## Lite.prototype.prepend
	         *
	         * 在Dom节点内头部插入html。
	         */
	        prepend: function(html) {
	            return this.each(function() {
	                this.insertAdjacentHTML('afterbegin', html)
	            })
	        },

	        /**
	         * ## Lite.prototype.html
	         *
	         * 设置或获取Dom html。
	         *
	         */
	        html: function(html) {
	            return html != _undefined ?
	                this.each(function() {
	                    this.innerHTML = html
	                }) :
	                (this[0] ? this[0].innerHTML : null)
	        },

	        /**
	         * ## Lite.prototype.text
	         * 设置或获取Dom文本内容。
	         */
	        text: function(text) {
	            return text != _undefined ?
	                this.each(function() {
	                    this.textContent = text
	                }) :
	                (this[0] ? this[0].textContent : null)
	        }
	    }
	}).call(Lite)

	module.exports = _window.Zepto || Lite


/***/ }),
/* 8 */
/***/ (function(module, exports) {

	var _window = window,
	    _document = document

	var ELEMENT_NODE = 1,
	    ELEMENT_PROTOTYPE = Element.prototype

	//CustomEvent polyfill
	//android 4.3
	if (!_window.CustomEvent) {
	    var CustomEvent = function(event, params) {
	        var evt
	        params = params || {
	            bubbles: false,
	            cancelable: false,
	            detail: undefined
	        }
	        evt = _document.createEvent("CustomEvent")
	        evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)
	        return evt
	    }
	    CustomEvent.prototype = _window.Event.prototype
	    _window.CustomEvent = CustomEvent
	}

	//Element.prototype.matches polyfill
	if (typeof ELEMENT_PROTOTYPE.matches !== 'function') {
	    ELEMENT_PROTOTYPE.matches = ELEMENT_PROTOTYPE.msMatchesSelector || ELEMENT_PROTOTYPE.mozMatchesSelector || ELEMENT_PROTOTYPE.webkitMatchesSelector || function matches(selector) {
	        var element = this,
	            // 查找当前节点的根节点时，必须使用element.ownerDocument
	            // 当节点插入到iframe中时，该节点的document就不是父窗口中的document，而是iframe中的document
	            // 会造成 document.querySelectorAll(selector) 查询不到改节点，所以需要element.ownerDocument替代document
	            elements = element.ownerDocument.querySelectorAll(selector),
	            index = 0

	        while (elements[index] && elements[index] !== element) {
	            ++index
	        }

	        return !!elements[index]
	    }
	}

	//Element.prototype.closest polyfill
	if (typeof ELEMENT_PROTOTYPE.closest !== 'function') {
	    ELEMENT_PROTOTYPE.closest = function closest(selector) {
	        var element = this

	        while (element && element.nodeType === ELEMENT_NODE) {
	            if (element.matches(selector)) {
	                return element
	            }

	            element = element.parentNode
	        }

	        return null
	    }
	}


/***/ }),
/* 9 */
/***/ (function(module, exports) {

	/**
	 * # core
	 *
	 * 核心模块，该模块提供基础方法。
	 *
	 */

	/**
	 * ## Core Constructor
	 *
	 * `Core` 模块，对外提供的是实例化的对象。
	 *
	 * 使用方法：
	 *
	 * ```js
	 *
	 * //获取url参数
	 * var params = Kub.core.getQuerystring()
	 *
	 * ```
	 */
	function Core() {

	}

	//解析 param string 正则表达式
	var paramsRegxp = /([^=&]+)(=([^&#]*))?/g

	var toString = Object.prototype.toString,
	    _window = window,
	    _href = _window.location.href,
	    _prototype = Core.prototype


	//获取 params string
	//url地址，未传值取 `window.location.href`。
	var getParamsString = function(url) {
	    var matchs
	    url = url || _href
	    return url && (matchs = url.match(/^[^\?#]*\?([^#]*)/)) && matchs[1]
	}

	/**
	 * ## Core.prototype.extend
	 *
	 * @param {Boolean} [deep] `可选` 是否深度拷贝。
	 * @param {Object/Array} target 目标。
	 * @param {Object/Array} source 源对象，可为多个。
	 * @return {Object/Array} target
	 */
	_prototype.extend = function(target, source) {
	    var deep,
	        args = Array.prototype.slice.call(arguments, 1),
	        length

	    if (this.isBoolean(target)) {
	        deep = target
	        target = args.shift()
	    }
	    length = args.length
	    for (var i = 0; i < length; i++) {
	        source = args[i]
	        for (var key in source) {
	            if (source.hasOwnProperty(key)) {
	                if (deep && (this.isArray(source[key]) || this.isObject(source[key]))) {
	                    if (this.isArray(source[key]) && !this.isArray(target[key])) {
	                        target[key] = []
	                    }
	                    if (this.isObject(source[key]) && !this.isObject(target[key])) {
	                        target[key] = {}
	                    }
	                    this.extend(deep, target[key], source[key])
	                } else {
	                    (source[key] !== undefined) && (target[key] = source[key])
	                }
	            }
	        }
	    }
	    return target
	}

	/**
	 * ## Core.prototype.is[type]
	 *
	 * 类型检测函数。
	 *
	 * 具体类型`type`包含
	 *
	 * `['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Array', 'Object', 'Boolean']`
	 *
	 */
	;
	['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Array', 'Object', 'Boolean'].forEach(function(name) {
	    _prototype['is' + name] = function(obj) {
	        return toString.call(obj) === '[object ' + name + ']'
	    }
	})

	/**
	 * ## Core.prototype.setQuerystring
	 *
	 * 设置 url 参数，如果 url 未传值，则默认取 `window.location.href`。
	 *
	 * 使用：
	 * ```js
	 *
	 * //设置当前地址参数
	 *
	 * //默认采用`window.location.href`
	 * Kub.core.setQuerystring({
	 *     name:'kub'
	 * })
	 *
	 * //传入url
	 * Kub.core.setQuerystring('http://www.a.com?userId=123',{
	 *     name:'kub'
	 * })
	 *
	 * //追加参数
	 *
	 * //如果不存在名称为 name 的参数，则新增参数。如果存在则替换其值
	 * Kub.core.setQuerystring({
	 *     name:'kub',
	 *     addr:'hangzhou'
	 * })
	 *
	 * ```
	 *
	 * @param {String} url    url
	 *
	 * @param {Object} params 参数对象。
	 *
	 * @param {Object} opts   配置参数。
	 *
	 * - raw ：配置是否开启 `encodeURIComponent`，默认为`false`，开启。
	 * - append ：是否追加参数，默认为`true`。 true：如果 url 不存在当前参数名称，则追加一个参数。false：不追加，只进行替换。
	 */
	_prototype.setQuerystring = function(url, params, opts) {
	    //验证url是否传值，如果 url 未传值，则使用当前页面 url
	    if (this.isObject(url)) {
	        opts = params
	        params = url
	        url = _href
	    }
	    params = params || {}

	    opts = this.extend({
	        append: true,
	        raw: false
	    }, opts || {})

	    var queryString = getParamsString(url),
	        _queryString = '',
	        f = -1,
	        _params = {}

	    //解析 url 中的参数，存放在对象中
	    queryString && queryString.replace(paramsRegxp, function(a, name, c, value) {

	        if (params.hasOwnProperty(name)) {
	            value = params[name]
	        }

	        // 获取到的中文参数为编码后的，需decodeURIComponent解码
	        _params[name] = value != undefined ? (opts.raw ? value : decodeURIComponent(value)) : ''
	    })

	    //如果是追加，则合并参数
	    if (opts.append) {
	        for (var name in params) {
	            if (params.hasOwnProperty(name)) {
	                _params[name] = params[name] != undefined ? params[name] : ''
	            }
	        }
	    }

	    //将参数合并成字符串
	    for (name in _params) {
	        if (_params.hasOwnProperty(name)) {
	            _queryString += (++f ? '&' : '') + name + '=' + (_params[name] !== '' ? (opts.raw ? _params[name] : encodeURIComponent(_params[name])) : '')
	        }
	    }

	    //替换掉原来 url 中的 querystring
	    return url.replace(/^([^#\?]*)[^#]*/, function(a, url) {
	        return url + (_queryString ? '?' + _queryString : '')
	    })
	}

	/**
	 * ## Core.prototype.getQuerystring
	 *
	 * 获取url中的参数。
	 *
	 * 设置 url 参数，如果 url 未传值，则默认取 `window.location.href`。
	 *
	 * 使用：
	 * ```js
	 *
	 * //设置当前地址参数
	 *
	 * //默认采用`window.location.href`
	 * var params = Kub.core.getQuerystring()
	 *
	 * var name = params.name
	 *
	 * //传入url
	 * var params = Kub.core.getQuerystring('http://www.a.com?userId=123')
	 *
	 * var userId = params.userId
	 *
	 * ```
	 *
	 * @param {String} url  url地址，未传值取 `window.location.href`。
	 *
	 * @param {Object} opts 配置参数。
	 *
	 * - raw ：配置是否 `decodeURIComponent`，默认为`true`，开启。
	 *
	 * @return {Object} 返回参数对象
	 */
	_prototype.getQuerystring = function(url, opts) {
	    var href = _href

	    if (this.isObject(url)) {
	        opts = url
	        url = href
	    }

	    opts = this.extend({
	        raw: false
	    }, opts || {})

	    url = url || href

	    var params = {},
	        queryString = getParamsString(url)

	    queryString && queryString.replace(paramsRegxp, function(a, name, c, value) {
	        params[name] = opts.raw ? value : !!value ? decodeURIComponent(value) : undefined
	    })

	    return params
	}

	module.exports = new Core()


/***/ }),
/* 10 */
/***/ (function(module, exports) {

	/**
	 * # os
	 *
	 * 检测系统类型与版本，包含系统类型与版本信息。
	 *
	 * 只检测Android 与 IOS, window phone（window phone 未进行完全测试）
	 *
	 * `os` 返回以下相关属性：
	 *
	 * `android` ：是否是Android
	 *
	 * `ios` ：是否是IOS系统
	 *
	 * `ipad` ：是否是iPad
	 *
	 * `iphone` ：是否是iPhone
	 *
	 * `ipod` ：是否是iPod
	 *
	 * `mobile` ：是否是移动端
	 *
	 * `phone` ：是否是手机
	 *
	 * `tablet` ：是否是平板
	 *
	 * `version` ：系统版本
	 *
	 * `wp` ： 是否是window phone
	 *
	 */

	var ua = navigator.userAgent,
	    android = ua.match(/(Android);?[\s\/]+([\d.]+)?/),
	    ipad = ua.match(/(iPad).*OS\s([\d_]+)/),
	    ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/),
	    iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/),
	    wp = ua.match(/Windows Phone ([\d.]+)/),
	    os = {}

	//android
	android ? (os.android = true, os.version = android[2]) : (os.android = false)

	//iphone
	iphone && !ipod ? ( os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.') ) : (os.iphone  = false)

	//ipad
	ipad ? ( os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.') ) : (os.ipad  = false)

	//ipod
	ipod ? ( os.ios = os.ipod = true, os.version = ipod[3].replace(/_/g, '.') ) : (os.ipod = false)

	//window phone
	wp ? ( os.wp = true, os.version = wp[1]) : (os.wp = false)

	//ios
	!os.iphone && !os.ipad && !os.ipod && (os.ios = false)

	//手机
	os.phone = os.android && /mobile/i.test(ua) || os.iphone || os.wp ? true : false

	//平板
	os.tablet = !os.phone && ( os.android || os.ipad || /window/i.test(ua) && /touch/i.test(ua) ) ? true : false

	//移动端
	os.mobile = os.phone || os.tablet

	module.exports = os


/***/ }),
/* 11 */
/***/ (function(module, exports) {

	/**
	 * # DateHelper
	 *
	 * 日期格式化组件。
	 *
	 * 格式化字符:
	 *
	    yyyy : 四位年。例如：2015

	    yy   : 二位年份，最后两位。例如 15

	    MMMM : 全称月份。例如 January

	    MMM  : 简称月份。例如 Jan

	    MM   : 两位月份，小于10显示03。例如：11

	    M    : 一位月份，小于10显示3.例如：3或者11

	    dddd : 全称星期。例如：星期一，Sunday

	    ddd  : 简称星期。例如：一，Sun

	    dd   : 两位天数。类似于MM

	    d    : 一位天数。类似于M

	    HH   : 两位小时。类似于MM

	    H    : 一位小时。类似于M

	    mm   : 两位分钟。类似于MM

	    m    : 一位分钟。类似于M

	    ss   : 两位秒数。类似于MM

	    s    : 一位秒数。类似于M

	    aa   : 全称上午或者下午。例如A.M.，P.M.

	    a    : 简称上午或者下午。例如AM.
	*/

	/**
	 * ## DateHelper Constructor
	 *
	 * `DateHelper` 模块，对外提供的是实例化的对象。
	 *
	 * 使用：
	 * ```js
	 * //String to Date
	 *
	 * '2015-05-20'.parseDate('yyyy-MM-dd')
	 *
	 * //格式化日期
	 * new Date().format('yyyy-MM-dd,HH:mm:ss')
	 *
	 * ```
	 */
	function DateHelper() {

	}

	var _prototype = DateHelper.prototype

	var get2Year = function(date) {
	    return (date.getFullYear() + '').replace(/\d{2}$/, '00') - 0
	}

	var get2 = function(value) {
	    return value < 10 ? '0' + value : value
	}

	var getAmPm = function(date) {
	    return date.getHours() < 12 ? 0 : 1
	}

	//获取相对应的日期相关数据
	var getValueByPattern = function(datehelper, fmt, date) {

	    var patterns = {
	        yyyy: date.getFullYear(),
	        yy: date.getFullYear() - get2Year(date),
	        MMMM: datehelper.i18n[datehelper.locale].month.full[date.getMonth()],
	        MMM: datehelper.i18n[datehelper.locale].month.abbr[date.getMonth()],
	        MM: get2(date.getMonth() + 1),
	        M: date.getMonth() + 1,
	        dddd: datehelper.i18n[datehelper.locale].day.full[date.getDay()],
	        ddd: datehelper.i18n[datehelper.locale].day.abbr[date.getDay()],
	        dd: get2(date.getDate()),
	        d: date.getDate(),
	        HH: get2(date.getHours()),
	        H: date.getHours(),
	        mm: get2(date.getMinutes()),
	        m: date.getMinutes(),
	        ss: get2(date.getSeconds()),
	        s: date.getSeconds(),
	        aa: datehelper.i18n[datehelper.locale].amPm.full[getAmPm(date)],
	        a: datehelper.i18n[datehelper.locale].amPm.abbr[getAmPm(date)]
	    }
	    return patterns[fmt]
	}

	//本地化，目前包含`en`与`zh`
	_prototype.i18n = {
	    en: {
	        month: {
	            abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	            full: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
	        },
	        day: {
	            abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
	            full: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
	        },
	        amPm: {
	            abbr: ['AM', 'PM'],
	            full: ['A.M.', 'P.M.']
	        }
	    },
	    zh: {
	        month: {
	            abbr: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
	            full: ['一月份', '二月份', '三月份', '四月份', '五月份', '六月份', '七月份', '八月份', '九月份', '十月份', '十一月份', '十二月份']
	        },
	        day: {
	            abbr: ['日', '一', '二', '三', '四', '五', '六'],
	            full: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
	        },
	        amPm: {
	            abbr: ['上午', '下午'],
	            full: ['上午', '下午']
	        }
	    }
	}

	//默认中文
	_prototype.locale = 'zh'

	/**
	 * ## DateHelper.prototype.addLocale
	 *
	 * 添加本地化
	 *
	 * @param {String} name   本地化名称
	 * @param {Object} locale 本地化数据
	 * @return {instance}     当前实例
	 */
	_prototype.addLocale = function(name, locale) {
	    name && locale && (this.i18n[name] = locale)
	    return this
	}

	/**
	 * ## DateHelper.prototype.setLocale
	 *
	 * 设置默认本地化
	 *
	 * @param {String} name   本地化名称
	 * @return {instance}     当前实例
	 */
	_prototype.setLocale = function(name) {
	    this.locale = name
	    return this
	}

	/**
	 * ## DateHelper.prototype.format
	 *
	 * 格式化日期。
	 *
	 * @param {Date} date      日期
	 * @param {String} format  日期格式
	 * @return {String}        格式化以后的日期
	 */
	_prototype.format = function(date, format) {
	    var self = this
	    if (!date) return

	    format = format || 'yyyy-MM-dd'

	    format = format.replace(/(yyyy|yy|MMMM|MMM|MM|M|dddd|ddd|dd|d|HH|H|mm|m|ss|s|aa|a)/g, function(part) {
	        return getValueByPattern(self, part, date)
	    })
	    return format
	}

	/**
	 * ## DateHelper.prototype.parse
	 *
	 * 转换日期。
	 *
	 * 此方法存在一个BUG，例如：
	 *
	 * ```js
	 *
	 * //1112会被计算在MM内。
	 * dateHelper.parse('2015-1112','yyyy-MMdd')
	 *
	 *
	 * //所以在使用parse方法时，每一个串使用字符分隔开。类似于：
	 *
	 * dateHelper.parse('2015-11-12','yyyy-MM-dd')
	 *
	 * ```
	 *
	 * @param {String} input   字符串
	 * @param {String} format  格式化字符串
	 * @return {Date}          格式化的日期
	 */
	_prototype.parse = function(input, format) {
	    if (!input || !format) return
	    var parts = input.match(/(\d+)/g),
	        i = 0,
	        fmt = {}

	    // extract date-part indexes from the format
	    format.replace(/(yyyy|yy|MM|M|dd|d|HH|H|mm|m|ss|s)/g, function(part) {
	        fmt[part] = i++
	    })

	    var year = parts[fmt['yyyy']] || (parseInt(parts[fmt['yy']], 10) + get2Year(new Date())) || 0,

	        month = (parts[fmt['MM']] - 1) || (parts[fmt['M']] - 1) || 0,

	        day = parts[fmt['dd']] || parts[fmt['d']] || 0,

	        hour = parts[fmt['HH']] || parts[fmt['H']] || 0,

	        minute = parts[fmt['mm']] || parts[fmt['m']] || 0,

	        second = parts[fmt['ss']] || parts[fmt['s']] || 0

	    return new Date(year, month, day, hour, minute, second)
	}

	var dateHelper = new DateHelper()

	// 将 parseDate 方法绑定在 `String` 原型上
	String.prototype.parseDate = function(format) {
	    return dateHelper.parse(this, format)
	}

	// 将 format 方法绑定在 `Date` 原型上
	Date.prototype.format = function(format) {
	    return dateHelper.format(this, format)
	}

	module.exports = dateHelper


/***/ }),
/* 12 */
/***/ (function(module, exports) {

	/**
	 * # cookie
	 *
	 * 操作cookie方法，`expires` 如果为数字，单位为`毫秒`。
	 *
	 * 使用方法：
	 * ```js
	 * //取值
	 * var name = Kub.cookie('name')
	 *
	 * //设置值
	 * Kub.cookie('name','kub')
	 *
	 * //配置cookie相关属性
	 * Kub.cookie('name','kub',{
	 *     domain:'.a.com'
	 *
	 * })
	 * ```
	 *
	 */
	var _document = document,
	    _encodeURIComponent = encodeURIComponent

	function cookie(key, value, options) {
	    var days, time, result, decode

	    options = options || {}

	    if(!options.hasOwnProperty('path')){
	        options.path = '/'
	    }

	    // A key and value were given. Set cookie.
	    if (arguments.length > 1 && String(value) !== "[object Object]") {
	        // Enforce object

	        if (value === null || value === undefined) options.expires = -1

	        if (typeof options.expires === 'number') {
	            days = options.expires
	            time = options.expires = new Date()

	            time.setTime(time.getTime() + days)
	        }

	        value = String(value)

	        return (_document.cookie = [
	            _encodeURIComponent(key), '=',
	            options.raw ? value : _encodeURIComponent(value),
	            options.expires ? '; expires=' + options.expires.toUTCString() : '',
	            options.path ? '; path=' + options.path : '',
	            options.domain ? '; domain=' + options.domain : '',
	            options.secure ? '; secure' : ''
	        ].join(''))
	    }

	    // Key and possibly options given, get cookie
	    options = value || {}

	    decode = options.raw ? function (s) { return s } : decodeURIComponent

	    return (result = new RegExp('(?:^|; )' + _encodeURIComponent(key) + '=([^;]*)').exec(_document.cookie)) ? decode(result[1]) : null
	}

	module.exports = cookie


/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # LazyLoad
	 *
	 * 延迟加载组件。
	 *
	 */

	/**
	 * @require [core](./core.js.html)
	 * @require [Lite](./lite.js.html)
	 */
	var core = __webpack_require__(9),
	    $ = __webpack_require__(7)

	/**
	 * ## LazyLoad Constructor
	 *
	 * `LazyLoad` 构造函数。
	 *
	 * 使用：
	 * ```js
	 * var lazyload = new Kub.LazyLoad($('img'))
	 * ```
	 */
	function LazyLoad(element, options) {
	    this.$element = $(element)

	    this.options = core.extend({}, _prototype.defaults, options || {})

	    this.$container = $(this.options.container)

	    this.isWebp = this.isSupportWebp()

	    init(this)
	}

	var _window = window,
	    _prototype = LazyLoad.prototype

	var //横竖屏切换时 ，orientationchange 与 resize事件都会触发，所以只需监听 resize 即可
	    RESIZE_EVENT = 'resize',
	    //三星某款机型在监听非window容器的scroll事件时，会无限次触发，可以使用touchmove替代
	    //但可能会出现 页面加载时触发scroll无法触发scroll与惯性滚动停止时，无法触发的情况
	    //综上：依旧采用scroll解决，对于某些机型进行忽略
	    EVENT_NAME = 'scroll'


	//获取所有还未被加载的节点
	var getUnloadedElements = function(lazyload) {
	    var dom = []

	    lazyload.$element.each(function() {
	        !this.loaded && dom.push(this)
	    })

	    return dom
	}

	//加载所有在可视区域内的图片
	var loadElementsInViewport = function(lazyload) {
	    var elements

	    elements = getUnloadedElements(lazyload)

	    lazyload.completed = elements.length === 0 ? true : false

	    elements.forEach(function(element) {
	        var $this = $(element)

	        lazyload.isVisible($this) && lazyload.load($this)
	    })
	}

	// 图片格式转换成webp格式
	var handleImgToWebp = function(url, lazyload) {
	    var changeURL = url.toString().replace(/(\.(?:gif|jpg|jpeg|png)(?:\.(?:jpg|png|webp))?)/i, function(match) {
	        var result = ''
	        if (match) {
	            var type = match.toLowerCase()
	        }

	        switch (type) {
	            case '.png.webp':
	            case '.jpg.webp':
	            case '.gif.webp':
	            case '.jpeg.webp':
	                result = match;
	                break;
	            case '.png':
	            case '.jpg':
	            case '.jpeg':
	                result = lazyload.isWebp ? match + '.webp' : match;
	                break;
	            case '.gif':
	                result = match
	                break;
	        }

	        return result
	    });

	    return changeURL
	}

	var init = function(lazyload) {
	    var options = lazyload.options,
	        timer

	    var handler = function() {
	        if (lazyload.completed) {
	            return
	        }

	        timer && clearTimeout(timer)

	        timer = setTimeout(function() {

	            loadElementsInViewport(lazyload)

	        }, options.delay)
	    }

	    //页面载入先执行下面
	    loadElementsInViewport(lazyload)

	    //页面紧接着触发scroll，走下面监听
	    lazyload.$container.on(EVENT_NAME, handler)

	    $(_window).on(RESIZE_EVENT, handler)
	}

	/**
	 * ## LazyLoad.prototype.defaults
	 *
	 * 默认配置项。
	 *
	 * 配置项说明：
	 *
	 *   `container` : `Selector` 图片存放的容器，容器会监听事件。
	 *
	 *   `threshold` : `Number` 提前加载距离。
	 *
	 *   `delay` : `Number` 事件监听时的延迟时间。
	 *
	 *   `attributeName` : `String` 属性名称。默认会从`element`上取出 `data-original` 属性。
	 *
	 *   `load` : `Function` 图片加载事件。
	 *
	 *   `useWebp` : `Boolean` 加载图片是否使用webp格式。默认为false：不使用webp格式。
	 *
	 */
	_prototype.defaults = {
	    container: _window,
	    threshold: 200,
	    delay: 100,
	    attributeName: 'original',
	    load: null,
	    useWebp: false
	}

	/**
	 * ## LazyLoad.prototype.updateElement
	 *
	 * 更新需要加载的节点，更新以后会立即检测是否有节点在可视区域内，修改的节点为替换，不是增加，意味着原来的节点会被替换。
	 *
	 * @return {instance} 当前实例
	 */
	_prototype.updateElement = function(element) {

	    this.$element = $(element)

	    //更新 dom 以后立即验证是否有元素已经显示
	    loadElementsInViewport(this)

	    return this
	}

	/**
	 * ## LazyLoad.prototype.loadAll
	 *
	 * 强制加载所有图片，无论节点是否在可视区域内。
	 *
	 * @return {instance} 当前实例
	 */
	_prototype.loadAll = function() {
	    var self = this,
	        elements

	    elements = getUnloadedElements(self)

	    this.completed = true

	    elements.forEach(function(element) {
	        var $this = $(element)

	        self.load($this)
	    })
	    return self
	}

	/**
	 * ## LazyLoad.prototype.isVisible
	 *
	 * 是否在视窗可见。
	 * @param {$}  $this         元素
	 * @param {Object}  options  参数
	 * @return {Boolean}         true ：可见 false ：不可见
	 */
	_prototype.isVisible = function($this) {
	    var options = this.options,
	        element = $this[0]

	    //如果节点不可见，则不进行加载
	    if (element.offsetWidth == 0 && element.offsetHeight == 0 && element.getClientRects().length == 0) {
	        return false
	    }

	    if (this.abovethetop($this, options)) {
	        return false
	    } else if (this.belowthefold($this, options)) {
	        return false
	    }
	    if (this.leftofbegin($this, options)) {
	        return false
	    } else if (this.rightoffold($this, options)) {
	        return false
	    }
	    return true
	}

	/**
	 * ## LazyLoad.prototype.isSupportWebp
	 *
	 * 是否支持webp图片格式后缀。
	 *
	 * @return {Boolean}    true： 支持 false： 不支持
	 */
	_prototype.isSupportWebp = function(){
	    var element = document.createElement('canvas')

	    if (!!(element.getContext && element.getContext('2d'))) {

	        return element.toDataURL('image/webp').indexOf('data:image/webp') == 0

	    } else {
	        return false
	    }
	}

	/**
	 * ## LazyLoad.prototype.load
	 *
	 * 加载指定元素。
	 *
	 * @param {$} $element      加载的节点
	 * @param {String} original 图片地址
	 * @return {instance}       当前实例
	 */
	_prototype.load = function($element) {

	    var options = this.options,
	        original = $element.attr('data-' + options.attributeName),
	        load = options.load

	    //如果原图片为空
	    if (!original) {
	        return this
	    }

	    original = options.useWebp ? handleImgToWebp(original, this) : original

	    if ($element[0].nodeName === 'IMG') {
	        $element.attr('src', original)
	    } else {
	        $element.css('background-image', 'url(' + original + ')')
	    }
	    //记录该节点已被加载
	    $element[0].loaded = true

	    // 触发 load 事件
	    load && load.call($element[0])

	    return this
	}

	/**
	 * ## LazyLoad.prototype.belowthefold
	 *
	 * 是否在视窗下面。
	 *
	 * @param {Element} element 检查的元素
	 * @param {Object} settings 被检查时的参数
	 * @return {Boolean}        是：true 否 ：false
	 */
	_prototype.belowthefold = function(element, settings) {
	    var fold, container = settings.container

	    if (container === _window) {
	        fold = _window.innerHeight + _window.scrollY
	    } else {
	        var $container = $(container),
	            offset = $container.offset()

	        fold = offset.top + $container[0].offsetHeight
	    }

	    return fold <= $(element).offset().top - settings.threshold
	}

	/**
	 * ## LazyLoad.prototype.abovethetop
	 *
	 * 是否在视窗上面。
	 *
	 * @param {Element} element 检查的元素
	 * @param {Object} settings 被检查时的参数
	 * @return {Boolean}        是：true 否 ：false
	 */
	_prototype.abovethetop = function(element, settings) {
	    var fold, container = settings.container

	    if (container === _window) {
	        fold = _window.scrollY
	    } else {
	        fold = $(container).offset().top
	    }

	    var $element = $(element),
	        offset = $element.offset()
	    return fold >= offset.top + settings.threshold + $element[0].offsetHeight
	}

	/**
	 * ## LazyLoad.prototype.rightoffold
	 *
	 * 是否在视窗右侧。
	 *
	 * @param {Element} element 检查的元素
	 * @param {Object} settings 被检查时的参数
	 * @return {Boolean}        是：true 否 ：false
	 */
	_prototype.rightoffold = function(element, settings) {
	    var fold, container = settings.container

	    if (container === _window) {
	        fold = _window.innerWidth + _window.scrollX
	    } else {
	        var $container = $(container),
	            offset = $container.offset()
	        fold = offset.left + $container[0].offsetWidth
	    }
	    return fold <= $(element).offset().left - settings.threshold
	}

	/**
	 * ## LazyLoad.prototype.leftofbegin
	 *
	 * 是否在视窗左侧。
	 *
	 * @param {Element} element 检查的元素
	 * @param {Object} settings 被检查时的参数
	 * @return {Boolean}        是：true 否 ：false
	 */
	_prototype.leftofbegin = function(element, settings) {
	    var fold, container = settings.container

	    if (container === _window) {
	        fold = _window.scrollX
	    } else {
	        fold = $(container).offset().left
	    }

	    var $element = $(element),
	        offset = $element.offset()

	    return fold >= offset.left + settings.threshold + $element[0].offsetWidth
	}

	module.exports = LazyLoad


/***/ }),
/* 14 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Dialog
	 *
	 * 对话框.
	 */

	/**
	 * @require [core](./core.js.html)
	 * @require [Lite](./lite.js.html)
	 */
	var core = __webpack_require__(9),
	    $ = __webpack_require__(7),
	    template = __webpack_require__(15)

	/**
	 * ## Dialog Constructor
	 *
	 * Dialog 构造函数。
	 *
	 * 使用：
	 * ```js
	 *   //可定制多个按钮
	 *   var dialog = new Kub.Dialog({
	 *       message:'这是个弹窗',
	 *       title:'弹窗',
	 *       buttons:[{
	 *           text:'确定',
	 *           handler:function(e,dialog){
	 *
	 *           }
	 *       },{
	 *          text:'取消',
	 *          handler:function(e,dialog){
	 *               //返回 event 与 dialog对象
	 *               dialog.close()
	 *          }
	 *       }]
	 *   })
	 * ```
	 */
	function Dialog(options) {
	    this.options = core.extend({}, _prototype.defaults, options || {})
	    init(this)
	}

	var ZOOMIN_CLASS = 'kub-animated kub-zoomin',
	    DIALOG_SELECTOR = '.J_dialog',
	    DIALOG_BUTTON_SELECTOR = '.J_dialogButton',
	    EVENT_NAME = 'click'

	var $body

	var _prototype = Dialog.prototype

	var render = function(dialog,data) {
	    var html = template(data)

	    dialog.$element = $(html).appendTo($body)
	    return this
	}

	var bindEvents = function(dialog){
	    var options = dialog.options

	    //注册按钮事件
	    dialog.$element.find(DIALOG_BUTTON_SELECTOR).on(EVENT_NAME, function(e) {
	        var index = parseInt($(this).attr('data-index')),
	            button = options.buttons[index]

	        button.handler && button.handler.call(this, e, dialog)
	    })
	}

	var init = function(dialog) {

	    !$body && ($body = $(document.body))

	    //渲染数据
	    render(dialog, dialog.options)

	    dialog.$dialog = dialog.$element.find(DIALOG_SELECTOR)

	    dialog.setPosition && dialog.setPosition()

	    dialog.show()

	    bindEvents(dialog)
	}

	/**
	 * ## Dialog.prototype.defaults
	 *
	 * 默认配置项。
	 *
	 * 配置项说明：
	 *
	 * * `modal` : `Boolean` 是否显示遮罩层。
	 *
	 * * `title` : `String` 对话框名称。
	 *
	 * * `showHeader` : `Boolean` 是否显示头部。
	 *
	 * * `message` : `String` 弹窗内容。
	 *
	 * * `className` : `String` 弹窗类名。
	 *
	 * * `animated` : `Boolean` 是否开启动画效果。
	 *
	 * * `buttons`: `Array` 弹窗按钮。
	 *
	 * ```js
	 * //例如：
	 * [{
	 *     text:'按钮名称',//按钮名称
	 *     className:'button-name',//按钮class类名
	 *     handler:function(){
	 *         //按钮单击触发事件
	 *     }
	 * }]
	 * ```
	 */
	_prototype.defaults = {
	    modal: true,
	    title: '',
	    showHeader: true,
	    message: '',
	    className: '',
	    animated: true,
	    buttons: null
	}

	/**
	 * ## Dialog.prototype.show
	 *
	 * 显示弹窗。
	 * @return {instance} 返回当前实例
	 */
	_prototype.show = function() {

	    this.$element.show()
	    this.options.animated && this.$dialog.addClass(ZOOMIN_CLASS)

	    return this
	}

	/**
	 * ## Dialog.prototype.hide
	 *
	 * 隐藏弹窗。
	 * @return {instance} 返回当前实例
	 */
	_prototype.hide = function() {

	    this.$element.hide()
	    this.options.animated && this.$dialog.removeClass(ZOOMIN_CLASS)

	    return this
	}

	/**
	 * ## Dialog.prototype.close
	 *
	 * 关闭弹窗。
	 * @return {instance} 返回当前实例
	 */
	_prototype.close = function() {
	    var opts = this.options

	    if (opts.closeHandler && opts.closeHandler.call(this) === false) {
	        return this
	    }

	    this.hide()
	    this.$element.remove()

	    return this
	}

	module.exports = Dialog


/***/ }),
/* 15 */
/***/ (function(module, exports) {

	module.exports = function(data){
	var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
	__p+='<div class="kub-dialog-modal '+
	((__t=( data.className))==null?'':__t)+
	' ';
	if( data.modal ){
	__p+=' kub-modal ';
	}
	__p+='"><div class="kub-dialog-wrapper"><div class="kub-dialog-container"><div class="kub-dialog J_dialog"> ';
	if(data.showHeader){
	__p+=' <div class="kub-dialog-header"> '+
	((__t=( data.title))==null?'':__t)+
	' </div> ';
	}
	__p+=' <div class="kub-dialog-body"> '+
	((__t=( data.message))==null?'':__t)+
	' </div> ';
	if(data.buttons && data.buttons.length){
	__p+=' <div class="kub-dialog-footer"> ';
	 for (var i=0,j=data.buttons.length;i<j;i++){
	__p+=' <button class="kub-dialog-button J_dialogButton '+
	((__t=( data.buttons[i].className || ''))==null?'':__t)+
	'" data-index="'+
	((__t=( i))==null?'':__t)+
	'"> '+
	((__t=( data.buttons[i].text))==null?'':__t)+
	' </button> ';
	}
	__p+=' </div> ';
	}
	__p+=' </div></div></div></div>';
	return __p;
	};

/***/ }),
/* 16 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Alert
	 *
	 * alert弹窗。
	 */

	/**
	 * @require [core](./core.js.html)
	 * @extend [Dialog](./dialog.js.html)
	 */
	var core = __webpack_require__(9),
	    Dialog = __webpack_require__(14)

	/**
	 * ## Alert Constructor
	 *
	 * 继承于`Dialog`，可使用`Dialog`类中的方法。
	 *
	 * 使用方法：
	 * ```js
	 * var alert = new Kub.Alert()
	 * ```
	 */
	function Alert(options) {
	    var opts = this.options = core.extend({}, _prototype.defaults, options || {})

	    opts.buttons = [{
	        text: opts.confirmText,
	        handler: this.options.confirm || function(e, dialog) {
	            dialog.close()
	        }
	    }]

	    Dialog.call(this, opts)
	}

	var _prototype = Alert.prototype = Object.create(Dialog.prototype)

	_prototype.constructor = Alert

	/**
	 * ## Alert.defaults
	 *
	 * `Alert` 默认配置项。
	 *
	 * 配置项说明：
	 *
	 * * `confirmText` : `String` 确认按钮名称。
	 *
	 * * `confirm` : `Function` 单击确认按钮时触发的事件。
	 *
	 *    > 如果未传递，单击时会默认关闭弹窗。
	 *    >
	 *    > 如果传递，需调用 `dialog.close()`关闭弹窗。
	 *
	 * * `showHeader` : `Boolean` 是否显示头部。
	 *
	 * * `className` : `String` 弹窗类名，修改时需加上`kub-alert`默认类名。
	 *
	 * * `modal` : `Boolean` 是否显示遮罩层。
	 */

	_prototype.defaults = {
	    confirmText: '确定',
	    confirm: null,
	    showHeader: false,
	    className: 'kub-alert',
	    modal: true
	}

	module.exports = Alert


/***/ }),
/* 17 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Confirm
	 *
	 * confirm 弹窗。
	 */

	/**
	 * @require [core](./core.js.html)
	 * @extend [Dialog](./dialog.js.html)
	 */
	var core = __webpack_require__(9),
	    Dialog = __webpack_require__(14)

	/**
	 * ## Confirm Constructor
	 *
	 * 继承于`Dialog`，可使用`Dialog`类中的方法。
	 *
	 * 使用方法：
	 * ```js
	 * var confirm = new Kub.Confirm({
	 *     confirm:function(e,dialog){
	 *         //do something
	 *         dialog.close()
	 *     }
	 * })
	 * ```
	 */
	function Confirm(options) {
	    var opts = this.options = core.extend({}, _prototype.defaults, options || {})

	    opts.buttons = [{
	        text: opts.cancelText,
	        handler: opts.cancel || function(e, dialog) {
	            dialog.close()
	        }
	    }, {
	        text: opts.confirmText,
	        handler: opts.confirm
	    }]

	    Dialog.call(this, opts)
	}

	var _prototype = Confirm.prototype = Object.create(Dialog.prototype)

	_prototype.constructor = Confirm

	/**
	 * ## Confirm.defaults
	 *
	 * `Confirm`默认配置项。
	 *
	 * 配置项说明：
	 *
	 * * `confirmText` : `String` 确认按钮名称。
	 *
	 * * `confirm` : `Function` 单击确认按钮时触发的事件。一般用于用户单击确认按钮执行事件。需调用`dialog.close()`手动关闭弹窗。
	 *
	 * * `cancelText` : `String` 取消按钮名称。
	 *
	 * * `cancel` : `Function` 单击取消按钮时触发的事件。
	 *
	 *    > 如果未传递，单击时会默认关闭弹窗。
	 *    >
	 *    > 如果传递，需调用 `dialog.close()`关闭弹窗。
	 *
	 * * `showHeader` : `Boolean` 是否显示头部。
	 *
	 * * `className` : `String` 弹窗类名，修改时需加上`kub-confirm`默认类名。
	 *
	 * * `modal` : `Boolean` 是否显示遮罩层。
	 */
	_prototype.defaults = {
	    confirmText: '确定',
	    confirm: null,
	    cancelText: '取消',
	    cancel: null,
	    showHeader: false,
	    className: "kub-confirm",
	    modal: true
	}

	module.exports = Confirm


/***/ }),
/* 18 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Prompt
	 *
	 * prompt 输入框。
	 */

	/**
	 * @require [core](./core.js.html)
	 * @extend [Dialog](./dialog.js.html)
	 */
	var core = __webpack_require__(9),
	    Dialog = __webpack_require__(14),
	    template = __webpack_require__(19)

	var INPUT_SELECTOR = '.J_input'

	/**
	 * ## Prompt Constructor
	 *
	 * 继承于`Dialog`，可使用`Dialog`类中的方法。
	 *
	 * 使用方法：
	 * ```js
	 * var prompt = new Kub.Prompt({
	 *     confirm:function(event,dialog,value){
	 *         //输入框输入的值 value
	 *     }
	 * })
	 * ```
	 */
	function Prompt(options) {
	    var opts = this.options = core.extend({}, _prototype.defaults, options || {})

	    opts.buttons = [{
	        text: opts.cancelText,
	        handler: opts.cancel || function(e, dialog) {
	            dialog.close()
	        }
	    }, {
	        text: opts.confirmText,
	        handler: function(e, dialog) {
	            var value = dialog.$element.find(INPUT_SELECTOR)[0].value
	            opts.confirm && opts.confirm.call(this, e, dialog, value)
	        }
	    }]

	    opts.message = template(opts)

	    Dialog.call(this, opts)
	}

	var _prototype = Prompt.prototype = Object.create(Dialog.prototype)

	_prototype.constructor = Prompt

	/**
	 * ## Prompt.prototype.defaults
	 *
	 * `Prompt`默认配置项。
	 *
	 * 配置项说明：
	 *
	 * * `confirmText` : `String` 确认按钮名称。
	 *
	 * * `confirm` : `Function` 单击确认按钮时触发的事件。用于用户单击确认按钮执行事件。需调用`dialog.close()`手动关闭弹窗。
	 *
	 * * `cancelText` : `String` 取消按钮名称。
	 *
	 * * `cancel` : `Function` 单击取消按钮时触发的事件。
	 *
	 *    > 如果未传递，单击时会默认关闭弹窗。
	 *    >
	 *    > 如果传递，需调用 `dialog.close()`关闭弹窗。
	 *
	 * * `showHeader` : `Boolean` 是否显示头部。
	 *
	 * * `className` : `String` 弹窗类名，修改时需加上`kub-prompt`默认类名。
	 *
	 * * `modal` : `Boolean` 是否显示遮罩层。
	 *
	 * * `message` : `String` 提示内容。
	 *
	 * * `inputType` : `String` 输入框类型。
	 *
	 * * `placeholder` : `String` 输入框 `placeholder` 属性。
	 *
	 * * `defaultValue` : `String` 输入框默认值。
	 */
	_prototype.defaults = {
	    confirmText: '确定',
	    confirm: null,
	    cancelText: '取消',
	    cancel: null,
	    showHeader: false,
	    className: 'kub-prompt',
	    modal: true,
	    message:'',
	    inputType: 'text',
	    placeholder: '',
	    defaultValue: ''
	}

	module.exports = Prompt


/***/ }),
/* 19 */
/***/ (function(module, exports) {

	module.exports = function(data){
	var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
	__p+=''+
	((__t=(data.message))==null?'':__t)+
	' <div class="kub-prompt-input-wrapper"><input placeholder="'+
	((__t=( data.placeholder))==null?'':__t)+
	'" type="'+
	((__t=( data.inputType))==null?'':__t)+
	'" value="'+
	((__t=( data.defaultValue))==null?'':__t)+
	'" class="kub-prompt-input J_input"></div>';
	return __p;
	};

/***/ }),
/* 20 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Toast
	 *
	 * 提示框
	 */

	/**
	 * @require [core](./core.js.html)
	 * @extend [Dialog](./dialog.js.html)
	 */
	var core = __webpack_require__(9),
	    Dialog = __webpack_require__(14)

	/**
	 * ## Toast Constructor
	 *
	 * 继承于`Dialog`，可使用`Dialog`类中的方法。
	 *
	 * 使用方法：
	 * ```js
	 * var toast = new Kub.Toast({
	 *     message:'操作成功。'
	 * })
	 * ```
	 */
	function Toast(options){
	    var self = this,
	        opts = this.options = core.extend({}, _prototype.defaults, options||{},{
	            showHeader:false,
	            buttons:null
	        })

	    Dialog.call(this, opts)

	    //自动关闭
	    setTimeout(function(){
	        self.close()
	    }, opts.delay)
	}

	var _prototype = Toast.prototype = Object.create(Dialog.prototype)

	_prototype.constructor = Toast

	/**
	 * ## Toast.prototype.defaults
	 *
	 * `Toast`默认配置项。
	 *
	 * 配置项说明：
	 *
	 * * `message` : `String` 提示内容。
	 *
	 * * `className` : `String` 弹窗类名，修改时需加上`kub-toast`默认类名。
	 *
	 * * `top` : `Number` 距离顶部高度。
	 *
	 * * `delay` : `Number` 延迟时间。
	 *
	 * * `modal` : `Boolean` 是否显示遮罩层。
	 */
	_prototype.defaults = {
	    message:'',
	    className:'kub-toast',
	    top:50,
	    delay:2000,
	    modal:false
	}

	_prototype.setPosition = function(){
	    var top = this.options.top

	    this.$element.css({
	        top:core.isNumber(top) ? top + 'px' : top
	    })
	    return this
	}

	module.exports = Toast


/***/ }),
/* 21 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Loader
	 *
	 * 加载等待框。
	 *
	 */

	/**
	 * @require [core](./core.js.html)
	 * @extend [Dialog](./dialog.js.html)
	 */
	var core = __webpack_require__(9),
	    Dialog = __webpack_require__(14)

	/**
	 * ## Loader Constructor
	 *
	 * 继承于`Dialog`，可使用`Dialog`类中的方法。
	 *
	 * 使用方法：
	 *
	 * ```js
	 * var loader = new Kub.Loader()
	 *
	 * //隐藏loader
	 * loader.hide()
	 *
	 * var loader = new Kub.Loader({
	 *     message: '定制提示内容'
	 * })
	 *
	 * ```
	 */
	function Loader(options) {
	    var opts = this.options = core.extend({}, _prototype.defaults, options || {}, {
	        showHeader: false,
	        buttons: null
	    })

	    Dialog.call(this, opts)
	}

	var _prototype = Loader.prototype = Object.create(Dialog.prototype)

	_prototype.constructor = Loader

	/**
	 * ## Loader.prototype.defaults
	 *
	 * `Loader` 默认配置项。
	 *
	 * 配置项说明：
	 *
	 * * `className`: `String` 弹窗类名，修改时需加上`kub-loader`默认类名。
	 *
	 * * `message` : `String` 提示内容。
	 *
	 * * `modal` : `Boolean` 是否显示遮罩层。
	 */
	_prototype.defaults = {
	    className: 'kub-loader',
	    modal: true,
	    message: '加载中…'
	}

	module.exports = Loader


/***/ }),
/* 22 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Swiper
	 *
	 * 切换组件
	 */

	/**
	 * @require [core](./core.js.html)
	 * @require [os](./detect.js.html)
	 * @require [Lite](./lite.js.html)
	 */
	var core = __webpack_require__(9),
	    os = __webpack_require__(10),
	    $ = __webpack_require__(7)

	/**
	 * ## Swiper Constructor
	 *
	 * `Swiper`类。
	 *
	 * 使用方法：
	 * ```js
	 * new Kub.Swiper('.swiper',{
	 *      slideSelector:'.slide',
	 *      slideActiveClass:'active',
	 *      paginationSelector:'.pagination li',
	 *      paginationActiveClass:'pagination-active',
	 *      slide:function(index){
	 *          //当前滚动索引
	 *      }
	 * })
	 * ```
	 */

	function Swiper(element, options) {

	    this.options = core.extend(true, {}, _prototype.defaults, options || {})
	    this.$element = $(element)

	    var ui = this._ui = {
	        slides: $(options.slideSelector),
	        paginations: $(options.paginationSelector)
	    }

	    ui.slidesLength = ui.slides.length

	    init(this)
	}

	var $document = $(document),
	    isTouch = os.mobile

	var START_EVENT = isTouch ? 'touchstart' : 'mousedown',
	    MOVE_EVENT = isTouch ? 'touchmove' : 'mousemove',
	    END_EVENT = isTouch ? 'touchend' : 'mouseup',
	    RESIZE_EVENT = 'resize',
	    TRANSITIONEND_EVENT = 'transitionend',
	    WEBKIT_TRANSITIONEND_EVENT = 'webkitTransitionEnd',
	    HORIZONTAL = 'horizontal',
	    //粘性
	    VISCOSITY = 5,
	    //触摸点偏移量
	    TOUCH_THRESHOLD = 5

	var _window = window,
	    _prototype = Swiper.prototype

	//获取触摸点
	var getCoords = function(event) {
	    var touches = event.touches,
	        data = touches && touches.length ? touches : event.changedTouches

	    return {
	        x: isTouch ? data[0].pageX : event.pageX,
	        y: isTouch ? data[0].pageY : event.pageY
	    }
	}

	//获取偏移
	var getDistance = function(event, startCoords) {
	    var coords = getCoords(event),
	        x = coords.x - startCoords.x,
	        y = coords.y - startCoords.y

	    return {
	        distanceX: x,
	        distanceY: y
	    }
	}

	//获取位置与索引
	var getCoordinates = function(swiper, distanceX, distanceY) {
	    var element = swiper._ui.slides[0],
	        w = element.offsetWidth,
	        h = element.offsetHeight,
	        l = swiper._ui.slidesLength,
	        index = swiper._ui.active,
	        active = index,
	        threshold = swiper.options.threshold,
	        reach,
	        _distanceY = Math.abs(distanceY),
	        _distanceX = Math.abs(distanceX)

	    if (swiper.options.direction === HORIZONTAL) {

	        //达到门槛
	        reach = threshold < _distanceX

	        //横向
	        if (distanceX > 0 && index == 0) {
	            //最左侧
	            distanceX = distanceX / VISCOSITY

	            index = 0

	        } else if (distanceX < 0 && index == l - 1) {
	            //最右侧
	            distanceX = distanceX / VISCOSITY

	            index = l - 1

	        } else if (reach) {
	            //达到最小偏移量

	            //取整
	            var s = Math.round(_distanceX / w)

	            s = s == 0 ? 1 : s

	            //向右或者向左
	            index = distanceX > 0 ? index - s : index + s
	        }

	        return {
	            x: distanceX + (-w * active),
	            y: 0,
	            index: index,
	            isDefaultPrevented: !(!reach && _distanceX < _distanceY && TOUCH_THRESHOLD < _distanceY)
	        }

	    } else {

	        //达到门槛
	        reach = threshold < _distanceY

	        //垂直
	        if (distanceY > 0 && index == 0) {
	            //最上
	            distanceY = distanceY / VISCOSITY
	            index = 0

	        } else if (distanceY < 0 && index == l - 1) {
	            //最下
	            distanceY = distanceY / VISCOSITY
	            index = l - 1

	        } else if (reach) {
	            //达到最小偏移
	            var s = Math.round(_distanceY / h)

	            s = s == 0 ? 1 : s

	            index = distanceY > 0 ? index - s : index + s
	        }

	        return {
	            x: 0,
	            y: distanceY + (-h * active),
	            index: index,
	            isDefaultPrevented: true
	        }
	    }
	}

	var returnFalse = function() {
	    return false
	}

	//添加重复子节点
	var appendCloneChildren = function(swiper) {

	    if (swiper.options.infinite) {
	        var $slides = swiper._ui.slides,
	            first = $slides[0],
	            last = $slides[swiper._ui.slidesLength - 1],
	            parentElement = first.parentElement

	        parentElement.insertBefore(last.cloneNode(true), first)
	        parentElement.appendChild(first.cloneNode(true))

	        swiper._ui.slidesLength += 2
	    }
	}

	//重置索引值
	var resetSlideIndex = function(swiper) {
	    var index = swiper._ui.active,
	        length = swiper._ui.slidesLength

	    if (swiper.options.infinite) {

	        if (index === length - 1) {
	            swiper.slide(1, 0)
	        }

	        if (index === 0) {
	            swiper.slide(length - 2, 0)
	        }
	    }
	}

	//设置偏移量
	var setTranslate = function($element, x, y) {
	    core.isNumber(x) && (x += 'px')
	    core.isNumber(y) && (y += 'px')

	    var t = 'translate3d(' + x + ',' + y + ',0)'

	    $element.css({
	        '-webkit-transform': t,
	        'transform': t
	    })
	}

	//设置偏移速度
	var setDuration = function($element, duration) {
	    core.isNumber(duration) && (duration += 'ms')

	    $element.css({
	        '-webkit-transition-duration': duration,
	        'transition-duration': duration
	    })
	}

	var getActualIndex = function(index, length) {
	    return index < 0 ? 0 : index >= length ? length - 1 : index
	}

	//设置容器偏移量
	var setContainerTranslate = function(swiper, x, y, duration) {
	    var $element = swiper.$element

	    duration = duration || 0

	    setDuration($element, duration)
	    setTranslate($element, x, y)
	}

	//添加选中类
	var setActiveClass = function(swiper, index) {
	    var options = swiper.options,
	        slideActiveClass = options.slideActiveClass,
	        paginationActiveClass = options.paginationActiveClass

	    //添加选中的class
	    swiper._ui.slides.removeClass(slideActiveClass).eq(index).addClass(slideActiveClass)

	    swiper._ui.paginations.removeClass(paginationActiveClass).eq(index).addClass(paginationActiveClass)
	}

	//监听slide完成事件
	var bindTransitionEndEvent = function(swiper) {
	    var $element = swiper.$element

	    var handler = function() {
	        var options = swiper.options,
	            callback = options.slide,
	            index = swiper._ui.active

	        resetSlideIndex(swiper)

	        //计算出真实索引值
	        options.infinite && (index = swiper._ui.active - 1)

	        callback && callback.call(swiper, index)
	    }

	    //duration == 0 无法触发
	    //translate 值未改变也无法触发
	    $element.on(TRANSITIONEND_EVENT, handler).on(WEBKIT_TRANSITIONEND_EVENT, handler)
	}

	//监听横竖屏切换
	var bindOrientationChangeEvent = function(swiper) {
	    var timer

	    function handler() {
	        timer && clearTimeout(timer)
	        timer = setTimeout(function() {
	            swiper.slide(swiper._ui.active)
	        }, 200)
	    }
	    $(_window).on(RESIZE_EVENT, handler)
	}

	//绑定事件
	var bindEvents = function(swiper) {
	    var flag = false,
	        startCoords

	    var start = function(event) {
	            stopAuto(swiper)

	            flag = true
	            event = event.originalEvent || event

	            resetSlideIndex(swiper)

	            startCoords = getCoords(event)

	            setDuration(swiper.$element, null)
	        },
	        move = function(event) {
	            if (!flag) return
	            event = event.originalEvent || event

	            var distance = getDistance(event, startCoords),
	                coordinates = getCoordinates(swiper, distance.distanceX, distance.distanceY)

	            coordinates.isDefaultPrevented && (event.preventDefault(),setTranslate(swiper.$element, coordinates.x, coordinates.y))
	        },
	        end = function(event) {
	            if (!flag) return
	            flag = false

	            event = event.originalEvent || event

	            var distance = getDistance(event, startCoords),
	                index = getCoordinates(swiper, distance.distanceX, distance.distanceY).index

	            swiper.slide(index)

	            beginAuto(swiper)
	        }

	    //监听横竖屏
	    bindOrientationChangeEvent(swiper)

	    //触发回调函数
	    bindTransitionEndEvent(swiper)

	    swiper.$element.on(START_EVENT, start)
	    swiper.$element.on(MOVE_EVENT, move)
	    swiper.$element.on(END_EVENT, end)

	    swiper.$element[0].onselectstart = returnFalse
	    swiper.$element[0].ondragstart = returnFalse
	}

	//偏移到指定的位置
	var slideTo = function(swiper, index, duration) {
	    var element = swiper._ui.slides[0]

	    //由于移动端浏览器 transition 动画不支持百分比，所以采用像素值
	    if (swiper.options.direction === HORIZONTAL) {
	        //横向
	        var w = element.offsetWidth

	        setContainerTranslate(swiper, -index * w, 0, duration)
	    } else {
	        //垂直
	        var h = element.offsetHeight

	        setContainerTranslate(swiper, 0, -index * h, duration)
	    }
	}

	// 开始自动切换
	var beginAuto = function(swiper){
	    var options = swiper.options,
	        _ui = swiper._ui,
	        auto = options.auto

	    auto && (swiper._timer = setInterval(function(){
	        // 由于一些特殊设计
	        // 对非循环滚动采用自动计算索引值的方式
	        options.infinite ? swiper.next() : swiper.slide( (_ui.active + 1) % _ui.slidesLength )
	    }, auto))
	}

	// 停止自动切换
	var stopAuto = function(swiper){
	    var timer = swiper._timer

	    timer && clearInterval(timer)
	}

	//初始化
	var init = function(swiper) {
	    var options = swiper.options

	    appendCloneChildren(swiper)

	    //设置默认样式
	    swiper.$element.css(options.style.swiper)

	    var initialSlide = options.initialSlide || 0
	    options.infinite && (initialSlide = initialSlide + 1)

	    //滚动到默认位置
	    swiper.slide(initialSlide, 0)

	    beginAuto(swiper)

	    //绑定事件
	    bindEvents(swiper)
	}

	/**
	 * ## Swiper.prototype.defaults
	 *
	 * `Swiper`默认配置项。
	 *
	 * 配置项说明：
	 *
	 * * `direction`: `String` 切换方向。horizontal ：横向， vertical ：纵向。
	 *
	 * * `threshold`: `Number` 最小触发距离。手指移动距离必须超过`threshold`才允许切换。
	 *
	 * * `duration`: `Number` 切换速度。
	 *
	 * * `auto`: `Number` 自动切换速度。0表示不自动切换，默认为0 。
	 *
	 * * `infinite`: `Boolean` 是否循环滚动 true ：循环 false ：不循环。
	 *
	 * * `initialSlide`: `Number` 初始化滚动位置。
	 *
	 * * `slideSelector`: `Selector` 滚动元素。
	 *
	 * * `slideActiveClass`: `String` 滚动元素选中时的类名。
	 *
	 * * `paginationSelector`: `Selector` 缩略图或icon。
	 *
	 * * `paginationActiveClass`: `String` 缩略图或icon选中时的类名。
	 *
	 * * `slide`: `Function` 切换回调函数。
	 */

	_prototype.defaults = {
	    //vertical
	    direction: HORIZONTAL,
	    threshold: 50,
	    duration: 300,
	    infinite: false,
	    initialSlide: 0,
	    slideSelector: '',
	    slideActiveClass: '',
	    paginationSelector: '',
	    paginationActiveClass: '',
	    slide: null,
	    style: {
	        swiper: {
	            '-webkit-transition-property': '-webkit-transform',
	            'transition-property': 'transform',
	            '-webkit-transition-timing-function': 'ease-out',
	            'transition-timing-function': 'ease-out'
	        }
	    }
	}

	/**
	 * ## Swiper.prototype.slide
	 *
	 * 滚动到指定索引值位置
	 *
	 * @param  {index} index 滚动索引值
	 * @param  {duration} duration 滚动速度，默认配置的`duration`。
	 * @return {instance}    当前实例
	 */
	_prototype.slide = function(index, duration) {
	    var options = this.options

	    //如果speed为空，则取默认值
	    duration = duration == null ? options.duration : duration

	    //取出实际的索引值,保存当前索引值
	    this._ui.active = index = getActualIndex(index, this._ui.slidesLength)

	    //通过索引值设置偏移
	    slideTo(this, index, duration)

	    //设置选中状态Class
	    setActiveClass(this, options.infinite ? index - 1 : index)

	    return this
	}

	/**
	 * ## Swiper.prototype.next
	 *
	 * 切换到下一个
	 *
	 * @param  {duration} duration 滚动速度，默认配置的`duration`。
	 * @return {instance}    当前实例
	 */
	_prototype.next = function(duration) {
	    return this.slide(this._ui.active + 1, duration)
	}

	/**
	 * ## Swiper.prototype.prev
	 *
	 * 切换到上一个
	 *
	 * @param  {duration} duration 滚动速度，默认配置的`duration`。
	 * @return {instance}    当前实例
	 */
	_prototype.prev = function(duration) {
	    return this.slide(this._ui.active - 1, duration)
	}

	module.exports = Swiper


/***/ }),
/* 23 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # DatePicker
	 *
	 * 时间选择器。格式化参照 [`DateHelper`](./date.js.html)
	 *
	 */

	/**
	 * @require [core](./core.js.html)
	 * @require [Lite](./lite.js.html)
	 * @require [detect](./detect.js.html)
	 * @require [Popup](./popup.js.html)
	 * @require [DateHelper](./date.js.html)
	 */
	var core = __webpack_require__(9),
	    $ = __webpack_require__(7),
	    os = __webpack_require__(10),
	    Popup = __webpack_require__(24),
	    template = __webpack_require__(26);

	__webpack_require__(11)

	var HEIGHT_UNIT = 54,
	    DURATION = 200,
	    COLUMN_SELECTOR = '.kub-datepicker-column',
	    POPUP_CLASS_NAME = 'kub-datepicker-popup',
	    DIALOG_BUTTON_SELECTOR = '.J_dialogButton',
	    COLUMN_ITEM_SELECTOR = 'li',
	    COLUMN_CONTAINER_SELECTOR = 'ul'

	var $document = $(document),
	    isTouch = os.mobile

	var START_EVENT = isTouch ? 'touchstart' : 'mousedown',
	    MOVE_EVENT = isTouch ? 'touchmove' : 'mousemove',
	    END_EVENT = isTouch ? 'touchend' : 'mouseup',
	    EVENT_NAME = 'click'

	//渲染对话框
	var render = function(datepicker) {

	    var options = datepicker.options,
	        html = template(options)

	    var popup = datepicker.$element[0].popup = new Popup({
	        title: options.title,
	        message: html,
	        className: options.className || '' + ' ' + POPUP_CLASS_NAME,
	        closeHandler:function(){
	            this.hide()
	            return false
	        }
	    })

	    var handlers = [
	        function(e) {
	            var cancel = options.cancel
	            cancel ? cancel.call(this, e, datepicker) : popup.hide()
	        },
	        function(e) {
	            var confirm = options.confirm,
	                formatDate = datepicker.getDate().format(options.format)

	            confirm ? confirm.call(this, e, datepicker, formatDate) : function() {
	                datepicker.$element[0].value = formatDate
	                popup.hide()
	            }()
	        }
	    ]

	    //注册按钮事件
	    popup.$element.find(DIALOG_BUTTON_SELECTOR).on(EVENT_NAME, function(e) {
	        var index = parseInt($(this).attr('data-index')),
	            handler = handlers[index]

	        handler && handler.call(this, e, popup)
	    })
	}

	/**
	 * ## DatePicker Constructor
	 *
	 * `DatePicker` 构造函数。
	 *
	 * 使用：
	 * ```js
	 *  //采用默认的format yyyy-MM-dd
	 *  var datepicker = new Kub.DatePicker($('#J_datepicker'))
	 *
	 *  //采用默认的format yyyy-MM-dd
	 *  //可配置title 与 本地化
	 *  var datepicker1 = new Kub.DatePicker($('#J_datepicker1'),{
	 *      title:'Date Picker',
	 *      locale:'en'
	 *  })
	 *
	 *  //自定义format
	 *  var datepicker2 = new Kub.DatePicker($('#J_datepicker2'),{
	 *      title:'选择时间',
	 *      format:'yyyy-MM-dd,HH:mm:ss',
	 *      confirm:function(e,datepicker,formatDate){
	 *          //格式化后的 formatDate
	 *          //手动关闭选择器
	 *          datepicker.hide()
	 *      }
	 *  })
	 * ```
	 */

	var _prototype

	//获取触摸点
	var getCoords = function(event) {
	    var touches = event.touches,
	        data = touches && touches.length ? touches : event.changedTouches

	    return {
	        x: isTouch ? data[0].pageX : event.pageX,
	        y: isTouch ? data[0].pageY : event.pageY
	    }
	}

	//获取偏移
	var getDistance = function(event, startCoords) {
	    var coords = getCoords(event),
	        x = coords.x - startCoords.x,
	        y = coords.y - startCoords.y

	    return {
	        distanceX: x,
	        distanceY: y
	    }
	}

	var returnFalse = function() {
	    return false
	}

	//获取当月最大天数
	var getDays = function(year, month) {
	    return new Date(year, month + 1, 0).getDate()
	}

	//根据偏移量算出索引值
	var getIndexByDistance = function(y, max) {
	    //去掉空白的两行
	    max = max - 5
	    y = y > 0 ? 0 : y
	    var index = Math.round(Math.abs(y) / HEIGHT_UNIT)
	    return index > max ? max : index
	}

	//设置偏移速度
	var setDuration = function($this, duration) {
	    var $container = $this[0].$container,
	        transition = 'transform ' + duration + 'ms ease-out',
	        webkiTransition = '-webkit-transform ' + duration + 'ms ease-out'

	    $container.css({
	        '-webkit-transition': duration != null ? webkiTransition : duration,
	        'transition': duration != null ? transition : duration
	    })
	}

	//设置偏移速度
	var setTranslate = function($this, x, y) {
	    var $container = $this[0].$container,
	        t

	    core.isNumber(x) && (x += 'px')
	    core.isNumber(y) && (y += 'px')

	    t = 'translate3d(' + x + ',' + y + ',0)'

	    !$container && ($container = $this[0].$container = $this.find(COLUMN_CONTAINER_SELECTOR))

	    $container.css({
	        '-webkit-transform': t,
	        'transform': t
	    })
	}


	//设置时间选择器中某一列的值，可设置年、月、日、时、分、秒的值
	var setValue = function(datepicker, name, value) {
	    var $this = datepicker._ui[name],
	        index, $item

	    if ($this && ($item = $this.find(COLUMN_ITEM_SELECTOR + '[data-value="' + value + '"]')).length) {
	        index = parseInt($item.attr('data-index'))

	        $this[0].index = index

	        setTranslate($this, 0, -index * HEIGHT_UNIT)
	    }

	}

	//获取时间选择器中某一列的值，可获取年、月、日、时、分、秒的值
	var getValue = function(datepicker, name) {
	    var $this = datepicker._ui[name],
	        $items, index, value

	    if ($this) {
	        $items = $this.find(COLUMN_ITEM_SELECTOR)
	        index = $this[0].index+2
	        value = parseInt($items.eq(index).attr('data-value'))
	    }

	    return value ? value : 0
	}

	//移除不需要的列
	var removeColumns = function(format, ui) {
	    format.indexOf('y') === -1 && (ui.year.remove(), ui.year = null)
	    format.indexOf('M') === -1 && (ui.month.remove(), ui.month = null)
	    format.indexOf('d') === -1 && (ui.day.remove(), ui.day = null)
	    format.indexOf('H') === -1 && (ui.hour.remove(), ui.hour = null)
	    format.indexOf('m') === -1 && (ui.minute.remove(), ui.minute = null)
	    format.indexOf('s') === -1 && (ui.second.remove(), ui.second = null)
	}



	//重置每月最大天数
	var setActualDays = function(datepicker, year, month) {
	    var days = getDays(year, month),
	        day = getValue(datepicker, 'day')

	    days < day && setValue(datepicker, 'day', days)
	}

	//绑定输入框聚焦事件
	var bindInputFocusEvent = function(datepicker) {
	    datepicker.$element.on(EVENT_NAME, function(event) {
	        //使输入框失去焦点
	        datepicker.$element[0].blur()

	        datepicker.show()

	        event.preventDefault()
	    })
	}

	//绑定事件
	var bindEvents = function(datepicker) {
	    var flag = false,
	        $activeElement,
	        $element = datepicker.$element[0].popup.$element

	    var start = function(event) {
	            flag = true
	            event = event.originalEvent || event

	            this.startCoords = getCoords(event)

	            $activeElement = $(this)

	            setDuration($activeElement, null)
	        },
	        move = function(event) {
	            if (!flag) return
	            event = event.originalEvent || event

	            var distance = getDistance(event, $activeElement[0].startCoords)

	            setTranslate($activeElement, 0, distance.distanceY - HEIGHT_UNIT * $activeElement[0].index)

	            event.preventDefault()
	        },
	        end = function(event) {
	            if (!flag) return
	            flag = false
	            event = event.originalEvent || event

	            var distance = getDistance(event, $activeElement[0].startCoords),
	                max = $activeElement.find(COLUMN_ITEM_SELECTOR).length,
	                index = getIndexByDistance(distance.distanceY - HEIGHT_UNIT * $activeElement[0].index, max)

	            $activeElement[0].index = Math.abs(index)

	            //验证是否存在31,30,29天
	            setActualDays(datepicker, getValue(datepicker, 'year'), getValue(datepicker, 'month'))

	            setDuration($activeElement, DURATION)

	            setTranslate($activeElement, 0, -HEIGHT_UNIT * $activeElement[0].index)
	        }

	    datepicker._ui.columns.each(function() {

	        $(this).on(START_EVENT, function() {
	            start.apply(this, arguments)
	        })

	        this.onselectstart = returnFalse
	        this.ondragstart = returnFalse
	    })

	    $element.on(MOVE_EVENT, move)
	    $element.on(END_EVENT, end)

	    bindInputFocusEvent(datepicker)
	}

	function init(datepicker) {
	    var options = datepicker.options,
	        $element,
	        ui

	    //创建对话框
	    render(datepicker)

	    $element = datepicker.$element[0].popup.$element

	    //缓存dom
	    ui = datepicker._ui = {
	        year: $element.find('.year'),
	        month: $element.find('.month'),
	        day: $element.find('.day'),
	        hour: $element.find('.hour'),
	        minute: $element.find('.minute'),
	        second: $element.find('.second')
	    }
	    ui.columns = $element.find(COLUMN_SELECTOR)

	    //设置块高度
	    HEIGHT_UNIT = ui.columns.find(COLUMN_ITEM_SELECTOR)[0].offsetHeight || HEIGHT_UNIT

	    //隐藏对话框
	    datepicker.hide()

	    //移除
	    removeColumns(options.format, ui)

	    //设置本地化
	    $element.addClass('kub-datepicker-' + options.locale)

	    //设置默认时间
	    datepicker.setDate(options.date)

	    //绑定事件
	    bindEvents(datepicker)
	}

	function DatePicker(element, options) {
	    this.$element = $(element)
	    this.options = core.extend({}, _prototype.defaults, options || {})

	    init(this)
	}

	_prototype = DatePicker.prototype

	/**
	 * ## DatePicker.prototype.defaults
	 *
	 * 默认配置项
	 *
	 * 配置项说明：
	 *
	 * * `locale`: `String` 本地化。本地化采用CSS实现。
	 *
	 * * `title`: `String` 时间选择器弹窗名称。
	 *
	 * * `confirmText`: `String` 确认按钮名称。
	 *
	 * * `confirm`: `Function` 单击确认按钮时触发的事件。
	 *
	 * > 如果未传递，单击时会默认关闭弹窗，并对输入框赋值。
	 * >
	 * > 如果传递，需调用`datepicker.close()`手动关闭弹窗，并且需要对输入框赋值。
	 *
	 * * `cancelText`: `String` 取消按钮名称。
	 *
	 * * `cancel`: `Function` 单击取消按钮时触发的事件。
	 *
	 * > 如果未传递，单击时会默认关闭弹窗。
	 * >
	 * > 如果传递，需调用`datepicker.close()`关闭弹窗。
	 *
	 * * `format`: `String` 日期格式。
	 *
	 * * `className`: `String` 弹窗类名，修改时需加上`kub-datepicker-popup`默认类名。
	 *
	 * * `date`: `Date` 默认显示时间。
	 *
	 * * `yearRange`: `Array` 年份显示区间。
	 */
	_prototype.defaults = {
	    locale: 'zh',
	    title: '',
	    confirmText: '确定',
	    confirm: null,
	    cancelText: '取消',
	    cancel: null,
	    format: 'yyyy-MM-dd',
	    className: '',
	    date: new Date(),
	    yearRange: [1970, 2050]
	}

	/**
	 * ## DatePicker.prototype.setDate
	 *
	 * 设置时间选择器时间。
	 *
	 * @param {Date} date 时间
	 * @return {instance} 当前实例
	 */
	_prototype.setDate = function(date) {
	    var self = this,
	        year = date.getFullYear(),
	        month = date.getMonth()

	    setValue(self, 'year', year)

	    setValue(self, 'month', month)

	    setValue(self, 'day', date.getDate())

	    setValue(self, 'hour', date.getHours())

	    setValue(self, 'minute', date.getMinutes())

	    setValue(self, 'second', date.getSeconds())

	    return self
	}

	/**
	 * ## DatePicker.prototype.getDate
	 *
	 * 获取时间选择器选择的时间。
	 *
	 * @return {Date} 获取到的时间
	 */
	_prototype.getDate = function() {
	    var values = {
	        year: getValue(this, 'year'),
	        month: getValue(this, 'month'),
	        day: getValue(this, 'day'),
	        hour: getValue(this, 'hour'),
	        minute: getValue(this, 'minute'),
	        second: getValue(this, 'second')
	    }
	    return new Date(values.year, values.month, values.day, values.hour, values.minute, values.second)
	}

	/**
	 * ## DatePicker.prototype.close
	 *
	 * 关闭时间选择器。
	 *
	 * @return {instance} 当前实例
	 */
	_prototype.close = function() {
	    this.$element[0].popup.close()
	    return this
	}

	/**
	 * ## DatePicker.prototype.show
	 *
	 * 显示时间选择器。
	 *
	 * @return {instance} 当前实例
	 */
	_prototype.show = function() {
	    this.$element[0].popup.show()
	    return this
	}

	/**
	 * ## DatePicker.prototype.hide
	 *
	 * 隐藏时间选择器。
	 *
	 * @return {instance} 当前实例
	 */
	_prototype.hide = function() {
	    this.$element[0].popup.hide()
	    return this
	}

	module.exports = DatePicker


/***/ }),
/* 24 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Popup
	 *
	 * 对话框.
	 */

	/**
	 * @require [core](./core.js.html)
	 * @require [Lite](./lite.js.html)
	 */
	var core = __webpack_require__(9),
	    $ = __webpack_require__(7),
	    template = __webpack_require__(25)

	/**
	 * ## Popup Constructor
	 *
	 * Popup 构造函数。
	 *
	 * 使用：
	 * ```js
	 *   var popup = new Kub.Popup({
	 *       message:'popup dialog'
	 *   })
	 * ```
	 */
	function Popup(options) {
	    this.options = core.extend({}, _prototype.defaults, options || {})
	    init(this)
	}

	var ANIMATION_CLASS = 'kub-popup-animation',
	    EVENT_NAME = 'click',
	    POPUP_SELECTOR = '.J_popup'

	var $body

	var _prototype = Popup.prototype

	var render = function(popup,data) {
	    var html = template(data)

	    popup.$element = $(html).appendTo($body)
	    return this
	}

	var bindEvents = function(popup){
	    popup.$element.on(EVENT_NAME, function(e) {
	        if($(e.target).closest(POPUP_SELECTOR).length){
	            return
	        }
	        popup.close()
	    })
	}

	var init = function(popup) {
	    !$body && ($body = $(document.body))

	    //渲染数据
	    render(popup, popup.options)

	    bindEvents(popup)

	    popup.show()
	}

	/**
	 * ## Popup.prototype.defaults
	 *
	 * 默认配置项。
	 *
	 * 配置项说明：
	 *
	 * * `message` : `String` 弹窗内容。
	 *
	 * * `className` : `String` 弹窗类名。
	 *
	 */
	_prototype.defaults = {
	    message: '',
	    className: '',
	    duration:350
	}

	/**
	 * ## Popup.prototype.show
	 *
	 * 显示弹窗。
	 * @return {instance} 返回当前实例
	 */
	_prototype.show = function() {

	    clearTimeout(this._timer)
	    this.$element.show().addClass(ANIMATION_CLASS)

	    return this
	}

	/**
	 * ## Popup.prototype.hide
	 *
	 * 隐藏弹窗。
	 * @return {instance} 返回当前实例
	 */
	_prototype.hide = function(callback) {
	    var self = this,
	        $element = self.$element

	    function handler(){
	        $element.hide()
	        callback && callback()
	    }

	    $element.removeClass(ANIMATION_CLASS)

	    clearTimeout(self._timer)
	    self._timer = setTimeout(function(){
	        handler()
	    },self.options.duration)

	    return self
	}

	/**
	 * ## Popup.prototype.close
	 *
	 * 关闭弹窗。
	 * @return {instance} 返回当前实例
	 */
	_prototype.close = function() {
	    var self = this,
	        opts = self.options

	    if (opts.closeHandler && opts.closeHandler.call(self) === false) {
	        return self
	    }

	    self.hide(function(){
	        self.$element.remove()
	    })

	    return self
	}

	module.exports = Popup


/***/ }),
/* 25 */
/***/ (function(module, exports) {

	module.exports = function(data){
	var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
	__p+='<div class="kub-dialog-modal kub-popup-modal '+
	((__t=( data.className))==null?'':__t)+
	'"><div class="kub-popup J_popup"> '+
	((__t=( data.message))==null?'':__t)+
	' </div></div>';
	return __p;
	};

/***/ }),
/* 26 */
/***/ (function(module, exports) {

	module.exports = function(data){
	var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
	__p+='<div class="kub-datepicker-header"><button class="kub-datepicker-button J_dialogButton" data-index="0"> '+
	((__t=( data.cancelText))==null?'':__t)+
	' </button><div class="kub-datepicker-header-text">'+
	((__t=( data.title))==null?'':__t)+
	'</div><button class="kub-datepicker-button J_dialogButton" data-index="1"> '+
	((__t=( data.confirmText))==null?'':__t)+
	' </button></div><div class="kub-datepicker"><div class="kub-datepicker-column year" data-type="year"><ul><li></li><li></li> ';
	for(var i=data.yearRange[0],j=0;i<=data.yearRange[1];i++,j++){
	__p+=' <li data-value="'+
	((__t=( i))==null?'':__t)+
	'" data-index="'+
	((__t=( j))==null?'':__t)+
	'"> '+
	((__t=( i ))==null?'':__t)+
	' </li> ';
	}
	__p+=' <li></li><li></li></ul></div><div class="kub-datepicker-column month" data-type="month"><ul><li></li><li></li> ';
	for(var i=1 ;i<= 12; i++){
	__p+=' <li data-value="'+
	((__t=( i-1))==null?'':__t)+
	'" data-index="'+
	((__t=( i-1))==null?'':__t)+
	'"> '+
	((__t=( ( i < 10 ? ( "0" + i) : i)))==null?'':__t)+
	' </li> ';
	}
	__p+=' <li></li><li></li></ul></div><div class="kub-datepicker-column day" data-type="day"><ul><li></li><li></li> ';
	for(var i=1 ;i<=31;i++){
	__p+=' <li data-value="'+
	((__t=( i))==null?'':__t)+
	'" data-index="'+
	((__t=( i-1))==null?'':__t)+
	'"> '+
	((__t=(( i < 10 ? ( "0" + i) : i)))==null?'':__t)+
	' </li> ';
	}
	__p+=' <li></li><li></li></ul></div><div class="kub-datepicker-column hour" data-type="hour"><ul><li></li><li></li> ';
	for(var i=0 ;i<=23;i++){
	__p+=' <li data-value="'+
	((__t=( i))==null?'':__t)+
	'" data-index="'+
	((__t=( i))==null?'':__t)+
	'"> '+
	((__t=(( i < 10 ? ( "0" + i) : i)))==null?'':__t)+
	' </li> ';
	}
	__p+=' <li></li><li></li></ul></div><div class="kub-datepicker-column minute" data-type="minute"><ul><li></li><li></li> ';
	for(var i=0 ;i<=59;i++){
	__p+=' <li data-value="'+
	((__t=( i))==null?'':__t)+
	'" data-index="'+
	((__t=( i))==null?'':__t)+
	'"> '+
	((__t=( ( i < 10 ? ( "0" + i) : i)))==null?'':__t)+
	' </li> ';
	}
	__p+=' <li></li><li></li></ul></div><div class="kub-datepicker-column second" data-type="second"><ul><li></li><li></li> ';
	for(var i=0 ;i<=59;i++){
	__p+=' <li data-value="'+
	((__t=( i))==null?'':__t)+
	'" data-index="'+
	((__t=( i))==null?'':__t)+
	'"> '+
	((__t=( ( i < 10 ? ( "0" + i) : i)))==null?'':__t)+
	' </li> ';
	}
	__p+=' <li></li><li></li></ul></div><div class="kub-datepicker-overlay"></div></div>';
	return __p;
	};

/***/ }),
/* 27 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * # Touch
	 *
	 * 移动端事件组件。
	 *
	 * 支持的事件包含：
	 *
	 * `tap` `longtap`
	 *
	 * `panstart` `panmove` `panup` `pandown` `panleft` `panright` `panend`
	 *
	 * `swipeleft` `swiperight` `swipeup` `swipedown`
	 *
	 */

	/**
	 * @require [polyfill](./polyfill.js.html)
	 */

	__webpack_require__(8)

	var MOBILE_REGEXP = /mobile|tablet|ip(ad|hone|od)|android/i

	var _window = window,
	    isTouch = 'ontouchstart' in _window && MOBILE_REGEXP.test(navigator.userAgent)

	var EVENTS_METHODS = [
	    'preventDefault',
	    'stopImmediatePropagation',
	    'stopPropagation'
	]

	var SWIPE_THRESHOLD = 10,
	    SWIPE_VELOCITY = 0.25,
	    SWIPE_MAX_MOVEMENT = 6,

	    TAP_TIMEOUT = 200,
	    TAP_THRESHOLD = 9,

	    LONGTAP_TIMEOUT = 500,

	    START_EVENT = isTouch ? 'touchstart' : 'mousedown',
	    MOVE_EVENT = isTouch ? 'touchmove' : 'mousemove',
	    END_EVENT = isTouch ? 'touchend' : 'mouseup',

	    DIRECTION_ANGLE = 25,
	    DIRECTIONS = ['up', 'right', 'down', 'left'],
	    SWIPE_EVENT = 'swipe',

	    PAN_EVENT = 'pan',
	    PAN_START_EVENT = 'panstart',
	    PAN_MOVE_EVENT = 'panmove',
	    PAN_END_EVENT = 'panend',

	    TAP_EVENT = 'tap',

	    LONGTAP_EVENT = 'longtap'

	// 获取位移量
	var distance = function(p1, p2) {
	    return Math.round(Math.sqrt(Math.pow((p1.x - p2.x), 2) + Math.pow((p1.y - p2.y), 2)))
	}

	// 获取角度，通过获取角度从而获取方向
	var angle = function(p1, p2) {
	    var d = Math.abs(p2.x - p1.x)
	    return Math.round(Math.acos(d / Math.sqrt(Math.pow(d, 2) + Math.pow(p2.y - p1.y, 2))) * 57.3)
	}

	// 获取方向
	var direction = function(p1, p2) {
	    return (angle(p1, p2) > DIRECTION_ANGLE) ? ((p1.y < p2.y) ? 2 : 0) : ((p1.x < p2.x) ? 1 : 3)
	}

	// 如果触摸点位移大于 SWIPE_THRESHOLD 而且速度大于 SWIPE_VELOCITY
	var matchSwipe = function(threshold, interval) {
	    return threshold != null && threshold > SWIPE_THRESHOLD && threshold / interval > SWIPE_VELOCITY
	}

	// 如果触摸点位置大于 TAP_THRESHOLD 而且间隔时间小于 TAP_TIMEOUT
	var matchTap = function(threshold, interval) {
	    return threshold != null && threshold < TAP_THRESHOLD && interval < TAP_TIMEOUT
	}

	// 获取触摸点数据
	var getCoords = function(event) {
	    var touches = event.touches,
	        data = touches && touches.length ? touches : event.changedTouches
	    return {
	        x: isTouch ? data[0].clientX : event.clientX,
	        y: isTouch ? data[0].clientY : event.clientY,
	        e: isTouch ? data[0].target : event.target
	    }
	}

	// 获取事件位置数据
	var getEventDetail = function(coords) {
	    return {
	        x: coords.x,
	        y: coords.y
	    }
	}

	// 获取偏移值与时间间隔
	var getThresholdAndInterval = function(p1,p2){
	    return {
	        threshold : p1 && p2 && distance(p1, p2),
	        interval  : p1 && p2 && (p2.t.getTime() - p1.t.getTime())
	    }
	}

	// 触发事件
	var trigger = function(element, type, originalEvent, detail) {
	    var event = new _window.CustomEvent(type, {
	        detail: detail,
	        bubbles: true,
	        cancelable: true
	    })

	    // 存储原事件对象
	    event.originalEvent = originalEvent

	    EVENTS_METHODS.forEach(function(name){
	        event[name] = function(){
	            originalEvent[name].apply(originalEvent,arguments)
	        }
	    })

	    element && element.dispatchEvent && element.dispatchEvent(event)
	}

	var on = function(element, type, handler) {
	    element.addEventListener(type, handler, false)
	}

	var clearTime = function(timer) {
	    timer && clearTimeout(timer)
	    timer = null
	}

	var findMatchedDirection = function(actions){
	    var index = 0, max = actions[index]

	    actions.forEach(function(value,i){
	        value > max && (max = value, index = i)
	    })

	    return index
	}

	/**
	 * ## Touch Constructor
	 *
	 * `Touch`类。
	 *
	 * 使用方法：
	 * ```js
	 *
	 * new Kub.Touch(element)
	 *
	 * // swipeleft 事件，支持事件代理
	 * element.addEventListener('swipeleft','div',function(){
	 *     //do something
	 * })
	 *
	 * // tap 事件
	 * element.addEventListener('tap',function(){
	 *     //do something
	 * })
	 *
	 * ```
	 */
	function Touch(element) {
	    var moveFlag = false,
	        target,
	        p1,
	        p2,
	        longTapTimer,
	        cancelTap = false,
	        actions,
	        actionsLength

	    on(element, START_EVENT, function(event) {
	        var coords = getCoords(event)
	        p1 = coords
	        p1.t = new Date()
	        p2 = p1

	        actions = [0,0,0,0]
	        actionsLength = 0

	        cancelTap = false

	        target = coords.e

	        //触发 longtap 事件
	        isTouch && (longTapTimer = setTimeout(function() {
	            trigger(target, LONGTAP_EVENT, event)
	        }, LONGTAP_TIMEOUT))

	    })

	    on(element, MOVE_EVENT, function(event) {
	        if(!target){
	            return
	        }

	        var coords = getCoords(event),
	            detail = getEventDetail(coords),
	            thresholdAndInterval,
	            direct

	        p2 = coords
	        p2.t = new Date()

	        thresholdAndInterval = getThresholdAndInterval(p1,p2)

	        // 如果触摸点不符合 longtap 触发条件，则取消长按事件
	        if(!cancelTap && !matchTap(thresholdAndInterval.threshold, thresholdAndInterval.interval)){
	            clearTime(longTapTimer)
	            cancelTap = true
	        }

	        //触发 panstart 事件
	        !moveFlag && trigger(target, PAN_START_EVENT, event, detail)

	        direct = direction(p1, p2)

	        // 取出前SWIPE_MAX_MOVEMENT移动记录
	        actionsLength < SWIPE_MAX_MOVEMENT && (actions[direct] += 1, actionsLength += 1)

	        //触发 pan['up', 'right', 'down', 'left'] 事件
	        trigger(target, PAN_EVENT + DIRECTIONS[direct], event, detail)

	        //触发 panmove 事件
	        trigger(target, PAN_MOVE_EVENT, event, detail)

	        moveFlag = true
	    })

	    on(element, END_EVENT, function(event) {
	        // 取消 longtap 事件定时器
	        clearTime(longTapTimer)

	        var coords = getCoords(event), thresholdAndInterval

	        p2 = coords
	        p2.t = new Date()

	        thresholdAndInterval = getThresholdAndInterval(p1,p2)

	        // 如果达到 swipe 事件条件
	        if (matchSwipe(thresholdAndInterval.threshold, thresholdAndInterval.interval)) {

	            //触发 swipe['up', 'right', 'down', 'left'] 事件
	            trigger(target, SWIPE_EVENT + DIRECTIONS[findMatchedDirection(actions)], event)
	        } else if (!cancelTap && isTouch && matchTap(thresholdAndInterval.threshold, thresholdAndInterval.interval)) {

	            // 触发 tap 事件
	            trigger(target, TAP_EVENT, event)
	        }

	        // 触发 panend 事件
	        target && moveFlag && trigger(target, PAN_END_EVENT, event, getEventDetail(coords))

	        target = null
	        moveFlag = false
	    })
	}

	module.exports = Touch


/***/ })
/******/ ]);<file_sep>module.exports = function(data){
var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
__p+='<div class="kub-dialog-modal '+
((__t=( data.className))==null?'':__t)+
' ';
if( data.modal ){
__p+=' kub-modal ';
}
__p+='"><div class="kub-dialog-wrapper"><div class="kub-dialog-container"><div class="kub-dialog J_dialog"> ';
if(data.showHeader){
__p+=' <div class="kub-dialog-header"> '+
((__t=( data.title))==null?'':__t)+
' </div> ';
}
__p+=' <div class="kub-dialog-body"> '+
((__t=( data.message))==null?'':__t)+
' </div> ';
if(data.buttons && data.buttons.length){
__p+=' <div class="kub-dialog-footer"> ';
 for (var i=0,j=data.buttons.length;i<j;i++){
__p+=' <button class="kub-dialog-button J_dialogButton '+
((__t=( data.buttons[i].className || ''))==null?'':__t)+
'" data-index="'+
((__t=( i))==null?'':__t)+
'"> '+
((__t=( data.buttons[i].text))==null?'':__t)+
' </button> ';
}
__p+=' </div> ';
}
__p+=' </div></div></div></div>';
return __p;
};<file_sep>/**
 * # cookie
 *
 * 操作cookie方法，`expires` 如果为数字，单位为`毫秒`。
 *
 * 使用方法：
 * ```js
 * //取值
 * var name = Kub.cookie('name')
 *
 * //设置值
 * Kub.cookie('name','kub')
 *
 * //配置cookie相关属性
 * Kub.cookie('name','kub',{
 *     domain:'.a.com'
 *
 * })
 * ```
 *
 */
var _document = document,
    _encodeURIComponent = encodeURIComponent

function cookie(key, value, options) {
    var days, time, result, decode

    options = options || {}

    if(!options.hasOwnProperty('path')){
        options.path = '/'
    }

    // A key and value were given. Set cookie.
    if (arguments.length > 1 && String(value) !== "[object Object]") {
        // Enforce object

        if (value === null || value === undefined) options.expires = -1

        if (typeof options.expires === 'number') {
            days = options.expires
            time = options.expires = new Date()

            time.setTime(time.getTime() + days)
        }

        value = String(value)

        return (_document.cookie = [
            _encodeURIComponent(key), '=',
            options.raw ? value : _encodeURIComponent(value),
            options.expires ? '; expires=' + options.expires.toUTCString() : '',
            options.path ? '; path=' + options.path : '',
            options.domain ? '; domain=' + options.domain : '',
            options.secure ? '; secure' : ''
        ].join(''))
    }

    // Key and possibly options given, get cookie
    options = value || {}

    decode = options.raw ? function (s) { return s } : decodeURIComponent

    return (result = new RegExp('(?:^|; )' + _encodeURIComponent(key) + '=([^;]*)').exec(_document.cookie)) ? decode(result[1]) : null
}

module.exports = cookie
