﻿
cadastral.tools = {
	prevQuery: "",

	swapQuickZoom: function (zoomType) {
		switch (zoomType) {
			case "city":
				cadastral.tools.fillCityList();
				break;
			case "county":
				cadastral.tools.fillCountyList();
				break;
			default:
				break;
		}
		if (zoomType !== "") {
			dojo.style(zoomType, "display", "block");
		}

		if (cadastral.tools.prevQuery !== "" && cadastral.tools.prevQuery !== null && cadastral.tools.prevQuery != zoomType) {
			dojo.style(cadastral.tools.prevQuery, "display", "none");
		}
		cadastral.tools.prevQuery = zoomType;
	},

	fillCityList: function () {
		dojo.byId('citySelect').options.length = 0;
		var sortedArray = cadastral.cities.sort(function (a, b) {
			return a.name == b.name ? 0 : ((a.name > b.name) ? 1 : -1);
		});
		var options = "";
		dojo.forEach(sortedArray, function (item, i) {
			dojo.byId('citySelect').options.add(new Option(item.name, item.value));
		});

	},

	findCity: function () {
		cadastral.base.showLoading();
		var si = dojo.byId("citySelect").selectedIndex;
		var cityName = dojo.byId('citySelect').options[si].text;
		var searchLayer = dojo.byId('citySelect').options[si].value;

		var queryUrl = "";
		switch (searchLayer) {
			case "MT_Cities":
				queryUrl = cadastral.cityQueryUrl;
				break;
			default:
				queryUrl = cadastral.citySeatQueryUrl;
				break;
		}

		var queryTask = new esri.tasks.QueryTask(queryUrl);
		var query = new esri.tasks.Query();
		query.returnGeometry = true;
		query.where = "NAME = '" + cityName + "'";

		dojo.connect(queryTask, "onComplete", function (featureSet) {
			try {
				if (featureSet.features.length > 0) {
					cadastral.map.graphics.clear();
					var feature = featureSet.features[0];
					var newExtent = new esri.geometry.Extent(feature.geometry.x - 2000, feature.geometry.y - 2000, feature.geometry.x + 2000, feature.geometry.y + 2000, new esri.SpatialReference({ wkid: 102100 }));
					cadastral.map.setExtent(newExtent, true);
					//cadastral.hidePane('toolsPane')
				}
			}
			catch (err) { alert(err); }
		});

		queryTask.execute(query);
	},

	fillCountyList: function () {
		dojo.byId('countyZoomSelect').options.length = 0;
		var sortedArray = cadastral.counties.sort(function (a, b) {
			return a.name == b.name ? 0 : ((a.name > b.name) ? 1 : -1);
		});
		var options = "";
		dojo.forEach(sortedArray, function (item, i) {
			dojo.byId('countyZoomSelect').options.add(new Option(item.name, item.name));
		});

	},

	findCounty: function () {
		cadastral.base.showLoading();
		var si = dojo.byId("countyZoomSelect").selectedIndex;
		var countyName = dojo.byId('countyZoomSelect').options[si].text;

		var queryTask = new esri.tasks.QueryTask(cadastral.countyQueryUrl);
		var query = new esri.tasks.Query();
		query.returnGeometry = true;
		query.where = "NAME = '" + countyName + "'";

		dojo.connect(queryTask, "onComplete", function (featureSet) {
			try {
				if (featureSet.features.length > 0) {
					cadastral.map.graphics.clear();
					var graphic = featureSet.features[0];
					var extent = esri.graphicsExtent([graphic]);
					cadastral.map.setExtent(extent, true);
				}
			}
			catch (err) { alert(err); }
		});

		queryTask.execute(query);
	},

	findTRS: function () {
		cadastral.base.showLoading();
		dojo.byId("findTRSMessage").innerHTML = "";
		var township = dojo.byId("townshipDDL").value;
		var tarray = township.split(".");
		var tfrac;
		if (tarray.length > 1) {
			township = tarray[0];
			if (township.length == 1) {
				township = "00" + township;
			}
			else {
				township = "0" + township;
			}
			tfrac = 2;
		}
		else {
			tfrac = 0;
		}

		var td = null;
		if (dojo.byId("TN").checked) {
			td = "N";
		}
		else {
			td = "S";
		}

		var range = dojo.byId("range").value;
		var rarray = range.split(".");
		var rfrac;
		if (rarray.length > 1) {
			range = rarray[0];
			if (range.length == 1) {
				range = "00" + range;
			}
			else {
				range = "0" + range;
			}
			rfrac = 2;
		}
		else {
			rfrac = 0;
		}
		var rd = null;
		if (dojo.byId("RE").checked) {
			rd = "E";
		}
		else {
			rd = "W";
		}

		// Sec will hold each html section control    
		var sec;
		// sections will hold the list of sections to zoom to
		var sections = "";
		var sectionsArray = [];
		for (i = 1; i < 37; i++) {
			sec = document.getElementById('sec' + i);

			if (sec.colorChanged === true) {
				sections += sec.innerHTML + ",";
			}
		}
		if (sections !== "") {
			sections = sections.substr(0, sections.length - 1);
			sectionsArray = sections.split(',');
		}

		if (sectionsArray.length === 0) {
			var queryTask = new esri.tasks.QueryTask(cadastral.plssQueryUrl);
			var query = new esri.tasks.Query();
			query.returnGeometry = true;
			query.outFields = ["PLSSID"];
			query.where = "TWNSHPNO = '" + township + "' AND TWNSHPFRAC = '" + tfrac + "' AND TWNSHPDIR = '" + td + "' AND RANGENO = '" + range + "' AND RANGEFRAC = '" + rfrac + "' AND RANGEDIR = '" + rd + "'";

			dojo.connect(queryTask, "onComplete", function (featureSet) {
				if (featureSet.features.length > 0) {
					cadastral.map.graphics.clear();
					var graphic = featureSet.features[0];
					var extent = esri.graphicsExtent([graphic]);
					cadastral.map.setExtent(extent, true);
				} else {
					dojo.byId("findTRSMessage").innerHTML = "<span style=\"color:red;\">*Not a valid TRS search for Montana. Please try again.</span>";
					cadastral.base.hideLoading();
				}
			});
			dojo.connect(queryTask, "onError", function (error) {
				alert(error);
				cadastral.base.hideLoading();
			});
			queryTask.execute(query);
		}
		else {
			var queryTask = new esri.tasks.QueryTask(cadastral.plssQueryUrl);
			var query = new esri.tasks.Query();
			query.returnGeometry = true;
			query.outFields = ["PLSSID"];
			query.where = "TWNSHPNO = '" + township + "' AND TWNSHPFRAC = '" + tfrac + "' AND TWNSHPDIR = '" + td + "' AND RANGENO = '" + range + "' AND RANGEFRAC = '" + rfrac + "' AND RANGEDIR = '" + rd + "'";
			var plssId;
			dojo.connect(queryTask, "onComplete", function (featureSet) {
				try {
					if (featureSet.features.length > 0) {
						cadastral.map.graphics.clear();
						var graphic = featureSet.features[0];
						plssId = graphic.attributes.PLSSID;
						var secQuery = "";
						for (i = 0; i < sectionsArray.length; i++) {
							if (sectionsArray[i].length == 1) {
								sectionsArray[i] = "0" + sectionsArray[i];
							}
							if (i === 0) {
								secQuery = "(FRSTDIVNO = '" + sectionsArray[i] + "'";
							}
							else {
								if (sectionsArray[i] !== "") {
									secQuery += " OR FRSTDIVNO = '" + sectionsArray[i] + "'";
								}
							}
						}
						secQuery += ")";

						if (plssId !== "") {
							var queryTask = new esri.tasks.QueryTask(cadastral.plssSecQueryUrl);
							var query = new esri.tasks.Query();
							query.returnGeometry = true;
							query.where = "PLSSID = '" + plssId + "' AND " + secQuery;
							var plssId;
							dojo.connect(queryTask, "onComplete", function (featureSet) {
								try {
									if (featureSet.features.length > 0) {
										var maxX;
										var maxY;
										var minX;
										var minY;
										for (i = 0; i < featureSet.features.length; i++) {
											var extent = esri.graphicsExtent([featureSet.features[i]]);
											if (i === 0) {
												maxX = extent.xmax;
												maxY = extent.ymax;
												minX = extent.xmin;
												minY = extent.ymin;
											}
											if (maxX < extent.xmax) {
												maxX = extent.xmax;
											}
											if (maxY < extent.ymax) {
												maxY = extent.ymax;
											}
											if (minX > extent.xmin) {
												minX = extent.xmin;
											}
											if (minY > extent.ymin) {
												minY = extent.ymin;
											}
										}

										cadastral.map.graphics.clear();
										var extent = new esri.geometry.Extent(minX, minY, maxX, maxY, new esri.SpatialReference({ wkid: 102100 }));
										cadastral.map.setExtent(extent, true);
									}
								}
								catch (err) { alert(err); }
							});
							dojo.connect(queryTask, "onError", function (error) {
								alert(error);
								cadastral.base.hideLoading();
							});
							queryTask.execute(query);
						}
					} else {
						dojo.byId("findTRSMessage").innerHTML = "<span style=\"color:red;\">*Not a valid TRS search for Montana. Please try again. Please try again.</span>";
						cadastral.base.hideLoading();
					}
				}
				catch (err) { alert(err); }
			});
			dojo.connect(queryTask, "onError", function (error) {
				alert(error);
				cadastral.base.hideLoading();
			});
			queryTask.execute(query);
		}
	},

	selectSection: function (obj) {
		if (obj.colorChanged === true) {
			obj.style.background = '#D6D6E0';
			obj.colorChanged = false;
		}
		else {
			obj.style.background = '#25AAE1';
			obj.colorChanged = true;
		}
	},

	navToolbar: null,

	extentHistoryChangeHandler: function () {
		dojo.byId("prevExtent").disabled = cadastral.tools.navToolbar.isFirstExtent();
		dojo.byId("nextExtent").disabled = cadastral.tools.navToolbar.isLastExtent();
	},

	prevSelectType: "",

	swapSelectType: function (selectType) {
		cadastral.base.showData("", 'bufferResults');
		// First thing we do is disconnect any onclick listeners on the map
		for (var i = 0; i < cadastral.mapOnClickListeners.length; i++) {
			dojo.disconnect(cadastral.mapOnClickListeners[i]);
		}
		cadastral.toolbar.deactivate();
		switch (selectType) {
			case "buffer":
				dojo.addClass("bufferLi", "active");
				dojo.removeClass("polygonLi", "active");
				var queryTask = new esri.tasks.QueryTask(cadastral.parcelQueryUrl);
				var query = new esri.tasks.Query();
				query.returnGeometry = true;
				query.outFields = ["PARCELID", "PARCELNAME", "OWNERCLASSIFICATION", "PROPERTY_TYPE", "OWNER_NAME_1", "AREATYPE"];

				var gsvc = new esri.tasks.GeometryService(cadastral.geometryServiceUrl);

				// Wire up the click event for the map
				cadastral.mapOnClickListeners.push(dojo.connect(cadastral.map, "onClick", function (evt) {
					dojo.style("bufferWait", "display", "block");
					cadastral.map.graphics.clear();
					var params = new esri.tasks.BufferParameters();
					params.geometries = [evt.mapPoint];

					// Buffer in linear units such as meters, km, miles etc.
					params.distances = [dojo.byId('bufferDistance').value];
					params.unit = esri.tasks.GeometryService.UNIT_STATUTE_MILE;
					params.bufferSpatialReference = new esri.SpatialReference({ wkid: 102100 });
					params.outSpatialReference = cadastral.map.spatialReference;
					gsvc.buffer(params);
				}));

				// Listen for and handle the buffer complete event. This will draw the buffer polygon and run the query.
				dojo.connect(gsvc, "onBufferComplete", function (geometries) {
					var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 128, 255]), 2), new dojo.Color([0, 128, 255, 0.15]));
					//var symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 128, 255]), 2);
					var graphic = new esri.Graphic(geometries[0], symbol);
					cadastral.map.graphics.add(graphic);

					query.geometry = esri.geometry.webMercatorToGeographic(geometries[0]);
					query.outSpatialReference = { "wkid": 102100 };
					queryTask.execute(query);
				});

				// Listen for and handle the on complete event of the query.
				dojo.connect(queryTask, "onComplete", function (fset) {
					//create symbol for selected features
					var symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2);

					var parcelId = [];

					var resultFeatures = fset.features;
					for (var i = 0, il = resultFeatures.length; i < il; i++) {
						if (resultFeatures[i].attributes["PARCELID"] != " ") {
							parcelId.push(resultFeatures[i].attributes["PARCELID"]);
							var graphic = resultFeatures[i];
							graphic.setSymbol(symbol);
							cadastral.map.graphics.add(graphic);
						}
					}

					if (parcelId.length <= 60) {
						// Call SearchByGeocodeArray passing in the array of geocodes.
						dojo.xhrGet({
							url: "./Search/SearchByGeocodeArray",
							content: { geocodes: parcelId },
							handleAs: "json",
							load: function (rdata) {
								cadastral.base.showData(rdata, 'bufferResults');
							}
						});
					}
					else {
						cadastral.map.graphics.clear();
						dojo.style("bufferWait", "display", "none");
						alert("To large of a query. Please use a smaller buffer, especially in heavily populated areas.");
					}
				});

				dojo.connect(queryTask, "onError", function (error) { alert(error); });

				break;
			case "polygon":
				for (var i = 0; i < cadastral.toolbarOnDrawEndListeners.length; i++) {
					dojo.disconnect(cadastral.toolbarOnDrawEndListeners[i]);
				}
				dojo.addClass("polygonLi", "active");
				dojo.removeClass("bufferLi", "active");
				var queryTask = new esri.tasks.QueryTask(cadastral.parcelQueryUrl);
				var query = new esri.tasks.Query();
				query.returnGeometry = true;
				query.outFields = ["PARCELID", "PARCELNAME", "OWNERCLASSIFICATION", "PROPERTY_TYPE", "OWNER_NAME_1", "AREATYPE"];

				cadastral.map.graphics.clear();
				cadastral.toolbar.activate(esri.toolbars.Draw.POLYGON);
				//on draw end add graphic, project it, and get new length
				cadastral.toolbarOnDrawEndListeners.push(dojo.connect(cadastral.toolbar, "onDrawEnd", function (geometry) {
					cadastral.toolbar.deactivate();
					dojo.style("bufferWait", "display", "block");
					var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 128, 255]), 2), new dojo.Color([0, 128, 255, 0.15]));
					var graphic = new esri.Graphic(geometry, symbol);
					cadastral.map.graphics.add(graphic);

					var features = [];
					features.push(graphic);
					var featureSet = new esri.tasks.FeatureSet();
					featureSet.features = features;

					query.geometry = esri.geometry.webMercatorToGeographic(graphic.geometry);
					query.outSpatialReference = { "wkid": 102100 };
					queryTask.execute(query);
				}));

				// Listen for and handle the on complete event of the query.
				dojo.connect(queryTask, "onComplete", function (fset) {
					//create symbol for selected features
					var symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2);

					var parcelId = [];

					var resultFeatures = fset.features;
					for (var i = 0, il = resultFeatures.length; i < il; i++) {
						if (resultFeatures[i].attributes["PARCELID"] != " ") {
							parcelId.push(resultFeatures[i].attributes["PARCELID"]);
							var graphic = resultFeatures[i];
							graphic.setSymbol(symbol);
							cadastral.map.graphics.add(graphic);
						}
					}

					if (parcelId.length <= 60) {
						// Call SearchByGeocodeArray passing in the array of geocodes.
						dojo.xhrGet({
							url: "./Search/SearchByGeocodeArray",
							content: { geocodes: parcelId },
							handleAs: "json",
							load: function (rdata) {
								cadastral.base.showData(rdata, 'bufferResults');
							}
						});
					}
					else {
						cadastral.map.graphics.clear();
						dojo.style("bufferWait", "display", "none");
						alert("To large of a query. Please use a smaller polygon, especially in heavily populated areas.");
					}
				});

				dojo.connect(queryTask, "onError", function (error) {
					dojo.style("bufferWait", "display", "none");
					alert("An error occured. Please try again.");
				});

				break;
			default:
				break;
		}

		if (selectType !== "") {
			dojo.style(selectType, "display", "block");
		}

		if (cadastral.tools.prevSelectType !== "" && cadastral.tools.prevSelectType !== null && cadastral.tools.prevSelectType != selectType) {
			dojo.style(cadastral.tools.prevSelectType, "display", "none");
		}
		cadastral.tools.prevSelectType = selectType;
	},

	prevTool: "",

	displayTool: function (tool) {
		switch (tool) {
			case "identifyButton":
				for (var i = 0; i < cadastral.mapOnClickListeners.length; i++) {
					dojo.disconnect(cadastral.mapOnClickListeners[i]);
				}
				cadastral.mapOnClickListeners.push(dojo.connect(cadastral.map, "onClick", cadastral.identify.identifyIt));
				break;
			case "quickZoomSubContainer":
				dojo.byId("QuickZoomSelect").value = "";
				dojo.style(tool, "display", "block");
				break;
			case "bufferSubContainer":
				dojo.style(tool, "display", "block");
				break;
			case "measureButton":
				for (var i = 0; i < cadastral.mapOnClickListeners.length; i++) {
					dojo.disconnect(cadastral.mapOnClickListeners[i]);
				}
				dojo.style("distanceDiv", "visibility", "visible");
				cadastral.toolbar.activate(esri.toolbars.Draw.POLYLINE);
				//on draw end add graphic, project it, and get new length
				cadastral.toolbarOnDrawEndListeners.push(dojo.connect(cadastral.toolbar, "onDrawEnd", cadastral.measure.addToMap));
				cadastral.map.disablePan();
				break;
			default:
				break;
		}
		switch (cadastral.tools.prevTool) {
			case "quickZoomSubContainer":
				if (cadastral.tools.prevTool !== "") {
					dojo.style(cadastral.tools.prevTool, "display", "none");
				}
				if (cadastral.tools.prevQuery !== "") {
					dojo.style(cadastral.tools.prevQuery, "display", "none");
				}
				break;
			case "bufferSubContainer":
				dojo.style(cadastral.tools.prevTool, "display", "none");
				break;
			case "measureButton":
				dojo.style("distanceDiv", "visibility", "hidden");
				// turn off the measure tool
				cadastral.toolbar.deactivate();
				// clear out line drawn
				cadastral.map.graphics.clear();
				dojo.byId("distance").innerHTML = "";
				cadastral.map.enablePan();
				for (var i = 0; i < cadastral.toolbarOnDrawEndListeners.length; i++) {
					dojo.disconnect(cadastral.toolbarOnDrawEndListeners[i]);
				}
				break;
			default:
				break;
		}
		if (tool == cadastral.tools.prevTool) {
			cadastral.tools.prevTool = "";
		}
		else {
			cadastral.tools.prevTool = tool;
		}
	},

	showError: function (error) {
		alert(error);
	}
};
