{"version":3,"file":"kendo.mobile.scroller.min.js","sources":["kendo.mobile.scroller.js"],"sourcesContent":["(function(f, define) {\n define('kendo.mobile.scroller',[ \"kendo.fx\", \"kendo.draganddrop\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.scroller\",\n name: \"Scroller\",\n category: \"mobile\",\n description: \"The Kendo Mobile Scroller widget enables touch friendly kinetic scrolling for the contents of a given DOM element.\",\n depends: [ \"fx\", \"draganddrop\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n fx = kendo.effects,\n ui = mobile.ui,\n extend = $.extend,\n Widget = ui.Widget,\n Class = kendo.Class,\n Movable = kendo.ui.Movable,\n Pane = kendo.ui.Pane,\n PaneDimensions = kendo.ui.PaneDimensions,\n Transition = fx.Transition,\n Animation = fx.Animation,\n abs = Math.abs,\n SNAPBACK_DURATION = 500,\n SCROLLBAR_OPACITY = 0.7,\n FRICTION = 0.96,\n VELOCITY_MULTIPLIER = 10,\n MAX_VELOCITY = 55,\n OUT_OF_BOUNDS_FRICTION = 0.5,\n ANIMATED_SCROLLER_PRECISION = 5,\n RELEASECLASS = \"km-scroller-release\",\n REFRESHCLASS = \"km-scroller-refresh\",\n PULL = \"pull\",\n CHANGE = \"change\",\n RESIZE = \"resize\",\n SCROLL = \"scroll\",\n MOUSE_WHEEL_ID = 2;\n\n var ZoomSnapBack = Animation.extend({\n init: function(options) {\n var that = this;\n Animation.fn.init.call(that);\n extend(that, options);\n\n that.userEvents.bind(\"gestureend\", that.start.bind(that));\n that.tapCapture.bind(\"press\", that.cancel.bind(that));\n },\n\n enabled: function() {\n return this.movable.scale < this.dimensions.minScale;\n },\n\n done: function() {\n return this.dimensions.minScale - this.movable.scale < 0.01;\n },\n\n tick: function() {\n var movable = this.movable;\n movable.scaleWith(1.1);\n this.dimensions.rescale(movable.scale);\n },\n\n onEnd: function() {\n var movable = this.movable;\n movable.scaleTo(this.dimensions.minScale);\n this.dimensions.rescale(movable.scale);\n }\n });\n\n var DragInertia = Animation.extend({\n init: function(options) {\n var that = this;\n\n Animation.fn.init.call(that);\n\n extend(that, options, {\n transition: new Transition({\n axis: options.axis,\n movable: options.movable,\n onEnd: function() { that._end(); }\n })\n });\n\n that.tapCapture.bind(\"press\", function() { that.cancel(); });\n that.userEvents.bind(\"end\", that.start.bind(that));\n that.userEvents.bind(\"gestureend\", that.start.bind(that));\n that.userEvents.bind(\"tap\", that.onEnd.bind(that));\n },\n\n onCancel: function() {\n this.transition.cancel();\n },\n\n freeze: function(location) {\n var that = this;\n that.cancel();\n that._moveTo(location);\n },\n\n onEnd: function() {\n var that = this;\n if (that.paneAxis.outOfBounds()) {\n that._snapBack();\n } else {\n that._end();\n }\n },\n\n done: function() {\n return abs(this.velocity) < 1;\n },\n\n start: function(e) {\n var that = this,\n velocity;\n\n if (!that.dimension.enabled) { return; }\n\n if (that.paneAxis.outOfBounds()) {\n if (that.transition._started) {\n that.transition.cancel();\n that.velocity = Math.min(e.touch[that.axis].velocity * that.velocityMultiplier, MAX_VELOCITY);\n\n Animation.fn.start.call(that);\n } else {\n that._snapBack();\n }\n } else {\n velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity;\n that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY);\n\n that.tapCapture.captureNext();\n Animation.fn.start.call(that);\n }\n },\n\n tick: function() {\n var that = this,\n dimension = that.dimension,\n friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction,\n delta = (that.velocity *= friction),\n location = that.movable[that.axis] + delta;\n\n if (!that.elastic && dimension.outOfBounds(location)) {\n location = Math.max(Math.min(location, dimension.max), dimension.min);\n that.velocity = 0;\n }\n\n that.movable.moveAxis(that.axis, location);\n },\n\n _end: function() {\n this.tapCapture.cancelCapture();\n this.end();\n },\n\n _snapBack: function() {\n var that = this,\n dimension = that.dimension,\n snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min;\n that._moveTo(snapBack);\n },\n\n _moveTo: function(location) {\n this.transition.moveTo({ location: location, duration: SNAPBACK_DURATION, ease: Transition.easeOutExpo });\n }\n });\n\n var AnimatedScroller = Animation.extend({\n init: function(options) {\n var that = this;\n\n kendo.effects.Animation.fn.init.call(this);\n\n extend(that, options, {\n origin: {},\n destination: {},\n offset: {}\n });\n },\n\n tick: function() {\n this._updateCoordinates();\n this.moveTo(this.origin);\n },\n\n done: function() {\n return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION;\n },\n\n onEnd: function() {\n this.moveTo(this.destination);\n if (this.callback) {\n this.callback.call();\n }\n },\n\n setCoordinates: function(from, to) {\n this.offset = {};\n this.origin = from;\n this.destination = to;\n },\n\n setCallback: function(callback) {\n if (callback && kendo.isFunction(callback)) {\n this.callback = callback;\n } else {\n callback = undefined;\n }\n },\n\n _updateCoordinates: function() {\n this.offset = {\n x: (this.destination.x - this.origin.x) / 4,\n y: (this.destination.y - this.origin.y) / 4\n };\n\n this.origin = {\n y: this.origin.y + this.offset.y,\n x: this.origin.x + this.offset.x\n };\n }\n });\n\n var ScrollBar = Class.extend({\n init: function(options) {\n var that = this,\n horizontal = options.axis === \"x\",\n element = $('
');\n\n if (horizontal) {\n element.attr(\"aria-orientation\", \"horizontal\");\n }\n\n extend(that, options, {\n element: element,\n elementSize: 0,\n movable: new Movable(element),\n scrollMovable: options.movable,\n alwaysVisible: options.alwaysVisible,\n size: horizontal ? \"width\" : \"height\"\n });\n\n that.scrollMovable.bind(CHANGE, that.refresh.bind(that));\n that.container.append(element);\n if (options.alwaysVisible) {\n that.show();\n }\n },\n\n refresh: function() {\n var that = this,\n axis = that.axis,\n dimension = that.dimension,\n paneSize = dimension.size,\n scrollMovable = that.scrollMovable,\n sizeRatio = paneSize / dimension.total,\n position = Math.round(-scrollMovable[axis] * sizeRatio),\n size = Math.round(paneSize * sizeRatio);\n\n if (sizeRatio >= 1) {\n this.element.css(\"display\", \"none\");\n } else {\n this.element.css(\"display\", \"\");\n }\n\n if (position + size > paneSize) {\n size = paneSize - position;\n } else if (position < 0) {\n size += position;\n position = 0;\n }\n\n if (that.elementSize != size) {\n that.element.css(that.size, size + \"px\");\n that.elementSize = size;\n }\n\n that._ariaValue(position, dimension.size - that.elementSize);\n\n that.movable.moveAxis(axis, position);\n },\n\n show: function() {\n this.element.css({ opacity: SCROLLBAR_OPACITY, visibility: \"visible\" });\n },\n\n hide: function() {\n if (!this.alwaysVisible) {\n this.element.css({ opacity: 0 });\n }\n },\n\n _ariaValue: function(current, total) {\n var element = this.element;\n\n if (current > total) {\n current = total;\n }\n\n element.attr(\"aria-valuemax\", total);\n element.attr(\"aria-valuenow\", current);\n }\n });\n\n var Scroller = Widget.extend({\n init: function(element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n\n element = that.element;\n\n that._native = that.options.useNative && kendo.support.hasNativeScrolling;\n if (that._native) {\n element.addClass(\"km-native-scroller\")\n .prepend('
');\n\n extend(that, {\n scrollElement: element,\n fixedContainer: element.children().first()\n });\n\n return;\n }\n\n element\n .css(\"overflow\", \"hidden\")\n .addClass(\"km-scroll-wrapper\")\n .wrapInner('
')\n .prepend('
');\n\n var inner = element.children().eq(1),\n\n tapCapture = new kendo.TapCapture(element),\n\n movable = new Movable(inner),\n\n dimensions = new PaneDimensions({\n element: inner,\n container: element,\n forcedEnabled: that.options.zoom\n }),\n\n avoidScrolling = this.options.avoidScrolling,\n\n userEvents = new kendo.UserEvents(element, {\n touchAction: \"pan-y\",\n fastTap: true,\n allowSelection: true,\n preventDragEvent: true,\n captureUpIfMoved: true,\n multiTouch: that.options.zoom,\n supportDoubleTap: that.options.supportDoubleTap,\n start: function(e) {\n dimensions.refresh();\n\n var velocityX = abs(e.x.velocity),\n velocityY = abs(e.y.velocity),\n horizontalSwipe = velocityX * 2 >= velocityY,\n originatedFromFixedContainer = $.contains(that.fixedContainer[0], e.event.target),\n verticalSwipe = velocityY * 2 >= velocityX;\n\n\n if (!originatedFromFixedContainer && !avoidScrolling(e) && that.enabled && (dimensions.x.enabled && horizontalSwipe || dimensions.y.enabled && verticalSwipe)) {\n userEvents.capture();\n } else {\n userEvents.cancel();\n }\n }\n }),\n\n pane = new Pane({\n movable: movable,\n dimensions: dimensions,\n userEvents: userEvents,\n elastic: that.options.elastic\n }),\n\n zoomSnapBack = new ZoomSnapBack({\n movable: movable,\n dimensions: dimensions,\n userEvents: userEvents,\n tapCapture: tapCapture\n }),\n\n animatedScroller = new AnimatedScroller({\n moveTo: function(coordinates) {\n that.scrollTo(coordinates.x, coordinates.y);\n }\n });\n\n movable.bind(CHANGE, function() {\n that.scrollTop = - movable.y;\n that.scrollLeft = - movable.x;\n\n that.trigger(SCROLL, {\n scrollTop: that.scrollTop,\n scrollLeft: that.scrollLeft\n });\n });\n\n if (that.options.mousewheelScrolling) {\n element.on(\"DOMMouseScroll mousewheel\", this._wheelScroll.bind(this));\n }\n\n extend(that, {\n movable: movable,\n dimensions: dimensions,\n zoomSnapBack: zoomSnapBack,\n animatedScroller: animatedScroller,\n userEvents: userEvents,\n pane: pane,\n tapCapture: tapCapture,\n pulled: false,\n enabled: true,\n scrollElement: inner,\n scrollTop: 0,\n scrollLeft: 0,\n fixedContainer: element.children().first()\n });\n\n that._initAxis(\"x\");\n that._initAxis(\"y\");\n\n // build closure\n that._wheelEnd = function() {\n that._wheel = false;\n that.userEvents.end(0, that._wheelY);\n };\n\n dimensions.refresh();\n\n if (that.options.pullToRefresh) {\n that._initPullToRefresh();\n }\n },\n\n _wheelScroll: function(e) {\n if (e.ctrlKey) {\n return;\n }\n\n if (!this._wheel) {\n this._wheel = true;\n this._wheelY = 0;\n this.userEvents.press(0, this._wheelY);\n }\n\n clearTimeout(this._wheelTimeout);\n this._wheelTimeout = setTimeout(this._wheelEnd, 50);\n\n var delta = kendo.wheelDeltaY(e);\n\n if (delta) {\n this._wheelY += delta;\n this.userEvents.move(0, this._wheelY);\n }\n\n e.preventDefault();\n },\n\n makeVirtual: function() {\n this.dimensions.y.makeVirtual();\n },\n\n virtualSize: function(min, max) {\n this.dimensions.y.virtualSize(min, max);\n },\n\n height: function() {\n return this.dimensions.y.size;\n },\n\n scrollHeight: function() {\n return this.scrollElement[0].scrollHeight;\n },\n\n scrollWidth: function() {\n return this.scrollElement[0].scrollWidth;\n },\n\n options: {\n name: \"Scroller\",\n zoom: false,\n pullOffset: 140,\n visibleScrollHints: false,\n elastic: true,\n useNative: false,\n mousewheelScrolling: true,\n avoidScrolling: function() { return false; },\n pullToRefresh: false,\n messages: {\n pullTemplate: \"Pull to refresh\",\n releaseTemplate: \"Release to refresh\",\n refreshTemplate: \"Refreshing\"\n }\n },\n\n events: [\n PULL,\n SCROLL,\n RESIZE\n ],\n\n _resize: function() {\n if (!this._native) {\n this.contentResized();\n }\n },\n\n setOptions: function(options) {\n var that = this;\n Widget.fn.setOptions.call(that, options);\n if (options.pullToRefresh) {\n that._initPullToRefresh();\n }\n },\n\n reset: function() {\n if (this._native) {\n this.scrollElement.scrollTop(0);\n } else {\n this.movable.moveTo({ x: 0, y: 0 });\n this._scale(1);\n }\n },\n\n contentResized: function() {\n this.dimensions.refresh();\n if (this.pane.x.outOfBounds()) {\n this.movable.moveAxis(\"x\", this.dimensions.x.min);\n }\n\n if (this.pane.y.outOfBounds()) {\n this.movable.moveAxis(\"y\", this.dimensions.y.min);\n }\n },\n\n zoomOut: function() {\n var dimensions = this.dimensions;\n dimensions.refresh();\n this._scale(dimensions.fitScale);\n this.movable.moveTo(dimensions.centerCoordinates());\n },\n\n enable: function() {\n this.enabled = true;\n },\n\n disable: function() {\n this.enabled = false;\n },\n\n scrollTo: function(x, y) {\n if (this._native) {\n kendo.scrollLeft(this.scrollElement, abs(x));\n this.scrollElement.scrollTop(abs(y));\n } else {\n this.dimensions.refresh();\n this.movable.moveTo({ x: x, y: y });\n }\n },\n\n animatedScrollTo: function(x, y, callback) {\n var from,\n to;\n\n if (this._native) {\n this.scrollTo(x, y);\n } else {\n from = { x: this.movable.x, y: this.movable.y };\n to = { x: x, y: y };\n\n this.animatedScroller.setCoordinates(from, to);\n this.animatedScroller.setCallback(callback);\n this.animatedScroller.start();\n }\n },\n\n pullHandled: function() {\n var that = this;\n that.refreshHint.removeClass(REFRESHCLASS);\n that.hintContainer.html(that.pullTemplate({}));\n that.yinertia.onEnd();\n that.xinertia.onEnd();\n that.userEvents.cancel();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n if (this.userEvents) {\n this.userEvents.destroy();\n }\n },\n\n _scale: function(scale) {\n this.dimensions.rescale(scale);\n this.movable.scaleTo(scale);\n },\n\n _initPullToRefresh: function() {\n var that = this;\n\n that.dimensions.y.forceEnabled();\n that.pullTemplate = kendo.template(that.options.messages.pullTemplate);\n that.releaseTemplate = kendo.template(that.options.messages.releaseTemplate);\n that.refreshTemplate = kendo.template(that.options.messages.refreshTemplate);\n\n that.scrollElement.prepend('' + that.pullTemplate({}) + '');\n that.refreshHint = that.scrollElement.children().first();\n that.hintContainer = that.refreshHint.children(\".km-template\");\n\n that.pane.y.bind(\"change\", that._paneChange.bind(that));\n that.userEvents.bind(\"end\", that._dragEnd.bind(that));\n },\n\n _dragEnd: function() {\n var that = this;\n\n if (!that.pulled) {\n return;\n }\n\n that.pulled = false;\n that.refreshHint.removeClass(RELEASECLASS).addClass(REFRESHCLASS);\n that.hintContainer.html(that.refreshTemplate({}));\n that.yinertia.freeze(that.options.pullOffset / 2);\n that.trigger(\"pull\");\n },\n\n _paneChange: function() {\n var that = this;\n\n if (that.movable.y / OUT_OF_BOUNDS_FRICTION > that.options.pullOffset) {\n if (!that.pulled) {\n that.pulled = true;\n that.refreshHint.removeClass(REFRESHCLASS).addClass(RELEASECLASS);\n that.hintContainer.html(that.releaseTemplate({}));\n }\n } else if (that.pulled) {\n that.pulled = false;\n that.refreshHint.removeClass(RELEASECLASS);\n that.hintContainer.html(that.pullTemplate({}));\n }\n },\n\n _initAxis: function(axis) {\n var that = this,\n elementId = that.element.attr(\"id\"),\n movable = that.movable,\n dimension = that.dimensions[axis],\n tapCapture = that.tapCapture,\n paneAxis = that.pane[axis],\n scrollBar;\n\n if (!elementId) {\n elementId = kendo.guid();\n that.element.attr(\"id\", elementId);\n }\n\n scrollBar = new ScrollBar({\n axis: axis,\n movable: movable,\n dimension: dimension,\n container: that.element,\n alwaysVisible: that.options.visibleScrollHints,\n controlsId: elementId\n });\n\n dimension.bind(CHANGE, function() {\n scrollBar.refresh();\n });\n\n paneAxis.bind(CHANGE, function() {\n scrollBar.show();\n });\n\n that[axis + \"inertia\"] = new DragInertia({\n axis: axis,\n paneAxis: paneAxis,\n movable: movable,\n tapCapture: tapCapture,\n userEvents: that.userEvents,\n dimension: dimension,\n elastic: that.options.elastic,\n friction: that.options.friction || FRICTION,\n velocityMultiplier: that.options.velocityMultiplier || VELOCITY_MULTIPLIER,\n end: function() {\n scrollBar.hide();\n that.trigger(\"scrollEnd\", {\n axis: axis,\n scrollTop: that.scrollTop,\n scrollLeft: that.scrollLeft\n });\n }\n });\n }\n });\n\n ui.plugin(Scroller);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n"],"names":["define","__meta__","id","name","category","description","depends","$","window","kendo","jQuery","undefined","mobile","fx","effects","ui","extend","Widget","Class","Movable","Pane","PaneDimensions","Transition","Animation","abs","Math","SNAPBACK_DURATION","SCROLLBAR_OPACITY","FRICTION","VELOCITY_MULTIPLIER","MAX_VELOCITY","OUT_OF_BOUNDS_FRICTION","ANIMATED_SCROLLER_PRECISION","RELEASECLASS","REFRESHCLASS","PULL","CHANGE","RESIZE","SCROLL","MOUSE_WHEEL_ID","ZoomSnapBack","init","options","that","this","fn","call","userEvents","bind","start","tapCapture","cancel","enabled","movable","scale","dimensions","minScale","done","tick","scaleWith","rescale","onEnd","scaleTo","DragInertia","transition","axis","_end","onCancel","freeze","location","_moveTo","paneAxis","outOfBounds","_snapBack","velocity","e","dimension","_started","min","touch","velocityMultiplier","max","captureNext","friction","delta","elastic","moveAxis","cancelCapture","end","snapBack","moveTo","duration","ease","easeOutExpo","AnimatedScroller","origin","destination","offset","_updateCoordinates","y","x","callback","setCoordinates","from","to","setCallback","isFunction","ScrollBar","horizontal","element","controlsId","attr","elementSize","scrollMovable","alwaysVisible","size","refresh","container","append","show","paneSize","sizeRatio","total","position","round","css","_ariaValue","opacity","visibility","hide","current","Scroller","_native","useNative","support","hasNativeScrolling","addClass","prepend","scrollElement","fixedContainer","children","first","wrapInner","inner","eq","TapCapture","forcedEnabled","zoom","avoidScrolling","UserEvents","touchAction","fastTap","allowSelection","preventDragEvent","captureUpIfMoved","multiTouch","supportDoubleTap","velocityX","velocityY","horizontalSwipe","originatedFromFixedContainer","contains","event","target","verticalSwipe","capture","pane","zoomSnapBack","animatedScroller","coordinates","scrollTo","scrollTop","scrollLeft","trigger","mousewheelScrolling","on","_wheelScroll","pulled","_initAxis","_wheelEnd","_wheel","_wheelY","pullToRefresh","_initPullToRefresh","ctrlKey","press","clearTimeout","_wheelTimeout","setTimeout","wheelDeltaY","move","preventDefault","makeVirtual","virtualSize","height","scrollHeight","scrollWidth","pullOffset","visibleScrollHints","messages","pullTemplate","releaseTemplate","refreshTemplate","events","_resize","contentResized","setOptions","reset","_scale","zoomOut","fitScale","centerCoordinates","enable","disable","animatedScrollTo","pullHandled","refreshHint","removeClass","hintContainer","html","yinertia","xinertia","destroy","forceEnabled","template","_paneChange","_dragEnd","elementId","scrollBar","guid","plugin","amd","a1","a2","a3"],"mappings":"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"}