PageSourceSearch

https://nyassembly.gov/scripts/all_inclusive_geocoding.js?v=1779824397

js nyassembly.gov collected 2026-10-01 08:46:23 UTC 30,909 bytes, 922 lines download raw bytes

1// this file created by Jami & Michael May 2024
2// Purpose: to reduce Google calls (save $) and have 1 geocoding script program
3// need to set up vars and change many files across the website 
4
5// vars from forms - needed for functionality
6var memberSearchForm = $("#form-member-search-form").val();
7var varGeocodeRedirect = $("#form-geocode-redirect-required").val();
8if(memberSearchForm==1){
9	var address;
10}
11
12//Globals to hold AD polygons.
13var ADCoords= [];
14var allADs = {};
15var ADPoly;
16var ADMultiPoly = [];
17var AssemblyDistrictKML;
18
19//Variables to hold drawn map objects for ability to remove if necessary.
20//var map;
21var marker = null;
22var selectedAD = 0;
23var googleLat = null;
24var googleLng = null;
25// map option vars for NYS
26var centerLat 	= 42.8; //43;
27var centerLng 	= -76;
28var mapZoom 	= 7; //6;
29var markerIcon = "https://maps.google.com/mapfiles/ms/micons/yellow.png";
30
31var latitude = 0;
32var longitude = 0;
33
34// filename
35var countyFile  = "/mem/map/county.kmz";
36var muniFile    = "/mem/map/muni.kmz";
37var villageFile = "/mem/map/village.kmz";
38var mapDivID = '';
39var allowInfobox = true;
40
41$(document).ready( function() {
42	if(memberSearchForm==1){
43		allowInfobox = false;
44		// set the map id (div that contains the map NYS with other details)
45		mapDivID = 'gmap_div';
46		//initializeMap();	
47	}
48
49	// user clicks member_search form submit button
50	$('form#member-search-form #form_submit').click(function(e){
51		submitMemberSearchForm(e);
52	});
53} );
54
55//Loads and draws NYS map to screen using the mapDivID (id of div). Sets center and zoom to NYS.
56function initializeMap() {
57
58	var mapOptions = {
59		center: { lat: centerLat, lng: centerLng},
60		scrollwheel: true,
61		zoom: mapZoom,
62		mapID: 'DEMO_MAP_ID'
63	};
64
65	geocoder = new google.maps.Geocoder();
66	map 	 = new google.maps.Map( document.getElementById(mapDivID), mapOptions);
67
68	var pointInPolygonURL = "/json/point_in_polygon_json.php";
69	
70	google.maps.event.addListener(map, "click", function (e) {
71    	//lat and lng is available in e object
72    	var latLng = e.latLng;
73    	var tempLatitude = latLng.lat();
74    	var tempLongitude = latLng.lng();
75    	console.log('Latitude '+tempLatitude);
76    	console.log('Longitude '+tempLongitude);
77    	marker = new google.maps.Marker({
78			map: map,
79			position: latLng,
80			icon: markerIcon
81        });
82
83    	// didnt work. reloaded page and lost lat and long
84        //getDistrictUsingPIP(pointInPolygonURL, latitude, longitude);
85
86	});
87}
88/*
89// zip function used for statefiar application. check statefair files for updated version
90async function zipInitializeMap(zip) {
91
92	const { Map } = await google.maps.importLibrary("maps");
93	const { AdvancedMarkerElement, PinElement } = await google.maps.importLibrary("marker");
94	console.log(zip);
95	
96	var district = 0;
97	$.ajax({	
98		url: "/json/get_center_zip_polygon.php",
99    	dataType: "json",
100    	type: "POST",
101    	async: false,
102    	data: { zip: zip }
103    })
104	.done(function(data) {
105	   	console.log(data.message);
106	   	if(data.center_lat != "" && data.center_long != ""){
107	   		centerLat = data.center_lat;
108			centerLng = data.center_long;
109			//mapZoom = 12;
110			district = data.district;
111			console.log(data.center_lat);
112			console.log(data.center_long);
113			console.log(data);
114	   	}
115	})
116	.fail(function(xhr, textStatus, errorThrown) {
117		console.log('AJAX fail');
118		console.log(textStatus);
119		console.log(errorThrown);
120		
121	});
122
123	if(district == 0){
124
125		var mapOptions = {
126			center: { lat: centerLat, lng: centerLng},
127			scrollwheel: true,
128			zoom: mapZoom,
129			mapID: 'DEMO_MAP_ID'
130		};
131		console.log(mapOptions);
132
133		map 	 = new google.maps.Map( document.getElementById(mapDivID), mapOptions);
134
135		kmlFile = 'https://nyassembly.gov/write/upload/zip_kml/zip_'+zip+'.kml';
136		ZipCodeKML = new google.maps.KmlLayer(
137		    	kmlFile, 
138				{ 	suppressInfoWindows: true, 
139					map: map, 
140					zIndex: 1,
141					preserveViewport: false 
142				} 
143			);
144		ZipCodeKML.setMap(map);
145
146		var pointInPolygonURL = "/json/point_in_polygon_json.php";
147		
148		google.maps.event.addListener(ZipCodeKML, "click", function (e) {
149	    	//lat and lng is available in e object
150	    	var latLng = e.latLng;
151	    	var tempLatitude = latLng.lat();
152	    	var tempLongitude = latLng.lng();
153	    	console.log('Latitude '+tempLatitude);
154	    	console.log('Longitude '+tempLongitude);
155	    	
156	    	marker = new google.maps.Marker({
157				map: map,
158				position: latLng,
159				icon: markerIcon
160	        });
161			
162	        getDistrictUsingPIP(pointInPolygonURL, tempLatitude, tempLongitude);
163
164		});
165	}
166	else{
167		getMemberInfo(district);
168    	markerIcon = "https://maps.google.com/mapfiles/ms/micons/red-dot.png";
169    	var addressArray = [['', '', '', '']]; // only 1 point for member search form
170		mapInitializeAD(district);
171	}
172}
173*/
174// from /mem/search - called after submit
175function submitMemberSearchForm(e) {
176
177	// prevent traditional form submission
178    e.preventDefault();
179
180    // remove special chars, leave space, and hyphens
181	var street 	= JSON.stringify($('#gmap_street').val()).replace(/[^\w\s\-]/gi, '');// /^[\w\-\s]+$/
182	var city 	= JSON.stringify($('#gmap_city').val()).replace(/[^\w\s\-]/gi, '');
183
184	$('#gmap_street').val(street);
185	$('#gmap_city').val(city);
186
187	// make sure form fields are filled out
188	if ( ($('#gmap_street').val() == '') || ($('#gmap_city').val() == '') || ($('#gmap_zip').val() == '')){
189		// error
190		// reset map functions
191		//clearMap('Please fill in all address fields');
192		$('#gmap_flds_div .gmap-msg').html('Please fill in all address fields');
193
194		if($('#gmap_street').val() == ''){
195			$('#gmap_street').addClass('error-input');
196		}
197		if($('#gmap_city').val() == ''){
198			$('#gmap_city').addClass('error-input');
199		}
200		if($('#gmap_zip').val() == ''){
201			$('#gmap_zip').addClass('error-input');
202		}
203	} 
204	else if(/(^\d{5}$)|(^\d{5}-\d{4}$)/.test($('#gmap_zip').val()) == false){
205		// check for valid zip
206		$('#gmap_zip').addClass('error-input');
207
208		//clearMap('Please enter a valid zip');
209		$('#gmap_flds_div .gmap-msg').html('Please enter a valid zip');
210	}
211	else{
212		// reset any error styles/messages
213		$('#gmap_flds_div .gmap-msg').html('Enter your address');
214
215		$('#gmap_flds_div .gmap-msg').removeClass('error');
216		$('#gmap_street').removeClass('error-input');
217		$('#gmap_city').removeClass('error-input');
218		$('#gmap_zip').removeClass('error-input');
219
220		// format for census ajax call
221		addressCensus = $('#gmap_street').val()+' '+$('#gmap_city').val()+' NY '+$('#gmap_zip').val();
222		var addressCensusFormated = addressCensus.replaceAll(' ', '+');
223		console.log(addressCensusFormated);
224
225		var street = $('#gmap_street').val();
226		var streetFormated = street.replace(' ', '+');
227		var city = $('#gmap_city').val();
228		var cityFormated = city.replace(' ', '+');
229		var zip = $('#gmap_zip').val();
230		
231		// look for address in table where previous stored addresses are found
232		// new function need - ajax call to table
233		console.log('check the geocoded_address table - using ajax call');
234		gaDistrict = 0;
235		$.ajax({	
236			url: "/json/search_store_geocoded_address_jsonp.php",
237        	dataType: "JSON",
238        	async: false,
239        	type: "POST",
240        	data: { addr1: street,
241					city: city,
242					zip: zip,
243					search: true
244				}
245		})
246	    .done(function(data) {
247	       	gaDistrict = data.district;
248	       	latitude = data.latitude;
249			longitude = data.longitude;
250	        console.log('search done latitude '+latitude);
251	         console.log('search done longitude '+longitude);
252	    })
253	    .fail(function(error) {
254			console.log('AJAX fail');
255		});
256	        
257		if(gaDistrict==0){
258			// geocode using US Census data (not Google)
259			//geocodeUsingNYSgis(address);
260			//geocodeUsingExternalSite(address); // no longer using 2025 - addresses were not being updated
261			geocodeUsingExternalSite(addressCensusFormated);
262		}
263		else{
264			$('#district-id').val(gaDistrict);
265		    $('#form-district').val(gaDistrict);
266		    
267		    if(varGeocodeRedirect == 1){ 
268			    geocodeRedirect(true);
269		    }
270		    else if(memberSearchForm == 1){
271		    	console.log('mem search district '+gaDistrict);
272		    	getMemberInfo(gaDistrict);
273		    	markerIcon = "https://maps.google.com/mapfiles/ms/micons/red-dot.png";
274		    	// addressArray (title, address, lat, long);
275		    	var addressArray = [['', address, latitude, longitude]]; // only 1 point for member search form
276		    	mapInitializeAD(gaDistrict, markerIcon, addressArray);
277		    }
278		}
279	}// else valid address entered
280} // end of submitMemberSearchForm
281
282// we should be naming functions more generically so that we don't need to change the actual code
283// only need to change script files
284function geocodeUsingExternalSite(address){
285	console.log('Using external site function');
286	geocodeUsingUSCensus(address);
287	//geocodeUsingNYSgis(address);
288}
289
290// uses the census server url
291// must send address in 1 line (ex. 1 Main St Albany NY 12201)
292// replaces the call to google using address 
293function geocodeUsingUSCensus(address){	
294    var pointInPolygonURL = "/json/point_in_polygon_json.php"; // program Jami wrote - uses formula to determine if lat,long point falls in the AD polygon
295    console.log('geocode using census start');
296    var gaDistrict = 0;
297    if(varGeocodeRedirect == 1){ 
298    	var street = $('#form-addr').val();
299		var city = $('#form-city').val();
300		var zip = $('#form-zip').val();
301		console.log('mem form geo callback street '+street+" city "+city+" zip "+zip);
302		$.ajax({	
303			url: "/json/search_store_geocoded_address_jsonp.php",
304        	dataType: "JSON",
305        	async: false,
306        	type: "POST",
307        	data: { addr1: street,
308					city: city,
309					zip: zip,
310					search: true
311				}
312		})
313	    .done(function(data) {
314	       	gaDistrict = data.district;
315	        console.log('search done district '+gaDistrict);
316	        if(gaDistrict > 0){
317				$('#district-id').val(gaDistrict);
318				$('#form-district').val(gaDistrict);
319		 
320				geocodeRedirect(true);
321
322				return true;
323			}
324	    })
325	    .fail(function(error) {
326			console.log('AJAX fail');
327		});
328    }
329    //https://gisservices.its.ny.gov/arcgis/rest/services/Locators/Street_and_Address_Composite/GeocodeServer/findAddressCandidates?Street=193+exchange+st&City=Albany&State=NY&ZIP=12205&matchOutOfRange=true&l&sourceCountry=United+States&f=pjson
330    //
331    var addressFound = true;
332    if(gaDistrict == 0){
333	    $.ajax({
334	        url: 'https://geocoding.geo.census.gov/geocoder/locations/onelineaddress?address='+address+'&benchmark=2020&format=jsonp',
335	        dataType: 'jsonp',
336		    //timeout: 1000, // sets timeout to 5000 = 5 seconds
337
338	        success: function(response) {
339	        	if(memberSearchForm==1){
340	        		zip = $('#gmap_zip').val();
341	        		console.log(zip);
342	        	}
343	        	else if(varGeocodeRedirect == 1){
344	        		zip = $('#form-zip').val();
345	        		console.log(zip);
346	        	}
347	            if(response.result.addressMatches['length']>0 && zip == response.result.addressMatches[0].addressComponents.zip && "NY" == response.result.addressMatches[0].addressComponents.state){
348	            	console.log('geocode using census success');
349	            	console.log(response.result.addressMatches[0].addressComponents.zip);
350	            	// longitude values are considered the x-coordinate, while latitude values are the y-coordinate
351	                latitude = response.result.addressMatches[0].coordinates.y;
352	                longitude = response.result.addressMatches[0].coordinates.x;
353	                console.log('address '+address+'lat '+latitude+' long '+longitude);
354	                ajaxSuccess = 1;
355	                getDistrictUsingPIP(pointInPolygonURL, latitude, longitude);
356	            }
357	            else{
358	            	console.log('geocode using census fail go to NYSgis');
359	            	geocodeUsingNYSgis(address);
360	            	/*
361	            	addressFound = false;
362	                $('#district-id').val(0);
363	                $('#form-district').val(0);
364	                if(varGeocodeRedirect == 1){ 
365		    			geocodeRedirect(true);
366	    			}
367	                if(memberSearchForm==1){
368	                	getMemberInfo(0);
369	                }
370	                */
371	            }
372	        },
373	        error: function(error) {
374	            console.log(error);
375	            addressFound = false;
376	            $('#district-id').val(0);
377	            if(memberSearchForm==1){
378	            	getMemberInfo(0);
379	            }
380	        }
381	    });
382	}
383    console.log('end of geocodeUsingUSCensus');
384} // geocodeUsingUSCensus
385
386function geocodeUsingNYSgis(address){	
387    var pointInPolygonURL = "/json/point_in_polygon_json.php"; // program Jami wrote - uses formula to determine if lat,long point falls in the AD polygon
388    console.log('geocode using NYSgis start');
389/*
390	var gaDistrict = 0;
391    if(varGeocodeRedirect == 1){ 
392    	var street = $('#form-addr').val();
393		var city = $('#form-city').val();
394		var zip = $('#form-zip').val();
395		console.log('mem form geo callback street '+street+" city "+city+" zip "+zip);
396		$.ajax({	
397			url: "/json/search_store_geocoded_address_jsonp.php",
398        	dataType: "JSON",
399        	async: false,
400        	type: "POST",
401        	data: { addr1: street,
402					city: city,
403					zip: zip,
404					search: true
405				}
406		})
407	    .done(function(data) {
408	       	gaDistrict = data.district;
409	        console.log('search done district '+gaDistrict);
410	        if(gaDistrict > 0){
411				$('#district-id').val(gaDistrict);
412				$('#form-district').val(gaDistrict);
413		 
414				geocodeRedirect(true);
415
416				return true;
417			}
418	    })
419	    .fail(function(error) {
420			console.log('AJAX fail');
421		});
422    }
423    //https://gisservices.its.ny.gov/arcgis/rest/services/Locators/Street_and_Address_Composite/GeocodeServer/findAddressCandidates?Street=193+exchange+st&City=Albany&State=NY&ZIP=12205&matchOutOfRange=true&l&sourceCountry=United+States&f=pjson
424    //https://gisservices.its.ny.gov/arcgis/rest/services/Locators/Street_and_Address_Composite/GeocodeServer/findAddressCandidates?SingleLine='+address+'&matchOutOfRange=true&l&sourceCountry=United+States&outSR=4326&f=pjson
425    //
426    var addressFound = true;
427    if(gaDistrict == 0){
428*/    	
429	    $.ajax({
430	        url: 'https://nysgeohub.ny.gov/arcgis/rest/services/Geocoder/NYS_Geocoder/GeocodeServer/findAddressCandidates?SingleLine='+address+'&matchOutOfRange=true&outSR=4326&f=pjson',
431	        dataType: 'jsonp',
432		    //timeout: 1000, // sets timeout to 5000 = 5 seconds
433
434	        success: function(response) {
435	        	console.log('response');
436	        	console.log(response);
437
438	        	if(memberSearchForm==1){
439	        		zip = $('#gmap_zip').val();
440	        		console.log("form zip "+zip);
441	        	}
442	        	else if(varGeocodeRedirect == 1){
443	        		zip = $('#form-zip').val();
444	        		console.log("form zip "+zip);
445	        	}
446	        	
447	        	if(response.candidates.length>0 && zip == response.candidates[0].address.substr(response.candidates[0].address.length - 5)){
448
449	        		latitude = response.candidates[0].location.y;
450	                longitude = response.candidates[0].location.x;
451	                console.log('address '+address+'lat '+latitude+' long '+longitude);
452	                ajaxSuccess = 1;
453	                getDistrictUsingPIP(pointInPolygonURL, latitude, longitude);
454	        	}
455	            else{
456	            	/*
457	            	if(memberSearchForm==1){
458	            		var googleAddress = $('#gmap_street').val() + ', ' +
459						$('#gmap_city').val() + ', NY ' +
460						$('#gmap_zip').val();
461	            	}
462	            	if(varGeocodeRedirect == 1){ 
463	            		var googleAddress = $('#form-addr').val() + ', ' +
464						$('#form-city').val() + ', NY ' +
465						$('#form-zip').val();
466				    }
467
468					geocoder = new google.maps.Geocoder();
469					geocoder.geocode( { 'address': googleAddress }, function( results, status ){
470						console.log(results[0].geometry.location.lat());
471						console.log(results[0].geometry.location.lng());
472						googleLat = results[0].geometry.location.lat()
473						googleLng = results[0].geometry.location.lng()
474					} );
475
476	            	if(googleLat != null && googleLng != null){
477	            		console.log('call point in poly with google lat lng');
478	            		getDistrictUsingPIP(pointInPolygonURL, googleLat, googleLng);
479	            	}
480	            	else{
481	            	*/
482	            		// adding non found address to see when they might be updated
483	            		var district = 0;
484	            		latitude = 0;
485						longitude = 0;
486	            		if(varGeocodeRedirect == 1){ 
487						    var street = $('#form-addr').val();
488							var city = $('#form-city').val();
489							var zip = $('#form-zip').val();
490							console.log('mem form geo callback street '+street+" city "+city+" zip "+zip);
491					    }
492					    else if(memberSearchForm == 1){
493						    var street = $('#gmap_street').val();
494							var city = $('#gmap_city').val();
495							var zip = $('#gmap_zip').val();
496							console.log('memsearch geo callback street '+street+" city "+city+" zip "+zip);
497						}
498
499					    $.ajax({	
500							url: "/json/search_store_geocoded_address_jsonp.php",
501					    	dataType: "json",
502					    	type: "POST",
503					    	async: false,
504					    	data: { addr1: street,
505									city: city,
506									zip: zip,
507									district: district,
508									latitude: latitude,
509									longitude: longitude,
510									store: true
511							}
512					    })
513						.done(function(data) {
514						   	console.log(data.message);
515						})
516						.fail(function(xhr, textStatus, errorThrown) {
517							console.log('AJAX fail');
518							console.log(errorThrown);
519							
520						});
521
522		            	addressFound = false;
523		                $('#district-id').val(0);
524		                $('#form-district').val(0);
525		                if(varGeocodeRedirect == 1){ 
526			    			geocodeRedirect(true);
527		    			}
528		                if(memberSearchForm==1){
529		                	getMemberInfo(0);
530		                }
531		            //}
532	            }
533	        },
534	        error: function(error) {
535	            console.log(error);
536	            addressFound = false;
537	            $('#district-id').val(0);
538	            if(memberSearchForm==1){
539	            	getMemberInfo(0);
540	            }
541	        }
542	    });
543	//} end if district 0
544	console.log('end of geocodeUsingNYSgis');
545} // geocodeUsingUSCensus
546
547// called from geocodeUsingCensus
548// send the URL, lat & long to the pointInPolygonURL (/json/point_in_polygon_json.php) on our server
549// calls the json callback geocodedDistrictCallBack
550function getDistrictUsingPIP(pointInPolygonURL,lat,long){
551
552    var pointInPolygonURL = pointInPolygonURL+'?latitude='+lat+'&longitude='+long;
553    $.ajax({
554        url: pointInPolygonURL,
555        dataType: "jsonp",
556        success: function(response) {
557            console.log('success');
558        },
559        error: function(error) {
560            console.log(error);
561        }
562    });
563} // getDistrictUsingPIP
564
565// sets district to element of json object
566// then sets using id of district-id (input hidden field in calling program)
567function geocodedDistrictCallBack(json){
568
569	console.log(json);
570    var district = json[0].geocoded_district;
571    latitude = json[0].latitude;
572	longitude = json[0].longitude;
573    console.log('district '+district);
574    $('#district-id').val(district);
575    $('#form-district').val(district);
576
577    if(varGeocodeRedirect == 1){ 
578	    var street = $('#form-addr').val();
579		var city = $('#form-city').val();
580		var zip = $('#form-zip').val();
581		console.log('mem form geo callback street '+street+" city "+city+" zip "+zip);
582    }
583    else if(memberSearchForm == 1){
584	    var street = $('#gmap_street').val();
585		var city = $('#gmap_city').val();
586		var zip = $('#gmap_zip').val();
587		console.log('memsearch geo callback street '+street+" city "+city+" zip "+zip);
588	}
589
590    $.ajax({	
591		url: "/json/search_store_geocoded_address_jsonp.php",
592    	dataType: "json",
593    	type: "POST",
594    	async: false,
595    	data: { addr1: street,
596				city: city,
597				zip: zip,
598				district: district,
599				latitude: latitude,
600				longitude: longitude,
601				store: true
602		}
603    })
604	.done(function(data) {
605	   	console.log(data.message);
606	})
607	.fail(function(xhr, textStatus, errorThrown) {
608		console.log('AJAX fail');
609		console.log(errorThrown);
610		
611	});
612    
613    if(varGeocodeRedirect == 1){ 
614	    geocodeRedirect(true);
615    }
616    else if(memberSearchForm == 1){
617    	console.log('mem search district '+district);
618    	getMemberInfo(district);
619    	if (district > 0){
620	    	markerIcon = "https://maps.google.com/mapfiles/ms/micons/red-dot.png";
621	    	// addressArray (title, address, lat, long);
622	    	var addressArray = [['', address, latitude, longitude]]; // only 1 point for member search form
623	    	mapInitializeAD(district, markerIcon, addressArray);
624	    }
625    }
626} // geocodedDistrictCallBack
627
628// used to add the correct ordinal suffix to the district number
629function ordinal_suffix_of(i) {
630    var j = i % 10,
631        k = i % 100;
632    if (j == 1 && k != 11) {
633        return i + "st";
634    }
635    if (j == 2 && k != 12) {
636        return i + "nd";
637    }
638    if (j == 3 && k != 13) {
639        return i + "rd";
640    }
641    return i + "th";
642}
643
644// AJAX function to get the member information for /mem/search form
645// uses the newly acquired AD from point_in_polygon 
646// queries table from database on server (ad_lat_long)
647function getMemberInfo( gDistrict ){
648	if(gDistrict != 0){
649		$.ajax( {
650			type: "POST",
651			url: "/mem/search/mem_search_ajax_data.php",
652			dataType: "JSON",
653			/* needs to be in brackets - looked at as an array */
654			data: { form_district: gDistrict },
655
656			success: function(data){
657				// -- the AJAX request has succeeded (sent form info and retrieved the JSON data from outside file at @dataURL )
658				// parse the json_encode() string that's been returned
659				// so that we can access it nicely with array/object syntax; jsonData['member.member_id']
660				// var newData = JSON.stringify(data); 
661				// converts a JavaScript object to a string representation of it
662				var jsonData = data; //JSON.parse(newData); // can't parse objects
663
664				// set up member data vars
665				//var memberID		= jsonData['member.member_id']+jsonData['member.member_dist_suffix'];
666				var memberID		= jsonData['member.member_id'];
667				memSuffix = ordinal_suffix_of(memberID);
668				var memberID = memSuffix;
669				var memberDistrict	= jsonData['member.member_district'];
670
671				var memberUrl 		= jsonData['member.url_tcase'];
672				var memberPageUrl	= '/mem/'+memberUrl;
673				var memberMapUrl    = '/mem/'+memberUrl+'/map/';
674				var memberImgSrc	= '/write/upload/member_files/'+memberDistrict+'/headshot/'+memberDistrict+'.jpg';
675
676				var memberPrefix 	= jsonData['member.member_prefix'];
677				var memberFirstName = jsonData['member.member_first_name'];
678				var memberMid 		= jsonData['member.member_mid'];
679				var memberLastName 	= jsonData['member.member_last_name'];
680				var memberSuffix 	= jsonData['member.member_suffix'];
681				var memberStatus	= jsonData['member.member_status'];
682
683				var memberName = '';
684
685				// build member name
686				if(memberPrefix.length > 0){
687					memberName += memberPrefix+'. ';
688				}
689
690				memberName += memberFirstName+' ';
691
692				if(memberMid.length > 0){
693					memberName += memberMid+'. ';
694				}
695
696				memberName += memberLastName+' ';
697
698				if(memberSuffix.length > 0){
699					memberName += memberSuffix+', ';
700				}
701
702				//-- populate details div with the proper data
703
704				// set all links to member's page
705				$('.gmap-msg').show();
706				if(memberStatus=='T'){
707					$('#gmap_det_div #mem-photo a img').hide();
708					$('#gmap_det_div #mem-dist').hide();
709					$('#gmap_det_div .gmap-msg p').html('Your District Is');
710					$('#gmap_det_div #mem-info .button').html('View District Page');
711				}
712				else {
713					$('#gmap_det_div #mem-photo a img').show();
714					$('#gmap_det_div #mem-dist').show();
715					$('#gmap_det_div #mem-photo a img').attr('src', memberImgSrc);
716					$('#gmap_det_div #mem-name a').show();					
717					$('#mem-link').show();
718					$('#mem-link-map').show();
719				}
720				$('#gmap_det_div a').attr('href', memberPageUrl);
721				$('#gmap_det_div #mem-link-map').attr('href', memberMapUrl);
722
723				$('#gmap_det_div #mem-name a').html(memberName);
724
725				$('#gmap_det_div #mem-dist').html(memberID+' Assembly District');
726
727				// show member details div
728				$('#gmap_det_div').show('fast');
729
730	        },
731	        error: function(xhr, textStatus, errorThrown){
732
733	          //-- There was an error with the AJAX request
734
735	          // console.log(xhr.responseText); // display the content of the file found at @dataURL
736	          // console.log(xhr.textStatus);
737	          console.log(errorThrown); // description of the type of error
738
739	          // clear the map & divs of data and overlays
740	          //clearMap('');
741	        }
742		} );
743	} // <>0
744	else{
745		// 3/20/2026 jami added console.log and commented out clear map - there is no longer a map to clear - was causing a js error
746		console.log('no member found');	
747		$("#gmap_div").css("display", "none");	
748		//clearMap('');
749		// Need a timeout somewhere - this is getting called
750		$('#gmap_det_div #mem-name a').hide();
751		$('#gmap_det_div #mem-photo a img').hide();
752		$('.gmap-msg').hide();
753		$('#mem-link').hide();
754		$('#mem-link-map').hide();
755		$('#gmap_det_div #mem-dist').html('No Assembly District found for address entered');
756		$('#gmap_det_div').show();		
757	}
758} // end of getMemberInfo
759
760
761// Function to clear map on bad search.
762function clearMap(clearMsg){
763	
764	// Clear any overlays and markers.
765	if( marker ){
766		marker.setMap( null );
767		marker = null;
768	}
769
770	if(AssemblyDistrictKML){
771		// clear kml if it exists
772		AssemblyDistrictKML.setMap(null);
773	}
774
775	// Recenter map on NYS
776	map.setCenter( { lat: centerLat, lng: centerLng } );
777	map.setZoom( mapZoom );
778
779} // clearMap
780
781// new function to overlay kml files and other kml files onto state map
782// add markers if addresses are available
783async function mapInitializeAD(district, markerIcon, addressArray) {
784
785	$('#gmap_div').removeAttr('style');
786
787    const { Map } = await google.maps.importLibrary("maps");
788    //const {AdvancedMarkerElement} = await google.maps.importLibrary("marker");
789    const { AdvancedMarkerElement, PinElement } = await google.maps.importLibrary("marker");
790
791    var NewYorkState = new google.maps.LatLng(centerLat, centerLng);
792	var mapOptions = { zoom: 6, center: NewYorkState, mapTypeId: google.maps.MapTypeId.ROADMAP, mapID: "DEMO_MAP_ID" }
793
794    // Overlay the inital map.//
795    map = new google.maps.Map(document.getElementById(mapDivID), mapOptions);
796
797    console.log('mapdiv: '+mapDivID);
798
799    kmlFile = 'https://nyassembly.gov/mem/map/ad'+district+'.kml';
800    //Load the KML files but don't render them yet 
801    AssemblyDistrictKML = new google.maps.KmlLayer(
802    	kmlFile, 
803		{ 	suppressInfoWindows: true, 
804			map: map, 
805			zIndex: 1,
806			preserveViewport: false 
807		} 
808	);
809
810	if(memberSearchForm!=1){
811		var NYCounty = new google.maps.KmlLayer(
812			countyFile, 
813			{ 	suppressInfoWindows: true, 
814				map: map, 
815				zIndex: 2,
816				preserveViewport: true 
817			} 
818		);
819
820		var NYmuni = new google.maps.KmlLayer(
821			muniFile, 
822			{ 	suppressInfoWindows: false, 
823				map: map, 
824				zIndex: 3,
825				preserveViewport: true 
826			} 
827		);
828	} // memberSearchForm<>1
829
830	AssemblyDistrictKML.setMap(map);
831
832	// set county and muni lines if not on member search page
833	if(memberSearchForm!=1){
834		google.maps.event.addListener(AssemblyDistrictKML, "metadata_changed", function() { NYCounty.setMap(map); });
835		google.maps.event.addListener(NYCounty, "metadata_changed", function() { NYmuni.setMap(map); });
836
837		/* 
838			The village lines KMZ file is tiny and easy for the browser to render. To ensure it doesn't get loaded or 
839			called too early, we to create the object and load it until all the other layers have called metadata_chagned. If we want
840			village names to pop up, this must be loaded last, so not to be covered up by the Towns that villages are in. 
841		*/
842		google.maps.event.addListener(NYmuni, "metadata_changed", function() { 
843			var NYvillage = new google.maps.KmlLayer(villageFile, 
844			{ 	suppressInfoWindows: false, 
845				map: map, 
846				zIndex: 6,
847				preserveViewport: true } 
848			);
849			NYvillage.setMap(map); 
850		});
851	}
852	
853    // addresses (lat, long elements for markers on map)
854    addressArray.forEach(function(addr) {
855	    //var latlng = new google.maps.LatLng(addr[2],addr[3]);
856	    var tmpLat = parseFloat(addr[2]);
857	    var tmpLong = parseFloat(addr[3]);
858	    const addrPos = { lat: tmpLat, lng: tmpLong };
859	    console.log(addr);
860	    
861	    var marker = new google.maps.Marker({
862			map: map,
863			position: addrPos,
864			icon: markerIcon
865        });
866        /*
867        marker = new google.maps.marker.AdvancedMarkerElement({
868	        map: map,
869	        position: addrPos,
870	        title: 'Office',
871	    });
872	    */
873		if(marker && allowInfobox){
874	    	// replace dashes - not allowed in JS
875	    	var tmpAddr = addr[0];
876	    	
877			// HTML in the infobox (popup balloon)
878			html = '<div style="font-size: 80%; font-family: arial;"><h3>'+tmpAddr+'</h3><p>'+addr[1]+'</p><p><a href="https://maps.google.com/maps?q='+encodeURIComponent(addr[1])+'" target="_new">'+addr[0]+' Directions</a></p></div>';
879
880			var infowindow = new google.maps.InfoWindow({ maxWidth: 300, content: html });
881			google.maps.event.addListener(marker, 'click', function() {
882				infowindow.open(map, marker);				
883			});
884		} // marker
885	}); // foreach
886}// mapInitializeAD
887
888
889
890function geocodeRedirect(ADReady){
891
892	const submit1 = document.getElementById("form-submit");
893	const submit2 = document.createElement("input");
894
895	submit2.type = "submit";
896	submit2.value = "submit";
897	submit2.name = "form_submit2";
898	submit2.style.display = "none";
899
900	const formId = $('form').attr('id');
901
902	console.log(formId);
903
904	document.getElementById(formId).appendChild(submit2);
905
906	submit1.value = "Sending...";
907
908	const ADChecker = setInterval(() => {
909	  console.log("Checking");
910	  if (ADReady)
911	  {
912	    $('#'+formId).attr('action', action);
913	    var formAction = $('#'+formId).attr('action');
914	    //alert(formAction);
915	  	document.getElementById(formId).requestSubmit(submit2);
916
917	  	clearInterval(ADChecker);
918	  	console.log("cleared");
919	  }
920	  
921	}, 100);
922} // geocodeRedirect

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.