// aimsMap.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*		dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js
*/

aimsMapPresent=true;

// global variables
	// show xml responses
var debugOn = 0;
  // can debug be toggled?
var setDebug = true;

var useLimitExtent=false;
var getStartingExtent=true;
var getLimitExtent=true;
var enforceFullExtent=true;

// map extents. . . dynamically updated
var eLeft = -180.0;
var eRight = 180.0;
var eTop = 90.0;
var eBottom = -90.0;
var fullLeft = eLeft;
var fullRight = eRight;
var fullTop = eTop;
var fullBottom = eBottom;

// map size . . . dynamically updated
var iWidth = 630;
var iHeight = 512;
// location map size . . . dynamically updated
var i2Width = 150;
var i2Height = 120;

var imageLimitLeft = limitLeft;
var imageLimitTop = limitTop;
var imageLimitRight = limitRight;
var imageLimitBottom = limitBottom;

var appDir = "";

var xDistance = Math.abs(eRight-eLeft);
var yDistance = Math.abs(eTop-eBottom);
var panX = xDistance * panFactor;
var panY = yDistance * panFactor;
var pixelX = xDistance/iWidth;
var pixelY = yDistance/iHeight;
var mapX = eLeft;
var mapY = eTop;
var lastLeft = eLeft;
var lastRight = eRight;
var lastTop = eTop;
var lastBottom = eBottom;
var fullOVLeft = eLeft;
var fullOVRight = eRight;
var fullOVTop = eTop;
var fullOVBottom = eBottom;
var theCursor = "crosshair";
var canLoad=false;

var fullWidth = Math.abs(fullRight - fullLeft);
var fullHeight = Math.abs(fullTop - fullBottom);
var fullOVWidth = Math.abs(fullOVRight - fullOVLeft);
var fullOVHeight = Math.abs(fullOVTop - fullOVBottom);
var mapScaleFactor = xDistance / iWidth;

var geocodeX = 0;
var geocodeY = 0;
var showGeocode = false;
var geocodeLabel = "";

var queryZoom=false;

var sQuote = "'";
var dQuote = '"';



//*********************************************
//K2P Query URL - zoom to many K2P features
var k2pQueryURL="";
var k2pGISQuery="";
var displayAllK2PFeatures
var justLinked = false
var xLabelCoord;
var yLabelCoord;

//*********************************************

var toolMode = 1;
var legendVisible=false;
// set legend visible at service load... showTOC=false & hasTOC=true
if ((hasTOC) && (!showTOC)) legendVisible=true;

MapUnits = MapUnits.toUpperCase();
ScaleBarUnits = ScaleBarUnits.toUpperCase();

// save the extent 
function saveLastExtent() {
	lastLeft = eLeft;
	lastRight = eRight;
	lastTop = eTop;
	lastBottom = eBottom;
}

// zoom out to full extent
function fullExtent() {
	if (aimsDHTMLPresent) moveLayer("theMap",hspc,vspc);
	window.scrollTo(0,0);
	saveLastExtent();
	eLeft = startLeft;
	eRight = startRight;
	eTop = startTop;
	eBottom = startBottom;
	
	sendMapXML();
}

function startExtent() {
	if (aimsDHTMLPresent) moveLayer("theMap",hspc,vspc);
	window.scrollTo(0,0);
	saveLastExtent();
	eLeft = startLeft;
	eRight = startRight;
	eTop = startTop;
	eBottom = startBottom;
	sendMapXML();
}

// zoom back to last extent
function zoomBack() {
	if (aimsDHTMLPresent) moveLayer("theMap",hspc,vspc);
	var left1 = eLeft;
	var right1 = eRight;
	var top1 = eTop;
	var bottom1 = eBottom;
	eLeft = lastLeft;
	eRight = lastRight;
	eTop = lastTop;
	eBottom = lastBottom;
	lastLeft = left1;
	lastRight = right1;
	lastTop = top1;
	lastBottom = bottom1;
	sendMapXML();	
}

function zoomToPoint(xIn, yIn, drawIt,theLabel) {

	var mWMargin = 0;
	var mHMargin = 0;

	mWMargin = Math.abs(limitRight-limitLeft) //* selectPointMargin;
	mHMargin = Math.abs(limitTop-limitBottom) //* selectPointMargin;

	saveLastExtent();
	eLeft = xIn  - mWMargin;
	eRight = xIn  + mWMargin;
	eTop = yIn + mHMargin;
	eBottom = yIn - mHMargin;
	if (drawIt) {
		showGeocode=true;
		geocodeX=xIn;
		geocodeY=yIn;
		geocodeLabel=theLabel;
	}

	//Need to zoom to set scale
	//alert("her")
	parent.ToolFrame.document.forms[0].txtScale.value = parseInt(k2pZoomScale);
	parent.MapFrame.RecalculateExtent(); 
	
	sendMapXML();
}

function zoomToEnvelope(minXin,minYin,maxXin,maxYin) {

	saveLastExtent();
	eLeft=minXin;
	eBottom=minYin;
	eRight=maxXin;
	eTop=maxYin;

	sendMapXML()
}

// zoom to center of fullextent at set scale
function zoomScale(inScale) {
	// inScale is scale factor where 1.0 = 100% of fullWidth and fullHeight
	var halfWidth = fullWidth / 2;
	var halfHeight = fullHeight / 2
	var midX = eRight - (xDistance / 2);
	var midY = eTop - (yDistance / 2);
	var newWidth = halfWidth * inScale;
	var newHeight = halfHeight * inScale;
	saveLastExtent();
	eLeft = midX - newWidth;
	eRight = midX + newWidth;
	eTop = midY + newHeight;
	eBottom = midY - newHeight;
	sendMapXML();	
}

// get URLs and extents from URL
function getCommandLineParams(cmdString) {
	// Parse out from URL querystring parameters 
	// to pass to the viewer.
	// Syntax:
	// Host=Hostmachine					name of Host, if not default
	// Service=MapService				name of MapService, if not default
	// OVMap=OvMapService				name of Overview MapService, if not default
	// Box=minX:minY:maxX:maxY			extent to be displayed
	// Layers=0101101					visible layers,starting from topmost: 0=not visible;1=visible
	// ActiveLayer=layerIndex			index of layer to be active, if not default
	// Query=queryExpression			query expression to be send on load - expression must be escaped in URL
	// QueryZoom=Yes					zoom to above query?
	// StartLeft,StartTop,
	// StartRight,StartBottom			starting coords - alternative to Box
	// LimitLeft,LimitTop,
	// LimitRight,LimitBottom			limit coords

	setLayerVisible.length=0;
	var cmdString2 = cmdString.toUpperCase();
	var startpos = 0;
	var endpos = 0;
	var pos = cmdString2.indexOf("HOST=");
	if (pos!=-1) {
		startpos = pos + 5;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		hostName = cmdString.substring(startpos,endpos);
		serverURL  = "http://" + hostName + "/servlet/com.esri.esrimap.Esrimap?ServiceName=";
	}
	pos = cmdString2.indexOf("SERVICE="); // formally was MAPSERVICE=
	if (pos!=-1) {
		startpos = pos + 8;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		imsURL = serverURL + cmdString.substring(startpos,endpos);
	}
	pos = cmdString2.indexOf("OVMAP="); // formally was OVMAPSERVICE=
	if (pos!=-1) {
		startpos = pos + 6;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		imsOVURL = serverURL + cmdString.substring(startpos,endpos);
	}
	pos = cmdString2.indexOf("BOX=");
	if (pos!=-1) {
		startpos = pos + 4;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		var boxString = cmdString.substring(startpos,endpos);
		var xyBox = boxString.split(":");
		if (xyBox.length==4) {
			startLeft = parseFloat(xyBox[0]);
			startBottom = parseFloat(xyBox[1]);
			startRight = parseFloat(xyBox[2]);
			startTop = parseFloat(xyBox[3]);
			eLeft=startLeft;
			eBottom=startBottom;
			eRight=startRight;
			eTop = startTop;
		}
	}
	pos = cmdString2.indexOf("MAXRECT=");
	if (pos!=-1) {
		startpos = pos + 8;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		var boxString = cmdString.substring(startpos,endpos);

		var xyBox = boxString.split(":");
		if (xyBox.length==4) {
			limitLeft = xyBox[0];
			limitBottom = xyBox[1];
			limitRight = xyBox[2];
			limitTop = xyBox[3];
		}
	}
	if (aimsLayersPresent) {
		// you need to have aimsLayers.js loaded
		pos = cmdString2.indexOf("LAYERS=");
		if (pos!=-1) {
			startpos = pos + 7;
			endpos = cmdString.indexOf("&",startpos);
			if (endpos==-1) endpos = cmdString.length;
			var layers = cmdString.substring(startpos,endpos);
			//"0" means the layer should be turned off, and "1" means
			//the layer should be visible.  For example, "1001" means there
			//are 4 layers.  The first and last layer are visible, and the
			//middle two layers are turned off. The first number represents
			//the top-most layer.
			
			//Parse the layers string
			var numLayers=layers.length;
			icount=0;

			while (icount<=numLayers-1) {
			  onoff=layers.substring(icount,icount+1);
			  if (onoff=='0') {
			  	setLayerVisible[icount]=false;
			  }
			  else if (onoff=='1') {
			    setLayerVisible[icount]=true;
			  }
			  icount=icount+1;
			}
			layers="";
		}
		
		pos = cmdString2.indexOf("ACTIVELAYER=");
		if (pos!=-1) {
			startpos = pos + 12;
			endpos = cmdString.indexOf("&",startpos);
			if (endpos==-1) endpos = cmdString.length;
			var actlyr = cmdString.substring(startpos,endpos);
			
			//Process the layer passed over
			var i = parent.MapFrame.processDCCLayer(actlyr);

			ActiveLayerIndex = parseInt(i);
			
			selectType = LayerType[i];	
			actlyr = "";
		}	
		if (aimsQueryPresent) {
			// you need to have aimsQuery.js loaded
			pos = cmdString2.indexOf("QUERY=");
			if (pos!=-1) {
				startpos = pos + 6;
				endpos = cmdString.indexOf("&",startpos);
				if (endpos==-1) endpos = cmdString.length;
				var escQuery = cmdString.substring(startpos,endpos);
				
				escQuery = replacePlus(escQuery);
				escQuery = unescape(escQuery);
				highlightedOne = makeXMLsafe(escQuery);
				
				escQuery="";
			}	
			if (highlightedOne!="") {
				pos = cmdString2.indexOf("QUERYZOOM=YES");
				if (pos!=-1) queryZoom = true;
			}
		}
	}
	
	pos = cmdString2.indexOf("STARTLEFT=");
	if (pos!=-1) {
		startpos = pos + 10;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		startLeft = cmdString.substring(startpos,endpos);
	}

	//Label
	pos = cmdString2.indexOf("LABEL=");
	if (pos!=-1) 
	{
		startpos = pos + 6;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		parent.MapFrame.pointLabelText = cmdString.substring(startpos,endpos);

	}

	//Label X coord
	pos = cmdString2.indexOf("XLABELCOORD=");
	if (pos!=-1) 
	{
		startpos = pos + 12;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		parent.MapFrame.xLabelCoord = cmdString.substring(startpos,endpos);
	}

	//Label Y coord
	pos = cmdString2.indexOf("YLABELCOORD=");
	if (pos!=-1) 
	{
		startpos = pos + 12;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		parent.MapFrame.yLabelCoord = cmdString.substring(startpos,endpos);
	}

	pos = cmdString2.indexOf("STARTTOP=");
	if (pos!=-1) {
		startpos = pos + 9;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		startTop = cmdString.substring(startpos,endpos);
	}
	
	//Easting
	pos = cmdString2.indexOf("STARTRIGHT=");
	if (pos!=-1) {
		startpos = pos + 11;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		startRight = cmdString.substring(startpos,endpos);
	}
	
	//Northing
	pos = cmdString2.indexOf("STARTBOTTOM=");
	if (pos!=-1) {
		startpos = pos + 12;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		startBottom = cmdString.substring(startpos,endpos);
	}

	//Display all K2P Features?
	pos = cmdString2.indexOf("DISPLAYALLK2PFEATURES=");
	if (pos!=-1) {
		startpos = pos + 22;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		displayAllK2PFeatures = cmdString.substring(startpos,endpos);

		if (displayAllK2PFeatures == "false")
		{
			//Turn off identify
			useIdentify = false
		}

		//alert(parent.MapFrame.LayerVisible[parent.MapFrame.ActiveLayerIndex])
	}

	pos = cmdString2.indexOf("LIMITLEFT=");
	if (pos!=-1) {
		startpos = pos + 10;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		limitLeft = cmdString.substring(startpos,endpos);
	}
	pos = cmdString2.indexOf("LIMITTOP=");
	if (pos!=-1) {
		startpos = pos + 9;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		limitTop = cmdString.substring(startpos,endpos);
	}
	pos = cmdString2.indexOf("LIMITRIGHT=");
	if (pos!=-1) {
		startpos = pos + 11;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		limitRight = cmdString.substring(startpos,endpos);
	}
	pos = cmdString2.indexOf("LIMITBOTTOM=");
	if (pos!=-1) {
		startpos = pos + 12;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		limitBottom = cmdString.substring(startpos,endpos);
	}

	//A Query on Many PRNS
	pos = cmdString2.indexOf("K2PPRNS=");
	if (pos!=-1) {
		startpos = pos + 8;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		k2pGISQuery = cmdString.substring(startpos,endpos);
		
		k2pGISQuery = "FEAT.GISDBA.K2P.PRN IN (" + k2pGISQuery + ")"
		k2pGISQuery = replacePlus(k2pGISQuery);
		k2pGISQuery = unescape(k2pGISQuery);
		highlightedOne = makeXMLsafe(k2pGISQuery);

		//K2P layer is always 0
		ActiveLayerIndex = parseInt(0);
		selectType = LayerType[0];	
	}

	//A Query on single PRN
	pos = cmdString2.indexOf("K2PSINGLEPRN=");
	if (pos!=-1) {
		startpos = pos + 13;
		endpos = cmdString.indexOf("&",startpos);
		if (endpos==-1) endpos = cmdString.length;
		k2pGISQuery = cmdString.substring(startpos,endpos);

		k2pGISQuery = "FEAT.GISDBA.K2P.PRN IN (" + k2pGISQuery + ")"
		k2pGISQuery = replacePlus(k2pGISQuery);
		k2pGISQuery = unescape(k2pGISQuery);
		highlightedOne = makeXMLsafe(k2pGISQuery);

		//K2P layer is always 0
		ActiveLayerIndex = parseInt(0);
		selectType = LayerType[0];

		//Don't show labels etc
		showGeocode = false
	}

	pos = cmdString2.indexOf("EXTENT=AUTO");
	if (pos!=-1) {
		startLeft=0;
		startRight=0;
		startTop=0;
		startBottom=0;
		limitLeft=0;
		limitRight=0;
		limitTop=0;
		limitBottom=0;
		getStartingExtent=true;
		getLimitExtent=true;
	}
	
	if (imsURL!="") {
		imsQueryURL= imsURL + "&CustomService=Query";
		imsGeocodeURL = imsURL + "&CustomService=Geocode";
	} 
	
	// if starting extents zero'd then flag to get start from mapservice
	if ((startLeft!=0) && (startRight!=0)) getStartingExtent=false;
	
	// if limit extents zero'd then flag to get max from mapservice
	if ((limitLeft!=0) && (limitRight!=0)) {
		getLimitExtent=false;
		enforceFullExtent=true;
	}
}

// get directory path of URL
function getPath(theFullPath) {
	var theSlash = theFullPath.lastIndexOf("/");
	var theDir = theFullPath.substring(0,theSlash);
	if (theDir==null) theDir="";
	theDir = theDir + "/";
	return theDir;
}

// check for existance of layer
function hasLayer(name) {
	var result = false;
	if (isNav4) {
		if (document.layers[name]!=null) result=true;
	}  else if (isIE) {
		if (eval('document.all.' + name)!=null) result=true;
	} else if (isNav) {
		var theElements = document.getElementsByTagName("DIV");
		var theObj;
		var j = -1;
		for (i=0;i<theElements.length;i++) {
			if (theElements[i].id==name) result=true;
		}
    }
	return result;
}

// put up the "RetriveData" image
function showRetrieveData() {
	if (hasLayer("LoadData")) {
		showLayer("LoadData");
	}
}

// hide the "RetriveData" image
function hideRetrieveData() {
	if (hasLayer("LoadData")) {
		hideLayer("LoadData");
	}
}

// put up the "RetriveMap" image
function showRetrieveMap() {
	if (hasLayer("LoadMap")) {
		showLayer("LoadMap");
	}
}

// hide the "RetriveMap" image
function hideRetrieveMap() {
	if (hasLayer("LoadMap")) {
		hideLayer("LoadMap");
	}
}

// set new map extent 
function setExtent(newLeft, newTop, newRight, newBottom) {
	eLeft = newLeft;
	eTop = newTop;
	eRight = newRight;
	eBottom = newBottom;
}

//  set new full extent 
function setFullExtent(maxLeft, maxTop, maxRight, maxBottom) {
	fullLeft = maxLeft;
	fullTop = maxTop;
	fullRight = maxRight;
	fullBottom = maxBottom;
	fullWidth = Math.abs(fullRight-fullLeft);
	fullHeight = Math.abs(fullTop-fullBottom);
}

function beforeMapRefresh() {

}
 
function afterMapRefresh() {

}	

// zoom using button.
//	zoomType: 1=in; 2=out
function zoomButton(zoomType) {
	saveLastExtent();
	if (zoomType == 1) {
		// zoom in
		eLeft = eLeft + (xHalf/2);
		eRight = eRight - (xHalf/2);
		eTop = eTop - (yHalf/2);
		eBottom = eBottom + (yHalf/2);
	}
	else {
		// zoom out
		eLeft = eLeft - xHalf;
		eRight = eRight + xHalf;
		eTop = eTop + yHalf;
		eBottom = eBottom - yHalf;
	}
	checkFullExtent();
	sendMapXML();
}

// pan using arrow buttons
function panButton(panType) {
	saveLastExtent();
	xDistance = Math.abs(eRight-eLeft);
	yDistance = Math.abs(eTop-eBottom);
	panX = xDistance * panFactor;
	panY = yDistance * panFactor;
	switch(panType) {

	case 1:
		//west
		eLeft = eLeft - panX;
		eRight = eLeft + xDistance;
		break
	case 2:
		// north
		eTop = eTop + panY;
		eBottom = eTop - yDistance;
		break
	case 3:
		// east
		eRight = eRight + panX;
		eLeft = eRight - xDistance;
		break
	case 4:
		// south
		eBottom = eBottom - panY;
		eTop = eBottom + yDistance;
		break
	case 5:
		// southwest
		eTop = eTop - panY;
		eLeft = eLeft - panX;
		eBottom = eTop - yDistance;
		eRight = eLeft + xDistance;
		break
	case 6:
		// northwest
		eTop = eTop + panY;
		eLeft = eLeft - panX;
		eBottom = eTop - yDistance;
		eRight = eLeft + xDistance;
		break
	case 7:
		// northeast
		eTop = eTop + panY;
		eLeft = eLeft + panX;
		eBottom = eTop - yDistance;
		eRight = eLeft + xDistance;
		break
	case 8:
		// southeast
		eTop = eTop - panY;
		eLeft = eLeft + panX;
		eBottom = eTop - yDistance;
		eRight = eLeft + xDistance;
	}
	sendMapXML();
}

function checkFullExtent() {
	if (xDistance>fullWidth) xDistance = fullWidth;
	if (yDistance>fullHeight) yDistance = fullHeight;
	if (enforceFullExtent) {
		if (eLeft < limitLeft) {
			eLeft = limitLeft;
			eRight = eLeft + xDistance;
		}
		if (eTop > imageLimitTop) {
			eTop = imageLimitTop;	
			eBottom = eTop - yDistance;
		}	
		if (eRight > imageLimitRight) {
			eRight = imageLimitRight;
			eLeft = eRight - xDistance;
		}
		if (eBottom < imageLimitBottom) {
			eBottom = imageLimitBottom;	
			eTop = eBottom + yDistance;
		}	
	}
}
