PM.windowScroll = {};

PM.windowScroll.addListeners = function(e){
  YAHOO.util.Event.addListener(document, "mousedown",
                               PM.windowScroll.handleMouseDown);
};
YAHOO.util.Event.addListener(window, "load", PM.windowScroll.addListeners);

PM.windowScroll.handleMouseDown = function(e){
  YAHOO.util.Event.addListener(document, "mousemove",
                               PM.windowScroll.handleMouseMove);
  YAHOO.util.Event.addListener(document, "mouseup",
                               PM.windowScroll.handleMouseUp);
};

PM.windowScroll.handleMouseUp = function(e){
  YAHOO.util.Event.removeListener(document, "mousemove",
                                  PM.windowScroll.handleMouseMove);
  YAHOO.util.Event.removeListener(document, "mouseup",
                                  PM.windowScroll.handleMouseUp);
};
            
                            
PM.windowScroll.handleMouseMove = function(e){
  //logMessage("Mousemove");
  if(!PM.Draggable.dragStarted || !PM.Draggable.dragStarted.scrollBox){return;}
  var sb = PM.Draggable.dragStarted.scrollBox;
  PM.windowScroll.autoScroll(e, sb);
};

PM.windowScroll.getScroll = function () {
    var t, l;
    if (document.documentElement && document.documentElement.scrollTop) {
        t = document.documentElement.scrollTop;
        l = document.documentElement.scrollLeft;
    } else if (document.body) {
        t = document.body.scrollTop;
        l = document.body.scrollLeft;
    } // else ? throw error? or return empty object?
    return { top: t, left: l };
};

PM.windowScroll.getClientHeight = function() {
    return (window.innerHeight) ? window.innerHeight : 
        (document.documentElement && document.documentElement.clientHeight) ?
        document.documentElement.clientHeight : document.body.offsetHeight;
};

PM.windowScroll.getClientWidth = function() {
    return (window.innerWidth) ? window.innerWidth : 
        (document.documentElement && document.documentElement.clientWidth) ?
        document.documentElement.clientWidth : document.body.offsetWidth;
};

PM.windowScroll.autoScroll = function(e, sb) {
  
  var clientH = PM.windowScroll.getClientHeight();
  var clientW = PM.windowScroll.getClientWidth();
  var gs = PM.windowScroll.getScroll();
  var st = gs.top;
  var sl = gs.left;
  var toBot   = clientH + st - YAHOO.util.Event.getPageY(e);
  var toRight = clientW + sl - YAHOO.util.Event.getPageX(e);

  var thresh = 40;
  var scrAmt = (document.all) ? 80 : 30;

  if (YAHOO.util.Event.getPageY(e)+sb.bottom > clientH &&
      toBot < thresh &&
      clientH + st < document.body.scrollHeight) { //TODO crossbrowser this line
      logMessage("autoScroll1");window.scrollTo(sl, st+scrAmt);
  }
  //logMessage(YAHOO.util.Event.getPageY(e)+sb.bottom+">"+clientH +"&&" +toBot+"<"+thresh);
  
  // unnecessary/unfunctional last condition
  //if (y<st && st>0 && y-st<thresh) {logMessage("autoScroll2");window.scrollTo(sl, st-scrAmt);}


  if (YAHOO.util.Event.getPageX(e)+sb.right > clientW &&
      toRight < thresh &&
      clientW + sl < document.body.scrollWidth
      ) { //TODO crossbrowser this line
       logMessage("autoScroll3");window.scrollTo(sl+scrAmt, st);
  }
  logMessage(" " + YAHOO.util.Event.getPageX(e)+sb.right+">"+clientW +
             "&&" +toRight+"<"+thresh+
            "; "+ clientW +"+"+ sl + "<" + document.body.scrollWidth);

  //if (x<sl && sl>0 && x-sl<thresh) {logMessage("autoScroll4");window.scrollTo(sl-scrAmt, st);}
};
