// 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 hyperlinkWindowWidth=500;
var hyperlinkWindowHeight=400;

// variable for search tolerance... dynamically set in app
var searchTolerance=0.01;
// starting record position for returned records
var queryStartRecord=0;

if (imsQueryURL=="") {
	imsQueryURL= imsURL + "&CustomService=Query";
}
var canQuery=true;
var newSelectCount=0;
var selectPoints = new Array();


/*
***************************************************************************************

Identify functions

***************************************************************************************
*/

// identify feature
function identify(e) {
	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);
	showRetrieveData();
	sendToServer(imsQueryURL,theString,identifyXMLMode);
}

// write out XML request to identify features
function writeGetFeatures(west1,south1,east1,north1) {
	if (swapSelectFields) {
		selectFields=selFieldList[ActiveLayerIndex];
	}
	var useString = writeIdentifyXML(ActiveLayer,ActiveLayerType,selectFields,west1,south1,east1,north1,useLimitExtent);
	hightlightedOne="";
	return useString;
}

function writeIdentifyXML(theLayer,theLayerType,theFields,leftX,bottomY,rightX,topY,hasLimit) {
	var theString = '<ARCXML version="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" envelope="false" geometry="false">\n';
	theString += '<LAYER id="' + theLayer + '" />';
	theString += '<SPATIALQUERY subfields="' + theFields + '">';
	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) {
	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 eNorth="";
	var eSouth="";
	var eWest="";
	var eEast="";
	var fCount = featureCount;
	selectCount = 0;
	var tempString="";
	var Win1 = parent.TextFrame;
	var theFrame = "parent.MapFrame";

	var intersection_flag = false;

	if(parent.MapFrame.ActiveLayerIndex == parent.MapFrame.LotLayerIndex){
		LotIDArray.length = 0;
	}

	if (featureCount > 0) {
		newSelectCount += 1;

		if (showSelectedData) {
			if ((useExternalWindow) || (!useTextFrame)) {
				Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
				theFrame = "opener";
				if (parent.MapFrame!=null) theFrame = "opener.parent.MapFrame";
			} else if(useTextFrame){
				Win1.document.open();
			}
			Win1.document.writeln('<html><head><title>Query/Selection Results 1</title>');
			Win1.document.writeln('<link rel=stylesheet type="text/css" href="'+asp_path+'bby_styles.css"></head>');
			if(ActiveLayerIndex == parent.MapFrame.StreetIntersectionLayerIndex){
			   Win1.document.writeln('<body bgcolor="' + textFrameBackColor + '" text="Black" link="Blue" vlink="Gray" LEFTMARGIN=0 onload="window.focus();parent.MapFrame.displayIntersection();">');
			} else {
			   Win1.document.writeln('<body bgcolor="' + textFrameBackColor + '" text="Black" link="Blue" vlink="Gray" LEFTMARGIN=0 onload="window.focus();" >');
			}
			Win1.document.writeln('<center><table border="0" cellspacing="1"><td class="sidesmallbold" align="middle">' + LayerName[ActiveLayerIndex] + ' Attribute(s)</td></table>');
			Win1.document.writeln('<table border="0" cellspacing="1" cellpadding="1" nowrap bgcolor="' + tableBackColor + '">');
		}
		endpos = 1;

		for (var i=0;i<fCount;i++) {
			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;
			}
			inData = parseRecordString(theReply, endpos);
			endpos = xmlEndPos;
			selectedData = clearLeadingSpace(inData);

			epos = theReply.indexOf("</FEATURE",endpos);
			if (showSelectedData) {
				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);

				if (selectCount==0) {
					Win1.document.write('<tr bgcolor="#ACB18E"><th class="sidesmallbold">REC</a></th>');
					for (var f=0;f<fName1.length-2;f++) {
						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 class="sidesmallbold">' + AliasFieldAlias[f2] + '</a></th>');
							
							if(AliasFieldAlias[f2] == 'INTERSECTION CODE'){
							  intersection_flag = true;
							  alert("Intersection Code");
							}
						} else {
							Win1.document.write('<th class="sidesmallbold">' + fName1[f] + '</a></th>');
						}
					}
					Win1.document.writeln('</tr>');
				}
				Win1.document.write('<tr bgcolor="#ACB18E"><td>');
				if (toolMode!=4) Win1.document.write('<a href="javascript:' + theFrame + '.showHighlight(' + selectCount + ')">');
				Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + (selectCount+queryStartRecord+1) + '</FONT>');
				if (toolMode!=4) Win1.document.write('</a>');
				Win1.document.writeln('</td>');
				for (var f=0;f<fName1.length-2;f++) {
					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") {
						if (isNaN(fValue1[f])) {
							var theDate = fValue1[f];
						} else {
							var theDateObj = new Date(parseFloat(fValue1[f]));
							var theDate = theDateObj.toGMTString();
						}
						Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + theDate + '</FONT>');
						theDate=null;
					} else if((intersection_flag)&&(f == 0)){
					    Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + fValue1[f] + "</FONT><SCRIPT language=javascript>var inter_name"+selectCount+"='" + fValue1[f] + "';</script>");

					} else {
						Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + fValue1[f] + '</FONT>');
						// edit Chris Macleod INFORM April 19,2001 get the LotID's for mailing labels
						if((parent.MapFrame.ActiveLayerIndex == parent.MapFrame.LotLayerIndex)&&(f == 0)){
							LotIDArray[i] = fValue1[f];
						}

					}
					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>');
			if (toolMode!=25) {
				if (queryStartRecord>0) {
					var prevRecord = queryStartRecord - maxFeaturesReturned;
					if (prevRecord<0) prevRecord=0;
					Win1.document.write('<a href="javascript:' + theFrame + '.getMoreData(' + prevRecord + ')">Previous ' + maxFeaturesReturned + ' Records</a>&nbsp;&nbsp;&nbsp;');
				}
				if (stillMore) {
					var nextRecord=featureCount + queryStartRecord;
					Win1.document.writeln('<a href="javascript:' + theFrame + '.getMoreData(' + nextRecord + ')">More Records</a>');
				}
			}
			Win1.document.writeln('</font></center></body></html>');
			Win1.document.close();
		}
		if ((queryStartRecord==0) && (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") {
				  // TMR - May 18, 2001 - I want a tighter zoom for Monuments
				  if (ActiveLayerIndex == MonumentLayerIndex) {
					mWMargin = fullWidth * CustomPointMargin;
					mHMargin = fullHeight * CustomPointMargin;
				  }
				  else{
				    mWMargin = fullWidth * selectPointMargin;
					mHMargin = fullHeight * selectPointMargin;
				  }
					if (mWMargin > xDistance/2) {
						mWMargin = xDistance/2;
						mHMargin = yDistance/2;
					}
				} else {
					if (ActiveLayerIndex == LotLayerIndex) {
						mWMargin = fWidth * addressSelectMargin;
						mHMargin = fHeight * addressSelectMargin;
					}
					else{
					mWMargin = fWidth * selectMargin;
					mHMargin = fHeight * selectMargin;
					}
				}
				saveLastExtent();

				left = selectLeft[0] - mWMargin;
				right = selectRight[0] + mWMargin;
				top = selectTop[0] + mHMargin;
				bottom = selectBottom[0] - mHMargin;
			
				sendMapXML();
			} else // custom code to zoom to max envelope of selected records - Chris Macleod INFORM Aug 9/02
			if ((selectCount>1)&&(zoomToMultiple)){	
				zoomToReturnedRecords();	// calls function in aimsSelect
			}
				
		}

	} else {
		if ((useExternalWindow) || (!useTextFrame)) {
			Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
		} else if(useTextFrame){
			Win1 = parent.TextFrame;
			Win1.document.open();
		}
		Win1.document.writeln('<html><head>');
		Win1.document.writeln('	<title>Select Results</title>');
		Win1.document.writeln('</head>');
		Win1.document.writeln('<body BGCOLOR="#E2F1F1" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
		Win1.document.writeln('<div align=center><FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
		Win1.document.writeln('<br>No Features Found.');
		if (debugOn>0) {
			Win1.document.writeln('<p>Returned ArcXML Response:<br>');
			Win1.document.writeln(untag(theReply));
		} else {
			if (theError!="") {
				Win1.document.writeln('<p>Server returned:<br>');
				Win1.document.writeln(theError);
			}
		}
		Win1.document.writeln('</FONT></div>');
		Win1.document.writeln('</body></html>');
		Win1.document.close();

	}
	if ((toolMode==4) || (toolMode==9))  selectCount=0;
	Win1=null;

	useTextFrame = true;
	hideRetrieveData();
}

// are there any selected features?
function checkSelected() {
	var isOk = false;
	if (selectCount>0) isOk = true;
	return isOk;
}

// Redisplay selected features using highlight colour -- (T.Richard June 22 - 2001)
function hiLiteData(theReply) {
	var theError = getXMLErrorMessage(theReply);
	var featureCount = justGetFeatureCount(theReply);
	var endpos = xmlEndPos;
	var selectedData="";
	var fCount = featureCount;
	selectCount = 0;
	var theFrame = "parent.MapFrame";

	if (featureCount > 0) {
		newSelectCount += 1;
		endpos = 1;

      for (var i=0;i<fCount;i++) {
		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;
			}
			if (showSelectedData) {

				var fName1 = getFieldNames(selectedData);
				var fValue1 = getFieldValues(selectedData);
				selectPoints[selectCount] = getIdValue(fName1, fValue1);

			}
			selectCount += 1;

		}
		if ((queryStartRecord==0) && (toolMode!=4) && (toolMode!=9) && (toolMode!=25)) sendMapXML();

	}
}

