//>>built define("dojo/dnd/autoscroll", ["../main", "../window"], function(dojo) { // module: // dojo/dnd/autoscroll // summary: // TODOC dojo.getObject("dnd", true, dojo); dojo.dnd.getViewport = dojo.window.getBox; dojo.dnd.V_TRIGGER_AUTOSCROLL = 32; dojo.dnd.H_TRIGGER_AUTOSCROLL = 32; dojo.dnd.V_AUTOSCROLL_VALUE = 16; dojo.dnd.H_AUTOSCROLL_VALUE = 16; dojo.dnd.autoScroll = function(e){ // summary: // a handler for onmousemove event, which scrolls the window, if // necesary // e: Event // onmousemove event // FIXME: needs more docs! var v = dojo.window.getBox(), dx = 0, dy = 0; if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){ dx = -dojo.dnd.H_AUTOSCROLL_VALUE; }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){ dx = dojo.dnd.H_AUTOSCROLL_VALUE; } if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){ dy = -dojo.dnd.V_AUTOSCROLL_VALUE; }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){ dy = dojo.dnd.V_AUTOSCROLL_VALUE; } window.scrollBy(dx, dy); }; dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1}; dojo.dnd._validOverflow = {"auto": 1, "scroll": 1}; dojo.dnd.autoScrollNodes = function(e){ // summary: // a handler for onmousemove event, which scrolls the first avaialble // Dom element, it falls back to dojo.dnd.autoScroll() // e: Event // onmousemove event // FIXME: needs more docs! var b, t, w, h, rx, ry, dx = 0, dy = 0, oldLeft, oldTop; for(var n = e.target; n;){ if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){ var s = dojo.getComputedStyle(n), overflow = (s.overflow.toLowerCase() in dojo.dnd._validOverflow), overflowX = (s.overflowX.toLowerCase() in dojo.dnd._validOverflow), overflowY = (s.overflowY.toLowerCase() in dojo.dnd._validOverflow); if(overflow || overflowX || overflowY){ b = dojo._getContentBox(n, s); t = dojo.position(n, true); } // overflow-x if(overflow || overflowX){ w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2); rx = e.pageX - t.x; if(dojo.isWebKit || dojo.isOpera){ // FIXME: this code should not be here, it should be taken into account // either by the event fixing code, or the dojo.position() // FIXME: this code doesn't work on Opera 9.5 Beta rx += dojo.body().scrollLeft; } dx = 0; if(rx > 0 && rx < b.w){ if(rx < w){ dx = -w; }else if(rx > b.w - w){ dx = w; } oldLeft = n.scrollLeft; n.scrollLeft = n.scrollLeft + dx; } } // overflow-y if(overflow || overflowY){ //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop); h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2); ry = e.pageY - t.y; if(dojo.isWebKit || dojo.isOpera){ // FIXME: this code should not be here, it should be taken into account // either by the event fixing code, or the dojo.position() // FIXME: this code doesn't work on Opera 9.5 Beta ry += dojo.body().scrollTop; } dy = 0; if(ry > 0 && ry < b.h){ if(ry < h){ dy = -h; }else if(ry > b.h - h){ dy = h; } oldTop = n.scrollTop; n.scrollTop = n.scrollTop + dy; } } if(dx || dy){ return; } } try{ n = n.parentNode; }catch(x){ n = null; } } dojo.dnd.autoScroll(e); }; return dojo.dnd; });