// aimsQuery.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,
*		aimsIdentify.js, aimsSelect.js
*/
aimsQueryPresent=true;

var showSampleValues=false;

var storedQueryCount = 0;

var storedQueryName = new Array();
var storedQueryString = new Array();
var storedQueryLayer = new Array();
var storedQueryVariable = new Array();
var storedQueryVarCount = new Array();
var storedQueryFieldList = new Array();
var storedQueryIndex = 0;


/*
***************************************************************************************

Querying functions 

***************************************************************************************
*/


// query form
function queryForm() {
	//getFields();
	fieldIndex=0;
	showSampleValues=false;
		
		setLayerFields(ActiveLayerIndex);
		if (showSampleValues) {
			var theText = writeFieldSample(LayerFields[fieldIndex]);
			sendToServer(imsQueryURL,theText,40);
		} else {
			writeQueryForm();
		}
		
}

// find Form
function findForm() {
	setLayerFields(ActiveLayerIndex);
		if (useTextFrame) {
			parent.TextFrame.document.location= appDir + "findForm.htm";
		} else {
			Win1 = open(appDir + "findForm.htm","QueryWindow","width=575,height=150,scrollbars=yes,resizable=yes");
		}
}



// process query
function sendQueryString(newString) {
	//if (LayerIDField[ActiveLayerIndex]!="#ID#") {
		newString = fixSingleQuotes(newString);
		newString = swapQuotes(newString);
	//}
	//alert(newString);
	newString = makeXMLsafe(newString);
	setQueryString=newString;
	selectionMode=1;
	selectData.length=1;
	LayerFields.length=1;
	LayerFieldType.length=1;
	LayerFieldCount=0;
	showBuffer=false;
	//a user-added line
	queryStartRecord=0;
	showRetrieveData();
	var theString = writeQueryXML(newString.toUpperCase());
        //alert(theString);
    
	//another user-added line to specify the query server
	//alert("1:--" + imsQueryURL);
	if (imsQueryURL != '')
	{
	    //imsQueryURL = imsURL + "&CustomService=Query";
	    imsQueryURL = 'http://' + webServerName + '/servlet/com.esri.esrimap.Esrimap?ServiceName=' + cImsServer + "&CustomService=Query";
	    //alert("2:--" + imsQueryURL);
	}
	//alert(theString);
	//alert("3:--" + imsQueryURL);
	sendToServer(imsQueryURL,theString,8); 
	
	//sendToServer(imsQueryURL,theString,queryXMLMode);
}

function writeGetBufferedData() {
	var buffString = "";
	bufferSmoothEdges = bufferDistance /1001;
	//alert(selectionMode);
	/*switch(selectionMode) {
		case 1:
			buffString = writeQueryBufferXML();
			break
		case 2:
			buffString = writeEnvelopeBufferXML();
			break
		case 3:
			buffString = writeShapeBufferXML(clickType-1);
			break
		//case 4:
			// buffer a user shape - not implemented
		//	bufferTargetLayerIndex=ActiveLayerIndex;
		//	buffString = writeUserShapeBufferXML(clickType);
		//	break
	}*/
	//alert(buffString);
	buffString = writeQueryBufferXML();	
	return buffString;
}

// write out XML request to query attributes
function writeQueryXML(queryString) {
	
	if (swapSelectFields) {
		selectFields=selFieldList[ActiveLayerIndex];
	}
	
	//User Added--Calculate the layer index 
	//var lidx = (layerCount-1-ActiveLayerIndex);
	//var theString = '<ARCXML VERSION="1.0.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="false" envelope="true"';
	//theString += ' compact="true" featurelimit="' + maxFeaturesReturned + '" beginrecord="' + queryStartRecord + '">\n';
	var theString = '<ARCXML VERSION="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="false" envelope="true"';
	theString += ' compact="true" featurelimit="' + "9999" + '" beginrecord="' + queryStartRecord + '">\n';
	theString += '<LAYER id="' + LayerID[ActiveLayerIndex] + '" ftype="' + ActiveLayerType + '" />';
	if (useLimitExtent) {
		// keep this within the limitExtent
		theString += '<SPATIALQUERY subfields="' + selectFields + '" 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="' + selectFields + " " + aField.toUpperCase() + '" where="' + queryString + '" />';
	theString += '<SPATIALQUERY subfields="' + selectFields + " " + aField.toUpperCase() + '" where="' + queryString + '" />';
	}
	theString += '</GET_FEATURES>';
	theString += '</REQUEST>';
	theString += '</ARCXML>';
	//alert("writeQueryXML()\nQuery XML Request:\n" + theString);
	//User-commented out
	/*selectLayer=ActiveLayer;
	selectType=ActiveLayerType;
	selectCount=0;
	hightlightedOne="";
	selectPoints.length=1;
	selectLeft.length=1;
	selectRight.length=1;
	selectTop.length=1;
	selectBottom.length=1;*/
	return theString;
	
}

// write out XML request to get field value samples
function writeFieldSample2() {
	if (swapSelectFields) {
		selectFields=selFieldList[ActiveLayerIndex];
	}
	var theString = '<ARCXML VERSION="1.0.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="false" envelope="false"';
	theString += ' compact="true">\n';
	theString += '<LAYER id="' + ActiveLayer + '" ftype="' + ActiveLayerType + '" />';
	theString += '<QUERY subfields="' + selectFields + '" where="' + LayerIDField[ActiveLayerIndex] + ' < 101" />';
	theString += '</GET_FEATURES>';
	theString += '</REQUEST>';
	theString += '</ARCXML>';
	//alert(theString);
	selectLayer=ActiveLayer;
	selectType=ActiveLayerType;
	selectCount=0;
	hightlightedOne="";
	selectPoints.length=1;
	selectLeft.length=1;
	selectRight.length=1;
	selectTop.length=1;
	selectBottom.length=1;
	
	//This line is added by the user
	queryStartRecord=0;
	
	return theString;

}

// write out XML request to get field value samples
function writeFieldSample(theField) {
	//var theFields = LayerIDField[ActiveLayerIndex] + " " + theField;
	var theFields = theField;
	var theString = '<ARCXML VERSION="1.0.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="false" envelope="false"';
	theString += ' compact="true" featurelimit="' + numberDataSamples + '">\n';
	theString += '<LAYER id="' + ActiveLayer + '" ftype="' + ActiveLayerType + '" />';
	//theString += '<QUERY subfields="' + theFields + '" where="' + LayerIDField[ActiveLayerIndex] + ' GT 0" />';
	theString += '<QUERY subfields="' + theFields + '" />';
	theString += '</GET_FEATURES>';
	theString += '</REQUEST>';
	theString += '</ARCXML>';
	//alert(theString);
	selectLayer=ActiveLayer;
	selectType=ActiveLayerType;
	selectCount=0;
	hightlightedOne="";
	selectPoints.length=1;
	selectLeft.length=1;
	selectRight.length=1;
	selectTop.length=1;
	selectBottom.length=1;
	//alert(theString);
	return theString;
}
// send find request
function getFind(theValue) {
	//alert(theValue);
	showRetrieveData();
	var theNewQueryString = "";
	var theTempString = "";
	var fieldListString = LayerIDField[ActiveLayerIndex] + " " + LayerShapeField[ActiveLayerIndex];
	var elemCount = 0;
	for (var i=0;i<LayerFields.length;i++) {
		if (LayerFieldType[i].indexOf("12",0)!=-1) {
			theTempString = "(" + LayerFields[i] + " LIKE '%" + theValue + "%')";
			if (elemCount>0) theTempString = " OR " + theTempString;
			if (theNewQueryString.length + theTempString.length < 1024) {
				theNewQueryString = theNewQueryString + theTempString;
				fieldListString = fieldListString + " " + LayerFields[i];
				elemCount += 1;
			}
			
		}
	}
	if (theNewQueryString!="") {
		showBuffer=false;
		theNewQueryString=makeXMLsafe(theNewQueryString);
		setQueryString = theNewQueryString;
		var theString = writeFindRequest(theNewQueryString,fieldListString);
		//alert(theString);
		sendToServer(imsQueryURL,theString,findXMLMode);
	} else {
		alert("Unable to build Query String.");
	}
}

// write out find form
function writeFindRequest(findQuery,fieldList) {
	var theString = '<ARCXML VERSION="1.0.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="false" envelope="true"';
	theString += ' compact="true" featurelimit="' + maxFeaturesReturned + '" beginrecord="' + queryStartRecord + '">\n';
	theString += '<LAYER id="' + ActiveLayer + '" ftype="' + ActiveLayerType + '" />\n';
	if (useLimitExtent) {
		// keep this within the limitExtent
		theString += '<SPATIALQUERY subfields="' + fieldList + '" where="' + findQuery + '" />';
		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="' + fieldList + '" where="' + findQuery + '" />';
	}
	theString += '</GET_FEATURES>\n';
	theString += '</REQUEST>\n';
	theString += '</ARCXML>';
	//alert(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;

}

// rquest  ID & Shape fields
function getQueryFields() {
		var theString = '<ARCXML VERSION="1.0.1">\n<REQUEST>\n<GET_SERVICE_INFO   renderer="false" extensions="false" envelope="false"/>\n';
		theString += '</REQUEST>\n</ARCXML>';
		//alert("function getStartExtent\n" + theString);
		sendToServer(imsQueryURL,theString,50);
		theString=null;
}

// parse out ID & Shape fields. . . if error  flag that service cannot identify or query
function parseQueryFields(theReply) {
	//alert(theReply);
	var fList="";
	LayerIDField.length=1;
	LayerShapeField.length=1;
	var pos = theReply.indexOf("<ERROR");
	if (pos!=-1) {
		canQuery=false;
		window.status ="Cannot query Service\nIdentify, Select, and Query functions are disabled.";
	} else {
		canQuery=true;
		// find ID field (-99)
		var startpos = 0;
		var endpos = 0;
		var lCount = 0;
		var pos = -1;
		var spos = 9;
		var lpos = 9;
		var tempString=""
		var visString = ""
		var testString = "";
		while (lpos > -1) {
			// find the Layer
			lpos = theReply.indexOf("<LAYERINFO ",endpos);
			if (lpos != -1) {
				pos=9;
				endpos = lpos;
				while (pos > -1) {
					spos = theReply.indexOf("</LAYERINFO>",endpos);
					pos = theReply.indexOf("<FIELD name=",endpos);
					if (spos > pos) {
						// still within the servicegroup tag
						if (pos != -1) {
							startpos = pos + 13
							endpos = theReply.indexOf(dQuote, startpos);
							tempString = theReply.substring(startpos,endpos);
							
							startpos = theReply.indexOf("type=",endpos);
							startpos += 6;
							endpos = theReply.indexOf(dQuote, startpos);
							testString = theReply.substring(startpos,endpos);
							if (testString=="-99") LayerIDField[lCount] = tempString;
							if (testString=="-98") LayerShapeField[lCount] = tempString;
							
						}
					}
					else {
						// search for next Layer
						endpos = spos;
						pos = -1;
					}
					
				}
			}
			//alert(lCount + "\n" + LayerName[lCount] + "\n" + LayerIDField[lCount] + "\n" + LayerShapeField[lCount] );
			lCount += 1;
			

		}
	}
	
}

// request list of Fields for Active Layer
function getFields() {
	var theString = '<ARCXML VERSION="1.0.1">\n<REQUEST>\n<GET_SERVICE_INFO />\n';
	theString += '</REQUEST>\n</ARCXML>';
	//if (version.indexOf("MSIE 5")!=-1) { 
	//	sendToServer(imsQueryURL,theString,36);
	//} else {
		sendToServer(imsQueryURL,theString,30);
	//}
	
}

// get list of Fields for Active Layer from response
function parseFieldResponse(theReply) {
	//alert(theReply);
	if (swapSelectFields) {
		selectFields=selFieldList[ActiveLayerIndex];
	}
	var endpos = 1;
	var pos = -1;
	var blurb = 'name="' + ActiveLayer;
	var startpos = theReply.indexOf("<LAYERINFO",1);
	var thePos = 1;
	while (thePos!=-1) {
		startpos = theReply.indexOf("<LAYERINFO",1);
		endpos = theReply.indexOf(">",startpos);
		thePos = theReply.indexOf(blurb,1);
		if (thePos!=-1) {
			pos = thePos;
			thePos=-1;
		} 
	}
	if (pos!=-1) {
		var fieldCount = 0;
		epos = theReply.indexOf("</FCLASS>",pos);
		startpos=0;
		endpos=pos;
		var useIt =-1;
		while ((epos>startpos) && (startpos!=-1)) {
			startpos = theReply.indexOf("<FIELD name=",endpos);
			if (startpos!=-1) {
				startpos += 13;
				endpos = theReply.indexOf(dQuote, startpos);
				blurb = theReply.substring(startpos,endpos);
				//alert(blurb);
				useIt = selectFields.toUpperCase().indexOf(blurb.toUpperCase());
				if ((useIt!=-1) || (selectFields=="#ALL#")) {
					if (blurb.toUpperCase()!=LayerShapeField[ActiveLayerIndex]) {
						LayerFields[fieldCount] = blurb;
						startpos = theReply.indexOf("type=",endpos);
						startpos += 6;
						endpos = theReply.indexOf(dQuote, startpos);
						blurb = theReply.substring(startpos,endpos);
						LayerFieldType[fieldCount] = blurb;
						//alert(LayerFields[fieldCount]);
						fieldCount += 1;
					}
				}
			}
		}
		LayerFieldCount=fieldCount;
		canQuery=true;
		//writeQueryForm();
	} else {
		var msg ="Unable to obtain Field names.\nUnable to query layer.";
		if (debugOn>0) msg = msg + "\nReturned ArcXML Response:\n" + theReply;
		alert(msg);
		canQuery=false;
	}
	blurb=null;
}

// parse layer field value samples
function parseFieldSamples(theReply) {
	//alert("Reply Length: " + theReply.length);
	//alert(theReply);
	var fList="";
	var lpos1 = 1;
	var lpos2 = 1;
	var epos = 1;
	var spos = 1;
	var morePoints=true;
	var moreFeatures=true;
	var pos = 0;
	var startpos = 0;
	var endpos = 0;
	var featureCount = justGetFeatureCount(theReply);
	var tempString="";
	if (featureCount > 0) {
		selectData.length=featureCount;
		for (var i=0;i<featureCount;i++) {
			pos = theReply.indexOf("<FIELDS ",endpos);
			startpos = pos + 8;
			endpos =theReply.indexOf(' />',startpos);
			inData = theReply.substring(startpos,endpos);
			//inData = fixSingleQuotes(inData);
			selectData[i] = clearLeadingSpace(inData);

		}
	} else {
		//alert("Unable to obtain sample values.\nQuery disabled.");
		//canQuery=false;
		selectData.length=0;
	}
	
}

// write out a query form
function writeQueryForm() {
	var startpos = 0;
	var endpos = 0;
	var SampleCount = selectData.length;
	var theIndex = fieldIndex;
	var sampleList = new Array();
	var qField = LayerFields[fieldIndex] + '="';
	var valueTitle = "Value";
	if (showSampleValues) {
		for (var i=0;i<SampleCount;i++) {
			startpos = selectData[i].indexOf(qField,0);
			startpos = startpos + qField.length;
			endpos = selectData[i].indexOf('"',startpos);
			if (LayerFieldType[theIndex].indexOf("12",0)!=-1) {
				var vData = selectData[i].substring(startpos,endpos);
				//vData = fixSingleQuotes(vData);
				sampleList[i] = dQuote + vData + dQuote;
			} else {
				sampleList[i] = selectData[i].substring(startpos,endpos);
			}
		}
		valueTitle = "Sample Values";
	}
	if (useTextFrame) {
		var Win1 = parent.TextFrame;
		Win1.document.open();
		var t = "parent.MapFrame";
		
	} else {
		var Win1 = open("","QueryWindow","width=575,height=150,scrollbars=yes,resizable=yes");
		var t = "opener";
		if (parent.MapFrame!=null) t = "opener.parent.MapFrame";
	}
	
	Win1.document.writeln('<html><HEAD>');
	Win1.document.writeln('			<script language="javascript">');
	//if (useTextFrame) {
	//	Win1.document.writeln('var t = ' + t);
	//} else {
		Win1.document.writeln('var t = ' + t);
		Win1.document.writeln('var dQuote = \'"\';');
	//}
		Win1.document.writeln('			var lastExpr = "";');
		Win1.document.writeln('			var currExpr = "";');
		Win1.document.writeln('			var sampleList = new Array();');
		Win1.document.writeln('			var qField = "";');
		Win1.document.writeln('			function addString() {');
		Win1.document.writeln('				lastExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				qField = document.QueryStuff.QueryField.options[document.QueryStuff.QueryField.selectedIndex].value;');
		Win1.document.writeln('				var qOperator = document.QueryStuff.QueryOperator.options[document.QueryStuff.QueryOperator.selectedIndex].value;');
		if (showSampleValues) {
			Win1.document.writeln('				var qString = document.QueryStuff.QueryValue.options[document.QueryStuff.QueryValue.selectedIndex].text;');
		} else{
			Win1.document.writeln('					var qString = document.QueryStuff.QueryValue.value;');
			Win1.document.writeln('					if (t.LayerFieldType[document.QueryStuff.QueryField.selectedIndex].indexOf("12",0)!=-1) {');
			Win1.document.writeln('						if (qString.indexOf(dQuote)==-1) {');
			Win1.document.writeln('							qString = dQuote + qString + dQuote;');
			Win1.document.writeln('						}');
			Win1.document.writeln('					}');
		}
		Win1.document.writeln('				var qString2 = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				var theString =  qField + " " + qOperator + " " + qString;');
		Win1.document.writeln('				document.QueryStuff.QueryString.value = qString2 + theString;');
		Win1.document.writeln('				currExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('			}');
			
		Win1.document.writeln('			function sendQuery() {');
		Win1.document.writeln('				var theString = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				if (theString!="") {');
		Win1.document.writeln('					sampleList=null;');
		Win1.document.writeln('					t.sendQueryString(theString);');
		Win1.document.writeln('					t=null;');
		Win1.document.writeln('				} else {');
		Win1.document.writeln('					alert("Query expression is blank.\\nNo features have been selected.");');
		Win1.document.writeln('				}');
		//Win1.document.writeln('				if (opener) window.close();');
				
		Win1.document.writeln('			}');
			
		Win1.document.writeln('			function addAnd() {');
		Win1.document.writeln('				lastExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				var qString2 = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				document.QueryStuff.QueryString.value = qString2 + " AND ";');
		Win1.document.writeln('				currExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('			}');
			
		Win1.document.writeln('			function addOr() {');
		Win1.document.writeln('				lastExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				var qString2 = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				document.QueryStuff.QueryString.value = qString2 + " OR ";');
		Win1.document.writeln('				currExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('			}');
	
		Win1.document.writeln('			function addNot() {');
		Win1.document.writeln('				lastExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				var qString2 = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				document.QueryStuff.QueryString.value = qString2 + "NOT ";');
		Win1.document.writeln('				currExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('			}');
			
		Win1.document.writeln('			function addLeftPara() {');
		Win1.document.writeln('				lastExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				var qString2 = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				document.QueryStuff.QueryString.value = qString2 + "(";');
		Win1.document.writeln('				currExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('			}');
	
		Win1.document.writeln('			function addRightPara() {');
		Win1.document.writeln('				lastExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				var qString2 = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				document.QueryStuff.QueryString.value = qString2 + ")";');
		Win1.document.writeln('				currExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('			}');
	
		Win1.document.writeln('			function undoString() {');
		Win1.document.writeln('				currExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				document.QueryStuff.QueryString.value = lastExpr;');
		Win1.document.writeln('				t.setQueryString = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				lastExpr = currExpr;');
		Win1.document.writeln('			}');
			
		Win1.document.writeln('			function clearString() {');
		Win1.document.writeln('				lastExpr = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				document.QueryStuff.QueryString.value = "";	');
		Win1.document.writeln('				t.setQueryString = "";');
		Win1.document.writeln('			}');
			
		Win1.document.writeln('			function setUp() {');
		Win1.document.writeln('				if (t.showSampleValues) {');
		Win1.document.writeln('					t.fieldIndex = document.QueryStuff.QueryField.selectedIndex;');
		Win1.document.writeln('					t.setQueryString = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('					var theField = t.LayerFields[t.fieldIndex];');
		Win1.document.writeln('					//alert(theField);');
		Win1.document.writeln('					t.tempGetSamples(theField);');
		Win1.document.writeln('					t.writeQueryForm();');
		Win1.document.writeln('				}');
		Win1.document.writeln('			}');
		
		Win1.document.writeln('			function changeToSamples() {');	
		Win1.document.writeln('				t.fieldIndex = document.QueryStuff.QueryField.selectedIndex;');
		Win1.document.writeln('				t.setQueryString = document.QueryStuff.QueryString.value;');
		Win1.document.writeln('				t.tempGetSamples(t.LayerFields[t.fieldIndex]);');
		Win1.document.writeln('			}');
					
		Win1.document.writeln('		</script>');
		Win1.document.writeln('		</head>');
	
		Win1.document.writeln('		<body link="Blue" vlink="Blue" alink="Blue" leftmargin=0 topmargin=0 bgcolor="' + textFrameBackColor + '" onload="window.focus(); ' + t + '.queryOpen=true;" onunload="' + t + '.queryOpen=false;">');
		Win1.document.writeln('			<center>');
		Win1.document.writeln('			<form name="QueryStuff" onsubmit="sendQuery();return false;">');
		Win1.document.writeln('			<font face="Arial" size="-3">');
		Win1.document.writeln('			<table border="0" cellspacing="0" cellpadding="2" width=100%>');
		Win1.document.writeln('			<tr><td align="CENTER" bgcolor="' + textFrameBackColor + '"><font face="Arial" size="-2">Field</font></td>');
		Win1.document.writeln('			<td align="CENTER" bgcolor="' + textFrameBackColor + '"><font face="Arial" size="-2">Operator</font></td>');
		Win1.document.writeln('			<td align="CENTER" bgcolor="' + textFrameBackColor + '"><font face="Arial" size="-2">' + valueTitle + '</font></td>');
		Win1.document.writeln('			<td rowspan="2" align="CENTER" bgcolor="Silver">');
		Win1.document.writeln('			<input type="button" name="theAnd" value=" And " onclick="addAnd()">');
		Win1.document.writeln('			<input type="button" name="theOr" value=" Or " onclick="addOr()"><br>');
		Win1.document.writeln('			<input type="button" name="theNot" value=" Not " onclick="addNot()">');
		Win1.document.writeln('			<input type="button" name="theLeft" value="  (  " onclick="addLeftPara()">');
		Win1.document.writeln('			<input type="button" name="theRight" value="  )  " onclick="addRightPara()">');
		Win1.document.writeln('			</td>');
			
		Win1.document.writeln('			</tr>');
		Win1.document.writeln('			<tr><td align="CENTER" bgcolor="' + textFrameBackColor + '">');
			Win1.document.writeln('			<select name="QueryField" onchange="setUp();">');
			for (var i=0;i<LayerFieldCount;i++) {
				Win1.document.write('<option value="' + LayerFields[i] + '"');
				if (i==fieldIndex) Win1.document.write(' selected');
				Win1.document.writeln('>' + LayerFields[i]);
			}
			Win1.document.writeln('			</select>');
		Win1.document.writeln('			</td><td align="CENTER" bgcolor="' + textFrameBackColor + '">');
		Win1.document.writeln('			<select name="QueryOperator">');
		Win1.document.writeln('			<OPTION selected value=" = ">=');
		Win1.document.writeln('			<option value=" < ">&lt;');
		Win1.document.writeln('			<option value=" > ">&gt;');
		Win1.document.writeln('			<option value=" <= ">&lt;=');
		Win1.document.writeln('			<option value=" >= ">&gt;=');
		Win1.document.writeln('			<option value=" LIKE ">LIKE');
		//Win1.document.writeln('			<option value=" CN ">CN	');
		Win1.document.writeln('			</select>');
	             
		Win1.document.writeln('			</td><td align="CENTER" bgcolor="' + textFrameBackColor + '">');
			
		if (showSampleValues) {
			Win1.document.writeln('			<select name="QueryValue">');
				for (var i=0;i<SampleCount;i++) {
					Win1.document.writeln('<option value=\'' + sampleList[i] + '\'>' + sampleList[i]);
				}
			Win1.document.writeln('			</select>');
	    } else {
			Win1.document.writeln('<input name="QueryValue" size="25" maxlength="1000" >');
			Win1.document.writeln('			&nbsp;&nbsp;<input type="button" name="makeList" value="Get Samples" onclick="changeToSamples()">');
			Win1.document.writeln('			</td>');
		}         
		Win1.document.writeln('			</td>');
		Win1.document.writeln('			</tr>');
		Win1.document.writeln('			<tr><td colspan="4" align="center" bgcolor="Black">');
		Win1.document.writeln('			<input type="button" name="addIt" value="Add to Query String" onclick="addString()">');
		Win1.document.writeln('			<input type="Text" name="QueryString" size="50" maxlength="1024" value="' + setQueryString + '"><br>');
		Win1.document.writeln('			<input type="submit" value="Execute" name="submit">'); 
		Win1.document.writeln('			<input type="button" name="UnDo" value="UnDo" onclick="undoString()">');
		Win1.document.writeln('			<input type="button" name="Clear" value="Clear" onclick="clearString()">');
		Win1.document.writeln('			</td></tr>');
		Win1.document.writeln('			</table>');
			/* 
		Win1.document.writeln('			Select Field and Operator, enter Value, and click Add to ');
		Win1.document.writeln('		QueryString button. Use the AND, OR, NOT, (, &amp; ) to add ');
		Win1.document.writeln('			additional parameters. Use Undo &amp; Clear to modify. Click Submit Query to query layer Attribute Table.<br>');
		*/
		Win1.document.writeln('			</font></center></FORM></body></html>');
	
		Win1.document.close();
		Win1=null;
		sampleList=null;
}

// parse out sample values for query form	
function getQuerySampleValues() {
	var startpos = 0;
	var endpos = 0;
	var SampleCount = selectData.length;
	var theIndex = fieldIndex;
	qField = LayerFields[fieldIndex] + '="';
	for (var i=0;i<SampleCount;i++) {
		startpos = selectData[i].indexOf(qField,0);
		startpos = startpos + qField.length;
		endpos = selectData[i].indexOf('"',startpos);
		if (LayerFieldType[theIndex].indexOf("12",0)!=-1) {
			sampleList[i] = '"' + t.selectData[i].substring(startpos,endpos) + '"';
		} else {
			sampleList[i] = t.selectData[i].substring(startpos,endpos);
		}
	}
	return SampleCount;
}

// temporarily change getSampleValues to true and load queryform
function tempGetSamples2() {
	showSampleValues=true;
	if (useTextFrame) {
		var Win1 = parent.TextFrame;
		
	} else {
		var Win1 = open("","QueryWindow","width=575,height=150,scrollbars=yes,resizable=yes");
	}
	Win1.document.open();
	Win1.document.writeln('<html><HEAD>');
	Win1.document.writeln('<body BGCOLOR="' + textFrameBackColor + '" TEXT="Black" size="-1">');
	Win1.document.writeln('<div align="center"><font face="Arial"><b>');
	Win1.document.writeln('Requesting sample values for the layer ' + LayerName[ActiveLayerIndex] + '. . .</b></font>');
	Win1.document.writeln('<font face="Arial" size="-1">The first ' + numberDataSamples + ' records are being accessed. There may be duplicate values.</font></div></body></html>');
	Win1.document.close();
	Win1=null;
	
	var theText = writeFieldSample();
	sendToServer(imsQueryURL,theText,40);

}

// temporarily change getSampleValues to true and load queryform
function tempGetSamples(theField) {
	showSampleValues=true;
	if (useTextFrame) {
		var Win1 = parent.TextFrame;
		
	} else {
		var Win1 = open("","QueryWindow","width=575,height=150,scrollbars=yes,resizable=yes");
	}
	Win1.document.open();
	Win1.document.writeln('<html><HEAD>');
	Win1.document.writeln('<body BGCOLOR="' + textFrameBackColor + '" TEXT="Black" size="-1">');
	Win1.document.writeln('<div align="center"><font face="Arial"><b>');
	Win1.document.writeln('Requesting sample values for the layer ' + LayerName[ActiveLayerIndex] + '. . .</b></font><br>');
	Win1.document.writeln('<font face="Arial" size="-1">The first ' + numberDataSamples + ' records are being accessed. There may be duplicate values.</font></div></body></html>');
	Win1.document.close();
	Win1=null;
	
	var theText = writeFieldSample(theField);
	//alert(theText);
	sendToServer(imsQueryURL,theText,40);

}

// get the StoredQueries in the MapService
function getStoredQueries() {
	var theString = '<ARCXML VERSION="1.0.1">\n<REQUEST>\n<GET_SERVICE_INFO renderer="false" extensions="true" fields="false" />\n';
	theString += '</REQUEST>\n</ARCXML>';
	sendToServer(imsQueryURL,theString,55);
}

// get the StoredQueries in the MapService
function parseStoredQueries(theReply) {
	//alert(theReply);
	storedQueryCount=0;
	storedQueryName.length=1;
	storedQueryString.length=1;
	storedQueryLayer.length=1;
	storedQueryVariable.length=1;
	storedQueryVarCount.length=1;
	storedQueryFieldList.length=1;
	storedQueryIndex=0;
	var endpos = 1;
	var pos = -1;
	var blurb = 'name="' + ActiveLayer;
	var startpos = theReply.indexOf("<LAYERINFO",1);
	var thePos = 1;
	while (thePos!=-1) {
		startpos = theReply.indexOf("<LAYERINFO",1);
		endpos = theReply.indexOf(">",startpos);
		thePos = theReply.indexOf(blurb,1);
		if (thePos!=-1) {
			pos = thePos;
			thePos=-1;
		} 
	}
	var sqpos = 0;
	var sqvpos = 0;
	var sqpos2 = 0;
	var vCount=0;
	if (pos!=-1) {
		var fieldCount = 0;
		epos = theReply.indexOf("</LAYERINFO>",pos);
		startpos=0;
		endpos=pos;
		sqpos = theReply.indexOf("<STOREDQUERY name=",endpos);
		sqpos2 = theReply.indexOf("</STOREDQUERY>",endpos);
		while ((epos>sqpos) && (sqpos!=-1)) {
			
			if (sqpos!=-1) {
				startpos = sqpos + 19;
				endpos = theReply.indexOf(dQuote, startpos);
				blurb = theReply.substring(startpos,endpos);
				//alert(blurb);
				storedQueryName[storedQueryCount] = blurb;
				
				startpos = theReply.indexOf("<QUERY where=",endpos);
				startpos += 14;
				endpos = theReply.indexOf(dQuote, startpos);
				blurb = theReply.substring(startpos,endpos);
				//storedQueryString[storedQueryCount] = parseEntity(blurb);
				storedQueryString[storedQueryCount] = blurb;
				startpos = theReply.indexOf("subfields=",endpos); 
				startpos += 11;
				endpos = theReply.indexOf(dQuote, startpos);
				storedQueryFieldList[storedQueryCount] = theReply.substring(startpos,endpos);
				// /*	
				storedQueryVariable[storedQueryCount]="";			
				sqvpos = theReply.indexOf("<SQVAR",startpos);
				vCount = 0;
				//alert(sqvpos + " - " + sqpos2);
				//if ((sqvpos!=-1) && (sqvpos<sqpos2)) {
				while ((sqvpos!=-1) && (sqvpos<sqpos2)) {
					endpos = sqvpos;
					startpos = theReply.indexOf("name=",endpos);
					startpos += 6;
					endpos = theReply.indexOf(dQuote, startpos);
					//storedQueryVariable[storedQueryCount]  
					blurb = theReply.substring(startpos,endpos);
					if (vCount > 0) blurb = "|" + blurb;
					storedQueryVariable[storedQueryCount] = storedQueryVariable[storedQueryCount] + blurb;
					vCount += 1;
					//alert(storedQueryVariable[storedQueryCount]);
					sqvpos = theReply.indexOf("<SQVAR",startpos);
				}
				storedQueryVarCount[storedQueryCount] = vCount;
				// */
				//alert("sqName=" + storedQueryName[storedQueryCount] + "\nsqString:" + storedQueryString[storedQueryCount] + "\nsqVariable:" + storedQueryVariable[storedQueryCount] + "\nsqFieldList:" + storedQueryFieldList[storedQueryCount]);			
			
				storedQueryCount += 1;
			}
			
			
			sqpos = theReply.indexOf("<STOREDQUERY name=",endpos);
			sqpos2 = theReply.indexOf("</STOREDQUERY>",sqpos);
		}
		//canQuery=true;
	//} else {
	//	var msg ="This Layer does not have any StoredQueries.";
	//	if (debugOn>0) msg = msg + "\nReturned ArcXML Response:\n" + theReply;
	//	alert(msg);
		//canQuery=false;
	}
	blurb=null;
	if (storedQueryCount==0) {
		alert(LayerName[ActiveLayerIndex] + ":\nThis Layer does not have any StoredQueries.");
	} else {
		storedQueryForm();
	}
}

// storedQuery Form
function storedQueryForm() {
	writeStoredQueryForm(storedQueryIndex);
}

function writeStoredQueryForm(theIndex) {
	storedQueryIndex=theIndex;
	if (storedQueryVarCount==0) {
		sendStoredQuery(theIndex,"");
	} else {
	
		if (useTextFrame) {
			var Win1 = parent.TextFrame;
			Win1.document.open();
			var t = "parent.MapFrame";
			
		} else {
			var Win1 = open("","QueryWindow","width=575,height=150,scrollbars=yes,resizable=yes");
			var t = "opener";
			if (parent.MapFrame!=null) t = "opener.parent.MapFrame";
		}
		
		Win1.document.writeln('<html><HEAD>');
		Win1.document.writeln('			<script language="javascript">');
		Win1.document.writeln('var t = ' + t);
		
		Win1.document.writeln('function setStyle() {');
		Win1.document.writeln('	var f = document.forms[0];');
		Win1.document.writeln('	var theCount = t.storedQueryIndex;');
		Win1.document.writeln('	var okValue = 0;');
		Win1.document.writeln('	if (t.storedQueryVarCount[theCount]==1) {');
		Win1.document.writeln('		var theValue = f.theStyle.value;');
		Win1.document.writeln('		if (theValue!="") okValue = 1;');
		Win1.document.writeln('	} else {');
		Win1.document.writeln('		var theValue = f.theStyle[0].value;');
		Win1.document.writeln('		if (f.theStyle[0].value!="") okValue = 1;');
		Win1.document.writeln('		for (var i=1;i<t.storedQueryVarCount[theCount];i++) {');
		Win1.document.writeln('			theValue = theValue + "|" + f.theStyle[i].value;');
		Win1.document.writeln('			if (f.theStyle[i].value!="") okValue += 1;');
		Win1.document.writeln('		}');
		Win1.document.writeln('	}');
		Win1.document.writeln('	if (okValue==t.storedQueryVarCount[theCount]) {');
		Win1.document.writeln('		t.sendStoredQuery(theCount,theValue);');
		Win1.document.writeln('	} else {');
		Win1.document.writeln('		alert("Please enter appropriate value");');
		Win1.document.writeln('	}');
		Win1.document.writeln('}');
		Win1.document.writeln('function selectQuery() {');
		Win1.document.writeln('	var f = document.forms[0];');
		Win1.document.writeln('	var theIndex = f.theQuery.selectedIndex;');
		Win1.document.writeln('	t.writeStoredQueryForm(theIndex);');
		Win1.document.writeln('}');
		Win1.document.writeln('</script>');
		Win1.document.writeln('</head>');
		
		Win1.document.writeln('<body bgcolor="Black" text="White" topmargin=0 leftmargin=0 rightmargin=0 onload="window.focus()">');
		Win1.document.writeln('<div align="center">');
		Win1.document.writeln('<font face="Arial" size="-2"><b>');
		Win1.document.writeln('<form action="" name="theStoreQueryForm" onsubmit="setStyle(); return false;">');
		Win1.document.writeln('<table cellspacing="2" nowrap bgcolor="' + textFrameFormColor + '" width=100%>');
		Win1.document.writeln('<tr><th colspan="3" align="CENTER">');
		Win1.document.writeln('<font face="Arial" size="-1"><b>Search</b><br></font>');
		Win1.document.writeln('<font face="Arial" size="-2"><b>Search is Case-Sensitive</b></font>');
		Win1.document.writeln('</th></tr>');
		Win1.document.writeln('<tr>');
		Win1.document.writeln('<td align="Left">');
		Win1.document.writeln('<font face="Arial" size="-1">' + LayerName[ActiveLayerIndex]);
		Win1.document.writeln('<select name="theQuery" onchange="selectQuery()">')
		for (var i=0;i<storedQueryCount;i++) {
			Win1.document.write('	<option value=' + i);
			if (i==storedQueryIndex) Win1.document.write(' selected');
			Win1.document.writeln('>' + storedQueryName[i]);
		
		}
		Win1.document.writeln('</select>');
		Win1.document.writeln('</font></td>');
		Win1.document.writeln('<td align="RIGHT"><font face="Arial" size="-1">');
		for (var i=0;i<storedQueryVarCount[storedQueryIndex];i++) {
			Win1.document.write('Value');
			if (storedQueryVarCount[storedQueryIndex]>1) Win1.document.write(' ' + (i+1));
			Win1.document.writeln(':');
			Win1.document.writeln('<input type=text name="theStyle" value=""><br>');
		}
		Win1.document.writeln('</font>');
		Win1.document.writeln('</td>');
		Win1.document.writeln('<td align="CENTER">');
		Win1.document.writeln('<input type="Button" name="setDU" value="Execute" onclick="setStyle()">  <br>');
		
		Win1.document.writeln('</td></tr></table></form>');
		Win1.document.writeln('</b></font></div>');
		Win1.document.writeln('</body></html>');
		Win1.document.close();
		Win1=null;
	
	}

}

// create the querystring for storedQuery and send it
function sendStoredQuery(theIndex,theValue) {
	showRetrieveData();
	var oldString = storedQueryString[theIndex];
	if (storedQueryVarCount[theIndex]>0) {
		var var1 = storedQueryVariable[theIndex].split("|");
		var var2 = theValue.split("|");
		for (var i=0;i<var1.length;i++) {
			oldString = swapStuff(oldString,var1[i],var2[i]);
		}
	
	} else {
		oldString = swapStuff(oldString,storedQueryVariable[theIndex],theValue);
	}
	//var newString = parseEntity(oldString);
	var newString = makeXMLsafe(oldString);
	//alert(newString);
	setQueryString = newString;
	var theString = writeQueryXML(newString);
	//alert("StoredQuery Request:\n" + theString);
	sendToServer(imsQueryURL,theString,queryXMLMode);
}

// see if there are storedQueries (Search) 
function checkStoredQueries(theReply) {
	var startpos = theReply.indexOf("<STOREDQUERY",1);
	if (startpos==-1) {
		//no storedqueries. . . do not display button
		useStoredQueries=false;
	}
		
}

// replace common HTML entitys with the characters they represent
function parseEntity(oldString) {
	oldString = swapStuff(oldString,"&apos;","'");
	oldString = swapStuff(oldString,"&divide;","/");
	oldString = swapStuff(oldString,"&ge;",">=");
	oldString = swapStuff(oldString,"&gt;",">");
	oldString = swapStuff(oldString,"&le;","<=");
	oldString = swapStuff(oldString,"&lt;","<");
	oldString = swapStuff(oldString,"&ne;","<>");
	oldString = swapStuff(oldString,"&quot;",'"');
	oldString = swapStuff(oldString,"&amp;","&");
	//alert(oldString);
	
	return oldString;
}

// replace the five problem characters for the server's XML parser
function makeXMLsafe(oldString) {
	///*
	oldString = swapStuff(oldString,"'","&apos;");
	oldString = swapStuff(oldString,">","&gt;");
	oldString = swapStuff(oldString,"<","&lt;");
	oldString = swapStuff(oldString,'"',"&quot;");
	//oldString = swapStuff(oldString,"&","&amp;");
	//alert(oldString);
	//*/
	
	return oldString;
}


