// CivXplorer Zoom To Landmark Layer

// Suzanne Fliege
// Red Horse Geographics, LLC

// contains functions for zooming to an area, defined by a map layer.
findbylandmarkAvailable = true;
var ZoomAreaInfoString = new Array(); // info string for user form
var ZoomAreaLayerID = new Array(); // map layer to zoom to
var ZoomAreaFields = new Array(); // field(s) to zoom query (one or many, include SDE prefixes!!) MAXIMUM 4 FIELDS!
var ZoomAreaAliases = new Array(); // field aliases for user to see (must correspond to ZoomAreaFields array)
var ZoomAreaIsString = new Array(); // whether the field is string or numeric (true if string)
var ZoomAreaValues = new Array(); // values for user to choose from (if left empty, then samples retrieved from layer data)
var ZoomAreaMakeVisible = new Array(); // whether to make layer visible when zoomed-to (true if you want it on)
var ZoomAreaSaveSelect = new Array(); // whether to select the feature that was zoomed-to (true to select, false to just zoom)

groupIndexCount = 0;
// variables containing Fields, Aliases, and Value Arrays
ZoomAreaInfoString[groupIndexCount] = "Zoom to Municipality"
if (siteName.substring(0,5) == "GCCEA") {
	ZoomAreaLayerID[groupIndexCount] = "backgroundlayer";
	ZoomAreaFields[groupIndexCount] = new Array("FULL_DESC");
} else {
	ZoomAreaLayerID[groupIndexCount] = "grouped-municipalbounds";
	ZoomAreaFields[groupIndexCount] = new Array("MUNINAME");
}
ZoomAreaAliases[groupIndexCount] = new Array("Cities and Townships");
ZoomAreaIsString[groupIndexCount] = new Array(true);
ZoomAreaValues[groupIndexCount] = new Array();
ZoomAreaMakeVisible[groupIndexCount] = false;
ZoomAreaSaveSelect[groupIndexCount] = false;

groupIndexCount += 1;
ZoomAreaInfoString[groupIndexCount] = "Zoom to City Hall"
ZoomAreaLayerID[groupIndexCount] = "grouped-citytwphalls";
ZoomAreaFields[groupIndexCount] = new Array("NAME");
ZoomAreaAliases[groupIndexCount] = new Array("City Hall Name");
ZoomAreaIsString[groupIndexCount] = new Array(true);
ZoomAreaValues[groupIndexCount] = new Array();
ZoomAreaMakeVisible[groupIndexCount] = true;
ZoomAreaSaveSelect[groupIndexCount] = true;

if (siteName.substring(0,5) != "GCCEA") {
	groupIndexCount += 1;
	ZoomAreaInfoString[groupIndexCount] = "Find By Sec/Twp/Rng"
	ZoomAreaLayerID[groupIndexCount] = "optional-sections";
	ZoomAreaFields[groupIndexCount] = new Array("SECNUM","TWPRANGE");
	ZoomAreaAliases[groupIndexCount] = new Array("Section","Township/Range");
	ZoomAreaIsString[groupIndexCount] = new Array(true,true);
	ZoomAreaValues[groupIndexCount] = new Array();
	ZoomAreaValues[groupIndexCount][0] = "1!!2!!3!!4!!5!!6!!7!!8!!9!!10!!11!!12!!13!!14!!15!!16!!17!!18!!19!!20!!21!!22!!23!!24!!25!!26!!27!!28!!29!!30!!31!!32!!33!!34!!35!!36";
	ZoomAreaValues[groupIndexCount][1] = "T109N R15W Pine Island!!T109N R16W Roscoe!!T109N R17W Cherry Grove!!T109N R18W Kenyon!!T110N R15W Zumbrota!!T110N R16W Minneola!!T110N R17W Wanamingo!!T110N R18W Holden!!T111N R12W Lake!!T111N R13W Mount Pleasant!!T111N R14W Belvidere!!T111N R15W Goodhue!!T111N R16W Belle Creek!!T111N R17W Leon!!T111N R18W Warsaw!!T112N R12W Florence East!!T112N R13W Florence!!T112N R14W Hay Creek!!T112N R15W Featherstone!!T112N R16W Vasa!!T112N R17W Cannon Falls!!T112N R18W Stanton!!T113N R13W Wacouta!!T113N R14W Red Wing East!!T113N R15W Red Wing!!T113N R16W Welch!!T114N R15W Red Wing North!!T114N R16W Welch North";
	ZoomAreaMakeVisible[groupIndexCount] = true;
	ZoomAreaSaveSelect[groupIndexCount] = false;
} else { // GCCEA section and other find-bys
	// sections
	groupIndexCount += 1;
	ZoomAreaInfoString[groupIndexCount] = "Find By Sec/Twp/Rng"
	ZoomAreaLayerID[groupIndexCount] = "grouped-gccea-sectionbound";
	ZoomAreaFields[groupIndexCount] = new Array("SECTIONNUM","TOWNSHIPLA");
	ZoomAreaAliases[groupIndexCount] = new Array("Section","Township/Range");
	ZoomAreaIsString[groupIndexCount] = new Array(false,true);
	ZoomAreaValues[groupIndexCount] = new Array();
	ZoomAreaValues[groupIndexCount][0] = "1!!2!!3!!4!!5!!6!!7!!8!!9!!10!!11!!12!!13!!14!!15!!16!!17!!18!!19!!20!!21!!22!!23!!24!!25!!26!!27!!28!!29!!30!!31!!32!!33!!34!!35!!36";
	ZoomAreaValues[groupIndexCount][1] = "T109N R15W!!T109N R16W!!T109N R17W!!T109N R18W!!T110N R15W!!T110N R16W!!T110N R17W!!T110N R18W!!T111N R12W!!T111N R13W!!T111N R14W!!T111N R15W!!T111N R16W!!T111N R17W!!T111N R18W!!T112N R12W!!T112N R13W!!T112N R14W!!T112N R15W!!T112N R16W!!T112N R17W!!T112N R18W!!T113N R13W!!T113N R14W!!T113N R15W!!T113N R16W!!T114N R15W!!T114N R16W";
	ZoomAreaMakeVisible[groupIndexCount] = true;
	ZoomAreaSaveSelect[groupIndexCount] = false;
	// section grid (maps)
	groupIndexCount += 1;
	ZoomAreaInfoString[groupIndexCount] = "Find By Section Grid"
	ZoomAreaLayerID[groupIndexCount] = "grouped-gccea-sectiongrid";
	ZoomAreaFields[groupIndexCount] = new Array("FULL_DESC");
	ZoomAreaAliases[groupIndexCount] = new Array("Map Name");
	ZoomAreaIsString[groupIndexCount] = new Array(true);
	ZoomAreaValues[groupIndexCount] = new Array();
	ZoomAreaMakeVisible[groupIndexCount] = true;
	ZoomAreaSaveSelect[groupIndexCount] = true;
	// subs
	groupIndexCount += 1;
	ZoomAreaInfoString[groupIndexCount] = "Find By SubBoundary"
	ZoomAreaLayerID[groupIndexCount] = "grouped-gccea-subboundary";
	ZoomAreaFields[groupIndexCount] = new Array("SUBNAME");
	ZoomAreaAliases[groupIndexCount] = new Array("Sub Name");
	ZoomAreaIsString[groupIndexCount] = new Array(true);
	ZoomAreaValues[groupIndexCount] = new Array();
	ZoomAreaMakeVisible[groupIndexCount] = true;
	ZoomAreaSaveSelect[groupIndexCount] = true;
}

//******************************************************************************
// do not edit below here
//******************************************************************************
// program variables, don't need to specify
var ZoomAreaLayerIndex = new Array();
var ZoomAreaIndex = 0;
var isZoomAreaQuery = false;

function addZoomAreaMenuItems() {
	var tempString = "";
	for (var i=0;i<ZoomAreaInfoString.length;i++) {
		tempString += createMenuItem("menuItem_Zoom2Area"+i,"Zoom2Area(\'" + i + "\');",menuSpace+ZoomAreaInfoString[i]);
	}
	return tempString;
}

// writes specific form for zoom to landmark
function writeZoom2AreaForm() {
	var IsOkToOpenForm = "false";
	for  (var i=0;i<LayerID.length;i++) {
		if (ZoomAreaLayerID[ZoomAreaIndex] == LayerID[i]) IsOkToOpenForm = LayerAvailable[i];
	}
	if (IsOkToOpenForm == "true") {
		var theString = "";
		theString += '<table width="100%" cellspacing="10" cellpadding="0">';
		theString += '<tr><td colspan="2"><div class="CXsearchHeader">' + ZoomAreaInfoString[ZoomAreaIndex] + '</div></td></tr>';
		// add in dropdown(s) for values
		if (ZoomAreaFields[ZoomAreaIndex].length > 1) {
			for (var j=0;j<ZoomAreaFields[ZoomAreaIndex].length;j++) {
				var tempAreaValues = ZoomAreaValues[ZoomAreaIndex][j].split("!!");
				theString += '<tr><td class="CXsearchTextNormal" align="right">' + ZoomAreaAliases[ZoomAreaIndex][j] + ':</td>';
				theString += '<td class="CXsearchTextNormal" align="left">';
				theString += '<select id="AreaName' + j + '" class="CXsearch">';
				theString += '<option selected value="">' + ZoomAreaAliases[ZoomAreaIndex][j] + '</option>';
				for (var i=0;i<tempAreaValues.length;i++) {
					theString += '<option value="' + tempAreaValues[i] + '">' + tempAreaValues[i] + '</option>';
				}
				theString += ' </select>';
				theString += '</td></tr>';
			}
		} else {
			var tempAreaValues = ZoomAreaValues[ZoomAreaIndex];
			theString += '<tr><td class="CXsearchTextNormal" align="right">' + ZoomAreaAliases[ZoomAreaIndex] + ':</td>';
			theString += '<td class="CXsearchTextNormal" align="left">';
			theString += '<select id="AreaName0" class="CXsearch">';
			theString += '<option selected value="">' + ZoomAreaAliases[ZoomAreaIndex] + '</option>';
			for (var i=0;i<tempAreaValues.length;i++) {
				theString += '<option value="' + tempAreaValues[i] + '">' + tempAreaValues[i] + '</option>';
			}
			theString += ' </select>';
			theString += '</td></tr>';
		}
		theString += '<tr><td align="center" colspan="2"><input onclick="JavaScript:doZoom2Area();" type="button" value="Find It!" class="toolButtonNormal" onmouseover="this.className=\'toolButtonHighlight\';" onmouseout="this.className=\'toolButtonNormal\';"/></td></tr>'; 
		theString += '</table>';
		clickFunction("nothing");
		updateContent('cxPopup',theString);
		document.getElementById('cxPopup').style.overflow = "hidden";
		document.getElementById('cxPopupMask').style.display = "inline";  
		document.getElementById('cxPopup').style.display = "inline";
	} else {
		alert("Sorry, that layer is not available!");
	}
	return false;
}

// check that current zoom-to layer has a value list, retrieve samples if not
function Zoom2Area(tmpIndex) {
	ZoomAreaIndex = tmpIndex;
	// check first time through for indexes
	if (ZoomAreaLayerIndex.length == 0) {
		for  (var i=0;i<LayerID.length;i++) {
			for (var j=0;j<ZoomAreaLayerID.length;j++) {
				if (ZoomAreaLayerID[j] == LayerID[i]) ZoomAreaLayerIndex[j] = i;
			}
		}
	}
	// check if the current zoom layer has a value list
	if ((ZoomAreaValues[ZoomAreaIndex][0] == null) || (ZoomAreaValues[ZoomAreaIndex][0] == "")) {
		ProtectorOn();
		// write and send request for samples
		if (ZoomAreaFields[ZoomAreaIndex].length > 1) {
			var tempZoomFields = ZoomAreaFields[ZoomAreaIndex];
			sampleField = "";
			for (var i=0;i<tempZoomFields.length;i++) {
				sampleField += ZoomAreaFields[ZoomAreaIndex][i];
				if (i<tempZoomFields.length-1) sampleField += " ";
			}
		} else { // only one field to search
			sampleField = ZoomAreaFields[ZoomAreaIndex][0];
		}
		var sampleString = writeFieldSample(ZoomAreaLayerID[ZoomAreaIndex],sampleField,5000);
		sendToServer(imsQueryURL,sampleString,41);
	} else {
		writeZoom2AreaForm();
	}
}

// process query specifically for twp search/zoom
function sendAreaQueryString(tempString) {
	var newString = tempString.substring(5,tempString.length);
	newString = fixSingleQuotes(newString);
	newString = swapQuotes(newString);
	newString = makeXMLsafe(newString);
	ProtectorOn();
	var theString = writeAreaQueryXML(newString);
	isZoomAreaQuery = true;
	sendToServer(imsQueryURL,theString,42);
}

// write out XML request to query twp
function writeAreaQueryXML(queryString) {
	var theString = '<ARCXML version="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="false" envelope="true"';
	theString += ' featurelimit="1000" beginrecord="1">\n';
	theString += '<LAYER id="' + ZoomAreaLayerID[ZoomAreaIndex] + '" />';
	theString += '<SPATIALQUERY subfields="#ALL#" where="' + queryString + '" />';
	theString += '</GET_FEATURES>';
	theString += '</REQUEST>';
	theString += '</ARCXML>';
	return theString;
}

// send user zoom-to request
function doZoom2Area() {
	workingParcelQueryInfoString = "";
	var theString = '';
	// field 0
	if (document.getElementById('AreaName0').value != "") {
		if (ZoomAreaIsString[ZoomAreaIndex][0]) {
			theString += ' AND ' + ZoomAreaFields[ZoomAreaIndex][0] + ' LIKE ' + dQuote + document.getElementById('AreaName0').value + dQuote;
		} else {
			theString += ' AND ' + ZoomAreaFields[ZoomAreaIndex][0] + ' = ' + document.getElementById('AreaName0').value;
		}
	}
	// field 1, if exists
	if (document.getElementById('AreaName1') != null) {
		if (document.getElementById('AreaName1').value != "") {
			if (ZoomAreaIsString[ZoomAreaIndex][1]) {
				theString += ' AND ' + ZoomAreaFields[ZoomAreaIndex][1] + ' LIKE ' + dQuote + document.getElementById('AreaName1').value + dQuote;
			} else {
				theString += ' AND ' + ZoomAreaFields[ZoomAreaIndex][1] + ' = ' + document.getElementById('AreaName1').value;
			}
		}
	}
	// field 2, if exists
	if (document.getElementById('AreaName2') != null) {
		if (document.getElementById('AreaName2').value != "") {
			if (ZoomAreaIsString[ZoomAreaIndex][2]) {
				theString += ' AND ' + ZoomAreaFields[ZoomAreaIndex][2] + ' LIKE ' + dQuote + document.getElementById('AreaName2').value + dQuote;
			} else {
				theString += ' AND ' + ZoomAreaFields[ZoomAreaIndex][2] + ' = ' + document.getElementById('AreaName2').value;
			}
		}
	}
	// field 3, if exists
	if (document.getElementById('AreaName3') != null) {
		if (document.getElementById('AreaName3').value != "") {
			if (ZoomAreaIsString[ZoomAreaIndex][3]) {
				theString += ' AND ' + ZoomAreaFields[ZoomAreaIndex][3] + ' LIKE ' + dQuote + document.getElementById('AreaName3').value + dQuote;
			} else {
				theString += ' AND ' + ZoomAreaFields[ZoomAreaIndex][3] + ' = ' + document.getElementById('AreaName3').value;
			}
		}
	}
	if (theString == '') {	
		alert("You must specify an Area to Zoom To!");
		return false;
	} else {
		closePopupDisplay();
		if (ZoomAreaMakeVisible[ZoomAreaIndex]) {
			// base or restricted layers are not changed!!
			if (LayerTypeUser[ZoomAreaLayerIndex[ZoomAreaIndex]] == "optional") {
				LayerVisible[ZoomAreaLayerIndex[ZoomAreaIndex]] = "true";  	
			} else if ((LayerTypeUser[ZoomAreaLayerIndex[ZoomAreaIndex]] == "overlay") || (LayerTypeUser[ZoomAreaLayerIndex[ZoomAreaIndex]] == "orthoimg")) {
				// reset all overlays
				var tempIndex = -1;
				for (var i=0;i<tocOverlayList.length;i++) {
					if (!isNaN(tocOverlayList[i][3])) LayerVisible[tocOverlayList[i][3]] = "false";
					if (tocOverlayList[i][1] == LayerID[ZoomAreaLayerIndex[ZoomAreaIndex]]) tempIndex = i;
				}
				if (groupedlayersAvailable) TurnGroupOverlaysOff();
				// set selected overlay visible
				if (tempIndex > -1) { // is single overlay or orthoimg
					LayerVisible[ZoomAreaLayerIndex[ZoomAreaIndex]] = "true";
					tocOverlayCurrent = LayerID[ZoomAreaLayerIndex[ZoomAreaIndex]];
					tocOverlayCurrentType = LayerTypeUser[ZoomAreaLayerIndex[ZoomAreaIndex]];
				}
			} else if (LayerTypeUser[ZoomAreaLayerIndex[ZoomAreaIndex]] == "grouped") {
				if (groupedlayersAvailable) {
					for (var j=0;j<groupedIDs.length;j++) {
						for (var k=0;k<groupedIDs[j].length;k++) {
							if (groupedIDs[j][k] == LayerID[ZoomAreaLayerIndex[ZoomAreaIndex]]) {
								groupedExpand[j] = true;
								groupedLayerVisible[j][k] = "true";
								for (var i=0;i<tocOptionalList.length;i++) {
									if (tocOptionalList[i][1] == groupedID[j]) tocOptionalList[i][3] = "true";
								}
								if (groupedType[j] == "subgroup") {
									for (var m=0;m<groupedIDs.length;m++) {
										for (var n=0;n<groupedIDs[m].length;n++) {
											if (groupedIDs[m][n] == groupedID[j]) {
												groupedExpand[m] = true;
												groupedVisible[m] = true;
												for (var i=0;i<tocOptionalList.length;i++) {
													if (tocOptionalList[i][1] == groupedID[m]) tocOptionalList[i][3] = "true";
												}
											}
										}
									}
								}
								TurnGroupOptionalOn(groupedID[j]);
							}
						}
					}
				}
			}
		}
		clickFunction("nothing");
		sendAreaQueryString(theString);
	}
}

// check if layer has fieldNameList, and save selection if it does
function checkZoomAreaSave(theReply) {
	if (LayerSelectInfoIndex[ZoomAreaLayerIndex[ZoomAreaIndex]] != -1) {
		setActiveLayer(ZoomAreaLayerID[ZoomAreaIndex],false,false);
		saveToCurrentSelection(theReply);
		displaySelectData(false);
	}
	isZoomAreaQuery = false;
	return false;
}