// aimsIdentify.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*		dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js, aimsMap.js, and aimsLayers.js
*		To be interactive, dependent also on aimsDHTML.js, aimsClick.js, and aimsNavigation.js
*/

aimsIdentifyPresent=true;

// hyperlink variables
var currentHyperLinkLayer="";
var currentHyperLinkField="";
var currentHyperLinkPrefix="";
var currentHyperLinkSuffix="";
var hyperlinkWindowWidth=500;
var hyperlinkWindowHeight=400;

// variable for search tolerance... dynamically set in app
var searchTolerance=1/100;
// starting record position for returned records
var queryStartRecord=1;

if (imsQueryURL=="") {
	imsQueryURL= imsURL + "&CustomService=Query";
	//alert(imsQueryURL);
}
var canQuery=true;
var newSelectCount=0;
var selectPoints = new Array();


/*
***************************************************************************************

Identify functions 

***************************************************************************************
*/

// identify feature
function identify(e) {
	if (checkIfActiveLayerAvailable()) {
		highlightedOne="";
		var theX = mouseX;
		var theY = mouseY;
		getMapXY(theX,theY);
		searchTolerance = (xDistance/iWidth) * pixelTolerance;
		var tempWest = mapX - searchTolerance;
		var tempNorth = mapY + searchTolerance;
		var tempEast = mapX + searchTolerance;
		var tempSouth = mapY - searchTolerance;
		var theString = writeGetFeatures(tempWest,tempSouth,tempEast,tempNorth);
		//if (useTextFrame) parent.TextFrame.document.location = "text.htm";
		//alert(theString);
		showRetrieveData();
		sendToServer(imsQueryURL,theString,identifyXMLMode);
	}
}

// hyperlink from feature in active layer
function hyperLink(e) {
	if (checkIfActiveLayerAvailable()) {
		if (currentHyperLinkLayer!="") {
			highlightedOne="";
			var theX = mouseX;
			var theY = mouseY;
			getMapXY(theX,theY);
			searchTolerance = (xDistance/iWidth) * pixelTolerance;
			var tempWest = mapX - searchTolerance;
			var tempNorth = mapY + searchTolerance;
			var tempEast = mapX + searchTolerance;
			var tempSouth = mapY - searchTolerance;
			var tempSwap = swapSelectFields;
			swapSelectFields=false;
			var tempSelect = selectFields;
			selectFields = LayerIDField[ActiveLayerIndex] + " " + LayerShapeField[ActiveLayerIndex] + " " + currentHyperLinkField;
			var theString = writeGetFeatures(tempWest,tempSouth,tempEast,tempNorth);
			selectFields = tempSelect;
			swapSelectFields=tempSwap;
			showRetrieveData();
			//if (useTextFrame) parent.TextFrame.document.location = "text.htm";
			sendToServer(imsQueryURL,theString,hyperlinkXMLMode);
		} else {
			alert(msgList[47]);
		}
	}
}


// write out XML request to identify features
function writeGetFeatures(west1,south1,east1,north1) {
//alert("writeGetFeatures");
	if (swapSelectFields) {
		selectFields=selFieldList[ActiveLayerIndex];
	}
	var useString = writeIdentifyXML(ActiveLayer,ActiveLayerType,selectFields,west1,south1,east1,north1,maxFeaturesReturned,useLimitExtent);
	hightlightedOne="";
	return useString;
}

function writeIdentifyXML(theLayer,theLayerType,theFields,leftX,bottomY,rightX,topY,maxReturned,hasLimit) {
//alert("writeIdentifyXML");
	var theString = '<ARCXML version="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" envelope="false" geometry="false" featurelimit="' + maxReturned + '">\n';
	theString += '<LAYER id="' + theLayer + '" />';
	theString += '<SPATIALQUERY subfields="' + theFields + '" where="' + parent.InfoFrame.strWhereClause + '">';
	theString += '<SPATIALFILTER relation="area_intersection" >';
	theString += '<ENVELOPE maxy="' + topY + '" maxx="' + rightX + '" miny="' + bottomY + '" minx="' + leftX + '" />';
	theString += '</SPATIALFILTER>';
	theString += '</SPATIALQUERY>';
	if (hasLimit) {
		// keep this within the limitExtent
		theString += '<SPATIALFILTER relation="area_intersection">\n';
		theString += '<ENVELOPE maxx="' + limitRight + '" maxy="' + limitTop + '" minx="' + limitLeft + '" miny="' + limitBottom + '" />\n';
		theString += '</SPATIALFILTER>\n';
	}
	theString += '</GET_FEATURES>';
	theString += '</REQUEST>';
	theString += '</ARCXML>';

	return theString;

}

// parse XML response for selected features
function displayAttributeData(theReply) {
//alert("displayAttributeData");
	setLayerFields(ActiveLayerIndex);
	var theError = getXMLErrorMessage(theReply);
	var fList="";
	var lpos1 = 1;
	var lpos2 = 1;
	var epos = 1;
	var spos = 1;
	var morePoints=true;
	var moreFeatures=true;
	var featureCount = justGetFeatureCount(theReply);
	var pos = 0;
	var startpos = 0;
	var endpos = xmlEndPos;
	var stillMore = false
	pos = theReply.indexOf('hasmore="true"',endpos);
	if (pos!=-1) stillMore = true;
	pos=0;
	var tempCount = 0;
	var selectedData="";
	var inData="";
	var xStr="";
	var yStr="";
	var fCount = featureCount;
	selectCount = 0;
	var tempString="";
	var Win1 = parent.TextFrame;
	var theFrame = "parent.MapFrame";
	//if (featureCount > 0) {
	//	newSelectCount += 1;

	if (showSelectedData) {
		if ((useExternalWindow) || (!useTextFrame)) {
			if (XMLMode == 6) {
				Win1 = window.open("","QueryWindow","toolbar=yes,width=800,height=600,scrollbars=yes,resizable=yes,left=0,top=0");
			} else {
				Win1 = window.open("","QueryWindow","toolbar=yes,width=800,height=300,scrollbars=yes,resizable=yes,left=0,top=0");
			}
			theFrame = "opener";
			if (parent.MapFrame!=null) theFrame = "opener.parent.MapFrame";
		} else {
			Win1 = parent.TextFrame;
			Win1.document.open();
		}
		Win1.document.open();
		if (XMLMode == 6) {
			Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head><title>' + titleList[22] + '</title></head>');
		} else {
			Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head><title>' + titleList[23] + '</title></head>');
		}
		Win1.document.writeln('<body bgcolor="' + textFrameBackColor + '" text="Black" link="Blue" vlink="Gray" LEFTMARGIN=0 onload="window.focus()">');
		Win1.document.writeln('<center>');
		//Win1.document.writeln('<IMG SRC="' + imsHost + '/BPDmaps/images/fcobanner_atts.jpg" USEMAP="#fcobanner.jpg" BORDER="0"><BR><BR>');
		//Win1.document.writeln('<MAP name="fcobanner.jpg">\n');
		//Win1.document.writeln('<AREA shape="rect" coords="351,9,438,113" href="http://www.baltimorepolice.org" target="_window">\n');
		//Win1.document.writeln('</MAP>\n');
		//Win1.document.writeln('<TABLE border="1" cellspacing="0" cellpadding="2" width="720" nowrap bordercolor="996600" bgcolor="' + tableBackColor + '"><TR>');
		Win1.document.writeln('<TABLE border="1" cellspacing="0" cellpadding="2" width="720" nowrap bordercolor="969696"><TR>');
		Win1.document.writeln('<TD align="center" bgcolor="99CCFF" colspan="' + LayerFields.length + '"><FONT FACE="arial" SIZE="-1"><B>Original Query</B></FONT></TD></TR>');
		Win1.document.writeln('<TD bgcolor="FFFFCC"><FONT FACE="arial" SIZE="-2"><DIV align="center"><U>' + parent.InfoFrame.strQueryType + '</U></DIV></FONT></TD>');
		if ((parent.InfoFrame.strQueryType == "Address") || (parent.InfoFrame.strQueryType == "School")) {
			Win1.document.writeln('<TD bgcolor="FFFFCC"><FONT FACE="arial" SIZE="-2"><DIV align="center"><U>Buffer</U></DIV></FONT></TD>');
		}
		Win1.document.writeln('<TD bgcolor="FFFFCC"><FONT FACE="arial" SIZE="-2"><DIV align="center"><U>Crime Type</U></DIV></FONT></TD>');
		Win1.document.writeln('<TD bgcolor="FFFFCC"><FONT FACE="arial" SIZE="-2"><DIV align="center"><U>Date</U></DIV></FONT></TD></TR>');
		Win1.document.writeln('<TR><TD bgcolor="FFFFCC"><FONT FACE="arial" SIZE="-2"><DIV align="center"><B>' + parent.InfoFrame.strQueryText + '</B></DIV></FONT></TD>');
		if ((parent.InfoFrame.strQueryType == "Address") || (parent.InfoFrame.strQueryType == "School")) {
			Win1.document.writeln('<TD bgcolor="FFFFCC"><FONT FACE="arial" SIZE="-2"><DIV align="center"><B>' + parent.InfoFrame.strRadius + '</B></DIV></FONT></TD>');
		}
		Win1.document.writeln('<TD bgcolor="FFFFCC"><FONT FACE="arial" SIZE="-2"><DIV align="center"><B>' + parent.InfoFrame.strCrimeType + '</B></DIV></FONT></TD>');
		Win1.document.writeln('<TD bgcolor="FFFFCC"><FONT FACE="arial" SIZE="-2"><DIV align="center"><B>' + parent.InfoFrame.intMonth + '/' + parent.InfoFrame.strStartDate + '/' + parent.InfoFrame.strStartYear + ' to ' + parent.InfoFrame.intEndMonth + '/' + parent.InfoFrame.strEndDate + '/' + parent.InfoFrame.strEndYear + '</B></DIV></FONT></TD>');
		Win1.document.writeln('</TR></TABLE><BR>');
	}

	//Win1.document.writeln('<TABLE border="1" cellspacing="0" cellpadding="2" width="720" nowrap bordercolor="969696" bgcolor="' + tableBackColor + '"><TR>');
	Win1.document.writeln('<TABLE border="1" cellspacing="0" cellpadding="2" width="720" nowrap bordercolor="969696"><TR>');
	if ((XMLMode == 7) || (parent.InfoFrame.isVisible2("lblPortion"))) {
		Win1.document.writeln('<TD bgcolor="99CCFF" align="center" colspan="' + (LayerFields.length + 1) + '"><FONT FACE="arial" SIZE="-1"><B>Query Results (partial list)</B></FONT></TD></TR>');
	} else {
		Win1.document.writeln('<BR><TD bgcolor="99CCFF" align="center" colspan="' + (LayerFields.length + 1) + '"><FONT FACE="arial" SIZE="-1"><B>Query Results</B></FONT></TD></TR>');
	}

	if (featureCount > 0) {
		newSelectCount += 1;

		endpos = 1;

		for (var i=0;i<fCount;i++) {
			//alert(endpos);
			if (toolMode!=4) {
				var theXYs = getEnvelopeXYs(theReply, endpos)
				selectLeft[selectCount] = theXYs[0];
				selectBottom[selectCount] = theXYs[1];
				selectRight[selectCount] = theXYs[2];
				selectTop[selectCount] = theXYs[3];
				endpos = xmlEndPos;
			}
			//alert(endpos);
			inData = parseRecordString(theReply, endpos);
			endpos = xmlEndPos;
			//selectedData = clearLeadingSpace(inData);
			selectedData = inData;

			epos = theReply.indexOf("</FEATURE",endpos);
			if (showSelectedData) {
				//alert("2\n" + selectedData);
				var showHyper = false;
				if (hyperLinkLayers!=null) {
					for (var s1=0;s1<hyperLinkLayers.length;s1++) {
						if (hyperLinkLayers[s1] == LayerName[ActiveLayerIndex]) showHyper=true;
					}
				}

				var fName1 = getFieldNames(selectedData);
				var fValue1 = getFieldValues(selectedData);
				selectPoints[selectCount] = getIdValue(fName1, fValue1);
				
				var idFieldNum = -1;
				var shapeFieldNum = -1;
				if (hideIDFieldData) {
					// hide ID column header
					for (var f=0;f<fName1.length;f++) {
						if (fName1[f]==LayerIDField[ActiveLayerIndex]) idFieldNum = f;
					}
				}
				if (hideShapeFieldData) {
					// hide Shape column header
					for (var f=0;f<fName1.length;f++) {
						if (fName1[f]==LayerShapeField[ActiveLayerIndex]) shapeFieldNum = f;
					}
				}

				if (selectCount==0) {
					Win1.document.write('<tr><th bgcolor="FFFFCC"><FONT FACE="Arial" SIZE="-2">' + msgList[86] + '</FONT></a></th>');
					for (var f=0;f<fName1.length;f++) {
						if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
							var f2 = -1;
							if (useFieldAlias) {
								for (var f3=0;f3<AliasFieldName.length;f3++) {
									if (AliasFieldName[f3]==fName1[f]) f2 = f3;
								}
							}
							if (f2!=-1) {
								Win1.document.write('<th bgcolor="FFFFCC"><FONT FACE="Arial" SIZE="-2"><U>' + AliasFieldAlias[f2] + '</U></FONT></a></th>');
							} else {
								Win1.document.write('<th bgcolor="FFFFCC"><FONT FACE="Arial" SIZE="-2"><U>' + fName1[f] + '</U></FONT></a></th>');
							}
						}
					}
					Win1.document.writeln('</tr>');
				}

				Win1.document.write('<tr><td bgcolor="FFFFCC">');
				if (toolMode!=4) {
					Win1.document.write('<a href="javascript:' + theFrame + '.showHighlight(' + selectCount + ')">');
				}
				//if (toolMode!=4) Win1.document.write('<a href="javascript:' + theFrame + '.showBPDHighlight(' + selectCount + ')">');
				Win1.document.write('<FONT FACE="Arial" SIZE="-2"><div align="center">' + (selectCount+queryStartRecord) + '</div></FONT>');
				if (toolMode!=4) Win1.document.write('</a>');
				Win1.document.writeln('</td>');
				for (var f=0;f<fName1.length;f++) {	
					if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
						Win1.document.write('<TD bgcolor="FFFFCC">');
						var isHyper=false;
						if (showHyper) {
							for (var s1=0;s1<hyperLinkFields.length;s1++) {
								if (hyperLinkFields[s1]==fName1[f]) {
									var theLinkURL = currentHyperLinkPrefix + fValue1[f] + currentHyperLinkSuffix;
									Win1.document.write('<a href="' + theLinkURL + '" target="_blank">');
									isHyper=true;
								}
							}
						}
						var s2 = -1;
						for (var s1=0;s1<LayerFields.length;s1++) {
							if (fName1[f]==LayerFields[s1]) s2=s1;
						}
						if (LayerFieldType[s2]=="91") {
							//alert(fName1[f]);
							if (isNaN(fValue1[f])) {
								var theDate = fValue1[f];
							} else {
								//var theDate = new Date(parseInt(fValue1[f]));
								var theDateObj = new Date(parseFloat(fValue1[f]));
								var d = theDateObj.toUTCString();
								var theDate = d.replace(/GMT|UTC/,"");
							}
							var shortDate = theDate.toString().substring(0, theDate.toString().length - 10);
							Win1.document.write('<FONT FACE="Arial" SIZE="-2"><div align="center">' + shortDate + '</div></FONT>');
							//Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + theDate + '</FONT>');
							theDate=null;
						} else {
							if (fName1[f] == "LOCATION") {
								fValue1[f] = maskAddress(fValue1[f]);
							}
							Win1.document.write('<FONT FACE="Arial" SIZE="-2"><div align="center">' + fValue1[f] + '</div></FONT>');
						}
						if (isHyper) Win1.document.write('</a>');
						Win1.document.writeln('</td>');
					}
				}
				Win1.document.writeln('</tr>');
				fName1 = null;
				fValue1 = null;
				
			}
			selectCount += 1;
		}

		if (showSelectedData) {
			
			Win1.document.writeln('</table><FONT FACE="Arial" SIZE="-2">');
			Win1.document.writeln('<BR><TABLE border="1" cellspacing="0" cellpadding="2" width="720" nowrap bordercolor="969696" bgcolor="' + tableBackColor + '">');
			Win1.document.writeln('<TD bgcolor="FFFFCC">');
			Win1.document.writeln(parent.InfoFrame.strMiniDisclaimer);
			Win1.document.writeln('</TD></TABLE>');
			if (toolMode!=25) {
				if (queryStartRecord>1) {
					var prevRecord = queryStartRecord - maxFeaturesReturned;
					if (prevRecord<1) prevRecord=1;
					Win1.document.write('<a href="javascript:' + theFrame + '.getMoreData(' + prevRecord + ')">' + msgList[61] + maxFeaturesReturned + msgList[62] + '</a>&nbsp;&nbsp;&nbsp;');
				}
				if (stillMore) {
					var nextRecord=featureCount + queryStartRecord;
					Win1.document.writeln('<a href="javascript:' + theFrame + '.getMoreData(' + nextRecord + ')">' + msgList[63] + '</a>');
				}
			}
			//if ((toolMode!=4) && (toolMode!=25) && (selectCount>1)) {
				//Win1.document.writeln('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="javascript:' + theFrame + '.zoomToReturnedRecords()">Zoom to these records</A></b>');
			//}

			Win1.document.writeln('</font></center>');
		}

		if ((queryStartRecord==1) && (toolMode!=4) && (toolMode!=9) && (toolMode!=25)) {
			if ((selectCount==1) && (zoomToSingleSelect)) {
				var fWidth = selectRight[0] - selectLeft[0];
				var fHeight = selectTop[0] - selectBottom[0];
				var mWMargin = 0;
				var mHMargin = 0;
				if (selectType=="point") {			
					mWMargin = fullWidth * selectPointMargin;
					mHMargin = fullHeight * selectPointMargin;
					if (mWMargin > xDistance/2) {
						mWMargin = xDistance/2;
						mHMargin = yDistance/2;
					}
				} else {
					mWMargin = fWidth * selectMargin;
					mHMargin = fHeight * selectMargin; 
				}
				saveLastExtent();
				eLeft = selectLeft[0] - mWMargin;
				eRight = selectRight[0] + mWMargin;
				eTop = selectTop[0] + mHMargin;
				eBottom = selectBottom[0] - mHMargin;
			}
			//START - FRANK
			if (!BPDSelectPresent) {
			// END  FRANK

			sendMapXML();

			//START FRANK
			} else { 
				BPDSelectPresent = false;
				clickCount = 0; // clear click points
				LayerVisible[2]=1; // set street layer visible
			}
			// END FRANK
		}
		//var theForm = document.forms[0];
		//var theTitle = theForm.title.value;
		/*  This block of commented code is for printing the map and legend.  If they decide
		    to have the map and legend print after clicking "View Table," take the code from
		    the "printBPD()" function, which will be more current, including an automatic
		    calculation of how much to reduce the map and legend image sizes.
		if (XMLMode == 6) {
			Win1.document.writeln('<FONT FACE="Arial"><B>');
			Win1.document.writeln('<CENTER><BR><TABLE WIDTH="720" BORDER="2" CELLSPACING="0" CELLPADDING="0" NOWRAP>');
			Win1.document.writeln('	<TR>');
			//Win1.document.write('		<TD WIDTH="720" HEIGHT="557"');
			Win1.document.write('		<TD WIDTH="576"');
			//if (hasOVMap) Win1.document.write(' ROWSPAN="2"');
			Win1.document.writeln('>');
			Win1.document.writeln('			<IMG SRC="' + parent.MapFrame.theImage.src + '" WIDTH=576 HEIGHT=446 HSPACE=0 VSPACE=0 BORDER=0 ALT="">');
			Win1.document.writeln('		</TD>');
			//if (hasOVMap) {
			//	Win1.document.writeln('		<TD HEIGHT="150" ALIGN="CENTER">');
			//	Win1.document.writeln('			<IMG SRC="' + ovImageVar.src + '" WIDTH=170 HEIGHT=150 HSPACE=0 VSPACE=0 BORDER=0 ALT="">');
			//	Win1.document.writeln('		</TD>');
			//}
			//Win1.document.writeln('	</TR>');
			//Win1.document.writeln('	<TR>');
			Win1.document.writeln('		<TD ALIGN="CENTER" VALIGN="TOP">');
			Win1.document.writeln('			<IMG SRC="' + parent.TOCFrame.document.images["legendImage"].src + '" width="144" height="446" HSPACE=0 VSPACE=0 BORDER=0 ALT="">');
			Win1.document.writeln('		</TD>');
			Win1.document.writeln('	</TR>');
	
			Win1.document.writeln('</TABLE></CENTER>');
			Win1.document.writeln('</B></FONT>');
		}
		*/
	} else {
		Win1.document.writeln('<td bgcolor="FFFFCC" align="center"><font face="arial" size="-2">' + msgList[64]);
		Win1.document.writeln('</font></td>');
		Win1.document.writeln('</table></center>');
	}
	if ((toolMode==4) || (toolMode==9))  selectCount=0;
	hideRetrieveData();
	
	Win1.document.writeln('<div align="center"><form name="buttonForm">');
	Win1.document.writeln('<br><a href="' + imsHost + 'bpdmaps/explain.htm" target="_blank" name="definitions" id="btnDefinitions"><font face="arial" size="-2" color="black">Click for crime definitions...</font></a><br>');
	Win1.document.writeln('<br><input type="button" name="close" id="btnClose" value="Close" onClick="window.close();"></input>');
	Win1.document.writeln('</form></div></body></html>');
	Win1.document.close();
	Win1=null;
}

function parseHyperLink(theReply) {
	//alert(theReply);
	var fList="";
	var lpos1 = 1;
	var lpos2 = 1;
	var pos = 0;
	var startpos = 0;
	var endpos = 0;
	var fString = theReply.substring(startpos,endpos);
	var featureCount = justGetFeatureCount(theReply);
	var linkString = "width=" + hyperlinkWindowWidth + ",height=" + hyperlinkWindowHeight + ",scrollbars=yes,resizable=yes"
	var selectedData="";
	var fCount = featureCount;
	//alert("displayAttributeData()[featurecount=" + featureCount + "]");
	selectCount = 0;
	var tempString="";
	if (featureCount > 0) {
		var searchStr = currentHyperLinkField + "=";
		
		newSelectCount += 1;

		endpos = 1;
		pos = theReply.indexOf(searchStr,1);
		startpos = pos + searchStr.length + 1;
		endpos =theReply.indexOf(dQuote,startpos);
		inData = theReply.substring(startpos,endpos);
		var theLinkURL = currentHyperLinkPrefix + inData + currentHyperLinkSuffix;
		if (parent.TextFrame!=null) {
			parent.TextFrame.document.open();
			parent.TextFrame.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
			parent.TextFrame.document.writeln('	<title>' + titleList[9] + 's</title>');
			parent.TextFrame.document.writeln('</head>');
			parent.TextFrame.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
			parent.TextFrame.document.writeln('<FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
			parent.TextFrame.document.writeln('<br>' + msgList[67] + theLinkURL );
			parent.TextFrame.document.writeln('</FONT>');
			parent.TextFrame.document.writeln('</body></html>');
			parent.TextFrame.document.close();
		}
		var Win1=open(theLinkURL,"",linkString);
	} else {
	
		//alert(tempString);
		if (parent.TextFrame!=null) {
			parent.TextFrame.document.open();
			parent.TextFrame.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
			parent.TextFrame.document.writeln('	<title>' + titleList[9] + '</title>');
			parent.TextFrame.document.writeln('</head>');
			parent.TextFrame.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
			parent.TextFrame.document.writeln('<FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
			parent.TextFrame.document.writeln('<br>' + msgList[68]);
			if (debugOn>0) {
				parent.TextFrame.document.writeln('<p>' + msgList[65] + '<br>');
				parent.TextFrame.document.writeln(untag(theReply));
			}
			parent.TextFrame.document.writeln('</FONT>');
			parent.TextFrame.document.writeln('</body></html>');
			parent.TextFrame.document.close();
		} else {
			var msg = msgList[69];
			if (debugOn>0) {
				msg = msg + msgList[9] + theReply;
			}
			alert(msg);
		}
	}
	hideRetrieveData();
}

// are there any selected features?
function checkSelected() {
	var isOk = false;
	if (selectCount>0) isOk = true;
	return isOk;
}

function checkHyperLinkLayer(layerIndex) {
	var canLink = false;
	//alert(hyperLinkLayers.length);
	for (var i=0; i<hyperLinkLayers.length; i++) {
			if (LayerName[layerIndex]==hyperLinkLayers[i]) {
				canLink=true;
				currentHyperLinkLayer=LayerName[layerIndex];
				currentHyperLinkField=hyperLinkFields[i];
				currentHyperLinkPrefix=hyperLinkPrefix[i];
				currentHyperLinkSuffix=hyperLinkSuffix[i];
			}
	}
	return canLink;

}

// check to see if active layer is in scale threshold and visible 
	// so it can be used for querying
function checkIfActiveLayerAvailable() {
	// is the current scale within the scale min and max?
	if ((mapScaleFactor>=LayerMinScale[ActiveLayerIndex]) && (mapScaleFactor<=LayerMaxScale[ActiveLayerIndex])) {
		// is the active layer visible?
		if (LayerVisible[ActiveLayerIndex]==1) {
			return true;
		
		} else {
			var msg = msgList[104] + LayerName[ActiveLayerIndex] + msgList[102] + LayerName[ActiveLayerIndex] + msgList[108];
			
			// START - FRANK
			//alert(msg); // original code
			//return false; // original code
			return true;
			// END - FRANK
		}
	} else {
		var msg = msgList[104] + LayerName[ActiveLayerIndex] + msgList[101];
		//if ((!listAllLayers) && (hasTOC)) msg += msgList[103];
		alert(msg);
		return false;
	}
}


/**************************************************************
*	functions and variables for Identify All
*	drill down through visible layers
**************************************************************/

var replyArray = new Array();
var fID = 0;
var fIndex = 0;
var idEast;
var idWest;
var idSouth;
var idNorth;


// identify feature
function identifyAll(e) {
	fID = 0;
	highlightedOne="";
	var theX = mouseX;
	var theY = mouseY;
	getMapXY(theX,theY);
	searchTolerance = (xDistance/iWidth) * pixelTolerance;
	var tempWest = mapX - searchTolerance;
	var tempNorth = mapY + searchTolerance;
	var tempEast = mapX + searchTolerance;
	var tempSouth = mapY - searchTolerance;
	idSouth = tempSouth;
	idNorth = tempNorth;
	idWest = tempWest;
	idEast = tempEast;
	replyArray.length=0;
	var j =-1;
	for (var i=(LayerID.length-1);i>=0;i--) {
		replyArray[i]="";
		if ((mapScaleFactor>=LayerMinScale[i]) && (mapScaleFactor<=LayerMaxScale[i]) && (LayerVisible[i]) && (LayerIsFeature[i])) j = i;

	}
	if (j>-1) {
		fID=j;
		var theString = writeGetFeaturesDrill(tempWest,tempSouth,tempEast,tempNorth,fID);
		//if (useTextFrame) parent.TextFrame.document.location = "text.htm";
		//alert(theString);
		showRetrieveData();
		sendToServer(imsQueryURL,theString,10);
	} else {
		alert(msgList[111]);
	}
}


function doIdentifyAll(theReply) {
    //drill tool loop sequence
	//alert(theReply);
   replyArray[fID] = theReply;
   fID++;
   if (fID < (LayerID.length)) {
   		if ((mapScaleFactor>=LayerMinScale[fID]) && (mapScaleFactor<=LayerMaxScale[fID]) && (LayerVisible[fID]) && (LayerIsFeature[fID])) {
      		theString = writeGetFeaturesDrill(idWest,idSouth,idEast,idNorth,fID);
			//alert(theString);
	  		sendToServer(imsQueryURL,theString,10);
	   	} else {
			doIdentifyAll("");
		}
   }
   
   if (fID == (LayerID.length)) {
	//createDrillPage = false;
	//replyArray.reverse();
	displayAttributeDataforDrill(replyArray);
	fID = 0;
	//var ActiveLayerIndex = 4;
   }
 }  //end doDrill()


 // write XML to identify features for drill ID
function writeGetFeaturesDrill(west1,south1,east1,north1,thefID) {
	if (swapSelectFields) {
		selectFields=selFieldList[thefID];
	}
	var useString = writeIdentifyXML(LayerID[thefID],LayerType[thefID],selectFields,west1,south1,east1,north1,maxFeaturesReturned,useLimitExtent);
	hightlightedOne="";
	return useString;
}

// parse XML response for drill functions
function displayAttributeDataforDrill(theReplyArray) {
   showRetrieveData();
	var theFrame = "parent.MapFrame";
	if ((useExternalWindow) || (!useTextFrame)) {
			var Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
			theFrame = "opener";
			if (parent.MapFrame!=null) theFrame = "opener.parent.MapFrame";
	} else {
			var Win1 = parent.TextFrame;
			Win1.document.open();
	}
	Win1.document.open();
	Win1.document.writeln('<html><head><title>Query/Selection Results</title></head>');
	Win1.document.writeln('<body bgcolor="' + textFrameBackColor + '" text="Black" link="Blue" vlink="Gray" LEFTMARGIN=0 onload="window.focus()"><center>');
	var lyrCount = 0;
	 for (b=0;b<theReplyArray.length;b++) {
	 	if (theReplyArray[b]!="") {
		    //alert(theReply);
			theReply = theReplyArray[b];
			setLayerFields(b);
			var theError = getXMLErrorMessage(theReply);
			var fList="";
			var lpos1 = 1;
			var lpos2 = 1;
			var epos = 1;
			var spos = 1;
			var morePoints=true;
			var moreFeatures=true;
			var featureCount = justGetFeatureCount(theReply);
			//alert(featureCount);
			var pos = 0;
			var startpos = 0;
			var endpos = xmlEndPos;
			var stillMore = false
			pos = theReply.indexOf('hasmore="true"',endpos);
			if (pos!=-1) stillMore = true;
			pos=0;
			var tempCount = 0;
			var selectedData="";
			var inData="";
			var xStr="";
			var yStr="";
			var fCount = featureCount;
			//alert("displayAttributeData()[featurecount=" + featureCount + "]");
			selectCount = 0;
			var tempString="";
			if (featureCount > 0) {
				//alert(featureCount);
				newSelectCount += 1;
				endpos = 1;
				Win1.document.writeln('<center><br><FONT FACE="Arial" SIZE="-1"><b>' + LayerName[b] + '</b><br>');
				Win1.document.writeln('<table border="1" size="95%" cellspacing="0" cellpadding="2" nowrap bgcolor="' + tableBackColor + '">');						
				for (var i=0;i<fCount;i++) {
		
					inData = parseRecordString(theReply, endpos);
					endpos = xmlEndPos;
					//selectedData = clearLeadingSpace(inData);
					selectedData = inData;
					
					epos = theReply.indexOf("</FEATURE",endpos);
					if (showSelectedData) {
						//alert("2\n" + selectedData);
						var showHyper = false;
						if (hyperLinkLayers!=null) {
							for (var s1=0;s1<hyperLinkLayers.length;s1++) {
								if (hyperLinkLayers[s1] == LayerName[b]) showHyper=true;
							}
						}
							
						var fName1 = getFieldNames(selectedData);
						var fValue1 = getFieldValues(selectedData);
						//selectPoints[selectCount] = getIdValue(fName1, fValue1);
						var idFieldNum = -1;
						var shapeFieldNum = -1;
						if (hideIDFieldData) {
							// hide ID column header
							for (var f=0;f<fName1.length;f++) {
								if (fName1[f]==LayerIDField[ActiveLayerIndex]) idFieldNum = f;
							}
						}
						if (hideShapeFieldData) {
							// hide Shape column header
							for (var f=0;f<fName1.length;f++) {
								if (fName1[f]==LayerShapeField[ActiveLayerIndex]) shapeFieldNum = f;
							}
						}
						if (selectCount==0) {
							Win1.document.write('<tr><th><FONT FACE="Arial" SIZE="-2">Rec</FONT></a></th>');
							for (var f=0;f<fName1.length;f++) {
								if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
									var f2 = -1;
									if (useFieldAlias) {
										for (var f3=0;f3<AliasFieldName.length;f3++) {
											if (AliasFieldName[f3]==fName1[f]) f2 = f3;
										}
									}
									if (f2!=-1) {
										Win1.document.write('<th><FONT FACE="Arial" SIZE="-2">' + AliasFieldAlias[f2] + '</FONT></a></th>');
									} else {
										Win1.document.write('<th><FONT FACE="Arial" SIZE="-2">' + fName1[f] + '</FONT></a></th>');
									}
								}
							}
							Win1.document.writeln('</tr>');
						}
						Win1.document.write('<tr><td>');
						Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + (selectCount+queryStartRecord) + '</FONT>');
						Win1.document.writeln('</td>');
						for (var f=0;f<fName1.length;f++) {	
							if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
								Win1.document.write('<TD>');
								var isHyper=false;
								if (showHyper) {
									for (var s1=0;s1<hyperLinkFields.length;s1++) {
										if (hyperLinkFields[s1]==fName1[f]) {
											Win1.document.write('<a href="' + fValue1[f] + '" target="_blank">');
											isHyper=true;
										}
									}
								}
								var s2 = -1;
								for (var s1=0;s1<LayerFields.length;s1++) {
									if (fName1[f]==LayerFields[s1]) s2=s1;
								}
								if (LayerFieldType[s2]=="91") {
									//alert(fName1[f]);
									if (isNaN(fValue1[f])) {
										var theDate = fValue1[f];
									} else {
										//var theDate = new Date(parseInt(fValue1[f]));
										var theDateObj = new Date(parseFloat(fValue1[f]));
										var d = theDateObj.toUTCString();
										var theDate = d.replace(/GMT|UTC/,"");
									}
									Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + theDate + '</FONT>');
									theDate=null;
								} else {
									Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + fValue1[f] + '</FONT>');
								}
								if (isHyper) Win1.document.write('</a>');
								Win1.document.writeln('</td>');
							}
						}
						Win1.document.writeln('</tr>');
						fName1 = null;
						fValue1 = null;
					}
					selectCount += 1;
					//					
				}
				Win1.document.writeln('</table></center>');
				lyrCount++

			} else {
				if (listAllLayersInIDAll) {
		        	Win1.document.writeln('<center><FONT FACE="Arial" SIZE="-1"><b>' + LayerName[b] + '</b>');
					Win1.document.writeln('<br>' + msgList[64] + '<br><br></font></center>');
		     	}

			}
	  	}
	  }//end for 
	  
	  if (lyrCount==0) {
        	Win1.document.writeln('<center><FONT FACE="Arial" SIZE="-1"><b>' + msgList[112] + '</b></font></center>');
	  }
 
    Win1.document.writeln('</body></html>');
    Win1.document.close();
    Win1=null;
    hideRetrieveData();
} //end function


// checks if any layer has hyperlink at location and links to first one matching
function hyperLinkAny(e) {
	if (hyperLinkLayers.length>0) {
		var j = -1;
		fIndex = 0;
		for (var i=layerCount-1;i>-1;i--) {
			
			if ((mapScaleFactor>=LayerMinScale[i]) && (mapScaleFactor<=LayerMaxScale[i]) && (LayerVisible[i]==1)) {
				fIindex = -1;
				for (var k = hyperLinkLayers.length-1;k>-1;k--) {
					if (hyperLinkLayers[k]==LayerName[i]) {
						fIndex = k;
						j = i;
					}
				}
			}

		}
		if (j>-1) {
			fID = j;
			highlightedOne="";
			var theX = mouseX;
			var theY = mouseY;
			getMapXY(theX,theY);
			searchTolerance = (xDistance/iWidth) * pixelTolerance;
			var west1 = mapX - searchTolerance;
			var north1 = mapY + searchTolerance;
			var east1 = mapX + searchTolerance;
			var south1 = mapY - searchTolerance;
			idSouth = south1;
			idNorth = north1;
			idWest = west1;
			idEast = east1;
			var tempSwap = swapSelectFields;
			swapSelectFields=false;
			var tempSelect = selectFields;
			selectFields = LayerIDField[fID] + " " + LayerShapeField[fID] + " " + hyperLinkFields[fIndex];
			var theString = writeIdentifyXML(LayerID[fID],LayerType[fID],selectFields,west1,south1,east1,north1,maxFeaturesReturned,useLimitExtent);

			selectFields = tempSelect;
			swapSelectFields=tempSwap;
			showRetrieveData();
			//if (useTextFrame) parent.TextFrame.document.location = "text.htm";
			sendToServer(imsQueryURL,theString,16);
			
		} else {
			alert(msgList[114]);
		}
	} else {
		alert(msgList[115]);
	}
}

function parseHyperLinkAny(theReply) {
	//alert(theReply);
	var fList="";
	var lpos1 = 1;
	var lpos2 = 1;
	var pos = 0;
	var startpos = 0;
	var endpos = 0;
	var fString = theReply.substring(startpos,endpos);
	var featureCount = justGetFeatureCount(theReply);
	var linkString = "width=" + hyperlinkWindowWidth + ",height=" + hyperlinkWindowHeight + ",scrollbars=yes,resizable=yes"
	var selectedData="";
	var fCount = featureCount;
	//alert("displayAttributeData()[featurecount=" + featureCount + "]");
	selectCount = 0;
	var tempString="";
	if (featureCount > 0) {
		var searchStr = hyperLinkFields[fIndex] + "=";
		
		newSelectCount += 1;

		endpos = 1;
		pos = theReply.indexOf(searchStr,1);
		startpos = pos + searchStr.length + 1;
		endpos =theReply.indexOf(dQuote,startpos);
		inData = theReply.substring(startpos,endpos);
		var theLinkURL = hyperLinkPrefix[fIndex] + inData + hyperLinkSuffix[fIndex];
		if (parent.TextFrame!=null) {
			parent.TextFrame.document.open();
			parent.TextFrame.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
			parent.TextFrame.document.writeln('	<title>' + titleList[9] + 's</title>');
			parent.TextFrame.document.writeln('</head>');
			parent.TextFrame.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
			parent.TextFrame.document.writeln('<FONT FACE="Arial"><B>' + LayerName[fID] +'</B></font><FONT FACE="Arial" size="-2">');
			parent.TextFrame.document.writeln('<br>' + msgList[67] + theLinkURL );
			parent.TextFrame.document.writeln('</FONT>');
			parent.TextFrame.document.writeln('</body></html>');
			parent.TextFrame.document.close();
		}
		var Win1=open(theLinkURL,"",linkString);
	} else if (fID<layerCount) {
			fID++;
			var j = -1;
			if ((mapScaleFactor>=LayerMinScale[fID]) && (mapScaleFactor<=LayerMaxScale[fID]) && (LayerVisible[fID]==1)) {
				fIindex = -1;
				for (var k = hyperLinkLayers.length-1;k>-1;k--) {
					if (hyperLinkLayers[k]==LayerName[fID]) {
						fIndex = k;
						j = fID;
					}
				}
			}
			if (j>-1) {
				var tempSwap = swapSelectFields;
				swapSelectFields=false;
				var tempSelect = selectFields;
				selectFields = LayerIDField[fID] + " " + LayerShapeField[fID] + " " + hyperLinkFields[fIndex];
				var theString = writeIdentifyXML(LayerID[fID],LayerType[fID],selectFields,idWest,idSouth,idEast,idNorth,maxFeaturesReturned,useLimitExtent);
	
				selectFields = tempSelect;
				swapSelectFields=tempSwap;
				showRetrieveData();
				//if (useTextFrame) parent.TextFrame.document.location = "text.htm";
				sendToServer(imsQueryURL,theString,16);
			} else {
				parseHyperLinkAny("");
			}
	

	} else {
	
		//alert(tempString);
		if (parent.TextFrame!=null) {
			parent.TextFrame.document.open();
			parent.TextFrame.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
			parent.TextFrame.document.writeln('	<title>' + titleList[9] + '</title>');
			parent.TextFrame.document.writeln('</head>');
			parent.TextFrame.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
			parent.TextFrame.document.writeln('<FONT FACE="Arial" size="-1">');
			//parent.TextFrame.document.writeln('<B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
			parent.TextFrame.document.writeln('<br>' + msgList[116]);
			/*
			if (debugOn>0) {
				parent.TextFrame.document.writeln('<p>' + msgList[65] + '<br>');
				parent.TextFrame.document.writeln(untag(theReply));
			}
			*/
			parent.TextFrame.document.writeln('</FONT>');
			parent.TextFrame.document.writeln('</body></html>');
			parent.TextFrame.document.close();
		} else {
			var msg = msgList[69];
			if (debugOn>0) {
				msg = msg + msgList[9] + theReply;
			}
			alert(msg);
		}
	}
	hideRetrieveData();
}

