// extended db javascript template for ArcIMS HTML Viewer
// aimsDBhighlightedOne.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
*/

// global variables
var aimsDBPresent = true;

var theDBFrame = parent.DBFrame.document;
var dbLinkLayer = "Parcels";
var dbLinkLayerID = "9";
// Update the dbLinkLayerIndex whenever adding or removing map layers in the AXL
// mikedixon@concordengineering.com
var dbLinkLayerIndex = 9;
ActiveLayerIndex = dbLinkLayerIndex;
var dbQueryString = "";
var dbIdString = "";
var dbIdValue = "";
var dbNumValue = "";
var dbStreetValue = "";
var dbOwnerValue = "";
var dbDisplayValue = "";

// NEW OPIS CODE
var HighlightString = "";
// END NEW OPIS CODE

// set the active layer parameters to the dbLinkLayer
function matchDBLinkLayer(layerName) {
	var j = -1;
	for (var i=0;i<layerCount;i++) {
		if (LayerName[i]==layerName) j = i;
	}
	if (j>-1) {
		dbLinkLayerIndex = j
		dbLinkLayerID = LayerID[dbLinkLayerIndex];
		dbLinkLayer = LayerName[dbLinkLayerIndex];
		ActiveLayerIndex = dbLinkLayerIndex;
		ActiveLayer = dbLinkLayerID;
	}
}

// db Identify - external db access
//	XMLMode=70... response will be sent to parseIDFieldData()
function dbIdentify(e) {
//alert("dbidentify");
	highlightedOne="";
	var theX = mouseX;
	var theY = mouseY;
	getMapXY(theX,theY);
	searchTolerance = (xDistance/iWidth) * pixelTolerance;
	//alert(xDistance + "/" + iWidth + "/" + pixelTolerance + "/" + searchTolerance);
	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,70);
        

}

// get the attribute values from the identify XML response
// 	then send request to external db access server
// 	and request for map highlighting feature
function parseIDFieldData(theReply) {
	//alert("mytest" + theReply);
	var fList="";
	var iList="";
	var fieldPair = "";
	var fieldString = mapIDField + "=";
	var idString = LayerIDField[dbLinkLayerIndex] + "=";
	//alert(fieldString);
	//alert(idString);
	var qpos = 0;
	var pos = theReply.indexOf("<FEATURECOUNT count=");
	var startpos = pos + 21;
	var endpos = theReply.indexOf(dQuote,startpos);
	var tempString = theReply.substring(startpos,endpos);
	//alert(tempString);
	var featureCount = parseInt(tempString);
	if (featureCount > 0) {
		endpos = 1;
                //mikedixon@concordengineering.com
                //original for statment modified to limit returned identify results to 1
                // alert(featureCount);
		//for (var i=0;i<featureCount;i++) {
                for (var i=0;i<1;i++) {
			var startpos2 = theReply.indexOf("<FIELDS ",endpos);
			pos = startpos2 + 8;
			qpos = fieldString.length + 1;
			startpos =theReply.indexOf(fieldString,pos);
			startpos = startpos + qpos
			endpos = theReply.indexOf(dQuote,startpos);
			tempString = theReply.substring(startpos,endpos);
			//alert(tempString)
			//shapefile data was missing the leading "0" in the PIN so the line below adds it
			//comment out if SDE data PIN is in different format
			//mikedixon@concordengineering.com
                        
                        if (tempString=="COMMON AREA"){
                           tempString=tempString;
                           }
                        else {
			tempString="0"+tempString
                        }

			if (addIDQuotes) {
				tempString = '"' + tempString + '"';
			//} else {
			//	tempString = mapIDField + " = " + tempString;
			}
			if (i>0) tempString = "," + tempString;
			fList = fList + tempString;
			//alert(fList);
			parent.MapFrame.thePIN=fList;
			pos = startpos2 + 8;
			qpos = idString.length + 1;
			startpos =theReply.indexOf(idString,pos);
			startpos = startpos + qpos
			endpos = theReply.indexOf(dQuote,startpos);
			tempString = theReply.substring(startpos,endpos);
			//tempString = LayerIDField[dbLinkLayerIndex] + " = " + tempString;
			if (i>0) tempString = "," + tempString;
			iList = iList + tempString;
			//alert(iList);
			
		}
		//alert(fList);
		//if (dbAccessType == "VB") {
		
			var featureString = "select " + dbFieldList + " from " + dbTableList + " where " + dbIDField + " IN (" + fList + ") order by " + dbIDField;
		//} else if ((dbAccessType == "ASP") || (dbAccessType == "ColdFusion")) {
		//	var featureString = fList;
		//} else {
		//	var featureString = "";
		//}
		
		writeDBResponsePage(featureString);
		if (highlightIdentify) {
			//alert(iList);
// testing  highlightedOne=dbIDField + " IN (" + fList + ")";
                        //highlightedOne=LayerIDField[dbLinkLayerIndex] + " IN (" + iList + ")";
			//mikedixon@concordengineering.com
                        //replaced sendMapXML() call with getDBQuery() so that map will zoom to id results onclick
                        //sendMapXML();
                        getDBQuery(fList);
                        
                          }
	} else {
		tempString = ActiveLayer + ":\n" + dbList[0];
		//alert(tempString);
		var Win1;
		if ((useExternalWindow) || (!useTextFrame)) {
			Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
		} else {
			Win1 = parent.TextFrame.document;
			Win1.open();
		}
		Win1.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
		Win1.writeln('	<title>' + dbList[1] + '</title>');
		Win1.writeln('</head>');
		Win1.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
		Win1.writeln('<FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] + '</B></font><FONT FACE="Arial" size="-2">');
		Win1.writeln('<br>' + dbList[2] + '</FONT>');
		Win1.writeln('</body></html>');
		Win1.close();
	}
	hideRetrieveData();
	
}

function getDBQuery(value) {
	var queryString = "";
	/*
	if (dbIDFieldIsText) {
		queryString = mapIDField + ' = "' + value + '"';
		dbIdString = dbIDField + ' = "' + value + '"';
	} else {
		queryString = mapIDField + " = " + value;
		dbIdString = dbIDField + " = " + value;
	}
	*/
	//the leading character is stripped from the db PIN to match the shapefile PIN
	//this may have to be omitted when switching to SDE data
	//mikedixon@concordengineering.com
               
        if (value == "COMMON AREA") {
            //replace with your server url
            //mikedixon@concordengineering.com
            parent.TextFrame.document.location="http://"+hostName+"/website/opis/nodata.htm"
            parent.MapFrame.sendMapXML();
             
        }
        else {
        value = value.substring(1,value.length);
        queryString = mapIDField + " IN ('" + value + "')";
	setQueryString=  queryString ;
// NEW OPIS CODE
        HighlightString =  queryString;
// END NEW OPIS CODE
	hideRetrieveData();
	var theString = getDBEnvelope(queryString);

	sendDBXMLRequest(theString, 3001)
       }
}

function getDBQuery2(value1,value2) {
	// for vb implementation
	var queryString = "";
	/*
	if (dbIDFieldIsText) {
		queryString = mapIDField + ' = "' + value + '"';
		dbIdString = dbIDField + ' = "' + value + '"';
	} else {
		queryString = mapIDField + " = " + value;
		dbIdString = dbIDField + " = " + value;
	}
	*/
	queryString = mapIDField + " IN (" + value1 + ")";
	setQueryString=  queryString ;
	dbQueryString = dbIDField + " IN (" + value1 + ") AND " + dbDisplayField + " = '" + value2 + "'";
	dbQueryString = "select " + dbFieldList + " from " + dbTableList + " where " + dbQueryString + " order by " + dbIDField;
	hideRetrieveData();
	var theString = getDBEnvelope(queryString);
	sendDBXMLRequest(theString, 3001)
}



// create the ArcXML query request with feature id
//	used to match external db record to feature. . .
// 	envelope will parsed from response
function getDBEnvelope(queryString) {
	var theFields = LayerIDField[dbLinkLayerIndex] + " " + LayerShapeField[dbLinkLayerIndex];
	
	var theString = '<ARCXML VERSION="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="false" envelope="true"';
	theString += ' compact="true" featurelimit="' + maxFeaturesReturned + '" beginrecord="' + queryStartRecord + '">\n';
	theString += '<LAYER id="' + LayerID[dbLinkLayerIndex] + '" ftype="' + ActiveLayerType + '" />';
	if (useLimitExtent) {
		// keep this within the limitExtent
		theString += '<SPATIALQUERY subfields="' + theFields + '" where="' + queryString + '" />';
		theString += '<SPATIALFILTER relation="area_intersection">\n';
		theString += '<ENVELOPE maxx="' + limitRight + '" maxy="' + limitTop + '" minx="' + limitLeft + '" miny="' + limitBottom + '" />\n';
		theString += '</SPATIALFILTER>\n';
		theString += '</SPATIALQUERY>\n';
	} else {
	theString += '<QUERY subfields="' + theFields + '" where="' + queryString + '" />';
	}
	theString += '</GET_FEATURES>';
	theString += '</REQUEST>';
	theString += '</ARCXML>';
	//alert("writeQueryXML()\nQuery XML Request:\n" + theString);
	selectLayer=ActiveLayer;
	selectType=ActiveLayerType;
	selectCount=0;
	hightlightedOne="";
	selectPoints.length=1;
	selectLeft.length=1;
	selectRight.length=1;
	selectTop.length=1;
	selectBottom.length=1;
	return theString;

}




// after matching feature to external db record
// 	parse out envelope and send zoom to envelope request.

//THIS IS NEW FOR ZOOMING TO ALL SELECTED POLYS


function parseDBEnvelope(theReply) {

	var theError = getXMLErrorMessage(theReply);
	var featureCount = justGetFeatureCount(theReply);
 



if (featureCount>1) {
   var fstartpos = 0;
   var fstringStart = 0;
   var fstringEnd = 0;
   var theFeatureString = "";

   var selStartPos = 0;
   var selEndPos = 0;
   var tempval = 0;
   var selMinx = 0;
   var selMaxx = 0;
   var selMiny = 0;
   var selMaxy = 0;
	for (var i=0;i<featureCount;i++) {
		fstringStart = theReply.indexOf("<FEATURE>",fstartpos);
                fstringEnd = theReply.indexOf("</FEATURE>",fstartpos);
                theFeatureString = theReply.substring(fstringStart,fstringEnd+10);
                fstartpos = fstringEnd+10;
                theFeatureString = theFeatureString.toUpperCase();

                selStartPos = 0;

		selStartPos = theFeatureString.indexOf("MINX=",selStartPos);
                selStartPos += 6;
		selEndPos = theFeatureString.indexOf(dQuote,selStartPos);
		tempval = theFeatureString.substring(selStartPos,selEndPos);
                if (selMinx == 0) selMinx = tempval;
                if (tempval < selMinx ) selMinx = tempval;

		selStartPos = theFeatureString.indexOf("MINY=",selStartPos);
                selStartPos += 6;
		selEndPos = theFeatureString.indexOf(dQuote,selStartPos);
		tempval = theFeatureString.substring(selStartPos,selEndPos);
                if (selMiny == 0) selMiny = tempval;
                if (tempval < selMiny ) selMiny = tempval;

		selStartPos = theFeatureString.indexOf("MAXX=",selStartPos);
                selStartPos += 6;
		selEndPos = theFeatureString.indexOf(dQuote,selStartPos);
		tempval = theFeatureString.substring(selStartPos,selEndPos);
                if (tempval > selMaxx) selMaxx = tempval;

		selStartPos = theFeatureString.indexOf("MAXY=",selStartPos);
                selStartPos += 6;
		selEndPos = theFeatureString.indexOf(dQuote,selStartPos);
		tempval = theFeatureString.substring(selStartPos,selEndPos);
                if (tempval > selMaxy) selMaxy = tempval;


	}
	selectLeft[0] = parseFloat(setDecimalString(selMinx));
	selectBottom[0] = parseFloat(setDecimalString(selMiny));
	selectRight[0] = parseFloat(setDecimalString(selMaxx));
	selectTop[0] = parseFloat(setDecimalString(selMaxy));
}

if (featureCount==1) {
	var theXYs = getEnvelopeXYs(theReply, 0)
	var endpos = 0;
	selectLeft[0] = theXYs[0];
	selectBottom[0] = theXYs[1];
	selectRight[0] = theXYs[2];
	selectTop[0] = theXYs[3];
}

	endpos = xmlEndPos;
	var inData = parseRecordString(theReply, endpos);
	endpos = xmlEndPos;
	var selectedData = clearLeadingSpace(inData);
	var fName1 = getFieldNames(selectedData);
	var fValue1 = getFieldValues(selectedData);
	selectPoints[0] = getIdValue(fName1, fValue1);




	//begin the mike stuff here
        //This is where the zoom scale is set to 1"=400'
        //mikedixon@concordengineering.com
	// ** Uncommented msize, zval, fwidth, fheight, fpointx, fpointy, mscale in Mike's Stuff.
        var msize;
        var zval = 400;
        //	if ( iHeight < iWidth) {
	//		msize = iHeight
	//} else {
	//		msize = iWidth
	//} 
        var fWidth = selectRight[0] - selectLeft[0];
	var fHeight = selectTop[0] - selectBottom[0];
        var fPointX = selectLeft[0] + fWidth/2
        var fPointY = selectBottom[0] + fHeight/2
 	var mscale= (zval * 12 * ((msize/97.6925)/12)) * .5;
	//eLeft = ((fPointX) - (mscale));
	//eRight =  ((fPointX) + (mscale));
	//eBottom = ((fPointY) - (mscale));
	//eTop =  ((fPointY) + (mscale));
        //end mike stuff here


        //original zoom scale stuff follows
	var mWMargin = 0;
	var mHMargin = 0;
	if (selectType=="point") {
		mWMargin = fullWidth * selectPointMargin;
		mHMargin = fullHeight * selectPointMargin;
	} else {
		mWMargin = fWidth * selectMargin;
		mHMargin = fHeight * selectMargin; 
	}
	saveLastExtent();
	eLeft = selectLeft[0] - mWMargin;
	eRight = selectRight[0] + mWMargin;
	eTop = selectTop[0] + mHMargin;
	eBottom = selectBottom[0] - mHMargin;
        //end original zoom scale stuff



	saveLastExtent();
	legendTemp=legendVisible;
	legendVisible=false;
        highlightedOne = HighlightString;
	sendMapXML();

}





// dynamically write out page with form that automatically submits upon loading. . .
// 	sends request to external vb db access module with sql query
function writeDBResponsePage(featureString) {
	//alert(dbSQLurl);
	var theFrame = "TextFrame";
	if ((useExternalWindow) || (!useTextFrame)) theFrame = "_blank";
	var Win1 = parent.DBFrame.document;
	var startpos = featureString.indexOf("IN (");
	startpos += 4;
	var endpos = featureString.indexOf(")",startpos);
	if (endpos==-1) endpos = featureString.length;
	var flist = featureString.substring(startpos, endpos);
	//alert("Where Clause: " + flist);
	if (dbAccessType == "VB") {
		/*
		Win1.open();
		Win1.writeln('<html><head>');
		Win1.writeln('	<title>Identify Form</title>');
		Win1.writeln('<script language="javascript">');
		Win1.writeln('	function sendForm() {');
		Win1.writeln('		document.forms[0].submit();')
		Win1.writeln('	}');
		Win1.writeln('</script>');
		Win1.writeln('</head>');
		Win1.writeln('<body onload="sendForm()" BGCOLOR="Black" TEXT="Gray" LINK="Gray" VLINK="Gray" ALINK="Gray" topmargin=10>');
		//Win1.writeln('<body BGCOLOR="Black" TEXT="Gray" LINK="Gray" VLINK="Gray" ALINK="Gray">');
		//Win1.writeln('<form action="http://aardvark/servlet/com.esri.esrimap.Esrimap" target="TextFrame">');
		Win1.writeln('<p>&nbsp;<p><form action="' + dbSQLurl + '" target="' + theFrame + '">');
		//Win1.writeln('<INPUT TYPE="submit" NAME="submit" VALUE="Show Data">');
		Win1.writeln('<input type="Hidden" name="Name" value="' + dbSQLservice + '">');
		//Win1.writeln('<input type="Hidden" name="Name" value="SQLsend">');
		Win1.writeln('<input type="Hidden" name="Database" value="' + dbNumber + '">');
		Win1.writeln('<input type="Hidden" name="Connect" value="' + dbConnect + '">');
		Win1.writeln('<input type="Hidden" name="Response" value="1">');
		Win1.writeln('<input type="Hidden" name="Style" value="' + dbStyle + '">');
		Win1.writeln('<input type="text" name="IDValue" value="' + flist + '">');
		Win1.writeln('<textarea name="SQL" cols="30" rows="10">');
		Win1.writeln(featureString);
		Win1.writeln('</textarea>');

		Win1.writeln('</form>');
		Win1.writeln('</body></html>');
		Win1.close();
		*/
		//featureString = featureString + " AND " + dbDisplayField + " = " + dbDisplayValue;
		var f = Win1.forms[0];
		f.action = dbSQLurl;
		f.Database.value = dbDatabase;
		f.Connect.value = dbConnectString;
		f.IDField.value = dbIDField;
		f.SQL.value = featureString;
		f.Response.value = "1";
		f.Style.value = dbStyle;
		f.IDValue.value = flist;
		f.Function.value = "sendValue";
		f.ListDescript.value = dbFieldListDescript;
		f.submit();
		
	} else if ((dbAccessType == "ColdFusion") || (dbAccessType == "ASP"))  {
		theForm = Win1.forms[0];
		//theForm.SQLValue = featureString;
		theForm.IDValue.value = flist;
		theForm.DisplayValue.value = "**None**";
		theForm.submit();

	}
	
	featureString=null;
	Win1 = null;
	
}


// Custom function to send ArcXML requests
//	points response to processDBXML()
function sendDBXMLRequest(XMLRequest, theType) {
	var theFunction = "parent.MapFrame.processDBXML";
	sendCustomToServer(XMLRequest,theFunction, theType)
}

// Custom XML processor for db access
function processDBXML(theReplyIn) {
	theReplyIn = replacePlus(theReplyIn);
	var theReply = unescape(theReplyIn);
	//alert(theReply);
	okToSend = true;
	if (debugOn>2) alert(msgList[13] + theReply);
	if (XMLMode == 3001) {
		//alert("XMLMode=3001");
		// parse out envelope and send zoom to envelope request.
                // alert(theReply);
		parseDBEnvelope(theReply);
	
	}
	if (XMLMode == 3002) {
		alert("XMLMode=3002");
		
	
	}
}
