// kill dependency issue if(YAHOO.util.DragDrop){ /** * @class YAHOO.ext.dd.ScrollManager * Provides automatic scrolling of overflow regions in the page during drag operations.

* Note: This class uses "Point Mode" and is untested in "Intersect Mode". * @singleton */ YAHOO.ext.dd.ScrollManager = function(){ var ddm = YAHOO.util.DragDropMgr; var els = {}; var dragEl = null; var proc = {}; var onStop = function(e){ dragEl = null; clearProc(); }; var triggerRefresh = function(){ if(ddm.dragCurrent){ ddm.refreshCache(ddm.dragCurrent.groups); } } var doScroll = function(){ if(ddm.dragCurrent){ var dds = YAHOO.ext.dd.ScrollManager; if(!dds.animate || !YAHOO.util.Scroll){ if(proc.el.scroll(proc.dir, dds.increment)){ triggerRefresh(); } }else{ proc.el.scroll(proc.dir, dds.increment, true, dds.animDuration, triggerRefresh); } } }; var clearProc = function(){ if(proc.id){ clearInterval(proc.id); } proc.id = 0; proc.el = null; proc.dir = ''; }; var startProc = function(el, dir){ clearProc(); proc.el = el; proc.dir = dir; proc.id = setInterval(doScroll, YAHOO.ext.dd.ScrollManager.frequency); }; var onFire = function(e, isDrop){ if(isDrop || !ddm.dragCurrent){ return; } var dds = YAHOO.ext.dd.ScrollManager; if(!dragEl || dragEl != ddm.dragCurrent){ dragEl = ddm.dragCurrent; // refresh regions on drag start dds.refreshCache(); } var xy = YAHOO.util.Event.getXY(e); var pt = new YAHOO.util.Point(xy[0], xy[1]); for(var id in els){ var el = els[id], r = el._region; if(r.contains(pt) && el.isScrollable()){ if(r.bottom - pt.y <= dds.thresh){ if(proc.el != el){ startProc(el, 'down'); } return; }else if(r.right - pt.x <= dds.thresh){ if(proc.el != el){ startProc(el, 'left'); } return; }else if(pt.y - r.top <= dds.thresh){ if(proc.el != el){ startProc(el, 'up'); } return; }else if(pt.x - r.left <= dds.thresh){ if(proc.el != el){ startProc(el, 'right'); } return; } } } clearProc(); }; ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm); ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm); return { /** * Registers new overflow element(s) to auto scroll * @param {String/HTMLElement/Element/Array} el The id of or the element to be scrolled or an array of either */ register : function(el){ if(el instanceof Array){ for(var i = 0, len = el.length; i < len; i++) { this.register(el[i]); } }else{ el = getEl(el); els[el.id] = el; } }, /** * Unregisters overflow element(s) so they are no longer scrolled * @param {String/HTMLElement/Element/Array} el The id of or the element to be removed or an array of either */ unregister : function(el){ if(el instanceof Array){ for(var i = 0, len = el.length; i < len; i++) { this.unregister(el[i]); } }else{ el = getEl(el); delete els[el.id]; } }, /** * The number of pixels from the edge of a container the pointer needs to be to * trigger scrolling (defaults to 25) * @type Number */ thresh : 25, /** * The number of pixels to scroll in each scroll increment (defaults to 50) * @type Number */ increment : 100, /** * The frequency of scrolls in milliseconds (defaults to 500) * @type Number */ frequency : 500, /** * True to animate the scroll (defaults to true) * @type Boolean */ animate: true, /** * The animation duration in seconds - * MUST BE less than YAHOO.ext.dd.ScrollManager.frequency! (defaults to .4) * @type Number */ animDuration: .4, /** * Manually trigger a cache refresh. */ refreshCache : function(){ for(var id in els){ els[id]._region = els[id].getRegion(); } } } }(); }