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.