{"version":3,"file":"/m/all/js/libs/sm.js.map","sources":["/m/all/js/libs/sm.js"],"sourcesContent":["/*!\n * =====================================================\n * SUI Mobile - http://m.sui.taobao.org/\n *\n * =====================================================\n */\n;$.smVersion = \"0.6.2\";+function ($) {\n \"use strict\";\n\n //全局配置\n var defaults = {\n autoInit: false, //自动初始化页面\n showPageLoadingIndicator: true, //push.js加载页面的时候显示一个加载提示\n router: true, //默认使用router\n swipePanel: \"left\", //滑动打开侧栏\n swipePanelOnlyClose: true //只允许滑动关闭,不允许滑动打开侧栏\n };\n\n $.smConfig = $.extend(defaults, $.config);\n\n}(Zepto);\n\n+ function($) {\n \"use strict\";\n\n //比较一个字符串版本号\n //a > b === 1\n //a = b === 0\n //a < b === -1\n $.compareVersion = function(a, b) {\n var as = a.split('.');\n var bs = b.split('.');\n if (a === b) return 0;\n\n for (var i = 0; i < as.length; i++) {\n var x = parseInt(as[i]);\n if (!bs[i]) return 1;\n var y = parseInt(bs[i]);\n if (x < y) return -1;\n if (x > y) return 1;\n }\n return -1;\n };\n\n $.getCurrentPage = function() {\n return $(\".page-current\")[0] || $(\".page\")[0] || document.body;\n };\n\n}(Zepto);\n\n/* global WebKitCSSMatrix:true */\n\n(function($) {\n \"use strict\";\n ['width', 'height'].forEach(function(dimension) {\n var Dimension = dimension.replace(/./, function(m) {\n return m[0].toUpperCase();\n });\n $.fn['outer' + Dimension] = function(margin) {\n var elem = this;\n if (elem) {\n var size = elem[dimension]();\n var sides = {\n 'width': ['left', 'right'],\n 'height': ['top', 'bottom']\n };\n sides[dimension].forEach(function(side) {\n if (margin) size += parseInt(elem.css('margin-' + side), 10);\n });\n return size;\n } else {\n return null;\n }\n };\n });\n\n //support\n $.support = (function() {\n var support = {\n touch: !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch)\n };\n return support;\n })();\n\n $.touchEvents = {\n start: $.support.touch ? 'touchstart' : 'mousedown',\n move: $.support.touch ? 'touchmove' : 'mousemove',\n end: $.support.touch ? 'touchend' : 'mouseup'\n };\n\n $.getTranslate = function (el, axis) {\n var matrix, curTransform, curStyle, transformMatrix;\n\n // automatic axis detection\n if (typeof axis === 'undefined') {\n axis = 'x';\n }\n\n curStyle = window.getComputedStyle(el, null);\n if (window.WebKitCSSMatrix) {\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new WebKitCSSMatrix(curStyle.webkitTransform === 'none' ? '' : curStyle.webkitTransform);\n }\n else {\n transformMatrix = curStyle.MozTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n\n if (axis === 'x') {\n //Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix)\n curTransform = transformMatrix.m41;\n //Crazy IE10 Matrix\n else if (matrix.length === 16)\n curTransform = parseFloat(matrix[12]);\n //Normal Browsers\n else\n curTransform = parseFloat(matrix[4]);\n }\n if (axis === 'y') {\n //Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix)\n curTransform = transformMatrix.m42;\n //Crazy IE10 Matrix\n else if (matrix.length === 16)\n curTransform = parseFloat(matrix[13]);\n //Normal Browsers\n else\n curTransform = parseFloat(matrix[5]);\n }\n\n return curTransform || 0;\n };\n /* jshint ignore:start */\n $.requestAnimationFrame = function (callback) {\n if (requestAnimationFrame) return requestAnimationFrame(callback);\n else if (webkitRequestAnimationFrame) return webkitRequestAnimationFrame(callback);\n else if (mozRequestAnimationFrame) return mozRequestAnimationFrame(callback);\n else {\n return setTimeout(callback, 1000 / 60);\n }\n };\n $.cancelAnimationFrame = function (id) {\n if (cancelAnimationFrame) return cancelAnimationFrame(id);\n else if (webkitCancelAnimationFrame) return webkitCancelAnimationFrame(id);\n else if (mozCancelAnimationFrame) return mozCancelAnimationFrame(id);\n else {\n return clearTimeout(id);\n }\n };\n /* jshint ignore:end */\n\n $.fn.dataset = function() {\n var dataset = {},\n ds = this[0].dataset;\n for (var key in ds) { // jshint ignore:line\n var item = (dataset[key] = ds[key]);\n if (item === 'false') dataset[key] = false;\n else if (item === 'true') dataset[key] = true;\n else if (parseFloat(item) === item * 1) dataset[key] = item * 1;\n }\n // mixin dataset and __eleData\n return $.extend({}, dataset, this[0].__eleData);\n };\n $.fn.data = function(key, value) {\n var tmpData = $(this).dataset();\n if (!key) {\n return tmpData;\n }\n // value may be 0, false, null\n if (typeof value === 'undefined') {\n // Get value\n var dataVal = tmpData[key],\n __eD = this[0].__eleData;\n\n //if (dataVal !== undefined) {\n if (__eD && (key in __eD)) {\n return __eD[key];\n } else {\n return dataVal;\n }\n\n } else {\n // Set value,uniformly set in extra ```__eleData```\n for (var i = 0; i < this.length; i++) {\n var el = this[i];\n // delete multiple data in dataset\n if (key in tmpData) { if (el.dataset[key]) { delete el.dataset[key]; } }\n if (!el.__eleData) el.__eleData = {};\n el.__eleData[key] = value;\n }\n return this;\n }\n };\n function __dealCssEvent(eventNameArr, callback) {\n var events = eventNameArr,\n i, dom = this;// jshint ignore:line\n\n function fireCallBack(e) {\n /*jshint validthis:true */\n if (e.target !== this) return;\n callback.call(this, e);\n for (i = 0; i < events.length; i++) {\n dom.off(events[i], fireCallBack);\n }\n }\n if (callback) {\n for (i = 0; i < events.length; i++) {\n dom.on(events[i], fireCallBack);\n }\n }\n }\n $.fn.animationEnd = function(callback) {\n __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\n return this;\n };\n $.fn.transitionEnd = function(callback) {\n __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\n return this;\n };\n $.fn.transition = function(duration) {\n if (typeof duration !== 'string') {\n duration = duration + 'ms';\n }\n for (var i = 0; i < this.length; i++) {\n var elStyle = this[i].style;\n elStyle.webkitTransitionDuration = elStyle.MozTransitionDuration = elStyle.transitionDuration = duration;\n }\n return this;\n };\n $.fn.transform = function(transform) {\n for (var i = 0; i < this.length; i++) {\n var elStyle = this[i].style;\n elStyle.webkitTransform = elStyle.MozTransform = elStyle.transform = transform;\n }\n return this;\n };\n $.fn.prevAll = function (selector) {\n var prevEls = [];\n var el = this[0];\n if (!el) return $([]);\n while (el.previousElementSibling) {\n var prev = el.previousElementSibling;\n if (selector) {\n if($(prev).is(selector)) prevEls.push(prev);\n }\n else prevEls.push(prev);\n el = prev;\n }\n return $(prevEls);\n };\n $.fn.nextAll = function (selector) {\n var nextEls = [];\n var el = this[0];\n if (!el) return $([]);\n while (el.nextElementSibling) {\n var next = el.nextElementSibling;\n if (selector) {\n if($(next).is(selector)) nextEls.push(next);\n }\n else nextEls.push(next);\n el = next;\n }\n return $(nextEls);\n };\n\n //重置zepto的show方法,防止有些人引用的版本中 show 方法操作 opacity 属性影响动画执行\n $.fn.show = function(){\n var elementDisplay = {};\n function defaultDisplay(nodeName) {\n var element, display;\n if (!elementDisplay[nodeName]) {\n element = document.createElement(nodeName);\n document.body.appendChild(element);\n display = getComputedStyle(element, '').getPropertyValue(\"display\");\n element.parentNode.removeChild(element);\n display === \"none\" && (display = \"block\");\n elementDisplay[nodeName] = display;\n }\n return elementDisplay[nodeName];\n }\n\n return this.each(function(){\n this.style.display === \"none\" && (this.style.display = '');\n if (getComputedStyle(this, '').getPropertyValue(\"display\") === \"none\");\n this.style.display = defaultDisplay(this.nodeName);\n });\n };\n})(Zepto);\n\n/*===========================\n Device/OS Detection\n ===========================*/\n;(function ($) {\n \"use strict\";\n var device = {};\n var ua = navigator.userAgent;\n\n var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\n var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\n\n device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\n\n // Android\n if (android) {\n device.os = 'android';\n device.osVersion = android[2];\n device.android = true;\n device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n // iOS\n if (iphone && !ipod) {\n device.osVersion = iphone[2].replace(/_/g, '.');\n device.iphone = true;\n }\n if (ipad) {\n device.osVersion = ipad[2].replace(/_/g, '.');\n device.ipad = true;\n }\n if (ipod) {\n device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\n device.iphone = true;\n }\n // iOS 8+ changed UA\n if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\n if (device.osVersion.split('.')[0] === '10') {\n device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\n }\n }\n\n // Webview\n device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\n\n // Minimal UI\n if (device.os && device.os === 'ios') {\n var osVersionArr = device.osVersion.split('.');\n device.minimalUi = !device.webView &&\n (ipod || iphone) &&\n (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\n $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\n }\n\n // Check for status bar and fullscreen app mode\n var windowWidth = $(window).width();\n var windowHeight = $(window).height();\n device.statusBar = false;\n if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\n device.statusBar = true;\n }\n else {\n device.statusBar = false;\n }\n\n // Classes\n var classNames = [];\n\n // Pixel Ratio\n device.pixelRatio = window.devicePixelRatio || 1;\n classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\n if (device.pixelRatio >= 2) {\n classNames.push('retina');\n }\n\n // OS classes\n if (device.os) {\n classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\n if (device.os === 'ios') {\n var major = parseInt(device.osVersion.split('.')[0], 10);\n for (var i = major - 1; i >= 6; i--) {\n classNames.push('ios-gt-' + i);\n }\n }\n\n }\n // Status bar classes\n if (device.statusBar) {\n classNames.push('with-statusbar-overlay');\n }\n else {\n $('html').removeClass('with-statusbar-overlay');\n }\n\n // Add html classes\n if (classNames.length > 0) $('html').addClass(classNames.join(' '));\n\n // keng..\n device.isWeixin = /MicroMessenger/i.test(ua);\n\n $.device = device;\n})(Zepto);\n\n;(function () {\n 'use strict';\n\n /**\n * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.\n *\n * @codingstandard ftlabs-jsv2\n * @copyright The Financial Times Limited [All Rights Reserved]\n * @license MIT License (see LICENSE.txt)\n */\n\n /*jslint browser:true, node:true, elision:true*/\n /*global Event, Node*/\n\n\n /**\n * Instantiate fast-clicking listeners on the specified layer.\n *\n * @constructor\n * @param {Element} layer The layer to listen on\n * @param {Object} [options={}] The options to override the defaults\n */\n function FastClick(layer, options) {\n var oldOnClick;\n\n options = options || {};\n\n /**\n * Whether a click is currently being tracked.\n *\n * @type boolean\n */\n this.trackingClick = false;\n\n\n /**\n * Timestamp for when click tracking started.\n *\n * @type number\n */\n this.trackingClickStart = 0;\n\n\n /**\n * The element being tracked for a click.\n *\n * @type EventTarget\n */\n this.targetElement = null;\n\n\n /**\n * X-coordinate of touch start event.\n *\n * @type number\n */\n this.touchStartX = 0;\n\n\n /**\n * Y-coordinate of touch start event.\n *\n * @type number\n */\n this.touchStartY = 0;\n\n\n /**\n * ID of the last touch, retrieved from Touch.identifier.\n *\n * @type number\n */\n this.lastTouchIdentifier = 0;\n\n\n /**\n * Touchmove boundary, beyond which a click will be cancelled.\n *\n * @type number\n */\n this.touchBoundary = options.touchBoundary || 10;\n\n\n /**\n * The FastClick layer.\n *\n * @type Element\n */\n this.layer = layer;\n\n /**\n * The minimum time between tap(touchstart and touchend) events\n *\n * @type number\n */\n this.tapDelay = options.tapDelay || 200;\n\n /**\n * The maximum time for a tap\n *\n * @type number\n */\n this.tapTimeout = options.tapTimeout || 700;\n\n if (FastClick.notNeeded(layer)) {\n return;\n }\n\n // Some old versions of Android don't have Function.prototype.bind\n function bind(method, context) {\n return function() { return method.apply(context, arguments); };\n }\n\n\n var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];\n var context = this;\n for (var i = 0, l = methods.length; i < l; i++) {\n context[methods[i]] = bind(context[methods[i]], context);\n }\n\n // Set up event handlers as required\n if (deviceIsAndroid) {\n layer.addEventListener('mouseover', this.onMouse, true);\n layer.addEventListener('mousedown', this.onMouse, true);\n layer.addEventListener('mouseup', this.onMouse, true);\n }\n\n layer.addEventListener('click', this.onClick, true);\n layer.addEventListener('touchstart', this.onTouchStart, false);\n layer.addEventListener('touchmove', this.onTouchMove, false);\n layer.addEventListener('touchend', this.onTouchEnd, false);\n layer.addEventListener('touchcancel', this.onTouchCancel, false);\n\n // Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n // which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick\n // layer when they are cancelled.\n if (!Event.prototype.stopImmediatePropagation) {\n layer.removeEventListener = function(type, callback, capture) {\n var rmv = Node.prototype.removeEventListener;\n if (type === 'click') {\n rmv.call(layer, type, callback.hijacked || callback, capture);\n } else {\n rmv.call(layer, type, callback, capture);\n }\n };\n\n layer.addEventListener = function(type, callback, capture) {\n var adv = Node.prototype.addEventListener;\n if (type === 'click') {\n adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {\n if (!event.propagationStopped) {\n callback(event);\n }\n }), capture);\n } else {\n adv.call(layer, type, callback, capture);\n }\n };\n }\n\n // If a handler is already declared in the element's onclick attribute, it will be fired before\n // FastClick's onClick handler. Fix this by pulling out the user-defined handler function and\n // adding it as listener.\n if (typeof layer.onclick === 'function') {\n\n // Android browser on at least 3.2 requires a new reference to the function in layer.onclick\n // - the old one won't work if passed to addEventListener directly.\n oldOnClick = layer.onclick;\n layer.addEventListener('click', function(event) {\n oldOnClick(event);\n }, false);\n layer.onclick = null;\n }\n }\n\n /**\n * Windows Phone 8.1 fakes user agent string to look like Android and iPhone.\n *\n * @type boolean\n */\n var deviceIsWindowsPhone = navigator.userAgent.indexOf(\"Windows Phone\") >= 0;\n\n /**\n * Android requires exceptions.\n *\n * @type boolean\n */\n var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;\n\n\n /**\n * iOS requires exceptions.\n *\n * @type boolean\n */\n var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;\n\n\n /**\n * iOS 4 requires an exception for select elements.\n *\n * @type boolean\n */\n var deviceIsIOS4 = deviceIsIOS && (/OS 4_\\d(_\\d)?/).test(navigator.userAgent);\n\n\n /**\n * iOS 6.0-7.* requires the target element to be manually derived\n *\n * @type boolean\n */\n var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\\d/).test(navigator.userAgent);\n\n /**\n * BlackBerry requires exceptions.\n *\n * @type boolean\n */\n var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;\n\n /**\n * 判断是否组合型label\n * @type {Boolean}\n */\n var isCompositeLabel = false;\n\n /**\n * Determine whether a given element requires a native click.\n *\n * @param {EventTarget|Element} target Target DOM element\n * @returns {boolean} Returns true if the element needs a native click\n */\n FastClick.prototype.needsClick = function(target) {\n\n // 修复bug: 如果父元素中有 label\n // 如果label上有needsclick这个类,则用原生的点击,否则,用模拟点击\n var parent = target;\n while(parent && (parent.tagName.toUpperCase() !== \"BODY\")) {\n if (parent.tagName.toUpperCase() === \"LABEL\") {\n isCompositeLabel = true;\n if ((/\\bneedsclick\\b/).test(parent.className)) return true;\n }\n parent = parent.parentNode;\n }\n\n switch (target.nodeName.toLowerCase()) {\n\n // Don't send a synthetic click to disabled inputs (issue #62)\n case 'button':\n case 'select':\n case 'textarea':\n if (target.disabled) {\n return true;\n }\n\n break;\n case 'input':\n\n // File inputs need real clicks on iOS 6 due to a browser bug (issue #68)\n if ((deviceIsIOS && target.type === 'file') || target.disabled) {\n return true;\n }\n\n break;\n case 'label':\n case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames\n case 'video':\n return true;\n }\n\n return (/\\bneedsclick\\b/).test(target.className);\n };\n\n\n /**\n * Determine whether a given element requires a call to focus to simulate click into element.\n *\n * @param {EventTarget|Element} target Target DOM element\n * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.\n */\n FastClick.prototype.needsFocus = function(target) {\n switch (target.nodeName.toLowerCase()) {\n case 'textarea':\n return true;\n case 'select':\n return !deviceIsAndroid;\n case 'input':\n switch (target.type) {\n case 'button':\n case 'checkbox':\n case 'file':\n case 'image':\n case 'radio':\n case 'submit':\n return false;\n }\n\n // No point in attempting to focus disabled inputs\n return !target.disabled && !target.readOnly;\n default:\n return (/\\bneedsfocus\\b/).test(target.className);\n }\n };\n\n\n /**\n * Send a click event to the specified element.\n *\n * @param {EventTarget|Element} targetElement\n * @param {Event} event\n */\n FastClick.prototype.sendClick = function(targetElement, event) {\n var clickEvent, touch;\n\n // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)\n if (document.activeElement && document.activeElement !== targetElement) {\n document.activeElement.blur();\n }\n\n touch = event.changedTouches[0];\n\n // Synthesise a click event, with an extra attribute so it can be tracked\n clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);\n clickEvent.forwardedTouchEvent = true;\n targetElement.dispatchEvent(clickEvent);\n };\n\n FastClick.prototype.determineEventType = function(targetElement) {\n\n //Issue #159: Android Chrome Select Box does not open with a synthetic click event\n if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {\n return 'mousedown';\n }\n\n return 'click';\n };\n\n\n /**\n * @param {EventTarget|Element} targetElement\n */\n FastClick.prototype.focus = function(targetElement) {\n var length;\n\n // Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.\n var unsupportedType = ['date', 'time', 'month', 'number', 'email'];\n if (deviceIsIOS && targetElement.setSelectionRange && unsupportedType.indexOf(targetElement.type) === -1) {\n length = targetElement.value.length;\n targetElement.setSelectionRange(length, length);\n } else {\n targetElement.focus();\n }\n };\n\n\n /**\n * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.\n *\n * @param {EventTarget|Element} targetElement\n */\n FastClick.prototype.updateScrollParent = function(targetElement) {\n var scrollParent, parentElement;\n\n scrollParent = targetElement.fastClickScrollParent;\n\n // Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the\n // target element was moved to another parent.\n if (!scrollParent || !scrollParent.contains(targetElement)) {\n parentElement = targetElement;\n do {\n if (parentElement.scrollHeight > parentElement.offsetHeight) {\n scrollParent = parentElement;\n targetElement.fastClickScrollParent = parentElement;\n break;\n }\n\n parentElement = parentElement.parentElement;\n } while (parentElement);\n }\n\n // Always update the scroll top tracker if possible.\n if (scrollParent) {\n scrollParent.fastClickLastScrollTop = scrollParent.scrollTop;\n }\n };\n\n\n /**\n * @param {EventTarget} targetElement\n * @returns {Element|EventTarget}\n */\n FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {\n\n // On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.\n if (eventTarget.nodeType === Node.TEXT_NODE) {\n return eventTarget.parentNode;\n }\n\n return eventTarget;\n };\n\n\n /**\n * On touch start, record the position and scroll offset.\n *\n * @param {Event} event\n * @returns {boolean}\n */\n FastClick.prototype.onTouchStart = function(event) {\n var targetElement, touch, selection;\n\n // Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).\n if (event.targetTouches.length > 1) {\n return true;\n }\n\n targetElement = this.getTargetElementFromEventTarget(event.target);\n touch = event.targetTouches[0];\n\n if (deviceIsIOS) {\n\n // Only trusted events will deselect text on iOS (issue #49)\n selection = window.getSelection();\n if (selection.rangeCount && !selection.isCollapsed) {\n return true;\n }\n\n if (!deviceIsIOS4) {\n\n // Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):\n // when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched\n // with the same identifier as the touch event that previously triggered the click that triggered the alert.\n // Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an\n // immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.\n // Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,\n // which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,\n // random integers, it's safe to to continue if the identifier is 0 here.\n if (touch.identifier && touch.identifier === this.lastTouchIdentifier) {\n event.preventDefault();\n return false;\n }\n\n this.lastTouchIdentifier = touch.identifier;\n\n // If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:\n // 1) the user does a fling scroll on the scrollable layer\n // 2) the user stops the fling scroll with another tap\n // then the event.target of the last 'touchend' event will be the element that was under the user's finger\n // when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check\n // is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).\n this.updateScrollParent(targetElement);\n }\n }\n\n this.trackingClick = true;\n this.trackingClickStart = event.timeStamp;\n this.targetElement = targetElement;\n\n this.touchStartX = touch.pageX;\n this.touchStartY = touch.pageY;\n\n // Prevent phantom clicks on fast double-tap (issue #36)\n if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n event.preventDefault();\n }\n\n return true;\n };\n\n\n /**\n * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.\n *\n * @param {Event} event\n * @returns {boolean}\n */\n FastClick.prototype.touchHasMoved = function(event) {\n var touch = event.changedTouches[0], boundary = this.touchBoundary;\n\n if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {\n return true;\n }\n\n return false;\n };\n\n\n /**\n * Update the last position.\n *\n * @param {Event} event\n * @returns {boolean}\n */\n FastClick.prototype.onTouchMove = function(event) {\n if (!this.trackingClick) {\n return true;\n }\n\n // If the touch has moved, cancel the click tracking\n if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {\n this.trackingClick = false;\n this.targetElement = null;\n }\n\n return true;\n };\n\n\n /**\n * Attempt to find the labelled control for the given label element.\n *\n * @param {EventTarget|HTMLLabelElement} labelElement\n * @returns {Element|null}\n */\n FastClick.prototype.findControl = function(labelElement) {\n\n // Fast path for newer browsers supporting the HTML5 control attribute\n if (labelElement.control !== undefined) {\n return labelElement.control;\n }\n\n // All browsers under test that support touch events also support the HTML5 htmlFor attribute\n if (labelElement.htmlFor) {\n return document.getElementById(labelElement.htmlFor);\n }\n\n // If no for attribute exists, attempt to retrieve the first labellable descendant element\n // the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label\n return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');\n };\n\n\n /**\n * On touch end, determine whether to send a click event at once.\n *\n * @param {Event} event\n * @returns {boolean}\n */\n FastClick.prototype.onTouchEnd = function(event) {\n var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;\n\n if (!this.trackingClick) {\n return true;\n }\n\n // Prevent phantom clicks on fast double-tap (issue #36)\n if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n this.cancelNextClick = true;\n return true;\n }\n\n if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {\n return true;\n }\n //修复安卓微信下,input type=\"date\" 的bug,经测试date,time,month已没问题\n var unsupportedType = ['date', 'time', 'month'];\n if(unsupportedType.indexOf(event.target.type) !== -1){\n return false;\n }\n // Reset to prevent wrong click cancel on input (issue #156).\n this.cancelNextClick = false;\n\n this.lastClickTime = event.timeStamp;\n\n trackingClickStart = this.trackingClickStart;\n this.trackingClick = false;\n this.trackingClickStart = 0;\n\n // On some iOS devices, the targetElement supplied with the event is invalid if the layer\n // is performing a transition or scroll, and has to be re-detected manually. Note that\n // for this to function correctly, it must be called *after* the event target is checked!\n // See issue #57; also filed as rdar://13048589 .\n if (deviceIsIOSWithBadTarget) {\n touch = event.changedTouches[0];\n\n // In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null\n targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;\n targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;\n }\n\n targetTagName = targetElement.tagName.toLowerCase();\n if (targetTagName === 'label') {\n forElement = this.findControl(targetElement);\n if (forElement) {\n this.focus(targetElement);\n if (deviceIsAndroid) {\n return false;\n }\n\n targetElement = forElement;\n }\n } else if (this.needsFocus(targetElement)) {\n\n // Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.\n // Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).\n if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {\n this.targetElement = null;\n return false;\n }\n\n this.focus(targetElement);\n this.sendClick(targetElement, event);\n\n // Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.\n // Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)\n if (!deviceIsIOS || targetTagName !== 'select') {\n this.targetElement = null;\n event.preventDefault();\n }\n\n return false;\n }\n\n if (deviceIsIOS && !deviceIsIOS4) {\n\n // Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled\n // and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).\n scrollParent = targetElement.fastClickScrollParent;\n if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {\n return true;\n }\n }\n\n // Prevent the actual click from going though - unless the target node is marked as requiring\n // real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.\n if (!this.needsClick(targetElement)) {\n event.preventDefault();\n this.sendClick(targetElement, event);\n }\n\n return false;\n };\n\n\n /**\n * On touch cancel, stop tracking the click.\n *\n * @returns {void}\n */\n FastClick.prototype.onTouchCancel = function() {\n this.trackingClick = false;\n this.targetElement = null;\n };\n\n\n /**\n * Determine mouse events which should be permitted.\n *\n * @param {Event} event\n * @returns {boolean}\n */\n FastClick.prototype.onMouse = function(event) {\n\n // If a target element was never set (because a touch event was never fired) allow the event\n if (!this.targetElement) {\n return true;\n }\n\n if (event.forwardedTouchEvent) {\n return true;\n }\n\n // Programmatically generated events targeting a specific element should be permitted\n if (!event.cancelable) {\n return true;\n }\n\n // Derive and check the target element to see whether the mouse event needs to be permitted;\n // unless explicitly enabled, prevent non-touch click events from triggering actions,\n // to prevent ghost/doubleclicks.\n if (!this.needsClick(this.targetElement) || this.cancelNextClick) {\n\n // Prevent any user-added listeners declared on FastClick element from being fired.\n if (event.stopImmediatePropagation) {\n event.stopImmediatePropagation();\n } else {\n\n // Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n event.propagationStopped = true;\n }\n\n // Cancel the event\n event.stopPropagation();\n // 允许组合型label冒泡\n if (!isCompositeLabel) {\n event.preventDefault();\n }\n // 允许组合型label冒泡\n return false;\n }\n\n // If the mouse event is permitted, return true for the action to go through.\n return true;\n };\n\n\n /**\n * On actual clicks, determine whether this is a touch-generated click, a click action occurring\n * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or\n * an actual click which should be permitted.\n *\n * @param {Event} event\n * @returns {boolean}\n */\n FastClick.prototype.onClick = function(event) {\n var permitted;\n\n // It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.\n if (this.trackingClick) {\n this.targetElement = null;\n this.trackingClick = false;\n return true;\n }\n\n // Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.\n if (event.target.type === 'submit' && event.detail === 0) {\n return true;\n }\n\n permitted = this.onMouse(event);\n\n // Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.\n if (!permitted) {\n this.targetElement = null;\n }\n\n // If clicks are permitted, return true for the action to go through.\n return permitted;\n };\n\n\n /**\n * Remove all FastClick's event listeners.\n *\n * @returns {void}\n */\n FastClick.prototype.destroy = function() {\n var layer = this.layer;\n\n if (deviceIsAndroid) {\n layer.removeEventListener('mouseover', this.onMouse, true);\n layer.removeEventListener('mousedown', this.onMouse, true);\n layer.removeEventListener('mouseup', this.onMouse, true);\n }\n\n layer.removeEventListener('click', this.onClick, true);\n layer.removeEventListener('touchstart', this.onTouchStart, false);\n layer.removeEventListener('touchmove', this.onTouchMove, false);\n layer.removeEventListener('touchend', this.onTouchEnd, false);\n layer.removeEventListener('touchcancel', this.onTouchCancel, false);\n };\n\n\n /**\n * Check whether FastClick is needed.\n *\n * @param {Element} layer The layer to listen on\n */\n FastClick.notNeeded = function(layer) {\n var metaViewport;\n var chromeVersion;\n var blackberryVersion;\n var firefoxVersion;\n\n // Devices that don't support touch don't need FastClick\n if (typeof window.ontouchstart === 'undefined') {\n return true;\n }\n\n // Chrome version - zero for other browsers\n chromeVersion = +(/Chrome\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n if (chromeVersion) {\n\n if (deviceIsAndroid) {\n metaViewport = document.querySelector('meta[name=viewport]');\n\n if (metaViewport) {\n // Chrome on Android with user-scalable=\"no\" doesn't need FastClick (issue #89)\n if (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n return true;\n }\n // Chrome 32 and above with width=device-width or less don't need FastClick\n if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {\n return true;\n }\n }\n\n // Chrome desktop doesn't need FastClick (issue #15)\n } else {\n return true;\n }\n }\n\n if (deviceIsBlackBerry10) {\n blackberryVersion = navigator.userAgent.match(/Version\\/([0-9]*)\\.([0-9]*)/);\n\n // BlackBerry 10.3+ does not require Fastclick library.\n // https://github.com/ftlabs/fastclick/issues/251\n if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {\n metaViewport = document.querySelector('meta[name=viewport]');\n\n if (metaViewport) {\n // user-scalable=no eliminates click delay.\n if (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n return true;\n }\n // width=device-width (or less than device-width) eliminates click delay.\n if (document.documentElement.scrollWidth <= window.outerWidth) {\n return true;\n }\n }\n }\n }\n\n // IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)\n if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {\n return true;\n }\n\n // Firefox version - zero for other browsers\n firefoxVersion = +(/Firefox\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n if (firefoxVersion >= 27) {\n // Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896\n\n metaViewport = document.querySelector('meta[name=viewport]');\n if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {\n return true;\n }\n }\n\n // IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version\n // http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx\n if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {\n return true;\n }\n\n return false;\n };\n\n\n /**\n * Factory method for creating a FastClick object\n *\n * @param {Element} layer The layer to listen on\n * @param {Object} [options={}] The options to override the defaults\n */\n FastClick.attach = function(layer, options) {\n return new FastClick(layer, options);\n };\n\n window.FastClick = FastClick;\n}());\n\n/*======================================================\n ************ Modals ************\n ======================================================*/\n/*jshint unused: false*/\n+function ($) {\n \"use strict\";\n var _modalTemplateTempDiv = document.createElement('div');\n\n $.modalStack = [];\n\n $.modalStackClearQueue = function () {\n if ($.modalStack.length) {\n ($.modalStack.shift())();\n }\n };\n $.modal = function (params) {\n params = params || {};\n var modalHTML = '';\n var buttonsHTML = '';\n if (params.buttons && params.buttons.length > 0) {\n if (params.buttonType == 'input'){\n for (var i = 0; i < params.buttons.length; i++) {\n var buttonDisabled = params.buttons[i].disabled ? 'disabled=true' : '';\n buttonsHTML += ''\n } \n } else {\n for (var i = 0; i < params.buttons.length; i++) {\n buttonsHTML += '' + params.buttons[i].text + '';\n } \n }\n \n }\n var extraClass = params.extraClass || '';\n var titleHTML = params.title ? '
' + params.title + '
' : '';\n var textHTML = params.text ? '
' + params.text + '
' : '';\n var afterTextHTML = params.afterText ? params.afterText : '';\n var noButtons = !params.buttons || params.buttons.length === 0 ? 'modal-no-buttons' : '';\n var verticalButtons = params.verticalButtons ? 'modal-buttons-vertical' : '';\n modalHTML = '
' + (titleHTML + textHTML + afterTextHTML) + '
' + buttonsHTML + '
';\n\n _modalTemplateTempDiv.innerHTML = modalHTML;\n\n var modal = $(_modalTemplateTempDiv).children();\n\n $(defaults.modalContainer).append(modal[0]);\n\n // Add events on buttons\n modal.find('.modal-button').each(function (index, el) {\n $(el).on('click', function (e) {\n if (params.buttons[index].close !== false) $.closeModal(modal);\n if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\n if (params.onClick) params.onClick(modal, index);\n });\n });\n $.openModal(modal);\n return modal[0];\n };\n $.alert = function (text, title, callbackOk) {\n if (typeof title === 'function') {\n callbackOk = arguments[1];\n title = undefined;\n }\n return $.modal({\n text: text || '',\n title: typeof title === 'undefined' ? defaults.modalTitle : title,\n buttons: [ {text: defaults.modalButtonOk, bold: true, onClick: callbackOk} ]\n });\n };\n $.confirm = function (text, title, callbackOk, callbackCancel) {\n if (typeof title === 'function') {\n callbackCancel = arguments[2];\n callbackOk = arguments[1];\n title = undefined;\n }\n return $.modal({\n text: text || '',\n title: typeof title === 'undefined' ? defaults.modalTitle : title,\n buttons: [\n {text: defaults.modalButtonCancel, onClick: callbackCancel},\n {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\n ]\n });\n };\n $.prompt = function (text, title, callbackOk, callbackCancel) {\n if (typeof title === 'function') {\n callbackCancel = arguments[2];\n callbackOk = arguments[1];\n title = undefined;\n }\n return $.modal({\n text: text || '',\n title: typeof title === 'undefined' ? defaults.modalTitle : title,\n afterText: '',\n buttons: [\n {\n text: defaults.modalButtonCancel\n },\n {\n text: defaults.modalButtonOk,\n bold: true\n }\n ],\n onClick: function (modal, index) {\n if (index === 0 && callbackCancel) callbackCancel($(modal).find('.modal-text-input').val());\n if (index === 1 && callbackOk) callbackOk($(modal).find('.modal-text-input').val());\n }\n });\n };\n $.modalLogin = function (text, title, callbackOk, callbackCancel) {\n if (typeof title === 'function') {\n callbackCancel = arguments[2];\n callbackOk = arguments[1];\n title = undefined;\n }\n return $.modal({\n text: text || '',\n title: typeof title === 'undefined' ? defaults.modalTitle : title,\n afterText: '',\n buttons: [\n {\n text: defaults.modalButtonCancel\n },\n {\n text: defaults.modalButtonOk,\n bold: true\n }\n ],\n onClick: function (modal, index) {\n var username = $(modal).find('.modal-text-input[name=\"modal-username\"]').val();\n var password = $(modal).find('.modal-text-input[name=\"modal-password\"]').val();\n if (index === 0 && callbackCancel) callbackCancel(username, password);\n if (index === 1 && callbackOk) callbackOk(username, password);\n }\n });\n };\n $.modalPassword = function (text, title, callbackOk, callbackCancel) {\n if (typeof title === 'function') {\n callbackCancel = arguments[2];\n callbackOk = arguments[1];\n title = undefined;\n }\n return $.modal({\n text: text || '',\n title: typeof title === 'undefined' ? defaults.modalTitle : title,\n afterText: '',\n buttons: [\n {\n text: defaults.modalButtonCancel\n },\n {\n text: defaults.modalButtonOk,\n bold: true\n }\n ],\n onClick: function (modal, index) {\n var password = $(modal).find('.modal-text-input[name=\"modal-password\"]').val();\n if (index === 0 && callbackCancel) callbackCancel(password);\n if (index === 1 && callbackOk) callbackOk(password);\n }\n });\n };\n $.showPreloader = function (title) {\n $.hidePreloader();\n $.showPreloader.preloaderModal = $.modal({\n title: title || defaults.modalPreloaderTitle,\n text: '
'\n });\n\n return $.showPreloader.preloaderModal;\n };\n $.hidePreloader = function () {\n $.showPreloader.preloaderModal && $.closeModal($.showPreloader.preloaderModal);\n };\n $.showIndicator = function () {\n if ($('.preloader-indicator-modal')[0]) return;\n $(defaults.modalContainer).append('
');\n };\n $.hideIndicator = function () {\n $('.preloader-indicator-overlay, .preloader-indicator-modal').remove();\n };\n // Action Sheet\n $.actions = function (params) {\n var modal, groupSelector, buttonSelector;\n params = params || [];\n\n if (params.length > 0 && !$.isArray(params[0])) {\n params = [params];\n }\n var modalHTML;\n var buttonsHTML = '';\n for (var i = 0; i < params.length; i++) {\n for (var j = 0; j < params[i].length; j++) {\n if (j === 0) buttonsHTML += '
';\n var button = params[i][j];\n var buttonClass = button.label ? 'actions-modal-label' : 'actions-modal-button';\n if (button.bold) buttonClass += ' actions-modal-button-bold';\n if (button.color) buttonClass += ' color-' + button.color;\n if (button.bg) buttonClass += ' bg-' + button.bg;\n if (button.disabled) buttonClass += ' disabled';\n buttonsHTML += '' + button.text + '';\n if (j === params[i].length - 1) buttonsHTML += '
';\n }\n }\n modalHTML = '
' + buttonsHTML + '
';\n _modalTemplateTempDiv.innerHTML = modalHTML;\n modal = $(_modalTemplateTempDiv).children();\n $(defaults.modalContainer).append(modal[0]);\n groupSelector = '.actions-modal-group';\n buttonSelector = '.actions-modal-button';\n\n var groups = modal.find(groupSelector);\n groups.each(function (index, el) {\n var groupIndex = index;\n $(el).children().each(function (index, el) {\n var buttonIndex = index;\n var buttonParams = params[groupIndex][buttonIndex];\n var clickTarget;\n if ($(el).is(buttonSelector)) clickTarget = $(el);\n // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\n\n if (clickTarget) {\n clickTarget.on('click', function (e) {\n if (buttonParams.close !== false) $.closeModal(modal);\n if (buttonParams.onClick) buttonParams.onClick(modal, e);\n });\n }\n });\n });\n $.openModal(modal);\n return modal[0];\n };\n $.popup = function (modal, removeOnClose) {\n if (typeof removeOnClose === 'undefined') removeOnClose = true;\n if (typeof modal === 'string' && modal.indexOf('<') >= 0) {\n var _modal = document.createElement('div');\n _modal.innerHTML = modal.trim();\n if (_modal.childNodes.length > 0) {\n modal = _modal.childNodes[0];\n if (removeOnClose) modal.classList.add('remove-on-close');\n $(defaults.modalContainer).append(modal);\n }\n else return false; //nothing found\n }\n modal = $(modal);\n if (modal.length === 0) return false;\n modal.show();\n modal.find(\".content\").scroller(\"refresh\");\n if (modal.find('.' + defaults.viewClass).length > 0) {\n $.sizeNavbars(modal.find('.' + defaults.viewClass)[0]);\n }\n $.openModal(modal);\n\n return modal[0];\n };\n $.pickerModal = function (pickerModal, removeOnClose) {\n if (typeof removeOnClose === 'undefined') removeOnClose = true;\n if (typeof pickerModal === 'string' && pickerModal.indexOf('<') >= 0) {\n pickerModal = $(pickerModal);\n if (pickerModal.length > 0) {\n if (removeOnClose) pickerModal.addClass('remove-on-close');\n $(defaults.modalContainer).append(pickerModal[0]);\n }\n else return false; //nothing found\n }\n pickerModal = $(pickerModal);\n if (pickerModal.length === 0) return false;\n pickerModal.show();\n $.openModal(pickerModal);\n return pickerModal[0];\n };\n $.loginScreen = function (modal) {\n if (!modal) modal = '.login-screen';\n modal = $(modal);\n if (modal.length === 0) return false;\n modal.show();\n if (modal.find('.' + defaults.viewClass).length > 0) {\n $.sizeNavbars(modal.find('.' + defaults.viewClass)[0]);\n }\n $.openModal(modal);\n return modal[0];\n };\n //显示一个消息,会在2秒钟后自动消失\n $.toast = function(msg, duration, extraclass) {\n var $toast = $('
' + msg + '
').appendTo(document.body);\n $.openModal($toast, function(){\n setTimeout(function() {\n $.closeModal($toast);\n }, duration || 2000);\n });\n };\n $.openModal = function (modal, cb) {\n modal = $(modal);\n var isModal = modal.hasClass('modal'),\n isNotToast = !modal.hasClass('toast');\n if ($('.modal.modal-in:not(.modal-out)').length && defaults.modalStack && isModal && isNotToast) {\n $.modalStack.push(function () {\n $.openModal(modal, cb);\n });\n return;\n }\n var isPopup = modal.hasClass('popup');\n var isLoginScreen = modal.hasClass('login-screen');\n var isPickerModal = modal.hasClass('picker-modal');\n var isToast = modal.hasClass('toast');\n if (isModal) {\n modal.show();\n modal.css({\n marginTop: - Math.round(modal.outerHeight() / 2) + 'px'\n });\n }\n if (isToast) {\n modal.css({\n marginLeft: - Math.round(modal.outerWidth() / 2 / 1.185) + 'px' //1.185 是初始化时候的放大效果\n });\n }\n\n var overlay;\n if (!isLoginScreen && !isPickerModal && !isToast) {\n if ($('.modal-overlay').length === 0 && !isPopup) {\n $(defaults.modalContainer).append('
');\n }\n if ($('.popup-overlay').length === 0 && isPopup) {\n $(defaults.modalContainer).append('
');\n }\n overlay = isPopup ? $('.popup-overlay') : $('.modal-overlay');\n }\n\n //Make sure that styles are applied, trigger relayout;\n var clientLeft = modal[0].clientLeft;\n\n // Trugger open event\n modal.trigger('open');\n\n // Picker modal body class\n if (isPickerModal) {\n $(defaults.modalContainer).addClass('with-picker-modal');\n }\n\n // Classes for transition in\n if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('modal-overlay-visible');\n modal.removeClass('modal-out').addClass('modal-in').transitionEnd(function (e) {\n if (modal.hasClass('modal-out')) modal.trigger('closed');\n else modal.trigger('opened');\n });\n // excute callback\n if (typeof cb === 'function') {\n cb.call(this);\n }\n return true;\n };\n $.closeModal = function (modal) {\n modal = $(modal || '.modal-in');\n if (typeof modal !== 'undefined' && modal.length === 0) {\n return;\n }\n var isModal = modal.hasClass('modal'),\n isPopup = modal.hasClass('popup'),\n isToast = modal.hasClass('toast'),\n isLoginScreen = modal.hasClass('login-screen'),\n isPickerModal = modal.hasClass('picker-modal'),\n removeOnClose = modal.hasClass('remove-on-close'),\n overlay = isPopup ? $('.popup-overlay') : $('.modal-overlay');\n if (isPopup){\n if (modal.length === $('.popup.modal-in').length) {\n overlay.removeClass('modal-overlay-visible');\n }\n }\n else if (!(isPickerModal || isToast)) {\n overlay.removeClass('modal-overlay-visible');\n }\n\n modal.trigger('close');\n\n // Picker modal body class\n if (isPickerModal) {\n $(defaults.modalContainer).removeClass('with-picker-modal');\n $(defaults.modalContainer).addClass('picker-modal-closing');\n }\n\n modal.removeClass('modal-in').addClass('modal-out').transitionEnd(function (e) {\n if (modal.hasClass('modal-out')) modal.trigger('closed');\n else modal.trigger('opened');\n\n if (isPickerModal) {\n $(defaults.modalContainer).removeClass('picker-modal-closing');\n }\n if (isPopup || isLoginScreen || isPickerModal) {\n modal.removeClass('modal-out').hide();\n if (removeOnClose && modal.length > 0) {\n modal.remove();\n }\n }\n else {\n modal.remove();\n }\n });\n if (isModal && defaults.modalStack ) {\n $.modalStackClearQueue();\n }\n\n return true;\n };\n function handleClicks(e) {\n /*jshint validthis:true */\n var clicked = $(this);\n var url = clicked.attr('href');\n\n\n //Collect Clicked data- attributes\n var clickedData = clicked.dataset();\n\n // Popup\n var popup;\n if (clicked.hasClass('open-popup')) {\n if (clickedData.popup) {\n popup = clickedData.popup;\n }\n else popup = '.popup';\n $.popup(popup);\n }\n if (clicked.hasClass('close-popup')) {\n if (clickedData.popup) {\n popup = clickedData.popup;\n }\n else popup = '.popup.modal-in';\n $.closeModal(popup);\n }\n\n // Close Modal\n if (clicked.hasClass('modal-overlay')) {\n if ($('.modal.modal-in').length > 0 && defaults.modalCloseByOutside)\n $.closeModal('.modal.modal-in');\n if ($('.actions-modal.modal-in').length > 0 && defaults.actionsCloseByOutside)\n $.closeModal('.actions-modal.modal-in');\n\n }\n if (clicked.hasClass('popup-overlay')) {\n if ($('.popup.modal-in').length > 0 && defaults.popupCloseByOutside)\n $.closeModal('.popup.modal-in');\n }\n\n\n\n\n }\n $(document).on('click', ' .modal-overlay, .popup-overlay, .close-popup, .open-popup, .close-picker', handleClicks);\n var defaults = $.modal.prototype.defaults = {\n modalStack: true,\n modalButtonOk: '确定',\n modalButtonCancel: '取消',\n modalPreloaderTitle: '加载中',\n modalContainer : document.body\n };\n}(Zepto);\n\n/*======================================================\n ************ Calendar ************\n ======================================================*/\n/*jshint unused: false*/\n+function ($) {\n \"use strict\";\n var rtl = false;\n var Calendar = function (params) {\n var p = this;\n var defaults = {\n monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月' , '九月' , '十月', '十一月', '十二月'],\n monthNamesShort: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月' , '九月' , '十月', '十一月', '十二月'],\n dayNames: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n dayNamesShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n firstDay: 1, // First day of the week, Monday\n weekendDays: [0, 6], // Sunday and Saturday\n multiple: false,\n dateFormat: 'yyyy-mm-dd',\n direction: 'horizontal', // or 'vertical'\n minDate: null,\n maxDate: null,\n touchMove: true,\n animate: true,\n closeOnSelect: true,\n monthPicker: true,\n monthPickerTemplate:\n '
' +\n '' +\n '
' +\n '' +\n '
',\n yearPicker: true,\n yearPickerTemplate:\n '
' +\n '' +\n '' +\n '' +\n '
',\n weekHeader: true,\n // Common settings\n scrollToInput: true,\n inputReadOnly: true,\n toolbar: true,\n toolbarCloseText: 'Done',\n toolbarTemplate:\n '
' +\n '
' +\n '{{monthPicker}}' +\n '{{yearPicker}}' +\n // '{{closeText}}' +\n '
' +\n '
',\n /* Callbacks\n onMonthAdd\n onChange\n onOpen\n onClose\n onDayClick\n onMonthYearChangeStart\n onMonthYearChangeEnd\n */\n };\n params = params || {};\n for (var def in defaults) {\n if (typeof params[def] === 'undefined') {\n params[def] = defaults[def];\n }\n }\n p.params = params;\n p.initialized = false;\n\n // Inline flag\n p.inline = p.params.container ? true : false;\n\n // Is horizontal\n p.isH = p.params.direction === 'horizontal';\n\n // RTL inverter\n var inverter = p.isH ? (rtl ? -1 : 1) : 1;\n\n // Animating flag\n p.animating = false;\n\n // Format date\n function formatDate(date) {\n date = new Date(date);\n var year = date.getFullYear();\n var month = date.getMonth();\n var month1 = month + 1;\n var day = date.getDate();\n var weekDay = date.getDay();\n return p.params.dateFormat\n .replace(/yyyy/g, year)\n .replace(/yy/g, (year + '').substring(2))\n .replace(/mm/g, month1 < 10 ? '0' + month1 : month1)\n .replace(/m/g, month1)\n .replace(/MM/g, p.params.monthNames[month])\n .replace(/M/g, p.params.monthNamesShort[month])\n .replace(/dd/g, day < 10 ? '0' + day : day)\n .replace(/d/g, day)\n .replace(/DD/g, p.params.dayNames[weekDay])\n .replace(/D/g, p.params.dayNamesShort[weekDay]);\n }\n\n\n // Value\n p.addValue = function (value) {\n if (p.params.multiple) {\n if (!p.value) p.value = [];\n var inValuesIndex;\n for (var i = 0; i < p.value.length; i++) {\n if (new Date(value).getTime() === new Date(p.value[i]).getTime()) {\n inValuesIndex = i;\n }\n }\n if (typeof inValuesIndex === 'undefined') {\n p.value.push(value);\n }\n else {\n p.value.splice(inValuesIndex, 1);\n }\n p.updateValue();\n }\n else {\n p.value = [value];\n p.updateValue();\n }\n };\n p.setValue = function (arrValues) {\n p.value = arrValues;\n p.updateValue();\n };\n p.updateValue = function () {\n p.wrapper.find('.picker-calendar-day-selected').removeClass('picker-calendar-day-selected');\n var i, inputValue;\n for (i = 0; i < p.value.length; i++) {\n var valueDate = new Date(p.value[i]);\n p.wrapper.find('.picker-calendar-day[data-date=\"' + valueDate.getFullYear() + '-' + valueDate.getMonth() + '-' + valueDate.getDate() + '\"]').addClass('picker-calendar-day-selected');\n }\n if (p.params.onChange) {\n p.params.onChange(p, p.value, p.value.map(formatDate));\n }\n if (p.input && p.input.length > 0) {\n if (p.params.formatValue) inputValue = p.params.formatValue(p, p.value);\n else {\n inputValue = [];\n for (i = 0; i < p.value.length; i++) {\n inputValue.push(formatDate(p.value[i]));\n }\n inputValue = inputValue.join(', ');\n }\n $(p.input).val(inputValue);\n $(p.input).trigger('change');\n }\n };\n\n // Columns Handlers\n p.initCalendarEvents = function () {\n var col;\n var allowItemClick = true;\n var isTouched, isMoved, touchStartX, touchStartY, touchCurrentX, touchCurrentY, touchStartTime, touchEndTime, startTranslate, currentTranslate, wrapperWidth, wrapperHeight, percentage, touchesDiff, isScrolling;\n function handleTouchStart (e) {\n if (isMoved || isTouched) return;\n // e.preventDefault();\n isTouched = true;\n touchStartX = touchCurrentY = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchStartY = touchCurrentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n touchStartTime = (new Date()).getTime();\n percentage = 0;\n allowItemClick = true;\n isScrolling = undefined;\n startTranslate = currentTranslate = p.monthsTranslate;\n }\n function handleTouchMove (e) {\n if (!isTouched) return;\n\n touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));\n }\n if (p.isH && isScrolling) {\n isTouched = false;\n return;\n }\n e.preventDefault();\n if (p.animating) {\n isTouched = false;\n return;\n }\n allowItemClick = false;\n if (!isMoved) {\n // First move\n isMoved = true;\n wrapperWidth = p.wrapper[0].offsetWidth;\n wrapperHeight = p.wrapper[0].offsetHeight;\n p.wrapper.transition(0);\n }\n e.preventDefault();\n\n touchesDiff = p.isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY;\n percentage = touchesDiff/(p.isH ? wrapperWidth : wrapperHeight);\n currentTranslate = (p.monthsTranslate * inverter + percentage) * 100;\n\n // Transform wrapper\n p.wrapper.transform('translate3d(' + (p.isH ? currentTranslate : 0) + '%, ' + (p.isH ? 0 : currentTranslate) + '%, 0)');\n\n }\n function handleTouchEnd (e) {\n if (!isTouched || !isMoved) {\n isTouched = isMoved = false;\n return;\n }\n isTouched = isMoved = false;\n\n touchEndTime = new Date().getTime();\n if (touchEndTime - touchStartTime < 300) {\n if (Math.abs(touchesDiff) < 10) {\n p.resetMonth();\n }\n else if (touchesDiff >= 10) {\n if (rtl) p.nextMonth();\n else p.prevMonth();\n }\n else {\n if (rtl) p.prevMonth();\n else p.nextMonth();\n }\n }\n else {\n if (percentage <= -0.5) {\n if (rtl) p.prevMonth();\n else p.nextMonth();\n }\n else if (percentage >= 0.5) {\n if (rtl) p.nextMonth();\n else p.prevMonth();\n }\n else {\n p.resetMonth();\n }\n }\n\n // Allow click\n setTimeout(function () {\n allowItemClick = true;\n }, 100);\n }\n\n function handleDayClick(e) {\n if (!allowItemClick) return;\n var day = $(e.target).parents('.picker-calendar-day');\n if (day.length === 0 && $(e.target).hasClass('picker-calendar-day')) {\n day = $(e.target);\n }\n if (day.length === 0) return;\n if (day.hasClass('picker-calendar-day-selected') && !p.params.multiple) return;\n if (day.hasClass('picker-calendar-day-disabled')) return;\n if (day.hasClass('picker-calendar-day-next')) p.nextMonth();\n if (day.hasClass('picker-calendar-day-prev')) p.prevMonth();\n var dateYear = day.attr('data-year');\n var dateMonth = day.attr('data-month');\n var dateDay = day.attr('data-day');\n if (p.params.onDayClick) {\n p.params.onDayClick(p, day[0], dateYear, dateMonth, dateDay);\n }\n p.addValue(new Date(dateYear, dateMonth, dateDay).getTime());\n if (p.params.closeOnSelect) p.close();\n }\n\n p.container.find('.picker-calendar-prev-month').on('click', p.prevMonth);\n p.container.find('.picker-calendar-next-month').on('click', p.nextMonth);\n p.container.find('.picker-calendar-prev-year').on('click', p.prevYear);\n p.container.find('.picker-calendar-next-year').on('click', p.nextYear);\n p.wrapper.on('click', handleDayClick);\n if (p.params.touchMove) {\n p.wrapper.on($.touchEvents.start, handleTouchStart);\n p.wrapper.on($.touchEvents.move, handleTouchMove);\n p.wrapper.on($.touchEvents.end, handleTouchEnd);\n }\n\n p.container[0].f7DestroyCalendarEvents = function () {\n p.container.find('.picker-calendar-prev-month').off('click', p.prevMonth);\n p.container.find('.picker-calendar-next-month').off('click', p.nextMonth);\n p.container.find('.picker-calendar-prev-year').off('click', p.prevYear);\n p.container.find('.picker-calendar-next-year').off('click', p.nextYear);\n p.wrapper.off('click', handleDayClick);\n if (p.params.touchMove) {\n p.wrapper.off($.touchEvents.start, handleTouchStart);\n p.wrapper.off($.touchEvents.move, handleTouchMove);\n p.wrapper.off($.touchEvents.end, handleTouchEnd);\n }\n };\n\n\n };\n p.destroyCalendarEvents = function (colContainer) {\n if ('f7DestroyCalendarEvents' in p.container[0]) p.container[0].f7DestroyCalendarEvents();\n };\n\n // Calendar Methods\n p.daysInMonth = function (date) {\n var d = new Date(date);\n return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\n };\n p.monthHTML = function (date, offset) {\n date = new Date(date);\n var year = date.getFullYear(),\n month = date.getMonth(),\n day = date.getDate();\n if (offset === 'next') {\n if (month === 11) date = new Date(year + 1, 0);\n else date = new Date(year, month + 1, 1);\n }\n if (offset === 'prev') {\n if (month === 0) date = new Date(year - 1, 11);\n else date = new Date(year, month - 1, 1);\n }\n if (offset === 'next' || offset === 'prev') {\n month = date.getMonth();\n year = date.getFullYear();\n }\n var daysInPrevMonth = p.daysInMonth(new Date(date.getFullYear(), date.getMonth()).getTime() - 10 * 24 * 60 * 60 * 1000),\n daysInMonth = p.daysInMonth(date),\n firstDayOfMonthIndex = new Date(date.getFullYear(), date.getMonth()).getDay();\n if (firstDayOfMonthIndex === 0) firstDayOfMonthIndex = 7;\n\n var dayDate, currentValues = [], i, j,\n rows = 6, cols = 7,\n monthHTML = '',\n dayIndex = 0 + (p.params.firstDay - 1),\n today = new Date().setHours(0,0,0,0),\n minDate = p.params.minDate ? new Date(p.params.minDate).getTime() : null,\n maxDate = p.params.maxDate ? new Date(p.params.maxDate).getTime() : null;\n\n if (p.value && p.value.length) {\n for (i = 0; i < p.value.length; i++) {\n currentValues.push(new Date(p.value[i]).setHours(0,0,0,0));\n }\n }\n\n for (i = 1; i <= rows; i++) {\n var rowHTML = '';\n var row = i;\n for (j = 1; j <= cols; j++) {\n var col = j;\n dayIndex ++;\n var dayNumber = dayIndex - firstDayOfMonthIndex;\n var addClass = '';\n if (dayNumber < 0) {\n dayNumber = daysInPrevMonth + dayNumber + 1;\n addClass += ' picker-calendar-day-prev';\n dayDate = new Date(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime();\n }\n else {\n dayNumber = dayNumber + 1;\n if (dayNumber > daysInMonth) {\n dayNumber = dayNumber - daysInMonth;\n addClass += ' picker-calendar-day-next';\n dayDate = new Date(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime();\n }\n else {\n dayDate = new Date(year, month, dayNumber).getTime();\n }\n }\n // Today\n if (dayDate === today) addClass += ' picker-calendar-day-today';\n // Selected\n if (currentValues.indexOf(dayDate) >= 0) addClass += ' picker-calendar-day-selected';\n // Weekend\n if (p.params.weekendDays.indexOf(col - 1) >= 0) {\n addClass += ' picker-calendar-day-weekend';\n }\n // Disabled\n if ((minDate && dayDate < minDate) || (maxDate && dayDate > maxDate)) {\n addClass += ' picker-calendar-day-disabled';\n }\n\n dayDate = new Date(dayDate);\n var dayYear = dayDate.getFullYear();\n var dayMonth = dayDate.getMonth();\n rowHTML += '
'+dayNumber+'
';\n }\n monthHTML += '
' + rowHTML + '
';\n }\n monthHTML = '
' + monthHTML + '
';\n return monthHTML;\n };\n p.animating = false;\n p.updateCurrentMonthYear = function (dir) {\n if (typeof dir === 'undefined') {\n p.currentMonth = parseInt(p.months.eq(1).attr('data-month'), 10);\n p.currentYear = parseInt(p.months.eq(1).attr('data-year'), 10);\n }\n else {\n p.currentMonth = parseInt(p.months.eq(dir === 'next' ? (p.months.length - 1) : 0).attr('data-month'), 10);\n p.currentYear = parseInt(p.months.eq(dir === 'next' ? (p.months.length - 1) : 0).attr('data-year'), 10);\n }\n p.container.find('.current-month-value').text(p.params.monthNames[p.currentMonth]);\n p.container.find('.current-year-value').text(p.currentYear);\n\n };\n p.onMonthChangeStart = function (dir) {\n p.updateCurrentMonthYear(dir);\n p.months.removeClass('picker-calendar-month-current picker-calendar-month-prev picker-calendar-month-next');\n var currentIndex = dir === 'next' ? p.months.length - 1 : 0;\n\n p.months.eq(currentIndex).addClass('picker-calendar-month-current');\n p.months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'picker-calendar-month-prev' : 'picker-calendar-month-next');\n\n if (p.params.onMonthYearChangeStart) {\n p.params.onMonthYearChangeStart(p, p.currentYear, p.currentMonth);\n }\n };\n p.onMonthChangeEnd = function (dir, rebuildBoth) {\n p.animating = false;\n var nextMonthHTML, prevMonthHTML, newMonthHTML;\n p.wrapper.find('.picker-calendar-month:not(.picker-calendar-month-prev):not(.picker-calendar-month-current):not(.picker-calendar-month-next)').remove();\n\n if (typeof dir === 'undefined') {\n dir = 'next';\n rebuildBoth = true;\n }\n if (!rebuildBoth) {\n newMonthHTML = p.monthHTML(new Date(p.currentYear, p.currentMonth), dir);\n }\n else {\n p.wrapper.find('.picker-calendar-month-next, .picker-calendar-month-prev').remove();\n prevMonthHTML = p.monthHTML(new Date(p.currentYear, p.currentMonth), 'prev');\n nextMonthHTML = p.monthHTML(new Date(p.currentYear, p.currentMonth), 'next');\n }\n if (dir === 'next' || rebuildBoth) {\n p.wrapper.append(newMonthHTML || nextMonthHTML);\n }\n if (dir === 'prev' || rebuildBoth) {\n p.wrapper.prepend(newMonthHTML || prevMonthHTML);\n }\n p.months = p.wrapper.find('.picker-calendar-month');\n p.setMonthsTranslate(p.monthsTranslate);\n if (p.params.onMonthAdd) {\n p.params.onMonthAdd(p, dir === 'next' ? p.months.eq(p.months.length - 1)[0] : p.months.eq(0)[0]);\n }\n if (p.params.onMonthYearChangeEnd) {\n p.params.onMonthYearChangeEnd(p, p.currentYear, p.currentMonth);\n }\n };\n p.setMonthsTranslate = function (translate) {\n translate = translate || p.monthsTranslate || 0;\n if (typeof p.monthsTranslate === 'undefined') p.monthsTranslate = translate;\n p.months.removeClass('picker-calendar-month-current picker-calendar-month-prev picker-calendar-month-next');\n var prevMonthTranslate = -(translate + 1) * 100 * inverter;\n var currentMonthTranslate = -translate * 100 * inverter;\n var nextMonthTranslate = -(translate - 1) * 100 * inverter;\n p.months.eq(0).transform('translate3d(' + (p.isH ? prevMonthTranslate : 0) + '%, ' + (p.isH ? 0 : prevMonthTranslate) + '%, 0)').addClass('picker-calendar-month-prev');\n p.months.eq(1).transform('translate3d(' + (p.isH ? currentMonthTranslate : 0) + '%, ' + (p.isH ? 0 : currentMonthTranslate) + '%, 0)').addClass('picker-calendar-month-current');\n p.months.eq(2).transform('translate3d(' + (p.isH ? nextMonthTranslate : 0) + '%, ' + (p.isH ? 0 : nextMonthTranslate) + '%, 0)').addClass('picker-calendar-month-next');\n };\n p.nextMonth = function (transition) {\n if (typeof transition === 'undefined' || typeof transition === 'object') {\n transition = '';\n if (!p.params.animate) transition = 0;\n }\n var nextMonth = parseInt(p.months.eq(p.months.length - 1).attr('data-month'), 10);\n var nextYear = parseInt(p.months.eq(p.months.length - 1).attr('data-year'), 10);\n var nextDate = new Date(nextYear, nextMonth);\n var nextDateTime = nextDate.getTime();\n var transitionEndCallback = p.animating ? false : true;\n if (p.params.maxDate) {\n if (nextDateTime > new Date(p.params.maxDate).getTime()) {\n return p.resetMonth();\n }\n }\n p.monthsTranslate --;\n if (nextMonth === p.currentMonth) {\n var nextMonthTranslate = -(p.monthsTranslate) * 100 * inverter;\n var nextMonthHTML = $(p.monthHTML(nextDateTime, 'next')).transform('translate3d(' + (p.isH ? nextMonthTranslate : 0) + '%, ' + (p.isH ? 0 : nextMonthTranslate) + '%, 0)').addClass('picker-calendar-month-next');\n p.wrapper.append(nextMonthHTML[0]);\n p.months = p.wrapper.find('.picker-calendar-month');\n if (p.params.onMonthAdd) {\n p.params.onMonthAdd(p, p.months.eq(p.months.length - 1)[0]);\n }\n }\n p.animating = true;\n p.onMonthChangeStart('next');\n var translate = (p.monthsTranslate * 100) * inverter;\n\n p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? translate : 0) + '%, ' + (p.isH ? 0 : translate) + '%, 0)');\n if (transitionEndCallback) {\n p.wrapper.transitionEnd(function () {\n p.onMonthChangeEnd('next');\n });\n }\n if (!p.params.animate) {\n p.onMonthChangeEnd('next');\n }\n };\n p.prevMonth = function (transition) {\n if (typeof transition === 'undefined' || typeof transition === 'object') {\n transition = '';\n if (!p.params.animate) transition = 0;\n }\n var prevMonth = parseInt(p.months.eq(0).attr('data-month'), 10);\n var prevYear = parseInt(p.months.eq(0).attr('data-year'), 10);\n var prevDate = new Date(prevYear, prevMonth + 1, -1);\n var prevDateTime = prevDate.getTime();\n var transitionEndCallback = p.animating ? false : true;\n if (p.params.minDate) {\n if (prevDateTime < new Date(p.params.minDate).getTime()) {\n return p.resetMonth();\n }\n }\n p.monthsTranslate ++;\n if (prevMonth === p.currentMonth) {\n var prevMonthTranslate = -(p.monthsTranslate) * 100 * inverter;\n var prevMonthHTML = $(p.monthHTML(prevDateTime, 'prev')).transform('translate3d(' + (p.isH ? prevMonthTranslate : 0) + '%, ' + (p.isH ? 0 : prevMonthTranslate) + '%, 0)').addClass('picker-calendar-month-prev');\n p.wrapper.prepend(prevMonthHTML[0]);\n p.months = p.wrapper.find('.picker-calendar-month');\n if (p.params.onMonthAdd) {\n p.params.onMonthAdd(p, p.months.eq(0)[0]);\n }\n }\n p.animating = true;\n p.onMonthChangeStart('prev');\n var translate = (p.monthsTranslate * 100) * inverter;\n p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? translate : 0) + '%, ' + (p.isH ? 0 : translate) + '%, 0)');\n if (transitionEndCallback) {\n p.wrapper.transitionEnd(function () {\n p.onMonthChangeEnd('prev');\n });\n }\n if (!p.params.animate) {\n p.onMonthChangeEnd('prev');\n }\n };\n p.resetMonth = function (transition) {\n if (typeof transition === 'undefined') transition = '';\n var translate = (p.monthsTranslate * 100) * inverter;\n p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? translate : 0) + '%, ' + (p.isH ? 0 : translate) + '%, 0)');\n };\n p.setYearMonth = function (year, month, transition) {\n if (typeof year === 'undefined') year = p.currentYear;\n if (typeof month === 'undefined') month = p.currentMonth;\n if (typeof transition === 'undefined' || typeof transition === 'object') {\n transition = '';\n if (!p.params.animate) transition = 0;\n }\n var targetDate;\n if (year < p.currentYear) {\n targetDate = new Date(year, month + 1, -1).getTime();\n }\n else {\n targetDate = new Date(year, month).getTime();\n }\n if (p.params.maxDate && targetDate > new Date(p.params.maxDate).getTime()) {\n return false;\n }\n if (p.params.minDate && targetDate < new Date(p.params.minDate).getTime()) {\n return false;\n }\n var currentDate = new Date(p.currentYear, p.currentMonth).getTime();\n var dir = targetDate > currentDate ? 'next' : 'prev';\n var newMonthHTML = p.monthHTML(new Date(year, month));\n p.monthsTranslate = p.monthsTranslate || 0;\n var prevTranslate = p.monthsTranslate;\n var monthTranslate, wrapperTranslate;\n var transitionEndCallback = p.animating ? false : true;\n if (targetDate > currentDate) {\n // To next\n p.monthsTranslate --;\n if (!p.animating) p.months.eq(p.months.length - 1).remove();\n p.wrapper.append(newMonthHTML);\n p.months = p.wrapper.find('.picker-calendar-month');\n monthTranslate = -(prevTranslate - 1) * 100 * inverter;\n p.months.eq(p.months.length - 1).transform('translate3d(' + (p.isH ? monthTranslate : 0) + '%, ' + (p.isH ? 0 : monthTranslate) + '%, 0)').addClass('picker-calendar-month-next');\n }\n else {\n // To prev\n p.monthsTranslate ++;\n if (!p.animating) p.months.eq(0).remove();\n p.wrapper.prepend(newMonthHTML);\n p.months = p.wrapper.find('.picker-calendar-month');\n monthTranslate = -(prevTranslate + 1) * 100 * inverter;\n p.months.eq(0).transform('translate3d(' + (p.isH ? monthTranslate : 0) + '%, ' + (p.isH ? 0 : monthTranslate) + '%, 0)').addClass('picker-calendar-month-prev');\n }\n if (p.params.onMonthAdd) {\n p.params.onMonthAdd(p, dir === 'next' ? p.months.eq(p.months.length - 1)[0] : p.months.eq(0)[0]);\n }\n p.animating = true;\n p.onMonthChangeStart(dir);\n wrapperTranslate = (p.monthsTranslate * 100) * inverter;\n p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? wrapperTranslate : 0) + '%, ' + (p.isH ? 0 : wrapperTranslate) + '%, 0)');\n if (transitionEndCallback) {\n p.wrapper.transitionEnd(function () {\n p.onMonthChangeEnd(dir, true);\n });\n }\n if (!p.params.animate) {\n p.onMonthChangeEnd(dir);\n }\n };\n p.nextYear = function () {\n p.setYearMonth(p.currentYear + 1);\n };\n p.prevYear = function () {\n p.setYearMonth(p.currentYear - 1);\n };\n\n\n // HTML Layout\n p.layout = function () {\n var pickerHTML = '';\n var pickerClass = '';\n var i;\n\n var layoutDate = p.value && p.value.length ? p.value[0] : new Date().setHours(0,0,0,0);\n var prevMonthHTML = p.monthHTML(layoutDate, 'prev');\n var currentMonthHTML = p.monthHTML(layoutDate);\n var nextMonthHTML = p.monthHTML(layoutDate, 'next');\n var monthsHTML = '
' + (prevMonthHTML + currentMonthHTML + nextMonthHTML) + '
';\n // Week days header\n var weekHeaderHTML = '';\n if (p.params.weekHeader) {\n for (i = 0; i < 7; i++) {\n var weekDayIndex = (i + p.params.firstDay > 6) ? (i - 7 + p.params.firstDay) : (i + p.params.firstDay);\n var dayName = p.params.dayNamesShort[weekDayIndex];\n weekHeaderHTML += '
= 0) ? 'picker-calendar-week-day-weekend' : '') + '\"> ' + dayName + '
';\n\n }\n weekHeaderHTML = '
' + weekHeaderHTML + '
';\n }\n pickerClass = 'picker-modal picker-calendar ' + (p.params.cssClass || '');\n var toolbarHTML = p.params.toolbar ? p.params.toolbarTemplate.replace(/{{closeText}}/g, p.params.toolbarCloseText) : '';\n if (p.params.toolbar) {\n toolbarHTML = p.params.toolbarTemplate\n .replace(/{{closeText}}/g, p.params.toolbarCloseText)\n .replace(/{{monthPicker}}/g, (p.params.monthPicker ? p.params.monthPickerTemplate : ''))\n .replace(/{{yearPicker}}/g, (p.params.yearPicker ? p.params.yearPickerTemplate : ''));\n }\n\n pickerHTML =\n '
' +\n toolbarHTML +\n '
' +\n weekHeaderHTML +\n monthsHTML +\n '
' +\n '
';\n\n\n p.pickerHTML = pickerHTML;\n };\n\n // Input Events\n function openOnInput(e) {\n e.preventDefault();\n // 安卓微信webviewreadonly的input依然弹出软键盘问题修复\n if ($.device.isWeixin && $.device.android && p.params.inputReadOnly) {\n /*jshint validthis:true */\n this.focus();\n this.blur();\n }\n if (p.opened) return;\n p.open();\n if (p.params.scrollToInput) {\n var pageContent = p.input.parents('.content');\n if (pageContent.length === 0) return;\n\n var paddingTop = parseInt(pageContent.css('padding-top'), 10),\n paddingBottom = parseInt(pageContent.css('padding-bottom'), 10),\n pageHeight = pageContent[0].offsetHeight - paddingTop - p.container.height(),\n pageScrollHeight = pageContent[0].scrollHeight - paddingTop - p.container.height(),\n newPaddingBottom;\n\n var inputTop = p.input.offset().top - paddingTop + p.input[0].offsetHeight;\n if (inputTop > pageHeight) {\n var scrollTop = pageContent.scrollTop() + inputTop - pageHeight;\n if (scrollTop + pageHeight > pageScrollHeight) {\n newPaddingBottom = scrollTop + pageHeight - pageScrollHeight + paddingBottom;\n if (pageHeight === pageScrollHeight) {\n newPaddingBottom = p.container.height();\n }\n pageContent.css({'padding-bottom': (newPaddingBottom) + 'px'});\n }\n pageContent.scrollTop(scrollTop, 300);\n }\n }\n }\n function closeOnHTMLClick(e) {\n if (p.input && p.input.length > 0) {\n if (e.target !== p.input[0] && $(e.target).parents('.picker-modal').length === 0) p.close();\n }\n else {\n if ($(e.target).parents('.picker-modal').length === 0) p.close();\n }\n }\n\n if (p.params.input) {\n p.input = $(p.params.input);\n if (p.input.length > 0) {\n if (p.params.inputReadOnly) p.input.prop('readOnly', true);\n if (!p.inline) {\n p.input.on('click', openOnInput);\n }\n }\n\n }\n\n if (!p.inline) $('html').on('click', closeOnHTMLClick);\n\n // Open\n function onPickerClose() {\n p.opened = false;\n if (p.input && p.input.length > 0) p.input.parents('.content').css({'padding-bottom': ''});\n if (p.params.onClose) p.params.onClose(p);\n\n // Destroy events\n p.destroyCalendarEvents();\n }\n\n p.opened = false;\n p.open = function () {\n var updateValue = false;\n if (!p.opened) {\n // Set date value\n if (!p.value) {\n if (p.params.value) {\n p.value = p.params.value;\n updateValue = true;\n }\n }\n\n // Layout\n p.layout();\n\n // Append\n if (p.inline) {\n p.container = $(p.pickerHTML);\n p.container.addClass('picker-modal-inline');\n $(p.params.container).append(p.container);\n }\n else {\n p.container = $($.pickerModal(p.pickerHTML));\n $(p.container)\n .on('close', function () {\n onPickerClose();\n });\n }\n\n // Store calendar instance\n p.container[0].f7Calendar = p;\n p.wrapper = p.container.find('.picker-calendar-months-wrapper');\n\n // Months\n p.months = p.wrapper.find('.picker-calendar-month');\n\n // Update current month and year\n p.updateCurrentMonthYear();\n\n // Set initial translate\n p.monthsTranslate = 0;\n p.setMonthsTranslate();\n\n // Init events\n p.initCalendarEvents();\n\n // Update input value\n if (updateValue) p.updateValue();\n\n }\n\n // Set flag\n p.opened = true;\n p.initialized = true;\n if (p.params.onMonthAdd) {\n p.months.each(function () {\n p.params.onMonthAdd(p, this);\n });\n }\n if (p.params.onOpen) p.params.onOpen(p);\n };\n\n // Close\n p.close = function () {\n if (!p.opened || p.inline) return;\n $.closeModal(p.container);\n return;\n };\n\n // Destroy\n p.destroy = function () {\n p.close();\n if (p.params.input && p.input.length > 0) {\n p.input.off('click', openOnInput);\n }\n $('html').off('click', closeOnHTMLClick);\n };\n\n if (p.inline) {\n p.open();\n }\n\n return p;\n };\n $.fn.calendar = function (params) {\n return this.each(function() {\n var $this = $(this);\n if(!$this[0]) return;\n var p = {};\n if($this[0].tagName.toUpperCase() === \"INPUT\") {\n p.input = $this;\n } else {\n p.container = $this;\n }\n new Calendar($.extend(p, params));\n });\n };\n\n $.initCalendar = function(content) {\n var $content = content ? $(content) : $(document.body);\n $content.find(\"[data-toggle='date']\").each(function() {\n $(this).calendar();\n });\n };\n}(Zepto);\n\n/*======================================================\n ************ Picker ************\n ======================================================*/\n/* jshint unused:false */\n/* jshint multistr:true */\n+ function($) {\n \"use strict\";\n var Picker = function (params) {\n var p = this;\n var defaults = {\n updateValuesOnMomentum: false,\n updateValuesOnTouchmove: true,\n rotateEffect: false,\n momentumRatio: 7,\n freeMode: false,\n // Common settings\n scrollToInput: true,\n inputReadOnly: true,\n toolbar: true,\n toolbarCloseText: '确定',\n toolbarTemplate: '
\\\n \\\n

请选择

\\\n
',\n };\n params = params || {};\n for (var def in defaults) {\n if (typeof params[def] === 'undefined') {\n params[def] = defaults[def];\n }\n }\n p.params = params;\n p.cols = [];\n p.initialized = false;\n\n // Inline flag\n p.inline = p.params.container ? true : false;\n\n // 3D Transforms origin bug, only on safari\n var originBug = $.device.ios || (navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && navigator.userAgent.toLowerCase().indexOf('chrome') < 0) && !$.device.android;\n\n // Value\n p.setValue = function (arrValues, transition) {\n var valueIndex = 0;\n for (var i = 0; i < p.cols.length; i++) {\n if (p.cols[i] && !p.cols[i].divider) {\n p.cols[i].setValue(arrValues[valueIndex], transition);\n valueIndex++;\n }\n }\n };\n p.updateValue = function () {\n var newValue = [];\n var newDisplayValue = [];\n for (var i = 0; i < p.cols.length; i++) {\n if (!p.cols[i].divider) {\n newValue.push(p.cols[i].value);\n newDisplayValue.push(p.cols[i].displayValue);\n }\n }\n if (newValue.indexOf(undefined) >= 0) {\n return;\n }\n p.value = newValue;\n p.displayValue = newDisplayValue;\n if (p.params.onChange) {\n p.params.onChange(p, p.value, p.displayValue);\n }\n if (p.input && p.input.length > 0) {\n $(p.input).val(p.params.formatValue ? p.params.formatValue(p, p.value, p.displayValue) : p.value.join(' '));\n $(p.input).trigger('change');\n }\n };\n\n // Columns Handlers\n p.initPickerCol = function (colElement, updateItems) {\n var colContainer = $(colElement);\n var colIndex = colContainer.index();\n var col = p.cols[colIndex];\n if (col.divider) return;\n col.container = colContainer;\n col.wrapper = col.container.find('.picker-items-col-wrapper');\n col.items = col.wrapper.find('.picker-item');\n\n var i, j;\n var wrapperHeight, itemHeight, itemsHeight, minTranslate, maxTranslate;\n col.replaceValues = function (values, displayValues) {\n col.destroyEvents();\n col.values = values;\n col.displayValues = displayValues;\n var newItemsHTML = p.columnHTML(col, true);\n col.wrapper.html(newItemsHTML);\n col.items = col.wrapper.find('.picker-item');\n col.calcSize();\n col.setValue(col.values[0], 0, true);\n col.initEvents();\n };\n col.calcSize = function () {\n if (p.params.rotateEffect) {\n col.container.removeClass('picker-items-col-absolute');\n if (!col.width) col.container.css({width:''});\n }\n var colWidth, colHeight;\n colWidth = 0;\n colHeight = col.container[0].offsetHeight;\n wrapperHeight = col.wrapper[0].offsetHeight;\n itemHeight = col.items[0].offsetHeight;\n itemsHeight = itemHeight * col.items.length;\n minTranslate = colHeight / 2 - itemsHeight + itemHeight / 2;\n maxTranslate = colHeight / 2 - itemHeight / 2;\n if (col.width) {\n colWidth = col.width;\n if (parseInt(colWidth, 10) === colWidth) colWidth = colWidth + 'px';\n col.container.css({width: colWidth});\n }\n if (p.params.rotateEffect) {\n if (!col.width) {\n col.items.each(function () {\n var item = $(this);\n item.css({width:'auto'});\n colWidth = Math.max(colWidth, item[0].offsetWidth);\n item.css({width:''});\n });\n col.container.css({width: (colWidth + 2) + 'px'});\n }\n col.container.addClass('picker-items-col-absolute');\n }\n };\n col.calcSize();\n\n col.wrapper.transform('translate3d(0,' + maxTranslate + 'px,0)').transition(0);\n\n\n var activeIndex = 0;\n var animationFrameId;\n\n // Set Value Function\n col.setValue = function (newValue, transition, valueCallbacks) {\n if (typeof transition === 'undefined') transition = '';\n var newActiveIndex = col.wrapper.find('.picker-item[data-picker-value=\"' + newValue + '\"]').index();\n if(typeof newActiveIndex === 'undefined' || newActiveIndex === -1) {\n return;\n }\n var newTranslate = -newActiveIndex * itemHeight + maxTranslate;\n // Update wrapper\n col.wrapper.transition(transition);\n col.wrapper.transform('translate3d(0,' + (newTranslate) + 'px,0)');\n\n // Watch items\n if (p.params.updateValuesOnMomentum && col.activeIndex && col.activeIndex !== newActiveIndex ) {\n $.cancelAnimationFrame(animationFrameId);\n col.wrapper.transitionEnd(function(){\n $.cancelAnimationFrame(animationFrameId);\n });\n updateDuringScroll();\n }\n\n // Update items\n col.updateItems(newActiveIndex, newTranslate, transition, valueCallbacks);\n };\n\n col.updateItems = function (activeIndex, translate, transition, valueCallbacks) {\n if (typeof translate === 'undefined') {\n translate = $.getTranslate(col.wrapper[0], 'y');\n }\n if(typeof activeIndex === 'undefined') activeIndex = -Math.round((translate - maxTranslate)/itemHeight);\n if (activeIndex < 0) activeIndex = 0;\n if (activeIndex >= col.items.length) activeIndex = col.items.length - 1;\n var previousActiveIndex = col.activeIndex;\n col.activeIndex = activeIndex;\n /*\n col.wrapper.find('.picker-selected, .picker-after-selected, .picker-before-selected').removeClass('picker-selected picker-after-selected picker-before-selected');\n\n col.items.transition(transition);\n var selectedItem = col.items.eq(activeIndex).addClass('picker-selected').transform('');\n var prevItems = selectedItem.prevAll().addClass('picker-before-selected');\n var nextItems = selectedItem.nextAll().addClass('picker-after-selected');\n */\n //去掉 .picker-after-selected, .picker-before-selected 以提高性能\n col.wrapper.find('.picker-selected').removeClass('picker-selected');\n if (p.params.rotateEffect) {\n col.items.transition(transition);\n }\n var selectedItem = col.items.eq(activeIndex).addClass('picker-selected').transform('');\n\n if (valueCallbacks || typeof valueCallbacks === 'undefined') {\n // Update values\n col.value = selectedItem.attr('data-picker-value');\n col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value;\n // On change callback\n if (previousActiveIndex !== activeIndex) {\n if (col.onChange) {\n col.onChange(p, col.value, col.displayValue);\n }\n p.updateValue();\n }\n }\n\n // Set 3D rotate effect\n if (!p.params.rotateEffect) {\n return;\n }\n var percentage = (translate - (Math.floor((translate - maxTranslate)/itemHeight) * itemHeight + maxTranslate)) / itemHeight;\n\n col.items.each(function () {\n var item = $(this);\n var itemOffsetTop = item.index() * itemHeight;\n var translateOffset = maxTranslate - translate;\n var itemOffset = itemOffsetTop - translateOffset;\n var percentage = itemOffset / itemHeight;\n\n var itemsFit = Math.ceil(col.height / itemHeight / 2) + 1;\n\n var angle = (-18*percentage);\n if (angle > 180) angle = 180;\n if (angle < -180) angle = -180;\n // Far class\n if (Math.abs(percentage) > itemsFit) item.addClass('picker-item-far');\n else item.removeClass('picker-item-far');\n // Set transform\n item.transform('translate3d(0, ' + (-translate + maxTranslate) + 'px, ' + (originBug ? -110 : 0) + 'px) rotateX(' + angle + 'deg)');\n });\n };\n\n function updateDuringScroll() {\n animationFrameId = $.requestAnimationFrame(function () {\n col.updateItems(undefined, undefined, 0);\n updateDuringScroll();\n });\n }\n\n // Update items on init\n if (updateItems) col.updateItems(0, maxTranslate, 0);\n\n var allowItemClick = true;\n var isTouched, isMoved, touchStartY, touchCurrentY, touchStartTime, touchEndTime, startTranslate, returnTo, currentTranslate, prevTranslate, velocityTranslate, velocityTime;\n function handleTouchStart (e) {\n if (isMoved || isTouched) return;\n e.preventDefault();\n isTouched = true;\n touchStartY = touchCurrentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n touchStartTime = (new Date()).getTime();\n\n allowItemClick = true;\n startTranslate = currentTranslate = $.getTranslate(col.wrapper[0], 'y');\n }\n function handleTouchMove (e) {\n if (!isTouched) return;\n e.preventDefault();\n allowItemClick = false;\n touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (!isMoved) {\n // First move\n $.cancelAnimationFrame(animationFrameId);\n isMoved = true;\n startTranslate = currentTranslate = $.getTranslate(col.wrapper[0], 'y');\n col.wrapper.transition(0);\n }\n e.preventDefault();\n\n var diff = touchCurrentY - touchStartY;\n currentTranslate = startTranslate + diff;\n returnTo = undefined;\n\n // Normalize translate\n if (currentTranslate < minTranslate) {\n currentTranslate = minTranslate - Math.pow(minTranslate - currentTranslate, 0.8);\n returnTo = 'min';\n }\n if (currentTranslate > maxTranslate) {\n currentTranslate = maxTranslate + Math.pow(currentTranslate - maxTranslate, 0.8);\n returnTo = 'max';\n }\n // Transform wrapper\n col.wrapper.transform('translate3d(0,' + currentTranslate + 'px,0)');\n\n // Update items\n col.updateItems(undefined, currentTranslate, 0, p.params.updateValuesOnTouchmove);\n\n // Calc velocity\n velocityTranslate = currentTranslate - prevTranslate || currentTranslate;\n velocityTime = (new Date()).getTime();\n prevTranslate = currentTranslate;\n }\n function handleTouchEnd (e) {\n if (!isTouched || !isMoved) {\n isTouched = isMoved = false;\n return;\n }\n isTouched = isMoved = false;\n col.wrapper.transition('');\n if (returnTo) {\n if (returnTo === 'min') {\n col.wrapper.transform('translate3d(0,' + minTranslate + 'px,0)');\n }\n else col.wrapper.transform('translate3d(0,' + maxTranslate + 'px,0)');\n }\n touchEndTime = new Date().getTime();\n var velocity, newTranslate;\n if (touchEndTime - touchStartTime > 300) {\n newTranslate = currentTranslate;\n }\n else {\n velocity = Math.abs(velocityTranslate / (touchEndTime - velocityTime));\n newTranslate = currentTranslate + velocityTranslate * p.params.momentumRatio;\n }\n\n newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);\n\n // Active Index\n var activeIndex = -Math.floor((newTranslate - maxTranslate)/itemHeight);\n\n // Normalize translate\n if (!p.params.freeMode) newTranslate = -activeIndex * itemHeight + maxTranslate;\n\n // Transform wrapper\n col.wrapper.transform('translate3d(0,' + (parseInt(newTranslate,10)) + 'px,0)');\n\n // Update items\n col.updateItems(activeIndex, newTranslate, '', true);\n\n // Watch items\n if (p.params.updateValuesOnMomentum) {\n updateDuringScroll();\n col.wrapper.transitionEnd(function(){\n $.cancelAnimationFrame(animationFrameId);\n });\n }\n\n // Allow click\n setTimeout(function () {\n allowItemClick = true;\n }, 100);\n }\n\n function handleClick(e) {\n if (!allowItemClick) return;\n $.cancelAnimationFrame(animationFrameId);\n /*jshint validthis:true */\n var value = $(this).attr('data-picker-value');\n col.setValue(value);\n }\n\n col.initEvents = function (detach) {\n var method = detach ? 'off' : 'on';\n col.container[method]($.touchEvents.start, handleTouchStart);\n col.container[method]($.touchEvents.move, handleTouchMove);\n col.container[method]($.touchEvents.end, handleTouchEnd);\n col.items[method]('click', handleClick);\n };\n col.destroyEvents = function () {\n col.initEvents(true);\n };\n\n col.container[0].f7DestroyPickerCol = function () {\n col.destroyEvents();\n };\n\n col.initEvents();\n\n };\n p.destroyPickerCol = function (colContainer) {\n colContainer = $(colContainer);\n if ('f7DestroyPickerCol' in colContainer[0]) colContainer[0].f7DestroyPickerCol();\n };\n // Resize cols\n function resizeCols() {\n if (!p.opened) return;\n for (var i = 0; i < p.cols.length; i++) {\n if (!p.cols[i].divider) {\n p.cols[i].calcSize();\n p.cols[i].setValue(p.cols[i].value, 0, false);\n }\n }\n }\n $(window).on('resize', resizeCols);\n\n // HTML Layout\n p.columnHTML = function (col, onlyItems) {\n var columnItemsHTML = '';\n var columnHTML = '';\n if (col.divider) {\n columnHTML += '
' + col.content + '
';\n }\n else {\n for (var j = 0; j < col.values.length; j++) {\n columnItemsHTML += '
' + (col.displayValues ? col.displayValues[j] : col.values[j]) + '
';\n }\n\n columnHTML += '
' + columnItemsHTML + '
';\n }\n return onlyItems ? columnItemsHTML : columnHTML;\n };\n p.layout = function () {\n var pickerHTML = '';\n var pickerClass = '';\n var i;\n p.cols = [];\n var colsHTML = '';\n for (i = 0; i < p.params.cols.length; i++) {\n var col = p.params.cols[i];\n colsHTML += p.columnHTML(p.params.cols[i]);\n p.cols.push(col);\n }\n pickerClass = 'picker-modal picker-columns ' + (p.params.cssClass || '') + (p.params.rotateEffect ? ' picker-3d' : '');\n pickerHTML =\n '
' +\n (p.params.toolbar ? p.params.toolbarTemplate.replace(/{{closeText}}/g, p.params.toolbarCloseText) : '') +\n '
' +\n colsHTML +\n '
' +\n '
' +\n '
';\n\n p.pickerHTML = pickerHTML;\n };\n\n // Input Events\n function openOnInput(e) {\n e.preventDefault();\n // 安卓微信webviewreadonly的input依然弹出软键盘问题修复\n if ($.device.isWeixin && $.device.android && p.params.inputReadOnly) {\n /*jshint validthis:true */\n this.focus();\n this.blur();\n }\n if (p.opened) return;\n p.open();\n if (p.params.scrollToInput) {\n var pageContent = p.input.parents('.content');\n if (pageContent.length === 0) return;\n\n var paddingTop = parseInt(pageContent.css('padding-top'), 10),\n paddingBottom = parseInt(pageContent.css('padding-bottom'), 10),\n pageHeight = pageContent[0].offsetHeight - paddingTop - p.container.height(),\n pageScrollHeight = pageContent[0].scrollHeight - paddingTop - p.container.height(),\n newPaddingBottom;\n var inputTop = p.input.offset().top - paddingTop + p.input[0].offsetHeight;\n if (inputTop > pageHeight) {\n var scrollTop = pageContent.scrollTop() + inputTop - pageHeight;\n if (scrollTop + pageHeight > pageScrollHeight) {\n newPaddingBottom = scrollTop + pageHeight - pageScrollHeight + paddingBottom;\n if (pageHeight === pageScrollHeight) {\n newPaddingBottom = p.container.height();\n }\n pageContent.css({'padding-bottom': (newPaddingBottom) + 'px'});\n }\n pageContent.scrollTop(scrollTop, 300);\n }\n }\n }\n function closeOnHTMLClick(e) {\n if (!p.opened) return;\n if (p.input && p.input.length > 0) {\n if (e.target !== p.input[0] && $(e.target).parents('.picker-modal').length === 0) p.close();\n }\n else {\n if ($(e.target).parents('.picker-modal').length === 0) p.close();\n }\n }\n\n if (p.params.input) {\n p.input = $(p.params.input);\n if (p.input.length > 0) {\n if (p.params.inputReadOnly) p.input.prop('readOnly', true);\n if (!p.inline) {\n p.input.on('click', openOnInput);\n }\n }\n }\n\n if (!p.inline) $('html').on('click', closeOnHTMLClick);\n\n // Open\n function onPickerClose() {\n p.opened = false;\n if (p.input && p.input.length > 0) p.input.parents('.content').css({'padding-bottom': ''});\n if (p.params.onClose) p.params.onClose(p);\n\n // Destroy events\n p.container.find('.picker-items-col').each(function () {\n p.destroyPickerCol(this);\n });\n }\n\n p.opened = false;\n p.open = function () {\n if (!p.opened) {\n\n // Layout\n p.layout();\n\n // Append\n if (p.inline) {\n p.container = $(p.pickerHTML);\n p.container.addClass('picker-modal-inline');\n $(p.params.container).append(p.container);\n p.opened = true;\n }\n else {\n p.container = $($.pickerModal(p.pickerHTML));\n $(p.container)\n .one('opened', function() {\n p.opened = true;\n })\n .on('close', function () {\n onPickerClose();\n });\n }\n\n // Store picker instance\n p.container[0].f7Picker = p;\n\n // Init Events\n p.container.find('.picker-items-col').each(function () {\n var updateItems = true;\n if ((!p.initialized && p.params.value) || (p.initialized && p.value)) updateItems = false;\n p.initPickerCol(this, updateItems);\n });\n\n // Set value\n if (!p.initialized) {\n if (p.params.value) {\n p.setValue(p.params.value, 0);\n }\n }\n else {\n if (p.value) p.setValue(p.value, 0);\n }\n }\n\n // Set flag\n p.initialized = true;\n\n if (p.params.onOpen) p.params.onOpen(p);\n };\n\n // Close\n p.close = function () {\n if (!p.opened || p.inline) return;\n $.closeModal(p.container);\n return;\n };\n\n // Destroy\n p.destroy = function () {\n p.close();\n if (p.params.input && p.input.length > 0) {\n p.input.off('click', openOnInput);\n }\n $('html').off('click', closeOnHTMLClick);\n $(window).off('resize', resizeCols);\n };\n\n if (p.inline) {\n p.open();\n }\n\n return p;\n };\n\n $(document).on(\"click\", \".close-picker\", function() {\n var pickerToClose = $('.picker-modal.modal-in');\n $.closeModal(pickerToClose);\n });\n\n $.fn.picker = function(params) {\n var args = arguments;\n return this.each(function() {\n if(!this) return;\n var $this = $(this);\n\n var picker = $this.data(\"picker\");\n if(!picker) {\n var p = $.extend({\n input: this,\n value: $this.val() ? $this.val().split(' ') : ''\n }, params);\n picker = new Picker(p);\n $this.data(\"picker\", picker);\n }\n if(typeof params === typeof \"a\") {\n picker[params].apply(picker, Array.prototype.slice.call(args, 1));\n }\n });\n };\n}(Zepto);\n\n/* jshint unused:false*/\n\n+ function($) {\n \"use strict\";\n\n var today = new Date();\n\n var getDays = function(max) {\n var days = [];\n for(var i=1; i<= (max||31);i++) {\n days.push(i < 10 ? \"0\"+i : i);\n }\n return days;\n };\n\n var getDaysByMonthAndYear = function(month, year) {\n var int_d = new Date(year, parseInt(month)+1-1, 1);\n var d = new Date(int_d - 1);\n return getDays(d.getDate());\n };\n\n var formatNumber = function (n) {\n return n < 10 ? \"0\" + n : n;\n };\n\n var initMonthes = ('01 02 03 04 05 06 07 08 09 10 11 12').split(' ');\n\n var initYears = (function () {\n var arr = [];\n for (var i = 1950; i <= 2030; i++) { arr.push(i); }\n return arr;\n })();\n\n\n var defaults = {\n\n rotateEffect: false, //为了性能\n\n value: [today.getFullYear(), formatNumber(today.getMonth()+1), formatNumber(today.getDate()), today.getHours(), formatNumber(today.getMinutes())],\n\n onChange: function (picker, values, displayValues) {\n var days = getDaysByMonthAndYear(picker.cols[1].value, picker.cols[0].value);\n var currentValue = picker.cols[2].value;\n if(currentValue > days.length) currentValue = days.length;\n picker.cols[2].setValue(currentValue);\n },\n\n formatValue: function (p, values, displayValues) {\n return displayValues[0] + '-' + values[1] + '-' + values[2] + ' ' + values[3] + ':' + values[4];\n },\n\n cols: [\n // Years\n {\n values: initYears\n },\n // Months\n {\n values: initMonthes\n },\n // Days\n {\n values: getDays()\n },\n\n // Space divider\n {\n divider: true,\n content: ' '\n },\n // Hours\n {\n values: (function () {\n var arr = [];\n for (var i = 0; i <= 23; i++) { arr.push(i); }\n return arr;\n })(),\n },\n // Divider\n {\n divider: true,\n content: ':'\n },\n // Minutes\n {\n values: (function () {\n var arr = [];\n for (var i = 0; i <= 59; i++) { arr.push(i < 10 ? '0' + i : i); }\n return arr;\n })(),\n }\n ]\n };\n\n $.fn.datetimePicker = function(params) {\n return this.each(function() {\n if(!this) return;\n var p = $.extend(defaults, params);\n $(this).picker(p);\n if (params.value) $(this).val(p.formatValue(p, p.value, p.value));\n });\n };\n\n}(Zepto);\n\n+ function(window) {\n\n \"use strict\";\n\n var rAF = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback) {\n window.setTimeout(callback, 1000 / 60);\n };\n /*var cRAF = window.cancelRequestAnimationFrame ||\n window.webkitCancelRequestAnimationFrame ||\n window.mozCancelRequestAnimationFrame ||\n window.oCancelRequestAnimationFrame ||\n window.msCancelRequestAnimationFrame;*/\n\n var utils = (function() {\n var me = {};\n\n var _elementStyle = document.createElement('div').style;\n var _vendor = (function() {\n var vendors = ['t', 'webkitT', 'MozT', 'msT', 'OT'],\n transform,\n i = 0,\n l = vendors.length;\n\n for (; i < l; i++) {\n transform = vendors[i] + 'ransform';\n if (transform in _elementStyle) return vendors[i].substr(0, vendors[i].length - 1);\n }\n\n return false;\n })();\n\n function _prefixStyle(style) {\n if (_vendor === false) return false;\n if (_vendor === '') return style;\n return _vendor + style.charAt(0).toUpperCase() + style.substr(1);\n }\n\n me.getTime = Date.now || function getTime() {\n return new Date().getTime();\n };\n\n me.extend = function(target, obj) {\n for (var i in obj) { // jshint ignore:line\n target[i] = obj[i];\n }\n };\n\n me.addEvent = function(el, type, fn, capture) {\n el.addEventListener(type, fn, !!capture);\n };\n\n me.removeEvent = function(el, type, fn, capture) {\n el.removeEventListener(type, fn, !!capture);\n };\n\n me.prefixPointerEvent = function(pointerEvent) {\n return window.MSPointerEvent ?\n 'MSPointer' + pointerEvent.charAt(9).toUpperCase() + pointerEvent.substr(10) :\n pointerEvent;\n };\n\n me.momentum = function(current, start, time, lowerMargin, wrapperSize, deceleration, self) {\n var distance = current - start,\n speed = Math.abs(distance) / time,\n destination,\n duration;\n\n // var absDistance = Math.abs(distance);\n speed = speed / 2; //slowdown\n speed = speed > 1.5 ? 1.5 : speed; //set max speed to 1\n deceleration = deceleration === undefined ? 0.0006 : deceleration;\n\n destination = current + (speed * speed) / (2 * deceleration) * (distance < 0 ? -1 : 1);\n duration = speed / deceleration;\n\n if (destination < lowerMargin) {\n destination = wrapperSize ? lowerMargin - (wrapperSize / 2.5 * (speed / 8)) : lowerMargin;\n distance = Math.abs(destination - current);\n duration = distance / speed;\n } else if (destination > 0) {\n destination = wrapperSize ? wrapperSize / 2.5 * (speed / 8) : 0;\n distance = Math.abs(current) + destination;\n duration = distance / speed;\n }\n\n //simple trigger, every 50ms\n var t = +new Date();\n var l = t;\n\n function eventTrigger() {\n if (+new Date() - l > 50) {\n self._execEvent('scroll');\n l = +new Date();\n }\n if (+new Date() - t < duration) {\n rAF(eventTrigger);\n }\n }\n rAF(eventTrigger);\n\n return {\n destination: Math.round(destination),\n duration: duration\n };\n };\n\n var _transform = _prefixStyle('transform');\n\n me.extend(me, {\n hasTransform: _transform !== false,\n hasPerspective: _prefixStyle('perspective') in _elementStyle,\n hasTouch: 'ontouchstart' in window,\n hasPointer: window.PointerEvent || window.MSPointerEvent, // IE10 is prefixed\n hasTransition: _prefixStyle('transition') in _elementStyle\n });\n\n // This should find all Android browsers lower than build 535.19 (both stock browser and webview)\n me.isBadAndroid = /Android /.test(window.navigator.appVersion) && !(/Chrome\\/\\d/.test(window.navigator.appVersion)) && false; //this will cause many android device scroll flash; so set it to false!\n\n me.extend(me.style = {}, {\n transform: _transform,\n transitionTimingFunction: _prefixStyle('transitionTimingFunction'),\n transitionDuration: _prefixStyle('transitionDuration'),\n transitionDelay: _prefixStyle('transitionDelay'),\n transformOrigin: _prefixStyle('transformOrigin')\n });\n\n me.hasClass = function(e, c) {\n var re = new RegExp('(^|\\\\s)' + c + '(\\\\s|$)');\n return re.test(e.className);\n };\n\n me.addClass = function(e, c) {\n if (me.hasClass(e, c)) {\n return;\n }\n\n var newclass = e.className.split(' ');\n newclass.push(c);\n e.className = newclass.join(' ');\n };\n\n me.removeClass = function(e, c) {\n if (!me.hasClass(e, c)) {\n return;\n }\n\n var re = new RegExp('(^|\\\\s)' + c + '(\\\\s|$)', 'g');\n e.className = e.className.replace(re, ' ');\n };\n\n me.offset = function(el) {\n var left = -el.offsetLeft,\n top = -el.offsetTop;\n\n // jshint -W084\n while (el = el.offsetParent) {\n left -= el.offsetLeft;\n top -= el.offsetTop;\n }\n // jshint +W084\n\n return {\n left: left,\n top: top\n };\n };\n\n me.preventDefaultException = function(el, exceptions) {\n for (var i in exceptions) {\n if (exceptions[i].test(el[i])) {\n return true;\n }\n }\n\n return false;\n };\n\n me.extend(me.eventType = {}, {\n touchstart: 1,\n touchmove: 1,\n touchend: 1,\n\n mousedown: 2,\n mousemove: 2,\n mouseup: 2,\n\n pointerdown: 3,\n pointermove: 3,\n pointerup: 3,\n\n MSPointerDown: 3,\n MSPointerMove: 3,\n MSPointerUp: 3\n });\n\n me.extend(me.ease = {}, {\n quadratic: {\n style: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n fn: function(k) {\n return k * (2 - k);\n }\n },\n circular: {\n style: 'cubic-bezier(0.1, 0.57, 0.1, 1)', // Not properly 'circular' but this looks better, it should be (0.075, 0.82, 0.165, 1)\n fn: function(k) {\n return Math.sqrt(1 - (--k * k));\n }\n },\n back: {\n style: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',\n fn: function(k) {\n var b = 4;\n return (k = k - 1) * k * ((b + 1) * k + b) + 1;\n }\n },\n bounce: {\n style: '',\n fn: function(k) {\n if ((k /= 1) < (1 / 2.75)) {\n return 7.5625 * k * k;\n } else if (k < (2 / 2.75)) {\n return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75;\n } else if (k < (2.5 / 2.75)) {\n return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375;\n } else {\n return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375;\n }\n }\n },\n elastic: {\n style: '',\n fn: function(k) {\n var f = 0.22,\n e = 0.4;\n\n if (k === 0) {\n return 0;\n }\n if (k === 1) {\n return 1;\n }\n\n return (e * Math.pow(2, -10 * k) * Math.sin((k - f / 4) * (2 * Math.PI) / f) + 1);\n }\n }\n });\n\n me.tap = function(e, eventName) {\n var ev = document.createEvent('Event');\n ev.initEvent(eventName, true, true);\n ev.pageX = e.pageX;\n ev.pageY = e.pageY;\n e.target.dispatchEvent(ev);\n };\n\n me.click = function(e) {\n var target = e.target,\n ev;\n\n if (!(/(SELECT|INPUT|TEXTAREA)/i).test(target.tagName)) {\n ev = document.createEvent('MouseEvents');\n ev.initMouseEvent('click', true, true, e.view, 1,\n target.screenX, target.screenY, target.clientX, target.clientY,\n e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,\n 0, null);\n\n ev._constructed = true;\n target.dispatchEvent(ev);\n }\n };\n\n return me;\n })();\n\n function IScroll(el, options) {\n this.wrapper = typeof el === 'string' ? document.querySelector(el) : el;\n this.scroller = $(this.wrapper).find('.content-inner')[0]; // jshint ignore:line\n\n\n this.scrollerStyle = this.scroller&&this.scroller.style; // cache style for better performance\n\n this.options = {\n\n resizeScrollbars: true,\n\n mouseWheelSpeed: 20,\n\n snapThreshold: 0.334,\n\n // INSERT POINT: OPTIONS\n\n startX: 0,\n startY: 0,\n scrollY: true,\n directionLockThreshold: 5,\n momentum: true,\n\n bounce: true,\n bounceTime: 600,\n bounceEasing: '',\n\n preventDefault: true,\n preventDefaultException: {\n tagName: /^(INPUT|TEXTAREA|BUTTON|SELECT)$/\n },\n\n HWCompositing: true,\n useTransition: true,\n useTransform: true,\n\n //other options\n eventPassthrough: undefined, //if you want to use native scroll, you can set to: true or horizontal\n };\n\n for (var i in options) {\n this.options[i] = options[i];\n }\n\n // Normalize options\n this.translateZ = this.options.HWCompositing && utils.hasPerspective ? ' translateZ(0)' : '';\n\n this.options.useTransition = utils.hasTransition && this.options.useTransition;\n this.options.useTransform = utils.hasTransform && this.options.useTransform;\n\n this.options.eventPassthrough = this.options.eventPassthrough === true ? 'vertical' : this.options.eventPassthrough;\n this.options.preventDefault = !this.options.eventPassthrough && this.options.preventDefault;\n\n // If you want eventPassthrough I have to lock one of the axes\n this.options.scrollY = this.options.eventPassthrough === 'vertical' ? false : this.options.scrollY;\n this.options.scrollX = this.options.eventPassthrough === 'horizontal' ? false : this.options.scrollX;\n\n // With eventPassthrough we also need lockDirection mechanism\n this.options.freeScroll = this.options.freeScroll && !this.options.eventPassthrough;\n this.options.directionLockThreshold = this.options.eventPassthrough ? 0 : this.options.directionLockThreshold;\n\n this.options.bounceEasing = typeof this.options.bounceEasing === 'string' ? utils.ease[this.options.bounceEasing] || utils.ease.circular : this.options.bounceEasing;\n\n this.options.resizePolling = this.options.resizePolling === undefined ? 60 : this.options.resizePolling;\n\n if (this.options.tap === true) {\n this.options.tap = 'tap';\n }\n\n if (this.options.shrinkScrollbars === 'scale') {\n this.options.useTransition = false;\n }\n\n this.options.invertWheelDirection = this.options.invertWheelDirection ? -1 : 1;\n\n if (this.options.probeType === 3) {\n this.options.useTransition = false;\n }\n\n // INSERT POINT: NORMALIZATION\n\n // Some defaults\n this.x = 0;\n this.y = 0;\n this.directionX = 0;\n this.directionY = 0;\n this._events = {};\n\n // INSERT POINT: DEFAULTS\n\n this._init();\n this.refresh();\n\n this.scrollTo(this.options.startX, this.options.startY);\n this.enable();\n }\n\n IScroll.prototype = {\n version: '5.1.3',\n\n _init: function() {\n this._initEvents();\n\n if (this.options.scrollbars || this.options.indicators) {\n this._initIndicators();\n }\n\n if (this.options.mouseWheel) {\n this._initWheel();\n }\n\n if (this.options.snap) {\n this._initSnap();\n }\n\n if (this.options.keyBindings) {\n this._initKeys();\n }\n\n // INSERT POINT: _init\n\n },\n\n destroy: function() {\n this._initEvents(true);\n\n this._execEvent('destroy');\n },\n\n _transitionEnd: function(e) {\n if (e.target !== this.scroller || !this.isInTransition) {\n return;\n }\n\n this._transitionTime();\n if (!this.resetPosition(this.options.bounceTime)) {\n this.isInTransition = false;\n this._execEvent('scrollEnd');\n }\n },\n\n _start: function(e) {\n // React to left mouse button only\n if (utils.eventType[e.type] !== 1) {\n if (e.button !== 0) {\n return;\n }\n }\n\n if (!this.enabled || (this.initiated && utils.eventType[e.type] !== this.initiated)) {\n return;\n }\n\n if (this.options.preventDefault && !utils.isBadAndroid && !utils.preventDefaultException(e.target, this.options.preventDefaultException)) {\n e.preventDefault();\n }\n\n var point = e.touches ? e.touches[0] : e,\n pos;\n\n this.initiated = utils.eventType[e.type];\n this.moved = false;\n this.distX = 0;\n this.distY = 0;\n this.directionX = 0;\n this.directionY = 0;\n this.directionLocked = 0;\n\n this._transitionTime();\n\n this.startTime = utils.getTime();\n\n if (this.options.useTransition && this.isInTransition) {\n this.isInTransition = false;\n pos = this.getComputedPosition();\n this._translate(Math.round(pos.x), Math.round(pos.y));\n this._execEvent('scrollEnd');\n } else if (!this.options.useTransition && this.isAnimating) {\n this.isAnimating = false;\n this._execEvent('scrollEnd');\n }\n\n this.startX = this.x;\n this.startY = this.y;\n this.absStartX = this.x;\n this.absStartY = this.y;\n this.pointX = point.pageX;\n this.pointY = point.pageY;\n\n this._execEvent('beforeScrollStart');\n },\n\n _move: function(e) {\n if (!this.enabled || utils.eventType[e.type] !== this.initiated) {\n return;\n }\n\n if (this.options.preventDefault) { // increases performance on Android? TODO: check!\n e.preventDefault();\n }\n\n var point = e.touches ? e.touches[0] : e,\n deltaX = point.pageX - this.pointX,\n deltaY = point.pageY - this.pointY,\n timestamp = utils.getTime(),\n newX, newY,\n absDistX, absDistY;\n\n this.pointX = point.pageX;\n this.pointY = point.pageY;\n\n this.distX += deltaX;\n this.distY += deltaY;\n absDistX = Math.abs(this.distX);\n absDistY = Math.abs(this.distY);\n\n // We need to move at least 10 pixels for the scrolling to initiate\n if (timestamp - this.endTime > 300 && (absDistX < 10 && absDistY < 10)) {\n return;\n }\n\n // If you are scrolling in one direction lock the other\n if (!this.directionLocked && !this.options.freeScroll) {\n if (absDistX > absDistY + this.options.directionLockThreshold) {\n this.directionLocked = 'h'; // lock horizontally\n } else if (absDistY >= absDistX + this.options.directionLockThreshold) {\n this.directionLocked = 'v'; // lock vertically\n } else {\n this.directionLocked = 'n'; // no lock\n }\n }\n\n if (this.directionLocked === 'h') {\n if (this.options.eventPassthrough === 'vertical') {\n e.preventDefault();\n } else if (this.options.eventPassthrough === 'horizontal') {\n this.initiated = false;\n return;\n }\n\n deltaY = 0;\n } else if (this.directionLocked === 'v') {\n if (this.options.eventPassthrough === 'horizontal') {\n e.preventDefault();\n } else if (this.options.eventPassthrough === 'vertical') {\n this.initiated = false;\n return;\n }\n\n deltaX = 0;\n }\n\n deltaX = this.hasHorizontalScroll ? deltaX : 0;\n deltaY = this.hasVerticalScroll ? deltaY : 0;\n\n newX = this.x + deltaX;\n newY = this.y + deltaY;\n\n // Slow down if outside of the boundaries\n if (newX > 0 || newX < this.maxScrollX) {\n newX = this.options.bounce ? this.x + deltaX / 3 : newX > 0 ? 0 : this.maxScrollX;\n }\n if (newY > 0 || newY < this.maxScrollY) {\n newY = this.options.bounce ? this.y + deltaY / 3 : newY > 0 ? 0 : this.maxScrollY;\n }\n\n this.directionX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0;\n this.directionY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0;\n\n if (!this.moved) {\n this._execEvent('scrollStart');\n }\n\n this.moved = true;\n\n this._translate(newX, newY);\n\n /* REPLACE START: _move */\n if (timestamp - this.startTime > 300) {\n this.startTime = timestamp;\n this.startX = this.x;\n this.startY = this.y;\n\n if (this.options.probeType === 1) {\n this._execEvent('scroll');\n }\n }\n\n if (this.options.probeType > 1) {\n this._execEvent('scroll');\n }\n /* REPLACE END: _move */\n\n },\n\n _end: function(e) {\n if (!this.enabled || utils.eventType[e.type] !== this.initiated) {\n return;\n }\n\n if (this.options.preventDefault && !utils.preventDefaultException(e.target, this.options.preventDefaultException)) {\n e.preventDefault();\n }\n\n var /*point = e.changedTouches ? e.changedTouches[0] : e,*/\n momentumX,\n momentumY,\n duration = utils.getTime() - this.startTime,\n newX = Math.round(this.x),\n newY = Math.round(this.y),\n distanceX = Math.abs(newX - this.startX),\n distanceY = Math.abs(newY - this.startY),\n time = 0,\n easing = '';\n\n this.isInTransition = 0;\n this.initiated = 0;\n this.endTime = utils.getTime();\n\n // reset if we are outside of the boundaries\n if (this.resetPosition(this.options.bounceTime)) {\n return;\n }\n\n this.scrollTo(newX, newY); // ensures that the last position is rounded\n\n // we scrolled less than 10 pixels\n if (!this.moved) {\n if (this.options.tap) {\n utils.tap(e, this.options.tap);\n }\n\n if (this.options.click) {\n utils.click(e);\n }\n\n this._execEvent('scrollCancel');\n return;\n }\n\n if (this._events.flick && duration < 200 && distanceX < 100 && distanceY < 100) {\n this._execEvent('flick');\n return;\n }\n\n // start momentum animation if needed\n if (this.options.momentum && duration < 300) {\n momentumX = this.hasHorizontalScroll ? utils.momentum(this.x, this.startX, duration, this.maxScrollX, this.options.bounce ? this.wrapperWidth : 0, this.options.deceleration, this) : {\n destination: newX,\n duration: 0\n };\n momentumY = this.hasVerticalScroll ? utils.momentum(this.y, this.startY, duration, this.maxScrollY, this.options.bounce ? this.wrapperHeight : 0, this.options.deceleration, this) : {\n destination: newY,\n duration: 0\n };\n newX = momentumX.destination;\n newY = momentumY.destination;\n time = Math.max(momentumX.duration, momentumY.duration);\n this.isInTransition = 1;\n }\n\n\n if (this.options.snap) {\n var snap = this._nearestSnap(newX, newY);\n this.currentPage = snap;\n time = this.options.snapSpeed || Math.max(\n Math.max(\n Math.min(Math.abs(newX - snap.x), 1000),\n Math.min(Math.abs(newY - snap.y), 1000)\n ), 300);\n newX = snap.x;\n newY = snap.y;\n\n this.directionX = 0;\n this.directionY = 0;\n easing = this.options.bounceEasing;\n }\n\n // INSERT POINT: _end\n\n if (newX !== this.x || newY !== this.y) {\n // change easing function when scroller goes out of the boundaries\n if (newX > 0 || newX < this.maxScrollX || newY > 0 || newY < this.maxScrollY) {\n easing = utils.ease.quadratic;\n }\n\n this.scrollTo(newX, newY, time, easing);\n return;\n }\n\n this._execEvent('scrollEnd');\n },\n\n _resize: function() {\n var that = this;\n\n clearTimeout(this.resizeTimeout);\n\n this.resizeTimeout = setTimeout(function() {\n that.refresh();\n }, this.options.resizePolling);\n },\n\n resetPosition: function(time) {\n var x = this.x,\n y = this.y;\n\n time = time || 0;\n\n if (!this.hasHorizontalScroll || this.x > 0) {\n x = 0;\n } else if (this.x < this.maxScrollX) {\n x = this.maxScrollX;\n }\n\n if (!this.hasVerticalScroll || this.y > 0) {\n y = 0;\n } else if (this.y < this.maxScrollY) {\n y = this.maxScrollY;\n }\n\n if (x === this.x && y === this.y) {\n return false;\n }\n\n if (this.options.ptr && this.y > 44 && this.startY * -1 < $(window).height() && !this.ptrLock) {// jshint ignore:line\n // not trigger ptr when user want to scroll to top\n y = this.options.ptrOffset || 44;\n this._execEvent('ptr');\n // 防止返回的过程中再次触发了 ptr ,导致被定位到 44px(因为可能done事件触发很快,在返回到44px以前就触发done\n this.ptrLock = true;\n var self = this;\n setTimeout(function() {\n self.ptrLock = false;\n }, 500);\n }\n\n this.scrollTo(x, y, time, this.options.bounceEasing);\n\n return true;\n },\n\n disable: function() {\n this.enabled = false;\n },\n\n enable: function() {\n this.enabled = true;\n },\n\n refresh: function() {\n // var rf = this.wrapper.offsetHeight; // Force reflow\n\n this.wrapperWidth = this.wrapper.clientWidth;\n this.wrapperHeight = this.wrapper.clientHeight;\n\n /* REPLACE START: refresh */\n\n this.scrollerWidth = this.scroller.offsetWidth;\n this.scrollerHeight = this.scroller.offsetHeight;\n\n this.maxScrollX = this.wrapperWidth - this.scrollerWidth;\n this.maxScrollY = this.wrapperHeight - this.scrollerHeight;\n\n /* REPLACE END: refresh */\n\n this.hasHorizontalScroll = this.options.scrollX && this.maxScrollX < 0;\n this.hasVerticalScroll = this.options.scrollY && this.maxScrollY < 0;\n\n if (!this.hasHorizontalScroll) {\n this.maxScrollX = 0;\n this.scrollerWidth = this.wrapperWidth;\n }\n\n if (!this.hasVerticalScroll) {\n this.maxScrollY = 0;\n this.scrollerHeight = this.wrapperHeight;\n }\n\n this.endTime = 0;\n this.directionX = 0;\n this.directionY = 0;\n\n this.wrapperOffset = utils.offset(this.wrapper);\n\n this._execEvent('refresh');\n\n this.resetPosition();\n\n // INSERT POINT: _refresh\n\n },\n\n on: function(type, fn) {\n if (!this._events[type]) {\n this._events[type] = [];\n }\n\n this._events[type].push(fn);\n },\n\n off: function(type, fn) {\n if (!this._events[type]) {\n return;\n }\n\n var index = this._events[type].indexOf(fn);\n\n if (index > -1) {\n this._events[type].splice(index, 1);\n }\n },\n\n _execEvent: function(type) {\n if (!this._events[type]) {\n return;\n }\n\n var i = 0,\n l = this._events[type].length;\n\n if (!l) {\n return;\n }\n\n for (; i < l; i++) {\n this._events[type][i].apply(this, [].slice.call(arguments, 1));\n }\n },\n\n scrollBy: function(x, y, time, easing) {\n x = this.x + x;\n y = this.y + y;\n time = time || 0;\n\n this.scrollTo(x, y, time, easing);\n },\n\n scrollTo: function(x, y, time, easing) {\n easing = easing || utils.ease.circular;\n\n this.isInTransition = this.options.useTransition && time > 0;\n\n if (!time || (this.options.useTransition && easing.style)) {\n this._transitionTimingFunction(easing.style);\n this._transitionTime(time);\n this._translate(x, y);\n } else {\n this._animate(x, y, time, easing.fn);\n }\n },\n\n scrollToElement: function(el, time, offsetX, offsetY, easing) {\n el = el.nodeType ? el : this.scroller.querySelector(el);\n\n if (!el) {\n return;\n }\n\n var pos = utils.offset(el);\n\n pos.left -= this.wrapperOffset.left;\n pos.top -= this.wrapperOffset.top;\n\n // if offsetX/Y are true we center the element to the screen\n if (offsetX === true) {\n offsetX = Math.round(el.offsetWidth / 2 - this.wrapper.offsetWidth / 2);\n }\n if (offsetY === true) {\n offsetY = Math.round(el.offsetHeight / 2 - this.wrapper.offsetHeight / 2);\n }\n\n pos.left -= offsetX || 0;\n pos.top -= offsetY || 0;\n\n pos.left = pos.left > 0 ? 0 : pos.left < this.maxScrollX ? this.maxScrollX : pos.left;\n pos.top = pos.top > 0 ? 0 : pos.top < this.maxScrollY ? this.maxScrollY : pos.top;\n\n time = time === undefined || time === null || time === 'auto' ? Math.max(Math.abs(this.x - pos.left), Math.abs(this.y - pos.top)) : time;\n\n this.scrollTo(pos.left, pos.top, time, easing);\n },\n\n _transitionTime: function(time) {\n time = time || 0;\n\n this.scrollerStyle[utils.style.transitionDuration] = time + 'ms';\n\n if (!time && utils.isBadAndroid) {\n this.scrollerStyle[utils.style.transitionDuration] = '0.001s';\n }\n\n\n if (this.indicators) {\n for (var i = this.indicators.length; i--;) {\n this.indicators[i].transitionTime(time);\n }\n }\n\n\n // INSERT POINT: _transitionTime\n\n },\n\n _transitionTimingFunction: function(easing) {\n this.scrollerStyle[utils.style.transitionTimingFunction] = easing;\n\n\n if (this.indicators) {\n for (var i = this.indicators.length; i--;) {\n this.indicators[i].transitionTimingFunction(easing);\n }\n }\n\n\n // INSERT POINT: _transitionTimingFunction\n\n },\n\n _translate: function(x, y) {\n if (this.options.useTransform) {\n\n /* REPLACE START: _translate */\n\n this.scrollerStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.translateZ;\n\n /* REPLACE END: _translate */\n\n } else {\n x = Math.round(x);\n y = Math.round(y);\n this.scrollerStyle.left = x + 'px';\n this.scrollerStyle.top = y + 'px';\n }\n\n this.x = x;\n this.y = y;\n\n\n if (this.indicators) {\n for (var i = this.indicators.length; i--;) {\n this.indicators[i].updatePosition();\n }\n }\n\n\n // INSERT POINT: _translate\n\n },\n\n _initEvents: function(remove) {\n var eventType = remove ? utils.removeEvent : utils.addEvent,\n target = this.options.bindToWrapper ? this.wrapper : window;\n\n eventType(window, 'orientationchange', this);\n eventType(window, 'resize', this);\n\n if (this.options.click) {\n eventType(this.wrapper, 'click', this, true);\n }\n\n if (!this.options.disableMouse) {\n eventType(this.wrapper, 'mousedown', this);\n eventType(target, 'mousemove', this);\n eventType(target, 'mousecancel', this);\n eventType(target, 'mouseup', this);\n }\n\n if (utils.hasPointer && !this.options.disablePointer) {\n eventType(this.wrapper, utils.prefixPointerEvent('pointerdown'), this);\n eventType(target, utils.prefixPointerEvent('pointermove'), this);\n eventType(target, utils.prefixPointerEvent('pointercancel'), this);\n eventType(target, utils.prefixPointerEvent('pointerup'), this);\n }\n\n if (utils.hasTouch && !this.options.disableTouch) {\n eventType(this.wrapper, 'touchstart', this);\n eventType(target, 'touchmove', this);\n eventType(target, 'touchcancel', this);\n eventType(target, 'touchend', this);\n }\n\n eventType(this.scroller, 'transitionend', this);\n eventType(this.scroller, 'webkitTransitionEnd', this);\n eventType(this.scroller, 'oTransitionEnd', this);\n eventType(this.scroller, 'MSTransitionEnd', this);\n },\n\n getComputedPosition: function() {\n var matrix = window.getComputedStyle(this.scroller, null),\n x, y;\n\n if (this.options.useTransform) {\n matrix = matrix[utils.style.transform].split(')')[0].split(', ');\n x = +(matrix[12] || matrix[4]);\n y = +(matrix[13] || matrix[5]);\n } else {\n x = +matrix.left.replace(/[^-\\d.]/g, '');\n y = +matrix.top.replace(/[^-\\d.]/g, '');\n }\n\n return {\n x: x,\n y: y\n };\n },\n\n _initIndicators: function() {\n var interactive = this.options.interactiveScrollbars,\n customStyle = typeof this.options.scrollbars !== 'string',\n indicators = [],\n indicator;\n\n var that = this;\n\n this.indicators = [];\n\n if (this.options.scrollbars) {\n // Vertical scrollbar\n if (this.options.scrollY) {\n indicator = {\n el: createDefaultScrollbar('v', interactive, this.options.scrollbars),\n interactive: interactive,\n defaultScrollbars: true,\n customStyle: customStyle,\n resize: this.options.resizeScrollbars,\n shrink: this.options.shrinkScrollbars,\n fade: this.options.fadeScrollbars,\n listenX: false\n };\n\n this.wrapper.appendChild(indicator.el);\n indicators.push(indicator);\n }\n\n // Horizontal scrollbar\n if (this.options.scrollX) {\n indicator = {\n el: createDefaultScrollbar('h', interactive, this.options.scrollbars),\n interactive: interactive,\n defaultScrollbars: true,\n customStyle: customStyle,\n resize: this.options.resizeScrollbars,\n shrink: this.options.shrinkScrollbars,\n fade: this.options.fadeScrollbars,\n listenY: false\n };\n\n this.wrapper.appendChild(indicator.el);\n indicators.push(indicator);\n }\n }\n\n if (this.options.indicators) {\n // TODO: check concat compatibility\n indicators = indicators.concat(this.options.indicators);\n }\n\n for (var i = indicators.length; i--;) {\n this.indicators.push(new Indicator(this, indicators[i]));\n }\n\n // TODO: check if we can use array.map (wide compatibility and performance issues)\n function _indicatorsMap(fn) {\n for (var i = that.indicators.length; i--;) {\n fn.call(that.indicators[i]);\n }\n }\n\n if (this.options.fadeScrollbars) {\n this.on('scrollEnd', function() {\n _indicatorsMap(function() {\n this.fade();\n });\n });\n\n this.on('scrollCancel', function() {\n _indicatorsMap(function() {\n this.fade();\n });\n });\n\n this.on('scrollStart', function() {\n _indicatorsMap(function() {\n this.fade(1);\n });\n });\n\n this.on('beforeScrollStart', function() {\n _indicatorsMap(function() {\n this.fade(1, true);\n });\n });\n }\n\n\n this.on('refresh', function() {\n _indicatorsMap(function() {\n this.refresh();\n });\n });\n\n this.on('destroy', function() {\n _indicatorsMap(function() {\n this.destroy();\n });\n\n delete this.indicators;\n });\n },\n\n _initWheel: function() {\n utils.addEvent(this.wrapper, 'wheel', this);\n utils.addEvent(this.wrapper, 'mousewheel', this);\n utils.addEvent(this.wrapper, 'DOMMouseScroll', this);\n\n this.on('destroy', function() {\n utils.removeEvent(this.wrapper, 'wheel', this);\n utils.removeEvent(this.wrapper, 'mousewheel', this);\n utils.removeEvent(this.wrapper, 'DOMMouseScroll', this);\n });\n },\n\n _wheel: function(e) {\n if (!this.enabled) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n var wheelDeltaX, wheelDeltaY,\n newX, newY,\n that = this;\n\n if (this.wheelTimeout === undefined) {\n that._execEvent('scrollStart');\n }\n\n // Execute the scrollEnd event after 400ms the wheel stopped scrolling\n clearTimeout(this.wheelTimeout);\n this.wheelTimeout = setTimeout(function() {\n that._execEvent('scrollEnd');\n that.wheelTimeout = undefined;\n }, 400);\n\n if ('deltaX' in e) {\n if (e.deltaMode === 1) {\n wheelDeltaX = -e.deltaX * this.options.mouseWheelSpeed;\n wheelDeltaY = -e.deltaY * this.options.mouseWheelSpeed;\n } else {\n wheelDeltaX = -e.deltaX;\n wheelDeltaY = -e.deltaY;\n }\n } else if ('wheelDeltaX' in e) {\n wheelDeltaX = e.wheelDeltaX / 120 * this.options.mouseWheelSpeed;\n wheelDeltaY = e.wheelDeltaY / 120 * this.options.mouseWheelSpeed;\n } else if ('wheelDelta' in e) {\n wheelDeltaX = wheelDeltaY = e.wheelDelta / 120 * this.options.mouseWheelSpeed;\n } else if ('detail' in e) {\n wheelDeltaX = wheelDeltaY = -e.detail / 3 * this.options.mouseWheelSpeed;\n } else {\n return;\n }\n\n wheelDeltaX *= this.options.invertWheelDirection;\n wheelDeltaY *= this.options.invertWheelDirection;\n\n if (!this.hasVerticalScroll) {\n wheelDeltaX = wheelDeltaY;\n wheelDeltaY = 0;\n }\n\n if (this.options.snap) {\n newX = this.currentPage.pageX;\n newY = this.currentPage.pageY;\n\n if (wheelDeltaX > 0) {\n newX--;\n } else if (wheelDeltaX < 0) {\n newX++;\n }\n\n if (wheelDeltaY > 0) {\n newY--;\n } else if (wheelDeltaY < 0) {\n newY++;\n }\n\n this.goToPage(newX, newY);\n\n return;\n }\n\n newX = this.x + Math.round(this.hasHorizontalScroll ? wheelDeltaX : 0);\n newY = this.y + Math.round(this.hasVerticalScroll ? wheelDeltaY : 0);\n\n if (newX > 0) {\n newX = 0;\n } else if (newX < this.maxScrollX) {\n newX = this.maxScrollX;\n }\n\n if (newY > 0) {\n newY = 0;\n } else if (newY < this.maxScrollY) {\n newY = this.maxScrollY;\n }\n\n this.scrollTo(newX, newY, 0);\n\n this._execEvent('scroll');\n\n // INSERT POINT: _wheel\n },\n\n _initSnap: function() {\n this.currentPage = {};\n\n if (typeof this.options.snap === 'string') {\n this.options.snap = this.scroller.querySelectorAll(this.options.snap);\n }\n\n this.on('refresh', function() {\n var i = 0,\n l,\n m = 0,\n n,\n cx, cy,\n x = 0,\n y,\n stepX = this.options.snapStepX || this.wrapperWidth,\n stepY = this.options.snapStepY || this.wrapperHeight,\n el;\n\n this.pages = [];\n\n if (!this.wrapperWidth || !this.wrapperHeight || !this.scrollerWidth || !this.scrollerHeight) {\n return;\n }\n\n if (this.options.snap === true) {\n cx = Math.round(stepX / 2);\n cy = Math.round(stepY / 2);\n\n while (x > -this.scrollerWidth) {\n this.pages[i] = [];\n l = 0;\n y = 0;\n\n while (y > -this.scrollerHeight) {\n this.pages[i][l] = {\n x: Math.max(x, this.maxScrollX),\n y: Math.max(y, this.maxScrollY),\n width: stepX,\n height: stepY,\n cx: x - cx,\n cy: y - cy\n };\n\n y -= stepY;\n l++;\n }\n\n x -= stepX;\n i++;\n }\n } else {\n el = this.options.snap;\n l = el.length;\n n = -1;\n\n for (; i < l; i++) {\n if (i === 0 || el[i].offsetLeft <= el[i - 1].offsetLeft) {\n m = 0;\n n++;\n }\n\n if (!this.pages[m]) {\n this.pages[m] = [];\n }\n\n x = Math.max(-el[i].offsetLeft, this.maxScrollX);\n y = Math.max(-el[i].offsetTop, this.maxScrollY);\n cx = x - Math.round(el[i].offsetWidth / 2);\n cy = y - Math.round(el[i].offsetHeight / 2);\n\n this.pages[m][n] = {\n x: x,\n y: y,\n width: el[i].offsetWidth,\n height: el[i].offsetHeight,\n cx: cx,\n cy: cy\n };\n\n if (x > this.maxScrollX) {\n m++;\n }\n }\n }\n\n this.goToPage(this.currentPage.pageX || 0, this.currentPage.pageY || 0, 0);\n\n // Update snap threshold if needed\n if (this.options.snapThreshold % 1 === 0) {\n this.snapThresholdX = this.options.snapThreshold;\n this.snapThresholdY = this.options.snapThreshold;\n } else {\n this.snapThresholdX = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].width * this.options.snapThreshold);\n this.snapThresholdY = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].height * this.options.snapThreshold);\n }\n });\n\n this.on('flick', function() {\n var time = this.options.snapSpeed || Math.max(\n Math.max(\n Math.min(Math.abs(this.x - this.startX), 1000),\n Math.min(Math.abs(this.y - this.startY), 1000)\n ), 300);\n\n this.goToPage(\n this.currentPage.pageX + this.directionX,\n this.currentPage.pageY + this.directionY,\n time\n );\n });\n },\n\n _nearestSnap: function(x, y) {\n if (!this.pages.length) {\n return {\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0\n };\n }\n\n var i = 0,\n l = this.pages.length,\n m = 0;\n\n // Check if we exceeded the snap threshold\n if (Math.abs(x - this.absStartX) < this.snapThresholdX &&\n Math.abs(y - this.absStartY) < this.snapThresholdY) {\n return this.currentPage;\n }\n\n if (x > 0) {\n x = 0;\n } else if (x < this.maxScrollX) {\n x = this.maxScrollX;\n }\n\n if (y > 0) {\n y = 0;\n } else if (y < this.maxScrollY) {\n y = this.maxScrollY;\n }\n\n for (; i < l; i++) {\n if (x >= this.pages[i][0].cx) {\n x = this.pages[i][0].x;\n break;\n }\n }\n\n l = this.pages[i].length;\n\n for (; m < l; m++) {\n if (y >= this.pages[0][m].cy) {\n y = this.pages[0][m].y;\n break;\n }\n }\n\n if (i === this.currentPage.pageX) {\n i += this.directionX;\n\n if (i < 0) {\n i = 0;\n } else if (i >= this.pages.length) {\n i = this.pages.length - 1;\n }\n\n x = this.pages[i][0].x;\n }\n\n if (m === this.currentPage.pageY) {\n m += this.directionY;\n\n if (m < 0) {\n m = 0;\n } else if (m >= this.pages[0].length) {\n m = this.pages[0].length - 1;\n }\n\n y = this.pages[0][m].y;\n }\n\n return {\n x: x,\n y: y,\n pageX: i,\n pageY: m\n };\n },\n\n goToPage: function(x, y, time, easing) {\n easing = easing || this.options.bounceEasing;\n\n if (x >= this.pages.length) {\n x = this.pages.length - 1;\n } else if (x < 0) {\n x = 0;\n }\n\n if (y >= this.pages[x].length) {\n y = this.pages[x].length - 1;\n } else if (y < 0) {\n y = 0;\n }\n\n var posX = this.pages[x][y].x,\n posY = this.pages[x][y].y;\n\n time = time === undefined ? this.options.snapSpeed || Math.max(\n Math.max(\n Math.min(Math.abs(posX - this.x), 1000),\n Math.min(Math.abs(posY - this.y), 1000)\n ), 300) : time;\n\n this.currentPage = {\n x: posX,\n y: posY,\n pageX: x,\n pageY: y\n };\n\n this.scrollTo(posX, posY, time, easing);\n },\n\n next: function(time, easing) {\n var x = this.currentPage.pageX,\n y = this.currentPage.pageY;\n\n x++;\n\n if (x >= this.pages.length && this.hasVerticalScroll) {\n x = 0;\n y++;\n }\n\n this.goToPage(x, y, time, easing);\n },\n\n prev: function(time, easing) {\n var x = this.currentPage.pageX,\n y = this.currentPage.pageY;\n\n x--;\n\n if (x < 0 && this.hasVerticalScroll) {\n x = 0;\n y--;\n }\n\n this.goToPage(x, y, time, easing);\n },\n\n _initKeys: function() {\n // default key bindings\n var keys = {\n pageUp: 33,\n pageDown: 34,\n end: 35,\n home: 36,\n left: 37,\n up: 38,\n right: 39,\n down: 40\n };\n var i;\n\n // if you give me characters I give you keycode\n if (typeof this.options.keyBindings === 'object') {\n for (i in this.options.keyBindings) {\n if (typeof this.options.keyBindings[i] === 'string') {\n this.options.keyBindings[i] = this.options.keyBindings[i].toUpperCase().charCodeAt(0);\n }\n }\n } else {\n this.options.keyBindings = {};\n }\n\n for (i in keys) { // jshint ignore:line\n this.options.keyBindings[i] = this.options.keyBindings[i] || keys[i];\n }\n\n utils.addEvent(window, 'keydown', this);\n\n this.on('destroy', function() {\n utils.removeEvent(window, 'keydown', this);\n });\n },\n\n _key: function(e) {\n if (!this.enabled) {\n return;\n }\n\n var snap = this.options.snap, // we are using this alot, better to cache it\n newX = snap ? this.currentPage.pageX : this.x,\n newY = snap ? this.currentPage.pageY : this.y,\n now = utils.getTime(),\n prevTime = this.keyTime || 0,\n acceleration = 0.250,\n pos;\n\n if (this.options.useTransition && this.isInTransition) {\n pos = this.getComputedPosition();\n\n this._translate(Math.round(pos.x), Math.round(pos.y));\n this.isInTransition = false;\n }\n\n this.keyAcceleration = now - prevTime < 200 ? Math.min(this.keyAcceleration + acceleration, 50) : 0;\n\n switch (e.keyCode) {\n case this.options.keyBindings.pageUp:\n if (this.hasHorizontalScroll && !this.hasVerticalScroll) {\n newX += snap ? 1 : this.wrapperWidth;\n } else {\n newY += snap ? 1 : this.wrapperHeight;\n }\n break;\n case this.options.keyBindings.pageDown:\n if (this.hasHorizontalScroll && !this.hasVerticalScroll) {\n newX -= snap ? 1 : this.wrapperWidth;\n } else {\n newY -= snap ? 1 : this.wrapperHeight;\n }\n break;\n case this.options.keyBindings.end:\n newX = snap ? this.pages.length - 1 : this.maxScrollX;\n newY = snap ? this.pages[0].length - 1 : this.maxScrollY;\n break;\n case this.options.keyBindings.home:\n newX = 0;\n newY = 0;\n break;\n case this.options.keyBindings.left:\n newX += snap ? -1 : 5 + this.keyAcceleration >> 0; // jshint ignore:line\n break;\n case this.options.keyBindings.up:\n newY += snap ? 1 : 5 + this.keyAcceleration >> 0; // jshint ignore:line\n break;\n case this.options.keyBindings.right:\n newX -= snap ? -1 : 5 + this.keyAcceleration >> 0; // jshint ignore:line\n break;\n case this.options.keyBindings.down:\n newY -= snap ? 1 : 5 + this.keyAcceleration >> 0; // jshint ignore:line\n break;\n default:\n return;\n }\n\n if (snap) {\n this.goToPage(newX, newY);\n return;\n }\n\n if (newX > 0) {\n newX = 0;\n this.keyAcceleration = 0;\n } else if (newX < this.maxScrollX) {\n newX = this.maxScrollX;\n this.keyAcceleration = 0;\n }\n\n if (newY > 0) {\n newY = 0;\n this.keyAcceleration = 0;\n } else if (newY < this.maxScrollY) {\n newY = this.maxScrollY;\n this.keyAcceleration = 0;\n }\n\n this.scrollTo(newX, newY, 0);\n\n this.keyTime = now;\n },\n\n _animate: function(destX, destY, duration, easingFn) {\n var that = this,\n startX = this.x,\n startY = this.y,\n startTime = utils.getTime(),\n destTime = startTime + duration;\n\n function step() {\n var now = utils.getTime(),\n newX, newY,\n easing;\n\n if (now >= destTime) {\n that.isAnimating = false;\n that._translate(destX, destY);\n\n if (!that.resetPosition(that.options.bounceTime)) {\n that._execEvent('scrollEnd');\n }\n\n return;\n }\n\n now = (now - startTime) / duration;\n easing = easingFn(now);\n newX = (destX - startX) * easing + startX;\n newY = (destY - startY) * easing + startY;\n that._translate(newX, newY);\n\n if (that.isAnimating) {\n rAF(step);\n }\n\n if (that.options.probeType === 3) {\n that._execEvent('scroll');\n }\n }\n\n this.isAnimating = true;\n step();\n },\n\n handleEvent: function(e) {\n switch (e.type) {\n case 'touchstart':\n case 'pointerdown':\n case 'MSPointerDown':\n case 'mousedown':\n this._start(e);\n break;\n case 'touchmove':\n case 'pointermove':\n case 'MSPointerMove':\n case 'mousemove':\n this._move(e);\n break;\n case 'touchend':\n case 'pointerup':\n case 'MSPointerUp':\n case 'mouseup':\n case 'touchcancel':\n case 'pointercancel':\n case 'MSPointerCancel':\n case 'mousecancel':\n this._end(e);\n break;\n case 'orientationchange':\n case 'resize':\n this._resize();\n break;\n case 'transitionend':\n case 'webkitTransitionEnd':\n case 'oTransitionEnd':\n case 'MSTransitionEnd':\n this._transitionEnd(e);\n break;\n case 'wheel':\n case 'DOMMouseScroll':\n case 'mousewheel':\n this._wheel(e);\n break;\n case 'keydown':\n this._key(e);\n break;\n case 'click':\n if (!e._constructed) {\n e.preventDefault();\n e.stopPropagation();\n }\n break;\n }\n }\n };\n\n function createDefaultScrollbar(direction, interactive, type) {\n var scrollbar = document.createElement('div'),\n indicator = document.createElement('div');\n\n if (type === true) {\n scrollbar.style.cssText = 'position:absolute;z-index:9999';\n indicator.style.cssText = '-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);border-radius:3px';\n }\n\n indicator.className = 'iScrollIndicator';\n\n if (direction === 'h') {\n if (type === true) {\n scrollbar.style.cssText += ';height:5px;left:2px;right:2px;bottom:0';\n indicator.style.height = '100%';\n }\n scrollbar.className = 'iScrollHorizontalScrollbar';\n } else {\n if (type === true) {\n scrollbar.style.cssText += ';width:5px;bottom:2px;top:2px;right:1px';\n indicator.style.width = '100%';\n }\n scrollbar.className = 'iScrollVerticalScrollbar';\n }\n\n scrollbar.style.cssText += ';overflow:hidden';\n\n if (!interactive) {\n scrollbar.style.pointerEvents = 'none';\n }\n\n scrollbar.appendChild(indicator);\n\n return scrollbar;\n }\n\n function Indicator(scroller, options) {\n this.wrapper = typeof options.el === 'string' ? document.querySelector(options.el) : options.el;\n this.wrapperStyle = this.wrapper.style;\n this.indicator = this.wrapper.children[0];\n this.indicatorStyle = this.indicator.style;\n this.scroller = scroller;\n\n this.options = {\n listenX: true,\n listenY: true,\n interactive: false,\n resize: true,\n defaultScrollbars: false,\n shrink: false,\n fade: false,\n speedRatioX: 0,\n speedRatioY: 0\n };\n\n for (var i in options) { // jshint ignore:line\n this.options[i] = options[i];\n\n }\n\n this.sizeRatioX = 1;\n this.sizeRatioY = 1;\n this.maxPosX = 0;\n this.maxPosY = 0;\n\n if (this.options.interactive) {\n if (!this.options.disableTouch) {\n utils.addEvent(this.indicator, 'touchstart', this);\n utils.addEvent(window, 'touchend', this);\n }\n if (!this.options.disablePointer) {\n utils.addEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this);\n utils.addEvent(window, utils.prefixPointerEvent('pointerup'), this);\n }\n if (!this.options.disableMouse) {\n utils.addEvent(this.indicator, 'mousedown', this);\n utils.addEvent(window, 'mouseup', this);\n }\n }\n\n if (this.options.fade) {\n this.wrapperStyle[utils.style.transform] = this.scroller.translateZ;\n this.wrapperStyle[utils.style.transitionDuration] = utils.isBadAndroid ? '0.001s' : '0ms';\n this.wrapperStyle.opacity = '0';\n }\n }\n\n Indicator.prototype = {\n handleEvent: function(e) {\n switch (e.type) {\n case 'touchstart':\n case 'pointerdown':\n case 'MSPointerDown':\n case 'mousedown':\n this._start(e);\n break;\n case 'touchmove':\n case 'pointermove':\n case 'MSPointerMove':\n case 'mousemove':\n this._move(e);\n break;\n case 'touchend':\n case 'pointerup':\n case 'MSPointerUp':\n case 'mouseup':\n case 'touchcancel':\n case 'pointercancel':\n case 'MSPointerCancel':\n case 'mousecancel':\n this._end(e);\n break;\n }\n },\n\n destroy: function() {\n if (this.options.interactive) {\n utils.removeEvent(this.indicator, 'touchstart', this);\n utils.removeEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this);\n utils.removeEvent(this.indicator, 'mousedown', this);\n\n utils.removeEvent(window, 'touchmove', this);\n utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this);\n utils.removeEvent(window, 'mousemove', this);\n\n utils.removeEvent(window, 'touchend', this);\n utils.removeEvent(window, utils.prefixPointerEvent('pointerup'), this);\n utils.removeEvent(window, 'mouseup', this);\n }\n\n if (this.options.defaultScrollbars) {\n this.wrapper.parentNode.removeChild(this.wrapper);\n }\n },\n\n _start: function(e) {\n var point = e.touches ? e.touches[0] : e;\n\n e.preventDefault();\n e.stopPropagation();\n\n this.transitionTime();\n\n this.initiated = true;\n this.moved = false;\n this.lastPointX = point.pageX;\n this.lastPointY = point.pageY;\n\n this.startTime = utils.getTime();\n\n if (!this.options.disableTouch) {\n utils.addEvent(window, 'touchmove', this);\n }\n if (!this.options.disablePointer) {\n utils.addEvent(window, utils.prefixPointerEvent('pointermove'), this);\n }\n if (!this.options.disableMouse) {\n utils.addEvent(window, 'mousemove', this);\n }\n\n this.scroller._execEvent('beforeScrollStart');\n },\n\n _move: function(e) {\n var point = e.touches ? e.touches[0] : e,\n deltaX, deltaY,\n newX, newY,\n timestamp = utils.getTime();\n\n if (!this.moved) {\n this.scroller._execEvent('scrollStart');\n }\n\n this.moved = true;\n\n deltaX = point.pageX - this.lastPointX;\n this.lastPointX = point.pageX;\n\n deltaY = point.pageY - this.lastPointY;\n this.lastPointY = point.pageY;\n\n newX = this.x + deltaX;\n newY = this.y + deltaY;\n\n this._pos(newX, newY);\n\n\n if (this.scroller.options.probeType === 1 && timestamp - this.startTime > 300) {\n this.startTime = timestamp;\n this.scroller._execEvent('scroll');\n } else if (this.scroller.options.probeType > 1) {\n this.scroller._execEvent('scroll');\n }\n\n\n // INSERT POINT: indicator._move\n\n e.preventDefault();\n e.stopPropagation();\n },\n\n _end: function(e) {\n if (!this.initiated) {\n return;\n }\n\n this.initiated = false;\n\n e.preventDefault();\n e.stopPropagation();\n\n utils.removeEvent(window, 'touchmove', this);\n utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this);\n utils.removeEvent(window, 'mousemove', this);\n\n if (this.scroller.options.snap) {\n var snap = this.scroller._nearestSnap(this.scroller.x, this.scroller.y);\n\n var time = this.options.snapSpeed || Math.max(\n Math.max(\n Math.min(Math.abs(this.scroller.x - snap.x), 1000),\n Math.min(Math.abs(this.scroller.y - snap.y), 1000)\n ), 300);\n\n if (this.scroller.x !== snap.x || this.scroller.y !== snap.y) {\n this.scroller.directionX = 0;\n this.scroller.directionY = 0;\n this.scroller.currentPage = snap;\n this.scroller.scrollTo(snap.x, snap.y, time, this.scroller.options.bounceEasing);\n }\n }\n\n if (this.moved) {\n this.scroller._execEvent('scrollEnd');\n }\n },\n\n transitionTime: function(time) {\n time = time || 0;\n this.indicatorStyle[utils.style.transitionDuration] = time + 'ms';\n\n if (!time && utils.isBadAndroid) {\n this.indicatorStyle[utils.style.transitionDuration] = '0.001s';\n }\n },\n\n transitionTimingFunction: function(easing) {\n this.indicatorStyle[utils.style.transitionTimingFunction] = easing;\n },\n\n refresh: function() {\n this.transitionTime();\n\n if (this.options.listenX && !this.options.listenY) {\n this.indicatorStyle.display = this.scroller.hasHorizontalScroll ? 'block' : 'none';\n } else if (this.options.listenY && !this.options.listenX) {\n this.indicatorStyle.display = this.scroller.hasVerticalScroll ? 'block' : 'none';\n } else {\n this.indicatorStyle.display = this.scroller.hasHorizontalScroll || this.scroller.hasVerticalScroll ? 'block' : 'none';\n }\n\n if (this.scroller.hasHorizontalScroll && this.scroller.hasVerticalScroll) {\n utils.addClass(this.wrapper, 'iScrollBothScrollbars');\n utils.removeClass(this.wrapper, 'iScrollLoneScrollbar');\n\n if (this.options.defaultScrollbars && this.options.customStyle) {\n if (this.options.listenX) {\n this.wrapper.style.right = '8px';\n } else {\n this.wrapper.style.bottom = '8px';\n }\n }\n } else {\n utils.removeClass(this.wrapper, 'iScrollBothScrollbars');\n utils.addClass(this.wrapper, 'iScrollLoneScrollbar');\n\n if (this.options.defaultScrollbars && this.options.customStyle) {\n if (this.options.listenX) {\n this.wrapper.style.right = '2px';\n } else {\n this.wrapper.style.bottom = '2px';\n }\n }\n }\n\n // var r = this.wrapper.offsetHeight; // force refresh\n\n if (this.options.listenX) {\n this.wrapperWidth = this.wrapper.clientWidth;\n if (this.options.resize) {\n this.indicatorWidth = Math.max(Math.round(this.wrapperWidth * this.wrapperWidth / (this.scroller.scrollerWidth || this.wrapperWidth || 1)), 8);\n this.indicatorStyle.width = this.indicatorWidth + 'px';\n } else {\n this.indicatorWidth = this.indicator.clientWidth;\n }\n\n this.maxPosX = this.wrapperWidth - this.indicatorWidth;\n\n if (this.options.shrink === 'clip') {\n this.minBoundaryX = -this.indicatorWidth + 8;\n this.maxBoundaryX = this.wrapperWidth - 8;\n } else {\n this.minBoundaryX = 0;\n this.maxBoundaryX = this.maxPosX;\n }\n\n this.sizeRatioX = this.options.speedRatioX || (this.scroller.maxScrollX && (this.maxPosX / this.scroller.maxScrollX));\n }\n\n if (this.options.listenY) {\n this.wrapperHeight = this.wrapper.clientHeight;\n if (this.options.resize) {\n this.indicatorHeight = Math.max(Math.round(this.wrapperHeight * this.wrapperHeight / (this.scroller.scrollerHeight || this.wrapperHeight || 1)), 8);\n this.indicatorStyle.height = this.indicatorHeight + 'px';\n } else {\n this.indicatorHeight = this.indicator.clientHeight;\n }\n\n this.maxPosY = this.wrapperHeight - this.indicatorHeight;\n\n if (this.options.shrink === 'clip') {\n this.minBoundaryY = -this.indicatorHeight + 8;\n this.maxBoundaryY = this.wrapperHeight - 8;\n } else {\n this.minBoundaryY = 0;\n this.maxBoundaryY = this.maxPosY;\n }\n\n this.maxPosY = this.wrapperHeight - this.indicatorHeight;\n this.sizeRatioY = this.options.speedRatioY || (this.scroller.maxScrollY && (this.maxPosY / this.scroller.maxScrollY));\n }\n\n this.updatePosition();\n },\n\n updatePosition: function() {\n var x = this.options.listenX && Math.round(this.sizeRatioX * this.scroller.x) || 0,\n y = this.options.listenY && Math.round(this.sizeRatioY * this.scroller.y) || 0;\n\n if (!this.options.ignoreBoundaries) {\n if (x < this.minBoundaryX) {\n if (this.options.shrink === 'scale') {\n this.width = Math.max(this.indicatorWidth + x, 8);\n this.indicatorStyle.width = this.width + 'px';\n }\n x = this.minBoundaryX;\n } else if (x > this.maxBoundaryX) {\n if (this.options.shrink === 'scale') {\n this.width = Math.max(this.indicatorWidth - (x - this.maxPosX), 8);\n this.indicatorStyle.width = this.width + 'px';\n x = this.maxPosX + this.indicatorWidth - this.width;\n } else {\n x = this.maxBoundaryX;\n }\n } else if (this.options.shrink === 'scale' && this.width !== this.indicatorWidth) {\n this.width = this.indicatorWidth;\n this.indicatorStyle.width = this.width + 'px';\n }\n\n if (y < this.minBoundaryY) {\n if (this.options.shrink === 'scale') {\n this.height = Math.max(this.indicatorHeight + y * 3, 8);\n this.indicatorStyle.height = this.height + 'px';\n }\n y = this.minBoundaryY;\n } else if (y > this.maxBoundaryY) {\n if (this.options.shrink === 'scale') {\n this.height = Math.max(this.indicatorHeight - (y - this.maxPosY) * 3, 8);\n this.indicatorStyle.height = this.height + 'px';\n y = this.maxPosY + this.indicatorHeight - this.height;\n } else {\n y = this.maxBoundaryY;\n }\n } else if (this.options.shrink === 'scale' && this.height !== this.indicatorHeight) {\n this.height = this.indicatorHeight;\n this.indicatorStyle.height = this.height + 'px';\n }\n }\n\n this.x = x;\n this.y = y;\n\n if (this.scroller.options.useTransform) {\n this.indicatorStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.scroller.translateZ;\n } else {\n this.indicatorStyle.left = x + 'px';\n this.indicatorStyle.top = y + 'px';\n }\n },\n\n _pos: function(x, y) {\n if (x < 0) {\n x = 0;\n } else if (x > this.maxPosX) {\n x = this.maxPosX;\n }\n\n if (y < 0) {\n y = 0;\n } else if (y > this.maxPosY) {\n y = this.maxPosY;\n }\n\n x = this.options.listenX ? Math.round(x / this.sizeRatioX) : this.scroller.x;\n y = this.options.listenY ? Math.round(y / this.sizeRatioY) : this.scroller.y;\n\n this.scroller.scrollTo(x, y);\n },\n\n fade: function(val, hold) {\n if (hold && !this.visible) {\n return;\n }\n\n clearTimeout(this.fadeTimeout);\n this.fadeTimeout = null;\n\n var time = val ? 250 : 500,\n delay = val ? 0 : 300;\n\n val = val ? '1' : '0';\n\n this.wrapperStyle[utils.style.transitionDuration] = time + 'ms';\n\n this.fadeTimeout = setTimeout((function(val) {\n this.wrapperStyle.opacity = val;\n this.visible = +val;\n }).bind(this, val), delay);\n }\n };\n\n IScroll.utils = utils;\n\n window.IScroll = IScroll;\n}(window);\n\n/* ===============================================================================\n ************ scroller ************\n =============================================================================== */\n+ function($) {\n \"use strict\";\n //重置zepto自带的滚动条\n var _zeptoMethodCache = {\n \"scrollTop\": $.fn.scrollTop,\n \"scrollLeft\": $.fn.scrollLeft\n };\n //重置scrollLeft和scrollRight\n (function() {\n $.extend($.fn, {\n scrollTop: function(top, dur) {\n if (!this.length) return;\n var scroller = this.data('scroller');\n if (scroller && scroller.scroller) { //js滚动\n return scroller.scrollTop(top, dur);\n } else {\n return _zeptoMethodCache.scrollTop.apply(this, arguments);\n }\n }\n });\n $.extend($.fn, {\n scrollLeft: function(left, dur) {\n if (!this.length) return;\n var scroller = this.data('scroller');\n if (scroller && scroller.scroller) { //js滚动\n return scroller.scrollLeft(left, dur);\n } else {\n return _zeptoMethodCache.scrollLeft.apply(this, arguments);\n }\n }\n });\n })();\n\n\n\n //自定义的滚动条\n var Scroller = function(pageContent, _options) {\n var $pageContent = this.$pageContent = $(pageContent);\n\n this.options = $.extend({}, this._defaults, _options);\n\n var type = this.options.type;\n //auto的type,系统版本的小于4.4.0的安卓设备和系统版本小于6.0.0的ios设备,启用js版的iscoll\n var useJSScroller = (type === 'js') || (type === 'auto' && ($.device.android && $.compareVersion('4.4.0', $.device.osVersion) > -1) || (type === 'auto' && ($.device.ios && $.compareVersion('6.0.0', $.device.osVersion) > -1)));\n\n if (useJSScroller) {\n\n var $pageContentInner = $pageContent.find('.content-inner');\n //如果滚动内容没有被包裹,自动添加wrap\n if (!$pageContentInner[0]) {\n // $pageContent.html('
' + $pageContent.html() + '
');\n var children = $pageContent.children();\n if (children.length < 1) {\n $pageContent.children().wrapAll('
');\n } else {\n $pageContent.html('
' + $pageContent.html() + '
');\n }\n }\n\n if ($pageContent.hasClass('pull-to-refresh-content')) {\n //因为iscroll 当页面高度不足 100% 时无法滑动,所以无法触发下拉动作,这里改动一下高度\n //区分是否有.bar容器,如有,则content的top:0,无则content的top:-2.2rem,这里取2.2rem的最大值,近60\n var minHeight = $(window).height() + ($pageContent.prev().hasClass(\".bar\") ? 1 : 61);\n $pageContent.find('.content-inner').css('min-height', minHeight + 'px');\n }\n\n var ptr = $(pageContent).hasClass('pull-to-refresh-content');\n //js滚动模式,用transform移动内容区位置,会导致fixed失效,表现类似absolute。因此禁用transform模式\n var useTransform = $pageContent.find('.fixed-tab').length === 0;\n var options = {\n probeType: 1,\n mouseWheel: true,\n //解决安卓js模式下,刷新滚动条后绑定的事件不响应,对chrome内核浏览器设置click:true\n click: $.device.androidChrome,\n useTransform: useTransform,\n //js模式下允许滚动条横向滚动,但是需要注意,滚动容易宽度必须大于屏幕宽度滚动才生效\n scrollX: true\n };\n if (ptr) {\n options.ptr = true;\n options.ptrOffset = 44;\n }\n //如果用js滚动条,用transform计算内容区位置,position:fixed将实效。若有.fixed-tab,强制使用native滚动条;备选方案,略粗暴\n // if($(pageContent).find('.fixed-tab').length>0){\n // $pageContent.addClass('native-scroll');\n // return;\n // }\n this.scroller = new IScroll(pageContent, options); // jshint ignore:line\n //和native滚动统一起来\n this._bindEventToDomWhenJs();\n $.initPullToRefresh = $._pullToRefreshJSScroll.initPullToRefresh;\n $.pullToRefreshDone = $._pullToRefreshJSScroll.pullToRefreshDone;\n $.pullToRefreshTrigger = $._pullToRefreshJSScroll.pullToRefreshTrigger;\n $.destroyToRefresh = $._pullToRefreshJSScroll.destroyToRefresh;\n $pageContent.addClass('javascript-scroll');\n if (!useTransform) {\n $pageContent.find('.content-inner').css({\n width: '100%',\n position: 'absolute'\n });\n }\n\n //如果页面本身已经进行了原生滚动,那么把这个滚动换成JS的滚动\n var nativeScrollTop = this.$pageContent[0].scrollTop;\n if(nativeScrollTop) {\n this.$pageContent[0].scrollTop = 0;\n this.scrollTop(nativeScrollTop);\n }\n } else {\n $pageContent.addClass('native-scroll');\n }\n };\n Scroller.prototype = {\n _defaults: {\n type: 'native',\n },\n _bindEventToDomWhenJs: function() {\n //\"scrollStart\", //the scroll started.\n //\"scroll\", //the content is scrolling. Available only in scroll-probe.js edition. See onScroll event.\n //\"scrollEnd\", //content stopped scrolling.\n if (this.scroller) {\n var self = this;\n this.scroller.on('scrollStart', function() {\n self.$pageContent.trigger('scrollstart');\n });\n this.scroller.on('scroll', function() {\n self.$pageContent.trigger('scroll');\n });\n this.scroller.on('scrollEnd', function() {\n self.$pageContent.trigger('scrollend');\n });\n } else {\n //TODO: 实现native的scrollStart和scrollEnd\n }\n },\n scrollTop: function(top, dur) {\n if (this.scroller) {\n if (top !== undefined) {\n this.scroller.scrollTo(0, -1 * top, dur);\n } else {\n return this.scroller.getComputedPosition().y * -1;\n }\n } else {\n return this.$pageContent.scrollTop(top, dur);\n }\n return this;\n },\n scrollLeft: function(left, dur) {\n if (this.scroller) {\n if (left !== undefined) {\n this.scroller.scrollTo(-1 * left, 0);\n } else {\n return this.scroller.getComputedPosition().x * -1;\n }\n } else {\n return this.$pageContent.scrollTop(left, dur);\n }\n return this;\n },\n on: function(event, callback) {\n if (this.scroller) {\n this.scroller.on(event, function() {\n callback.call(this.wrapper);\n });\n } else {\n this.$pageContent.on(event, callback);\n }\n return this;\n },\n off: function(event, callback) {\n if (this.scroller) {\n this.scroller.off(event, callback);\n } else {\n this.$pageContent.off(event, callback);\n }\n return this;\n },\n refresh: function() {\n if (this.scroller) this.scroller.refresh();\n return this;\n },\n scrollHeight: function() {\n if (this.scroller) {\n return this.scroller.scrollerHeight;\n } else {\n return this.$pageContent[0].scrollHeight;\n }\n }\n\n };\n\n //Scroller PLUGIN DEFINITION\n // =======================\n\n function Plugin(option) {\n var args = Array.apply(null, arguments);\n args.shift();\n var internal_return;\n\n this.each(function() {\n\n var $this = $(this);\n\n var options = $.extend({}, $this.dataset(), typeof option === 'object' && option);\n\n var data = $this.data('scroller');\n //如果 scroller 没有被初始化,对scroller 进行初始化r\n if (!data) {\n //获取data-api的\n $this.data('scroller', (data = new Scroller(this, options)));\n\n }\n if (typeof option === 'string' && typeof data[option] === 'function') {\n internal_return = data[option].apply(data, args);\n if (internal_return !== undefined)\n return false;\n }\n\n });\n\n if (internal_return !== undefined)\n return internal_return;\n else\n return this;\n\n }\n\n var old = $.fn.scroller;\n\n $.fn.scroller = Plugin;\n $.fn.scroller.Constructor = Scroller;\n\n\n // Scroll NO CONFLICT\n // =================\n\n $.fn.scroller.noConflict = function() {\n $.fn.scroller = old;\n return this;\n };\n //添加data-api\n $(function() {\n $('[data-toggle=\"scroller\"]').scroller();\n });\n\n //统一的接口,带有 .javascript-scroll 的content 进行刷新\n $.refreshScroller = function(content) {\n if (content) {\n $(content).scroller('refresh');\n } else {\n $('.javascript-scroll').each(function() {\n $(this).scroller('refresh');\n });\n }\n\n };\n //全局初始化方法,会对页面上的 [data-toggle=\"scroller\"],.content. 进行滚动条初始化\n $.initScroller = function(option) {\n this.options = $.extend({}, typeof option === 'object' && option);\n $('[data-toggle=\"scroller\"],.content').scroller(option);\n };\n //获取scroller对象\n $.getScroller = function(content) {\n //以前默认只能有一个无限滚动,因此infinitescroll都是加在content上,现在允许里面有多个,因此要判断父元素是否有content\n content = content.hasClass('content') ? content : content.parents('.content');\n if (content) {\n return $(content).data('scroller');\n } else {\n return $('.content.javascript-scroll').data('scroller');\n }\n };\n //检测滚动类型,\n //‘js’: javascript 滚动条\n //‘native’: 原生滚动条\n $.detectScrollerType = function(content) {\n if (content) {\n if ($(content).data('scroller') && $(content).data('scroller').scroller) {\n return 'js';\n } else {\n return 'native';\n }\n }\n };\n\n}(Zepto);\n\n/* ===============================================================================\n ************ Tabs ************\n =============================================================================== */\n+function ($) {\n \"use strict\";\n\n var showTab = function (tab, tabLink, force) {\n var newTab = $(tab);\n if (arguments.length === 2) {\n if (typeof tabLink === 'boolean') {\n force = tabLink;\n }\n }\n if (newTab.length === 0) return false;\n if (newTab.hasClass('active')) {\n if (force) newTab.trigger('show');\n return false;\n }\n var tabs = newTab.parent('.tabs');\n if (tabs.length === 0) return false;\n\n // Animated tabs\n /*var isAnimatedTabs = tabs.parent().hasClass('tabs-animated-wrap');\n if (isAnimatedTabs) {\n tabs.transform('translate3d(' + -newTab.index() * 100 + '%,0,0)');\n }*/\n\n // Remove active class from old tabs\n var oldTab = tabs.children('.tab.active').removeClass('active');\n // Add active class to new tab\n newTab.addClass('active');\n // Trigger 'show' event on new tab\n newTab.trigger('show');\n\n // Update navbars in new tab\n /*if (!isAnimatedTabs && newTab.find('.navbar').length > 0) {\n // Find tab's view\n var viewContainer;\n if (newTab.hasClass(app.params.viewClass)) viewContainer = newTab[0];\n else viewContainer = newTab.parents('.' + app.params.viewClass)[0];\n app.sizeNavbars(viewContainer);\n }*/\n\n // Find related link for new tab\n if (tabLink) tabLink = $(tabLink);\n else {\n // Search by id\n if (typeof tab === 'string') tabLink = $('.tab-link[href=\"' + tab + '\"]');\n else tabLink = $('.tab-link[href=\"#' + newTab.attr('id') + '\"]');\n // Search by data-tab\n if (!tabLink || tabLink && tabLink.length === 0) {\n $('[data-tab]').each(function () {\n if (newTab.is($(this).attr('data-tab'))) tabLink = $(this);\n });\n }\n }\n if (tabLink.length === 0) return;\n\n // Find related link for old tab\n var oldTabLink;\n if (oldTab && oldTab.length > 0) {\n // Search by id\n var oldTabId = oldTab.attr('id');\n if (oldTabId) oldTabLink = $('.tab-link[href=\"#' + oldTabId + '\"]');\n // Search by data-tab\n if (!oldTabLink || oldTabLink && oldTabLink.length === 0) {\n $('[data-tab]').each(function () {\n if (oldTab.is($(this).attr('data-tab'))) oldTabLink = $(this);\n });\n }\n }\n\n // Update links' classes\n if (tabLink && tabLink.length > 0) tabLink.addClass('active');\n if (oldTabLink && oldTabLink.length > 0) oldTabLink.removeClass('active');\n tabLink.trigger('active');\n\n //app.refreshScroller();\n\n return true;\n };\n\n var old = $.showTab;\n $.showTab = showTab;\n\n $.showTab.noConflict = function () {\n $.showTab = old;\n return this;\n };\n //a标签上的click事件,在iscroll下响应有问题\n $(document).on(\"click\", \".tab-link\", function(e) {\n e.preventDefault();\n var clicked = $(this);\n showTab(clicked.data(\"tab\") || clicked.attr('href'), clicked);\n });\n\n\n}(Zepto);\n\n/* ===============================================================================\n ************ Tabs ************\n =============================================================================== */\n+function ($) {\n \"use strict\";\n $.initFixedTab = function(){\n var $fixedTab = $('.fixed-tab');\n if ($fixedTab.length === 0) return;\n $('.fixed-tab').fixedTab();//默认{offset: 0}\n };\n var FixedTab = function(pageContent, _options) {\n var $pageContent = this.$pageContent = $(pageContent);\n var shadow = $pageContent.clone();\n var fixedTop = $pageContent[0].getBoundingClientRect().top;\n\n shadow.css('visibility', 'hidden');\n this.options = $.extend({}, this._defaults, {\n fixedTop: fixedTop,\n shadow: shadow,\n offset: 0\n }, _options);\n\n this._bindEvents();\n };\n\n FixedTab.prototype = {\n _defaults: {\n offset: 0,\n },\n _bindEvents: function() {\n this.$pageContent.parents('.content').on('scroll', this._scrollHandler.bind(this));\n this.$pageContent.on('active', '.tab-link', this._tabLinkHandler.bind(this));\n },\n _tabLinkHandler: function(ev) {\n var isFixed = $(ev.target).parents('.buttons-fixed').length > 0;\n var fixedTop = this.options.fixedTop;\n var offset = this.options.offset;\n $.refreshScroller();\n if (!isFixed) return;\n this.$pageContent.parents('.content').scrollTop(fixedTop - offset);\n },\n // 滚动核心代码\n _scrollHandler: function(ev) {\n var $scroller = $(ev.target);\n var $pageContent = this.$pageContent;\n var shadow = this.options.shadow;\n var offset = this.options.offset;\n var fixedTop = this.options.fixedTop;\n var scrollTop = $scroller.scrollTop();\n var isFixed = scrollTop >= fixedTop - offset;\n if (isFixed) {\n shadow.insertAfter($pageContent);\n $pageContent.addClass('buttons-fixed').css('top', offset);\n } else {\n shadow.remove();\n $pageContent.removeClass('buttons-fixed').css('top', 0);\n }\n }\n };\n\n //FixedTab PLUGIN DEFINITION\n // =======================\n\n function Plugin(option) {\n var args = Array.apply(null, arguments);\n args.shift();\n this.each(function() {\n var $this = $(this);\n var options = $.extend({}, $this.dataset(), typeof option === 'object' && option);\n var data = $this.data('fixedtab');\n if (!data) {\n //获取data-api的\n $this.data('fixedtab', (data = new FixedTab(this, options)));\n }\n });\n\n }\n $.fn.fixedTab = Plugin;\n $.fn.fixedTab.Constructor = FixedTab;\n $(document).on('pageInit',function(){\n $.initFixedTab();\n });\n\n\n\n}(Zepto);\n\n+ function($) {\n \"use strict\";\n //这里实在js滚动时使用的下拉刷新代码。\n\n var refreshTime = 0;\n var initPullToRefreshJS = function(pageContainer) {\n var eventsTarget = $(pageContainer);\n if (!eventsTarget.hasClass('pull-to-refresh-content')) {\n eventsTarget = eventsTarget.find('.pull-to-refresh-content');\n }\n if (!eventsTarget || eventsTarget.length === 0) return;\n\n var page = eventsTarget.hasClass('content') ? eventsTarget : eventsTarget.parents('.content');\n var scroller = $.getScroller(page[0]);\n if(!scroller) return;\n\n\n var container = eventsTarget;\n\n function handleScroll() {\n if (container.hasClass('refreshing')) return;\n if (scroller.scrollTop() * -1 >= 44) {\n container.removeClass('pull-down').addClass('pull-up');\n } else {\n container.removeClass('pull-up').addClass('pull-down');\n }\n }\n\n function handleRefresh() {\n if (container.hasClass('refreshing')) return;\n container.removeClass('pull-down pull-up');\n container.addClass('refreshing transitioning');\n container.trigger('refresh');\n refreshTime = +new Date();\n }\n scroller.on('scroll', handleScroll);\n scroller.scroller.on('ptr', handleRefresh);\n\n // Detach Events on page remove\n function destroyPullToRefresh() {\n scroller.off('scroll', handleScroll);\n scroller.scroller.off('ptr', handleRefresh);\n }\n eventsTarget[0].destroyPullToRefresh = destroyPullToRefresh;\n\n };\n\n var pullToRefreshDoneJS = function(container) {\n container = $(container);\n if (container.length === 0) container = $('.pull-to-refresh-content.refreshing');\n if (container.length === 0) return;\n var interval = (+new Date()) - refreshTime;\n var timeOut = interval > 1000 ? 0 : 1000 - interval; //long than bounce time\n var scroller = $.getScroller(container);\n setTimeout(function() {\n scroller.refresh();\n container.removeClass('refreshing');\n container.transitionEnd(function() {\n container.removeClass(\"transitioning\");\n });\n }, timeOut);\n };\n var pullToRefreshTriggerJS = function(container) {\n container = $(container);\n if (container.length === 0) container = $('.pull-to-refresh-content');\n if (container.hasClass('refreshing')) return;\n container.addClass('refreshing');\n var scroller = $.getScroller(container);\n scroller.scrollTop(44 + 1, 200);\n container.trigger('refresh');\n };\n\n var destroyPullToRefreshJS = function(pageContainer) {\n pageContainer = $(pageContainer);\n var pullToRefreshContent = pageContainer.hasClass('pull-to-refresh-content') ? pageContainer : pageContainer.find('.pull-to-refresh-content');\n if (pullToRefreshContent.length === 0) return;\n if (pullToRefreshContent[0].destroyPullToRefresh) pullToRefreshContent[0].destroyPullToRefresh();\n };\n\n $._pullToRefreshJSScroll = {\n \"initPullToRefresh\": initPullToRefreshJS,\n \"pullToRefreshDone\": pullToRefreshDoneJS,\n \"pullToRefreshTrigger\": pullToRefreshTriggerJS,\n \"destroyPullToRefresh\": destroyPullToRefreshJS,\n };\n}(Zepto); // jshint ignore:line\n\n+ function($) {\n 'use strict';\n $.initPullToRefresh = function(pageContainer) {\n var eventsTarget = $(pageContainer);\n if (!eventsTarget.hasClass('pull-to-refresh-content')) {\n eventsTarget = eventsTarget.find('.pull-to-refresh-content');\n }\n if (!eventsTarget || eventsTarget.length === 0) return;\n\n var isTouched, isMoved, touchesStart = {},\n isScrolling, touchesDiff, touchStartTime, container, refresh = false,\n useTranslate = false,\n startTranslate = 0,\n translate, scrollTop, wasScrolled, triggerDistance, dynamicTriggerDistance;\n\n container = eventsTarget;\n\n // Define trigger distance\n if (container.attr('data-ptr-distance')) {\n dynamicTriggerDistance = true;\n } else {\n triggerDistance = 44;\n }\n\n function handleTouchStart(e) {\n if (isTouched) {\n if ($.device.android) {\n if ('targetTouches' in e && e.targetTouches.length > 1) return;\n } else return;\n }\n isMoved = false;\n isTouched = true;\n isScrolling = undefined;\n wasScrolled = undefined;\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n touchStartTime = (new Date()).getTime();\n /*jshint validthis:true */\n container = $(this);\n }\n\n function handleTouchMove(e) {\n if (!isTouched) return;\n var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n }\n if (!isScrolling) {\n isTouched = false;\n return;\n }\n\n scrollTop = container[0].scrollTop;\n if (typeof wasScrolled === 'undefined' && scrollTop !== 0) wasScrolled = true;\n\n if (!isMoved) {\n /*jshint validthis:true */\n container.removeClass('transitioning');\n if (scrollTop > container[0].offsetHeight) {\n isTouched = false;\n return;\n }\n if (dynamicTriggerDistance) {\n triggerDistance = container.attr('data-ptr-distance');\n if (triggerDistance.indexOf('%') >= 0) triggerDistance = container[0].offsetHeight * parseInt(triggerDistance, 10) / 100;\n }\n startTranslate = container.hasClass('refreshing') ? triggerDistance : 0;\n if (container[0].scrollHeight === container[0].offsetHeight || !$.device.ios) {\n useTranslate = true;\n } else {\n useTranslate = false;\n }\n useTranslate = true;\n }\n isMoved = true;\n touchesDiff = pageY - touchesStart.y;\n\n if (touchesDiff > 0 && scrollTop <= 0 || scrollTop < 0) {\n // iOS 8 fix\n if ($.device.ios && parseInt($.device.osVersion.split('.')[0], 10) > 7 && scrollTop === 0 && !wasScrolled) useTranslate = true;\n\n if (useTranslate) {\n e.preventDefault();\n translate = (Math.pow(touchesDiff, 0.85) + startTranslate);\n container.transform('translate3d(0,' + translate + 'px,0)');\n } else {}\n if ((useTranslate && Math.pow(touchesDiff, 0.85) > triggerDistance) || (!useTranslate && touchesDiff >= triggerDistance * 2)) {\n refresh = true;\n container.addClass('pull-up').removeClass('pull-down');\n } else {\n refresh = false;\n container.removeClass('pull-up').addClass('pull-down');\n }\n } else {\n\n container.removeClass('pull-up pull-down');\n refresh = false;\n return;\n }\n }\n\n function handleTouchEnd() {\n if (!isTouched || !isMoved) {\n isTouched = false;\n isMoved = false;\n return;\n }\n if (translate) {\n container.addClass('transitioning');\n translate = 0;\n }\n container.transform('');\n if (refresh) {\n //防止二次触发\n if(container.hasClass('refreshing')) return;\n container.addClass('refreshing');\n container.trigger('refresh');\n } else {\n container.removeClass('pull-down');\n }\n isTouched = false;\n isMoved = false;\n }\n\n // Attach Events\n eventsTarget.on($.touchEvents.start, handleTouchStart);\n eventsTarget.on($.touchEvents.move, handleTouchMove);\n eventsTarget.on($.touchEvents.end, handleTouchEnd);\n\n\n function destroyPullToRefresh() {\n eventsTarget.off($.touchEvents.start, handleTouchStart);\n eventsTarget.off($.touchEvents.move, handleTouchMove);\n eventsTarget.off($.touchEvents.end, handleTouchEnd);\n }\n eventsTarget[0].destroyPullToRefresh = destroyPullToRefresh;\n\n };\n $.pullToRefreshDone = function(container) {\n $(window).scrollTop(0);//解决微信下拉刷新顶部消失的问题\n container = $(container);\n if (container.length === 0) container = $('.pull-to-refresh-content.refreshing');\n container.removeClass('refreshing').addClass('transitioning');\n container.transitionEnd(function() {\n container.removeClass('transitioning pull-up pull-down');\n });\n };\n $.pullToRefreshTrigger = function(container) {\n container = $(container);\n if (container.length === 0) container = $('.pull-to-refresh-content');\n if (container.hasClass('refreshing')) return;\n container.addClass('transitioning refreshing');\n container.trigger('refresh');\n };\n\n $.destroyPullToRefresh = function(pageContainer) {\n pageContainer = $(pageContainer);\n var pullToRefreshContent = pageContainer.hasClass('pull-to-refresh-content') ? pageContainer : pageContainer.find('.pull-to-refresh-content');\n if (pullToRefreshContent.length === 0) return;\n if (pullToRefreshContent[0].destroyPullToRefresh) pullToRefreshContent[0].destroyPullToRefresh();\n };\n\n //这里是否需要写到 scroller 中去?\n /* $.initPullToRefresh = function(pageContainer) {\n var $pageContainer = $(pageContainer);\n $pageContainer.each(function(index, item) {\n if ($.detectScrollerType(item) === 'js') {\n $._pullToRefreshJSScroll.initPullToRefresh(item);\n } else {\n initPullToRefresh(item);\n }\n });\n };\n\n\n $.pullToRefreshDone = function(pageContainer) {\n var $pageContainer = $(pageContainer);\n $pageContainer.each(function(index, item) {\n if ($.detectScrollerType(item) === 'js') {\n $._pullToRefreshJSScroll.pullToRefreshDone(item);\n } else {\n pullToRefreshDone(item);\n }\n });\n };\n\n\n $.pullToRefreshTrigger = function(pageContainer) {\n var $pageContainer = $(pageContainer);\n $pageContainer.each(function(index, item) {\n if ($.detectScrollerType(item) === 'js') {\n $._pullToRefreshJSScroll.pullToRefreshTrigger(item);\n } else {\n pullToRefreshTrigger(item);\n }\n });\n };\n\n $.destroyPullToRefresh = function(pageContainer) {\n var $pageContainer = $(pageContainer);\n $pageContainer.each(function(index, item) {\n if ($.detectScrollerType(item) === 'js') {\n $._pullToRefreshJSScroll.destroyPullToRefresh(item);\n } else {\n destroyPullToRefresh(item);\n }\n });\n };\n */\n\n}(Zepto); //jshint ignore:line\n\n+ function($) {\n 'use strict';\n\n function handleInfiniteScroll() {\n /*jshint validthis:true */\n var inf = $(this);\n var scroller = $.getScroller(inf);\n var scrollTop = scroller.scrollTop();\n var scrollHeight = scroller.scrollHeight();\n var height = inf[0].offsetHeight;\n var distance = inf[0].getAttribute('data-distance');\n var virtualListContainer = inf.find('.virtual-list');\n var virtualList;\n var onTop = inf.hasClass('infinite-scroll-top');\n if (!distance) distance = 50;\n if (typeof distance === 'string' && distance.indexOf('%') >= 0) {\n distance = parseInt(distance, 10) / 100 * height;\n }\n if (distance > height) distance = height;\n if (onTop) {\n if (scrollTop < distance) {\n inf.trigger('infinite');\n }\n } else {\n if (scrollTop + height >= scrollHeight - distance) {\n if (virtualListContainer.length > 0) {\n virtualList = virtualListContainer[0].f7VirtualList;\n if (virtualList && !virtualList.reachEnd) return;\n }\n inf.trigger('infinite');\n }\n }\n\n }\n $.attachInfiniteScroll = function(infiniteContent) {\n $.getScroller(infiniteContent).on('scroll', handleInfiniteScroll);\n };\n $.detachInfiniteScroll = function(infiniteContent) {\n $.getScroller(infiniteContent).off('scroll', handleInfiniteScroll);\n };\n\n $.initInfiniteScroll = function(pageContainer) {\n pageContainer = $(pageContainer);\n var infiniteContent = pageContainer.hasClass('infinite-scroll')?pageContainer:pageContainer.find('.infinite-scroll');\n if (infiniteContent.length === 0) return;\n $.attachInfiniteScroll(infiniteContent);\n //如果是顶部无限刷新,要将滚动条初始化于最下端\n pageContainer.forEach(function(v){\n if($(v).hasClass('infinite-scroll-top')){\n var height = v.scrollHeight - v.clientHeight;\n $(v).scrollTop(height);\n }\n });\n function detachEvents() {\n $.detachInfiniteScroll(infiniteContent);\n pageContainer.off('pageBeforeRemove', detachEvents);\n }\n pageContainer.on('pageBeforeRemove', detachEvents);\n };\n}(Zepto);\n\n+function ($) {\n \"use strict\";\n $(function() {\n $(document).on(\"focus\", \".searchbar input\", function(e) {\n var $input = $(e.target);\n $input.parents(\".searchbar\").addClass(\"searchbar-active\");\n });\n $(document).on(\"click\", \".searchbar-cancel\", function(e) {\n var $btn = $(e.target);\n $btn.parents(\".searchbar\").removeClass(\"searchbar-active\");\n });\n $(document).on(\"blur\", \".searchbar input\", function(e) {\n var $input = $(e.target);\n $input.parents(\".searchbar\").removeClass(\"searchbar-active\");\n });\n });\n}(Zepto);\n\n/*======================================================\n ************ Panels ************\n ======================================================*/\n/*jshint unused: false*/\n+function ($) {\n \"use strict\";\n $.allowPanelOpen = true;\n $.openPanel = function (panel) {\n if (!$.allowPanelOpen) return false;\n if(panel === 'left' || panel === 'right') panel = \".panel-\" + panel; //可以传入一个方向\n panel = panel ? $(panel) : $(\".panel\").eq(0);\n var direction = panel.hasClass(\"panel-right\") ? \"right\" : \"left\";\n if (panel.length === 0 || panel.hasClass('active')) return false;\n $.closePanel(); // Close if some panel is opened\n $.allowPanelOpen = false;\n var effect = panel.hasClass('panel-reveal') ? 'reveal' : 'cover';\n panel.css({display: 'block'}).addClass('active');\n panel.trigger('open');\n\n // Trigger reLayout\n var clientLeft = panel[0].clientLeft;\n\n // Transition End;\n var transitionEndTarget = effect === 'reveal' ? $($.getCurrentPage()) : panel;\n var openedTriggered = false;\n\n function panelTransitionEnd() {\n transitionEndTarget.transitionEnd(function (e) {\n if (e.target === transitionEndTarget[0]) {\n if (panel.hasClass('active')) {\n panel.trigger('opened');\n }\n else {\n panel.trigger('closed');\n }\n $.allowPanelOpen = true;\n }\n else panelTransitionEnd();\n });\n }\n panelTransitionEnd();\n\n $(document.body).addClass('with-panel-' + direction + '-' + effect);\n return true;\n };\n $.closePanel = function () {\n var activePanel = $('.panel.active');\n if (activePanel.length === 0) return false;\n var effect = activePanel.hasClass('panel-reveal') ? 'reveal' : 'cover';\n var panelPosition = activePanel.hasClass('panel-left') ? 'left' : 'right';\n activePanel.removeClass('active');\n var transitionEndTarget = effect === 'reveal' ? $('.page') : activePanel;\n activePanel.trigger('close');\n $.allowPanelOpen = false;\n\n transitionEndTarget.transitionEnd(function () {\n if (activePanel.hasClass('active')) return;\n activePanel.css({display: ''});\n activePanel.trigger('closed');\n $('body').removeClass('panel-closing');\n $.allowPanelOpen = true;\n });\n\n $('body').addClass('panel-closing').removeClass('with-panel-' + panelPosition + '-' + effect);\n };\n\n $(document).on(\"click\", \".open-panel\", function(e) {\n var panel = $(e.target).data('panel');\n $.openPanel(panel);\n });\n $(document).on(\"click\", \".close-panel, .panel-overlay\", function(e) {\n $.closePanel();\n });\n /*======================================================\n ************ Swipe panels ************\n ======================================================*/\n $.initSwipePanels = function () {\n var panel, side;\n var swipePanel = $.smConfig.swipePanel;\n var swipePanelOnlyClose = $.smConfig.swipePanelOnlyClose;\n var swipePanelCloseOpposite = true;\n var swipePanelActiveArea = false;\n var swipePanelThreshold = 2;\n var swipePanelNoFollow = false;\n\n if(!(swipePanel || swipePanelOnlyClose)) return;\n\n var panelOverlay = $('.panel-overlay');\n var isTouched, isMoved, isScrolling, touchesStart = {}, touchStartTime, touchesDiff, translate, opened, panelWidth, effect, direction;\n var views = $('.page');\n\n function handleTouchStart(e) {\n if (!$.allowPanelOpen || (!swipePanel && !swipePanelOnlyClose) || isTouched) return;\n if ($('.modal-in, .photo-browser-in').length > 0) return;\n if (!(swipePanelCloseOpposite || swipePanelOnlyClose)) {\n if ($('.panel.active').length > 0 && !panel.hasClass('active')) return;\n }\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n if (swipePanelCloseOpposite || swipePanelOnlyClose) {\n if ($('.panel.active').length > 0) {\n side = $('.panel.active').hasClass('panel-left') ? 'left' : 'right';\n }\n else {\n if (swipePanelOnlyClose) return;\n side = swipePanel;\n }\n if (!side) return;\n }\n panel = $('.panel.panel-' + side);\n if(!panel[0]) return;\n opened = panel.hasClass('active');\n if (swipePanelActiveArea && !opened) {\n if (side === 'left') {\n if (touchesStart.x > swipePanelActiveArea) return;\n }\n if (side === 'right') {\n if (touchesStart.x < window.innerWidth - swipePanelActiveArea) return;\n }\n }\n isMoved = false;\n isTouched = true;\n isScrolling = undefined;\n\n touchStartTime = (new Date()).getTime();\n direction = undefined;\n }\n function handleTouchMove(e) {\n if (!isTouched) return;\n if(!panel[0]) return;\n if (e.f7PreventPanelSwipe) return;\n var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n }\n if (isScrolling) {\n isTouched = false;\n return;\n }\n if (!direction) {\n if (pageX > touchesStart.x) {\n direction = 'to-right';\n }\n else {\n direction = 'to-left';\n }\n\n if (\n side === 'left' &&\n (\n direction === 'to-left' && !panel.hasClass('active')\n ) ||\n side === 'right' &&\n (\n direction === 'to-right' && !panel.hasClass('active')\n )\n )\n {\n isTouched = false;\n return;\n }\n }\n\n if (swipePanelNoFollow) {\n var timeDiff = (new Date()).getTime() - touchStartTime;\n if (timeDiff < 300) {\n if (direction === 'to-left') {\n if (side === 'right') $.openPanel(side);\n if (side === 'left' && panel.hasClass('active')) $.closePanel();\n }\n if (direction === 'to-right') {\n if (side === 'left') $.openPanel(side);\n if (side === 'right' && panel.hasClass('active')) $.closePanel();\n }\n }\n isTouched = false;\n console.log(3);\n isMoved = false;\n return;\n }\n\n if (!isMoved) {\n effect = panel.hasClass('panel-cover') ? 'cover' : 'reveal';\n if (!opened) {\n panel.show();\n panelOverlay.show();\n }\n panelWidth = panel[0].offsetWidth;\n panel.transition(0);\n /*\n if (panel.find('.' + app.params.viewClass).length > 0) {\n if (app.sizeNavbars) app.sizeNavbars(panel.find('.' + app.params.viewClass)[0]);\n }\n */\n }\n\n isMoved = true;\n\n e.preventDefault();\n var threshold = opened ? 0 : -swipePanelThreshold;\n if (side === 'right') threshold = -threshold;\n\n touchesDiff = pageX - touchesStart.x + threshold;\n\n if (side === 'right') {\n translate = touchesDiff - (opened ? panelWidth : 0);\n if (translate > 0) translate = 0;\n if (translate < -panelWidth) {\n translate = -panelWidth;\n }\n }\n else {\n translate = touchesDiff + (opened ? panelWidth : 0);\n if (translate < 0) translate = 0;\n if (translate > panelWidth) {\n translate = panelWidth;\n }\n }\n if (effect === 'reveal') {\n views.transform('translate3d(' + translate + 'px,0,0)').transition(0);\n panelOverlay.transform('translate3d(' + translate + 'px,0,0)');\n //app.pluginHook('swipePanelSetTransform', views[0], panel[0], Math.abs(translate / panelWidth));\n }\n else {\n panel.transform('translate3d(' + translate + 'px,0,0)').transition(0);\n //app.pluginHook('swipePanelSetTransform', views[0], panel[0], Math.abs(translate / panelWidth));\n }\n }\n function handleTouchEnd(e) {\n if (!isTouched || !isMoved) {\n isTouched = false;\n isMoved = false;\n return;\n }\n isTouched = false;\n isMoved = false;\n var timeDiff = (new Date()).getTime() - touchStartTime;\n var action;\n var edge = (translate === 0 || Math.abs(translate) === panelWidth);\n\n if (!opened) {\n if (translate === 0) {\n action = 'reset';\n }\n else if (\n timeDiff < 300 && Math.abs(translate) > 0 ||\n timeDiff >= 300 && (Math.abs(translate) >= panelWidth / 2)\n ) {\n action = 'swap';\n }\n else {\n action = 'reset';\n }\n }\n else {\n if (translate === -panelWidth) {\n action = 'reset';\n }\n else if (\n timeDiff < 300 && Math.abs(translate) >= 0 ||\n timeDiff >= 300 && (Math.abs(translate) <= panelWidth / 2)\n ) {\n if (side === 'left' && translate === panelWidth) action = 'reset';\n else action = 'swap';\n }\n else {\n action = 'reset';\n }\n }\n if (action === 'swap') {\n $.allowPanelOpen = true;\n if (opened) {\n $.closePanel();\n if (edge) {\n panel.css({display: ''});\n $('body').removeClass('panel-closing');\n }\n }\n else {\n $.openPanel(side);\n }\n if (edge) $.allowPanelOpen = true;\n }\n if (action === 'reset') {\n if (opened) {\n $.allowPanelOpen = true;\n $.openPanel(side);\n }\n else {\n $.closePanel();\n if (edge) {\n $.allowPanelOpen = true;\n panel.css({display: ''});\n }\n else {\n var target = effect === 'reveal' ? views : panel;\n $('body').addClass('panel-closing');\n target.transitionEnd(function () {\n $.allowPanelOpen = true;\n panel.css({display: ''});\n $('body').removeClass('panel-closing');\n });\n }\n }\n }\n if (effect === 'reveal') {\n views.transition('');\n views.transform('');\n }\n panel.transition('').transform('');\n panelOverlay.css({display: ''}).transform('');\n }\n $(document).on($.touchEvents.start, handleTouchStart);\n $(document).on($.touchEvents.move, handleTouchMove);\n $(document).on($.touchEvents.end, handleTouchEnd);\n };\n\n $.initSwipePanels();\n}(Zepto);\n\n/**\n * 路由\n *\n * 路由功能将接管页面的链接点击行为,最后达到动画切换的效果,具体如下:\n * 1. 链接对应的是另一个页面,那么则尝试 ajax 加载,然后把新页面里的符合约定的结构提取出来,然后做动画切换;如果没法 ajax 或结构不符合,那么则回退为普通的页面跳转\n * 2. 链接是当前页面的锚点,并且该锚点对应的元素存在且符合路由约定,那么则把该元素做动画切入\n * 3. 浏览器前进后退(history.forward/history.back)时,也使用动画效果\n * 4. 如果链接有 back 这个 class,那么则忽略一切,直接调用 history.back() 来后退\n *\n * 路由功能默认开启,如果需要关闭路由功能,那么在 zepto 之后,msui 脚本之前设置 $.config.router = false 即可(intro.js 中会 extend 到 $.smConfig 中)。\n *\n * 可以设置 $.config.routerFilter 函数来设置当前点击链接是否使用路由功能,实参是 a 链接的 zepto 对象;返回 false 表示不使用 router 功能。\n *\n * ajax 载入新的文档时,并不会执行里面的 js。到目前为止,在开启路由功能时,建议的做法是:\n * 把所有页面的 js 都放到同一个脚本里,js 里面的事件绑定使用委托而不是直接的绑定在元素上(因为动态加载的页面元素还不存在),然后所有页面都引用相同的 js 脚本。非事件类可以通过监控 pageInit 事件,根据里面的 pageId 来做对应区别处理。\n *\n * 如果有需要\n *\n * 对外暴露的方法\n * - load (原 loadPage 效果一致,但后者已标记为待移除)\n * - forward\n * - back\n *\n * 事件\n * pageLoad* 系列在发生 ajax 加载时才会触发;当是块切换或已缓存的情况下,不会发送这些事件\n * - pageLoadCancel: 如果前一个还没加载完,那么取消并发送该事件\n * - pageLoadStart: 开始加载\n * - pageLodComplete: ajax complete 完成\n * - pageLoadError: ajax 发生 error\n * - pageAnimationStart: 执行动画切换前,实参是 event,sectionId 和 $section\n * - pageAnimationEnd: 执行动画完毕,实参是 event,sectionId 和 $section\n * - beforePageRemove: 新 document 载入且动画切换完毕,旧的 document remove 之前在 window 上触发,实参是 event 和 $pageContainer\n * - pageRemoved: 新的 document 载入且动画切换完毕,旧的 document remove 之后在 window 上触发\n * - beforePageSwitch: page 切换前,在 pageAnimationStart 前,beforePageSwitch 之后会做一些额外的处理才触发 pageAnimationStart\n * - pageInitInternal: (经 init.js 处理后,对外是 pageInit)紧跟着动画完成的事件,实参是 event,sectionId 和 $section\n *\n * 术语\n * - 文档(document),不带 hash 的 url 关联着的应答 html 结构\n * - 块(section),一个文档内有指定块标识的元素\n *\n * 路由实现约定\n * - 每个文档的需要展示的内容必需位于指定的标识(routerConfig.sectionGroupClass)的元素里面,默认是: div.page-group (注意,如果改变这个需要同时改变 less 中的命名)\n * - 每个块必需带有指定的块标识(routerConfig.pageClass),默认是 .page\n *\n * 即,使用路由功能的每一个文档应当是下面这样的结构(省略 等):\n *
\n *
xxx
\n *
yyy
\n *
\n *\n * 另,每一个块都应当有一个唯一的 ID,这样才能通过 #the-id 的形式来切换定位。\n * 当一个块没有 id 时,如果是第一个的默认的需要展示的块,那么会给其添加一个随机的 id;否则,没有 id 的块将不会被切换展示。\n *\n * 通过 history.state/history.pushState 以及用 sessionStorage 来记录当前 state 以及最大的 state id 来辅助前进后退的切换效果,所以在不支持 sessionStorage 的情况下,将不开启路由功能。\n *\n * 为了解决 ajax 载入页面导致重复 ID 以及重复 popup 等功能,上面约定了使用路由功能的所有可展示内容都必需位于指定元素内。从而可以在进行文档间切换时可以进行两个文档的整体移动,切换完毕后再把前一个文档的内容从页面之间移除。\n *\n * 默认地过滤了部分协议的链接,包括 tel:, javascript:, mailto:,这些链接将不会使用路由功能。如果有更多的自定义控制需求,可以在 $.config.routerFilter 实现\n *\n * 注: 以 _ 开头的函数标明用于此处内部使用,可根据需要随时重构变更,不对外确保兼容性。\n *\n */\n+function($) {\n 'use strict';\n\n if (!window.CustomEvent) {\n window.CustomEvent = function(type, config) {\n config = config || { bubbles: false, cancelable: false, detail: undefined};\n var e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, config.bubbles, config.cancelable, config.detail);\n return e;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n var EVENTS = {\n pageLoadStart: 'pageLoadStart', // ajax 开始加载新页面前\n pageLoadCancel: 'pageLoadCancel', // 取消前一个 ajax 加载动作后\n pageLoadError: 'pageLoadError', // ajax 加载页面失败后\n pageLoadComplete: 'pageLoadComplete', // ajax 加载页面完成后(不论成功与否)\n pageAnimationStart: 'pageAnimationStart', // 动画切换 page 前\n pageAnimationEnd: 'pageAnimationEnd', // 动画切换 page 结束后\n beforePageRemove: 'beforePageRemove', // 移除旧 document 前(适用于非内联 page 切换)\n pageRemoved: 'pageRemoved', // 移除旧 document 后(适用于非内联 page 切换)\n beforePageSwitch: 'beforePageSwitch', // page 切换前,在 pageAnimationStart 前,beforePageSwitch 之后会做一些额外的处理才触发 pageAnimationStart\n pageInit: 'pageInitInternal' // 目前是定义为一个 page 加载完毕后(实际和 pageAnimationEnd 等同)\n };\n\n var Util = {\n /**\n * 获取 url 的 fragment(即 hash 中去掉 # 的剩余部分)\n *\n * 如果没有则返回空字符串\n * 如: http://example.com/path/?query=d#123 => 123\n *\n * @param {String} url url\n * @returns {String}\n */\n getUrlFragment: function(url) {\n var hashIndex = url.indexOf('#');\n return hashIndex === -1 ? '' : url.slice(hashIndex + 1);\n },\n /**\n * 获取一个链接相对于当前页面的绝对地址形式\n *\n * 假设当前页面是 http://a.com/b/c\n * 那么有以下情况:\n * d => http://a.com/b/d\n * /e => http://a.com/e\n * #1 => http://a.com/b/c#1\n * http://b.com/f => http://b.com/f\n *\n * @param {String} url url\n * @returns {String}\n */\n getAbsoluteUrl: function(url) {\n var link = document.createElement('a');\n link.setAttribute('href', url);\n var absoluteUrl = link.href;\n link = null;\n return absoluteUrl;\n },\n /**\n * 获取一个 url 的基本部分,即不包括 hash\n *\n * @param {String} url url\n * @returns {String}\n */\n getBaseUrl: function(url) {\n var hashIndex = url.indexOf('#');\n return hashIndex === -1 ? url.slice(0) : url.slice(0, hashIndex);\n },\n /**\n * 把一个字符串的 url 转为一个可获取其 base 和 fragment 等的对象\n *\n * @param {String} url url\n * @returns {UrlObject}\n */\n toUrlObject: function(url) {\n var fullUrl = this.getAbsoluteUrl(url),\n baseUrl = this.getBaseUrl(fullUrl),\n fragment = this.getUrlFragment(url);\n\n return {\n base: baseUrl,\n full: fullUrl,\n original: url,\n fragment: fragment\n };\n },\n /**\n * 判断浏览器是否支持 sessionStorage,支持返回 true,否则返回 false\n * @returns {Boolean}\n */\n supportStorage: function() {\n\t\t\treturn true;\n }\n };\n\n var routerConfig = {\n sectionGroupClass: 'page-group',\n // 表示是当前 page 的 class\n curPageClass: 'page-current',\n // 用来辅助切换时表示 page 是 visible 的,\n // 之所以不用 curPageClass,是因为 page-current 已被赋予了「当前 page」这一含义而不仅仅是 display: block\n // 并且,别的地方已经使用了,所以不方便做变更,故新增一个\n visiblePageClass: 'page-visible',\n // 表示是 page 的 class,注意,仅是标志 class,而不是所有的 class\n pageClass: 'page'\n };\n\n var DIRECTION = {\n leftToRight: 'from-left-to-right',\n rightToLeft: 'from-right-to-left'\n };\n\n var theHistory = window.history;\n\n var Router = function() {\n this.sessionNames = {\n currentState: 'sm.router.currentState',\n maxStateId: 'sm.router.maxStateId'\n };\n\n this._init();\n this.xhr = null;\n window.addEventListener('popstate', this._onPopState.bind(this));\n };\n\n /**\n * 初始化\n *\n * - 把当前文档内容缓存起来\n * - 查找默认展示的块内容,查找顺序如下\n * 1. id 是 url 中的 fragment 的元素\n * 2. 有当前块 class 标识的第一个元素\n * 3. 第一个块\n * - 初始页面 state 处理\n *\n * @private\n */\n Router.prototype._init = function() {\n\n this.$view = $('body');\n\n // 用来保存 document 的 map\n this.cache = {};\n var $doc = $(document);\n var currentUrl = location.href;\n this._saveDocumentIntoCache($doc, currentUrl);\n\n //extend Ajax 页面js/css 加载支持\n this._PageExtendCache={};\n this._PageExtendDomCache={};\n this._PageNoCaches={};\t\t\t\t//链接标记 data-no-cache 的记录\n this._htmlResponseCaches={};\t\t//记录 ajax 获得的页面内容\n\n this._PageExcludePushingState={};\t//不记录到History 地址\n\t\t\n\t\tthis._SupportH5History=true;\n\n this._BackNUrl=\"\";\n\n var curPageId;\n\n var currentUrlObj = Util.toUrlObject(currentUrl);\n var $allSection = $doc.find('.' + routerConfig.pageClass);\n var $visibleSection = $doc.find('.' + routerConfig.curPageClass);\n var $curVisibleSection = $visibleSection.eq(0);\n var $hashSection;\n\n if (currentUrlObj.fragment) {\n $hashSection = $doc.find('#' + currentUrlObj.fragment);\n }\n if ($hashSection && $hashSection.length) {\n $visibleSection = $hashSection.eq(0);\n } else if (!$visibleSection.length) {\n $visibleSection = $allSection.eq(0);\n }\n if (!$visibleSection.attr('id')) {\n $visibleSection.attr('id', this._generateRandomId());\n }\n\n if ($curVisibleSection.length &&\n ($curVisibleSection.attr('id') !== $visibleSection.attr('id'))) {\n // 在 router 到 inner page 的情况下,刷新(或者直接访问该链接)\n // 直接切换 class 会有「闪」的现象,或许可以采用 animateSection 来减缓一下\n $curVisibleSection.removeClass(routerConfig.curPageClass);\n $visibleSection.addClass(routerConfig.curPageClass);\n } else {\n $visibleSection.addClass(routerConfig.curPageClass);\n }\n curPageId = $visibleSection.attr('id');\n\n\n // 新进入一个使用 history.state 相关技术的页面时,如果第一个 state 不 push/replace,\n // 那么在后退回该页面时,将不触发 popState 事件\n if (theHistory.state === null || typeof(theHistory.state)==\"undefined\") {\n var curState = {\n id: this._getNextStateId(),\n url: Util.toUrlObject(currentUrl),\n pageId: curPageId\n };\n\n theHistory.replaceState(curState, '', currentUrl);\n this._saveAsCurrentState(curState);\n this._incMaxStateId();\n\t\t\t\n\t\t\tif(theHistory.state===null || typeof(theHistory.state)==\"undefined\"){\n\t\t\t\tthis._SupportH5History=false;\n\t\t\t}\n }\n };\n\n /**\n * 切换到 url 指定的块或文档\n *\n * 如果 url 指向的是当前页面,那么认为是切换块;\n * 否则是切换文档\n *\n * @param {String} url url\n * @param {Boolean=} ignoreCache 是否强制请求不使用缓存,对 document 生效,默认是 false\n */\n Router.prototype.load = function(url, ignoreCache,ignoreSameUrl, direction) {\n\t\tif(this._SupportH5History==false){\n\t\t\twindow.location.href=url;\n\t\t\treturn;\n\t\t}\n\t\t\n if (ignoreCache === undefined) {\n ignoreCache = false;\n }\n if (ignoreSameUrl === undefined) {\n ignoreSameUrl = false;\n }\n\n if (this._isTheSameDocument(location.href, url) && ignoreSameUrl==false ) {\n this._switchToSection(Util.getUrlFragment(url));\n } else {\n if(ignoreSameUrl==false){\n this._saveDocumentIntoCache($(document), location.href); \n if (direction && direction == 'leftToRight'){ \n this._switchToDocument(url, ignoreCache,true,DIRECTION.leftToRight);\n } else {\n this._switchToDocument(url, ignoreCache);\n }\n }else{\n this._switchToDocument(url, ignoreCache,false);\n }\n\n }\n };\n //注册回退地址,一旦不为空, onPopupState 监控 回退直到 匹配的地址上\n Router.prototype.registerBack2Url = function (url){\n this._BackNUrl=url;\n };\n\n\n /**\n * 调用 history.forward()\n */\n Router.prototype.forward = function() {\n theHistory.forward();\n };\n\n /**\n * 调用 history.back()\n */\n Router.prototype.back = function() {\n theHistory.back();\n };\n\n //noinspection JSUnusedGlobalSymbols\n /**\n * @deprecated\n */\n Router.prototype.loadPage = Router.prototype.load;\n\n /**\n * 切换显示当前文档另一个块\n *\n * 把新块从右边切入展示,同时会把新的块的记录用 history.pushState 来保存起来\n *\n * 如果已经是当前显示的块,那么不做任何处理;\n * 如果没对应的块,那么忽略。\n *\n * @param {String} sectionId 待切换显示的块的 id\n * @private\n */\n Router.prototype._switchToSection = function(sectionId) {\n if (!sectionId) {\n return;\n }\n\n var $curPage = this._getCurrentSection(),\n $newPage = $('#' + sectionId);\n\n // 如果已经是当前页,不做任何处理\n if ($curPage === $newPage) {\n return;\n }\n\n this._animateSection($curPage, $newPage, DIRECTION.rightToLeft);\n this._pushNewState('#' + sectionId, sectionId);\n };\n\n /**\n * 载入显示一个新的文档\n *\n * - 如果有缓存,那么直接利用缓存来切换\n * - 否则,先把页面加载过来缓存,然后再切换\n * - 如果解析失败,那么用 location.href 的方式来跳转\n *\n * 注意:不能在这里以及其之后用 location.href 来 **读取** 切换前的页面的 url,\n * 因为如果是 popState 时的调用,那么此时 location 已经是 pop 出来的 state 的了\n *\n * @param {String} url 新的文档的 url\n * @param {Boolean=} ignoreCache 是否不使用缓存强制加载页面\n * @param {Boolean=} isPushState 是否需要 pushState\n * @param {String=} direction 新文档切入的方向\n * @private\n */\n Router.prototype._switchToDocument = function(url, ignoreCache, isPushState, direction) {\n console.log(\"[SM][Router]_switchToDocument url=\"+url);\n var baseUrl = Util.toUrlObject(url).base;\n var baseUrlExcludeQueryString=this.getExcludeQueryStringUrl(baseUrl);\n\n if(this._PageNoCaches[baseUrlExcludeQueryString]== true){\t\t//检查 DOM 是否使用缓存\n ignoreCache=true;\n }\n\n if (ignoreCache) {\n delete this.cache[baseUrlExcludeQueryString];\n }\n\n var cacheDocument = this.cache[baseUrlExcludeQueryString];\n var context = this;\n\n if (cacheDocument) {\n this._doSwitchDocument(url, isPushState, direction);\n } else {\n this._loadDocument(url, {\n success: function($doc) {\n try {\n context._parseDocument(url, $doc);\n context._doSwitchDocument(url, isPushState, direction);\n } catch (e) {\n console.log(\"[SM][Exception] %o\",e);\n location.href = url;\n }\n },\n error: function() {\n location.href = url;\n }\n });\n }\n };\n\n /**\n * 利用缓存来做具体的切换文档操作\n *\n * - 确定待切入的文档的默认展示 section\n * - 把新文档 append 到 view 中\n * - 动画切换文档\n * - 如果需要 pushState,那么把最新的状态 push 进去并把当前状态更新为该状态\n *\n * @param {String} url 待切换的文档的 url\n * @param {Boolean} isPushState 加载页面后是否需要 pushState,默认是 true\n * @param {String} direction 动画切换方向,默认是 DIRECTION.rightToLeft\n * @private\n */\n Router.prototype._doSwitchDocument = function(url, isPushState, direction) {\n if (typeof isPushState === 'undefined') {\n isPushState = true;\n }\n\n var urlObj = Util.toUrlObject(url);\n var $currentDoc = this.$view.find('.' + routerConfig.sectionGroupClass);\n //var $newDoc = $($('
').append(this.cache[urlObj.base].$content).html());\n var $newDoc = this.cache[this.getExcludeQueryStringUrl(urlObj.base)].$content;\n\n // 确定一个 document 展示 section 的顺序\n // 1. 与 hash 关联的 element\n // 2. 默认的标识为 current 的 element\n // 3. 第一个 section\n var $allSection = $newDoc.find('.' + routerConfig.pageClass);\n var $visibleSection = $newDoc.find('.' + routerConfig.curPageClass);\n var $hashSection;\n\n if (urlObj.fragment) {\n $hashSection = $newDoc.find('#' + urlObj.fragment);\n }\n if ($hashSection && $hashSection.length) {\n $visibleSection = $hashSection.eq(0);\n } else if (!$visibleSection.length) {\n $visibleSection = $allSection.eq(0);\n }\n if (!$visibleSection.attr('id')) {\n $visibleSection.attr('id', this._generateRandomId());\n }\n\n var $currentSection = this._getCurrentSection();\n $currentSection.trigger(EVENTS.beforePageSwitch, [$currentSection.attr('id'), $currentSection]);\n\n $allSection.removeClass(routerConfig.curPageClass);\n $visibleSection.addClass(routerConfig.curPageClass);\n\n if (isPushState) {\n this._pushNewState(url, $visibleSection.attr('id'));\n }\n\n this._loadPageExtendDocument_Style(url);\n\n // prepend 而不 append 的目的是避免 append 进去新的 document 在后面,\n // 其里面的默认展示的(.page-current) 的页面直接就覆盖了原显示的页面(因为都是 absolute)\n this.$view.prepend($newDoc);\n this._loadPageExtendDocument_Script(url);\n\n this._animateDocument($currentDoc, $newDoc, $visibleSection, direction);\n };\n\n Router.prototype._loadPageExtendDocumentInnerScript = function (page_extend_content) {\n console.log(\"[SM][Router _loadPageExtendDocumentInnerScript] page_extend_content=%o\",page_extend_content);\n for(var i=0;i\").html(scriptItem.innerHTML).appendTo($('body'));\n }\n };\n\n //保存 URL 的 data-no-cache 属性\n Router.prototype.savePageNoCaches = function (url,ignoreDataCache) {\n var urlAsKey = Util.toUrlObject(url).base;\n if(ignoreDataCache){\n console.log(\"[SM][Router savePageNoCaches] url=%s\",urlAsKey);\n this._PageNoCaches[this.getExcludeQueryStringUrl(urlAsKey)]=true;\n }\n };\n Router.prototype.registExcludePushingStatePage = function (url){\n var urlAsKey = Util.toUrlObject(url).base;\n this._PageExcludePushingState[this.getExcludeQueryStringUrl(urlAsKey)]=true;\n };\n Router.prototype.clearCacheDom = function(url) {\n var urlAsKey = Util.toUrlObject(url).base;\n delete this.cache[this.getExcludeQueryStringUrl(urlAsKey)];\n };\n Router.prototype.getExcludeQueryStringUrl = function (url){\n var qMaskIndex=url.indexOf(\"?\");\n if(qMaskIndex>0){\n return url.substring(0,qMaskIndex);\n }\n console.log(url)\n return url;\n };\n\n //加载Ajax 页面 style\n Router.prototype._loadPageExtendDocument_Style = function( url) {\n console.log(\"[SM][Router loadPageExtendDocument_Style] url=%s\",url);\n try{\n var self=this;\n var urlAsKey = Util.toUrlObject(url).base;\n var style_loaded=[];\n $(\"link\").each(\n function(){\n if(this.rel==\"stylesheet\"){\n var linkUrlAsKey = Util.toUrlObject(this.href).base;\n if($(this).attr('data-function') != \"common\" ){\n var linkDom=$(this).remove();\n self._PageExtendDomCache[linkUrlAsKey]=linkDom;\n console.log(\"[SM][Router loadPageExtendDocument_Style][Remove Style]:%s\",urlExcludeQueryString);\n }else {\n style_loaded[linkUrlAsKey]=$(this);\n }\n }\n }\n );\n var urlExcludeQueryString=self.getExcludeQueryStringUrl(urlAsKey);\n if(self._PageExtendCache[urlExcludeQueryString]){\n var page_extend_content=self._PageExtendCache[urlExcludeQueryString];\n for(var i=0;i\").attr(link_attrs).appendTo($('head'));\n }\n console.log(\"[SM][Router loadPageExtendDocument_Style][Append Style From Remote]:%s\",linkUrlAsKey);\n }\n }\n }\n }catch(ex){\n console.log(\"Exception: %o\",ex);\n }\n };\n\n //加载Ajax 页面link 和 Script 元素\n Router.prototype._loadPageExtendDocument_Script = function (url) {\n try\n {\n var urlAsKey = Util.toUrlObject(url).base;\n console.log(\"[SM][Router _loadPageExtendDocument_Script] url=%s\",urlAsKey);\n\n var self=this;\n var script_loaded=[];\n\n $(\"script\").each(\n function(){\n if(this.src){\n var scriptUrlAsKey = Util.toUrlObject(this.src).base;\n if($(this).attr('data-function') != \"common\" ){\n var scriptDom=$(this).remove();\n self._PageExtendDomCache[scriptUrlAsKey]=scriptDom;\n console.log(\"[SM][Router _loadPageExtendDocument_Script][Remove Script] %s\",this.src);\n }else{\n script_loaded[scriptUrlAsKey]=$(this);\n }\n }else{\n var scriptDom=$(this).remove();\n console.log(\"[SM][Router _loadPageExtendDocument_Script][Remove Script] document script\");\n }\n }\n );\n var urlExcludeQueryString=self.getExcludeQueryStringUrl(urlAsKey);\n if(self._PageExtendCache[urlExcludeQueryString]){\n var page_extend_content=self._PageExtendCache[urlExcludeQueryString];\n var scriptWaitingLoading=page_extend_content.script_src.length;\n if(scriptWaitingLoading>0){\n for(var i=0;i').append(xhr.response);\n this._parsePageExtendCache_Inner(responsePage,url,true);\n };\n\n //解析页面 responsePage 中的 link,script 元素\n Router.prototype._parsePageExtendCache_Inner = function (responsePage,url,is_remove) {\n var urlAsKey = Util.toUrlObject(url).base;\n var urlExcludeQueryString=this.getExcludeQueryStringUrl(urlAsKey);\n if(typeof(this._PageExtendCache[urlExcludeQueryString])!=\"undefined\"){\n console.log(\"[SM][Router _parsePageExtendCache_Inner] has been parsed and stored in cache url=%s \",urlAsKey);\n return;\n }\n var page_extend_content={\n link_style:[],\n script_src:[],\n script_inner:[]\n };\n var self=this;\n responsePage.find(\"link\").each(\n function(){\n if(this.rel==\"stylesheet\"){\n var isCommon= ($(this).attr('data-function') == \"common\");\n var linkItem={\n href:this.href,\n rel:this.rel,\n is_common:isCommon\n };\n page_extend_content.link_style.push(linkItem);\n }\n }\n );\n responsePage.find(\"script\").each(\n function(){\n var isCommon= ($(this).attr('data-function') == \"common\");\n if(this.src) {\n var scriptItem={\n src:this.src,\n type:\"text/javascript\",\n is_common:isCommon\n };\n page_extend_content.script_src.push(scriptItem);\n }else{\n var scriptItem={\n innerHTML:this.innerHTML,\n type:\"text/javascript\",\n is_common:isCommon\n };\n page_extend_content.script_inner.push(scriptItem);\n }\n }\n );\n this._PageExtendCache[urlExcludeQueryString]=page_extend_content;\n\n if(is_remove){\n $(responsePage).remove();\n }\n }\n\n /**\n * 判断两个 url 指向的页面是否是同一个\n *\n * 判断方式: 如果两个 url 的 base 形式(不带 hash 的绝对形式)相同,那么认为是同一个页面\n *\n * @param {String} url\n * @param {String} anotherUrl\n * @returns {Boolean}\n * @private\n */\n Router.prototype._isTheSameDocument = function(url, anotherUrl) {\n return Util.toUrlObject(url).base === Util.toUrlObject(anotherUrl).base;\n };\n\n /**\n * ajax 加载 url 指定的页面内容\n *\n * 加载过程中会发出以下事件\n * pageLoadCancel: 如果前一个还没加载完,那么取消并发送该事件\n * pageLoadStart: 开始加载\n * pageLodComplete: ajax complete 完成\n * pageLoadError: ajax 发生 error\n *\n *\n * @param {String} url url\n * @param {Object=} callback 回调函数配置,可选,可以配置 success\\error 和 complete\n * 所有回调函数的 this 都是 null,各自实参如下:\n * success: $doc, status, xhr\n * error: xhr, status, err\n * complete: xhr, status\n *\n * @private\n */\n Router.prototype._loadDocument = function(url, callback) {\n if (this.xhr && this.xhr.readyState < 4) {\n this.xhr.onreadystatechange = function() {\n };\n this.xhr.abort();\n this.dispatch(EVENTS.pageLoadCancel);\n }\n\n this.dispatch(EVENTS.pageLoadStart);\n\n callback = callback || {};\n var self = this;\n\n var baseUrl = Util.toUrlObject(url).base;\n var baseUrlExcludeQueryString=this.getExcludeQueryStringUrl(baseUrl);\n if(typeof(this._htmlResponseCaches[baseUrlExcludeQueryString])!=\"undefined\"){\n console.log(\"[SM][Router] LoadDocument %s from cache.\",url);\n var responsePage=$('').append(this._htmlResponseCaches[baseUrlExcludeQueryString]);\n var $doc = $('');\n $doc.append(this._htmlResponseCaches[baseUrlExcludeQueryString]);\n this._parsePageExtendCache_Inner(responsePage,url,true);\n callback.success && callback.success.call(null, $doc, 'success', this.xhr);\n return;\n }\n\n this.xhr = $.ajax({\n url: url,\n success: $.proxy(function(data, status, xhr) {\n this._htmlResponseCaches[baseUrlExcludeQueryString]=data;\n // 给包一层 ,从而可以拿到完整的结构\n var $doc = $('');\n $doc.append(data);\n self._parsePageExtendCache(xhr,url);\n callback.success && callback.success.call(null, $doc, status, xhr);\n }, this),\n error: function(xhr, status, err) {\n callback.error && callback.error.call(null, xhr, status, err);\n self.dispatch(EVENTS.pageLoadError);\n },\n complete: function(xhr, status) {\n callback.complete && callback.complete.call(null, xhr, status);\n //self._loadPageExtendDocument(url);\n self.dispatch(EVENTS.pageLoadComplete);\n }\n });\n };\n\n /**\n * 对于 ajax 加载进来的页面,把其缓存起来\n *\n * @param {String} url url\n * @param $doc ajax 载入的页面的 jq 对象,可以看做是该页面的 $(document)\n * @private\n */\n Router.prototype._parseDocument = function(url, $doc) {\n var $innerView = $doc.find('.' + routerConfig.sectionGroupClass);\n\n if (!$innerView.length) {\n throw new Error('missing router view mark: ' + routerConfig.sectionGroupClass);\n }\n\n this._saveDocumentIntoCache($doc, url);\n };\n\n /**\n * 把一个页面的相关信息保存到 this.cache 中\n *\n * 以页面的 baseUrl 为 key,而 value 则是一个 DocumentCache\n *\n * @param {*} doc doc\n * @param {String} url url\n * @private\n */\n Router.prototype._saveDocumentIntoCache = function(doc, url) {\n var urlAsKey = Util.toUrlObject(url).base;\n var $doc = $(doc);\n\n this.cache[this.getExcludeQueryStringUrl(urlAsKey)] = {\n $doc: $doc,\n $content: $doc.find('.' + routerConfig.sectionGroupClass)\n };\n };\n\n /**\n * 从 sessionStorage 中获取保存下来的「当前状态」\n *\n * 如果解析失败,那么认为当前状态是 null\n *\n * @returns {State|null}\n * @private\n */\n Router.prototype._getLastState = function() {\n var currentState = window.gSessionStorage.getItem(this.sessionNames.currentState);\n try {\n currentState = JSON.parse(currentState);\n } catch(e) {\n currentState = null;\n }\n\n return currentState;\n };\n\n /**\n * 把一个状态设为当前状态,保存仅 sessionStorage 中\n *\n * @param {State} state\n * @private\n */\n Router.prototype._saveAsCurrentState = function(state) {\n window.gSessionStorage.setItem(this.sessionNames.currentState, JSON.stringify(state));\n };\n\n /**\n * 获取下一个 state 的 id\n *\n * 读取 sessionStorage 里的最后的状态的 id,然后 + 1;如果原没设置,那么返回 1\n *\n * @returns {number}\n * @private\n */\n Router.prototype._getNextStateId = function() {\n var maxStateId = window.gSessionStorage.getItem(this.sessionNames.maxStateId);\n return maxStateId ? parseInt(maxStateId, 10) + 1 : 1;\n };\n\n /**\n * 把 sessionStorage 里的最后状态的 id 自加 1\n *\n * @private\n */\n Router.prototype._incMaxStateId = function() {\n window.gSessionStorage.setItem(this.sessionNames.maxStateId, this._getNextStateId());\n };\n\n /**\n * 从一个文档切换为显示另一个文档\n *\n * @param $from 目前显示的文档\n * @param $to 待切换显示的新文档\n * @param $visibleSection 新文档中展示的 section 元素\n * @param direction 新文档切入方向\n * @private\n */\n Router.prototype._animateDocument = function($from, $to, $visibleSection, direction) {\n var sectionId = $visibleSection.attr('id');\n\n\n var $visibleSectionInFrom = $from.find('.' + routerConfig.curPageClass);\n $visibleSectionInFrom.addClass(routerConfig.visiblePageClass).removeClass(routerConfig.curPageClass);\n\n $visibleSection.trigger(EVENTS.pageAnimationStart, [sectionId, $visibleSection]);\n\n this._animateElement($from, $to, direction);\n\n $from.animationEnd(function() {\n $visibleSectionInFrom.removeClass(routerConfig.visiblePageClass);\n // 移除 document 前后,发送 beforePageRemove 和 pageRemoved 事件\n $(window).trigger(EVENTS.beforePageRemove, [$from]);\n $from.remove();\t\t\t//$from.detach();\n $(window).trigger(EVENTS.pageRemoved);\n });\n\n $to.animationEnd(function() {\n $visibleSection.trigger(EVENTS.pageAnimationEnd, [sectionId, $visibleSection]);\n // 外层(init.js)中会绑定 pageInitInternal 事件,然后对页面进行初始化\n $visibleSection.trigger(EVENTS.pageInit, [sectionId, $visibleSection]);\n });\n };\n\n /**\n * 把当前文档的展示 section 从一个 section 切换到另一个 section\n *\n * @param $from\n * @param $to\n * @param direction\n * @private\n */\n Router.prototype._animateSection = function($from, $to, direction) {\n var toId = $to.attr('id');\n $from.trigger(EVENTS.beforePageSwitch, [$from.attr('id'), $from]);\n\n $from.removeClass(routerConfig.curPageClass);\n $to.addClass(routerConfig.curPageClass);\n $to.trigger(EVENTS.pageAnimationStart, [toId, $to]);\n this._animateElement($from, $to, direction);\n $to.animationEnd(function() {\n $to.trigger(EVENTS.pageAnimationEnd, [toId, $to]);\n // 外层(init.js)中会绑定 pageInitInternal 事件,然后对页面进行初始化\n $to.trigger(EVENTS.pageInit, [toId, $to]);\n });\n };\n\n /**\n * 切换显示两个元素\n *\n * 切换是通过更新 class 来实现的,而具体的切换动画则是 class 关联的 css 来实现\n *\n * @param $from 当前显示的元素\n * @param $to 待显示的元素\n * @param direction 切换的方向\n * @private\n */\n Router.prototype._animateElement = function($from, $to, direction) {\n // todo: 可考虑如果入参不指定,那么尝试读取 $to 的属性,再没有再使用默认的\n // 考虑读取点击的链接上指定的方向\n if (typeof direction === 'undefined') {\n direction = DIRECTION.rightToLeft;\n }\n\n var animPageClasses = [\n 'page-from-center-to-left',\n 'page-from-center-to-right',\n 'page-from-right-to-center',\n 'page-from-left-to-center'].join(' ');\n\n var classForFrom, classForTo;\n switch(direction) {\n case DIRECTION.rightToLeft:\n classForFrom = 'page-from-center-to-left';\n classForTo = 'page-from-right-to-center';\n break;\n case DIRECTION.leftToRight:\n classForFrom = 'page-from-center-to-right';\n classForTo = 'page-from-left-to-center';\n /*ios下webview返回会走到这里,动画有问题,会使page消失*/\n var ua = navigator.userAgent;\n if ($.os()==\"ios\" && (!/Safari/i.test(ua))){\n classForTo = '';\n }\n /*end*/\n break;\n default:\n classForFrom = 'page-from-center-to-left';\n classForTo = 'page-from-right-to-center';\n break;\n }\n\n $from.removeClass(animPageClasses).addClass(classForFrom);\n $to.removeClass(animPageClasses).addClass(classForTo);\n\n $from.animationEnd(function() {\n $from.removeClass(animPageClasses);\n });\n $to.animationEnd(function() {\n $to.removeClass(animPageClasses);\n });\n };\n\n /**\n * 获取当前显示的第一个 section\n *\n * @returns {*}\n * @private\n */\n Router.prototype._getCurrentSection = function() {\n return this.$view.find('.' + routerConfig.curPageClass).eq(0);\n };\n\n /**\n * popState 事件关联着的后退处理\n *\n * 判断两个 state 判断是否是属于同一个文档,然后做对应的 section 或文档切换;\n * 同时在切换后把新 state 设为当前 state\n *\n * @param {State} state 新 state\n * @param {State} fromState 旧 state\n * @private\n */\n Router.prototype._back = function(state, fromState) {\n console.log(\"[SM][Router]_back: state=%o fromState=%o\",state,fromState);\n if (this._isTheSameDocument(state.url.full, fromState.url.full)) {\n var $newPage = $('#' + state.pageId);\n if ($newPage.length) {\n var $currentPage = this._getCurrentSection();\n this._animateSection($currentPage, $newPage, DIRECTION.leftToRight);\n this._saveAsCurrentState(state);\n } else {\n location.href = state.url.full;\n }\n } else {\n this._saveDocumentIntoCache($(document), fromState.url.full);\n var ignoreCache=false;\n var urlExcludeQueryString=this.getExcludeQueryStringUrl(state.url.full);\n if(typeof(this._PageNoCaches[urlExcludeQueryString])!=\"undefined\" && this._PageNoCaches[urlExcludeQueryString]==true){\n ignoreCache=true;\n }\n this._switchToDocument(state.url.full, ignoreCache, false, DIRECTION.leftToRight);\n this._saveAsCurrentState(state);\n }\n };\n\n /**\n * popState 事件关联着的前进处理,类似于 _back,不同的是切换方向\n *\n * @param {State} state 新 state\n * @param {State} fromState 旧 state\n * @private\n */\n Router.prototype._forward = function(state, fromState) {\n console.log(\"[SM][Router]_forward: state=%o fromState=%o\",state,fromState);\n if (this._isTheSameDocument(state.url.full, fromState.url.full)) {\n var $newPage = $('#' + state.pageId);\n if ($newPage.length) {\n var $currentPage = this._getCurrentSection();\n this._animateSection($currentPage, $newPage, DIRECTION.rightToLeft);\n this._saveAsCurrentState(state);\n } else {\n location.href = state.url.full;\n }\n } else {\n this._saveDocumentIntoCache($(document), fromState.url.full);\n var ignoreCache=false;\n var urlExcludeQueryString=this.getExcludeQueryStringUrl(state.url.full);\n if(typeof(this._PageNoCaches[urlExcludeQueryString])!=\"undefined\" && this._PageNoCaches[urlExcludeQueryString]==true){\n ignoreCache=true;\n }\n this._switchToDocument(state.url.full, ignoreCache, false, DIRECTION.rightToLeft);\n this._saveAsCurrentState(state);\n }\n };\n\n /**\n * popState 事件处理\n *\n * 根据 pop 出来的 state 和当前 state 来判断是前进还是后退\n *\n * @param event\n * @private\n */\n Router.prototype._onPopState = function(event) {\n console.log(\"[STATE][onPopState Event] %o\",event);\n var state = event.state;\n //back util to _BackNUrl\n if(this._BackNUrl!=\"\"){\n var urlAsKey = Util.toUrlObject(this._BackNUrl).base;\n if(urlAsKey==state.url.base){\n this._BackNUrl=\"\";\n }else{\n if(theHistory.length<=0){\n this._BackNUrl=\"\";\n }else{\n return setTimeout(function(){ $.router.back();10});\n }\n }\n }\n\n // if not a valid state, do nothing\n if (!state || !state.pageId) {\n return;\n }\n\n var lastState = this._getLastState();\n\n if (!lastState) {\n console.error && console.error('Missing last state when backward or forward');\n return;\n }\n\n if (state.id === lastState.id) {\n return;\n }\n\n $.closeModal();\n if (state.id < lastState.id) {\n this._back(state, lastState);\n } else {\n this._forward(state, lastState);\n }\n };\n\n /**\n * 页面进入到一个新状态\n *\n * 把新状态 push 进去,设置为当前的状态,然后把 maxState 的 id +1。\n *\n * @param {String} url 新状态的 url\n * @param {String} sectionId 新状态中显示的 section 元素的 id\n * @private\n */\n Router.prototype._pushNewState = function(url, sectionId) {\n console.log(\"[STATE][PushNewState url:%s sectionId=%s\",url, sectionId);\n //\n var urlAsKey = Util.toUrlObject(url).base;\n if(this._PageExcludePushingState[this.getExcludeQueryStringUrl(urlAsKey)]==true){\n return;\n }\n\n var state = {\n id: this._getNextStateId(),\n pageId: sectionId,\n url: Util.toUrlObject(url)\n };\n theHistory.pushState(state, '', url);\n this._saveAsCurrentState(state);\n this._incMaxStateId();\n };\n\n /**\n * 生成一个随机的 id\n *\n * @returns {string}\n * @private\n */\n Router.prototype._generateRandomId = function() {\n return \"page-\" + (+new Date());\n };\n\n Router.prototype.dispatch = function(event) {\n var e = new CustomEvent(event, {\n bubbles: true,\n cancelable: true\n });\n\n //noinspection JSUnresolvedFunction\n window.dispatchEvent(e);\n };\n\n /**\n * 判断一个链接是否使用 router 来处理\n *\n * @param $link\n * @returns {boolean}\n */\n function isInRouterBlackList($link) {\n var classBlackList = [\n 'external',\n 'tab-link',\n 'open-popup',\n 'close-popup',\n 'open-panel',\n 'close-panel'\n ];\n\n for (var i = classBlackList.length -1 ; i >= 0; i--) {\n if ($link.hasClass(classBlackList[i])) {\n return true;\n }\n }\n\n var linkEle = $link.get(0);\n var linkHref = linkEle.getAttribute('href');\n\n var protoWhiteList = [\n 'http',\n 'https'\n ];\n\n //如果非noscheme形式的链接,且协议不是http(s),那么路由不会处理这类链接\n if (/^(\\w+):/.test(linkHref) && protoWhiteList.indexOf(RegExp.$1) < 0) {\n return true;\n }\n\n //noinspection RedundantIfStatementJS\n if (linkEle.hasAttribute('external')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * 自定义是否执行路由功能的过滤器\n *\n * 可以在外部定义 $.config.routerFilter 函数,实参是点击链接的 Zepto 对象。\n *\n * @param $link 当前点击的链接的 Zepto 对象\n * @returns {boolean} 返回 true 表示执行路由功能,否则不做路由处理\n */\n function customClickFilter($link) {\n var customRouterFilter = $.smConfig.routerFilter;\n if ($.isFunction(customRouterFilter)) {\n var filterResult = customRouterFilter($link);\n if (typeof filterResult === 'boolean') {\n return filterResult;\n }\n }\n\n return true;\n }\n\n $(function() {\n // 用户可选关闭router功能\n if (!$.smConfig.router) {\n return;\n }\n\n if (!Util.supportStorage()) {\n return;\n }\n\n var $pages = $('.' + routerConfig.pageClass);\n if (!$pages.length) {\n var warnMsg = 'Disable router function because of no .page elements';\n if (window.console && window.console.warn) {\n console.warn(warnMsg);\n }\n return;\n }\n\n var router = $.router = new Router();\n $.router._parsePageExtendCacheInit(); //add by robin 分析入口页面的资源,缓存起来\n $(document).on('click', 'a', function(e) {\n var $target = $(e.currentTarget);\n\n var filterResult = customClickFilter($target);\n if (!filterResult) {\n return;\n }\n\n if (isInRouterBlackList($target)) {\n return;\n }\n\n e.preventDefault();\n\n if ($target.hasClass('back')) {\n router.back();\n } else {\n var url = $target.attr('href');\n if (!url || url === '#') {\n return;\n }\n\n var ignoreCache = $target.attr('data-no-cache') === 'true';\n router.savePageNoCaches(url,ignoreCache);\n\n router.load(url, ignoreCache);\n }\n });\n });\n}(Zepto);\n\n/**\n * @typedef {Object} State\n * @property {Number} id\n * @property {String} url\n * @property {String} pageId\n */\n\n/**\n * @typedef {Object} UrlObject 字符串 url 转为的对象\n * @property {String} base url 的基本路径\n * @property {String} full url 的完整绝对路径\n * @property {String} origin 转换前的 url\n * @property {String} fragment url 的 fragment\n */\n\n/**\n * @typedef {Object} DocumentCache\n * @property {*|HTMLElement} $doc 看做是 $(document)\n * @property {*|HTMLElement} $content $doc 里的 routerConfig.innerViewClass 元素\n */\n\n/*======================================================\n ************ Modals ************\n ======================================================*/\n/*jshint unused: false*/\n+function ($) {\n \"use strict\";\n $.lastPosition =function(options) {\n // 需要记忆模块的className\n var needMemoryClass = options.needMemoryClass || [];\n\n $(window).off('beforePageSwitch').on('beforePageSwitch', function(event,id,arg) {\n updateMemory(id,arg);\n });\n $(window).off('pageAnimationStart').on('pageAnimationStart', function(event,id,arg) {\n getMemory(id,arg);\n });\n //让后退页面回到之前的高度\n function getMemory(id,arg){\n needMemoryClass.forEach(function(item, index) {\n if ($(item).length === 0) {\n return;\n }\n var positionName = id ;\n // 遍历对应节点设置存储的高度\n var memoryHeight = window.gSessionStorage.getItem(positionName);\n arg.find(item).scrollTop(parseInt(memoryHeight));\n\n });\n }\n //记住即将离开的页面的高度\n function updateMemory(id,arg) {\n var positionName = id ;\n // 存储需要记忆模块的高度\n needMemoryClass.forEach(function(item, index) {\n if ($(item).length === 0) {\n return;\n }\n window.gSessionStorage.setItem(\n positionName,\n arg.find(item).scrollTop()\n );\n\n });\n }\n };\n}(Zepto);\n\n/*jshint unused: false*/\n+function($) {\n 'use strict';\n\n var getPage = function() {\n var $page = $(\".page-current\");\n if (!$page[0]) $page = $(\".page\").addClass('page-current');\n return $page;\n };\n\n //初始化页面中的JS组件\n $.initPage = function(page) {\n var $page = getPage();\n if (!$page[0]) $page = $(document.body);\n var $content = $page.hasClass('content') ?\n $page :\n $page.find('.content');\n $content.scroller(); //注意滚动条一定要最先初始化\n\n $.initPullToRefresh($content);\n $.initInfiniteScroll($content);\n $.initCalendar($content);\n\n //extend\n if ($.initSwiper) $.initSwiper($content);\n };\n\n if ($.smConfig.showPageLoadingIndicator) {\n //这里的 以 push 开头的是私有事件,不要用\n $(window).on('pageLoadStart', function() {\n $.showIndicator();\n\n });\n $(window).on('pageAnimationStart', function() {\n $.hideIndicator();\n });\n $(window).on('pageLoadCancel', function() {\n $.hideIndicator();\n });\n $(window).on('pageLoadComplete', function() {\n $.hideIndicator();\n });\n $(window).on('pageLoadError', function() {\n $.hideIndicator();\n $.toast('加载失败');\n });\n }\n\n $(window).on('pageAnimationStart', function(event,id,page) {\n // 在路由切换页面动画开始前,为了把位于 .page 之外的 popup 等隐藏,此处做些处理\n $.closeModal();\n $.closePanel();\n // 如果 panel 的 effect 是 reveal 时,似乎是 page 的动画或别的样式原因导致了 transitionEnd 时间不会触发\n // 这里暂且处理一下\n $('body').removeClass('panel-closing');\n $.allowPanelOpen = true;\n });\n\n $(window).on('pageInit', function() {\n $.hideIndicator();\n $.lastPosition({\n needMemoryClass: [\n '.content'\n ]\n });\n });\n // safari 在后退的时候会使用缓存技术,但实现上似乎存在些问题,\n // 导致路由中绑定的点击事件不会正常如期的运行(log 和 debugger 都没法调试),\n // 从而后续的跳转等完全乱了套。\n // 所以,这里检测到是 safari 的 cache 的情况下,做一次 reload\n // 测试路径(后缀 D 表示是 document,E 表示 external,不使用路由跳转):\n // 1. aD -> bDE\n // 2. back\n // 3. aD -> bD\n window.addEventListener('pageshow', function(event) {\n if (event.persisted) {\n location.reload();\n }\n });\n\n $.init = function() {\n var $page = getPage();\n var id = $page[0].id;\n $.initPage();\n $page.trigger('pageInit', [id, $page]);\n };\n\n //DOM READY\n $(function() {\n //直接绑定\n FastClick.attach(document.body);\n\n if ($.smConfig.autoInit) {\n $.init();\n }\n\n $(document).on('pageInitInternal', function(e, id, page) {\n $.init();\n });\n });\n\n}(Zepto);\n\n/**\n * ScrollFix v0.1\n * http://www.joelambert.co.uk\n *\n * Copyright 2011, Joe Lambert.\n * Free to use under the MIT license.\n * http://www.opensource.org/licenses/mit-license.php\n */\n/* ===============================================================================\n ************ ScrollFix ************\n =============================================================================== */\n\n+ function($) {\n \"use strict\";\n //安卓微信中使用scrollfix会有问题,因此只在ios中使用,安卓机器按照原来的逻辑\n\n if($.device.ios){\n var ScrollFix = function(elem) {\n\n // Variables to track inputs\n var startY;\n var startTopScroll;\n\n elem = elem || document.querySelector(elem);\n\n // If there is no element, then do nothing\n if(!elem)\n return;\n\n // Handle the start of interactions\n elem.addEventListener('touchstart', function(event){\n startY = event.touches[0].pageY;\n startTopScroll = elem.scrollTop;\n\n if(startTopScroll <= 0)\n elem.scrollTop = 1;\n\n if(startTopScroll + elem.offsetHeight >= elem.scrollHeight)\n elem.scrollTop = elem.scrollHeight - elem.offsetHeight - 1;\n }, false);\n };\n\n var initScrollFix = function(){\n var prefix = $('.page-current').length > 0 ? '.page-current ' : '';\n var scrollable = $(prefix + \".content\");\n new ScrollFix(scrollable[0]);\n };\n\n $(document).on($.touchEvents.move, \".page-current .bar\",function(){\n event.preventDefault();\n });\n //监听ajax页面跳转\n $(document).on(\"pageLoadComplete\", function(){\n initScrollFix();\n });\n //监听内联页面跳转\n $(document).on(\"pageAnimationEnd\", function(){\n initScrollFix();\n });\n initScrollFix();\n }\n\n}(Zepto);\n"],"names":["$","smVersion","defaults","autoInit","showPageLoadingIndicator","router","swipePanel","swipePanelOnlyClose","smConfig","extend","config","Zepto","compareVersion","a","b","as","split","bs","i","length","x","parseInt","y","getCurrentPage","document","body","__dealCssEvent","eventNameArr","callback","fireCallBack","e","target","this","call","events","dom","off","on","forEach","dimension","Dimension","replace","m","toUpperCase","fn","margin","elem","size","sides","width","height","side","css","support","touch","window","DocumentTouch","touchEvents","start","move","end","getTranslate","el","axis","matrix","curTransform","curStyle","transformMatrix","getComputedStyle","WebKitCSSMatrix","webkitTransform","MozTransform","transform","getPropertyValue","toString","m41","parseFloat","m42","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","setTimeout","cancelAnimationFrame","id","webkitCancelAnimationFrame","mozCancelAnimationFrame","clearTimeout","dataset","ds","key","item","__eleData","data","value","tmpData","dataVal","__eD","animationEnd","transitionEnd","transition","duration","elStyle","style","webkitTransitionDuration","MozTransitionDuration","transitionDuration","prevAll","selector","prevEls","previousElementSibling","prev","is","push","nextAll","nextEls","nextElementSibling","next","show","defaultDisplay","nodeName","element","display","elementDisplay","createElement","appendChild","parentNode","removeChild","each","device","ua","navigator","userAgent","android","match","ipad","ipod","iphone","ios","androidChrome","os","osVersion","toLowerCase","indexOf","webView","osVersionArr","minimalUi","attr","windowWidth","windowHeight","statusBar","screen","classNames","pixelRatio","devicePixelRatio","Math","floor","major","removeClass","addClass","join","isWeixin","test","FastClick","layer","options","bind","method","context","apply","arguments","oldOnClick","trackingClick","trackingClickStart","targetElement","touchStartX","touchStartY","lastTouchIdentifier","touchBoundary","tapDelay","tapTimeout","notNeeded","methods","l","deviceIsAndroid","addEventListener","onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel","Event","prototype","stopImmediatePropagation","removeEventListener","type","capture","rmv","Node","hijacked","adv","event","propagationStopped","onclick","deviceIsWindowsPhone","deviceIsIOS","deviceIsIOS4","deviceIsIOSWithBadTarget","deviceIsBlackBerry10","isCompositeLabel","needsClick","parent","tagName","className","disabled","needsFocus","readOnly","sendClick","clickEvent","activeElement","blur","changedTouches","createEvent","initMouseEvent","determineEventType","screenX","screenY","clientX","clientY","forwardedTouchEvent","dispatchEvent","focus","unsupportedType","setSelectionRange","updateScrollParent","scrollParent","parentElement","fastClickScrollParent","contains","scrollHeight","offsetHeight","fastClickLastScrollTop","scrollTop","getTargetElementFromEventTarget","eventTarget","nodeType","TEXT_NODE","selection","targetTouches","getSelection","rangeCount","isCollapsed","identifier","preventDefault","timeStamp","pageX","pageY","lastClickTime","touchHasMoved","boundary","abs","findControl","labelElement","undefined","control","htmlFor","getElementById","querySelector","forElement","targetTagName","cancelNextClick","elementFromPoint","pageXOffset","pageYOffset","top","cancelable","stopPropagation","permitted","detail","destroy","metaViewport","chromeVersion","blackberryVersion","firefoxVersion","ontouchstart","exec","content","documentElement","scrollWidth","outerWidth","msTouchAction","touchAction","attach","handleClicks","popup","clicked","clickedData","hasClass","closeModal","modalCloseByOutside","actionsCloseByOutside","popupCloseByOutside","_modalTemplateTempDiv","modalStack","modalStackClearQueue","shift","modal","params","modalHTML","buttonsHTML","buttons","buttonType","buttonDisabled","bold","text","extraClass","titleHTML","title","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","innerHTML","children","modalContainer","append","find","index","close","openModal","alert","callbackOk","modalTitle","modalButtonOk","confirm","callbackCancel","modalButtonCancel","prompt","val","modalLogin","modalUsernamePlaceholder","modalPasswordPlaceholder","username","password","modalPassword","showPreloader","hidePreloader","preloaderModal","modalPreloaderTitle","showIndicator","hideIndicator","remove","actions","groupSelector","buttonSelector","isArray","j","button","buttonClass","label","color","bg","groups","groupIndex","clickTarget","buttonIndex","buttonParams","removeOnClose","_modal","trim","childNodes","classList","add","scroller","viewClass","sizeNavbars","pickerModal","loginScreen","toast","msg","extraclass","$toast","appendTo","cb","isModal","isNotToast","isPopup","isLoginScreen","isPickerModal","isToast","marginTop","round","outerHeight","marginLeft","overlay","clientLeft","trigger","hide","rtl","Calendar","formatDate","date","Date","year","getFullYear","month","getMonth","month1","day","getDate","weekDay","getDay","p","dateFormat","substring","monthNames","monthNamesShort","dayNames","dayNamesShort","openOnInput","inputReadOnly","opened","open","scrollToInput","pageContent","input","parents","newPaddingBottom","paddingTop","paddingBottom","pageHeight","container","pageScrollHeight","inputTop","offset","padding-bottom","closeOnHTMLClick","onPickerClose","onClose","destroyCalendarEvents","firstDay","weekendDays","multiple","direction","minDate","maxDate","touchMove","animate","closeOnSelect","monthPicker","monthPickerTemplate","yearPicker","yearPickerTemplate","weekHeader","toolbar","toolbarCloseText","toolbarTemplate","def","initialized","inline","isH","inverter","animating","addValue","inValuesIndex","getTime","splice","updateValue","setValue","arrValues","wrapper","inputValue","valueDate","onChange","map","formatValue","initCalendarEvents","handleTouchStart","isMoved","isTouched","touchCurrentY","touchStartTime","percentage","allowItemClick","isScrolling","startTranslate","currentTranslate","monthsTranslate","handleTouchMove","touchCurrentX","wrapperWidth","offsetWidth","wrapperHeight","touchesDiff","handleTouchEnd","touchEndTime","resetMonth","nextMonth","prevMonth","handleDayClick","dateYear","dateMonth","dateDay","onDayClick","prevYear","nextYear","f7DestroyCalendarEvents","daysInMonth","d","monthHTML","daysInPrevMonth","firstDayOfMonthIndex","dayDate","currentValues","rows","cols","dayIndex","today","setHours","rowHTML","col","dayNumber","dayYear","dayMonth","updateCurrentMonthYear","dir","currentMonth","months","eq","currentYear","onMonthChangeStart","currentIndex","onMonthYearChangeStart","onMonthChangeEnd","rebuildBoth","nextMonthHTML","prevMonthHTML","newMonthHTML","prepend","setMonthsTranslate","onMonthAdd","onMonthYearChangeEnd","translate","prevMonthTranslate","currentMonthTranslate","nextMonthTranslate","nextDate","nextDateTime","transitionEndCallback","prevDate","prevDateTime","setYearMonth","targetDate","currentDate","monthTranslate","wrapperTranslate","prevTranslate","layout","pickerHTML","pickerClass","layoutDate","currentMonthHTML","monthsHTML","weekHeaderHTML","weekDayIndex","dayName","cssClass","toolbarHTML","prop","f7Calendar","onOpen","calendar","$this","initCalendar","$content","Picker","resizeCols","divider","calcSize","destroyPickerCol","updateValuesOnMomentum","updateValuesOnTouchmove","rotateEffect","momentumRatio","freeMode","originBug","valueIndex","newValue","newDisplayValue","displayValue","initPickerCol","colElement","updateItems","updateDuringScroll","animationFrameId","diff","returnTo","minTranslate","pow","maxTranslate","velocityTranslate","velocityTime","velocity","newTranslate","max","min","activeIndex","itemHeight","handleClick","colContainer","colIndex","items","itemsHeight","replaceValues","values","displayValues","destroyEvents","newItemsHTML","columnHTML","html","initEvents","colWidth","colHeight","valueCallbacks","newActiveIndex","previousActiveIndex","selectedItem","itemOffsetTop","translateOffset","itemOffset","itemsFit","ceil","angle","detach","f7DestroyPickerCol","onlyItems","columnItemsHTML","textAlign","colsHTML","one","f7Picker","pickerToClose","picker","args","Array","slice","getDays","days","getDaysByMonthAndYear","int_d","formatNumber","n","initMonthes","initYears","arr","getHours","getMinutes","currentValue","datetimePicker","IScroll","scrollerStyle","resizeScrollbars","mouseWheelSpeed","snapThreshold","startX","startY","scrollY","directionLockThreshold","momentum","bounce","bounceTime","bounceEasing","preventDefaultException","HWCompositing","useTransition","useTransform","eventPassthrough","translateZ","utils","hasPerspective","hasTransition","hasTransform","scrollX","freeScroll","ease","circular","resizePolling","tap","shrinkScrollbars","invertWheelDirection","probeType","directionX","directionY","_events","_init","refresh","scrollTo","enable","createDefaultScrollbar","interactive","scrollbar","indicator","cssText","pointerEvents","Indicator","wrapperStyle","indicatorStyle","listenX","listenY","resize","defaultScrollbars","shrink","fade","speedRatioX","speedRatioY","sizeRatioX","sizeRatioY","maxPosX","maxPosY","disableTouch","addEvent","disablePointer","prefixPointerEvent","disableMouse","isBadAndroid","opacity","rAF","oRequestAnimationFrame","msRequestAnimationFrame","_prefixStyle","_vendor","charAt","substr","me","_elementStyle","vendors","now","obj","removeEvent","pointerEvent","MSPointerEvent","current","time","lowerMargin","wrapperSize","deceleration","self","eventTrigger","_execEvent","t","destination","distance","speed","_transform","hasTouch","hasPointer","PointerEvent","appVersion","transitionTimingFunction","transitionDelay","transformOrigin","c","re","RegExp","newclass","left","offsetLeft","offsetTop","offsetParent","exceptions","eventType","touchstart","touchmove","touchend","mousedown","mousemove","mouseup","pointerdown","pointermove","pointerup","MSPointerDown","MSPointerMove","MSPointerUp","quadratic","k","sqrt","back","elastic","f","sin","PI","eventName","ev","initEvent","click","view","ctrlKey","altKey","shiftKey","metaKey","_constructed","version","_initEvents","scrollbars","indicators","_initIndicators","mouseWheel","_initWheel","snap","_initSnap","keyBindings","_initKeys","_transitionEnd","isInTransition","_transitionTime","resetPosition","_start","enabled","initiated","pos","point","touches","moved","distX","distY","directionLocked","startTime","getComputedPosition","_translate","isAnimating","absStartX","absStartY","pointX","pointY","_move","newX","newY","absDistX","absDistY","deltaX","deltaY","timestamp","endTime","hasHorizontalScroll","hasVerticalScroll","maxScrollX","maxScrollY","_end","momentumX","momentumY","distanceX","distanceY","easing","flick","_nearestSnap","currentPage","snapSpeed","_resize","that","resizeTimeout","ptr","ptrLock","ptrOffset","disable","clientWidth","clientHeight","scrollerWidth","scrollerHeight","wrapperOffset","scrollBy","_transitionTimingFunction","_animate","scrollToElement","offsetX","offsetY","transitionTime","updatePosition","bindToWrapper","_indicatorsMap","interactiveScrollbars","customStyle","fadeScrollbars","concat","_wheel","wheelDeltaX","wheelDeltaY","wheelTimeout","deltaMode","wheelDelta","goToPage","querySelectorAll","cx","cy","stepX","snapStepX","stepY","snapStepY","pages","snapThresholdX","snapThresholdY","posX","posY","keys","pageUp","pageDown","home","up","right","down","charCodeAt","_key","prevTime","keyTime","acceleration","keyAcceleration","keyCode","destX","destY","easingFn","step","destTime","handleEvent","lastPointX","lastPointY","_pos","bottom","indicatorWidth","minBoundaryX","maxBoundaryX","indicatorHeight","minBoundaryY","maxBoundaryY","ignoreBoundaries","hold","visible","fadeTimeout","delay","Plugin","option","internal_return","Scroller","_zeptoMethodCache","scrollLeft","dur","_options","$pageContent","_defaults","useJSScroller","$pageContentInner","wrapAll","minHeight","_bindEventToDomWhenJs","initPullToRefresh","_pullToRefreshJSScroll","pullToRefreshDone","pullToRefreshTrigger","destroyToRefresh","position","nativeScrollTop","old","Constructor","noConflict","refreshScroller","initScroller","getScroller","detectScrollerType","showTab","tab","tabLink","force","newTab","tabs","oldTab","oldTabLink","oldTabId","FixedTab","initFixedTab","$fixedTab","fixedTab","shadow","clone","fixedTop","getBoundingClientRect","_bindEvents","_scrollHandler","_tabLinkHandler","isFixed","$scroller","insertAfter","refreshTime","initPullToRefreshJS","pageContainer","handleScroll","handleRefresh","destroyPullToRefresh","eventsTarget","page","pullToRefreshDoneJS","interval","timeOut","pullToRefreshTriggerJS","destroyPullToRefreshJS","pullToRefreshContent","wasScrolled","touchesStart","dynamicTriggerDistance","triggerDistance","useTranslate","handleInfiniteScroll","virtualList","inf","getAttribute","virtualListContainer","onTop","f7VirtualList","reachEnd","attachInfiniteScroll","infiniteContent","detachInfiniteScroll","initInfiniteScroll","detachEvents","v","$input","$btn","allowPanelOpen","openPanel","panel","panelTransitionEnd","transitionEndTarget","closePanel","effect","activePanel","panelPosition","initSwipePanels","swipePanelCloseOpposite","swipePanelActiveArea","innerWidth","f7PreventPanelSwipe","swipePanelNoFollow","timeDiff","panelOverlay","panelWidth","threshold","swipePanelThreshold","views","action","edge","isInRouterBlackList","$link","classBlackList","linkEle","get","linkHref","protoWhiteList","$1","hasAttribute","customClickFilter","customRouterFilter","routerFilter","isFunction","filterResult","CustomEvent","bubbles","initCustomEvent","EVENTS","pageLoadStart","pageLoadCancel","pageLoadError","pageLoadComplete","pageAnimationStart","pageAnimationEnd","beforePageRemove","pageRemoved","beforePageSwitch","pageInit","Util","getUrlFragment","url","hashIndex","getAbsoluteUrl","link","setAttribute","absoluteUrl","href","getBaseUrl","toUrlObject","fullUrl","baseUrl","fragment","base","full","original","supportStorage","routerConfig","sectionGroupClass","curPageClass","visiblePageClass","pageClass","DIRECTION","leftToRight","rightToLeft","theHistory","history","Router","sessionNames","currentState","maxStateId","xhr","_onPopState","$view","cache","$doc","currentUrl","location","_saveDocumentIntoCache","_PageExtendCache","_PageExtendDomCache","_PageNoCaches","_htmlResponseCaches","_PageExcludePushingState","_SupportH5History","_BackNUrl","curPageId","$hashSection","currentUrlObj","$allSection","$visibleSection","$curVisibleSection","_generateRandomId","state","curState","_getNextStateId","pageId","replaceState","_saveAsCurrentState","_incMaxStateId","load","ignoreCache","ignoreSameUrl","_isTheSameDocument","_switchToSection","_switchToDocument","registerBack2Url","forward","loadPage","sectionId","$curPage","_getCurrentSection","$newPage","_animateSection","_pushNewState","isPushState","baseUrlExcludeQueryString","getExcludeQueryStringUrl","cacheDocument","_doSwitchDocument","_loadDocument","success","_parseDocument","error","urlObj","$currentDoc","$newDoc","$currentSection","_loadPageExtendDocument_Style","_loadPageExtendDocument_Script","_animateDocument","_loadPageExtendDocumentInnerScript","page_extend_content","script_inner","scriptItem","savePageNoCaches","ignoreDataCache","urlAsKey","registExcludePushingStatePage","clearCacheDom","qMaskIndex","style_loaded","rel","linkUrlAsKey","linkDom","urlExcludeQueryString","link_style","linkItem","link_attrs","is_common","ex","script_loaded","src","scriptUrlAsKey","scriptDom","scriptWaitingLoading","script_src","_loadScriptEx","head","getElementsByTagName","js","callbackFn","all","onreadystatechange","readyState","onload","_parsePageExtendCacheInit","responsePage","_parsePageExtendCache_Inner","_parsePageExtendCache","response","is_remove","isCommon","anotherUrl","abort","dispatch","ajax","proxy","status","err","complete","$innerView","Error","doc","_getLastState","gSessionStorage","getItem","JSON","parse","setItem","stringify","$from","$to","$visibleSectionInFrom","_animateElement","toId","classForFrom","classForTo","animPageClasses","_back","fromState","$currentPage","_forward","lastState","console","pushState","$pages","warn","$target","currentTarget","lastPosition","getMemory","arg","needMemoryClass","positionName","memoryHeight","updateMemory","getPage","$page","initPage","initSwiper","persisted","reload","init","ScrollFix","startTopScroll","initScrollFix","prefix","scrollable"],"mappings":"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"}