﻿cadastral.search = {
	/*
	Handles click event for the owner search button.
	*/
	ownerSearch: function () {
		dojo.style("ownerWait", "display", "block");
		dojo.byId("searchResultsPane").innerHTML = "";
		var name = dojo.byId("ownerNameInput").value;
		var countyId = dojo.byId("countySelect").value;
		if (countyId !== "" && name !== "") {
			dojo.xhrGet({
				url: "./Search/SearchByOwner",
				content: { ownerName: name, countyId: countyId },
				handleAs: "json",
				load: function (rdata) {
					cadastral.base.showData(rdata, 'searchResultsPane');
				}
			});
		}
		else {
			dojo.style("ownerWait", "display", "none");
			dojo.byId("searchResultsPane").innerHTML = "<span style=\"color:red;\">You must select a county and enter a name</span>";
		}
	},

	/*
	Handles click event for the geocode search button.
	*/
	geocodeSearch: function () {
		dojo.style("geocodeWait", "display", "block");
		var geocode = dojo.byId("geocodeInput").value;
		if (geocode !== "") {
			dojo.byId("geocodeResultsPane").innerHTML = "";
			dojo.xhrGet({
				url: "./Search/SearchBySingleGeocode",
				content: { geocode: geocode },
				handleAs: "json",
				load: function (rdata) {
					cadastral.base.showData(rdata, 'geocodeResultsPane');
				}
			});
		}
		else {
			dojo.style("geocodeWait", "display", "none");
			dojo.byId("geocodeResultsPane").innerHTML = "<p style=\"color:red;\">You must enter a value before searching.</p>";
		}
	},

	/*
	Handles click event for the geocode search button.
	*/
	assessmentSearch: function () {
		dojo.style("assessmentWait", "display", "block");
		var assessment = dojo.byId("assessmentInput").value;
		var countyId = dojo.byId("countyAssessmentSelect").value;
		if (assessment !== "") {
			dojo.byId("assessmentResultsPane").innerHTML = "";
			dojo.xhrGet({
				url: "./Search/SearchByAssessmentCode",
				content: { assessmentCode: assessment, countyId: countyId },
				handleAs: "json",
				load: function (rdata) {
					cadastral.base.showData(rdata, 'assessmentResultsPane');
				}
			});
		}
		else {
			dojo.style("assessmentWait", "display", "none");
			dojo.byId("assessmentResultsPane").innerHTML = "<p style=\"color:red;\">You must enter a value before searching.</p>";
		}
	},

	/*
	Handles click event for the geocode search button.
	*/
	certificateSearch: function () {
		dojo.style("certificateWait", "display", "block");
		var certificate = dojo.byId("certificateInput").value;
		var countyId = dojo.byId("countyCertSelect").value;
		if (certificate !== "") {
			dojo.byId("certificateResultsPane").innerHTML = "";
			dojo.xhrGet({
				url: "./Search/SearchByCertificate",
				content: { certificate: certificate, countyId: countyId },
				handleAs: "json",
				load: function (rdata) {
					cadastral.base.showData(rdata, 'certificateResultsPane');
				}
			});
		} else {
			dojo.style("certificateWait", "display", "none");
			dojo.byId("certificateResultsPane").innerHTML = "<p style=\"color:red;\">You must enter a value before searching.</p>";
		}
	},

	searchAddress: null,

	/*
	Handles the click event of the address search button.
	*/
	locateAddress: function (searchString, firstPass) {
		cadastral.search.searchAddress = null;
		cadastral.base.showLoading();
		cadastral.map.graphics.clear();
		var address = null;
		var add = searchString.split(",");
		if (add !== "") {
			if (add.length == 1 || firstPass === false) {
				address = {
					Street: add[0],
					City: "",
					State: "",
					Zip: ""
				};
			}
			else if (add.length == 2) {
				cadastral.search.searchAddress = searchString;
				if (isNaN(parseInt(add[1]))) {
					address = {
						Street: add[0],
						City: add[1],
						State: "",
						Zip: ""
					};
				}
				else {
					address = {
						Street: add[0],
						City: "",
						State: "",
						Zip: parseInt(add[1])
					};
				}
			}

			if (address.Street != undefined && address.Street !== "") {
				dojo.byId("addressSearchMessage").innerHTML = "";
				cadastral.addressLocator.addressToLocations(address, ["Match_addr", "Loc_name", "City", "ZIP"]);
			}
			else {
				cadastral.base.hideLoading();
				dojo.byId("addressSearchMessage").innerHTML = "<p style=\"color:red;\">Street address is required.</p>";
			}
		}
		else {
			cadastral.base.hideLoading();
			dojo.byId("addressSearchMessage").innerHTML = "<p style=\"color:red;\">Invalid parameters.</p>";
		}
	},

	locatorError: function (error) {
		if (error) {
			dojo.byId("addressSearchMessage").innerHTML = error.message + "<br />" + error.details;
		}
	},

	candidateArray: [],
	geomArray: [],

	/*
	Callback function for onAddressToLocationsComplete event
	*/
	getLocatorResults: function (candidates) {
		dojo.forEach(cadastral.search.candidateArray, function (candidate, i) {
			cadastral.search.candidateArray.pop();
		});
		if (candidates && candidates.length > 0) {
			var results = "<span>Did you mean:";
			// Puts every candidate that has a score over 80 into an array which we will use in the showlocations method
			// Checks the candidate.address. If this is a number, it is a zip code compare result which we do not want
			var j = 0;
			dojo.forEach(candidates, function (candidate, i) {
				if (candidate.score > 80 && isNaN(candidate.address)) {
					cadastral.search.candidateArray.push(candidate);
					cadastral.search.geomArray.push(candidate.location);
					var rowStyle = "";
					if (j % 2 === 0) {
						rowStyle = "searchResult";
					}
					else {
						rowStyle = "searchResultAltRow";
					}

					results += "<div class=\"" + rowStyle + "\" title=\"" + candidate.address + "\">";
					results += "<input type=\"button\" id=\"address" + i + "\" onclick=\"javascript:cadastral.search.goToAddress(" + j + ");cadastral.search.buttonClicked(this.id);\" value=\"" + candidate.address + "\" style=\"width:auto;font-size:7pt;text-align:left;color:blue;background:none;margin:0;padding:0;border:none;cursor:pointer;text-decoration:underline;\" /><br />";
					results += "</div>";
					j++;
				}
			});

			dojo.byId("addressSearchMessage").innerHTML = results;

			cadastral.search.showLocations(cadastral.search.geomArray);
		}
		else {
			// If we didn't get any results, try again but leave out the city or zip and just search on the street address. Some records
			// in the database do not have city data.
			if (cadastral.search.searchAddress !== null) {
				cadastral.search.locateAddress(cadastral.search.searchAddress, false);
			} else {
				cadastral.base.hideLoading();
				dojo.byId("addressSearchMessage").innerHTML = "<p>No matches for that address.</p>";
			}
		}
	},

	goToAddress: function (arrayIndex) {
		cadastral.base.showLoading();
		var candidate = cadastral.search.candidateArray[arrayIndex];
		if (candidate != undefined) {
			var geometryArray = [candidate.location];
			cadastral.search.showLocations(geometryArray);
		}
	},

	/*
	Callback function for onProjectComplete event accepting an array of geometries that were projected. We will loop through the array putting graphics on the map for each
	address located and determining the extent to set to show all matches.
	*/
	showLocations: function (geometries) {
		cadastral.map.graphics.clear();
		var symbol = new esri.symbol.PictureMarkerSymbol('content/images/pushpin-inactive.png', 25, 38).setOffset(0, 19); // new esri.symbol.SimpleMarkerSymbol();

		var maxX;
		var maxY;
		var minX;
		var minY;

		if (geometries && geometries.length > 0) {
			for (var i = 0; i < geometries.length; i++) {
				var geom = geometries[i];
				cadastral.map.graphics.add(new esri.Graphic(geom, symbol));
				// The points may be far apart. If so, figure out max extent and zoom to that
				if (i === 0) {
					maxX = geom.x;
					minX = geom.x;
					maxY = geom.y;
					minY = geom.y;
				}
				else {
					if (maxX < geom.x) {
						maxX = geom.x;
					}
					if (maxY < geom.y) {
						maxY = geom.y;
					}
					if (minX > geom.x) {
						minX = geom.x;
					}
					if (minY > geom.y) {
						minY = geom.y;
					}
				}
			}

			if (geometries.length == 1) {
				minX = minX - 200;
				minY = minY - 200;
				maxX = maxX + 200;
				maxY = maxY + 200;
			}
			else {
				minX = minX - 500;
				minY = minY - 500;
				maxX = maxX + 500;
				maxY = maxY + 500;
			}
		}

		var extent = new esri.geometry.Extent(minX, minY, maxX, maxY, new esri.SpatialReference({ wkid: 102100 }));

		cadastral.map.setExtent(extent, true);

		// Clear out the geomArray
		if (cadastral.search.geomArray && cadastral.search.geomArray.length > 0) {
			for (var i = 0; i <= cadastral.search.geomArray.length; i++) {
				cadastral.search.geomArray.splice(i, 1);
			}
		}
	},

	/*
	Set color of button text on search results after it is clicked.
	*/
	buttonClicked: function (buttonId) {
		dojo.style(buttonId, "color", "#800080");
	}
};
