scrollview-base-debug.js revision f7240e17b052fc7215fbe9e0f77da32b21d1da78
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassYUI.add('scrollview-base', function(Y) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The scrollview-base module provides a basic ScrollView Widget, without scrollbar indicators
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @module scrollview-base
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassvar getClassName = Y.ClassNameManager.getClassName,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass SCROLLVIEW = 'scrollview',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass CLASS_NAMES = {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass vertical: getClassName(SCROLLVIEW, 'vert'),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass horizontal: getClassName(SCROLLVIEW, 'horiz')
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass EV_SCROLL_END = 'scrollEnd',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass EV_SCROLL_FLICK = 'flick',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass FLICK = EV_SCROLL_FLICK,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass UI = 'ui',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass LEFT = "left",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass TOP = "top",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass PX = "px",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass SCROLL_Y = "scrollY",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass SCROLL_X = "scrollX",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass BOUNCE = "bounce",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass DIM_X = "x",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass DIM_Y = "y",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass BOUNDING_BOX = "boundingBox",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass CONTENT_BOX = "contentBox",
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass EMPTY = "",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass ZERO = "0s",
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass IE = Y.UA.ie,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass NATIVE_TRANSITIONS = Y.Transition.useNative,
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _constrain = function (val, min, max) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return Math.min(Math.max(val, min), max);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass };
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * ScrollView provides a scrollable widget, supporting flick gestures, across both touch and mouse based devices.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @class ScrollView
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param config {Object} Object literal with initial attribute values
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @extends Widget
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @constructor
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassfunction ScrollView() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass ScrollView.superclass.constructor.apply(this, arguments);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassY.ScrollView = Y.extend(ScrollView, Y.Widget, {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Y.ScrollView prototype
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Designated initializer
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method initializer
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass initializer: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Notification event fired at the end of a scroll transition
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @event scrollEnd
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {EventFacade} The default event facade.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Notification event fired at the end of a flick gesture (the flick animation may still be in progress)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @event flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {EventFacade} The default event facade.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var sv = this;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Cache - they're write once, and not going to change
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._cb = sv.get(CONTENT_BOX);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._bb = sv.get(BOUNDING_BOX);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Override the contentBox sizing method, since the contentBox height
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * should not be that of the boundingBox.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _uiSizeCB
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _uiSizeCB: function() {},
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Content box transition callback
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onTransEnd
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Event.Facade} e The event facade
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onTransEnd: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire(EV_SCROLL_END);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * bindUI implementation
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Hooks up events for the widget
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method bindUI
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bindUI: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var sv = this, // kweight
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cb = sv._cb,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bb = sv._bb,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass scrollChangeHandler = sv._afterScrollChange,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass dimChangeHandler = sv._afterDimChange,
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra flick = sv.get(FLICK);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bb.on('gesturemovestart', Y.bind(sv._onGestureMoveStart, sv));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // IE SELECT HACK. See if we can do this non-natively and in the gesture for a future release.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (IE) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._fixIESelect(bb, cb);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (flick) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cb.on("flick", Y.bind(sv._flick, sv), flick);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.after({
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'scrollYChange' : scrollChangeHandler,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'scrollXChange' : scrollChangeHandler,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'heightChange' : dimChangeHandler,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'widthChange' : dimChangeHandler
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra // Helps avoid potential CSS race where in the styles from
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra // scrollview-list-skin.css are applied after syncUI() fires.
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra // Without a _uiDimensionChange() call, the scrollview only
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra //scrolls partially due to the fact that styles added in the CSS
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra // altered the height/width of the bounding box.
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai if (!IE) {
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai this.after('renderedChange', function(e) {
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai this._uiDimensionsChange();
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai });
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
f7240e17b052fc7215fbe9e0f77da32b21d1da78Satyen Desai * syncUI implementation.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
f7240e17b052fc7215fbe9e0f77da32b21d1da78Satyen Desai * Update the scroll position, based on the current value of scrollX/scrollY.
f7240e17b052fc7215fbe9e0f77da32b21d1da78Satyen Desai *
f7240e17b052fc7215fbe9e0f77da32b21d1da78Satyen Desai * @method syncUI
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass syncUI: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._uiDimensionsChange();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.scrollTo(this.get(SCROLL_X), this.get(SCROLL_Y));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly * Scroll the element to a given xy coordinate
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method scrollTo
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param x {Number} The x-position to scroll to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param y {Number} The y-position to scroll to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param duration {Number} Duration, in ms, of the scroll animation (default is 0)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param easing {String} An easing equation if duration is set
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass scrollTo: function(x, y, duration, easing) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var cb = this._cb,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass xSet = (x !== null),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass ySet = (y !== null),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass xMove = (xSet) ? x * -1 : 0,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass yMove = (ySet) ? y * -1 : 0,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass transition,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass TRANS = ScrollView._TRANSITION,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass callback = this._transEndCB;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass duration = duration || 0;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass easing = easing || ScrollView.EASING;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (xSet) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.set(SCROLL_X, x, { src: UI });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (ySet) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.set(SCROLL_Y, y, { src: UI });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (NATIVE_TRANSITIONS) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // ANDROID WORKAROUND - try and stop existing transition, before kicking off new one.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cb.setStyle(TRANS.DURATION, ZERO).setStyle(TRANS.PROPERTY, EMPTY);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (duration !== 0) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass transition = {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass easing : easing,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass duration : duration/1000
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass };
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (NATIVE_TRANSITIONS) {
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai transition.transform = this._transform(xMove, yMove);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (xSet) { transition.left = xMove + PX; }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (ySet) { transition.top = yMove + PX; }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log("Transition: duration, easing:" + [transition.duration, transition.easing], "scrollview");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!callback) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass callback = this._transEndCB = Y.bind(this._onTransEnd, this);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cb.transition(transition, callback);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (NATIVE_TRANSITIONS) {
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai cb.setStyle('transform', this._transform(xMove, yMove));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (xSet) { cb.setStyle(LEFT, xMove + PX); }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (ySet) { cb.setStyle(TOP, yMove + PX); }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai /**
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly * Utility method, to create the translate transform string with the
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * x, y translation amounts provided.
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai *
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * @method _transform
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * @param {Number} x Number of pixels to translate along the x axis
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * @param {Number} y Number of pixels to translate along the y axis
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * @private
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai */
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai _transform : function(x, y) {
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai // TODO: Would we be better off using a Matrix for this?
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai return (this._forceHWTransforms) ? 'translate('+ x +'px,'+ y +'px) translateZ(0px)' : 'translate('+ x +'px,'+ y +'px)';
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai },
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly /**
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly * Utility method, to move the given element to the given xy position
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly *
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly * @method _moveTo
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly * @param node {Node} The node to move
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly * @param x {Number} The x-position to move to
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly * @param y {Number} The y-position to move to
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly * @private
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly */
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly _moveTo : function(node, x, y) {
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly if (NATIVE_TRANSITIONS) {
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly node.setStyle('transform', this._transform(x, y));
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly } else {
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly node.setStyle(LEFT, x + PX);
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly node.setStyle(TOP, y + PX);
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly }
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly },
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai /**
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * Flag driving whether or not we should try and force H/W acceleration when transforming. Currently enabled by default for Webkit.
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * Used by the _transform method.
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai *
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * @property _forceHWTransforms
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * @type boolean
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * @protected
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai */
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai _forceHWTransforms: Y.UA.webkit,
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <p>Used to control whether or not ScrollView's internal
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * gesturemovestart, gesturemove and gesturemoveend
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * event listeners should preventDefault. The value is an
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * object, with "start", "move" and "end" properties used to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * specify which events should preventDefault and which shouldn't:</p>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <pre>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * start : false,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * move : true,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * end : false
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * </pre>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <p>The default values are set up in order to prevent panning,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * on touch devices, while allowing click listeners on elements inside
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * the ScrollView to be notified as expected.</p>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _prevent
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Object
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _prevent : {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass start : false,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass move : true,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass end : false
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * gesturemovestart event handler
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onGestureMoveStart
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} The gesturemovestart event facade
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onGestureMoveStart: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var sv = this,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bb = sv._bb;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (sv._prevent.start) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.preventDefault();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._killTimer();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._hm = bb.on('gesturemove', Y.bind(sv._onGestureMove, sv));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._hme = bb.on('gesturemoveend', Y.bind(sv._onGestureMoveEnd, sv));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._startY = e.clientY + sv.get(SCROLL_Y);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._startX = e.clientX + sv.get(SCROLL_X);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._startClientY = sv._endClientY = e.clientY;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._startClientX = sv._endClientX = e.clientX;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines whether or not the scrollview is currently being dragged
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _isDragging
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type boolean
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._isDragging = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines whether or not the scrollview is currently animating a flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _flicking
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type boolean
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._flicking = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines whether or not the scrollview needs to snap to a boundary edge
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _snapToEdge
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type boolean
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._snapToEdge = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * gesturemove event handler
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onGestureMove
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} The gesturemove event facade
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onGestureMove: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var sv = this;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (sv._prevent.move) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.preventDefault();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._isDragging = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._endClientY = e.clientY;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._endClientX = e.clientX;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (sv._scrollsVertical) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_Y, -(e.clientY - sv._startY));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(sv._scrollsHorizontal) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_X, -(e.clientX - sv._startX));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * gestureend event handler
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onGestureMoveEnd
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} The gesturemoveend event facade
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onGestureMoveEnd: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this._prevent.end) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.preventDefault();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var sv = this, // kweight
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass minY = sv._minScrollY,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass maxY = sv._maxScrollY,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass minX = sv._minScrollX,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass maxX = sv._maxScrollX,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass vert = sv._scrollsVertical,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass horiz = sv._scrollsHorizontal,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass startPoint = vert ? sv._startClientY : sv._startClientX,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass endPoint = vert ? sv._endClientY : sv._endClientX,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass distance = startPoint - endPoint,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass absDistance = Math.abs(distance),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bb = sv._bb,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass x, y, xOrig, yOrig;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._hm.detach();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._hme.detach();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines whether or not the scrollview has been scrolled half it's width/height
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _scrolledHalfway
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type boolean
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._scrolledHalfway = sv._snapToEdge = sv._isDragging = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Contains the distance (postive or negative) in pixels by which the scrollview was last scrolled. This is useful when
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * setting up click listeners on the scrollview content, which on mouse based devices are always fired, even after a
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * drag/flick.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <p>Touch based devices don't currently fire a click event, if the finger has been moved (beyond a threshold) so this check isn't required,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * if working in a purely touch based environment</p>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property lastScrolledAmt
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @public
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.lastScrolledAmt = distance;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Check for halfway
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if((horiz && absDistance > bb.get('offsetWidth')/2) || (vert && absDistance > bb.get('offsetHeight')/2)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._scrolledHalfway = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines whether or not the scrollview has been scrolled in the forward (distance > 0), or backward (distance < 0) direction
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _scrolledForward
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type boolean
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._scrolledForward = distance > 0;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Check for min/max
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (vert) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass yOrig = sv.get(SCROLL_Y);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass y = _constrain(yOrig, minY, maxY);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (horiz) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass xOrig = sv.get(SCROLL_X);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass x = _constrain(xOrig, minX, maxX);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (x !== xOrig || y !== yOrig) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._snapToEdge = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (vert) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_Y, y);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (horiz) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_X, x);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log("half:" + sv._scrolledHalfway + ", fwd:" + sv._scrolledForward, "scrollview");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(sv._snapToEdge) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.fire(EV_SCROLL_END, {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass onGestureMoveEnd: true
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * After listener for changes to the scrollX or scrollY attribute
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _afterScrollChange
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} The event facade
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _afterScrollChange : function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var duration = e.duration,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass easing = e.easing,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass val = e.newVal;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(e.src !== UI) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (e.attrName == SCROLL_X) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._uiScrollTo(val, null, duration, easing);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._uiScrollTo(null, val, duration, easing);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Used to move the ScrollView content
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _uiScrollTo
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param x {Number}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param y {Number}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param duration {Number}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param easing {String}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _uiScrollTo : function(x, y, duration, easing) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // TODO: This doesn't seem right. This is not UI logic.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass duration = duration || this._snapToEdge ? 400 : 0;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass easing = easing || this._snapToEdge ? ScrollView.SNAP_EASING : null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.scrollTo(x, y, duration, easing);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * After listener for the height or width attribute
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _afterDimChange
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} The event facade
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _afterDimChange: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._uiDimensionsChange();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly /**
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly * Utility method to obtain scrollWidth, scrollHeight,
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly * accounting for the impact of translate on scrollWidth, scrollHeight
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly * @method _getScrollDims
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly * @returns {Array} The scrollWidth and scrollHeight as an array: [scrollWidth, scrollHeight]
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly * @private
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly */
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly _getScrollDims: function() {
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly var dims,
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly // Ideally using CSSMatrix - don't think we have it normalized yet though.
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly // origX = (new WebKitCSSMatrix(cb.getComputedStyle("transform"))).e;
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly // origY = (new WebKitCSSMatrix(cb.getComputedStyle("transform"))).f;
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly origX = this.get(SCROLL_X),
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly origY = this.get(SCROLL_Y),
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly TRANS = ScrollView._TRANSITION,
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly cb = this.get(CONTENT_BOX),
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly bb = this.get(BOUNDING_BOX);
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly // TODO: Is this OK? Just in case it's called 'during' a transition.
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly if (NATIVE_TRANSITIONS) {
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly cb.setStyle(TRANS.DURATION, ZERO);
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly cb.setStyle(TRANS.PROPERTY, EMPTY);
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly }
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly this._moveTo(cb, 0, 0);
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly // Use bb instead of cb. cb doesn't gives us the right results
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly // in FF (due to overflow:hidden)
9220b67634d9c9872485e6a84bd8de8dd3d7507bSatyen Desai dims = [Math.max(bb.get('scrollWidth'), cb.get('scrollWidth')), Math.max(bb.get('scrollHeight'), cb.get('scrollHeight'))];
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly
609b3fdb3368975ebd66bf9ef6a074e3ca726524Jenny Donnelly this._moveTo(cb, -1*origX, -1*origY);
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly return dims;
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly },
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * This method gets invoked whenever the height or width attributes change,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * allowing us to determine which scrolling axes need to be enabled.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _uiDimensionsChange
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _uiDimensionsChange: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var sv = this,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bb = sv._bb,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass CLASS_NAMES = ScrollView.CLASS_NAMES,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
38dc51e07d95d1f02b709139ee7fe8caab01ad61Satyen Desai width = bb.get('offsetWidth'),
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly height = bb.get('offsetHeight'),
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly scrollDims = this._getScrollDims(),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly scrollWidth = scrollDims[0],
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly scrollHeight = scrollDims[1];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
d5daadf7c87a641483741ee68c26b343acb5717cJenny Donnelly if (height && scrollHeight > height) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._scrollsVertical = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._maxScrollY = scrollHeight - height;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._minScrollY = 0;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._scrollHeight = scrollHeight;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bb.addClass(CLASS_NAMES.vertical);
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai } else {
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai sv._scrollsVertical = false;
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai delete sv._maxScrollY;
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai delete sv._minScrollY;
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai delete sv._scrollHeight;
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai bb.removeClass(CLASS_NAMES.vertical);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (width && scrollWidth > width) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._scrollsHorizontal = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._maxScrollX = scrollWidth - width;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._minScrollX = 0;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._scrollWidth = scrollWidth;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bb.addClass(CLASS_NAMES.horizontal);
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai } else {
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai sv._scrollsHorizontal = false;
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai delete sv._maxScrollX;
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai delete sv._minScrollX;
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai delete sv._scrollWidth;
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai bb.removeClass(CLASS_NAMES.horizontal);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines whether or not the scrollview can scroll vertically
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _scrollsVertical
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type boolean
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines the maximum amount that the scrollview can be scrolled along the Y axis
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _maxScrollY
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines the minimum amount that the scrollview can be scrolled along the Y axis
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _minScrollY
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, cached scrollHeight, for performance
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _scrollHeight
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines whether or not the scrollview can scroll horizontally
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _scrollsHorizontal
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type boolean
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines the maximum amount that the scrollview can be scrolled along the X axis
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _maxScrollX
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, defines the minimum amount that the scrollview can be scrolled along the X axis
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _minScrollX
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, cached scrollWidth, for performance
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _scrollWidth
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Execute a flick at the end of a scroll action
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param distance {Number} The distance (in px) the user scrolled before the flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param time {Number} The number of ms the scroll event lasted before the flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _flick: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var flick = e.flick,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv = this;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal state, currently calculated velocity from the flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _currentVelocity
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._currentVelocity = flick.velocity;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._flicking = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._cDecel = sv.get('deceleration');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._cBounce = sv.get('bounce');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._pastYEdge = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._pastXEdge = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._flickFrame();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.fire(EV_SCROLL_FLICK);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Execute a single frame in the flick animation
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _flickFrame
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _flickFrame: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var sv = this,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass newY,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass maxY,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass minY,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass newX,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass maxX,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass minX,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass scrollsVertical = sv._scrollsVertical,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass scrollsHorizontal = sv._scrollsHorizontal,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass deceleration = sv._cDecel,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bounce = sv._cBounce,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass vel = sv._currentVelocity,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass step = ScrollView.FRAME_STEP;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (scrollsVertical) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass maxY = sv._maxScrollY;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass minY = sv._minScrollY;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass newY = sv.get(SCROLL_Y) - (vel * step);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (scrollsHorizontal) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass maxX = sv._maxScrollX;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass minX = sv._minScrollX;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass newX = sv.get(SCROLL_X) - (vel * step);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass vel = sv._currentVelocity = (vel * deceleration);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(Math.abs(vel).toFixed(4) <= 0.015) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._flicking = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._killTimer(!(sv._pastYEdge || sv._pastXEdge));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(scrollsVertical) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(newY < minY) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._snapToEdge = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_Y, minY);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if(newY > maxY) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._snapToEdge = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_Y, maxY);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(scrollsHorizontal) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(newX < minX) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._snapToEdge = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_X, minX);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if(newX > maxX) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._snapToEdge = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_X, maxX);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (scrollsVertical) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (newY < minY || newY > maxY) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._pastYEdge = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._currentVelocity *= bounce;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_Y, newY);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (scrollsHorizontal) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (newX < minX || newX > maxX) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._pastXEdge = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._currentVelocity *= bounce;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.set(SCROLL_X, newX);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!sv._flickTimer) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._flickTimer = Y.later(step, sv, '_flickFrame', null, true);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Stop the animation timer
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _killTimer
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param fireEvent {Boolean} If true, fire the scrollEnd event
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _killTimer: function(fireEvent) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var sv = this;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(sv._flickTimer) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._flickTimer.cancel();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv._flickTimer = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(fireEvent) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sv.fire(EV_SCROLL_END);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The scrollX, scrollY setter implementation
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _setScroll
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Number} val
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {String} dim
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Number} The constrained value, if it exceeds min/max range
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _setScroll : function(val, dim) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var bouncing = this._cachedBounce || this.get(BOUNCE),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass range = ScrollView.BOUNCE_RANGE,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass maxScroll = (dim == DIM_X) ? this._maxScrollX : this._maxScrollY,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass min = bouncing ? -range : 0,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass max = bouncing ? maxScroll + range : maxScroll;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(!bouncing || !this._isDragging) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(val < min) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass val = min;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if(val > max) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass val = max;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return val;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Setter for the scrollX attribute
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _setScrollX
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param val {Number} The new scrollX value
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Number} The normalized value
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _setScrollX: function(val) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this._setScroll(val, DIM_X);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Setter for the scrollY ATTR
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _setScrollY
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param val {Number} The new scrollY value
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Number} The normalized value
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _setScrollY: function(val) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this._setScroll(val, DIM_Y);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass}, {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Y.ScrollView static properties
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The identity of the widget.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property NAME
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type String
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 'scrollview'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @readOnly
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass NAME: 'scrollview',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Static property used to define the default attribute configuration of
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * the Widget.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property ATTRS
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type {Object}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass ATTRS: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The scroll position in the y-axis
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute scrollY
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 0
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass scrollY: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: 0,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass setter: '_setScrollY'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The scroll position in the x-axis
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute scrollX
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 0
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass scrollX: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: 0,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass setter: '_setScrollX'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Drag coefficent for inertial scrolling. The closer to 1 this
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * value is, the less friction during scrolling.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute deceleration
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 0.93
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass deceleration: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: 0.93
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Drag coefficient for intertial scrolling at the upper
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * and lower boundaries of the scrollview. Set to 0 to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * disable "rubber-banding".
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute bounce
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 0.1
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bounce: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: 0.1
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The minimum distance and/or velocity which define a flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Object
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default Object with properties minDistance = 10, minVelocity = 0.3.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass flick: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass minDistance: 10,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass minVelocity: 0.3
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * List of class names used in the scrollview's DOM
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property CLASS_NAMES
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Object
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass CLASS_NAMES: CLASS_NAMES,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Flag used to source property changes initiated from the DOM
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property UI_SRC
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type String
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default "ui"
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass UI_SRC: UI,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The default bounce distance in pixels
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property BOUNCE_RANGE
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 150
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass BOUNCE_RANGE : 150,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The interval used when animating the flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property FRAME_STEP
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 30
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass FRAME_STEP : 30,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The default easing used when animating the flick
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property EASING
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type String
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 'cubic-bezier(0, 0.1, 0, 1.0)'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass EASING : 'cubic-bezier(0, 0.1, 0, 1.0)',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The default easing to use when animating the bounce snap back.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property SNAP_EASING
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type String
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 'ease-out'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass SNAP_EASING : 'ease-out',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * Object map of style property names used to set transition properties.
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * Currently, Webkit specific names are defaulted. The configured property
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * names are `_TRANSITION.DURATION` ("WebkitTransitionDuration") and
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * `_TRANSITION.PROPERTY ("WebkitTransitionProperty").
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property _TRANSITION
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _TRANSITION : {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass DURATION : "WebkitTransitionDuration",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass PROPERTY : "WebkitTransitionProperty"
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass});
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
9220b67634d9c9872485e6a84bd8de8dd3d7507bSatyen Desai}, '@VERSION@' ,{requires:['widget', 'event-gestures', 'transition'], skinnable:true});