var k       = 1; // speed of scrolling
var smoothX = 3; // smoothness of scrolling by X
var smoothY = 3; // smoothness of scrolling by Y

var deltaX  = 0;
var deltaY  = 0;
var isMouseDown = false;
var isCtrlShiftDown  = false;
var isCtrlAltShiftDown = false;

function mouseDown(){
   isMouseDown = true;

   baseX = event.screenX;
   baseY = event.screenY;
}

function mouseUp(){
   isMouseDown = false;
   document.body.style.cursor = "auto";
   document.body.onmousemove   = null;
   return false;
}

function keyDown(){
   if(event.ctrlKey && event.shiftKey && !event.altKey){
      isCtrlShiftDown  = true;
     	isCtrlAltShiftDown = false;
      if(event.screenX < screenLeft || 
         event.screenX > screenLeft + document.body.offsetWidth || 
         event.screenY < screenTop  ||
         event.screenY > screenTop  + document.body.offsetHeight){
         keyUp();
      }
      document.body.onmousedown     = mouseDown;
      document.body.onmouseup       = mouseUp;
      document.body.style.cursor    = "hand";
      document.body.onselectstart   = function(){return false;}
      document.body.onmousemove     = moveHandler;
      document.body.setCapture();
   }
   else if(event.ctrlKey && event.shiftKey && event.altKey){
      isCtrlAltShiftDown  = true;
      isCtrlShiftDown  = false;
      
      if(event.screenX < screenLeft || 
         event.screenX > screenLeft + document.body.offsetWidth || 
         event.screenY < screenTop  ||
         event.screenY > screenTop  + document.body.offsetHeight){
         keyUp();
      }
      document.body.onmousedown     = mouseDown;
      document.body.onmouseup       = mouseUp;
      document.body.style.cursor    = "hand";
      document.body.onselectstart   = function(){return false;}
      document.body.onmousemove     = zoomHandler;
      document.body.setCapture();
	}
	else{
      isCtrlAltShiftDown  = false;
      isCtrlShiftDown  = false;
      keyUp();
   }
}

function keyUp(){
   document.body.onmousedown     = oldMouseDown;
   document.body.onmouseup       = oldMouseUp;
   document.body.onselectstart   = null;
   document.body.style.cursor    = "auto";
   document.body.releaseCapture();
}


function moveHandler(){
   if(isMouseDown){
      DcoordsX = baseX - event.screenX;
      DcoordsY = baseY - event.screenY;
      
      deltaX += DcoordsX;
      deltaY += DcoordsY;
      
      if( deltaX > smoothX || deltaY > smoothY || deltaX < -smoothX || deltaY < -smoothY){
         
         scrollBy(k * deltaX, k * deltaY);
         deltaX = 0;
         deltaY = 0;
      }

      baseX = event.screenX;
      baseY = event.screenY;
   }
}

function zoomHandler(){
   if(isMouseDown){
      DcoordsY = baseY - event.screenY;
      
      deltaY += DcoordsY;
      
      if( deltaY > smoothY || deltaY < -smoothY){
         
         document.body.style.zoom = parseInt(document.body.style.zoom) + (k * deltaY)/100;
         deltaY = 0;
      }

      baseY = event.screenY;
   }
}

function initScroll(){
   oldMouseDown = document.body.onmousedown;
   oldMouseUp   = document.body.onmouseup;
   document.body.style.zoom = 1;

   document.body.onmousedown = mouseDown;
   document.body.onkeydown   = keyDown;
   document.body.onkeyup     = keyUp;
}


