// 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.

***************************************************************************************
*/

/* Convierte los clics del raton en coordenadas de mapa */
function getMapXY(xIn,yIn) {
		mouseX = xIn;
		pixelX = xDistance / iWidth;
		mapX = pixelX * mouseX + eLeft;
		mouseY = iHeight - yIn;
		pixelY = yDistance / iHeight;
		mapY = pixelY * mouseY + eBottom;
}

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;

}	

/* Zoom In */
function zoomin(e) {
	getMapXY(mouseX,mouseY);
	var tempLeft=lastLeft;
	var tempRight=lastRight;
	var tempTop=lastTop;
	var tempBottom=lastBottom;
	saveLastExtent();

	eLeft = mapX - (xHalf/zoomFactor);
	eRight = mapX + (xHalf/zoomFactor);
	eTop = mapY + (yHalf/zoomFactor);
	eBottom = mapY - (yHalf/zoomFactor);

	// comprobamos que no se supere una escala minima
	if (parent.MapFrame.getMapScale(eRight-eLeft)<parent.MapFrame.EscalaMinima) {
		eLeft=lastLeft;
		eRight=lastRight;
		eBottom=lastBottom;
		eTop=lastTop;
		alert("No es posible acercarse más");
		return false;
	}
	// comprobamos que no se salga de los límites
	var d = 0;
	if (eLeft<limitLeft) {
		d = limitLeft - eLeft;
		eLeft = limitLeft;
		eRight = eRight + d;
	}
	if (eRight>limitRight) {
		d = eRight - limitRight;
		eRight = limitRight;
		eLeft = eLeft - d;
	}
	if (eTop>limitTop) {
		d = eTop - limitTop;
		eTop = limitTop;
		eBottom = eBottom - d;
	}
	if (eBottom<limitBottom) {
		d = limitBottom - eBottom;
		eBottom = limitBottom;
		eTop = eTop + d;
	}
	//
	sendMapXMLActiveX();
}

/* Zoom Out */
function zoomout(e) {
	getMapXY(mouseX,mouseY);
	var tempLeft=lastLeft;
	var tempRight=lastRight;
	var tempTop=lastTop;
	var tempBottom=lastBottom;
	saveLastExtent();

	eLeft = mapX - (xDistance*zoomFactor/2);
	eRight = mapX + (xDistance*zoomFactor/2);
	eTop = mapY + (yDistance*zoomFactor/2);
	eBottom = mapY - (yDistance*zoomFactor/2);
	if (enforceFullExtent) {
		if ((eRight-eLeft)>fullWidth) {
			eLeft = fullLeft;
			eRight = fullRight;
			eTop = fullTop;
			eBottom = fullBottom;
			lastLeft=tempLeft;
			lastRight=tempRight;
			lastTop=tempTop;
			lastBottom=tempBottom;
		}
	}
	// comprobamos que no se salga de los límites
	var d = 0;
	if (eLeft<limitLeft) {
		d = limitLeft - eLeft;
		eLeft = limitLeft;
		eRight = eRight + d;
	}
	if (eRight>limitRight) {
		d = eRight - limitRight;
		eRight = limitRight;
		eLeft = eLeft - d;
	}
	if (eTop>limitTop) {
		d = eTop - limitTop;
		eTop = limitTop;
		eBottom = eBottom - d;
	}
	if (eBottom<limitBottom) {
		d = limitBottom - eBottom;
		eBottom = limitBottom;
		eTop = eTop + d;
	}
	//
	sendMapXMLActiveX();
}	

/* Mueve la ultima arista del path de medicion */
function measureMove()
{
	var dentro = XYinsideBox("measureBox", mouseX, mouseY) || XYinsideBox("areaBox", mouseX, mouseY);
	if (ElementosDeMedida>0 && !dentro) {
		// Obtengo el atributo del elemento
		var pad = document.getElementById('nr' + ElementosDeMedida).firstChild;
	
		// Localizo el punto de destino		
		var forma = document.getElementById('nr' + ElementosDeMedida);
		var mX = event.clientX - parseInt(forma.style.left.substring(0, forma.style.left.length-2));
		var mY = event.clientY - parseInt(forma.style.top.substring(0, forma.style.top.length-2));
	
		if (toolMode==20) {
			// Obtenemos las coordenadas del nuevo punto
			var sPto = 'l' + mX + ',' + mY + ' e';
			// Agregamos la coordenada
			pad.setAttribute('v', MeasureVML.substring(0, MeasureVML.length-1) + sPto); 
		} else if (toolMode==1020 /*|| toolMode==1030*/) {
			// Cerramos en caso de medida de áreas
			var sPto = 'l' + mX + ',' + mY + ' l0,0 e';
			pad.setAttribute('v', MeasureVML.substring(0, MeasureVML.length-5) + sPto);
			//window.status=pad.getAttribute('v');
		}
	} else if (ElementosDeMedida>0 && dentro) {
		var pad = document.getElementById('nr' + ElementosDeMedida).firstChild;
		pad.setAttribute('v', MeasureVML.substring(0, MeasureVML.length-1));
	}
}

/* Obtiene la coordenadas en la posicion del raton */
function getMouse(e) {
	window.status="";
	getImageXY(e);
	if ((mouseX>iWidth) || (mouseY>iHeight) || (mouseX<=0) || (mouseY<=0)) {
		// fuera del mapa
		chkMouseUp(e);
	} else {
		// estamos dentro del mapa
		mouseStuff();
	  
	}
	return false;
}

function mouseStuff() {
	if ((zooming) || (selectBox) || (consProd)) {
		x2=mouseX;
		y2=mouseY;
		setClip();
	} else if (panning) {
		x2=mouseX;
		y2=mouseY;
		panMouse();	
	}
	pixelX = xDistance / iWidth;
	mapX = pixelX * mouseX + eLeft;
	var theY = iHeight - mouseY;
	pixelY = yDistance / iHeight;
	mapY = pixelY * theY + eBottom;
	
	if (toolMode==20) {
		measureMove();
		calcDistance(mapX,mapY);
	} else if (toolMode==1020 /*|| toolMode==1030*/) {
		measureMove();
		//calcArea();
	}
	else if (showXYs) {
		var u = Math.pow(10,numDecimals);
		var uX = Math.round(mapX * u) / u
		var uY= Math.round(mapY * u) / u
		var cX = parent.MapFrame.FormatNumber(uX, 2, true, false, true);
		var cY = parent.MapFrame.FormatNumber(uY, 2, true, false, true);
		if (parent.barrainferior.CoordX!=null && parent.barrainferior.CoordY!=null)  {
			parent.barrainferior.CoordX.innerText = cX;
			parent.barrainferior.CoordY.innerText = cY;
		}
		window.status = "x: " + cX + "  y: " + cY;
	}

}

/* 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);
			zooming=true;
		}
	}
	return false;
	
}

/* stop zoom box display... zoom in */
function stopZoomBox(e) {
	zooming=false;
	//if (isNav4) {
		hideLayer("zoomBoxTop");
		hideLayer("zoomBoxLeft");
		hideLayer("zoomBoxRight");
		hideLayer("zoomBoxBottom");
	//} else {
	//	hideLayer("zoomBox");
	//}
	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;
		eTop = pixelY * theY + eBottom;
		eRight = pixelX * zright + eLeft;
		eLeft = pixelX * zleft + eLeft;
		theY = iHeight - zbottom;
		pixelY = yDistance / iHeight;
		eBottom = pixelY * theY + eBottom;

		if (parent.MapFrame.getMapScale(eRight-eLeft)<parent.MapFrame.EscalaMinima) {
			eLeft=lastLeft;
			eRight=lastRight;
			eBottom=lastBottom;
			eTop=lastTop;
			alert("Seleccione un área mayor");
			return false;
		}
		window.scrollTo(0,0);
		//var theString = writeXML();
		//alert("Env solicitado: " + eLeft + "," + eTop + ";" + eRight + "," + eBottom);
		sendMapXMLActiveX();
		// calculamos el envelope que realmente nos suministrará ArcIMS
		//alert("Env calculado: " + eLeft + "," + eTop + ";" + eRight + "," + eBottom);
	}
	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);
			zooming=true;
		}
	//} else {
	//	if (zooming) stopZoomOutBox(e);
	}
	return false;
	
}

/* stop zoom out box. . . zoom out */
function stopZoomOutBox(e) {
	zooming=false;
	//if (isNav4) {
		hideLayer("zoomBoxTop");
		hideLayer("zoomBoxLeft");
		hideLayer("zoomBoxRight");
		hideLayer("zoomBoxBottom");
	//} else {
	//	hideLayer("zoomBox");
	//}
	if ((zright <zleft+2) && (zbottom < ztop+2)) {
		zoomout(e);
	} else {	
		var tempLeft=eLeft;
		var tempRight=eRight;
		var tempTop=eTop;
		var tempBottom=eBottom;
		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;
		eLeft = eLeft - xAdd;
		eRight = eRight + xAdd;
		eTop = eTop + yAdd;
		eBottom = eBottom - yAdd;
		window.scrollTo(0,0);
		if (enforceFullExtent) {
			if ((eRight-eLeft)>fullWidth) {
				eLeft = fullLeft;
				eRight = fullRight;
				eTop = fullTop;
				eBottom = fullBottom;
				lastLeft=tempLeft;
				lastRight=tempRight;
				lastTop=tempTop;
				lastBottom=tempBottom;
			}
		}
		//var theString = writeXML();
		sendMapXMLActiveX();
	}
	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) {
	// invisibilizamos la capa de geometría
	parent.MapFrame.ocultarGeometria(true);
	
	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=eLeft;
	var tempRight=eRight;
	var tempTop=eTop;
	var tempBottom=eBottom;
	//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;
	eTop = eTop - yOffset;
	eRight = eRight - xOffset;
	eLeft = eLeft - xOffset;
	eBottom = eBottom - yOffset;
	if (enforceFullExtent) {
		if (eLeft < limitLeft) {
			eLeft = limitLeft;
			eRight = eLeft + xDistance;
		}
		if (eTop > limitTop) {
			eTop = limitTop;	
			eBottom = eTop - yDistance;
		}	
		if (eRight > limitRight) {
			eRight = limitRight;
			eLeft = eRight - xDistance;
		}
		if (eBottom < limitBottom) {
			eBottom = limitBottom;	
			eTop = eBottom + yDistance;
		}	
	}
	lastLeft = tempLeft;
	lastRight = tempRight;
	lastTop = tempTop;
	lastBottom = tempBottom;
	//hideLayer("theMap");
	if (hasLayer("theMapClicks")) {
		document.theClickImage.src = blankImage;

	}
	sendMapXMLActiveX();	
	return true;	
}

/* move map image with mouse */
function panMouse() {
	// invisibilizamos la capa de geometría
	parent.MapFrame.eliminarGeometria();

	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;
	}
	clipLayer2("theMap",cLeft,cTop,cRight,cBottom);
	moveLayer("theMap",xMove+hspc,yMove+vspc);
	if (hasLayer("theMapClicks")) {
		clipLayer2("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();

	eLeft = mapX - xHalf;
	eRight = mapX + xHalf;
	eTop = mapY + yHalf;
	eBottom = mapY - yHalf;
	//var theString = writeXML();
	sendMapXMLActiveX();
}

/* start consulta productos .... box displayed */
function startConsProdBox(e) {
	moveLayer("theMap",hspc,vspc);
	getImageXY(e);	
	// keep it within the MapImage
	if ((mouseX<iWidth) && (mouseY<iHeight)) {
		if (consProd) {
			stopConsProdBox(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);
			consProd=true;
		}
	}
	return false;
	
}
/* stop consProd box display... consProd */
function stopConsProdBox(e) {
	consProd=false;
	//if (isNav4) {
		// Dejamos visible el rectángulo trazado
		/*hideLayer("zoomBoxTop");
		hideLayer("zoomBoxLeft");
		hideLayer("zoomBoxRight");
		hideLayer("zoomBoxBottom");*/
	//} else {
	//	hideLayer("zoomBox");
	//}
	if ((zright <zleft+2) && (zbottom < ztop+2)) {
		alert("Seleccione un área mayor");
	} else {
		pixelX = xDistance / iWidth;
		var theY = iHeight - ztop;
		pixelY = yDistance / iHeight;
		var arriba = pixelY * theY + eBottom;
		var derecha = pixelX * zright + eLeft;
		var izquierda = pixelX * zleft + eLeft;
		theY = iHeight - zbottom;
		pixelY = yDistance / iHeight;
		var abajo = pixelY * theY + eBottom;

		/*if (parent.MapFrame.getMapScale(derecha-izquierda)<parent.MapFrame.EscalaMinima) {
			alert("Seleccione un área mayor");
			return false;
		}*/
		
		window.scrollTo(0,0);	
		consultarProductos(izquierda, abajo, derecha, arriba);
	}
	return true;

}
