// aimsIdentify.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*		dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js, aimsMap.js,
*		aimsLayers.js, aimsDHTML.js
*		aimsClick.js, aimsNavigation.js
*/

aimsIdentifyPresent=true;

//user-added
var frmQuery = parent.parent.frames["query"];

// 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";
	//alert(imsQueryURL);
}
var canQuery=true;
var newSelectCount=0;

//try to move the declaration to ArcIMSParams.js
var selectPoints = new Array();

var selectFids = new Array();



/*
***************************************************************************************

Identify functions 

***************************************************************************************
*/

// identify feature
function identify(e) 
{
       var frmQuery = parent.parent.frames["query"];
       
       if (parseInt(frmQuery.getFeatureClass())==99)
       {
	   alert("請先選擇主題!");
	   //alert(ActiveLayerIndex);
	   return false;
       }
       
	//Commented out by user
	//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);
	//alert(theString);
	showRetrieveData();
	sendToServer(imsQueryURL,theString,identifyXMLMode);
}

// hyperlink from feature
function hyperLink(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 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();
	sendToServer(imsQueryURL,theString,hyperlinkXMLMode);
}

// write out XML request to identify features
function writeGetFeatures(west1,south1,east1,north1) {
	if (swapSelectFields) {
		selectFields=selFieldList[ActiveLayerIndex];
	}
	//Commented out by user
	//var useString = writeIdentifyXML(ActiveLayer,ActiveLayerType,selectFields,west1,south1,east1,north1,useLimitExtent);
	var useString = writeIdentifyXML(ActiveLayerID,ActiveLayerType,aField.toUpperCase(),west1,south1,east1,north1,useLimitExtent);
	//hightlightedOne="";
	return useString;
}

function writeIdentifyXML(theLayer,theLayerType,theFields,leftX,bottomY,rightX,topY,hasLimit) {
	//Commented out by user
	//var theString = '<ARCXML VERSION="1.0.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" envelope="false" geometry="false">\n';
	var theString = '<ARCXML VERSION="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" envelope="true" geometry="false">\n';
	theString += '<LAYER id="' + theLayer + '" ftype="' + theLayerType + '" />';
	theString += '<SPATIALQUERY subfields="' + theFields + '">';
	//Commented out by user
	theString += '<SPATIALFILTER relation="area_intersection" >';
	//theString += '<SPATIALFILTER relation="envelope_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 : " + theReply);
}*/

function displaySelectShapeData(theFidList,selectbypoly)
{
  var frmQuery = parent.parent.frames["query"];
 
  //alert(frmQuery.name);
  frmQuery.setSearchType(2);
  frmQuery.setFeatureVal(theFidList);
  frmQuery.doAttrFrmQuerySubmit(selectbypoly);
  hideRetrieveData(); 
}

function displayIdentifyData(theReply)
{
  
  //alert("displayIdentifyData: " + theReply);
	
  var featureCount = justGetFeatureCount(theReply);
  
  if (featureCount > 0) 
  {
      var frmQuery = parent.parent.frames["query"];  
      var searchStr = aField.toUpperCase() + "="; 
	
      endpos = 1;
      pos = theReply.indexOf(searchStr,1);
      startpos = pos + searchStr.length + 1;
      endpos =theReply.indexOf(dQuote,startpos);
      inData = theReply.substring(startpos,endpos);
      
      frmQuery.doIdentifyFrmQuerySubmit(inData);
  }
  else { alert("找不到任何地物!") } 
  hideRetrieveData();  
}


function displayBufferedData(theReply) 
{
	
	//alert("displayAttributeData: " + theReply);
	
	var featureCount = justGetFeatureCount(theReply);
	var endpos = xmlEndPos;
	var inData = "";
	var selectedData = "";
	
	//User-Added Parameters
	var theFidList = "";
	var theFClass = "";
	
	//alert("FeatureCount : " + featureCount);
	//selectCount = 0;
	//selectFids.length = 0;
	if (featureCount > 0) 
	{
	    //aimsSelectPresent = true;
	    //showSelectedFeatures = true;
		
	    endpos = 1;
	    xmlEndPos = 0;
	    for (var i=0;i<featureCount;i++) 
	    {
	        //var theXYs = getEnvelopeXYs(theReply, endpos);
			
		//alert(theXYs);
		//selectLeft[selectCount] = theXYs[0];
		//selectBottom[selectCount] = theXYs[1];
		//selectRight[selectCount] = theXYs[2];
		//selectTop[selectCount] = theXYs[3];
		endpos = xmlEndPos;
		//alert(selectLeft[selectCount] + "," + selectBottom[selectCount] + "," + selectRight[selectCount] + "," + selectTop[selectCount]);
			
			
		//epos = theReply.indexOf("</FEATURE",endpos);
		inData = parseRecordString(theReply, endpos);
		//alert(i + "," + endpos + "," + inData);
			
		//xmlEndPos varies inside parseRecordString.
		endpos = xmlEndPos;
		selectedData = clearLeadingSpace(inData);
			
		var fName1  = getFieldNames(selectedData);
		var fValue1 = getFieldValues(selectedData);
		//alert(i + "," + fName1 + "," + getIdValue(fName1, fValue1));
		//selectPoints[selectCount] = getIdValue(fName1, fValue1);
		
		//user-added lines
		var aFid = getFIdValue(fName1,fValue1);
		//selectFids[aFid] = selectCount;
		theFidList = theFidList + aFid + ",";
		
		if (i==0) theFClass = getFClassValue(fName1,fValue1);
		//alert("aFid : " + aFid + "," + selectFids[aFid]);
		
		selectCount += 1;
	    }
		
	}
	//else 
	//{
	 	 //aimsSelectPresent = false;
		 //showSelectedFeatures = true;
	//}
	//sendMapXML();
	//if ( (toolMode == 10) || (toolMode == 16))
	//{
           theFidList = theFidList.substring(0,theFidList.length-1);
           theFidList = theFidList.replace(/[,]/g,"','");
           //displaySelectShapeData(theFidList);
        //}
	//hideRetrieveData();
	//alert(theFidList + "," + theFClass);
}


function displayAttributeData(theReply) 
{
	
	
	var frmQuery = parent.parent.frames["query"];
	
	//alert("displayAttributeData: " + theReply);
	
	var featureCount = justGetFeatureCount(theReply);
	var endpos = xmlEndPos;
	var inData = "";
	var selectedData = "";
	
	//User-Added Parameters
	var theFidList = "";
	
	//alert("FeatureCount : " + featureCount);
	selectCount = 0;
	selectFids.length = 0;
	if (featureCount > 0) 
	{
	    aimsSelectPresent = true;
	    showSelectedFeatures = true;
		
	    endpos = 1;
	    xmlEndPos = 0;
	    for (var i=0;i<featureCount;i++) 
	    {
	        var theXYs = getEnvelopeXYs(theReply, endpos);
			
		//alert(theXYs);
		selectLeft[selectCount] = theXYs[0];
		selectBottom[selectCount] = theXYs[1];
		selectRight[selectCount] = theXYs[2];
		selectTop[selectCount] = theXYs[3];
		endpos = xmlEndPos;
		//alert(selectLeft[selectCount] + "," + selectBottom[selectCount] + "," + selectRight[selectCount] + "," + selectTop[selectCount]);
			
			
		epos = theReply.indexOf("</FEATURE",endpos);
		inData = parseRecordString(theReply, endpos);
		//alert(i + "," + endpos + "," + inData);
			
		endpos = xmlEndPos;
		selectedData = clearLeadingSpace(inData);
			
		var fName1  = getFieldNames(selectedData);
		var fValue1 = getFieldValues(selectedData);
		//alert(i + "," + fName1 + "," + getIdValue(fName1, fValue1));
		selectPoints[selectCount] = getIdValue(fName1, fValue1);
		
		//user-added lines
		var aFid = getFIdValue(fName1,fValue1);
		selectFids[aFid] = selectCount;
		if ( (toolMode == 10) || (toolMode == 16)) theFidList = theFidList + aFid + ",";
		
		//alert("aFid : " + aFid + "," + selectFids[aFid]);
		
		selectCount += 1;
	    }
		
	}
	else 
	{
	 	 aimsSelectPresent = false;
		 showSelectedFeatures = true;
	}
	//sendMapXML();
	if ( ((toolMode == 10) || (toolMode == 16)) && (parseInt(frmQuery.getSearchType()))==2)
	{
           //alert(toolMode);
           theFidList = theFidList.substring(0,theFidList.length-1);
           theFidList = theFidList.replace(/[,]/g,"','");
           if (toolMode == 16) displaySelectShapeData(theFidList,0);
           else displaySelectShapeData(theFidList,1);
        }
        if (parseInt(frmQuery.getZoomToSelected())>0) zoomToReturnedRecords();
	hideRetrieveData();
}

function parseHyperLink(theReply) {
	//alert("Reply Length: " + theReply.length);
	//alert(theReply);
	//alert("displayAttributeData()[start}");
	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"
	//pos = theReply.indexOf('hasmore="true"',xmlEndPos);
	//pos=0;
	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);
		if (parent.TextFrame!=null) {
			parent.TextFrame.document.open();
			parent.TextFrame.document.writeln('<html><head>');
			parent.TextFrame.document.writeln('	<title>Select Results</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>HyperLink to ' + inData );
			parent.TextFrame.document.writeln('</FONT>');
			parent.TextFrame.document.writeln('</body></html>');
			parent.TextFrame.document.close();
		}
		var Win1=open(inData,"TheLink",linkString);
	} else {
	
		//alert(tempString);
		if (parent.TextFrame!=null) {
			parent.TextFrame.document.open();
			parent.TextFrame.document.writeln('<html><head>');
			parent.TextFrame.document.writeln('	<title>Select Results</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>Unable to hyperlink with submitted request.');
			if (debugOn>0) {
				parent.TextFrame.document.writeln('<p>Returned ArcXML Response:<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 = "Unable to hyperlink.";
			if (debugOn>0) {
				msg = msg + "\nServer ArcXML response:\n" + theReply;
			}
			alert(msg);
		}
	}
	hideRetrieveData();
}

// are there any selected features?
function checkSelected() {
	var isOk = false;
	if (selectCount>0) isOk = true;
	return isOk;
}

// clear out leading spaces in field value list
function clearLeadingSpace(inText) {
	var pos=9;
	while (pos != -1) {
		pos = inText.indexOf('=" ');
		if (pos!=-1) {
			var lastpos = inText.length;
			var midend = pos + 2;
			var midstart = pos + 3;
			var leftSide = inText.substring(0,midend);
			var rightSide = inText.substring(midstart,lastpos);
			inText = leftSide + rightSide;
		}
	}
	return inText;
}

/*// replace < and > in string with ?and ?to allow display in html page
function untag(inputString) {
	var outString = inputString.replace(/</g,"?);
	outString = outString.replace(/>/g, "?);
	return outString;
}*/

// replace single quotes with double single quotes
//	set up interior single qoutes and apostrophes for queries
function fixSingleQuotes(inputString) {
	var outString = inputString.replace(/'/g, "''");
	return outString;
}


// parse out record data from XML stream
function parseRecordString(theReply, startpos) {
	var inData = "";
	var pos = theReply.indexOf("<FIELDS ",startpos);
	if (pos!=-1) {
		startpos = pos + 8;
		xmlEndPos = theReply.indexOf('" />',startpos);
		inData = theReply.substring(startpos,xmlEndPos);
	}
	//alert(inData);
	return inData;
}

// get a list of field names from the returned record
function getFieldNames(recordString) {
	var theStuff = new String(recordString);				
	var theList = theStuff.split('" ');
	var fName1 = new Array();
	for (var f=0;f<theList.length;f++) {
		var v = theList[f].split('="');
		fName1[f] = v[0];
	}
	return fName1;

}

// get a list field values from the returned record
function getFieldValues(recordString) {
	var theStuff = new String(recordString);				
	var theList = theStuff.split('" ');
	var fValue1 = new Array();
	for (var f=0;f<theList.length;f++) {
		var v = theList[f].split('="');
		if ((v[1]=="") || (v[1]==null)) v[1] = "&nbsp;";
		if (v[0]==LayerShapeField[ActiveLayerIndex]) v[1]="[" + ActiveLayerType + "]";
		fValue1[f] = v[1];
	}
	return fValue1;

}

// just get the field value from the lists of fieldnames and fieldvalues
function getIdValue(fieldNameArray, fieldValueArray) {
	var theValue = 0;
	for (var f=0;f<fieldNameArray.length;f++) {
		if (fieldNameArray[f]==LayerIDField[ActiveLayerIndex]) {
			theValue = fieldValueArray[f];
		} 
	}
	return theValue;

}


// an user-added function to get FID
function getFClassValue(fieldNameArray, fieldValueArray) {
	var theValue = 0;
	for (var f=0;f<fieldNameArray.length;f++) {
		//alert("getFIdValue():fieldNameArray[f]: " +fieldNameArray[f]);
		if (fieldNameArray[f]=="FCLASS") {
			theValue = fieldValueArray[f];
		} 
	}
	return theValue;

}

// an user-added function to get FID
function getFIdValue(fieldNameArray, fieldValueArray) {
	var theValue = 0;
	for (var f=0;f<fieldNameArray.length;f++) {
		//alert("getFIdValue():fieldNameArray[f]: " +fieldNameArray[f]);
		if (fieldNameArray[f]==aField.toUpperCase()) {
			theValue = fieldValueArray[f];
		} 
	}
	return theValue;

}

// just get the interior string from the theReply between preString and postString
//		starting from startpos
function justGetValue(theReply,preString,postString,startpos) {
	var theValue = "";
	var pos = theReply.indexOf(preString,startpos);
	if (pos!=-1) {
		pos = pos + preString.length;
		var endpos = theReply.indexOf(postString,(pos));
		if (endpos!=-1) {
			theValue = theReply.substring(pos,endpos);
			xmlEndPos = endpos;
		}
	}
	return theValue;	
}

// get one field value from theReply starting from startpos
function justGetFieldValue(theReply,theField,startpos) {
	var preString = theField + '="';
	var returnString = justGetValue(theReply, preString, dQuote, startpos);
	return returnString;
}

// get the number of features returned in xml response
function justGetFeatureCount(theReply) {
	var theCount = 0;
	var pos = theReply.indexOf("<FEATURECOUNT");
	if (pos!=-1) {
		var theValue = justGetValue(theReply,'count="',dQuote,pos);
		//alert(theValue);
		theCount = parseInt(theValue);	
	}
	return theCount;
}

// get all the field values and return a list
function getAllFieldValues(theReply,theField,recCount) {
	var vList = new Array();
	xmlEndPos = 0;
	for (var i=0;i<recCount;i++) {
		vList[i] = parseFloat(justGetFieldValue(theReply,theField,xmlEndPos));
	}
	return vList;
}

// reset order to numeric
function numberorder(a,b) { return a - b; }

