dd-scroll.js revision df8a9924d677977dd4f7bd20f342a9fbac997821
/**
* Base scroller class used to create the Plugin.DDNodeScroll and Plugin.DDWinScroll.
* This class should not be called on it's own, it's designed to be a plugin.
* @module dd
* @submodule dd-scroll
*/
/**
* Base scroller class used to create the Plugin.DDNodeScroll and Plugin.DDWinScroll.
* This class should not be called on it's own, it's designed to be a plugin.
* @class Scroll
* @extends Base
* @namespace DD
* @constructor
*/
var S = function() {
},
HOST = 'host',
BUFFER = 'buffer',
PARENT_SCROLL = 'parentScroll',
WINDOW_SCROLL = 'windowScroll',
SCROLL_TOP = 'scrollTop',
SCROLL_LEFT = 'scrollLeft',
OFFSET_WIDTH = 'offsetWidth',
OFFSET_HEIGHT = 'offsetHeight';
S.ATTRS = {
/**
* @attribute parentScroll
* @description Internal config option to hold the node that we are scrolling. Should not be set by the developer.
* @type Node
*/
parentScroll: {
value: false,
if (node) {
return node;
}
return false;
}
},
/**
* @attribute buffer
* @description The number of pixels from the edge of the screen to turn on scrolling. Default: 30
* @type Number
*/
buffer: {
value: 30,
},
/**
* @attribute scrollDelay
* @description The number of milliseconds delay to pass to the auto scroller. Default: 235
* @type Number
*/
scrollDelay: {
value: 235,
},
/**
* @attribute host
* @description The host we are plugged into.
* @type Object
*/
host: {
value: null
},
/**
* @attribute windowScroll
* @description Turn on window scroll support, default: false
* @type Boolean
*/
windowScroll: {
value: false,
},
/**
* @attribute vertical
* @description Allow vertical scrolling, default: true.
* @type Boolean
*/
vertical: {
value: true,
},
/**
* @attribute horizontal
* @description Allow horizontal scrolling, default: true.
* @type Boolean
*/
horizontal: {
value: true,
}
};
/**
* @private
* @property _scrolling
* @description Tells if we are actively scrolling or not.
* @type Boolean
*/
_scrolling: null,
/**
* @private
* @property _vpRegionCache
* @description Cache of the Viewport dims.
* @type Object
*/
_vpRegionCache: null,
/**
* @private
* @property _dimCache
* @description Cache of the dragNode dims.
* @type Object
*/
_dimCache: null,
/**
* @private
* @property _scrollTimer
* @description Holder for the Timer object returned from Y.later.
* @type {Y.later}
*/
_scrollTimer: null,
/**
* @private
* @method _getVPRegion
* @description Sets the _vpRegionCache property with an Object containing the dims from the viewport.
*/
_getVPRegion: function() {
var r = {},
n = this.get(PARENT_SCROLL),
r = {
top: t + b,
left: l + b
};
this._vpRegionCache = r;
return r;
},
initializer: function() {
//TODO - This doesn't work yet??
this._vpRegionCache = null;
}, this));
},
/**
* @private
* @method _checkWinScroll
* @description Check to see if we need to fire the scroll timer. If scroll timer is running this will scroll the window.
* @param {Boolean} move Should we move the window. From Y.later
*/
_checkWinScroll: function(move) {
var r = this._getVPRegion(),
scroll = false,
w = this._dimCache.w,
h = this._dimCache.h,
if (this.get('horizontal')) {
scroll = true;
}
scroll = true;
}
}
if (this.get('vertical')) {
scroll = true;
}
scroll = true;
}
}
if (st < 0) {
st = 0;
}
if (sl < 0) {
sl = 0;
}
if (nt < 0) {
}
if (nl < 0) {
}
if (move) {
this._cancelScroll();
}
} else {
if (scroll) {
this._initScroll();
} else {
this._cancelScroll();
}
}
},
/**
* @private
* @method _initScroll
* @description Cancel a previous scroll timer and init a new one.
*/
_initScroll: function() {
this._cancelScroll();
this._scrollTimer = Y.Lang.later(this.get('scrollDelay'), this, this._checkWinScroll, [true], true);
},
/**
* @private
* @method _cancelScroll
* @description Cancel a currently running scroll timer.
*/
_cancelScroll: function() {
this._scrolling = false;
if (this._scrollTimer) {
this._scrollTimer.cancel();
delete this._scrollTimer;
}
},
/**
* @method align
* @description Called from the drag:align event to determine if we need to scroll.
*/
align: function(e) {
if (this._scrolling) {
this._cancelScroll();
e.preventDefault();
}
if (!this._scrolling) {
this._checkWinScroll();
}
},
/**
* @private
* @method _setDimCache
* @description Set the cache of the dragNode dims.
*/
_setDimCache: function() {
this._dimCache = {
};
},
/**
* @method start
* @description Called from the drag:start event
*/
start: function() {
this._setDimCache();
},
/**
* @method end
* @description Called from the drag:end event
*/
this._dimCache = null;
this._cancelScroll();
},
/**
* @method toString
* @description General toString method for logging
* @return String name for the object
*/
toString: function() {
}
});
Y.namespace('Plugin');
/**
* Extends the Scroll class to make the window scroll while dragging.
* @class DDWindowScroll
* @extends DD.Scroll
* @namespace Plugin
* @constructor
*/
WS = function() {
};
/**
* @attribute windowScroll
* @description Turn on window scroll support, default: true
* @type Boolean
*/
windowScroll: {
value: true,
if (scroll) {
}
return scroll;
}
}
});
//Shouldn't have to do this..
initializer: function() {
}
});
/**
* @property NS
* @default winscroll
* @readonly
* @protected
* @static
* @description The Scroll instance will be placed on the Drag instance under the winscroll namespace.
* @type {String}
*/
/**
* Extends the Scroll class to make a parent node scroll while dragging.
* @class DDNodeScroll
* @extends DD.Scroll
* @namespace Plugin
* @constructor
*/
NS = function() {
};
/**
* @attribute node
* @description The node we want to scroll. Used to set the internal parentScroll attribute.
* @type Node
*/
node: {
value: false,
if (!n) {
if (node !== false) {
}
} else {
n = n.item(0);
this.set(PARENT_SCROLL, n);
}
return n;
}
}
});
//Shouldn't have to do this..
initializer: function() {
}
});
/**
* @property NS
* @default nodescroll
* @readonly
* @protected
* @static
* @description The NodeScroll instance will be placed on the Drag instance under the nodescroll namespace.
* @type {String}
*/