// aimsGeocode.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
*/

aimsGeocodePresent=true;
var gotParcels = false;
var usingSearchName = false;
var selSearchName;
var usingSearchPPN = false;
var selSearchPPN;
var GCLayers = new Array();
var GCLayerId = new Array();
var GCLayerStyle = new Array();
var GCActiveLayer=0;
var GCidCount=0;
var GCid = new Array();
var GClabel = new Array();
var GCdesc = new Array();
var GCvalue = new Array();
var GCpointX = new Array();
var GCpointY = new Array();
var GCpointCount = 0;
var GCscore = new Array();
var GCaddress = new Array();

var GCLayerCount=0;

var geocodeType = "";		//keep track of the layer being geocoded: used to alter symbol drawn on screen after match.

if (imsGeocodeURL=="") {
	imsGeocodeURL= imsURL + "&CustomService=Geocode";
}

/*
***************************************************************************************

Geocoding functions 

***************************************************************************************
*/

// set up geocode
function setupGeocode() {
		showRetrieveData();
		getGeocodeParams();	
}

// get a list of geocoding layers
function getGeocodeLayers() {
	var theString = '<?xml version="1.0" encoding="UTF-8"?><ARCXML VERSION="1.1">\n<REQUEST>\n<GET_SERVICE_INFO />\n';
	theString += '</REQUEST>\n</ARCXML>';
	sendToServer(imsGeocodeURL,theString,20);
	
}

// get the parameters for geocoding the layer
function getGeocodeParams() {
	var theString = '<?xml version="1.0" encoding="UTF-8"?><ARCXML VERSION="1.1">\n<REQUEST>\n<GET_SERVICE_INFO />\n';
	theString += '</REQUEST>\n</ARCXML>';
	var theReply="";
	sendToServer(imsGeocodeURL,theString,26);

}

// write out the geocode XML request
function writeGeocodeXML() {
	showRetrieveData();
	minGeocodeScore = 20;
	var theString = '<?xml version="1.0" encoding="UTF-8"?><ARCXML VERSION="1.1">\n<REQUEST>\n<GET_GEOCODE maxcandidates="' + maxGeocodeCandidates + '" minscore="' + minGeocodeScore + '">\n';
	theString += '<LAYER id="' + GCLayerId[GCActiveLayer] + '" />';
	geocodeType = GCLayerId[GCActiveLayer];
	theString += '<ADDRESS>\n';
	for (var i=0;i<GCidCount;i++) {
		theString += '<GCTAG id="' + GCid[i] + '" value="' + GCvalue[i] + '"/>\n';
	}
	theString += '</ADDRESS>\n</GET_GEOCODE>\n</REQUEST>\n</ARCXML>\n';
	//alert(theString);
	return theString;
	
}

// parse out geocoding layers
function parseGeocodeLayers(theReply) {
	//alert(theReply);
	var pos = 0;
	var startpos = 0;
	var endpos = 0;
	var lpos = 0;
	GCLayers.length=1;
	GCLayerCount=0;
	pos = theReply.indexOf("<LAYERINFO",endpos);
		
	while (pos!=-1) {
		lpos = theReply.indexOf('name=',pos);
		if (lpos!=-1) {
			//skip any layer not containing "extension"
			var nextpos = pos + 11;
			var nextLayer = theReply.indexOf("</LAYERINFO",nextpos);
			var extension = theReply.indexOf("<GCSTYLE",nextpos);
			//alert("extension:"+extension+" /// nextLayer:"+nextLayer);
			if ((extension <= nextLayer) && (extension != -1)) {	
				startpos = lpos + 6;
				endpos = theReply.indexOf(dQuote,startpos);
				GCLayers[GCLayerCount] = theReply.substring(startpos,endpos);
				if (GCLayers[GCLayerCount] == "Parcel Geocoding") gotParcels = true;
				startpos = theReply.indexOf('id=',endpos);
				if (startpos!=-1) {
					startpos += 4;
					endpos = theReply.indexOf(dQuote,startpos);
					GCLayerId[GCLayerCount] = theReply.substring(startpos,endpos);
				}
				startpos = theReply.indexOf("<GCSTYLE name=",endpos);
				if (startpos!=-1) {
					startpos += 15;
					endpos = theReply.indexOf(dQuote,startpos);
					GCLayerStyle[GCLayerCount] = theReply.substring(startpos,endpos);
					GCLayerCount=GCLayerCount+1;
				}
			} else {
				endpos = pos + 11;
			}
			pos = theReply.indexOf("<LAYERINFO",endpos);

		} else {
			// bypass this for now
			//alert(theReply);
			pos =-1;
		}
	}
	if (gotParcels) {
		//not sure we want this in transpo site
		//if (isPublic == false) {
		//	GCLayers[GCLayerCount] = "Searching by Name";
		//	GCLayerCount = GCLayerCount + 1;
		//}
		//GCLayers[GCLayerCount] = "Searching by PPN";
		//GCLayerCount = GCLayerCount + 1;
	}
	hideRetrieveData();
}

// parse out the basic geocode parameters for the layer
function parseGeocodeParams(theReply,theLayer) {
	//alert(theLayer + "\n" + theReply);
	if ((theLayer != "Parcel Geocoding") && (theLayer!= "Street Centerlines")) theLayer = "Street Geocoding";
	var pos = 0;
	var startpos = 0;
	var endpos = 0;
	var lpos = 0;
	GCid.length=0;
	GClabel.length=0;
	GCdesc.length=0;
	GCidCount=0;
	var theName = 'name="' + theLayer + '"'
	//alert(theName);
	pos = theReply.indexOf(theName,endpos);
	
	if (pos!=-1) {
		//alert(theName + " at " + pos);
		startpos = pos + 17;
		lpos = theReply.indexOf("</LAYERINFO>",startpos);
		startpos = theReply.indexOf("<GCINPUT id=",startpos);
		while ((startpos<lpos) && (startpos!=-1)) {
			
			//if ((startpos<lpos) && (startpos!=-1)){
				//alert(startpos);
				startpos += 13;
				endpos = theReply.indexOf(dQuote,startpos); 
				GCid[GCidCount] = theReply.substring(startpos,endpos);
				startpos = theReply.indexOf("label=",endpos);
				startpos = startpos + 7;
				endpos = theReply.indexOf(dQuote,startpos); 
				GClabel[GCidCount] = theReply.substring(startpos,endpos);
				startpos = theReply.indexOf("description=",endpos);
				startpos += 13;
				endpos = theReply.indexOf(dQuote,startpos); 
				GCdesc[GCidCount] = theReply.substring(startpos,endpos);
				GCidCount=GCidCount+1;
			//}
			startpos = theReply.indexOf("<GCINPUT id=",endpos);
		}
		hideRetrieveData();
		return true;
	} else {
		hideRetrieveData();
		return false;
	}
}

// parse out geocode response and display results in table
function parseGeocodeResults(theReply) {
	//alert(theReply);
	hideRetrieveData();
	GCscore.length=1;
	var pos = theReply.indexOf("<GCCOUNT count=");
	var lpos = 0;
	var startpos = pos + 16;
	var startpos2=0;
	var endpos = theReply.indexOf(dQuote,startpos);
	var fString = theReply.substring(startpos,endpos);
	GCpointCount=parseInt(fString);
	var gcCount=0;
	//alert(GCpointCount);
	if (GCpointCount>0) {
		pos = theReply.indexOf("<FEATURE");
		if (pos!=-1) {
			while (pos!=-1) {
				lpos = theReply.indexOf("<FIELD",pos);
				if (lpos!=-1) {
					//while (lpos!=-1) {
						startpos2 = theReply.indexOf('name="SCORE"',lpos);
						startpos = theReply.indexOf("FIELDVALUE valuestring=",startpos2);
						startpos = startpos + 24;
						endpos = theReply.indexOf(dQuote,startpos);
						GCscore[gcCount] = theReply.substring(startpos,endpos);
						startpos2 = theReply.indexOf('name="ADDRESSFOUND"',lpos);
						startpos = theReply.indexOf("FIELDVALUE valuestring=",startpos2);
						startpos = startpos + 24;
						endpos = theReply.indexOf(dQuote,startpos);
						GCaddress[gcCount] = theReply.substring(startpos,endpos);
						startpos2 = theReply.indexOf('name="SHAPEFIELD"',lpos);
						startpos = theReply.indexOf("<POINT x=",startpos2);
						startpos += 10;
						endpos = theReply.indexOf(dQuote,startpos);
						GCpointX[gcCount] = theReply.substring(startpos,endpos);
						startpos = theReply.indexOf("y=",endpos);
						startpos = startpos + 3;
						endpos = theReply.indexOf(dQuote,startpos);
						GCpointY[gcCount] = theReply.substring(startpos,endpos);
						gcCount++;
					//	lpos = theReply.indexOf("<FIELD",endpos);
					//}
				}
				pos = theReply.indexOf("<FEATURE",endpos);
			}
		}
		showGeocode=true;
		geocodeX=GCpointX[0];
		geocodeY=GCpointY[0];
		geocodeLabel=GCaddress[0];
			

		//} else {
		var Win1;
		if (((toolMode == 19) && (GCpointCount > 1)) || ((toolMode != 7) && (GCpointCount > 0))) {
			var theFrame = "parent.MapFrame";
			if ((useExternalWindow) || (!useTextFrame)) {
				Win1 = window.open("","QueryWindow","width=200,height=200,scrollbars=yes,resizable=yes");
				Win1.resizeTo(300,200);
				theFrame = "opener";
				if (parent.MapFrame!=null) theFrame = "opener.parent.MapFrame";
			} else {
				Win1 = parent.TextFrame;
				Win1.document.open();

			}



			Win1.document.open();
			Win1.document.writeln('<html><head><title>Address Match Candidates</title>');
			Win1.document.writeln('<script language="javascript">');
			Win1.document.writeln('var t;');
			Win1.document.writeln('var par;');
			Win1.document.writeln(' if (opener) {  ');
			Win1.document.writeln(' 	if (opener.name=="MapFrame") {  ');
			Win1.document.writeln(' 		t = opener.parent.MapFrame;  ');
			Win1.document.writeln('			par = opener.parent;  ');
			Win1.document.writeln(' 	} else {  ');
			Win1.document.writeln('	        	t = opener; ');
			Win1.document.writeln('			par = opener;  ');
			Win1.document.writeln('		}  ');
			Win1.document.writeln(' } else {  ');
			Win1.document.writeln('		if (parent.MapFrame) {  ');
			Win1.document.writeln('			t = parent.MapFrame;  ');
			Win1.document.writeln('			par = parent;  ');
			Win1.document.writeln('		} else {  ');
			Win1.document.writeln('			t=document;  ');
			Win1.document.writeln('		}  ');
			Win1.document.writeln('	}  ');
			Win1.document.writeln('	function loadHelp(){  ');
			Win1.document.writeln('     var Win2;  ');
			Win1.document.writeln('	    Win2 = window.open("http://'+hostName+'/website/transportation/helpGeocodeResults.htm","Help","width=800,height=550,scrollbars=yes,resizable=yes");  ');
			Win1.document.writeln('	    Win2 = null;  ');
			Win1.document.writeln('	}   ');		
			Win1.document.writeln('</script></head>');
			Win1.document.writeln('<body bgcolor=#003366 text=#003366 link="Blue" vlink="Blue" LEFTMARGIN=0 onload="window.focus();" onunload="t.clearSelection();"><center>');
			Win1.document.writeln('<FONT COLOR="White" FACE="Arial" SIZE="2"><b>');
			if (toolMode == 19) Win1.document.writeln('Possible Matches');
			else Win1.document.writeln('Locate Results');
			Win1.document.writeln('</b>');
			if (toolMode == 19) {
				Win1.document.writeln('<br><FONT COLOR="White" FACE="Arial" SIZE="-1"><b>');
				Win1.document.writeln('Click the number of the address you are looking for');
				Win1.document.writeln('</b>');
			}
			if (isPublic) Win1.document.write('&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://" + hostName + "/website/transportation/images/buttonnarr_help.gif" width=20 height=20 hspace=1 vspace=1 border=0 alt="Help" name="help" onmousedown="loadHelp()">');
			Win1.document.writeln('<table border="1" cellspacing="0" cellpadding="2" nowrap bgcolor=#CCCC99>');
			Win1.document.writeln('<tr><th><FONT FACE="Arial" SIZE="-1" color="#003366">#</font></th><th><FONT FACE="Arial" SIZE="-1" color="#003366">Address</font></th><th><FONT FACE="Arial" SIZE="-1" color="#003366">Score</th></tr>');
			for (var i=0;i<GCpointCount;i++) {
				Win1.document.writeln('<tr>');
				Win1.document.writeln('<td><FONT FACE="Arial" SIZE="-1"><a href="javascript:' + theFrame + '.zoomToPoint(' + GCpointX[i] + ',' + GCpointY[i] + ',true,\'' + GCaddress[i] + '\')">' + (i+1) + '</a></font></td>');
				Win1.document.writeln('<td><FONT FACE="Arial" SIZE="-1" color="#003366">' + GCaddress[i] + '</font></td>');
				Win1.document.writeln('<td><FONT FACE="Arial" SIZE="-1" color="#003366">' + GCscore[i] + '</font></td>');
				Win1.document.writeln('</tr>');
			}
			Win1.document.writeln('</table></form>');
			if ((GCpointCount > 1) && (toolMode != 7)) {
				Win1.document.writeln('<font color="#FFFFFF">Click on any number to view that feature on the map</font>');
			}
			if (toolMode == 35) {
				Win1.document.writeln('<br><br><input type="button" onclick="t.clickFunction(\'geocode\');" value="Locate Another Address" style="font-size: xx-small; font-weight: bold; color: #000000; background: #CCCC99;"></form>');
			}
			if (toolMode == 14) {
				Win1.document.writeln('<br><br><input type="button" onclick="t.clickFunction(\'busfind\');" value="Locate Another Bus Stop/Route" style="font-size: xx-small; font-weight: bold; color: #000000; background: #CCCC99;"></form>');
			}
			if (isPublic) {
				Win1.document.writeln('<input type="button" onclick="t.clearSelection()" value="Remove Address Label" style="font-size: xx-small; font-weight: bold; color: #000000; background: #CCCC99;">');
			}
			Win1.document.writeln('</center>')
			Win1.document.close();
		}
		//if (GCpointCount==1) sendMapXML();
        	var gcptx = parseFloat(GCpointX[0]);
	 	var gcpty = parseFloat(GCpointY[0]);
		if (GCpointCount==1) {
			//Win1.close();
			zoomToPoint(gcptx, gcpty, true, geocodeLabel);
		}
		Win1=null;
	} else {
		//no match
		alert("No matching address found");
		if (useTextFrame) parent.TextFrame.location=appDir + "addmatch.htm";
	}
	
}

