// aimsNavigation.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*	dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js, aimsMap.js,
*	aimsLayers.js, aimsDHTML.js
*	aimsClick.js
*/
aimsNavigationPresent=true;
/*
**************************************************************************
Map Navigation functions - Zoom , Pan, etc.
***************************************************************************/

// convert mouse click xy's into map coordinates
function getMapXY(xIn,yIn) {
 mouseX = xIn;
 pixelX = xDistance / iWidth;
 mapX = pixelX * mouseX + left;
 mouseY = iHeight - yIn;
 pixelY = yDistance / iHeight;
 mapY = pixelY * mouseY + bottom;
}

function getImageXY(e) {
 if (isNav) {
  mouseX=e.pageX;
  mouseY=e.pageY;
 } else {
  mouseX=event.clientX + document.body.scrollLeft;
  mouseY=event.clientY + document.body.scrollTop;
 }
 // subtract offsets from page left and top
 mouseX = mouseX-hspc;
 mouseY = mouseY-vspc;
}

function getOVImageXY(e) {
 if (isNav) {
  mouseX=e.pageX;
  mouseY=e.pageY;
 } else {
  mouseX=event.clientX + document.body.scrollLeft;
  mouseY=event.clientY + document.body.scrollTop;
 }
 // subtract offsets from page left and top
 mouseX = mouseX-ovHspc;
 mouseY = mouseY-ovVspc;
}

// get coordinates on ov map and reset display
function ovMapClick(x,y) {
 var ovWidth = i2Width;
 var ovHeight = i2Height;
 var ovXincre = fullOVWidth / ovWidth;
 var ovYincre = fullOVHeight / ovHeight;
 var ovX = x;
 var ovY = ovHeight - y;
 var ovmapX = ovX * ovXincre + fullOVLeft;
 var ovmapY = ovY * ovYincre + fullOVBottom;
 saveLastExtent();
 left = ovmapX - xHalf;
 right = ovmapX + xHalf;
 top = ovmapY + yHalf;
 bottom = ovmapY - yHalf;
 //alert(ovmapX+","+ovmapY+"\nLeft:"+fullLeft+"\nTop:"+fullTop+"\nRight:"+fullRight+"\nBottom:"+fullBottom);
 //var theString = writeXML();
 sendMapXML();
}

// get click on OVmap and move display there
function ovMap2Click(e) {
 getOVImageXY(e);
 mouseY = mouseY - ovBorderWidth;
 zooming=false;
 panning=false;
 selectBox=false;
 ovMapClick(mouseX,mouseY);
}

// zoom in around mouse click
function zoomin(e) {
 getMapXY(mouseX,mouseY);
 var tempLeft=lastLeft;
 var tempRight=lastRight;
 var tempTop=lastTop;
 var tempBottom=lastBottom;
 saveLastExtent();
 left = mapX - (xHalf/zoomFactor);
 right = mapX + (xHalf/zoomFactor);
 top = mapY + (yHalf/zoomFactor);
 bottom = mapY - (yHalf/zoomFactor);
 sendMapXML();
}

// zoom out from mouse click
function zoomout(e) {
 getMapXY(mouseX,mouseY);
 var tempLeft=lastLeft;
 var tempRight=lastRight;
 var tempTop=lastTop;
 var tempBottom=lastBottom;
 saveLastExtent();
 left = mapX - (xDistance*zoomFactor/2);
 right = mapX + (xDistance*zoomFactor/2);
 top = mapY + (yDistance*zoomFactor/2);
 bottom = mapY - (yDistance*zoomFactor/2);
 sendMapXML();
}

// get the coords at mouse position
function getMouse(e) {
 window.status="";
 getImageXY(e);
 if (isIE) {
  if ((hasOVMap) && (ovIsVisible) && (ovMapIsLayer)) {
   if ((mouseX<i2Width+2) && (mouseY<i2Height)) {
    document.all.theTop.style.cursor = "default";
   } else {
    document.all.theTop.style.cursor = theCursor;
   }
  }
 }
 if ((mouseX>iWidth) || (mouseY>iHeight) || (mouseX<=0) ||(mouseY<=0) || ((hasOVMap) && (ovIsVisible) && (mouseX<i2Width+ovBoxSize) && (mouseY<i2Height+ovBoxSize) && (ovMapIsLayer))) {
  chkMouseUp(e);
 } else {
  if ((zooming) || (selectBox)) {
   x2=mouseX;
   y2=mouseY;
   setClip();
  } else if (panning) {
   x2=mouseX;
   y2=mouseY;
   panMouse();
  }
  pixelX = xDistance / iWidth;
  mapX = pixelX * mouseX + left;
  var theY = iHeight - mouseY;
  pixelY = yDistance / iHeight;
  mapY = pixelY * theY + bottom;
  if (toolMode==20) {
   calcDistance(mapX,mapY);
  }else if (showXYs) {
   var u = Math.pow(10,numDecimals);
   var uX = parseInt(mapX * u + 0.5) / u
   var uY= parseInt(mapY * u + 0.5) / u
   var mouseString = "Map: " + uX + " , " + uY + " -- Image: " + mouseX + " , " + mouseY;
   if (showScalePercent) mouseString = mouseString + " -- ScaleFactor: " + mapScaleFactor;
   window.status = mouseString;
  }
 }
 //if ((panning) || (zooming) || (selectBox))
 return false;
 //else
 //return true;
}

// start zoom in.... box displayed
function startZoomBox(e) {
 moveLayer("theMap",hspc,vspc);
 getImageXY(e);
 // keep it within the MapImage
 if ((mouseX<iWidth) && (mouseY<iHeight)) {
  if (zooming) {
   stopZoomBox(e);
  } else {
   x1=mouseX;
   y1=mouseY;
   x2=x1+1;
   y2=y1+1;
   zleft=x1;
   ztop=y1;
   zbottom=y1;
   zright=x1
   boxIt(x1,y1,x2,y2);
   /*
   clipLayer("zoomBoxTop",x1,y1,x2,y2);
   clipLayer("zoomBoxLeft",x1,y1,x2,y2);
   clipLayer("zoomBoxRight",x1,y1,x2,y2);
   clipLayer("zoomBoxBottom",x1,y1,x2,y2);
   */
   zooming=true;
   showLayer("zoomBoxTop");
   showLayer("zoomBoxLeft");
   showLayer("zoomBoxRight");
   showLayer("zoomBoxBottom");
  }
 }
 return false;
}

// stop zoom box display... zoom in
function stopZoomBox(e) {
 zooming=false;
 if ((zright <zleft+2) && (zbottom < ztop+2)) {
  zoomin(e);
 } else {
  var tempLeft=lastLeft;
  var tempRight=lastRight;
  var tempTop=lastTop;
  var tempBottom=lastBottom;
  saveLastExtent();
  pixelX = xDistance / iWidth;
  var theY = iHeight - ztop;
  pixelY = yDistance / iHeight;
  top = pixelY * theY + bottom;
  right = pixelX * zright + left;
  left = pixelX * zleft + left;
  theY = iHeight - zbottom;
  pixelY = yDistance / iHeight;
  bottom = pixelY * theY + bottom;
  window.scrollTo(0,0);
  //var theString = writeXML();
  sendMapXML();
  hideLayer("zoomBoxTop");
  hideLayer("zoomBoxLeft");
  hideLayer("zoomBoxRight");
  hideLayer("zoomBoxBottom");
 }
 return true;
}

// start zoom out... box displayed
function startZoomOutBox(e) {
 moveLayer("theMap",hspc,vspc);
 getImageXY(e);
 // keep it within the MapImage
 if ((mouseX<iWidth) && (mouseY<iHeight)) {
  if (zooming) {
   stopZoomOutBox(e);
  } else {
   x1=mouseX;
   y1=mouseY;
   x2=x1+1;
   y2=y1+1;
   zleft=x1;
   ztop=y1;
   zbottom=y1;
   zright=x1;
   boxIt(x1,y1,x2,y2);
   /*
   clipLayer("zoomBoxTop",x1,y1,x2,y2);
   clipLayer("zoomBoxLeft",x1,y1,x2,y2);
   clipLayer("zoomBoxRight",x1,y1,x2,y2);
   clipLayer("zoomBoxBottom",x1,y1,x2,y2);
   */
   zooming=true;
   showLayer("zoomBoxTop");
   showLayer("zoomBoxLeft");
   showLayer("zoomBoxRight");
   showLayer("zoomBoxBottom");
  }
  //} else {
  //	if (zooming) stopZoomOutBox(e);
 }
 return false;
}

// stop zoom out box. . . zoom out
function stopZoomOutBox(e) {
 zooming=false;
 if ((zright <zleft+2) && (zbottom < ztop+2)) {
  zoomout(e);
 } else {
  var tempLeft=lastLeft;
  var tempRight=lastRight;
  var tempTop=lastTop;
  var tempBottom=lastBottom;
  saveLastExtent();
  var zWidth = Math.abs(zright-zleft);
  var zHeight = Math.abs(ztop-zbottom);
  var xRatio = iWidth / zWidth;
  var yRatio = iHeight / zHeight;
  var xAdd = xRatio * xDistance / 2;
  var yAdd = yRatio * yDistance / 2;
  left = left - xAdd;
  right = right + xAdd;
  top = top + yAdd;
  bottom = bottom - yAdd;
  window.scrollTo(0,0);
  if (enforceFullExtent) {
   if ((right-left)>fullWidth) {
    left = fullLeft;
    right = fullRight;
    top = fullTop;
    bottom = fullBottom;
    lastLeft=tempLeft;
    lastRight=tempRight;
    lastTop=tempTop;
    lastBottom=tempBottom;
   }
  }
  //var theString = writeXML();
  sendMapXML();
  hideLayer("zoomBoxTop");
  hideLayer("zoomBoxLeft");
  hideLayer("zoomBoxRight");
  hideLayer("zoomBoxBottom");
 }
 return true;
}

// clip zoom box layer to mouse coords
function setClip() {
 var tempX=x1;
 var tempY=y1;
 if (x1>x2) {
  zright=x1;
  zleft=x2;
 } else {
  zleft=x1;
  zright=x2;
 }
 if (y1>y2) {
  zbottom=y1;
  ztop=y2;
 } else {
  ztop=y1;
  zbottom=y2;
 }
 if ((x1 != x2) && (y1 != y2)) {
  //clipLayer("zoomBox",zleft,ztop,zright,zbottom);
  boxIt(zleft,ztop,zright,zbottom);
  /*
  clipLayer("zoomBoxTop",zleft,ztop,zright,ztop+ovBoxSize);
  clipLayer("zoomBoxLeft",zleft,ztop,zleft+ovBoxSize,zbottom);
  clipLayer("zoomBoxRight",zright-ovBoxSize,ztop,zright,zbottom);
  clipLayer("zoomBoxBottom",zleft,zbottom-ovBoxSize,zright,zbottom);
  */
 }
 //return false;
}

// start pan.... image will move
function startPan(e) {
 moveLayer("theMap",hspc,vspc);
 getImageXY(e);
 // keep it within the MapImage
 if ((mouseX<iWidth) && (mouseY<iHeight)) {
  if (panning) {
   stopPan(e);
  } else {
   x1=mouseX;
   y1=mouseY
   x2=x1+1;
   y2=y1+1;
   panning=true;
  }
 }
 return false;
}

// stop moving image.... pan
function stopPan(e) {
 window.scrollTo(0,0);
 panning=false;
 var tempLeft=lastLeft;
 var tempRight=lastRight;
 var tempTop=lastTop;
 var tempBottom=lastBottom;
 saveLastExtent();
 var ixOffset = x2-x1;
 var iyOffset = y1-y2;
 pixelX = xDistance / iWidth;
 var theY = iHeight - ztop;
 pixelY = yDistance / iHeight;
 var xOffset = pixelX * ixOffset;
 var yOffset = pixelY * iyOffset;
 top = top - yOffset;
 right = right - xOffset;
 left = left - xOffset;
 bottom = bottom - yOffset;
 checkFullExtent();
 hideLayer("theMap");
 if (hasLayer("theMapClicks")) {
  document.theClickImage.src = blankImage;
 }
 //var theString = writeXML();
 sendMapXML();
 //window.setTimeout('moveLayer("theMap",hspc,vspc);',1000);
 //window.setTimeout('showLayer("theMap");',1500);
 //window.setTimeout('clipLayer("theMap",0,0,iWidth,iHeight);',1500);
 return true;
}

// move map image with mouse
function panMouse() {
 var xMove = x2-x1;
 var yMove = y2-y1;
 var cLeft = -xMove;
 var cTop = -yMove;
 var cRight = iWidth;
 var cBottom = iHeight;
 if (xMove>0) {
  cLeft = 0;
  cRight = iWidth - xMove;
 }
 if (yMove>0) {
  cTop = 0;
  cBottom = iHeight - yMove;
 }
 clipLayer("theMap",cLeft,cTop,cRight,cBottom);
 moveLayer("theMap",xMove+hspc,yMove+vspc);
 if (hasLayer("theMapClicks")) {
  clipLayer("theMapClicks",cLeft,cTop,cRight,cBottom);
  moveLayer("theMapClicks",xMove+hspc,yMove+vspc);
 }
 //return false;
}

// pan to mouse click
function pan(e) {
 getMapXY(mouseX,mouseY);
 var tempLeft=lastLeft;
 var tempRight=lastRight;
 var tempTop=lastTop;
 var tempBottom=lastBottom;
 saveLastExtent();
 left = mapX - xHalf;
 right = mapX + xHalf;
 top = mapY + yHalf;
 bottom = mapY - yHalf;
 //var theString = writeXML();
 sendMapXML();
}

function setZoomColor() {
 setLayerBackgroundColor("zoomBoxTop", zoomBoxColor);
 setLayerBackgroundColor("zoomBoxLeft", zoomBoxColor);
 setLayerBackgroundColor("zoomBoxRight", zoomBoxColor);
 setLayerBackgroundColor("zoomBoxBottom", zoomBoxColor);
 setLayerBackgroundColor("zoomOVBoxTop", zoomBoxColor);
 setLayerBackgroundColor("zoomOVBoxLeft", zoomBoxColor);
 setLayerBackgroundColor("zoomOVBoxRight", zoomBoxColor);
 setLayerBackgroundColor("zoomOVBoxBottom", zoomBoxColor);
}
