// aimsClassRender.js
/*
*  JavaScript template file for ArcIMS HTML Viewer Interactive Class Rendering
*		dependent on aimsXML.js, aimsDHTML.js, aimsCommon.js, and ArcIMSparam.js, 
*
*	Functions to change elements in the LayerRenderString array, whose elements are
*		strings containing replacement renderer arcxml tags for a specific layer for 
* 		current map request
* 	The element index is the Layer's index, starting with the topmost layer as zero.
*		The string must contain the complete renderer information for the layer 
*		(including any labelling or scaling) and follow arcxml renderer requirements.
*/

aimsClassRenderPresent=true;
// color ramps
var ClassRenderStartColor = new Array();
var ClassRenderEndColor = new Array();
// marker/line sizes
var ClassRenderStartSize = new Array();
var ClassRenderEndSize = new Array();
// color of polygon outlines. . . "" if none
var ClassRenderOutlineColor = new Array();
// rendering information preceeding classification
var ClassRenderStringPrefix = new Array();
// rendering information following classification
var ClassRenderStringSuffix = new Array();
// marker style
var ClassRenderStyle = new Array();
// Legend title
var ClassRenderTitle = "";



// current active ClassRenderLayer
var ClassRenderLayerIndex = 0;
// Name of layer
var ClassRenderLayerName = ClassRenderLayer[0];
// current field for classification
var ClassRenderLayerField = "";
// number of classes to use in rendering
var ClassRenderClasses = 0;
// method of classification
//		0=equal interval; 1=quantile;
var ClassRenderMethod = 0;
// type of shape
var ClassRenderShape = "polygon";

var ClassRenderRange = 0;
var ClassRenderBreakIncrement = 0;
var ClassRenderRecordIncrement = 0;
var ClassRenderBreakMin = new Array();
var ClassRenderBreakMax = new Array();
var ClassRenderBreakColor = new Array();
var ClassRenderBreakSize = new Array();

var ClassRenderMin=0;
var ClassRenderMax=9999999999;
var ClassRenderCount=1;
var ClassRenderSum=0;



/*
***************************************************************************************

Interactive Class Rendering functions 

***************************************************************************************
*/

// write interactive ValueRenderer strings in Map XML request
function addSpecialRenderToMap(i) {
	var renderString = "";
	var j=-1;
	for (var k=0;k<ClassRenderLayer.length;k++) {
		if (ClassRenderLayer[k]==LayerName[i]) j=k;
	}
	/*if (j!=-1) {
		if (ClassRenderString[j]!="") {
			// add custom rendering for this request
			renderString += 'type="' + LayerType[i] + '">\n' + ClassRenderString[j] + '\n</LAYERDEF>\n';
		} else {
			renderString += '/>\n';
		}
	} else {
		renderString += '/>\n';
	}*/
	
	if (parent.MapFrame.bENT){
		renderString += 'type="' + LayerType[i] + '">\n' + ClassRenderString[1] + '\n</LAYERDEF>\n';
	}else if (parent.MapFrame.bBRF){
		renderString += 'type="' + LayerType[i] + '">\n' + ClassRenderString[2] + '\n</LAYERDEF>\n';
	}else{
		renderString += '/>\n';
	}
	//alert('renderString: ' + renderString);
	return renderString;
}

// set up the interactive classification
function classifyLayer() {
	var j = -1;
	for (var i=0;i<LayerName.length;i++) {
		if (ClassRenderLayer[ClassRenderLayerIndex] == LayerName[i]) j = i;
	}
	if (j>-1) {
		//if (useTextFrame) parent.TextFrame.document.location = appDir + "text.htm";
		setLayerFields(j);
		fieldIndex=0;
		selectCount=0;
		showBuffer=false;
		ActiveLayer=LayerID[j];
		ActiveLayerType=LayerType[j];
		ActiveLayerIndex=j;
		writeClassifyForm(ClassRenderLayerIndex);
	} else {
		alert(crList[1]);
	}
}

// form for interactive classifying
function writeClassifyForm(theIndex) {
	var crIndex = theIndex;
	if (useTextFrame) {
		//parent.TextFrame.document.location= appDir + "text.htm";
		//alert("writeClassifyForm");
		var Win1 = parent.TextFrame;
		Win1.document.open();
		var t = "parent.MapFrame";
		
	} else {
		var Win1 = open(appDir + "text.htm","QueryWindow","width=575,height=150,scrollbars=yes,resizable=yes");
		var t = "opener";
		if (parent.MapFrame!=null) t = "opener.parent.MapFrame";
	}
	
	Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><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 qField = f.QueryField.options[f.QueryField.selectedIndex].value;');
	Win1.document.writeln('			var qMethod = f.classMethod.selectedIndex;');
	Win1.document.writeln('			var theIndex = f.numClasses.options[f.numClasses.selectedIndex].value;');
	Win1.document.writeln('			if (theIndex==0) {');
	Win1.document.writeln('				t.clearAllClasses(' + theIndex + ');');
	Win1.document.writeln('			} else {');
	Win1.document.writeln('				var qClasses = f.numClasses.options[f.numClasses.selectedIndex].value;');
	Win1.document.writeln('				if (f.theTitle.value!="") t.ClassRenderTitle = f.theTitle.value;');
	Win1.document.writeln('				t.setupClasses(qField, qClasses, qMethod);');
	Win1.document.writeln('			}');
	Win1.document.writeln('		}');
	Win1.document.writeln('		function selectLayer() {');
	Win1.document.writeln('			var f = document.forms[0];');
	Win1.document.writeln('			var theIndex = f.theLayer.selectedIndex;');
	Win1.document.writeln('			t.ClassRenderLayerIndex = theIndex;');
	Win1.document.writeln('			t.classifyLayer();');
	Win1.document.writeln('		}');
	Win1.document.writeln('		function clearClasses() {');
	Win1.document.writeln('			t.ClassRenderLayerIndex = 0;');
	Win1.document.writeln('			t.clearClasses(' + theIndex + ');');
	Win1.document.writeln('			t.sendMapXML();');
	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="theClassifyForm" 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>' + crList[2] + '</b><br></font>');
	Win1.document.writeln('<font face="Arial" size="-2"><b>' + crList[3] + '</b></font>');
	Win1.document.writeln('</th>');
	Win1.document.writeln('<td align="Left" colspan="2">');
	Win1.document.writeln('<font face="Arial" size="-1">');
	Win1.document.writeln(crList[4] + '<br>');
	Win1.document.writeln('<INPUT TYPE="Text" NAME="theTitle" VALUE="' + ClassRenderTitle + '" SIZE="15">');
	Win1.document.writeln('</font></td>');
	Win1.document.writeln('</tr>');
	Win1.document.writeln('<tr>');
	Win1.document.writeln('<td align="Left">');
	Win1.document.writeln('<font face="Arial" size="-1"> ' + crList[5] + '<br>');
	Win1.document.writeln('<select name="theLayer" onchange="selectLayer()">')
	for (var i=0;i<ClassRenderLayer.length;i++) {
		Win1.document.write('	<option value=' + i);
		if (i==crIndex) Win1.document.write(' selected');
		Win1.document.writeln('>' + ClassRenderLayer[i]);
	
	}
	Win1.document.writeln('</select>');
	Win1.document.writeln('</font></td>');
	Win1.document.writeln('<td><font face="Arial" size="-1">' + crList[6] + '<br>');
	Win1.document.writeln('			<select name="QueryField">');
	for (var i=0;i<LayerFieldCount;i++) {
		var typeNum = parseInt(LayerFieldType[i]);
		if ((typeNum>=4) && (typeNum<=8)) {
			Win1.document.write('		<option value="' + LayerFields[i] + '"');
			Win1.document.writeln('>' + LayerFields[i]);
		}
	}
	Win1.document.writeln('			</select>');
	Win1.document.writeln('</font>');
	Win1.document.writeln('</td>');
	
	Win1.document.writeln('<td ><font face="Arial" size="-1">' + crList[7] + '<br>');
	Win1.document.writeln('			<select name="classMethod">');
	Win1.document.writeln('				<option value="0">' + crList[8]);	
	Win1.document.writeln('				<option value="1">' + crList[9]);	
	Win1.document.writeln('			</select>');
	Win1.document.writeln('</font>');
	Win1.document.writeln('</td>');

	Win1.document.writeln('<td><font face="Arial" size="-1">' + crList[10] + '<br>');
	Win1.document.writeln('			<select name="numClasses">');
	Win1.document.writeln('			<option value="0">' + crList[11]);
	for (var i=3;i<11;i++) {
		Win1.document.write('			<option value="' + i + '"');
		if (ClassRenderClasses == i) Win1.document.write(' selected');
		Win1.document.writeln('>' + i);
	}
	Win1.document.writeln('			</select>');
	Win1.document.writeln('</font>');
	Win1.document.writeln('</td>');
	Win1.document.writeln('<td align="CENTER" valign="BOTTOM">');
	Win1.document.writeln('<input type="Button" name="setDU" value="' + crList[12] + '" 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;
	//alert("Finished with page.");
}

// clear out all custom render strings and draw map
function clearAllClasses() {
	clearClassesAll()
	sendMapXML();
}

// clear out all custom render strings
function clearClassesAll() {
	for (var i=0;i<ClassRenderLayer.length;i++) {
		clearClasses(i);
		legTitle = defaultLegTitle;
	}
}
// clear out custom renderer for one of the ClassRenderLayers
function clearClasses(theIndex) {
	ClassRenderString[theIndex] = "";
}

// send XML request for field values to setup new custom renderer for the current ClassRenderLayer
function setupClasses(theField, numClasses, methodIndex) {
	clearClassesAll();
	ClassRenderLayerField = theField;
	ClassRenderMethod = methodIndex;
	ClassRenderClasses = numClasses;
	ClassRenderBreakMin.length=1;
	ClassRenderBreakMax.length=1;
	ClassRenderBreakColor.length=1;
	ClassRenderBreakSize.length=1;
		// turn off all ClassRenderLayers
	for (var m=0;m<ClassRenderLayer.length;m++) {
		for (var n=0;n<layerCount;n++) {
			if (ClassRenderLayer[m]==LayerName[n]) LayerVisible[n]=0;
		}
	}
	
	var theLayer = ClassRenderLayer[ClassRenderLayerIndex];
		// get LayerName index
	var j=-1;
	for (var k=0;k<LayerName.length;k++) {
		if (LayerName[k]==theLayer) j=k;
	}
		// get shape type
	var shapeType = LayerType[j];
	var theLayerID = LayerID[j]
		// turn on this layer
	LayerVisible[j]=1;
	
	if (numClasses>0) {
		showRetrieveData();
		var theString = writeGetAllValues(theLayerID, shapeType, theField);
		sendGetValuesRequest(theString, 2001);
	} else {
		clearAllClasses();
	}
	
}

function writeGetAllValues(theLayerID, shapeType, theField) {
	var theString = "";
	theString = '<ARCXML VERSION="1.1">\n';
	theString += '<REQUEST>\n';
	theString += '	<GET_FEATURES outputmode="xml" geometry="false" envelope="false" compact="true">\n';
	theString += '		<LAYER id="' + theLayerID + '" ftype="' + shapeType + '" />\n';
	theString += '		<QUERY subfields="' + theField + '" where="#ID# > -1" />\n';
	theString += '	</GET_FEATURES>\n';
	theString += '</REQUEST>\n';
	theString += '</ARCXML>\n';
	
	return theString;

}

function sendGetValuesRequest(XMLRequest, theType) {
	var theFunction = "parent.MapFrame.processClassRenderXML";
	sendCustomToServer(XMLRequest,theFunction, theType)
}

function processClassRenderXML(theReplyIn) {
	theReplyIn = replacePlus(theReplyIn);
	var theReply = unescape(theReplyIn);
	//alert(theReply);
	okToSend = true;
	if (debugOn>2) alert(msgList[13] + theReply);
	if (XMLMode == 2001) {
		//alert("XMLMode=2001");
		setClassRenderBreaks(theReply);
	
	}
	if (XMLMode == 2002) {
		//alert("XMLMode=2002");
		calcFieldStats(theReply,ClassRenderLayerName,ClassRenderLayerField);
	
	}
}

function setClassRenderBreaks(theReply) {
	ClassRenderCount = justGetFeatureCount(theReply);
	//alert(ClassRenderCount + " Features");
	if (ClassRenderCount>0) {
		if (ClassRenderCount<ClassRenderClasses) ClassRenderClasses = ClassRenderCount;
		var theValues = getAllFieldValues(theReply,ClassRenderLayerField,ClassRenderCount);
		//alert("Values extracted");
		theValues.sort(numberorder);
		//alert("Values sorted");
		ClassRenderMin = theValues[0];
		ClassRenderMax = theValues[ClassRenderCount-1];
		ClassRenderRange = ClassRenderMax - ClassRenderMin;
		ClassRenderBreakIncrement = ClassRenderRange / ClassRenderClasses;
		ClassRenderRecordIncrement = Math.round(ClassRenderCount / ClassRenderClasses);
		//alert("Min:" + ClassRenderMin + "\nMax:" + ClassRenderMax);
		var msg = crList[13] + "\n";
		if (ClassRenderMethod==0) {
			// equal interval
			var u = Math.pow(10,numDecimals);
			var theIncre = ClassRenderMin;
			var theIncre2 = theIncre;
			if (theIncre!=0) theIncre2 = parseInt(theIncre * u + (5/10)) / u;
			for (var i=0;i<ClassRenderClasses;i++) {
				ClassRenderBreakMin[i] = theIncre2;
				theIncre = theIncre + ClassRenderBreakIncrement;
				if (theIncre!=0) {
					theIncre2 = parseInt(theIncre * u + (5/10)) / u;
				} else {
					theIncre2 = theIncre;
				}
				ClassRenderBreakMax[i] = theIncre2;
				msg +=theIncre + "\n";
			}
		} else {
			// quantile
			var theRecord = 0;
			for (var i=0;i<ClassRenderClasses;i++) {
				ClassRenderBreakMin[i] = theValues[theRecord];
				theRecord = theRecord + ClassRenderRecordIncrement;
				if (theRecord>=ClassRenderCount) theRecord = ClassRenderCount-1;
				ClassRenderBreakMax[i] = theValues[theRecord];
				msg +=theValues[theRecord] + "\n";
			}
		}
		ClassRenderBreakMax[ClassRenderClasses-1] = ClassRenderMax;
		//alert(msg);
		setBreakColors();
		setBreakSizes();
		ClassRenderString[ClassRenderLayerIndex] = ClassRenderStringPrefix[ClassRenderLayerIndex] + setRenderString() + ClassRenderStringSuffix[ClassRenderLayerIndex];
		legTitle = ClassRenderTitle;
		theValues=null;
	}
	hideRetrieveData();
	if (aimsLayersPresent) {
		if ((hasTOC) && (!legendVisible)) parent.TOCFrame.document.location = appDir + "toc.htm";
		if (LayerListOpen) writeLayerListForm();
	}
	sendMapXML();
}

function setRenderString() {
	var rendString = '<VALUEMAPRENDERER lookupfield="' + ClassRenderLayerField + '">\n';
	for (var z=0;z<ClassRenderClasses;z++) {
		rendString += '<RANGE lower="' + ClassRenderBreakMin[z] + '" upper="' + ClassRenderBreakMax[z] + '">\n';
		if (ClassRenderShape=="point") {
			rendString += '<SIMPLEMARKERSYMBOL color="' + ClassRenderBreakColor[z] + '" type="' + ClassRenderStyle[ClassRenderLayerIndex] + '" width="' + ClassRenderBreakSize[z] + '" />\n';
		} else if (ClassRenderShape=="polygon") {
			rendString += '<SIMPLEPOLYGONSYMBOL fillcolor="' + ClassRenderBreakColor[z] + '" filltype="' + ClassRenderStyle[ClassRenderLayerIndex] + '" ';
			
			if (ClassRenderOutlineColor[ClassRenderLayerIndex]!="") {
				rendString += 'boundarycolor="' + ClassRenderOutlineColor[ClassRenderLayerIndex] + '" boundarywidth="' + ClassRenderBreakSize[z] + '" ';
			} else {
				rendString += 'boundary="false" ';
			}
			
			rendString += '/>\n';
		} else {
			rendString += '<SIMPLELINESYMBOL type="' + ClassRenderStyle[ClassRenderLayerIndex] + '" color="' + ClassRenderBreakColor[z] + '" width="' + ClassRenderBreakSize[z] + '" />\n';
		}
		rendString += '</RANGE>\n';
	}
	
	
	rendString += '</VALUEMAPRENDERER>';
	
	return rendString
}

// ramp out colors
function setBreakColors() {
	if (ClassRenderStartColor[ClassRenderLayerIndex]==ClassRenderEndColor[ClassRenderLayerIndex]) {
		// starting and ending colors are the same
		for (var i=0;i<ClassRenderClasses;i++) {
			ClassRenderBreakColor[i] = ClassRenderStartColor[ClassRenderLayerIndex];
		}
	} else {
		var sColors = ClassRenderStartColor[ClassRenderLayerIndex].split(",");
		var eColors = ClassRenderEndColor[ClassRenderLayerIndex].split(",");
		var sRed = parseInt(sColors[0]);
		var sGreen = parseInt(sColors[1]);
		var sBlue = parseInt(sColors[2]);
		var eRed = parseInt(eColors[0]);
		var eGreen = parseInt(eColors[1]);
		var eBlue = parseInt(eColors[2]);
		var rRange = eRed - sRed;
		var gRange = eGreen - sGreen;
		var bRange = eBlue - sBlue;
		var rIncre = parseInt(rRange / ClassRenderClasses);
		var gIncre = parseInt(gRange / ClassRenderClasses);
		var bIncre = parseInt(bRange / ClassRenderClasses);
		var theRed = sRed + rIncre;
		var theGreen = sGreen + gIncre;
		var theBlue = sBlue + bIncre;
		ClassRenderBreakColor[0] = ClassRenderStartColor[ClassRenderLayerIndex];
		ClassRenderBreakColor[ClassRenderClasses-1] = ClassRenderEndColor[ClassRenderLayerIndex];
		for (var i=1;i<(ClassRenderClasses-1);i++) {
			ClassRenderBreakColor[i] = theRed + "," + theGreen + "," + theBlue;
			theRed = theRed + rIncre;
			theGreen = theGreen + gIncre;
			theBlue = theBlue + bIncre;
		}
		sColors=null;
		eColors=null;
		
	}
}

// ramp out sizes
function setBreakSizes() {
	if (ClassRenderStartSize[ClassRenderLayerIndex]==ClassRenderEndSize[ClassRenderLayerIndex]) {
		// starting and ending sizes are the same
		for (var i=0;i<ClassRenderClasses;i++) {
			ClassRenderBreakSize[i] = ClassRenderStartSize[ClassRenderLayerIndex];
		}
	} else {
		ClassRenderBreakSize[0] = ClassRenderStartSize[ClassRenderLayerIndex];
		ClassRenderBreakSize[ClassRenderClasses-1] = ClassRenderEndSize[ClassRenderLayerIndex];
		var sRange = ClassRenderEndSize[ClassRenderLayerIndex] - ClassRenderStartSize[ClassRenderLayerIndex];
		var sIncre = parseInt(sRange * 10 + (5/10)) / 10;
		var theSize = ClassRenderStartSize[ClassRenderLayerIndex] + sIncre;
		for (var i=1;i<(ClassRenderClasses-1);i++) {
			ClassRenderBreakSize[i] = theSize;
			theSize = theSize + sIncre;
		}

	}

}

function calcFieldStats(theReply,theLayer,theField) {
	inCount = justGetFeatureCount(theReply);
	hideRetrieveData();
	var theValues = getAllFieldValues(theReply,theField,inCount);
	var theCount = theValues.length;
	if (theCount>0) {
		
		//alert("Values extracted");
		theValues.sort(numberorder);
		//alert("Values sorted");
		
		var theMin = theValues[0];
		var theMax = theValues[theCount-1];
		var theRange = theMax - theMin;
		var theVarInt = 0;
		var theSum = 0;
		for (var i=0;i<theCount;i++) {
			theSum = theSum + theValues[i];
			theVarInt = theVarInt + Math.pow(theValues[i],2);
		}
		var u = Math.pow(10,numStatDecimals);
		var theAverage = theSum / theCount;
		var theVariance = (theVarInt - theCount * Math.pow(theAverage,2)) / (theCount-1);
		var theStdDev = Math.sqrt(theVariance);
		if (theAverage!=0) theAverage = parseInt(theAverage * u + 0.5) / u;
		if (theStdDev!=0) theStdDev = parseInt(theStdDev * u + 0.5) / u;
		if (theSum!=0) theSum = parseInt(theSum * u + 0.5) / u;
		
		var msg = crList[14] + theField ;
		msg +="\n" + crList[15] + theLayer;
		msg +="\n\n" + crList[16] + theCount + "\n" + crList[17] + theMin;
		msg +="\n" + crList[18] + theMax + "\n" + crList[19] + theSum;
		msg +="\n" + crList[20] + theAverage + "\n" + crList[21] + theRange;
		msg +="\n" + crList[22] + theVariance;
		msg +="\n" + crList[23] + theStdDev;
		
		alert(msg);
	
	} else {
		alert(crList[24]);
	}
	theValues=null;
}

// form for interactive classifying
function writeFieldStatsForm(theIndex) {
	var crIndex = theIndex;
	if (useTextFrame) {
		//parent.TextFrame.document.location= appDir + "text.htm";
		var Win1 = parent.TextFrame;
		Win1.document.open();
		var t = "parent.MapFrame";
		
	} else {
		var Win1 = open(appDir + "text.htm","RenderWindow","width=575,height=150,scrollbars=yes,resizable=yes");
		var t = "opener";
		if (parent.MapFrame!=null) t = "opener.parent.MapFrame";
	}
	
	Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><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 qField = f.QueryField.options[f.QueryField.selectedIndex].value;');
	Win1.document.writeln('			t.setupFieldStats(qField);');
	Win1.document.writeln('		}');
	Win1.document.writeln('		function selectLayer() {');
	Win1.document.writeln('			var f = document.forms[0];');
	Win1.document.writeln('			var theIndex = f.theLayer.selectedIndex;');
	Win1.document.writeln('			t.ClassRenderLayerIndex = theIndex;');
	Win1.document.writeln('			t.fieldStats();');
	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="theStatsForm" 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>' + crList[25] + '</b><br></font>');
	Win1.document.writeln('<font face="Arial" size="-2"><b>' + crList[26] +'</b></font>');
	Win1.document.writeln('</th>');
	Win1.document.writeln('</tr>');
	Win1.document.writeln('<tr>');
	Win1.document.writeln('<td align="Left">');
	Win1.document.writeln('<font face="Arial" size="-1"> ' + crList[5] + '<br>');
	Win1.document.writeln('<select name="theLayer" onchange="selectLayer()">')
	for (var i=0;i<ClassRenderLayer.length;i++) {
		Win1.document.write('	<option value=' + i);
		if (i==crIndex) Win1.document.write(' selected');
		Win1.document.writeln('>' + ClassRenderLayer[i]);
	
	}
	Win1.document.writeln('</select>');
	Win1.document.writeln('</font></td>');
	Win1.document.writeln('<td><font face="Arial" size="-1">' + crList[6] + '<br>');
	Win1.document.writeln('			<select name="QueryField">');
	for (var i=0;i<LayerFieldCount;i++) {
		var typeNum = Math.abs(parseInt(LayerFieldType[i]));
		if ((typeNum>=4) && (typeNum<=9)) {
			Win1.document.write('		<option value="' + LayerFields[i] + '"');
			Win1.document.writeln('>' + LayerFields[i]);
		}
	}
	Win1.document.writeln('			</select>');
	Win1.document.writeln('</font>');
	Win1.document.writeln('</td>');
	
	Win1.document.writeln('<td align="CENTER" valign="BOTTOM">');
	Win1.document.writeln('<input type="Button" name="setDU" value="' + crList[12] + '" 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;
}

// send XML request for field values to setup new custom renderer for the current ClassRenderLayer
function setupFieldStats(theField) {
	ClassRenderLayerField = theField;
	var theLayer = ClassRenderLayer[ClassRenderLayerIndex];
		// get LayerName index
	var j=-1;
	for (var k=0;k<LayerName.length;k++) {
		if (LayerName[k]==theLayer) j=k;
	}
		// get shape type
	var shapeType = LayerType[j];
	var theLayerID = LayerID[j]
	showRetrieveData();
	var theString = writeGetAllValues(theLayerID, shapeType, theField);
	ClassRenderLayerName = theLayer;
	sendGetValuesRequest(theString, 2002);
	
}

// set up the interactive classification
function fieldStats() {
	var j = -1;
	for (var i=0;i<LayerName.length;i++) {
		if (ClassRenderLayer[ClassRenderLayerIndex] == LayerName[i]) j = i;
	}
	if (j>-1) {
		//if (useTextFrame) parent.TextFrame.document.location = appDir + "text.htm";
		setLayerFields(j);
		fieldIndex=0;
		selectCount=0;
		showBuffer=false;
		ActiveLayer=LayerID[j];
		ActiveLayerType=LayerType[j];
		ActiveLayerIndex=j;
		writeFieldStatsForm(ClassRenderLayerIndex);
	} else {
		alert(crList[27]);
	}
}

