1var WPGM_Path_Polygon = new Array(); 2var WPGM_Path = new Array(); 3var infoWindow_poly = Array(); 4 5for (var entry in wpgmaps_localize) { 6 if ('undefined' === typeof window.jQuery) { 7 setTimeout(function(){ document.getElementById('wpgmza_map').innerHTML = 'Error: In order for WP Google Maps to work, jQuery must be installed. A check was done and jQuery was not present. Please see the <a href="http://www.wpgmaps.com/documentation/troubleshooting/jquery-troubleshooting/" title="WP Google Maps - jQuery Troubleshooting">jQuery troubleshooting section of our site</a> for more information.'; }, 5000); 8 } 9} 10 11function wpgmza_parse_theme_data(raw) 12{ 13 14 var json; 15 16 try{ 17 json = JSON.parse(raw); 18 }catch(e) { 19 try{ 20 json = eval(raw); 21 }catch(e) { 22 console.warn("Couldn't parse theme data"); 23 return []; 24 } 25 } 26 27 return json; 28} 29 30function InitMap() { 31 var myLatLng = new google.maps.LatLng(wpgmaps_localize[wpgmaps_mapid].map_start_lat,wpgmaps_localize[wpgmaps_mapid].map_start_lng); 32 33 if(typeof wpgmza_override_zoom !== "undefined") 34 MYMAP.init('#wpgmza_map', myLatLng, parseInt(wpgmza_override_zoom)); 35 else 36 MYMAP.init('#wpgmza_map', myLatLng, parseInt(wpgmaps_localize[wpgmaps_mapid].map_start_zoom)); 37 38 UniqueCode=Math.round(Math.random()*10000); 39 40 MYMAP.placeMarkers(wpgmaps_markerurl+'?u='+UniqueCode,wpgmaps_localize[wpgmaps_mapid].id,null,null,null); 41 42 if(wpgmaps_localize[wpgmaps_mapid].other_settings.store_locator_style == 'modern') 43 { 44 MYMAP.modernStoreLocator = new WPGMZA.ModernStoreLocator(wpgmaps_mapid); 45 wpgmza_create_places_autocomplete(); 46 } 47} 48 49 50 51jQuery(function() { 52 53 jQuery(document).ready(function(){ 54 55 // Fastclick adapation 56 jQuery(document).on({'DOMNodeInserted': function() { 57 jQuery('.pac-item, .pac-item span', this).addClass('needsclick'); 58 } 59 }, '.pac-container'); 60 61 if (/1\.([0-7])\.([0-9])/.test(jQuery.fn.jquery)) { 62 setTimeout(function(){ 63 document.getElementById('wpgmza_map').innerHTML = 'Error: Your version of jQuery is outdated. WP Google Maps requires jQuery version 1.7+ to function correctly. Go to Maps->Settings and check the box that allows you to over-ride your current jQuery to try eliminate this problem.'; 64 }, 6000); 65 } else { 66 var temp; 67 var selector = "#wpgmza_map"; 68 var mapElement = jQuery(selector); 69 70 var width = wpgmaps_localize[wpgmaps_mapid]['map_width']+wpgmaps_localize[wpgmaps_mapid]['map_width_type']; 71 var height = wpgmaps_localize[wpgmaps_mapid]['map_height']+wpgmaps_localize[wpgmaps_mapid]['map_height_type']; 72 73 if((temp = mapElement.attr("data-shortcode-width")) != "inherit") 74 width = temp; 75 if((temp = mapElement.attr("data-shortcode-height")) != "inherit") 76 height = temp; 77 78 mapElement.css({ 79 width: width, 80 height: height 81 }); 82 83 InitMap(); 84 jQuery('body').on('tabsactivate', function(){setTimeout(function(){InitMap();}, 500); }); 85 jQuery('body').on('tabsshow', function(){setTimeout(function(){InitMap();}, 500); }); 86 jQuery('body').on('accordionactivate', function(){setTimeout(function(){InitMap();}, 500); }); 87 jQuery('body').on('click', '.wpb_tabs_nav li', function(){setTimeout(function(){InitMap();}, 500); }); 88 jQuery('body').on('click', '.ui-tabs-nav li', function(event, ui) { InitMap(); }); 89 jQuery('body').on('click', '.tp-tabs li a', function(event, ui) { InitMap(); }); 90 jQuery('body').on('click', '.nav-tabs li a', function(event, ui) { InitMap(); }); 91 jQuery('body').on('click', '.vc_tta-panel-heading', function(){setTimeout(function(){InitMap();}, 500); }); 92 jQuery('body').on('click', '.ult_exp_section',function(){setTimeout(function(){InitMap();}, 500); }); 93 jQuery('body').on('click', '.x-accordion-heading', function(){setTimeout(function(){InitMap();}, 500); }); 94 jQuery('body').on('click', '.x-nav-tabs li', function(){setTimeout(function(){InitMap();}, 500); }); 95 jQuery('body').on('click', '.tab-title', function(){setTimeout(function(){InitMap();}, 500); }); 96 jQuery('body').on('click', '.tab-link', function(){setTimeout(function(){InitMap();}, 500); }); 97 jQuery('body').on('click', '.et_pb_tabs_controls li', function(){setTimeout(function(){InitMap();}, 500); }); 98 jQuery('body').on('click', '.fusion-tab-heading', function(){setTimeout(function(){InitMap();}, 500); }); 99 jQuery('body').on('click', '.et_pb_tab', function(){setTimeout(function(){InitMap();}, 500); }); 100 jQuery('body').on('click', '.tri-tabs-nav span', function(){setTimeout(function(){InitMap();}, 500); }); 101 jQuery('body').on('click', '.gdl-tabs li', function(){setTimeout(function(){InitMap();}, 500); }); 102 jQuery('body').on('click', '#tabnav li', function(){setTimeout(function(){InitMap();}, 500); }); 103 } 104 }); 105}); 106 107var MYMAP = { 108 map: null, 109 bounds: null 110} 111 112if (wpgmaps_localize_global_settings['wpgmza_settings_map_draggable'] === "" || 'undefined' === typeof wpgmaps_localize_global_settings['wpgmza_settings_map_draggable']) { wpgmza_settings_map_draggable = true; } else { wpgmza_settings_map_draggable = false; } 113if (wpgmaps_localize_global_settings['wpgmza_settings_map_clickzoom'] === "" || 'undefined' === typeof wpgmaps_localize_global_settings['wpgmza_settings_map_clickzoom']) { wpgmza_settings_map_clickzoom = false; } else { wpgmza_settings_map_clickzoom = true; } 114if (wpgmaps_localize_global_settings['wpgmza_settings_map_scroll'] === "" || 'undefined' === typeof wpgmaps_localize_global_settings['wpgmza_settings_map_scroll']) { wpgmza_settings_map_scroll = true; } else { wpgmza_settings_map_scroll = false; } 115if (wpgmaps_localize_global_settings['wpgmza_settings_map_zoom'] === "" || 'undefined' === typeof wpgmaps_localize_global_settings['wpgmza_settings_map_zoom']) { wpgmza_settings_map_zoom = true; } else { wpgmza_settings_map_zoom = false; } 116if (wpgmaps_localize_global_settings['wpgmza_settings_map_pan'] === "" || 'undefined' === typeof wpgmaps_localize_global_settings['wpgmza_settings_map_pan']) { wpgmza_settings_map_pan = true; } else { wpgmza_settings_map_pan = false; } 117if (wpgmaps_localize_global_settings['wpgmza_settings_map_type'] === "" || 'undefined' === typeof wpgmaps_localize_global_settings['wpgmza_settings_map_type']) { wpgmza_settings_map_type = true; } else { wpgmza_settings_map_type = false; } 118if (wpgmaps_localize_global_settings['wpgmza_settings_map_streetview'] === "" || 'undefined' === typeof wpgmaps_localize_global_settings['wpgmza_settings_map_streetview']) { wpgmza_settings_map_streetview = true; } else { wpgmza_settings_map_streetview = false; } 119if (wpgmaps_localize_global_settings['wpgmza_settings_map_full_screen_control'] === "" || 'undefined' === typeof wpgmaps_localize_global_settings['wpgmza_settings_map_full_screen_control']) { wpgmza_settings_map_full_screen_control = true; } else { wpgmza_settings_map_full_screen_control = false; } 120 121if ('undefined' === typeof wpgmaps_localize[wpgmaps_mapid]['other_settings']['map_max_zoom'] || wpgmaps_localize[wpgmaps_mapid]['other_settings']['map_max_zoom'] === "") { wpgmza_max_zoom = 0; } else { wpgmza_max_zoom = parseInt(wpgmaps_localize[wpgmaps_mapid]['other_settings']['map_max_zoom']); } 122if ('undefined' === typeof wpgmaps_localize[wpgmaps_mapid]['other_settings']['map_min_zoom'] || wpgmaps_localize[wpgmaps_mapid]['other_settings']['map_min_zoom'] === "") { wpgmza_min_zoom = 21; } else { wpgmza_min_zoom = parseInt(wpgmaps_localize[wpgmaps_mapid]['other_settings']['map_min_zoom']); } 123 124function wpgmza_create_places_autocomplete() { 125 126 var elementExists = document.getElementById("addressInput"); 127 128 if (typeof google === 'object' && typeof google.maps === 'object' && typeof google.maps.places === 'object' && typeof google.maps.places.Autocomplete === 'function') { 129 130 // user autofill 131 if (elementExists !== null) { 132 if (typeof wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_store_locator_restrict'] === "undefined" || wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_store_locator_restrict'] === "" ) { 133 /* initialize the autocomplete form */ 134 autocomplete = new google.maps.places.Autocomplete( 135 /** @type {HTMLInputElement} */(document.getElementById('addressInput')), 136 { types: ['geocode'] }); 137 // When the user selects an address from the dropdown, 138 // populate the address fields in the form. 139 google.maps.event.addListener(autocomplete, 'place_changed', function() { 140 fillInAddress(); 141 }); 142 } else { 143 /* initialize the autocomplete form */ 144 autocomplete = new google.maps.places.Autocomplete( 145 /** @type {HTMLInputElement} */(document.getElementById('addressInput')), 146 { types: ['geocode'], componentRestrictions: {country: wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_store_locator_restrict']} }); 147 // When the user selects an address from the dropdown, 148 // populate the address fields in the form. 149 google.maps.event.addListener(autocomplete, 'place_changed', function() { 150 fillInAddress(); 151 }); 152 } 153 } 154 } 155} 156 157MYMAP.init = function(selector, latLng, zoom) { 158 159 if (typeof wpgmaps_localize[wpgmaps_mapid].type !== "undefined") { 160 if (wpgmaps_localize[wpgmaps_mapid].type === "1") { maptype = google.maps.MapTypeId.ROADMAP; } 161 else if (wpgmaps_localize[wpgmaps_mapid].type === "2") { maptype = google.maps.MapTypeId.SATELLITE; } 162 else if (wpgmaps_localize[wpgmaps_mapid].type === "3") { maptype = google.maps.MapTypeId.HYBRID; } 163 else if (wpgmaps_localize[wpgmaps_mapid].type === "4") { maptype = google.maps.MapTypeId.TERRAIN; } 164 else { maptype = google.maps.MapTypeId.ROADMAP; } 165 } else { 166 maptype = google.maps.MapTypeId.ROADMAP; 167 } 168 169 var myOptions = { 170 zoom:zoom, 171 minZoom: wpgmza_max_zoom, 172 maxZoom: wpgmza_min_zoom, 173 center: latLng, 174 zoomControl: wpgmza_settings_map_zoom, 175 panControl: wpgmza_settings_map_pan, 176 mapTypeControl: wpgmza_settings_map_type, 177 streetViewControl: wpgmza_settings_map_streetview, 178 draggable: wpgmza_settings_map_draggable, 179 disableDoubleClickZoom: wpgmza_settings_map_clickzoom, 180 scrollwheel: wpgmza_settings_map_scroll, 181 fullscreenControl: wpgmza_settings_map_full_screen_control, 182 mapTypeId: maptype 183 } 184 185 if(typeof wpgmza_force_greedy_gestures !== "undefined"){ 186 myOptions.gestureHandling = wpgmza_force_greedy_gestures; 187 } 188 189 // NB: Perry: Moved this block up here and altered it so it plays nicely with other maps styles settings 190 if ("undefined" !== typeof wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_theme_data'] && wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_theme_data'] !== false && wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_theme_data'] !== "") { 191 if(!myOptions.styles) 192 myOptions.styles = []; 193 194 wpgmza_theme_data = wpgmza_parse_theme_data(wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_theme_data']); 195 myOptions.styles = myOptions.styles.concat(wpgmza_theme_data); 196 } 197 198 if(!wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_show_points_of_interest']) 199 { 200 // Only create a new array if styles aren't set already, so no existing styles are overwritten 201 if(!myOptions.styles) 202 myOptions.styles = []; 203 204 // Push a style to hide all points of interest 205 myOptions.styles.push( 206 { 207 featureType: "poi", 208 stylers: [{visibility: "off"}] 209 } 210 ); 211 } 212 213 var element = jQuery(selector)[0]; 214 this.map = new google.maps.Map(element, myOptions); 215 this.bounds = new google.maps.LatLngBounds(); 216 217 if(MYMAP.modernStoreLocator) 218 { 219 MYMAP.modernStoreLocator.element.index = 1; 220 this.map.controls[google.maps.ControlPosition.TOP_CENTER].push(MYMAP.modernStoreLocator.element); 221 wpgmza_create_places_autocomplete(); 222 } 223 224 /*var map = this.map; 225 google.maps.event.addDomListener(window, "resize", function() { 226 var center = map.getCenter(); 227 google.maps.event.trigger(map, "resize"); 228 map.setCenter(center); 229 });*/ 230 231 jQuery( "#wpgmza_map").trigger( 'wpgooglemaps_loaded' ); 232 233 if (wpgmaps_localize_polygon_settings !== null) { 234 if (typeof wpgmaps_localize_polygon_settings !== "undefined") { 235 for(var poly_entry in wpgmaps_localize_polygon_settings) { 236 add_polygon(poly_entry); 237 } 238 } 239 } 240 if (wpgmaps_localize_polyline_settings !== null) { 241 if (typeof wpgmaps_localize_polyline_settings !== "undefined") { 242 for(var poly_entry in wpgmaps_localize_polyline_settings) { 243 add_polyline(poly_entry); 244 } 245 } 246 } 247 if (wpgmaps_localize[wpgmaps_mapid]['bicycle'] === "1") { 248 var bikeLayer = new google.maps.BicyclingLayer(); 249 bikeLayer.setMap(MYMAP.map); 250 } 251 if (wpgmaps_localize[wpgmaps_mapid]['traffic'] === "1") { 252 var trafficLayer = new google.maps.TrafficLayer(); 253 trafficLayer.setMap(MYMAP.map); 254 } 255 256 if ("undefined" !== typeof wpgmaps_localize[wpgmaps_mapid]['other_settings']['transport_layer'] && wpgmaps_localize[wpgmaps_mapid]['other_settings']['transport_layer'] === 1) { 257 var transitLayer = new google.maps.TransitLayer(); 258 transitLayer.setMap(MYMAP.map); 259 } 260 261 google.maps.event.addListener(MYMAP.map, 'click', function() { 262 infoWindow.close(); 263 }); 264 265 window.addEventListener("keydown", function(e) { 266 var k = (e.which ? e.which : e.keyCode); 267 if(k == 27) 268 infoWindow.close(); 269 }); 270} 271 272var infoWindow = new google.maps.InfoWindow(); 273if (typeof wpgmaps_localize_global_settings['wpgmza_settings_infowindow_width'] !== "undefined" && wpgmaps_localize_global_settings['wpgmza_settings_infowindow_width'] !== "") { infoWindow.setOptions({maxWidth:wpgmaps_localize_global_settings['wpgmza_settings_infowindow_width']}); } 274 275google.maps.event.addDomListener(window, 'resize', function() { 276 var myLatLng = new google.maps.LatLng(wpgmaps_localize[wpgmaps_mapid].map_start_lat,wpgmaps_localize[wpgmaps_mapid].map_start_lng); 277 MYMAP.map.setCenter(myLatLng); 278}); 279 280if(!window.WPGMZA) 281 window.WPGMZA = {}; 282 283WPGMZA.KM_PER_MILE = 1.60934; 284WPGMZA.MILE_PER_KM = 0.621371; 285 286WPGMZA.UNITS_MILES = 1; 287WPGMZA.UNITS_KM = 2; 288 289function wpgmza_get_zoom_from_radius(radius, units) 290{ 291 // With thanks to Jeff Jason http://jeffjason.com/2011/12/google-maps-radius-to-zoom/ 292 293 if(units == WPGMZA.UNITS_MILES) 294 radius *= WPGMZA.KM_PER_MILE; 295 296 return Math.round(14-Math.log(radius)/Math.LN2); 297} 298 299function wpgmza_show_store_locator_radius(map_id, center, radius, distance_type) 300{ 301 switch(wpgmaps_localize[map_id].other_settings.wpgmza_store_locator_radius_style) 302 { 303 case "modern": 304 if(MYMAP.modernStoreLocatorCircle) 305 MYMAP.modernStoreLocatorCircle.destroy(); 306 307 MYMAP.modernStoreLocatorCircle = WPGMZA.ModernStoreLocatorCircle.createInstance(map_id); 308 309 MYMAP.modernStoreLocatorCircle.setOptions({ 310 visible: true, 311 center: center, 312 radius: radius * (distance_type == 1 ? WPGMZA.KM_PER_MILE : 1), 313 radiusString: radius 314 }); 315 316 break; 317 318 default: 319 var options = {
320 strokeColor: '#FF0000', 321 strokeOpacity: 0.25, 322 strokeWeight: 2, 323 fillColor: '#FF0000', 324 fillOpacity: 0.15, 325 map: MYMAP.map, 326 center: center 327 }; 328 329 if (distance_type === "1") 330 options.radius = parseInt(radius / 0.000621371); 331 else 332 options.radius = parseInt(radius / 0.001); 333 334 var circle = new google.maps.Circle(options); 335 break; 336 } 337} 338 339MYMAP.placeMarkers = function(filename,map_id,radius,searched_center,distance_type) { 340 var check1 = 0, 341 slNotFoundMessage = jQuery('.js-not-found-msg'); 342 if (wpgmaps_localize_global_settings.wpgmza_settings_marker_pull === '1') { 343 jQuery.get(filename, function(xml){ 344 jQuery(xml).find("marker").each(function(){ 345 var wpmgza_map_id = jQuery(this).find('map_id').text(); 346 347 if (wpmgza_map_id == map_id) { 348 var wpmgza_address = jQuery(this).find('address').text(); 349 var lat = jQuery(this).find('lat').text(); 350 var lng = jQuery(this).find('lng').text(); 351 var wpmgza_anim = jQuery(this).find('anim').text(); 352 var wpmgza_infoopen = jQuery(this).find('infoopen').text(); 353 var current_lat = jQuery(this).find('lat').text(); 354 var current_lng = jQuery(this).find('lng').text(); 355 var show_marker_radius = true; 356 357 if (radius !== null) { 358 if (check1 > 0 ) { } else { 359 360 361 var point = new google.maps.LatLng(parseFloat(searched_center.lat()),parseFloat(searched_center.lng())); 362 MYMAP.bounds.extend(point); 363 if (typeof wpgmaps_localize[wpgmaps_mapid]['other_settings']['store_locator_bounce'] === "undefined" || wpgmaps_localize[wpgmaps_mapid]['other_settings']['store_locator_bounce'] === 1) { 364 var marker = new google.maps.Marker({ 365 position: point, 366 map: MYMAP.map, 367 animation: google.maps.Animation.BOUNCE 368 }); 369 } 370 371 wpgmza_show_store_locator_radius(map_id, point, radius, distance_type); 372 373 check1 = check1 + 1; 374 } 375 var R = 0; 376 if (distance_type === "1") { 377 R = 3958.7558657440545; 378 } else { 379 R = 6378.16; 380 } 381 var dLat = toRad(searched_center.lat()-current_lat); 382 var dLon = toRad(searched_center.lng()-current_lng); 383 var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(toRad(current_lat)) * Math.cos(toRad(searched_center.lat())) * Math.sin(dLon/2) * Math.sin(dLon/2); 384 var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 385 var d = R * c; 386 387 if (d < radius) { show_marker_radius = true; } else { show_marker_radius = false; } 388 } 389 390 391 392 var point = new google.maps.LatLng(parseFloat(lat),parseFloat(lng)); 393 MYMAP.bounds.extend(point); 394 if (show_marker_radius === true) { 395 if (wpmgza_anim === "1") { 396 var marker = new google.maps.Marker({ 397 position: point, 398 map: MYMAP.map, 399 animation: google.maps.Animation.BOUNCE 400 }); 401 } 402 else if (wpmgza_anim === "2") { 403 var marker = new google.maps.Marker({ 404 position: point, 405 map: MYMAP.map, 406 animation: google.maps.Animation.DROP 407 }); 408 } 409 else { 410 var marker = new google.maps.Marker({ 411 position: point, 412 map: MYMAP.map 413 }); 414 } 415 var d_string = ""; 416 if (radius !== null) { 417 if (distance_type === "1") { 418 d_string = "<p style='min-width:100px; display:block;'>"+Math.round(d,2)+" "+wpgmaps_lang_m_away+"</p>"; 419 } else { 420 d_string = "<p style='min-width:100px; display:block;'>"+Math.round(d,2)+" "+wpgmaps_lang_km_away+"</p>"; 421 } 422 } else { d_string = ''; } 423 424 425 var html='<span style=\'min-width:100px; display:block;\'>'+wpmgza_address+'</span>'+d_string; 426 if (wpmgza_infoopen === "1" && !wpgmaps_localize_global_settings["wpgmza_settings_disable_infowindows"]) { 427 infoWindow.setContent(html); 428 infoWindow.open(MYMAP.map, marker); 429 } 430 temp_actiontype = 'click'; 431 if (typeof wpgmaps_localize_global_settings.wpgmza_settings_map_open_marker_by !== "undefined" && wpgmaps_localize_global_settings.wpgmza_settings_map_open_marker_by == '2') { 432 temp_actiontype = 'mouseover'; 433 } 434 google.maps.event.addListener(marker, temp_actiontype, function() { 435 infoWindow.close(); 436 if(!wpgmaps_localize_global_settings["wpgmza_settings_disable_infowindows"]) 437 { 438 infoWindow.setContent(html); 439 infoWindow.open(MYMAP.map, marker); 440 } 441 }); 442 } 443 } 444 }); 445 446 }); 447 } else { 448 449 if (Object.keys(wpgmaps_localize_marker_data).length > 0) { 450 var markerStoreLocatorsNum = 0; 451 452 if (typeof wpgmaps_localize_marker_data !== "undefined") { 453 454 jQuery.each(wpgmaps_localize_marker_data, function(i, val) { 455 456 var wpmgza_map_id = val.map_id; 457 458 if (wpmgza_map_id == map_id) { 459 460 var wpmgza_address = val.address; 461 var wpmgza_anim = val.anim; 462 var wpmgza_infoopen = val.infoopen; 463 var lat = val.lat; 464 var lng = val.lng; 465 var point = new google.maps.LatLng(parseFloat(lat),parseFloat(lng)); 466 467 468 var current_lat = val.lat; 469 var current_lng = val.lng; 470 var show_marker_radius = true; 471 472 if (radius !== null) { 473 if (check1 > 0 ) { } else { 474 475 476 var point = new google.maps.LatLng(parseFloat(searched_center.lat()),parseFloat(searched_center.lng())); 477 MYMAP.bounds.extend(point); 478 if (typeof wpgmaps_localize[wpgmaps_mapid]['other_settings']['store_locator_bounce'] === "undefined" || wpgmaps_localize[wpgmaps_mapid]['other_settings']['store_locator_bounce'] === 1) { 479 var marker = new google.maps.Marker({ 480 position: point, 481 map: MYMAP.map, 482 animation: google.maps.Animation.BOUNCE 483 }); 484 } else { /* dont show icon */ } 485 486 wpgmza_show_store_locator_radius(map_id, point, radius, distance_type); 487 488 check1 = check1 + 1; 489 } 490 var R = 0; 491 if (distance_type === "1") { 492 R = 3958.7558657440545; 493 } else { 494 R = 6378.16; 495 } 496 var dLat = toRad(searched_center.lat()-current_lat); 497 var dLon = toRad(searched_center.lng()-current_lng); 498 var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.
498cos(toRad(current_lat)) * Math.cos(toRad(searched_center.lat())) * Math.sin(dLon/2) * Math.sin(dLon/2); 499 var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 500 var d = R * c; 501 502 if (d < radius) { 503 show_marker_radius = true; 504 markerStoreLocatorsNum++; 505 } else { 506 show_marker_radius = false; 507 } 508 } 509 510 511 512 var point = new google.maps.LatLng(parseFloat(lat),parseFloat(lng)); 513 MYMAP.bounds.extend(point); 514 if (show_marker_radius === true) { 515 if (wpmgza_anim === "1") { 516 var marker = new google.maps.Marker({ 517 position: point, 518 map: MYMAP.map, 519 animation: google.maps.Animation.BOUNCE 520 }); 521 } 522 else if (wpmgza_anim === "2") { 523 var marker = new google.maps.Marker({ 524 position: point, 525 map: MYMAP.map, 526 animation: google.maps.Animation.DROP 527 }); 528 } 529 else { 530 var marker = new google.maps.Marker({ 531 position: point, 532 map: MYMAP.map 533 }); 534 } 535 var d_string = ""; 536 if (radius !== null) { 537 if (distance_type === "1") { 538 d_string = "<p style='min-width:100px; display:block;'>"+Math.round(d,2)+" "+wpgmaps_lang_m_away+"</p>"; 539 } else { 540 d_string = "<p style='min-width:100px; display:block;'>"+Math.round(d,2)+" "+wpgmaps_lang_km_away+"</p>"; 541 } 542 } else { d_string = ''; } 543 544 545 var html='<span style=\'min-width:100px; display:block;\'>'+wpmgza_address+'</span>'+d_string; 546 if (wpmgza_infoopen === "1" && !wpgmaps_localize_global_settings["wpgmza_settings_disable_infowindows"]) { 547 infoWindow.setContent(html); 548 infoWindow.open(MYMAP.map, marker); 549 } 550 temp_actiontype = 'click'; 551 if (typeof wpgmaps_localize_global_settings.wpgmza_settings_map_open_marker_by !== "undefined" && wpgmaps_localize_global_settings.wpgmza_settings_map_open_marker_by == '2') { 552 temp_actiontype = 'mouseover'; 553 } 554 google.maps.event.addListener(marker, temp_actiontype, function() { 555 infoWindow.close(); 556 if(!wpgmaps_localize_global_settings["wpgmza_settings_disable_infowindows"]) 557 { 558 infoWindow.setContent(html); 559 infoWindow.open(MYMAP.map, marker); 560 } 561 }); 562 } 563 } 564 }); 565 566 if ('' !== jQuery('#addressInput').val() && markerStoreLocatorsNum < 1) { 567 slNotFoundMessage.addClass('is-active'); 568 setTimeout(function () { 569 slNotFoundMessage.removeClass('is-active'); 570 }, 5000); 571 } 572 } 573 } 574 } 575} 576 577function add_polygon(polygonid) { 578 var tmp_data = wpgmaps_localize_polygon_settings[polygonid]; 579 var current_poly_id = polygonid; 580 var tmp_polydata = tmp_data['polydata']; 581 var WPGM_PathData = new Array(); 582 for (tmp_entry2 in tmp_polydata) { 583 if (typeof tmp_polydata[tmp_entry2][0] !== "undefined") { 584 585 WPGM_PathData.push(new google.maps.LatLng(tmp_polydata[tmp_entry2][0], tmp_polydata[tmp_entry2][1])); 586 } 587 } 588 if (tmp_data['lineopacity'] === null || tmp_data['lineopacity'] === "") { 589 tmp_data['lineopacity'] = 1; 590 } 591 592 var bounds = new google.maps.LatLngBounds(); 593 for (i = 0; i < WPGM_PathData.length; i++) { 594 bounds.extend(WPGM_PathData[i]); 595 } 596 597 WPGM_Path_Polygon[polygonid] = new google.maps.Polygon({ 598 path: WPGM_PathData, 599 clickable: true, /* must add option for this */ 600 strokeColor: "#"+tmp_data['linecolor'], 601 fillOpacity: tmp_data['opacity'], 602 strokeOpacity: tmp_data['lineopacity'], 603 fillColor: "#"+tmp_data['fillcolor'], 604 strokeWeight: 2, 605 map: MYMAP.map 606 }); 607 WPGM_Path_Polygon[polygonid].setMap(MYMAP.map); 608 609 polygon_center = bounds.getCenter(); 610 611 if (tmp_data['title'] !== "") { 612 infoWindow_poly[polygonid] = new google.maps.InfoWindow(); 613 google.maps.event.addListener(WPGM_Path_Polygon[polygonid], 'click', function(event) { 614 infoWindow_poly[polygonid].setPosition(event.latLng); 615 content = ""; 616 if (tmp_data['link'] !== "") { 617 var content = "<a href='"+tmp_data['link']+"'>"+tmp_data['title']+"</a>"; 618 } else { 619 var content = tmp_data['title']; 620 } 621 if(!wpgmaps_localize_global_settings["wpgmza_settings_disable_infowindows"]) 622 { 623 infoWindow_poly[polygonid].setContent(content); 624 infoWindow_poly[polygonid].open(MYMAP.map,this.position); 625 } 626 }); 627 } 628 629 630 631} 632function add_polyline(polyline) { 633 634 635 var tmp_data = wpgmaps_localize_polyline_settings[polyline]; 636 637 var current_poly_id = polyline; 638 var tmp_polydata = tmp_data['polydata']; 639 var WPGM_Polyline_PathData = new Array(); 640 for (tmp_entry2 in tmp_polydata) { 641 if (typeof tmp_polydata[tmp_entry2][0] !== "undefined" && typeof tmp_polydata[tmp_entry2][1] !== "undefined") { 642 var lat = tmp_polydata[tmp_entry2][0].replace(')', ''); 643 lat = lat.replace('(',''); 644 var lng = tmp_polydata[tmp_entry2][1].replace(')', ''); 645 lng = lng.replace('(',''); 646 WPGM_Polyline_PathData.push(new google.maps.LatLng(lat, lng)); 647 } 648 649 650 } 651 if (tmp_data['lineopacity'] === null || tmp_data['lineopacity'] === "") { 652 tmp_data['lineopacity'] = 1; 653 } 654 655 WPGM_Path[polyline] = new google.maps.Polyline({ 656 path: WPGM_Polyline_PathData, 657 strokeColor: "#"+tmp_data['linecolor'], 658 strokeOpacity: tmp_data['opacity'], 659 strokeWeight: tmp_data['linethickness'], 660 map: MYMAP.map 661 }); 662 WPGM_Path[polyline].setMap(MYMAP.map); 663 664 665} 666 667 668jQuery("body").on("keypress","#addressInput", function(event) { 669 if ( event.which == 13 ) { 670 jQuery('.wpgmza_sl_search_button').trigger('click'); 671 } 672}); 673var autocomplete; 674function fillInAddress() { 675 // Get the place details from the autocomplete object. 676 var place = autocomplete.getPlace(); 677} 678 679wpgmza_create_places_autocomplete(); 680 681 682function searchLocations(map_id) { 683 var address = document.getElementById("addressInput").value; 684 var geocoder = new google.maps.Geocoder(); 685 686 if (typeof wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_store_locator_restrict'] === "undefined" || wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_store_locator_restrict'] === "" ) { 687 geocoder.geocode({address: address}, function(results, status) { 688 if (status === google.maps.GeocoderStatus.OK) { 689 searchLocationsNear(map_id,results[0].geometry.location); 690 } else { 691 alert(address + ' not found'); 692 } 693 }); 694 } else { 695 geocoder.geocode({address: address,componentRestrictions: {country: wpgmaps_localize[wpgmaps_mapid]['other_settings']['wpgmza_store_locator_restrict']}}, function(results, status) { 696 if (status === google.maps.GeocoderStatus.OK) { 697 searchLocationsNear(map_id,results[0].geometry.location); 698 } else { 699 alert(address + ' not found'); 700 } 701 }); 702 } 703} 704function clearLocations() { 705 infoWindow.close(); 706} 707function searchLocationsNear(mapid,center_searched) { 708 clearLocations(); 709 var distance_type = wpgmaps_localize[mapid].other_settings.store_locator_distance; 710 711 var radius = document.getElementById('radiusSelect').value; 712 var zoomie = wpgmza_get_zoom_from_radius(radius); 713 714 MYMAP.init("#wpgmza_map", center_searched, zoomie, 3); 715 MYMAP.placeMarkers(wpgmaps_markerurl+'?u='+UniqueCode,wpgmaps_localize[wpgmaps_mapid].id,radius,center_searched,distance_type); 716} 717 718function toRad(Value) { 719 /** Converts numeric degrees to radians */ 720 return Value * Math.PI / 180; 721} 722 723(function($) { 724 725 if(!window.WPGMZA) 726 window.WPGMZA = {}; 727 728 WPGMZA.hexToRgba = function(hex) { 729 var c; 730 if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){ 731 c= hex.substring(1).split(''); 732 if(c.length== 3){ 733 c= [c[0], c[0], c[1], c[1], c[2], c[2]]; 734 } 735 c= '0x'+c.join(''); 736 737 return { 738 r: (c>>16)&255, 739 g: (c>>8)&255, 740 b: c&255, 741 a: 1 742 }; 743 } 744 throw new Error('Bad Hex'); 745 } 746 747 WPGMZA.rgbaToString = function(rgba) { 748 return "rgba(" + rgba.r + ", " + rgba.g + ", " + rgba.b + ", " + rgba.a + ")"; 749 } 750 751 WPGMZA.ModernStoreLocator = function(map_id) { 752 var self = this; 753
754 var original = $(".wpgmza_sl_search_button").closest(".wpgmza_sl_main_div"); 755 756 if(!original.length) 757 return; 758 759 // Build / re-arrange elements 760 this.element = $("<div class='wpgmza-modern-store-locator'><div class='wpgmza-inner'><!--<i class='fas fa-bars'></i>--></div></div>")[0]; 761 762 var inner = $(this.element).find(".wpgmza-inner"); 763 764 MYMAP.map.controls[google.maps.ControlPosition.TOP_CENTER].push(this.element); 765 766 inner.append($(original).find( "#addressInput" )); 767 inner.append($(original).find( "select.wpgmza_sl_radius_select" )); 768 769 // Buttons 770 this.searchButton = $(original).find( ".wpgmza_sl_search_button" ); 771 inner.append(this.searchButton); 772 773 this.resetButton = $(original).find( ".wpgmza_sl_reset_button_div>input" ); 774 inner.append(this.resetButton); 775 776 // Distance type 777 inner.append($("#wpgmza_distance_type_" + map_id)); 778 779 // Remove original element 780 $(original).remove(); 781 782 // Event listeners 783 $(this.element).find("input, select").on("focus", function() { 784 $(inner).addClass("active"); 785 }); 786 787 $(this.element).find("input, select").on("blur", function() { 788 $(inner).removeClass("active"); 789 }); 790 } 791 792 WPGMZA.GoogleAPIErrorHandler = function() { 793 var _error = console.error; 794 795 console.error = function(message) 796 { 797 var m = message.match(/^Google Maps API error: (\w+) (.+)/); 798 799 if(m) 800 { 801 var friendlyMessage = m[1].replace(/([A-Z])/g, " $1") + " - See " + m[2] + " for more information"; 802 alert(friendlyMessage); 803 } 804 805 _error.apply(this, arguments); 806 } 807 } 808 809 WPGMZA.googleAPIErrorHandler = new WPGMZA.GoogleAPIErrorHandler(); 810 811 /** 812 * This module is the modern store locator circle 813 * @constructor 814 */ 815 WPGMZA.ModernStoreLocatorCircle = function(map_id, settings) { 816 var self = this; 817 818 this.map = MYMAP.map; 819 820 this.canvasLayer = new CanvasLayer({ 821 map: this.map, 822 resizeHandler: function(event) { 823 self.onResize(event); 824 }, 825 updateHandler: function(event) { 826 self.onUpdate(event); 827 }, 828 animate: true, 829 resolutionScale: this.getResolutionScale() 830 }); 831 832 this.settings = { 833 center: new google.maps.LatLng(0, 0), 834 radius: 1, 835 color: "#63AFF2", 836 837 shadowColor: "white", 838 shadowBlur: 2, 839 840 centerRingRadius: 10, 841 centerRingLineWidth: 3, 842 843 numInnerRings: 9, 844 innerRingLineWidth: 1, 845 innerRingFade: true, 846 847 numOuterRings: 7, 848 849 ringLineWidth: 1, 850 851 mainRingLineWidth: 2, 852 853 numSpokes: 6, 854 spokesStartAngle: Math.PI / 2, 855 856 numRadiusLabels: 6, 857 radiusLabelsStartAngle: Math.PI / 2, 858 radiusLabelFont: "13px sans-serif", 859 860 visible: false 861 }; 862 863 if(settings) 864 this.setOptions(settings); 865 } 866 867 WPGMZA.ModernStoreLocatorCircle.createInstance = function(map_id, settings) { 868 return new WPGMZA.ModernStoreLocatorCircle(map_id, settings); 869 } 870 871 WPGMZA.ModernStoreLocatorCircle.prototype.destroy = function() { 872 if(this.canvasLayer) { 873 this.canvasLayer.setOptions({ 874 animate: false, 875 updateHandler: null, 876 resizeHandler: null, 877 map: null 878 }); 879 } 880 } 881 882 WPGMZA.ModernStoreLocatorCircle.prototype.onResize = function(event) { 883 this.draw(); 884 } 885 886 WPGMZA.ModernStoreLocatorCircle.prototype.onUpdate = function(event) { 887 this.draw(); 888 } 889 890 WPGMZA.ModernStoreLocatorCircle.prototype.setOptions = function(options) { 891 for(var name in options) 892 { 893 var functionName = "set" + name.substr(0, 1).toUpperCase() + name.substr(1); 894 895 if(typeof this[functionName] == "function") 896 this[functionName](options[name]); 897 else 898 this.settings[name] = options[name]; 899 } 900 this.canvasLayer.scheduleUpdate(); 901 } 902 903 WPGMZA.ModernStoreLocatorCircle.prototype.getResolutionScale = function() { 904 return window.devicePixelRatio || 1; 905 } 906 907 WPGMZA.ModernStoreLocatorCircle.prototype.getCenter = function() { 908 return this.getPosition(); 909 } 910 911 WPGMZA.ModernStoreLocatorCircle.prototype.setCenter = function(value) { 912 this.setPosition(value); 913 } 914 915 WPGMZA.ModernStoreLocatorCircle.prototype.getPosition = function() { 916 return this.settings.center; 917 } 918 919 WPGMZA.ModernStoreLocatorCircle.prototype.setPosition = function(position) { 920 this.settings.center = position; 921 this.canvasLayer.scheduleUpdate(); 922 } 923 924 WPGMZA.ModernStoreLocatorCircle.prototype.getRadius = function() { 925 return this.settings.radius; 926 } 927 928 WPGMZA.ModernStoreLocatorCircle.prototype.setRadius = function(radius) {
929 this.settings.radius = radius; 930 this.canvasLayer.scheduleUpdate(); 931 } 932 933 WPGMZA.ModernStoreLocatorCircle.prototype.getVisible = function(visible) { 934 return this.settings.visible; 935 } 936 937 WPGMZA.ModernStoreLocatorCircle.prototype.setVisible = function(visible) { 938 this.settings.visible = visible; 939 this.canvasLayer.scheduleUpdate(); 940 } 941 942 /** 943 * This function transforms a km radius into canvas space 944 * @return number 945 */ 946 WPGMZA.ModernStoreLocatorCircle.prototype.getTransformedRadius = function(km) { 947 var multiplierAtEquator = 0.006395; 948 var spherical = google.maps.geometry.spherical; 949 950 var center = this.settings.center; 951 var equator = new google.maps.LatLng({ 952 lat: 0.0, 953 lng: 0.0 954 }); 955 var latitude = new google.maps.LatLng({ 956 lat: center.lat(), 957 lng: 0.0 958 }); 959 960 var offsetAtEquator = spherical.computeOffset(equator, km * 1000, 90); 961 var offsetAtLatitude = spherical.computeOffset(latitude, km * 1000, 90); 962 963 var factor = offsetAtLatitude.lng() / offsetAtEquator.lng(); 964 965 return km * multiplierAtEquator * factor; 966 } 967 968 WPGMZA.ModernStoreLocatorCircle.prototype.draw = function() { 969 // clear previous canvas contents 970 var canvasLayer = this.canvasLayer; 971 var settings = this.settings; 972 973 var canvasWidth = canvasLayer.canvas.width; 974 var canvasHeight = canvasLayer.canvas.height; 975 976 var map = MYMAP.map; 977 var resolutionScale = this.getResolutionScale(); 978 979 context = canvasLayer.canvas.getContext('2d'); 980 981 context.clearRect(0, 0, canvasWidth, canvasHeight); 982 983 if(!settings.visible) 984 return; 985 986 context.shadowColor = settings.shadowColor; 987 context.shadowBlur = settings.shadowBlur; 988 989 // NB: 2018/02/13 - Left this here in case it needs to be calibrated more accurately 990 /*if(!this.testCircle) 991 { 992 this.testCircle = new google.maps.Circle({ 993 strokeColor: "#ff0000", 994 strokeOpacity: 0.5, 995 strokeWeight: 3, 996 map: this.map, 997 center: this.settings.center 998 }); 999 } 1000 1001 this.testCircle.setCenter(settings.center); 1002 this.testCircle.setRadius(settings.radius * 1000);*/ 1003 1004 /* We need to scale and translate the map for current view. 1005 * see https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates 1006 */ 1007 var mapProjection = map.getProjection(); 1008 1009 /** 1010 * Clear transformation from last update by setting to identity matrix. 1011 * Could use context.resetTransform(), but most browsers don't support 1012 * it yet. 1013 */ 1014 context.setTransform(1, 0, 0, 1, 0, 0); 1015 1016 // scale is just 2^zoom 1017 // If canvasLayer is scaled (with resolutionScale), we need to scale by 1018 // the same amount to account for the larger canvas. 1019 var scale = Math.pow(2, map.zoom) * resolutionScale; 1020 context.scale(scale, scale); 1021 1022 /* If the map was not translated, the topLeft corner would be 0,0 in 1023 * world coordinates. Our translation is just the vector from the 1024 * world coordinate of the topLeft corder to 0,0. 1025 */ 1026 var offset = mapProjection.fromLatLngToPoint(canvasLayer.getTopLeft()); 1027 context.translate(-offset.x, -offset.y); 1028 1029 // project rectLatLng to world coordinates and draw 1030 var worldPoint = mapProjection.fromLatLngToPoint(this.settings.center); 1031 var rgba = WPGMZA.hexToRgba(settings.color); 1032 var ringSpacing = this.getTransformedRadius(settings.radius) / (settings.numInnerRings + 1); 1033 1034 // TODO: Implement gradients for color and opacity 1035 1036 // Inside circle (fixed?) 1037 context.strokeStyle = settings.color; 1038 context.lineWidth = (1 / scale) * settings.centerRingLineWidth; 1039 1040 context.beginPath(); 1041 context.arc( 1042 worldPoint.x, 1043 worldPoint.y, 1044 this.getTransformedRadius(settings.centerRingRadius) / scale, 0, 2 * Math.PI 1045 ); 1046 context.stroke(); 1047 context.closePath(); 1048 1049 // Spokes 1050 var radius = this.getTransformedRadius(settings.radius) + (ringSpacing * settings.numOuterRings) + 1; 1051 var grad = context.createRadialGradient(0, 0, 0, 0, 0, radius); 1052 var rgba = WPGMZA.hexToRgba(settings.color); 1053 var start = WPGMZA.rgbaToString(rgba), end; 1054 var spokeAngle; 1055 1056 rgba.a = 0; 1057 end = WPGMZA.rgbaToString(rgba); 1058 1059 grad.addColorStop(0, start); 1060 grad.addColorStop(1, end); 1061 1062 context.save(); 1063 1064 context.translate(worldPoint.x, worldPoint.y); 1065 context.strokeStyle = grad; 1066 context.lineWidth = 2 / scale; 1067 1068 for(var i = 0; i < settings.numSpokes; i++) 1069 { 1070 spokeAngle = settings.spokesStartAngle + (Math.PI * 2) * (i / settings.numSpokes); 1071 1072 x = Math.cos(spokeAngle) * radius; 1073 y = Math.sin(spokeAngle) * radius; 1074 1075 context.setLineDash([2 / scale, 15 / scale]); 1076 1077 context.beginPath(); 1078 context.moveTo(0, 0); 1079 context.lineTo(x, y); 1080 context.stroke(); 1081 } 1082 1083 context.setLineDash([]); 1084
1085 context.restore(); 1086 1087 // Inner ringlets 1088 context.lineWidth = (1 / scale) * settings.innerRingLineWidth; 1089 1090 for(var i = 1; i <= settings.numInnerRings; i++) 1091 { 1092 var radius = i * ringSpacing; 1093 1094 if(settings.innerRingFade) 1095 rgba.a = 1 - (i - 1) / settings.numInnerRings; 1096 1097 context.strokeStyle = WPGMZA.rgbaToString(rgba); 1098 1099 context.beginPath(); 1100 context.arc(worldPoint.x, worldPoint.y, radius, 0, 2 * Math.PI); 1101 context.stroke(); 1102 context.closePath(); 1103 } 1104 1105 // Main circle 1106 context.strokeStyle = settings.color; 1107 context.lineWidth = (1 / scale) * settings.centerRingLineWidth; 1108 1109 context.beginPath(); 1110 context.arc(worldPoint.x, worldPoint.y, this.getTransformedRadius(settings.radius), 0, 2 * Math.PI); 1111 context.stroke(); 1112 context.closePath(); 1113 1114 // Outer ringlets 1115 var radius = radius + ringSpacing; 1116 for(var i = 0; i < settings.numOuterRings; i++) 1117 { 1118 if(settings.innerRingFade) 1119 rgba.a = 1 - i / settings.numOuterRings; 1120 1121 context.strokeStyle = WPGMZA.rgbaToString(rgba); 1122 1123 context.beginPath(); 1124 context.arc(worldPoint.x, worldPoint.y, radius, 0, 2 * Math.PI); 1125 context.stroke(); 1126 context.closePath(); 1127 1128 radius += ringSpacing; 1129 } 1130 1131 // Text 1132 if(settings.numRadiusLabels > 0) 1133 { 1134 var m; 1135 var radius = this.getTransformedRadius(settings.radius); 1136 var clipRadius = (12 * 1.1) / scale; 1137 var x, y; 1138 1139 if(m = settings.radiusLabelFont.match(/(\d+)px/)) 1140 clipRadius = (parseInt(m[1]) / 2 * 1.1) / scale; 1141 1142 context.font = settings.radiusLabelFont; 1143 context.textAlign = "center"; 1144 context.textBaseline = "middle"; 1145 context.fillStyle = settings.color; 1146 1147 context.save(); 1148 1149 context.translate(worldPoint.x, worldPoint.y) 1150 1151 for(var i = 0; i < settings.numRadiusLabels; i++) 1152 { 1153 var spokeAngle = settings.radiusLabelsStartAngle + (Math.PI * 2) * (i / settings.numRadiusLabels); 1154 var textAngle = spokeAngle + Math.PI / 2; 1155 var text = settings.radiusString; 1156 var width; 1157 1158 if(Math.sin(spokeAngle) > 0) 1159 textAngle -= Math.PI; 1160 1161 x = Math.cos(spokeAngle) * radius; 1162 y = Math.sin(spokeAngle) * radius; 1163 1164 context.save(); 1165 1166 context.translate(x, y); 1167 1168 context.rotate(textAngle); 1169 context.scale(1 / scale, 1 / scale); 1170 1171 width = context.measureText(text).width; 1172 height = width / 2; 1173 context.clearRect(-width, -height, 2 * width, 2 * height); 1174 1175 context.fillText(settings.radiusString, 0, 0); 1176 1177 context.restore(); 1178 } 1179 1180 context.restore(); 1181 } 1182 } 1183 1184})(jQuery);
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.