// extended db javascript template for ArcIMS HTML Viewer
// aimsDB.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; - CAT - seems to be deprecated...
var dbLinkLayer = "Property Lotlines";
var dbLinkLayerID = "0";  		
var dbLinkLayerIndex = 0;  				// The layer index in ArcMap MXD is O based.
var dbQueryString = "";
var dbIdString = "";
var dbIdValue = "";
var dbNumValue = "";
var dbStreetValue = "";
var dbOwnerValue = "";
var dbDisplayValue = "";
matchDBLinkLayer(dbLinkLayer);
// 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];
		dbLinkLayerType = LayerType[dbLinkLayerIndex];
		ActiveLayerIndex = dbLinkLayerIndex;
		ActiveLayer = dbLinkLayerID;		
	}
}

function GetLayerID(layerName){
	var j = -1;
	for (var i=0;i<layerCount;i++) {
		if (LayerName[i]==layerName) j = i;
	}
	return j;
}


// db Identify - external db access
//	XMLMode=70... response will be sent to parseIDFieldData()
function dbIdentify(e) {
     // alert (e);
	dbLinkLayer = "Property Lotlines";
	matchDBLinkLayer(dbLinkLayer);
	if (checkIfActiveLayerAvailable()) {
	//clear any selection and buffering previously made
	showBuffer=false;
    setQueryString = "";
	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 tempWest = mapX;
	var tempNorth = mapY;
	var tempEast = mapX;
	var tempSouth = mapY;
	var theString = writeGetFeatures(tempWest,tempSouth,tempEast,tempNorth);	
	showRetrieveData();
	 //alert (theString);
	sendToServer(imsQueryURL,theString,70);
	 //alert (theString);
	}
}

// db Identify - external db access
//	XMLMode=70... response will be sent to parseIDFieldData()
function dbIdentify2(mmX,mmY) {
     // alert (e);
	dbLinkLayer = "Property Lotlines";
	//Set ActiveLayer Indexes
	matchDBLinkLayer(dbLinkLayer);
	//clear any selection and buffering previously made
	showBuffer=false;
    setQueryString = "";
	highlightedOne="";
	searchTolerance = (xDistance/iWidth) * pixelTolerance;
	var tempWest = mmX;
	var tempNorth = mmY;
	var tempEast = mmX;
	var tempSouth = mmY;
	var theString = writeGetFeatures(tempWest,tempSouth,tempEast,tempNorth);	
	showRetrieveData();
	 //alert (theString);
	sendToServer(imsQueryURL,theString,70);
	 //alert (theString);
}

// 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 (theReply);
 //alert("currentlySelectedFeatureID: " + currentlySelectedFeatureID);
	var fList="";
	var iList="";
	var fieldPair = "";
	var fieldString = mapIDField + "=";
	var idString = LayerIDField[dbLinkLayerIndex] + "=";
	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);
	var featureCount = parseInt(tempString);
	
    //Add selectCount so that buffer knows features are selected.
	selectCount = featureCount;
	
	if (featureCount > 0) {
		endpos = 1;
		var startpos2 = startpos;
		for (var i=0;i<featureCount;i++) {
			
			startpos2 = theReply.indexOf("<FIELDS ",endpos);
			//alert("startpos2: " + startpos2 + "\n" + theReply+ ".indexOf('<FIELDS '," + endpos);
			pos = startpos2 + 8;
			qpos = fieldString.length + 1;
			startpos =theReply.indexOf(fieldString,pos);
			startpos = startpos + qpos
			endpos = theReply.indexOf(dQuote,startpos);
			//alert("endpos: " + endpos + "\n" + theReply + ".indexOf(" + dQuote + ", " + startpos );
			tempString = theReply.substring(startpos,endpos);
			//alert("tempString: " + tempString);
			tempString = '\'' + tempString + '\'';
			if (i>0) tempString = "," + tempString;
			fList = fList + tempString;
			//alert ("fList: " + 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("FID tempString: " + tempString);

			if (currentSelectionState == 0)
           		currentlySelectedFeatureID = fList;
            else if(currentSelectionState == 1) {
            	addIDsToSelectedList (fList);
            } else if(currentSelectionState == 2) {
           		removeIDsFromSelectedList (fList);
        	}
			if ((currentSelectionState == 1) || (currentSelectionState == 2)) {
				selectionMode = 1;
            }		
		}		
		var featureString = "select " + dbFieldList + " from " + dbTableList + " where " + dbIDField + " IN (" + currentlySelectedFeatureID + ") order by " + dbIDField;
		 //alert (featureString)	 
		writeDBResponsePage(featureString);		
		if (highlightIdentify) {
		    if (dbIDFieldIsText) {
			  queryString = mapIDField + " IN (" + currentlySelectedFeatureID + ")";
	        } else {
	          queryString = mapIDField + " IN (" + fList + ")";
	        }   
	        setQueryString = queryString; 
		   //alert ("setQuery: " + setQueryString);
			legendVisible = false;
			sendMapXML();
		}
	} else {
		tempString = ActiveLayer + ":\n" + dbList[0];
		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><CENTER>');
		Win1.writeln('<FONT FACE="Tahoma" SIZE="-1"><B>' + LayerName[ActiveLayerIndex] + '</B></font><FONT FACE="Tahoma" size="-2">');
		Win1.writeln('<br>' + dbList[2] + '</FONT>');
		Win1.writeln('</FONT></body></html>');
		Win1.close();
	}
	hideRetrieveData();
}


function getGeog(value) {
	dbLinkLayer = "Street Centerlines";
	//Set ActiveLayer Indexes
	matchDBLinkLayer(dbLinkLayer);
	var queryString = "";
	/*
	if (dbIDFieldIsText) {
		queryString = mapIDField + ' = "' + value + '"';
		dbIdString = dbIDField + ' = "' + value + '"';
	} else {
		queryString = mapIDField + " = " + value;
		dbIdString = dbIDField + " = " + value;
	}
	*/
	queryString = mapGEOGIDField + " LIKE ('%" + value.toUpperCase() + "%')";
	var theString = '<ARCXML VERSION="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="false" envelope="true"';
	theString += ' compact="true" featurelimit="' + maxFeaturesReturned + '" beginrecord="1">\n';
	theString += '<LAYER id="' + LayerID[dbLinkLayerIndex] + '" ftype="' + ActiveLayerType + '" />';
	theString += '<QUERY subfields="#SHAPE#,NAME" where="' + queryString + '" />';
	theString += '</GET_FEATURES>';
	theString += '</REQUEST>';
	theString += '</ARCXML>';
	selectLayer=ActiveLayer;
	selectType=ActiveLayerType;
	selectCount=0;
	hightlightedOne="";
	selectPoints.length=1;
	selectLeft.length=1;
	selectRight.length=1;
	selectTop.length=1;
	selectBottom.length=1;
	   
	setQueryString = queryString;
	hideRetrieveData();
	//alert (theString);
	sendDBXMLRequest(theString, 3002)
}




function getDBQuery(value) {
	var currentlySelectedFeatureID;
   	showBuffer=false;
	dbLinkLayer = "Parcels";
	/*dbLinkLayerID = "1";
	dbLinkLayerIndex = 17;
	ActiveLayerIndex = dbLinkLayerIndex;
	ActiveLayer = dbLinkLayerIndex;
	*/
	//Set ActiveLayer Indexes
	matchDBLinkLayer(dbLinkLayer);
	var queryString = "";
	/*
	if (dbIDFieldIsText) {
		queryString = mapIDField + ' = "' + value + '"';
		dbIdString = dbIDField + ' = "' + value + '"';
	} else {
		queryString = mapIDField + " = " + value;
		dbIdString = dbIDField + " = " + value;
	}
	*/
	queryString = mapIDField + " IN ('" + value + "')";
	setQueryString = queryString;
	parent.MapFrame.currentlySelectedFeatureID = "'" + value + "'";
	hideRetrieveData();
	var theString = getDBEnvelope(queryString);
	//alert(theString);
	sendDBXMLRequest(theString, 3001)
	
}



function getDBQueryMany(value) {

	//alert (value);

	var currentlySelectedFeatureID;

   	showBuffer=false;

	dbLinkLayer = "Parcels";
	/*dbLinkLayerID = "1";
	dbLinkLayerIndex = 17;
	ActiveLayerIndex = dbLinkLayerIndex;
	ActiveLayer = dbLinkLayerIndex;
	*/
	//Set ActiveLayer Indexes
	matchDBLinkLayer(dbLinkLayer);
	var queryString = "";
	queryString = mapIDField + " IN (" + value + ")";
	setQueryString = queryString;
	parent.MapFrame.currentlySelectedFeatureID = "" + value + "";
	hideRetrieveData();
	var theString = getDBEnvelope(queryString);
	//alert (theString);
	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>';
	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.
function parseDBEnvelope(theReply) {
	//alert (theReply);
	var theError = getXMLErrorMessage(theReply);
	
	var featureCount = justGetFeatureCount(theReply);
	
	if (featureCount == 0){
		alert ("The selected feature(s) cannot be located in the " + LayerName[dbLinkLayerID] + " layer");
		return;
	}else{
		
		if (featureCount > 1) {
		  var theXYs = getFullEnvelopeXYs(theReply, 0)	}
		else {
		  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);	
	
		//bunsongsikult
		if (featureCount > 1) {
			var lstData = parseFullRecordString(theReply);	
			//alert ("lstData");
			//alert (lstData);
			
		} 
	
		endpos = xmlEndPos;
		var selectedData = clearLeadingSpace(inData);
		var fName1 = getFieldNames(selectedData);
		var fValue1 = getFieldValues(selectedData);
		selectPoints[0] = getIdValue(fName1, fValue1);
		
		//bunsongsikult
		if (featureCount > 1) { 
		  //highlight multiple objectid
		  highlightedOne = LayerIDField[ActiveLayerIndex] + " IN (" + lstData + ")";
		} else {
		  highlightedOne = LayerIDField[ActiveLayerIndex] + " IN (" + selectPoints[0] + ")";
		}
		highlightedOne = setQueryString;
		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;
		} else {
			//mWMargin = fWidth * selectMargin;
			//mHMargin = fHeight * selectMargin; 
			mWMargin = fWidth * 0.3;
			mHMargin = fHeight * 0.3;
		}
		saveLastExtent();
		eLeft = selectLeft[0] - mWMargin;
		eRight = selectRight[0] + mWMargin;
		eTop = selectTop[0] + mHMargin;
		eBottom = selectBottom[0] - mHMargin;
		legendTemp=legendVisible;
		//alert("legendVisible=false");
		legendVisible=false;
		layersVisible=false;
		//var featureString = "select " + dbFieldList + " from " + dbTableList + " where " + dbQueryString + " order by " + dbIDField;
		
		/*
		var preString = "";
		var postString = "";
		var newString = "";
		var pos = dbQueryString.indexOf(" order by ");
		if (pos!=-1) {
			preString = dbQueryString.substring(0,pos);
			postString = dbQueryString.substring(pos,dbQueryString.length);
			newString = preString + " and " + dbIdString + postString;
		
		} else {
			newString = dbQueryString + " and " + dbIdString;theString += '<SPATIALQUERY subfields="' + theFields + '">';
		}
		*/
		selectCount = featureCount;	// Added by CAT - to enable the Select by Owner, Address, etc - to actually result in a select.  3262003
		//if (dbAccessType == "VB") writeDBResponsePage(dbQueryString);

		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 (featureString);
 
   
	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);
	if (dbAccessType == "VB") {
	
// pennichuck is not vb
	
	
	
		//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();
		
// Pennichuck go here
		
		
	} else if ((dbAccessType == "ColdFusion") || (dbAccessType == "ASP"))  {
	
		theForm = Win1.forms[0];
		
	
		//theForm.SQLValue = featureString;
		theForm.IDValue.value = currentlySelectedFeatureID;
		theForm.DisplayValue.value = "**None**";
		theForm.submit();
		
		//alert ("Hello Again");

	}

	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);

	okToSend = true;
	
	if (debugOn>2) alert(msgList[13] + theReply);
	
	if (XMLMode == 3001) {
		// parse out envelope and send zoom to envelope request.

		parseDBEnvelope(theReply);
	
	}
	else if (XMLMode == 3002) {
		//first we need to list the unique streets:
		displayUniqueAttributeData(theReply)
		
	
	}
}




