Google Maps Markerlabel This.draw Is Not a Function
Source: wp-google-maps.combined.js
// js/v8/core.js /** * @module WPGMZA * @summary This is the core Javascript module. Some code exists in ../core.js, the functionality there will slowly be handed over to this module. */ (function($) { var core = { maps: [], events: null, settings: null, loadingHTML: '<div class="wpgmza-preloader"><div class="wpgmza-loader">...</div></div>', /** * @function guid * @summary Utility function returns a GUID * @static * @return {string} The GUID */ guid: function() { // Public Domain/MIT var d = new Date().getTime(); if (typeof performance !== 'undefined' && typeof performance.now === 'function'){ d += performance.now(); //use high-precision timer if available } return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = (d + Math.random() * 16) % 16 | 0; d = Math.floor(d / 16); return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); }); }, /** * @function hexOpacityToRGBA * @summary Takes a hex string and opacity value and converts it to Openlayers RGBA format * @param {string} colour The hex color string * @param {number} opacity The opacity from 0.0 - 1.0 * @static * @return {array} RGBA where color components are 0 - 255 and opacity is 0.0 - 1.0 */ hexOpacityToRGBA: function(colour, opacity) { hex = parseInt(colour.replace(/^#/, ""), 16); return [ (hex & 0xFF0000) >> 16, (hex & 0xFF00) >> 8, hex & 0xFF, parseFloat(opacity) ]; }, latLngRegexp: /^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$/, /** * @function isLatLngString * @summary Utility function returns true is string is a latitude and longitude * @param str {string} The string to attempt to parse as coordinates * @static * @return {array} the matched latitude and longitude or null if no match */ isLatLngString: function(str) { if(typeof str != "string") return null; // Remove outer brackets if(str.match(/^\(.+\)$/)) str = str.replace(/^\(|\)$/, ""); var m = str.match(WPGMZA.latLngRegexp); if(!m) return null; return { lat: parseFloat(m[1]), lng: parseFloat(m[3]) }; }, /** * @function stringToLatLng * @summary Utility function returns a latLng literal given a valid latLng string * @param str {string} The string to attempt to parse as coordinates * @static * @return {object} LatLng literal */ stringToLatLng: function(str) { var result = WPGMZA.isLatLngString(str); if(!result) throw new Error("Not a valid latLng"); return result; }, /** * @function getImageDimensions * @summary Utility function to get the dimensions of an image, caches results for best performance * @param src {string} Image source URL * @param callback {function} Callback to recieve image dimensions * @static * @return {void} */ imageDimensionsCache: {}, getImageDimensions: function(src, callback) { if(WPGMZA.imageDimensionsCache[src]) { callback(WPGMZA.imageDimensionsCache[src]); return; } var img = document.createElement("img"); img.onload = function(event) { var result = { width: image.width, height: image.height }; WPGMZA.imageDimensionsCache[src] = result; callback(result); }; img.src = src; }, /** * @function isDeveloperMode * @summary Returns true if developer mode is set * @static * @return {boolean} True if developer mode is on */ isDeveloperMode: function() { return this.developer_mode || (window.Cookies && window.Cookies.get("wpgmza-developer-mode")); }, /** * @function isProVersion * @summary Returns true if the Pro add-on is active * @static * @return {boolean} True if the Pro add-on is active */ isProVersion: function() { return (this._isProVersion == "1"); }, /** * @function openMediaDialog * @summary Opens the WP media dialog and returns the result to a callback * @param {function} callback Callback to recieve the attachment ID as the first parameter and URL as the second * @static * @return {void} */ openMediaDialog: function(callback) { // Media upload var file_frame; // If the media frame already exists, reopen it. if ( file_frame ) { // Set the post ID to what we want file_frame.uploader.uploader.param( 'post_id', set_to_post_id ); // Open frame file_frame.open(); return; } // Create the media frame. file_frame = wp.media.frames.file_frame = wp.media({ title: 'Select a image to upload', button: { text: 'Use this image', }, multiple: false // Set to true to allow multiple files to be selected }); // When an image is selected, run a callback. file_frame.on( 'select', function() { // We set multiple to false so only get one image from the uploader attachment = file_frame.state().get('selection').first().toJSON(); callback(attachment.id, attachment.url); }); // Finally, open the modal file_frame.open(); }, /** * @function getCurrentPosition * @summary This function will get the users position, it first attempts to get * high accuracy position (mobile with GPS sensors etc.), if that fails * (desktops will time out) then it tries again without high accuracy * enabled * @static * @return {object} The users position as a LatLng literal */ getCurrentPosition: function(callback) { if(!navigator.geolocation) { console.warn("No geolocation available on this device"); return; } var options = { enableHighAccuracy: true }; navigator.geolocation.getCurrentPosition(function(position) { callback(position); }, function(error) { options.enableHighAccuracy = false; navigator.geolocation.getCurrentPosition(function(position) { callback(position); }, function(error) { console.warn(error.code, error.message); }, options); }, options); }, /** * @function runCatchableTask * @summary Runs a catchable task and displays a friendly error if the function throws an error * @param {function} callback The function to run * @param {HTMLElement} friendlyErrorContainer The container element to hold the error * @static * @return {void} */ runCatchableTask: function(callback, friendlyErrorContainer) { if(WPGMZA.isDeveloperMode()) callback(); else try{ callback(); }catch(e) { var friendlyError = new WPGMZA.FriendlyError(e); $(friendlyErrorContainer).html(""); $(friendlyErrorContainer).append(friendlyError.element); $(friendlyErrorContainer).show(); } }, /** * @function assertInstanceOf * @summary * This function is for checking inheritence has been setup correctly. * For objects that have engine and Pro specific classes, it will automatically * add the engine and pro prefix to the supplied string and if such an object * exists it will test against that name rather than the un-prefix argument * supplied. * * For example, if we are running the Pro addon with Google maps as the engine, * if you supply Marker as the instance name the function will check to see * if instance is an instance of GoogleProMarker * @param {object} instance The object to check * @param {string} instanceName The class name as a string which this object should be an instance of * @static * @return {void} */ assertInstanceOf: function(instance, instanceName) { var engine, fullInstanceName, assert; var pro = WPGMZA.isProVersion() ? "Pro" : ""; switch(WPGMZA.settings.engine) { case "google-maps": engine = "Google"; break; default: engine = "OL"; break; } if(WPGMZA[engine + pro + instanceName]) fullInstanceName = engine + pro + instanceName; else if(WPGMZA[pro + instanceName]) fullInstanceName = pro + instanceName; else if(WPGMZA[engine + instanceName]) fullInstanceName = engine + instanceName; else fullInstanceName = instanceName; assert = instance instanceof WPGMZA[fullInstanceName]; if(!assert) throw new Error("Object must be an instance of " + fullInstanceName + " (did you call a constructor directly, rather than createInstance?)"); }, /** * @function getMapByID * @param {mixed} id The ID of the map to retrieve * @static * @return {object} The map object, or null if no such map exists */ getMapByID: function(id) { for(var i = 0; i < WPGMZA.maps.length; i++) { if(WPGMZA.maps[i].id == id) return WPGMZA.maps[i]; } return null; }, /** * @function isGoogleAutocompleteSupported * @summary Shorthand function to determine if the Places Autocomplete is available * @static * @return {boolean} */ isGoogleAutocompleteSupported: function() { return typeof google === 'object' && typeof google.maps === 'object' && typeof google.maps.places === 'object' && typeof google.maps.places.Autocomplete === 'function'; } }; if(window.WPGMZA) window.WPGMZA = $.extend(window.WPGMZA, core); else window.WPGMZA = core; for(var key in WPGMZA_localized_data) { var value = WPGMZA_localized_data[key]; WPGMZA[key] = value; } /*for(var key in WPGMZA_localized_data) WPGMZA[key] = WPGMZA_localized_data[key]; $(document).ready(function(event) { // Datatables to throw errors if($.fn.dataTable) $.fn.dataTable.ext.errMode = 'throw'; // Combined script warning if($("script[src*='wp-google-maps.combined.js'], script[src*='wp-google-maps-pro.combined.js']").length) console.warn("Minified script is out of date, using combined script instead."); // Check for multiple jQuery versions var elements = $("script").filter(function() { return this.src.match(/(^|\/)jquery\.(min\.)?js(\?|$)/i); }); if(elements.length > 1) console.warn("Multiple jQuery versions detected: ", elements); // Disable map edit page preloader in developer more if(WPGMZA.isDeveloperMode()) $("#wpgmza-map-edit-page form.wpgmza").show(); // Shortcode boxes $(".wpgmza_copy_shortcode").on("click", function() { var temp = $("<input>"); var temp2 = $('<div id="wpgmza_tmp" style="display: none;" width:100%; text-align:center;"/>'); $(document.body).append(temp); temp.val($(this).val()).select(); document.execCommand("copy"); temp.remove(); $(this).after(temp2); $(temp2).html( $("[data-shortcode-copy-string]").attr("data-shortcode-copy-string") ); $(temp2).fadeIn(); setTimeout(function() { $(temp2).fadeOut(); }, 1000); setTimeout(function() { $(temp2).remove(); }, 1500); }); // Fancy switches // $("form.wpgmza .cmn-toggle").each(function(index, el) { // // $(el).wrap("<div class='switch'/>"); // $(el).after("<label for=""/>") // // }); $("form.wpgmza").on("click", ".switch label", function(event) { var input = $(this).prev(".cmn-toggle"); if(input.prop("disabled")) return; var val = !input.prop("checked"); input.prop("checked", val); if(val) input.attr("checked", "checked"); else input.removeAttr("checked"); input.trigger("change"); }); // Geolocation warnings if(window.location.protocol != 'https:') { var warning = '<span class="notice notice-warning">' + WPGMZA.localized_strings.unsecure_geolocation + "</span>"; $(".wpgmza-geolocation-setting").after( $(warning) ); } // Switch off thanks for feedback message document.cookie = "wpgmza_feedback_thanks=false; expires=Thu, 01 Jan 1970 00:00:01 GMT;"; });*/ })(jQuery); // js/v8/distance.js /** * @namespace WPGMZA * @module Distance * @requires WPGMZA */ (function($) { WPGMZA.Distance = { MILES: true, KILOMETERS: false, MILES_PER_KILOMETER: 0.621371, KILOMETERS_PER_MILE: 1.60934, // TODO: Implement WPGMZA.settings.distance_units /** * Converts a UI distance (eg from a form control) to meters, * accounting for the global units setting */ uiToMeters: function(uiDistance) { return parseFloat(uiDistance) / (WPGMZA.settings.distance_units == WPGMZA.Distance.MILES ? WPGMZA.Distance.MILES_PER_KILOMETER : 1) * 1000; }, /** * Converts a UI distance (eg from a form control) to kilometers, * accounting for the global units setting */ uiToKilometers: function(uiDistance) { return WPGMZA.Distance.uiToMeters(uiDistance) * 0.001; }, /** * Converts a UI distance (eg from a form control) to miles, * accounting for the global units setting */ uiToMiles: function(uiDistance) { return WPGMZA.Distance.uiToKilometers(uiDistance) * WPGMZA.Distance.MILES_PER_KILOMETER; }, kilometersToUI: function(km) { if(WPGMZA.settings.distance_units == WPGMZA.Distance.MILES) return km * WPGMZA.Distance.MILES_PER_KILOMETER; return km; } }; })(jQuery); // js/v8/event-dispatcher.js /** * @namespace WPGMZA * @module EventDispatcher * @requires WPGMZA */ (function($) { WPGMZA.EventDispatcher = function() { WPGMZA.assertInstanceOf(this, "EventDispatcher"); this._listenersByType = []; } WPGMZA.EventDispatcher.prototype.addEventListener = function(type, listener, thisObject, useCapture) { var arr; var types = type.split(/\s+/); if(types.length > 1) { for(var i = 0; i < types.length; i++) this.addEventListener(types[i], listener, thisObject, useCapture); return; } if(!(listener instanceof Function)) throw new Error("Listener must be a function"); if(!(arr = this._listenersByType[type])) arr = this._listenersByType[type] = []; var obj = { listener: listener, thisObject: (thisObject ? thisObject : this), useCapture: (useCapture ? true : false) }; arr.push(obj); } WPGMZA.EventDispatcher.prototype.on = WPGMZA.EventDispatcher.prototype.addEventListener; WPGMZA.EventDispatcher.prototype.removeEventListener = function(type, listener, thisObject, useCapture) { var arr, index, obj; if(!(arr = this._listenersByType[type])) return; if(!thisObject) thisObject = this; useCapture = (useCapture ? true : false); for(var i = 0; i < arr.length; i++) { obj = arr[i]; if(obj.listener == listener && obj.thisObject == thisObject && obj.useCapture == useCapture) { arr.splice(i, 1); return; } } } WPGMZA.EventDispatcher.prototype.off = WPGMZA.EventDispatcher.prototype.removeEventListener; WPGMZA.EventDispatcher.prototype.hasEventListener = function(type) { return (_listenersByType[type] ? true : false); } WPGMZA.EventDispatcher.prototype.dispatchEvent = function(event) { if(!(event instanceof WPGMZA.Event)) { if(typeof event == "string") event = new WPGMZA.Event(event); else { var src = event; event = new WPGMZA.Event(); for(var name in src) event[name] = src[name]; } } event.target = this; var path = []; for(var obj = this.parent; obj != null; obj = obj.parent) path.unshift(obj); event.phase = WPGMZA.Event.CAPTURING_PHASE; for(var i = 0; i < path.length && !event._cancelled; i++) path[i]._triggerListeners(event); if(event._cancelled) return; event.phase = WPGMZA.Event.AT_TARGET; this._triggerListeners(event); event.phase = WPGMZA.Event.BUBBLING_PHASE; for(i = path.length - 1; i >= 0 && !event._cancelled; i--) path[i]._triggerListeners(event); } WPGMZA.EventDispatcher.prototype.trigger = WPGMZA.EventDispatcher.prototype.dispatchEvent; WPGMZA.EventDispatcher.prototype._triggerListeners = function(event) { var arr, obj; if(!(arr = this._listenersByType[event.type])) return; for(var i = 0; i < arr.length; i++) { obj = arr[i]; if(event.phase == WPGMZA.Event.CAPTURING_PHASE && !obj.useCapture) continue; obj.listener.call(arr[i].thisObject, event); } } WPGMZA.events = new WPGMZA.EventDispatcher(); })(jQuery); // js/v8/event.js /** * @namespace WPGMZA * @module Event * @requires WPGMZA */ (function($) { WPGMZA.Event = function(options) { if(typeof options == "string") this.type = options; this.bubbles = true; this.cancelable = true; this.phase = WPGMZA.Event.PHASE_CAPTURE; this.target = null; this._cancelled = false; if(typeof options == "object") for(var name in options) this[name] = options[name]; } WPGMZA.Event.CAPTURING_PHASE = 0; WPGMZA.Event.AT_TARGET = 1; WPGMZA.Event.BUBBLING_PHASE = 2; WPGMZA.Event.prototype.stopPropagation = function() { this._cancelled = true; } })(jQuery); // js/v8/friendly-error.js /** * @namespace WPGMZA * @module FriendlyError * @requires WPGMZA */ (function($) { /*var template = '\ <div class="notice notice-error"> \ <p> \ ' + WPGMZA.localized_strings.friendly_error + ' \ </p> \ <pre style="white-space: pre-line;"></pre> \ <div> \ '; WPGMZA.FriendlyError = function(nativeError) { if(!WPGMZA.is_admin) { this.element = $(WPGMZA.preloaderHTML); $(this.element).removeClass("animated"); return; } $("#wpgmza-map-edit-page>.wpgmza-preloader").remove(); this.element = $(template); this.element.find("pre").html(nativeError.message + "\r\n" + nativeError.stack + "\r\n\r\n on " + window.location.href); }*/ })(jQuery); // js/v8/geocoder.js /** * @namespace WPGMZA * @module Geocoder * @requires WPGMZA */ (function($) { WPGMZA.Geocoder = function() { WPGMZA.assertInstanceOf(this, "Geocoder"); } WPGMZA.Geocoder.SUCCESS = "success"; WPGMZA.Geocoder.ZERO_RESULTS = "zero-results"; WPGMZA.Geocoder.FAIL = "fail"; WPGMZA.Geocoder.getConstructor = function() { switch(WPGMZA.settings.engine) { case "google-maps": return WPGMZA.GoogleGeocoder; break; default: return WPGMZA.OLGeocoder; break; } } WPGMZA.Geocoder.createInstance = function() { var constructor = WPGMZA.Geocoder.getConstructor(); return new constructor(); } WPGMZA.Geocoder.prototype.getLatLngFromAddress = function(options, callback) { if(WPGMZA.isLatLngString(options.address)) { var parts = options.address.split(/,\s*/); var latLng = { lat: parseFloat(parts[0]), lng: parseFloat(parts[1]) } callback(latLng); } } WPGMZA.Geocoder.prototype.geocode = function(options, callback) { return this.getLatLngFromAddress(options, callback); } })(jQuery); // js/v8/info-window.js /** * @namespace WPGMZA * @module InfoWindow * @requires WPGMZA.EventDispatcher */ (function($) { WPGMZA.InfoWindow = function(mapObject) { var self = this; WPGMZA.EventDispatcher.call(this); WPGMZA.assertInstanceOf(this, "InfoWindow"); if(!mapObject) return; this.mapObject = mapObject; if(mapObject.map) { // This has to be slightly delayed so the map initialization won't overwrite the infowindow element setTimeout(function() { self.onMapObjectAdded(event); }, 100); } else mapObject.addEventListener("added", function(event) { self.onMapObjectAdded(event); }); } WPGMZA.InfoWindow.prototype = Object.create(WPGMZA.EventDispatcher.prototype); WPGMZA.InfoWindow.prototype.constructor = WPGMZA.InfoWindow; WPGMZA.InfoWindow.OPEN_BY_CLICK = 1; WPGMZA.InfoWindow.OPEN_BY_HOVER = 2; WPGMZA.InfoWindow.getConstructor = function() { switch(WPGMZA.settings.engine) { case "google-maps": if(WPGMZA.isProVersion()) return WPGMZA.GoogleProInfoWindow; return WPGMZA.GoogleInfoWindow; break; default: if(WPGMZA.isProVersion()) return WPGMZA.OLProInfoWindow; return WPGMZA.OLInfoWindow; break; } } WPGMZA.InfoWindow.createInstance = function(mapObject) { var constructor = this.getConstructor(); return new constructor(mapObject); } /** * Gets the content for the info window and passes it to the specified callback - this allows for delayed loading (eg AJAX) as well as instant content * @return void */ WPGMZA.InfoWindow.prototype.getContent = function(callback) { var html = ""; if(this.mapObject instanceof WPGMZA.Marker) html = this.mapObject.address; callback(html); } /** * Opens the info window * @return boolean FALSE if the info window should not & will not open, TRUE if it will */ WPGMZA.InfoWindow.prototype.open = function(map, mapObject) { var self = this; this.mapObject = mapObject; if(WPGMZA.settings.disable_infowindows) return false; return true; } WPGMZA.InfoWindow.prototype.close = function() { } /** * Event listener for when the map object is added. This will cause the info window to open if the map object has infoopen set * @return void */ WPGMZA.InfoWindow.prototype.onMapObjectAdded = function() { if(this.mapObject.settings.infoopen == 1) this.open(); } })(jQuery); // js/v8/latlng.js /** * @namespace WPGMZA * @module LatLng * @requires WPGMZA */ (function($) { /** * Constructor * @param mixed A latLng literal, or latitude * @param mixed The latitude, where arg is a longitude */ WPGMZA.LatLng = function(arg, lng) { this._lat = 0; this._lng = 0; if(arguments.length == 0) return; if(arguments.length == 1) { if(typeof arg != "object" || !("lat" in arg && "lng" in arg)) throw new Error("Argument must be a LatLng literal"); this.lat = arg.lat; this.lng = arg.lng; } else { this.lat = arg; this.lng = lng; } } WPGMZA.LatLng.isValid = function(obj) { if(typeof obj != "object") return false; if(!("lat" in obj && "lng" in obj)) return false; return true; } Object.defineProperty(WPGMZA.LatLng.prototype, "lat", { get: function() { return this._lat; }, set: function(val) { if(!$.isNumeric(val)) throw new Error("Latitude must be numeric"); this._lat = parseFloat( val ); } }); Object.defineProperty(WPGMZA.LatLng.prototype, "lng", { get: function() { return this._lng; }, set: function(val) { if(!$.isNumeric(val)) throw new Error("Longitude must be numeric"); this._lng = parseFloat( val ); } }); WPGMZA.LatLng.prototype.toString = function() { return this._lat + ", " + this._lng; } WPGMZA.LatLng.prototype.toGoogleLatLng = function() { return new google.maps.LatLng({ lat: this.lat, lng: this.lng }); } /** * @function moveByDistance * @summary Moves this latLng by the specified kilometers along the given heading * @return void * With many thanks to Hu Kenneth - https://gis.stackexchange.com/questions/234473/get-a-lonlat-point-by-distance-or-between-2-lonlat-points */ WPGMZA.LatLng.prototype.moveByDistance = function(kilometers, heading) { var radius = 6371; var delta = parseFloat(kilometers) / radius; var theta = parseFloat(heading) / 180 * Math.PI; var phi1 = this.lat / 180 * Math.PI; var lambda1 = this.lng / 180 * Math.PI; var sinPhi1 = Math.sin(phi1), cosPhi1 = Math.cos(phi1); var sinDelta = Math.sin(delta), cosDelta = Math.cos(delta); var sinTheta = Math.sin(theta), cosTheta = Math.cos(theta); var sinPhi2 = sinPhi1 * cosDelta + cosPhi1 * sinDelta * cosTheta; var phi2 = Math.asin(sinPhi2); var y = sinTheta * sinDelta * cosPhi1; var x = cosDelta - sinPhi1 * sinPhi2; var lambda2 = lambda1 + Math.atan2(y, x); this.lat = phi2 * 180 / Math.PI; this.lng = lambda2 * 180 / Math.PI; } })(jQuery); // js/v8/latlngbounds.js /** * @namespace WPGMZA * @module LatLngBounds * @requires WPGMZA */ (function($) { WPGMZA.LatLngBounds = function(southWest, northEast) { } WPGMZA.LatLngBounds.prototype.isInInitialState = function() { return (this.north == undefined && this.south == undefined && this.west == undefined && this.east == undefined); } WPGMZA.LatLngBounds.prototype.extend = function(latLng) { if(this.isInInitialState()) { this.north = this.south = this.west = this.east = new WPGMZA.LatLng(latLng); return; } if(!(latLng instanceof WPGMZA.LatLng)) latLng = new WPGMZA.LatLng(latLng); if(latLng.lat < this.north) this.north = latLng.lat; if(latLng.lat > this.south) this.south = latLng.lat; if(latLng.lng < this.west) this.west = latLng.lng; if(latLng.lng > this.east) this.east = latLng.lng; } })(jQuery); // js/v8/map-object.js /** * @namespace WPGMZA * @module MapObject * @requires WPGMZA.EventDispatcher */ (function($) { WPGMZA.MapObject = function(row) { var self = this; WPGMZA.assertInstanceOf(this, "MapObject"); WPGMZA.EventDispatcher.call(this); this.id = -1; this.guid = WPGMZA.guid(); this.modified = true; this.settings = {}; if(row) { for(var name in row) { if(name == "settings") { if(row["settings"] == null) this["settings"] = {}; else switch(typeof row["settings"]) { case "string": this["settings"] = JSON.parse(row[name]); break; case "object": this["settings"] = row[name]; break; default: throw new Error("Don't know how to interpret settings") break; } for(var name in this.settings) { var value = this.settings[name]; if(String(value).match(/^-?\d+$/)) this.settings[name] = parseInt(value); } } else this[name] = row[name]; } } } WPGMZA.MapObject.prototype = Object.create(WPGMZA.EventDispatcher.prototype); WPGMZA.MapObject.prototype.constructor = WPGMZA.MapObject; WPGMZA.MapObject.prototype.parseGeometry = function(string) { var stripped, pairs, coords, results = []; stripped = string.replace(/[^ ,\d\.\-+e]/g, ""); pairs = stripped.split(","); for(var i = 0; i < pairs.length; i++) { coords = pairs[i].split(" "); results.push({ lat: parseFloat(coords[1]), lng: parseFloat(coords[0]) }); } return results; } WPGMZA.MapObject.prototype.toJSON = function() { return { id: this.id, guid: this.guid, settings: this.settings }; } })(jQuery); // js/v8/circle.js /** * @namespace WPGMZA * @module Circle * @requires WPGMZA.MapObject */ (function($) { var Parent = WPGMZA.MapObject; /** * @class Circle * @summary Represents a generic circle. <b>Please do not instantiate this object directly, use createInstance</b> * @return {WPGMZA.Circle} */ WPGMZA.Circle = function(options, engineCircle) { var self = this; WPGMZA.assertInstanceOf(this, "Circle"); this.center = new WPGMZA.LatLng(); this.radius = 100; Parent.apply(this, arguments); } WPGMZA.Circle.prototype = Object.create(Parent.prototype); WPGMZA.Circle.prototype.constructor = WPGMZA.Circle; /** * @function createInstance * @summary Creates an instance of a circle, <b>please always use this function rather than calling the constructor directly</b> * @param {object} options Options for the object (optional) */ WPGMZA.Circle.createInstance = function(options) { var constructor; if(WPGMZA.settings.engine == "google-maps") constructor = WPGMZA.GoogleCircle; else constructor = WPGMZA.OLCircle; return new constructor(options); } /** * @function getCenter * @returns {WPGMZA.LatLng} */ WPGMZA.Circle.prototype.getCenter = function() { return this.center.clone(); } /** * @function setCenter * @param {object|WPGMZA.LatLng} latLng either a literal or as a WPGMZA.LatLng * @returns {void} */ WPGMZA.Circle.prototype.setCenter = function(latLng) { this.center.lat = latLng.lat; this.center.lng = latLng.lng; } /** * @function getRadius * @summary Returns the circles radius in kilometers * @returns {WPGMZA.LatLng} */ WPGMZA.Circle.prototype.getRadius = function() { return this.radius; } /** * @function setRadius * @param {number} The radius * @returns {void} */ WPGMZA.Circle.prototype.setRadius = function(radius) { this.radius = radius; } /** * @function getMap * @summary Returns the map that this circle is being displayed on * @return {WPGMZA.Map} */ WPGMZA.Circle.prototype.getMap = function() { return this.map; } /** * @function setMap * @param {WPGMZA.Map} The target map * @summary Puts this circle on a map * @return {void} */ WPGMZA.Circle.prototype.setMap = function(map) { if(this.map) this.map.removeCircle(this); if(map) map.addCircle(this); } })(jQuery); // js/v8/map-settings.js /** * @namespace WPGMZA * @module MapSettings * @requires WPGMZA */ (function($) { WPGMZA.MapSettings = function(element) { var str = element.getAttribute("data-settings"); var json = JSON.parse(str); //var id = $(element).attr("data-map-id"); //var json = JSON.parse(window["wpgmza_map_settings_" + id]); WPGMZA.assertInstanceOf(this, "MapSettings"); for(var key in json) { var value = json[key]; if(String(value).match(/^-?\d+$/)) value = parseInt(value); this[key] = value; } } WPGMZA.MapSettings.prototype.toOLViewOptions = function() { var options = { center: ol.proj.fromLonLat([-119.4179, 36.7783]), zoom: 4 }; function empty(name) { if(typeof self[name] == "object") return false; return !self[name] || !self[name].length; } // Start location if(typeof this.start_location == "string") { var coords = this.start_location.replace(/^\(|\)$/g, "").split(","); if(WPGMZA.isLatLngString(this.start_location)) options.center = ol.proj.fromLonLat([ parseFloat(coords[1]), parseFloat(coords[0]) ]); else console.warn("Invalid start location"); } if(this.center) { options.center = ol.proj.fromLonLat([ parseFloat(this.center.lng), parseFloat(this.center.lat) ]); } // Start zoom if(this.zoom) options.zoom = parseInt(this.zoom); if(this.start_zoom) options.zoom = parseInt(this.start_zoom); // Zoom limits // TODO: This matches the Google code, so some of these could be potentially put on a parent class if(!empty("min_zoom")) options.minZoom = parseInt(this.min_zoom); if(!empty("max_zoom")) options.maxZoom = parseInt(this.max_zoom); return options; } WPGMZA.MapSettings.prototype.toGoogleMapsOptions = function() { var self = this; var latLngCoords = (this.start_location && this.start_location.length ? this.start_location.split(",") : [36.7783, -119.4179]); function empty(name) { if(typeof self[name] == "object") return false; return !self[name] || !self[name].length; } function formatCoord(coord) { if($.isNumeric(coord)) return coord; return parseFloat( String(coord).replace(/[\(\)\s]/, "") ); } var latLng = new google.maps.LatLng( formatCoord(latLngCoords[0]), formatCoord(latLngCoords[1]) ); var zoom = (this.start_zoom ? parseInt(this.start_zoom) : 4); if(!this.start_zoom && this.zoom) zoom = parseInt( this.zoom ); var options = { zoom: zoom, center: latLng }; if(!empty("center")) options.center = new google.maps.LatLng({ lat: parseFloat(this.center.lat), lng: parseFloat(this.center.lng) }); if(!empty("min_zoom")) options.minZoom = parseInt(this.min_zoom); if(!empty("max_zoom")) options.maxZoom = parseInt(this.max_zoom); // These settings are all inverted because the checkbox being set means "disabled" options.zoomControl = !(this.map_zoom == true); options.panControl = !(this.map_pan == true); options.mapTypeControl = !(this.disable_map_type_controls == true); options.streetViewControl = !(this.map_streetview == true); options.fullscreenControl = !(this.map_full_screen_control == true); options.draggable = !(this.map_draggable == true); options.disableDoubleClickZoom = !(this.map_clickzoom == true); options.scrollwheel = !(this.map_scroll == true); if(this.force_greedy_gestures) options.gestureHandling = "greedy"; switch(parseInt(this.map_type)) { case 2: options.mapTypeId = google.maps.MapTypeId.SATELLITE; break; case 3: options.mapTypeId = google.maps.MapTypeId.HYBRID; break; case 4: options.mapTypeId = google.maps.MapTypeId.TERRAIN; break; default: options.mapTypeId = google.maps.MapTypeId.ROADMAP; break; } if(this.theme_data && this.theme_data.length > 0) { try{ options.styles = JSON.parse(this.theme_data); }catch(e) { alert("Your theme data is not valid JSON and has been ignored"); } } return options; } })(jQuery); // js/v8/map.js /** * @namespace WPGMZA * @module Map * @requires WPGMZA.EventDispatcher */ (function($) { /** * Constructor * @param element to contain map */ WPGMZA.Map = function(element, options) { var self = this; WPGMZA.assertInstanceOf(this, "Map"); WPGMZA.EventDispatcher.call(this); if(!(element instanceof HTMLElement)) throw new Error("Argument must be a HTMLElement"); this.id = element.getAttribute("data-map-id"); if(!/\d+/.test(this.id)) throw new Error("Map ID must be an integer"); WPGMZA.maps.push(this); this.element = element; this.element.wpgmzaMap = this; this.engineElement = element; this.markers = []; this.polygons = []; this.polylines = []; this.circles = []; this.loadSettings(); } WPGMZA.Map.prototype = Object.create(WPGMZA.EventDispatcher.prototype); WPGMZA.Map.prototype.constructor = WPGMZA.Map; WPGMZA.Map.getConstructor = function() { switch(WPGMZA.settings.engine) { case "google-maps": if(WPGMZA.isProVersion()) return WPGMZA.GoogleProMap; return WPGMZA.GoogleMap; break; default: if(WPGMZA.isProVersion()) return WPGMZA.OLProMap; return WPGMZA.OLMap; break; } } WPGMZA.Map.createInstance = function(element, options) { var constructor = WPGMZA.Map.getConstructor(); return new constructor(element, options); } /** * Loads the maps settings and sets some defaults * @return void */ WPGMZA.Map.prototype.loadSettings = function() { var settings = new WPGMZA.MapSettings(this.element); this.settings = $.extend({}, WPGMZA.settings, settings); } /** * Sets options in bulk on map * @return void */ WPGMZA.Map.prototype.setOptions = function(options) { for(var name in options) this.settings[name] = options[name]; } /** * Gets the distance between two latLngs in kilometers * NB: Static function * @return number */ var earthRadiusMeters = 6371; var piTimes360 = Math.PI / 360; function deg2rad(deg) { return deg * (Math.PI/180) }; /** * This gets the distance in kilometers between two latitude / longitude points * TODO: Move this to the distance class, or the LatLng class * @return void */ WPGMZA.Map.getGeographicDistance = function(lat1, lon1, lat2, lon2) { var dLat = deg2rad(lat2-lat1); var dLon = deg2rad(lon2-lon1); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = earthRadiusMeters * c; // Distance in km return d; } WPGMZA.Map.prototype.setCenter = function(latLng) { if(!("lat" in latLng && "lng" in latLng)) throw new Error("Argument is not an object with lat and lng"); } /** * Sets the dimensions of the map * @return void */ WPGMZA.Map.prototype.setDimensions = function(width, height) { $(this.element).css({ width: width }); $(this.engineElement).css({ width: "100%", height: height }); } /** * Adds the specified marker to this map * @return void */ WPGMZA.Map.prototype.addMarker = function(marker) { if(!(marker instanceof WPGMZA.Marker)) throw new Error("Argument must be an instance of WPGMZA.Marker"); marker.map = this; marker.parent = this; this.markers.push(marker); this.dispatchEvent({type: "markeradded", marker: marker}); marker.dispatchEvent({type: "added"}); } /** * Removes the specified marker from this map * @return void */ WPGMZA.Map.prototype.removeMarker = function(marker) { if(!(marker instanceof WPGMZA.Marker)) throw new Error("Argument must be an instance of WPGMZA.Marker"); if(marker.map !== this) throw new Error("Wrong map error"); marker.map = null; marker.parent = null; this.markers.splice(this.markers.indexOf(marker), 1); this.dispatchEvent({type: "markerremoved", marker: marker}); marker.dispatchEvent({type: "removed"}); } WPGMZA.Map.prototype.getMarkerByID = function(id) { for(var i = 0; i < this.markers.length; i++) { if(this.markers[i].id == id) return this.markers[i]; } return null; } WPGMZA.Map.prototype.removeMarkerByID = function(id) { var marker = this.getMarkerByID(id); if(!marker) return; this.removeMarker(marker); } /** * Adds the specified polygon to this map * @return void */ WPGMZA.Map.prototype.addPolygon = function(polygon) { if(!(polygon instanceof WPGMZA.Polygon)) throw new Error("Argument must be an instance of WPGMZA.Polygon"); polygon.map = this; this.polygons.push(polygon); this.dispatchEvent({type: "polygonadded", polygon: polygon}); } /** * Removes the specified polygon from this map * @return void */ WPGMZA.Map.prototype.deletePolygon = function(polygon) { if(!(polygon instanceof WPGMZA.Polygon)) throw new Error("Argument must be an instance of WPGMZA.Polygon"); if(polygon.map !== this) throw new Error("Wrong map error"); polygon.map = null; this.polygons.splice(this.polygons.indexOf(polygon), 1); this.dispatchEvent({type: "polygonremoved", polygon: polygon}); } WPGMZA.Map.prototype.getPolygonByID = function(id) { for(var i = 0; i < this.polygons.length; i++) { if(this.polygons[i].id == id) return this.polygons[i]; } return null; } WPGMZA.Map.prototype.deletePolygonByID = function(id) { var polygon = this.getPolygonByID(id); if(!polygon) return; this.deletePolygon(polygon); } /** * Gets a polyline by ID * @return void */ WPGMZA.Map.prototype.getPolylineByID = function(id) { for(var i = 0; i < this.polylines.length; i++) { if(this.polylines[i].id == id) return this.polylines[i]; } return null; } /** * Adds the specified polyline to this map * @return void */ WPGMZA.Map.prototype.addPolyline = function(polyline) { if(!(polyline instanceof WPGMZA.Polyline)) throw new Error("Argument must be an instance of WPGMZA.Polyline"); polyline.map = this; this.polylines.push(polyline); this.dispatchEvent({type: "polylineadded", polyline: polyline}); } /** * Removes the specified polyline from this map * @return void */ WPGMZA.Map.prototype.deletePolyline = function(polyline) { if(!(polyline instanceof WPGMZA.Polyline)) throw new Error("Argument must be an instance of WPGMZA.Polyline"); if(polyline.map !== this) throw new Error("Wrong map error"); polyline.map = null; this.polylines.splice(this.polylines.indexOf(polyline), 1); this.dispatchEvent({type: "polylineremoved", polyline: polyline}); } WPGMZA.Map.prototype.getPolylineByID = function(id) { for(var i = 0; i < this.polylines.length; i++) { if(this.polylines[i].id == id) return this.polylines[i]; } return null; } WPGMZA.Map.prototype.deletePolylineByID = function(id) { var polyline = this.getPolylineByID(id); if(!polyline) return; this.deletePolyline(polyline); } /** * Adds the specified circle to this map * @return void */ WPGMZA.Map.prototype.addCircle = function(circle) { if(!(circle instanceof WPGMZA.Circle)) throw new Error("Argument must be an instance of WPGMZA.Circle"); circle.map = this; this.circles.push(circle); this.dispatchEvent({type: "circleadded", circle: circle}); } /** * Removes the specified circle from this map * @return void */ WPGMZA.Map.prototype.removeCircle = function(circle) { if(!(circle instanceof WPGMZA.Circle)) throw new Error("Argument must be an instance of WPGMZA.Circle"); if(circle.map !== this) throw new Error("Wrong map error"); circle.map = null; this.circles.splice(this.circles.indexOf(circle), 1); this.dispatchEvent({type: "circleremoved", circle: circle}); } WPGMZA.Map.prototype.getCircleByID = function(id) { for(var i = 0; i < this.circles.length; i++) { if(this.circles[i].id == id) return this.circles[i]; } return null; } WPGMZA.Map.prototype.deleteCircleByID = function(id) { var circle = this.getCircleByID(id); if(!circle) return; this.deleteCircle(circle); } /** * Nudges the map viewport by the given pixel coordinates * @return void */ WPGMZA.Map.prototype.nudge = function(x, y) { var pixels = this.latLngToPixels(this.getCenter()); pixels.x += parseFloat(x); pixels.y += parseFloat(y); if(isNaN(pixels.x) || isNaN(pixels.y)) throw new Error("Invalid coordinates supplied"); var latLng = this.pixelsToLatLng(pixels); this.setCenter(latLng); } /** * Triggered when the window resizes * @return void */ WPGMZA.Map.prototype.onWindowResize = function(event) { } /** * Listener for when the engine map div is resized * @return void */ WPGMZA.Map.prototype.onElementResized = function(event) { } WPGMZA.Map.prototype.onBoundsChanged = function(event) { // Native events this.trigger("boundschanged"); $(this.element).trigger("boundschanged.wpgmza"); // Google / legacy compatibility events this.trigger("bounds_changed"); $(this.element).trigger("bounds_changed"); } WPGMZA.Map.prototype.onIdle = function(event) { $(this.element).trigger("idle"); $(this.element).trigger("idle.wpgmza"); } /*$(document).ready(function() { function createMaps() { // TODO: Test that this works for maps off screen (which borks google) $(".wpgmza-map").each(function(index, el) { if(!el.wpgmzaMap) { WPGMZA.runCatchableTask(function() { WPGMZA.Map.createInstance(el); }, el); } }); } createMaps(); // Call again each second to load AJAX maps setInterval(createMaps, 1000); });*/ })(jQuery); // js/v8/maps-engine-dialog.js /** * @namespace WPGMZA * @module MapsEngineDialog * @requires WPGMZA */ (function($) { WPGMZA.MapsEngineDialog = function(element) { var self = this; this.element = element; $(element).show(); $(element).remodal().open(); $("[data-maps-engine]").on("click", function(event) { self.onButtonClicked(event); }); } WPGMZA.MapsEngineDialog.prototype.onButtonClicked = function(event) { $(event.target).prop("disabled", true); $.ajax(WPGMZA.ajaxurl, { method: "POST", data: { action: "wpgmza_maps_engine_dialog_set_engine", engine: $(event.target).attr("data-maps-engine") }, success: function(response, status, xhr) { window.location.reload(); } }); } $(window).on("load", function(event) { var element = $("#wpgmza-maps-engine-dialog"); if(!element.length) return; if(WPGMZA.settings.wpgmza_maps_engine_dialog_done) return; WPGMZA.mapsEngineDialog = new WPGMZA.MapsEngineDialog(element); }); })(jQuery); // js/v8/marker.js /** * @namespace WPGMZA * @module Marker * @requires WPGMZA */ (function($) { /** * Constructor * @param json to load (optional) */ WPGMZA.Marker = function(row) { var self = this; WPGMZA.assertInstanceOf(this, "Marker"); this.lat = "36.778261"; this.lng = "-119.4179323999"; this.address = "California"; this.title = null; this.description = ""; this.link = ""; this.icon = ""; this.approved = 1; this.pic = null; WPGMZA.MapObject.apply(this, arguments); if(row && row.heatmap) return; // Don't listen for these events on heatmap markers. this.on("init", function(event) { if(row.position) this.setPosition(row.position); if(row.map) row.map.addMarker(this); }); this.addEventListener("added", function(event) { self.onAdded(event); }); } WPGMZA.Marker.prototype = Object.create(WPGMZA.MapObject.prototype); WPGMZA.Marker.prototype.constructor = WPGMZA.Marker; /** * Gets the constructor. You can use this instead of hard coding the parent class when inheriting, * which is helpful for making subclasses that work with Basic only, Pro, Google, OL or a * combination of the four. * @return function */ WPGMZA.Marker.getConstructor = function() { switch(WPGMZA.settings.engine) { case "google-maps": if(WPGMZA.isProVersion()) return WPGMZA.GoogleProMarker; return WPGMZA.GoogleMarker; break; default: if(WPGMZA.isProVersion()) return WPGMZA.OLProMarker; return WPGMZA.OLMarker; break; } } WPGMZA.Marker.createInstance = function(row) { var constructor = WPGMZA.Marker.getConstructor(); return new constructor(row); } WPGMZA.Marker.ANIMATION_NONE = "0"; WPGMZA.Marker.ANIMATION_BOUNCE = "1"; WPGMZA.Marker.ANIMATION_DROP = "2"; WPGMZA.Marker.prototype.onAdded = function(event) { var self = this; this.infoWindow = WPGMZA.InfoWindow.createInstance(this); this.addEventListener("click", function(event) { self.onClick(event); }); this.addEventListener("mouseover", function(event) { self.onMouseOver(event); }); this.addEventListener("select", function(event) { self.onSelect(event); }); if(this.map.settings.marker == this.id) self.trigger("select"); } /** * This function will hide the last info the user interacted with * @return void */ WPGMZA.Marker.prototype.hidePreviousInteractedInfoWindow = function() { if(!this.map.lastInteractedMarker) return; this.map.lastInteractedMarker.infoWindow.close(); } WPGMZA.Marker.prototype.openInfoWindow = function() { this.hidePreviousInteractedInfoWindow(); this.infoWindow.open(this.map, this); this.map.lastInteractedMarker = this; } WPGMZA.Marker.prototype.onClick = function(event) { } WPGMZA.Marker.prototype.onSelect = function(event) { this.openInfoWindow(); } WPGMZA.Marker.prototype.onMouseOver = function(event) { if(this.map.settings.info_window_open_by == WPGMZA.InfoWindow.OPEN_BY_HOVER) this.openInfoWindow(); } WPGMZA.Marker.prototype.getIcon = function() { return WPGMZA.settings.default_marker_icon; } /** * Gets the position of the marker * @return object */ WPGMZA.Marker.prototype.getPosition = function() { return { lat: parseFloat(this.lat), lng: parseFloat(this.lng) }; } /** * Sets the position of the marker * @return void */ WPGMZA.Marker.prototype.setPosition = function(latLng) { if(latLng instanceof WPGMZA.LatLng) { this.lat = latLng.lat; this.lng = latLng.lng; } else { this.lat = parseFloat(latLng.lat); this.lng = parseFloat(latLng.lng); } } /** * Set the marker animation * @return void */ WPGMZA.Marker.prototype.getAnimation = function(animation) { return this.settings.animation; } /** * Set the marker animation * @return void */ WPGMZA.Marker.prototype.setAnimation = function(animation) { this.settings.animation = animation; } /** * Get the marker visibility * @return void */ WPGMZA.Marker.prototype.getVisible = function(visible) { } /** * Set the marker visibility. This is used by the store locator etc. and is not a setting * @return void */ WPGMZA.Marker.prototype.setVisible = function(visible) { if(!visible && this.infoWindow) this.infoWindow.close(); } WPGMZA.Marker.prototype.setMap = function(map) { if(!map) { if(this.map) this.map.removeMarker(this); return; } map.addMarker(this); } WPGMZA.Marker.prototype.getDraggable = function() { } WPGMZA.Marker.prototype.setDraggable = function(draggable) { } WPGMZA.Marker.prototype.panIntoView = function() { if(!this.map) throw new Error("Marker hasn't been added to a map"); this.map.setCenter(this.getPosition()); } /** * Returns the marker as a JSON object * @return object */ WPGMZA.Marker.prototype.toJSON = function() { var result = WPGMZA.MapObject.prototype.toJSON.call(this); var position = this.getPosition(); $.extend(result, { lat: position.lat, lng: position.lng, address: this.address, title: this.title, description: this.description, link: this.link, icon: this.icon, pic: this.pic, approved: this.approved }); return result; } })(jQuery); // js/v8/modern-store-locator-circle.js /** * @namespace WPGMZA * @module ModernStoreLocatorCircle * @requires WPGMZA */ (function($) { /** * This module is the modern store locator circle * @constructor */ WPGMZA.ModernStoreLocatorCircle = function(map_id, settings) { var self = this; var map; if(WPGMZA.isProVersion()) map = this.map = MYMAP[map_id].map; else map = this.map = MYMAP.map; this.map_id = map_id; this.mapElement = map.element; this.mapSize = { width: $(this.mapElement).width(), height: $(this.mapElement).height() }; this.initCanvasLayer(); this.settings = { center: new WPGMZA.LatLng(0, 0), radius: 1, color: "#63AFF2", shadowColor: "white", shadowBlur: 4, centerRingRadius: 10, centerRingLineWidth: 3, numInnerRings: 9, innerRingLineWidth: 1, innerRingFade: true, numOuterRings: 7, ringLineWidth: 1, mainRingLineWidth: 2, numSpokes: 6, spokesStartAngle: Math.PI / 2, numRadiusLabels: 6, radiusLabelsStartAngle: Math.PI / 2, radiusLabelFont: "13px sans-serif", visible: false }; if(settings) this.setOptions(settings); }; WPGMZA.ModernStoreLocatorCircle.createInstance = function(map, settings) { if(WPGMZA.settings.engine == "google-maps") return new WPGMZA.GoogleModernStoreLocatorCircle(map, settings); else return new WPGMZA.OLModernStoreLocatorCircle(map, settings); }; WPGMZA.ModernStoreLocatorCircle.prototype.initCanvasLayer = function() { } WPGMZA.ModernStoreLocatorCircle.prototype.onResize = function(event) { this.draw(); }; WPGMZA.ModernStoreLocatorCircle.prototype.onUpdate = function(event) { this.draw(); }; WPGMZA.ModernStoreLocatorCircle.prototype.setOptions = function(options) { for(var name in options) { var functionName = "set" + name.substr(0, 1).toUpperCase() + name.substr(1); if(typeof this[functionName] == "function") this[functionName](options[name]); else this.settings[name] = options[name]; } }; WPGMZA.ModernStoreLocatorCircle.prototype.getResolutionScale = function() { return window.devicePixelRatio || 1; }; WPGMZA.ModernStoreLocatorCircle.prototype.getCenter = function() { return this.getPosition(); }; WPGMZA.ModernStoreLocatorCircle.prototype.setCenter = function(value) { this.setPosition(value); }; WPGMZA.ModernStoreLocatorCircle.prototype.getPosition = function() { return this.settings.center; }; WPGMZA.ModernStoreLocatorCircle.prototype.setPosition = function(position) { this.settings.center = position; }; WPGMZA.ModernStoreLocatorCircle.prototype.getRadius = function() { return this.settings.radius; }; WPGMZA.ModernStoreLocatorCircle.prototype.setRadius = function(radius) { if(isNaN(radius)) throw new Error("Invalid radius"); this.settings.radius = radius; }; WPGMZA.ModernStoreLocatorCircle.prototype.getVisible = function(visible) { return this.settings.visible; }; WPGMZA.ModernStoreLocatorCircle.prototype.setVisible = function(visible) { this.settings.visible = visible; }; /** * This function transforms a km radius into canvas space * @return number */ WPGMZA.ModernStoreLocatorCircle.prototype.getTransformedRadius = function(km) { throw new Error("Abstract function called"); } WPGMZA.ModernStoreLocatorCircle.prototype.getContext = function(type) { throw new Error("Abstract function called"); } WPGMZA.ModernStoreLocatorCircle.prototype.getCanvasDimensions = function() { throw new Error("Abstract function called"); } WPGMZA.ModernStoreLocatorCircle.prototype.draw = function() { var settings = this.settings; var canvasDimensions = this.getCanvasDimensions(); var canvasWidth = canvasDimensions.width; var canvasHeight = canvasDimensions.height; var map = this.map; var resolutionScale = this.getResolutionScale(); context = this.getContext("2d"); context.clearRect(0, 0, canvasWidth, canvasHeight); if(!settings.visible) return; context.shadowColor = settings.shadowColor; context.shadowBlur = settings.shadowBlur; // NB: 2018/02/13 - Left this here in case it needs to be calibrated more accurately /*if(!this.testCircle) { this.testCircle = new google.maps.Circle({ strokeColor: "#ff0000", strokeOpacity: 0.5, strokeWeight: 3, map: this.map, center: this.settings.center }); } this.testCircle.setCenter(settings.center); this.testCircle.setRadius(settings.radius * 1000);*/ // Reset transform context.setTransform(1, 0, 0, 1, 0, 0); var scale = Math.pow(2, map.getZoom()) * resolutionScale; context.scale(scale, scale); // Translate by world origin var offset = this.getWorldOriginOffset(); context.translate(offset.x, offset.y); // Get center and project to pixel space var center = new WPGMZA.LatLng(this.settings.center); var worldPoint = this.getCenterPixels(); var rgba = WPGMZA.hexToRgba(settings.color); var ringSpacing = this.getTransformedRadius(settings.radius) / (settings.numInnerRings + 1); // TODO: Implement gradients for color and opacity // Inside circle (fixed?) context.strokeStyle = settings.color; context.lineWidth = (1 / scale) * settings.centerRingLineWidth; context.beginPath(); context.arc( worldPoint.x, worldPoint.y, this.getTransformedRadius(settings.centerRingRadius) / scale, 0, 2 * Math.PI ); context.stroke(); context.closePath(); // Spokes var radius = this.getTransformedRadius(settings.radius) + (ringSpacing * settings.numOuterRings) + 1; var grad = context.createRadialGradient(0, 0, 0, 0, 0, radius); var rgba = WPGMZA.hexToRgba(settings.color); var start = WPGMZA.rgbaToString(rgba), end; var spokeAngle; rgba.a = 0; end = WPGMZA.rgbaToString(rgba); grad.addColorStop(0, start); grad.addColorStop(1, end); context.save(); context.translate(worldPoint.x, worldPoint.y); context.strokeStyle = grad; context.lineWidth = 2 / scale; for(var i = 0; i < settings.numSpokes; i++) { spokeAngle = settings.spokesStartAngle + (Math.PI * 2) * (i / settings.numSpokes); x = Math.cos(spokeAngle) * radius; y = Math.sin(spokeAngle) * radius; context.setLineDash([2 / scale, 15 / scale]); context.beginPath(); context.moveTo(0, 0); context.lineTo(x, y); context.stroke(); } context.setLineDash([]); context.restore(); // Inner ringlets context.lineWidth = (1 / scale) * settings.innerRingLineWidth; for(var i = 1; i <= settings.numInnerRings; i++) { var radius = i * ringSpacing; if(settings.innerRingFade) rgba.a = 1 - (i - 1) / settings.numInnerRings; context.strokeStyle = WPGMZA.rgbaToString(rgba); context.beginPath(); context.arc(worldPoint.x, worldPoint.y, radius, 0, 2 * Math.PI); context.stroke(); context.closePath(); } // Main circle context.strokeStyle = settings.color; context.lineWidth = (1 / scale) * settings.centerRingLineWidth; context.beginPath(); context.arc(worldPoint.x, worldPoint.y, this.getTransformedRadius(settings.radius), 0, 2 * Math.PI); context.stroke(); context.closePath(); // Outer ringlets var radius = radius + ringSpacing; for(var i = 0; i < settings.numOuterRings; i++) { if(settings.innerRingFade) rgba.a = 1 - i / settings.numOuterRings; context.strokeStyle = WPGMZA.rgbaToString(rgba); context.beginPath(); context.arc(worldPoint.x, worldPoint.y, radius, 0, 2 * Math.PI); context.stroke(); context.closePath(); radius += ringSpacing; } // Text if(settings.numRadiusLabels > 0) { var m; var radius = this.getTransformedRadius(settings.radius); var clipRadius = (12 * 1.1) / scale; var x, y; if(m = settings.radiusLabelFont.match(/(\d+)px/)) clipRadius = (parseInt(m[1]) / 2 * 1.1) / scale; context.font = settings.radiusLabelFont; context.textAlign = "center"; context.textBaseline = "middle"; context.fillStyle = settings.color; context.save(); context.translate(worldPoint.x, worldPoint.y) for(var i = 0; i < settings.numRadiusLabels; i++) { var spokeAngle = settings.radiusLabelsStartAngle + (Math.PI * 2) * (i / settings.numRadiusLabels); var textAngle = spokeAngle + Math.PI / 2; var text = settings.radiusString; var width; if(Math.sin(spokeAngle) > 0) textAngle -= Math.PI; x = Math.cos(spokeAngle) * radius; y = Math.sin(spokeAngle) * radius; context.save(); context.translate(x, y); context.rotate(textAngle); context.scale(1 / scale, 1 / scale); width = context.measureText(text).width; height = width / 2; context.clearRect(-width, -height, 2 * width, 2 * height); context.fillText(settings.radiusString, 0, 0); context.restore(); } context.restore(); } } })(jQuery); // js/v8/modern-store-locator.js /** * @namespace WPGMZA * @module ModernStoreLocator * @requires WPGMZA */ (function($) { /** * The new modern look store locator. It takes the elements * from the default look and moves them into the map, wrapping * in a new element so we can apply new styles. * @return Object */ WPGMZA.ModernStoreLocator = function(map_id) { var self = this; var original; WPGMZA.assertInstanceOf(this, "ModernStoreLocator"); if(WPGMZA.isProVersion()) original = $(".wpgmza_sl_search_button[mid='" + map_id + "']").closest(".wpgmza_sl_main_div"); else original = $(".wpgmza_sl_search_button").closest(".wpgmza_sl_main_div"); if(!original.length) return; // Build / re-arrange elements this.element = $("<div class='wpgmza-modern-store-locator'><div class='wpgmza-inner wpgmza-modern-hover-opaque'/></div>")[0]; var inner = $(this.element).find(".wpgmza-inner"); var titleSearch = $(original).find("[id='nameInput_" + map_id + "']"); if(titleSearch.length) { var placeholder = wpgmaps_localize[map_id].other_settings.store_locator_name_string; if(placeholder && placeholder.length) titleSearch.attr("placeholder", placeholder); inner.append(titleSearch); } var addressInput; if(WPGMZA.isProVersion()) addressInput = $(original).find(".addressInput"); else addressInput = $(original).find("#addressInput"); if(wpgmaps_localize[map_id].other_settings.store_locator_query_string && wpgmaps_localize[map_id].other_settings.store_locator_query_string.length) addressInput.attr("placeholder", wpgmaps_localize[map_id].other_settings.store_locator_query_string); inner.append(addressInput); inner.append($(original).find("select.wpgmza_sl_radius_select")); // inner.append($(original).find(".wpgmza_filter_select_" + map_id)); // Buttons this.searchButton = $(original).find( ".wpgmza_sl_search_button" ); inner.append(this.searchButton); this.resetButton = $(original).find( ".wpgmza_sl_reset_button_div" ); inner.append(this.resetButton); this.resetButton.hide(); if(WPGMZA.isProVersion()) { this.searchButton.on("click", function(event) { if($("addressInput_" + map_id).val() == 0) return; self.searchButton.hide(); self.resetButton.show(); }); this.resetButton.on("click", function(event) { self.resetButton.hide(); self.searchButton.show(); }); } // Distance type inner.append($("#wpgmza_distance_type_" + map_id)); // Categories var container = $(original).find(".wpgmza_cat_checkbox_holder"); var ul = $(container).children("ul"); var items = $(container).find("li"); var numCategories = 0; //$(items).find("ul").remove(); //$(ul).append(items); var icons = []; items.each(function(index, el) { var id = $(el).attr("class").match(/\d+/); for(var category_id in wpgmza_category_data) { if(id == category_id) { var src = wpgmza_category_data[category_id].image; var icon = $('<div class="wpgmza-chip-icon"/>'); icon.css({ "background-image": "url('" + src + "')", "width": $("#wpgmza_cat_checkbox_" + category_id + " + label").height() + "px" }); icons.push(icon); if(src != null && src != ""){ //$(el).find("label").prepend(icon); $("#wpgmza_cat_checkbox_" + category_id + " + label").prepend(icon); } numCategories++; break; } } }); $(this.element).append(container); if(numCategories) { this.optionsButton = $('<span class="wpgmza_store_locator_options_button"><i class="fas fa-list"></i></span>'); $(this.searchButton).before(this.optionsButton); } setInterval(function() { icons.forEach(function(icon) { var height = $(icon).height(); $(icon).css({"width": height + "px"}); $(icon).closest("label").css({"padding-left": height + 8 + "px"}); }); $(container).css("width", $(self.element).find(".wpgmza-inner").outerWidth() + "px"); }, 1000); $(this.element).find(".wpgmza_store_locator_options_button").on("click", function(event) { if(container.hasClass("wpgmza-open")) container.removeClass("wpgmza-open"); else container.addClass("wpgmza-open"); }); // Remove original element $(original).remove(); // Event listeners $(this.element).find("input, select").on("focus", function() { $(inner).addClass("active"); }); $(this.element).find("input, select").on("blur", function() { $(inner).removeClass("active"); }); } WPGMZA.ModernStoreLocator.createInstance = function(map_id) { if(WPGMZA.settings.engine == "google-maps") return new WPGMZA.GoogleModernStoreLocator(map_id); else return new WPGMZA.OLModernStoreLocator(map_id); } })(jQuery); // js/v8/polygon.js /** * @namespace WPGMZA * @module Polygon * @requires WPGMZA.MapObject */ (function($) { WPGMZA.Polygon = function(row, enginePolygon) { var self = this; WPGMZA.assertInstanceOf(this, "Polygon"); this.paths = null; this.title = null; this.name = null; this.link = null; WPGMZA.MapObject.apply(this, arguments); } WPGMZA.Polygon.prototype = Object.create(WPGMZA.MapObject.prototype); WPGMZA.Polygon.prototype.constructor = WPGMZA.Polygon; WPGMZA.Polygon.getConstructor = function() { switch(WPGMZA.settings.engine) { case "google-maps": if(WPGMZA.isProVersion()) return WPGMZA.GoogleProPolygon; return WPGMZA.GooglePolygon; break; default: if(WPGMZA.isProVersion()) return WPGMZA.OLProPolygon; return WPGMZA.OLPolygon; break; } } WPGMZA.Polygon.createInstance = function(row, engineObject) { var constructor = WPGMZA.Polygon.getConstructor(); return new constructor(row, engineObject); } WPGMZA.Polygon.prototype.toJSON = function() { var result = WPGMZA.MapObject.prototype.toJSON.call(this); $.extend(result, { name: this.name, title: this.title, link: this.link, }); return result; } })(jQuery); // js/v8/polyline.js /** * @namespace WPGMZA * @module Polyline * @requires WPGMZA.MapObject */ (function($) { WPGMZA.Polyline = function(row, googlePolyline) { var self = this; WPGMZA.assertInstanceOf(this, "Polyline"); this.title = null; WPGMZA.MapObject.apply(this, arguments); } WPGMZA.Polyline.prototype = Object.create(WPGMZA.MapObject.prototype); WPGMZA.Polyline.prototype.constructor = WPGMZA.Polyline; WPGMZA.Polyline.getConstructor = function() { switch(WPGMZA.settings.engine) { case "google-maps": return WPGMZA.GooglePolyline; break; default: return WPGMZA.OLPolyline; break; } } WPGMZA.Polyline.createInstance = function(row, engineObject) { var constructor = WPGMZA.Polyline.getConstructor(); return new constructor(row, engineObject); } WPGMZA.Polyline.prototype.getPoints = function() { return this.toJSON().points; } WPGMZA.Polyline.prototype.toJSON = function() { var result = WPGMZA.MapObject.prototype.toJSON.call(this); result.title = this.title; return result; } })(jQuery); // js/v8/google-maps/google-circle.js /** * @namespace WPGMZA * @module GoogleCircle * @requires WPGMZA.Circle */ (function($) { WPGMZA.GoogleCircle = function(options, googleCircle) { var self = this; WPGMZA.Circle.call(this, options, googleCircle); if(googleCircle) { this.googleCircle = googleCircle; } else { this.googleCircle = new google.maps.Circle(); this.googleCircle.wpgmzaCircle = this; } google.maps.event.addListener(this.googleCircle, "click", function() { self.dispatchEvent({type: "click"}); }); if(options) { var googleOptions = {}; googleOptions = $.extend({}, options); delete googleOptions.map; delete googleOptions.center; if(options.center) googleOptions.center = new google.maps.LatLng({ lat: options.center.lat, lng: options.center.lng }); this.googleCircle.setOptions(googleOptions); if(options.map) options.map.addCircle(this); } } WPGMZA.GoogleCircle.prototype = Object.create(WPGMZA.Circle.prototype); WPGMZA.GoogleCircle.prototype.constructor = WPGMZA.GoogleCircle; })(jQuery); // js/v8/google-maps/google-geocoder.js /** * @namespace WPGMZA * @module GoogleGeocoder * @requires WPGMZA.Geocoder */ (function($) { WPGMZA.GoogleGeocoder = function() { } WPGMZA.GoogleGeocoder.prototype = Object.create(WPGMZA.Geocoder.prototype); WPGMZA.GoogleGeocoder.prototype.constructor = WPGMZA.GoogleGeocoder; WPGMZA.GoogleGeocoder.prototype.getLatLngFromAddress = function(options, callback) { if(!options || !options.address) throw new Error("No address specified"); if(WPGMZA.isLatLngString(options.address)) return WPGMZA.Geocoder.prototype.getLatLngFromAddress.call(this, options, callback); if(options.country) options.componentRestrictions = { country: options.country }; var geocoder = new google.maps.Geocoder(); geocoder.geocode(options, function(results, status) { if(status == google.maps.GeocoderStatus.OK) { var location = results[0].geometry.location; latLng = { lat: location.lat(), lng: location.lng() }; var results = [ { geometry: { location: latLng }, latLng: latLng } ]; callback(results, WPGMZA.Geocoder.SUCCESS); } else { var nativeStatus = WPGMZA.Geocoder.FAIL; if(status == google.maps.GeocoderStatus.ZERO_RESULTS) nativeStatus = WPGMZA.Geocoder.ZERO_RESULTS; callback(null, nativeStatus); } }); } })(jQuery); // js/v8/google-maps/google-info-window.js /** * @namespace WPGMZA * @module GoogleInfoWindow * @requires WPGMZA.InfoWindow * @pro-requires WPGMZA.ProInfoWindow */ (function($) { var Parent; WPGMZA.GoogleInfoWindow = function(mapObject) { Parent.call(this, mapObject); this.setMapObject(mapObject); } if(WPGMZA.isProVersion()) Parent = WPGMZA.ProInfoWindow; else Parent = WPGMZA.InfoWindow; WPGMZA.GoogleInfoWindow.prototype = Object.create(Parent.prototype); WPGMZA.GoogleInfoWindow.prototype.constructor = WPGMZA.GoogleInfoWindow; WPGMZA.GoogleInfoWindow.prototype.setMapObject = function(mapObject) { if(mapObject instanceof WPGMZA.Marker) this.googleObject = mapObject.googleMarker; else if(mapObject instanceof WPGMZA.Polygon) this.googleObject = mapObject.googlePolygon; else if(mapObject instanceof WPGMZA.Polyline) this.googleObject = mapObject.googlePolyline; } WPGMZA.GoogleInfoWindow.prototype.createGoogleInfoWindow = function() { if(this.googleInfoWindow) return; this.googleInfoWindow = new google.maps.InfoWindow(); } /** * Opens the info window * @return boolean FALSE if the info window should not & will not open, TRUE if it will */ WPGMZA.GoogleInfoWindow.prototype.open = function(map, mapObject) { var self = this; if(!Parent.prototype.open.call(this, map, mapObject)) return false; this.createGoogleInfoWindow(); this.setMapObject(mapObject); this.googleInfoWindow.open( this.mapObject.map.googleMap, this.googleObject ); if(this.content) this.googleInfoWindow.setContent(this.content); //this. /*this.getContent(function(html) { // Wrap HTML with unique ID var guid = WPGMZA.guid(); var html = "<div id='" + guid + "'>" + html + "</div>"; var div, intervalID; self.googleInfoWindow.setContent(html); self.googleInfoWindow.open( self.mapObject.map.googleMap, self.googleObject ); intervalID = setInterval(function(event) { div = $("#" + guid); if(div.find(".gm-style-iw").length) { div[0].wpgmzaMapObject = self.mapObject; self.dispatchEvent("infowindowopen"); div.trigger("infowindowopen"); clearInterval(intervalID); } }, 50); });*/ return true; } WPGMZA.GoogleInfoWindow.prototype.close = function() { if(!this.googleInfoWindow) return; WPGMZA.InfoWindow.prototype.close.call(this); this.googleInfoWindow.close(); } WPGMZA.GoogleInfoWindow.prototype.setContent = function(html) { this.content = html; this.createGoogleInfoWindow(); this.googleInfoWindow.setContent(html); } })(jQuery); // js/v8/google-maps/google-map.js /** * @namespace WPGMZA * @module GoogleMap * @requires WPGMZA.Map * @pro-requires WPGMZA.ProMap */ (function($) { var Parent; /** * Constructor * @param element to contain the map */ WPGMZA.GoogleMap = function(element, options) { var self = this; if(!window.google) throw new Error("Google API not loaded - " + wpgmza_api_not_enqueued_reason); Parent.call(this, element, options); this.loadGoogleMap(); if(options) this.setOptions(options); google.maps.event.addListener(this.googleMap, "click", function(event) { self.dispatchEvent("click"); }); google.maps.event.addListener(this.googleMap, "rightclick", function(event) { var wpgmzaEvent = new WPGMZA.Event("rightclick"); wpgmzaEvent.latLng = { lat: event.latLng.lat(), lng: event.latLng.lng() }; self.dispatchEvent(wpgmzaEvent); }); google.maps.event.addListener(this.googleMap, "dragend", function(event) { self.dispatchEvent("dragend"); }); google.maps.event.addListener(this.googleMap, "zoom_changed", function(event) { self.dispatchEvent("zoom_changed"); self.dispatchEvent("zoomchanged"); }); // Idle event google.maps.event.addListener(this.googleMap, "idle", function(event) { self.onIdle(event); }); // Dispatch event if(!WPGMZA.isProVersion()) { this.dispatchEvent("created"); WPGMZA.events.dispatchEvent({type: "mapcreated", map: this}); } } // If we're running the Pro version, inherit from ProMap, otherwise, inherit from Map if(WPGMZA.isProVersion()) { Parent = WPGMZA.ProMap; WPGMZA.GoogleMap.prototype = Object.create(WPGMZA.ProMap.prototype); } else { Parent = WPGMZA.Map; WPGMZA.GoogleMap.prototype = Object.create(WPGMZA.Map.prototype); } WPGMZA.GoogleMap.prototype.constructor = WPGMZA.GoogleMap; /** * Creates the Google Maps map * @return void */ WPGMZA.GoogleMap.prototype.loadGoogleMap = function() { var self = this; var options = this.settings.toGoogleMapsOptions(); this.googleMap = new google.maps.Map(this.engineElement, options); google.maps.event.addListener(this.googleMap, "bounds_changed", function() { self.onBoundsChanged(); }); if(this.settings.bicycle) this.enableBicycleLayer(true); if(this.settings.traffic) this.enableTrafficLayer(true); if(this.settings.transport) this.enablePublicTransportLayer(true); this.showPointsOfInterest(this.settings.show_points_of_interest); // Move the loading wheel into the map element (it has to live outside in the HTML file because it'll be overwritten by Google otherwise) $(this.engineElement).append($(this.element).find(".wpgmza-loader")); } WPGMZA.GoogleMap.prototype.setOptions = function(options) { Parent.prototype.setOptions.call(this, options); this.googleMap.setOptions(this.settings.toGoogleMapsOptions()); var clone = $.extend({}, options); if(clone.center instanceof WPGMZA.LatLng || typeof clone.center == "object") clone.center = { lat: parseFloat(clone.center.lat), lng: parseFloat(clone.center.lng) }; this.googleMap.setOptions(clone); } /** * Adds the specified marker to this map * @return void */ WPGMZA.GoogleMap.prototype.addMarker = function(marker) { marker.googleMarker.setMap(this.googleMap); Parent.prototype.addMarker.call(this, marker); } /** * Removes the specified marker from this map * @return void */ WPGMZA.GoogleMap.prototype.removeMarker = function(marker) { marker.googleMarker.setMap(null); Parent.prototype.removeMarker.call(this, marker); } /** * Adds the specified polygon to this map * @return void */ WPGMZA.GoogleMap.prototype.addPolygon = function(polygon) { polygon.googlePolygon.setMap(this.googleMap); Parent.prototype.addPolygon.call(this, polygon); } /** * Removes the specified polygon from this map * @return void */ WPGMZA.GoogleMap.prototype.removePolygon = function(polygon) { polygon.googlePolygon.setMap(null); Parent.prototype.removePolygon.call(this, polygon); } /** * Adds the specified polyline to this map * @return void */ WPGMZA.GoogleMap.prototype.addPolyline = function(polyline) { polyline.googlePolyline.setMap(this.googleMap); Parent.prototype.addPolyline.call(this, polyline); } /** * Removes the specified polygon from this map * @return void */ WPGMZA.GoogleMap.prototype.removePolyline = function(polyline) { polyline.googlePolyline.setMap(null); Parent.prototype.removePolyline.call(this, polyline); } WPGMZA.GoogleMap.prototype.addCircle = function(circle) { circle.googleCircle.setMap(this.googleMap); Parent.prototype.addCircle.call(this, circle); } WPGMZA.GoogleMap.prototype.removeCircle = function(circle) { circle.googleCircle.setMap(null); Parent.prototype.removeCircle.call(this, circle); } /** * Delegate for google maps getCenter * @return void */ WPGMZA.GoogleMap.prototype.getCenter = function() { var latLng = this.googleMap.getCenter(); return { lat: latLng.lat(), lng: latLng.lng() }; } /** * Delegate for google maps setCenter * @return void */ WPGMZA.GoogleMap.prototype.setCenter = function(latLng) { WPGMZA.Map.prototype.setCenter.call(this, latLng); if(latLng instanceof WPGMZA.LatLng) this.googleMap.setCenter({ lat: latLng.lat, lng: latLng.lng }); else this.googleMap.setCenter(latLng); } /** * Delegate for google maps setPan * @return void */ WPGMZA.GoogleMap.prototype.panTo = function(latLng) { if(latLng instanceof WPGMZA.LatLng) this.googleMap.panTo({ lat: latLng.lat, lng: latLng.lng }); else this.googleMap.panTo(latLng); } /** * Delegate for google maps getCenter * @return void */ WPGMZA.GoogleMap.prototype.getZoom = function() { return this.googleMap.getZoom(); } /** * Delegate for google maps getZoom * @return void */ WPGMZA.GoogleMap.prototype.setZoom = function(value) { return this.googleMap.setZoom(value); } /** * Gets the bounds * @return object */ WPGMZA.GoogleMap.prototype.getBounds = function() { var bounds = this.googleMap.getBounds(); var northEast = bounds.getNorthEast(); var southWest = bounds.getSouthWest(); return { topLeft: { lat: northEast.lat(), lng: southWest.lng() }, bottomRight: { lat: southWest.lat(), lng: northEast.lng() } }; } /** * Fit to given boundaries * @return void */ WPGMZA.GoogleMap.prototype.fitBounds = function(southWest, northEast) { if(southWest instanceof WPGMZA.LatLng) southWest = {lat: southWest.lat, lng: southWest.lng}; if(northEast instanceof WPGMZA.LatLng) northEast = {lat: northEast.lat, lng: northEast.lng}; this.googleMap.fitBounds(southWest, northEast); } /** * Fit the map boundaries to visible markers * @return void */ WPGMZA.GoogleMap.prototype.fitBoundsToVisibleMarkers = function() { var bounds = new google.maps.LatLngBounds(); for(var i = 0; i < this.markers.length; i++) { if(markers[i].getVisible()) bounds.extend(markers[i].getPosition()); } this.googleMap.fitBounds(bounds); } /** * Enables / disables the bicycle layer * @param enable boolean, enable or not * @return void */ WPGMZA.GoogleMap.prototype.enableBicycleLayer = function(enable) { if(!this.bicycleLayer) this.bicycleLayer = new google.maps.BicyclingLayer(); this.bicycleLayer.setMap( enable ? this.googleMap : null ); } /** * Enables / disables the bicycle layer * @param enable boolean, enable or not * @return void */ WPGMZA.GoogleMap.prototype.enableTrafficLayer = function(enable) { if(!this.trafficLayer) this.trafficLayer = new google.maps.TrafficLayer(); this.trafficLayer.setMap( enable ? this.googleMap : null ); } /** * Enables / disables the bicycle layer * @param enable boolean, enable or not * @return void */ WPGMZA.GoogleMap.prototype.enablePublicTransportLayer = function(enable) { if(!this.publicTransportLayer) this.publicTransportLayer = new google.maps.TransitLayer(); this.publicTransportLayer.setMap( enable ? this.googleMap : null ); } /** * Shows / hides points of interest * @param show boolean, enable or not * @return void */ WPGMZA.GoogleMap.prototype.showPointsOfInterest = function(show) { // TODO: This will bug the front end because there is textarea with theme data var text = $("textarea[name='theme_data']").val(); if(!text) return; var styles = JSON.parse(text); styles.push({ featureType: "poi", stylers: [ { visibility: (show ? "on" : "off") } ] }); this.googleMap.setOptions({styles: styles}); } /** * Gets the min zoom of the map * @return int */ WPGMZA.GoogleMap.prototype.getMinZoom = function() { return parseInt(this.settings.min_zoom); } /** * Sets the min zoom of the map * @return void */ WPGMZA.GoogleMap.prototype.setMinZoom = function(value) { this.googleMap.setOptions({ minZoom: value, maxZoom: this.getMaxZoom() }); } /** * Gets the min zoom of the map * @return int */ WPGMZA.GoogleMap.prototype.getMaxZoom = function() { return parseInt(this.settings.max_zoom); } /** * Sets the min zoom of the map * @return void */ WPGMZA.GoogleMap.prototype.setMaxZoom = function(value) { this.googleMap.setOptions({ minZoom: this.getMinZoom(), maxZoom: value }); } WPGMZA.GoogleMap.prototype.latLngToPixels = function(latLng) { var map = this.googleMap; var nativeLatLng = new google.maps.LatLng({ lat: parseFloat(latLng.lat), lng: parseFloat(latLng.lng) }); var topRight = map.getProjection().fromLatLngToPoint(map.getBounds().getNorthEast()); var bottomLeft = map.getProjection().fromLatLngToPoint(map.getBounds().getSouthWest()); var scale = Math.pow(2, map.getZoom()); var worldPoint = map.getProjection().fromLatLngToPoint(nativeLatLng); return { x: (worldPoint.x - bottomLeft.x) * scale, y: (worldPoint.y - topRight.y) * scale }; } WPGMZA.GoogleMap.prototype.pixelsToLatLng = function(x, y) { if(y == undefined) { if("x" in x && "y" in x) { y = x.y; x = x.x; } else console.warn("Y coordinate undefined in pixelsToLatLng (did you mean to pass 2 arguments?)"); } var map = this.googleMap; var topRight = map.getProjection().fromLatLngToPoint(map.getBounds().getNorthEast()); var bottomLeft = map.getProjection().fromLatLngToPoint(map.getBounds().getSouthWest()); var scale = Math.pow(2, map.getZoom()); var worldPoint = new google.maps.Point(x / scale + bottomLeft.x, y / scale + topRight.y); var latLng = map.getProjection().fromPointToLatLng(worldPoint); return { lat: latLng.lat(), lng: latLng.lng() }; } /** * Handle the map element resizing * @return void */ WPGMZA.GoogleMap.prototype.onElementResized = function(event) { if(!this.googleMap) return; google.maps.event.trigger(this.googleMap, "resize"); } })(jQuery); // js/v8/google-maps/google-marker.js /** * @namespace WPGMZA * @module GoogleMarker * @requires WPGMZA.Marker * @pro-requires WPGMZA.ProMarker */ (function($) { var Parent; WPGMZA.GoogleMarker = function(row) { var self = this; Parent.call(this, row); this.googleMarker = new google.maps.Marker(/*this.settings*/); this.googleMarker.wpgmzaMarker = this; this.googleMarker.setPosition(new google.maps.LatLng({ lat: parseFloat(this.lat), lng: parseFloat(this.lng) })); this.googleMarker.setLabel(this.settings.label); if(this.animation) this.googleMarker.setAnimation(this.animation); google.maps.event.addListener(this.googleMarker, "click", function() { self.dispatchEvent("click"); self.dispatchEvent("select"); }); google.maps.event.addListener(this.googleMarker, "mouseover", function() { self.dispatchEvent("mouseover"); }); google.maps.event.addListener(this.googleMarker, "dragend", function() { var googleMarkerPosition = self.googleMarker.getPosition(); self.setPosition({ lat: googleMarkerPosition.lat(), lng: googleMarkerPosition.lng() }); self.dispatchEvent("dragend"); }); this.trigger("init"); } if(WPGMZA.isProVersion()) Parent = WPGMZA.ProMarker; else Parent = WPGMZA.Marker; WPGMZA.GoogleMarker.prototype = Object.create(Parent.prototype); WPGMZA.GoogleMarker.prototype.constructor = WPGMZA.GoogleMarker; WPGMZA.GoogleMarker.prototype.setLabel = function(label) { if(!label) { this.googleMarker.setLabel(null); return; } this.googleMarker.setLabel({ text: label }); if(!this.googleMarker.getIcon()) this.googleMarker.setIcon(WPGMZA.settings.default_marker_icon); } /** * Sets the position of the marker * @return void */ WPGMZA.GoogleMarker.prototype.setPosition = function(latLng) { Parent.prototype.setPosition.call(this, latLng); this.googleMarker.setPosition({ lat: this.lat, lng: this.lng }); } /** * Sets the position offset of a marker * @return void */ WPGMZA.GoogleMarker.prototype.setOffset = function(x, y) { var self = this; var icon = this.googleMarker.getIcon(); var img = new Image(); var params; if(typeof icon == "string") params = { url: icon }; else params = icon; img.onload = function() { var defaultAnchor = { x: img.width / 2, y: img.height }; params.anchor = new google.maps.Point(defaultAnchor.x - x, defaultAnchor.y - y); self.googleMarker.setIcon(params); } img.src = params.url; } /** * Set the marker animation * @return void */ WPGMZA.GoogleMarker.prototype.setAnimation = function(animation) { Parent.prototype.setAnimation.call(this, animation); this.googleMarker.setAnimation(animation); } /** * Sets the visibility of the marker * @return void */ WPGMZA.GoogleMarker.prototype.setVisible = function(visible) { Parent.prototype.setVisible.call(this, visible); this.googleMarker.setVisible(visible); } WPGMZA.GoogleMarker.prototype.setDraggable = function(draggable) { this.googleMarker.setDraggable(draggable); } })(jQuery); // js/v8/google-maps/google-modern-store-locator-circle.js /** * @namespace WPGMZA * @module GoogleModernStoreLocatorCircle * @requires WPGMZA.ModernStoreLocatorCircle */ (function($) { WPGMZA.GoogleModernStoreLocatorCircle = function(map, settings) { var self = this; WPGMZA.ModernStoreLocatorCircle.call(this, map, settings); this.intervalID = setInterval(function() { var mapSize = { width: $(self.mapElement).width(), height: $(self.mapElement).height() }; if(mapSize.width == self.mapSize.width && mapSize.height == self.mapSize.height) return; self.canvasLayer.resize_(); self.canvasLayer.draw(); self.mapSize = mapSize; }, 1000); $(document).bind('webkitfullscreenchange mozfullscreenchange fullscreenchange', function() { self.canvasLayer.resize_(); self.canvasLayer.draw(); }); } WPGMZA.GoogleModernStoreLocatorCircle.prototype = Object.create(WPGMZA.ModernStoreLocatorCircle.prototype); WPGMZA.GoogleModernStoreLocatorCircle.prototype.constructor = WPGMZA.GoogleModernStoreLocatorCircle; WPGMZA.GoogleModernStoreLocatorCircle.prototype.initCanvasLayer = function() { var self = this; if(this.canvasLayer) { this.canvasLayer.setMap(null); this.canvasLayer.setAnimate(false); } this.canvasLayer = new CanvasLayer({ map: this.map.googleMap, resizeHandler: function(event) { self.onResize(event); }, updateHandler: function(event) { self.onUpdate(event); }, animate: true, resolutionScale: this.getResolutionScale() }); } WPGMZA.GoogleModernStoreLocatorCircle.prototype.setOptions = function(options) { WPGMZA.ModernStoreLocatorCircle.prototype.setOptions.call(this, options); this.canvasLayer.scheduleUpdate(); } WPGMZA.GoogleModernStoreLocatorCircle.prototype.setPosition = function(position) { WPGMZA.ModernStoreLocatorCircle.prototype.setPosition.call(this, position); this.canvasLayer.scheduleUpdate(); } WPGMZA.GoogleModernStoreLocatorCircle.prototype.setRadius = function(radius) { WPGMZA.ModernStoreLocatorCircle.prototype.setRadius.call(this, radius); this.canvasLayer.scheduleUpdate(); } WPGMZA.GoogleModernStoreLocatorCircle.prototype.getTransformedRadius = function(km) { var multiplierAtEquator = 0.006395; var spherical = google.maps.geometry.spherical; var center = this.settings.center; var equator = new WPGMZA.LatLng({ lat: 0.0, lng: 0.0 }); var latitude = new WPGMZA.LatLng({ lat: center.lat, lng: 0.0 }); var offsetAtEquator = spherical.computeOffset(equator.toGoogleLatLng(), km * 1000, 90); var offsetAtLatitude = spherical.computeOffset(latitude.toGoogleLatLng(), km * 1000, 90); var factor = offsetAtLatitude.lng() / offsetAtEquator.lng(); var result = km * multiplierAtEquator * factor; if(isNaN(result)) throw new Error("here"); return result; } WPGMZA.GoogleModernStoreLocatorCircle.prototype.getCanvasDimensions = function() { return { width: this.canvasLayer.canvas.width, height: this.canvasLayer.canvas.height }; } WPGMZA.GoogleModernStoreLocatorCircle.prototype.getWorldOriginOffset = function() { var projection = this.map.googleMap.getProjection(); var position = projection.fromLatLngToPoint(this.canvasLayer.getTopLeft()); return { x: -position.x, y: -position.y }; } WPGMZA.GoogleModernStoreLocatorCircle.prototype.getCenterPixels = function() { var center = new WPGMZA.LatLng(this.settings.center); var projection = this.map.googleMap.getProjection(); return projection.fromLatLngToPoint(center.toGoogleLatLng()); } WPGMZA.GoogleModernStoreLocatorCircle.prototype.getContext = function(type) { return this.canvasLayer.canvas.getContext("2d"); } WPGMZA.GoogleModernStoreLocatorCircle.prototype.getScale = function() { return Math.pow(2, this.map.getZoom()) * this.getResolutionScale(); } WPGMZA.GoogleModernStoreLocatorCircle.prototype.setVisible = function(visible) { WPGMZA.ModernStoreLocatorCircle.prototype.setVisible.call(this, visible); this.canvasLayer.scheduleUpdate(); } WPGMZA.GoogleModernStoreLocatorCircle.prototype.destroy = function() { this.canvasLayer.setMap(null); this.canvasLayer = null; clearInterval(this.intervalID); } })(jQuery); // js/v8/google-maps/google-modern-store-locator.js /** * @namespace WPGMZA * @module GoogleModernStoreLocator * @requires WPGMZA.ModernStoreLocator */ (function($) { WPGMZA.GoogleModernStoreLocator = function(map_id) { WPGMZA.ModernStoreLocator.call(this, map_id); var googleMap; if(WPGMZA.isProVersion()) googleMap = MYMAP[map_id].map.googleMap; else googleMap = MYMAP.map.googleMap; googleMap.controls[google.maps.ControlPosition.TOP_CENTER].push(this.element); } WPGMZA.GoogleModernStoreLocator.prototype = Object.create(WPGMZA.ModernStoreLocator.prototype); WPGMZA.GoogleModernStoreLocator.prototype.constructor = WPGMZA.GoogleModernStoreLocator; })(jQuery); // js/v8/google-maps/google-polygon.js /** * @namespace WPGMZA * @module GooglePolygon * @requires WPGMZA.Polygon * @pro-requires WPGMZA.ProPolygon */ (function($) { var Parent; WPGMZA.GooglePolygon = function(row, googlePolygon) { var self = this; Parent.call(this, row, googlePolygon); if(googlePolygon) { this.googlePolygon = googlePolygon; } else { this.googlePolygon = new google.maps.Polygon(this.settings); if(row && row.points) { var paths = this.parseGeometry(row.points); this.googlePolygon.setOptions({paths: paths}); } } this.googlePolygon.wpgmzaPolygon = this; google.maps.event.addListener(this.googlePolygon, "click", function() { self.dispatchEvent({type: "click"}); }); } if(WPGMZA.isProVersion()) Parent = WPGMZA.ProPolygon; else Parent = WPGMZA.Polygon; WPGMZA.GooglePolygon.prototype = Object.create(Parent.prototype); WPGMZA.GooglePolygon.prototype.constructor = WPGMZA.GooglePolygon; /** * Returns true if the polygon is editable * @return void */ WPGMZA.GooglePolygon.prototype.getEditable = function() { return this.googlePolygon.getOptions().editable; } /** * Sets the editable state of the polygon * @return void */ WPGMZA.GooglePolygon.prototype.setEditable = function(value) { this.googlePolygon.setOptions({editable: value}); } /** * Returns the polygon represented by a JSON object * @return object */ WPGMZA.GooglePolygon.prototype.toJSON = function() { var result = WPGMZA.Polygon.prototype.toJSON.call(this); result.points = []; // TODO: Support holes using multiple paths var path = this.googlePolygon.getPath(); for(var i = 0; i < path.getLength(); i++) { var latLng = path.getAt(i); result.points.push({ lat: latLng.lat(), lng: latLng.lng() }); } return result; } })(jQuery); // js/v8/google-maps/google-polyline.js /** * @namespace WPGMZA * @module GooglePolyline * @requires WPGMZA.Polyline */ (function($) { WPGMZA.GooglePolyline = function(row, googlePolyline) { var self = this; WPGMZA.Polyline.call(this, row, googlePolyline); if(googlePolyline) { this.googlePolyline = googlePolyline; } else { this.googlePolyline = new google.maps.Polyline(this.settings); this.googlePolyline.wpgmzaPolyline = this; if(row && row.points) { var path = this.parseGeometry(row.points); this.setPoints(path); } } google.maps.event.addListener(this.googlePolyline, "click", function() { self.dispatchEvent({type: "click"}); }); } WPGMZA.GooglePolyline.prototype = Object.create(WPGMZA.Polyline.prototype); WPGMZA.GooglePolyline.prototype.constructor = WPGMZA.GooglePolyline; WPGMZA.GooglePolyline.prototype.setEditable = function(value) { this.googlePolyline.setOptions({editable: value}); } WPGMZA.GooglePolyline.prototype.setPoints = function(points) { this.googlePolyline.setOptions({path: points}); } WPGMZA.GooglePolyline.prototype.toJSON = function() { var result = WPGMZA.Polyline.prototype.toJSON.call(this); result.points = []; var path = this.googlePolyline.getPath(); for(var i = 0; i < path.getLength(); i++) { var latLng = path.getAt(i); result.points.push({ lat: latLng.lat(), lng: latLng.lng() }); } return result; } })(jQuery); // js/v8/google-maps/google-vertex-context-menu.js /** * @namespace WPGMZA * @module GoogleVertexContextMenu * @requires wpgmza_api_call */ (function($) { if(WPGMZA.settings.engine != "google-maps") return; WPGMZA.GoogleVertexContextMenu = function(mapEditPage) { var self = this; this.mapEditPage = mapEditPage; this.element = document.createElement("div"); this.element.className = "wpgmza-vertex-context-menu"; this.element.innerHTML = "Delete"; google.maps.event.addDomListener(this.element, "click", function(event) { self.removeVertex(); event.preventDefault(); event.stopPropagation(); return false; }); } WPGMZA.GoogleVertexContextMenu.prototype = new google.maps.OverlayView(); WPGMZA.GoogleVertexContextMenu.prototype.onAdd = function() { var self = this; var map = this.getMap(); this.getPanes().floatPane.appendChild(this.element); this.divListener = google.maps.event.addDomListener(map.getDiv(), "mousedown", function(e) { if(e.target != self.element) self.close(); }, true); } WPGMZA.GoogleVertexContextMenu.prototype.onRemove = function() { google.maps.event.removeListener(this.divListener); this.element.parentNode.removeChild(this.element); this.set("position"); this.set("path"); this.set("vertex"); } WPGMZA.GoogleVertexContextMenu.prototype.open = function(map, path, vertex) { this.set('position', path.getAt(vertex)); this.set('path', path); this.set('vertex', vertex); this.setMap(map); this.draw(); } WPGMZA.GoogleVertexContextMenu.prototype.close = function() { this.setMap(null); } WPGMZA.GoogleVertexContextMenu.prototype.draw = function() { var position = this.get('position'); var projection = this.getProjection(); if (!position || !projection) return; var point = projection.fromLatLngToDivPixel(position); this.element.style.top = point.y + 'px'; this.element.style.left = point.x + 'px'; } WPGMZA.GoogleVertexContextMenu.prototype.removeVertex = function() { var path = this.get('path'); var vertex = this.get('vertex'); if (!path || vertex == undefined) { this.close(); return; } path.removeAt(vertex); this.close(); } })(jQuery); // js/v8/open-layers/ol-circle.js /** * @namespace WPGMZA * @module OLCircle * @requires WPGMZA.Circle */ (function($) { var Parent = WPGMZA.Circle; WPGMZA.OLCircle = function(options, olFeature) { var self = this; this.center = {lat: 0, lng: 0}; this.radius = 0; Parent.call(this, options, olFeature); if(!this.settings.fillColor) { this.settings.fillColor = "#ff0000"; this.settings.fillOpacity = 0.6; } this.olStyle = new ol.style.Style(this.getStyleFromSettings()); // IMPORTANT: Please note that due to what appears to be a bug in OpenLayers, the following code MUST be exected specifically in this order, or the circle won't appear var vectorLayer3857 = new ol.layer.Vector({ source: new ol.source.Vector(), style: this.olStyle }); if(olFeature) { this.olFeature = olFeature; } else { var wgs84Sphere = new ol.Sphere(6378137); var radius = this.radius; var x, y; x = this.center.lng; y = this.center.lat; var circle4326 = ol.geom.Polygon.circular(wgs84Sphere, [x, y], radius, 64); var circle3857 = circle4326.clone().transform('EPSG:4326', 'EPSG:3857'); vectorLayer3857.getSource().addFeature(new ol.Feature(circle3857)); } this.layer = vectorLayer3857; options.map.olMap.addLayer(vectorLayer3857); } WPGMZA.OLCircle.prototype = Object.create(Parent.prototype); WPGMZA.OLCircle.prototype.constructor = WPGMZA.OLCircle; WPGMZA.OLCircle.prototype.getStyleFromSettings = function() { var params = {}; if(this.settings.strokeOpacity) params.stroke = new ol.style.Stroke({ color: WPGMZA.hexOpacityToRGBA(this.settings.strokeColor, this.settings.strokeOpacity) }); if(this.settings.fillOpacity) params.fill = new ol.style.Fill({ color: WPGMZA.hexOpacityToRGBA(this.settings.fillColor, this.settings.fillOpacity) }); return params; } WPGMZA.OLCircle.prototype.updateStyleFromSettings = function() { // Re-create the style - working on it directly doesn't cause a re-render var params = this.getStyleFromSettings(); this.olStyle = new ol.style.Style(params); this.layer.setStyle(this.olStyle); } })(jQuery); // js/v8/open-layers/ol-geocoder.js /** * @namespace WPGMZA * @module OLGeocoder * @requires WPGMZA.Geocoder */ (function($) { /** * @class OLGeocoder * @extends Geocoder * @summary OpenLayers geocoder - uses Nominatim by default */ WPGMZA.OLGeocoder = function() { } WPGMZA.OLGeocoder.prototype = Object.create(WPGMZA.Geocoder.prototype); WPGMZA.OLGeocoder.prototype.constructor = WPGMZA.OLGeocoder; /** * @function getResponseFromCache * @access protected * @summary Tries to retrieve cached coordinates from server cache * @param {string} address The street address to geocode * @param {function} callback Where to send the results, as an array * @return {void} */ WPGMZA.OLGeocoder.prototype.getResponseFromCache = function(address, callback) { $.ajax(WPGMZA.ajaxurl, { data: { action: "wpgmza_query_nominatim_cache", query: address }, success: function(response, xhr, status) { callback(response); } }); } /** * @function getResponseFromNominatim * @access protected * @summary Queries Nominatim on the specified address * @param {object} options An object containing the options for geocoding, address is a mandatory field * @param {function} callback The function to send the results to, as an array */ WPGMZA.OLGeocoder.prototype.getResponseFromNominatim = function(options, callback) { var data = { q: options.address, format: "json" }; if(options.country) data.countrycodes = options.country; $.ajax("https://nominatim.openstreetmap.org/search/", { data: data, success: function(response, xhr, status) { callback(response); }, error: function(response, xhr, status) { callback(null, WPGMZA.Geocoder.FAIL) } }); } /** * @function cacheResponse * @access protected * @summary Caches a response on the server, usually after it's been returned from Nominatim * @param {string} address The street address * @param {object|array} response The response to cache * @returns {void} */ WPGMZA.OLGeocoder.prototype.cacheResponse = function(address, response) { $.ajax(WPGMZA.ajaxurl, { data: { action: "wpgmza_store_nominatim_cache", query: address, response: JSON.stringify(response) }, method: "POST" }); } /** * @function getLatLngFromAddress * @access public * @summary Attempts to geocode an address, firstly by checking the cache for previous * results, if this fails the Nominatim server will be queried, cached and sent to the * specified callback * @param {object} options An object containing the options for geocoding, address is a mandatory field * @param {function} callback The function to send the results to, as an array * @returns {void} */ WPGMZA.OLGeocoder.prototype.getLatLngFromAddress = function(options, callback) { var self = this; var address = options.address; var latLng; if(latLng = WPGMZA.isLatLngString(address)) return WPGMZA.Geocoder.prototype.getLatLngFromAddress.call(this, options, callback); function finish(response, status) { for(var i = 0; i < response.length; i++) { response[i].geometry = { location: new WPGMZA.LatLng({ lat: parseFloat(response[i].lat), lng: parseFloat(response[i].lon) }) }; response[i].lat = parseFloat(response[i].lat); response[i].lng = parseFloat(response[i].lon); } callback(response, status); } this.getResponseFromCache(address, function(response) { if(response.length) { finish(response, WPGMZA.Geocoder.SUCCESS); return; } self.getResponseFromNominatim(options, function(response, status) { if(status == WPGMZA.Geocoder.FAIL) { callback(null, WPGMZA.Geocoder.FAIL); return; } if(response.length == 0) { callback(response, WPGMZA.Geocoder.ZERO_RESULTS); return; } finish(response, WPGMZA.Geocoder.SUCCESS); self.cacheResponse(address, response); }); }); } })(jQuery); // js/v8/open-layers/ol-info-window.js /** * @namespace WPGMZA * @module OLInfoWindow * @requires WPGMZA.InfoWindow * @pro-requires WPGMZA.ProInfoWindow */ (function($) { var Parent; WPGMZA.OLInfoWindow = function(mapObject) { var self = this; Parent.call(this, mapObject); this.element = $("<div class='ol-info-window-container ol-info-window-plain'></div>")[0]; $(this.element).on("click", ".ol-info-window-close", function(event) { self.close(); }); } if(WPGMZA.isProVersion()) Parent = WPGMZA.ProInfoWindow; else Parent = WPGMZA.InfoWindow; WPGMZA.OLInfoWindow.prototype = Object.create(Parent.prototype); WPGMZA.OLInfoWindow.prototype.constructor = WPGMZA.OLInfoWindow; /** * Opens the info window * TODO: This should take a mapObject, not an event * @return boolean FALSE if the info window should not & will not open, TRUE if it will */ WPGMZA.OLInfoWindow.prototype.open = function(map, mapObject) { var self = this; var latLng = mapObject.getPosition(); if(!WPGMZA.InfoWindow.prototype.open.call(this, map, mapObject)) return false; if(this.overlay) this.mapObject.map.olMap.removeOverlay(this.overlay); this.overlay = new ol.Overlay({ element: this.element }); this.overlay.setPosition(ol.proj.fromLonLat([ latLng.lng, latLng.lat ])); self.mapObject.map.olMap.addOverlay(this.overlay); $(this.element).show(); this.dispatchEvent("infowindowopen"); $(this.element).trigger("infowindowopen.wpgmza"); } WPGMZA.OLInfoWindow.prototype.close = function(event) { // TODO: Why? This shouldn't have to be here. Removing the overlay should hide the element (it doesn't) $(this.element).hide(); if(!this.overlay) return; WPGMZA.InfoWindow.prototype.close.call(this); this.mapObject.map.olMap.removeOverlay(this.overlay); this.overlay = null; } WPGMZA.OLInfoWindow.prototype.setContent = function(html) { $(this.element).html("<i class='fa fa-times ol-info-window-close' aria-hidden='true'></i>" + html); } })(jQuery); // js/v8/open-layers/ol-map.js /** * @namespace WPGMZA * @module OLMap * @requires WPGMZA.Map * @pro-requires WPGMZA.ProMap */ (function($) { var Parent; WPGMZA.OLMap = function(element, options) { var self = this; Parent.call(this, element); this.setOptions(options); var viewOptions = this.settings.toOLViewOptions(); $(this.element).html(""); this.olMap = new ol.Map({ target: $(element)[0], layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View(viewOptions) }); // TODO: Re-implement using correct setting names // Interactions this.olMap.getInteractions().forEach(function(interaction) { // NB: The true and false values are flipped because these settings represent the "disabled" state when true if(interaction instanceof ol.interaction.DragPan) interaction.setActive( (this.settings.map_draggable ? false : true) ); else if(interaction instanceof ol.interaction.DoubleClickZoom) interaction.setActive( (this.settings.map_clickzoom ? false : true) ); else if(interaction instanceof ol.interaction.MouseWheelZoom) interaction.setActive( (this.settings.map_scroll ? false : true) ); }, this); // Controls this.olMap.getControls().forEach(function(control) { // NB: The true and false values are flipped because these settings represent the "disabled" state when true if(control instanceof ol.control.Zoom && this.settings.map_zoom) this.olMap.removeControl(control); }, this); if(!this.settings.map_full_screen_control) this.olMap.addControl(new ol.control.FullScreen()); // Marker layer this.markerLayer = new ol.layer.Vector({ source: new ol.source.Vector({ features: [] }) }); this.olMap.addLayer(this.markerLayer); // Listen for end of pan so we can wrap longitude if needs be this.olMap.on("moveend", function(event) { self.wrapLongitude(); self.dispatchEvent("dragend"); self.onIdle(); }); // Listen for zoom this.olMap.getView().on("change:resolution", function(event) { self.dispatchEvent("zoom_changed"); self.dispatchEvent("zoomchanged"); self.onIdle(); $(self.element).trigger("zoomchanged.wpgmza"); }); // Listen for bounds changing this.olMap.getView().on("change", function() { // Wrap longitude self.onBoundsChanged(); }); self.onBoundsChanged(); // Store locator center var marker; if(this.storeLocator && (marker = this.storeLocator.centerPointMarker)) { this.olMap.addOverlay(marker.overlay); marker.setVisible(false); } // Cycling layer console.log(this.settings); // Right click listener $(this.element).on("click contextmenu", function(event) { var isRight; event = event || window.event; if("which" in event) isRight = event.which == 3; else if("button" in event) isRight = event.button == 2; if(!isRight) return; return self.onRightClick(event); }); // Dispatch event if(!WPGMZA.isProVersion()) { this.dispatchEvent("created"); WPGMZA.events.dispatchEvent({type: "mapcreated", map: this}); } } if(WPGMZA.isProVersion()) Parent = WPGMZA.ProMap; else Parent = WPGMZA.Map; WPGMZA.OLMap.prototype = Object.create(Parent.prototype); WPGMZA.OLMap.prototype.constructor = WPGMZA.OLMap; WPGMZA.OLMap.prototype.wrapLongitude = function() { var center = this.getCenter(); if(center.lng >= -180 && center.lng <= 180) return; center.lng = center.lng - 360 * Math.floor(center.lng / 360); if(center.lng > 180) center.lng -= 360; this.setCenter(center); } WPGMZA.OLMap.prototype.getCenter = function() { var lonLat = ol.proj.toLonLat( this.olMap.getView().getCenter() ); return { lat: lonLat[1], lng: lonLat[0] }; } WPGMZA.OLMap.prototype.setCenter = function(latLng) { var view = this.olMap.getView(); WPGMZA.Map.prototype.setCenter.call(this, latLng); view.setCenter(ol.proj.fromLonLat([ latLng.lng, latLng.lat ])); this.wrapLongitude(); this.onBoundsChanged(); } WPGMZA.OLMap.prototype.getBounds = function() { var bounds = this.olMap.getView().calculateExtent(this.olMap.getSize()); var topLeft = ol.proj.toLonLat([bounds[0], bounds[1]]); var bottomRight = ol.proj.toLonLat([bounds[2], bounds[3]]); return { topLeft: { lat: topLeft[1], lng: topLeft[0] }, bottomRight: { lat: bottomRight[1], lng: bottomRight[0] } }; } /** * Fit to given boundaries * @return void */ WPGMZA.OLMap.prototype.fitBounds = function(southWest, northEast) { this.olMap.getView().fitExtent( [southWest.lng, southWest.lat, northEast.lng, northEast.lat], this.olMap.getSize() ); } WPGMZA.OLMap.prototype.panTo = function(latLng) { var view = this.olMap.getView(); view.animate({ center: ol.proj.fromLonLat([ parseFloat(latLng.lng), parseFloat(latLng.lat), ]), duration: 500 }); } WPGMZA.OLMap.prototype.getZoom = function() { return Math.round( this.olMap.getView().getZoom() ) + 1; } WPGMZA.OLMap.prototype.setZoom = function(value) { this.olMap.getView().setZoom(value); } WPGMZA.OLMap.prototype.getMinZoom = function() { return this.olMap.getView().getMinZoom(); } WPGMZA.OLMap.prototype.setMinZoom = function(value) { this.olMap.getView().setMinZoom(value); } WPGMZA.OLMap.prototype.getMaxZoom = function() { return this.olMap.getView().getMaxZoom(); } WPGMZA.OLMap.prototype.setMaxZoom = function(value) { this.olMap.getView().setMaxZoom(value); } WPGMZA.OLMap.prototype.setOptions = function(options) { Parent.prototype.setOptions.call(this, options); if(!this.olMap) return; this.olMap.getView().setProperties( this.settings.toOLViewOptions() ); } /** * TODO: Consider moving all these functions to their respective classes, same on google map (DO IT!!! It's very misleading having them here) */ WPGMZA.OLMap.prototype.addMarker = function(marker) { this.olMap.addOverlay(marker.overlay); Parent.prototype.addMarker.call(this, marker); } WPGMZA.OLMap.prototype.removeMarker = function(marker) { this.olMap.removeOverlay(marker.overlay); Parent.prototype.removeMarker.call(this, marker); } WPGMZA.OLMap.prototype.addPolygon = function(polygon) { this.olMap.addLayer(polygon.layer); Parent.prototype.addPolygon.call(this, polygon); } WPGMZA.OLMap.prototype.removePolygon = function(polygon) { this.olMap.removeLayer(polygon.layer); Parent.prototype.removePolygon.call(this, polygon); } WPGMZA.OLMap.prototype.addPolyline = function(polyline) { this.olMap.addLayer(polyline.layer); Parent.prototype.addPolyline.call(this, polyline); } WPGMZA.OLMap.prototype.removePolyline = function(polyline) { this.olMap.removeLayer(polyline.layer); Parent.prototype.removePolyline.call(this, polyline); } WPGMZA.OLMap.prototype.addCircle = function(circle) { this.olMap.addLayer(circle.layer); Parent.prototype.addCircle.call(this, circle); } WPGMZA.OLMap.prototype.removeCircle = function(circle) { this.olMap.removeLayer(circle.layer); Parent.prototype.removeCircle.call(this, circle); } WPGMZA.OLMap.prototype.pixelsToLatLng = function(x, y) { if(y == undefined) { if("x" in x && "y" in x) { y = x.y; x = x.x; } else console.warn("Y coordinate undefined in pixelsToLatLng (did you mean to pass 2 arguments?)"); } var coord = this.olMap.getCoordinateFromPixel([x, y]); if(!coord) return { x: null, y: null }; var lonLat = ol.proj.toLonLat(coord); return { lat: lonLat[1], lng: lonLat[0] }; } WPGMZA.OLMap.prototype.latLngToPixels = function(latLng) { var coord = ol.proj.fromLonLat([latLng.lng, latLng.lat]); var pixel = this.olMap.getPixelFromCoordinate(coord); if(!pixel) return { x: null, y: null }; return { x: pixel[0], y: pixel[1] }; } WPGMZA.OLMap.prototype.enableBicycleLayer = function(value) { if(value) { if(!this.bicycleLayer) this.bicycleLayer = new ol.layer.Tile({ source: new ol.source.OSM({ url: "http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png" }) }); this.olMap.addLayer(this.bicycleLayer); } else { if(!this.bicycleLayer) return; this.olMap.removeLayer(this.bicycleLayer); } } WPGMZA.OLMap.prototype.onElementResized = function(event) { this.olMap.updateSize(); } WPGMZA.OLMap.prototype.onRightClick = function(event) { if($(event.target).closest(".ol-marker, .wpgmza_modern_infowindow, .wpgmza-modern-store-locator").length) return true; var parentOffset = $(this.element).offset(); var relX = event.pageX - parentOffset.left; var relY = event.pageY - parentOffset.top; var latLng = this.pixelsToLatLng(relX, relY); this.trigger({type: "rightclick", latLng: latLng}); $(this.element).trigger("rightclick.wpgmza"); event.preventDefault(); return false; } })(jQuery); // js/v8/open-layers/ol-marker.js /** * @namespace WPGMZA * @module OLMarker * @requires WPGMZA.Marker * @pro-requires WPGMZA.ProMarker */ (function($) { var Parent; WPGMZA.OLMarker = function(row) { var self = this; Parent.call(this, row); var origin = ol.proj.fromLonLat([ parseFloat(this.lng), parseFloat(this.lat) ]); this.element = $("<div class='ol-marker'><img src='" + WPGMZA.settings.default_marker_icon + "'/></div>")[0]; $(this.element).on("click", function(event) { self.dispatchEvent("click"); self.dispatchEvent("select"); }); $(this.element).on("mouseover", function(event) { self.dispatchEvent("mouseover"); }); this.overlay = new ol.Overlay({ element: this.element }); this.overlay.setPosition(origin); if(this.animation) this.setAnimation(this.animation); this.setLabel(this.settings.label); if(row.draggable) this.setDraggable(true); this.trigger("init"); } if(WPGMZA.isProVersion()) Parent = WPGMZA.ProMarker; else Parent = WPGMZA.Marker; WPGMZA.OLMarker.prototype = Object.create(Parent.prototype); WPGMZA.OLMarker.prototype.constructor = WPGMZA.OLMarker; WPGMZA.OLMarker.prototype.addLabel = function() { this.setLabel(this.getLabelText()); } WPGMZA.OLMarker.prototype.setLabel = function(label) { if(!label) { if(this.label) $(this.element).find(".ol-marker-label").remove(); return; } if(!this.label) { this.label = $("<div class='ol-marker-label'/>"); $(this.element).append(this.label); } this.label.html(label); } WPGMZA.OLMarker.prototype.setVisible = function(visible) { Parent.prototype.setVisible(visible); this.overlay.getElement().style.display = (visible ? "block" : "none"); } WPGMZA.OLMarker.prototype.setPosition = function(latLng) { Parent.prototype.setPosition.call(this, latLng); var origin = ol.proj.fromLonLat([ parseFloat(this.lng), parseFloat(this.lat) ]); this.overlay.setPosition(origin); } WPGMZA.OLMarker.prototype.setOffset = function(x, y) { this.element.style.position = "relative"; this.element.style.left = x + "px"; this.element.style.top = y + "px"; } WPGMZA.OLMarker.prototype.setAnimation = function(anim) { Parent.prototype.setAnimation.call(this, anim); switch(anim) { case WPGMZA.Marker.ANIMATION_NONE: $(this.element).removeAttr("data-anim"); break; case WPGMZA.Marker.ANIMATION_BOUNCE: $(this.element).attr("data-anim", "bounce"); break; case WPGMZA.Marker.ANIMATION_DROP: $(this.element).attr("data-anim", "drop"); break; } } WPGMZA.OLMarker.prototype.setDraggable = function(draggable) { var self = this; if(draggable) { var options = { disabled: false }; if(!this.jQueryDraggableInitialized) { options.stop = function(event) { self.onDragEnd(event); } } $(this.element).draggable(options); } else $(this.element).draggable({disabled: true}); } WPGMZA.OLMarker.prototype.onDragEnd = function(event) { var offset = { top: parseFloat( $(this.element).css("top").match(/-?\d+/)[0] ), left: parseFloat( $(this.element).css("left").match(/-?\d+/)[0] ) }; $(this.element).css({ top: "0px", left: "0px" }); console.log(offset); var currentLatLng = this.getPosition(); var pixelsBeforeDrag = this.map.latLngToPixels(currentLatLng); var pixelsAfterDrag = { x: pixelsBeforeDrag.x + offset.left, y: pixelsBeforeDrag.y + offset.top }; var latLngAfterDrag = this.map.pixelsToLatLng(pixelsAfterDrag); this.setPosition(latLngAfterDrag); this.trigger({type: "dragend", latLng: latLngAfterDrag}) $(this.element).trigger("dragend.wpgmza"); } })(jQuery); // js/v8/open-layers/ol-modern-store-locator-circle.js /** * @namespace WPGMZA * @module OLModernStoreLocatorCircle * @requires WPGMZA.ModernStoreLocatorCircle */ (function($) { WPGMZA.OLModernStoreLocatorCircle = function(map, settings) { WPGMZA.ModernStoreLocatorCircle.call(this, map, settings); } WPGMZA.OLModernStoreLocatorCircle.prototype = Object.create(WPGMZA.ModernStoreLocatorCircle.prototype); WPGMZA.OLModernStoreLocatorCircle.prototype.constructor = WPGMZA.OLModernStoreLocatorCircle; WPGMZA.OLModernStoreLocatorCircle.prototype.initCanvasLayer = function() { var self = this; var mapElement = $(this.map.element); var olViewportElement = mapElement.children(".ol-viewport"); this.canvas = document.createElement("canvas"); this.canvas.className = "wpgmza-ol-canvas-overlay"; mapElement.append(this.canvas); this.renderFunction = function(event) { if(self.canvas.width != olViewportElement.width() || self.canvas.height != olViewportElement.height()) { self.canvas.width = olViewportElement.width(); self.canvas.height = olViewportElement.height(); $(this.canvas).css({ width: olViewportElement.width() + "px", height: olViewportElement.height() + "px" }); } self.draw(); }; this.map.olMap.on("postrender", this.renderFunction); } WPGMZA.OLModernStoreLocatorCircle.prototype.getContext = function(type) { return this.canvas.getContext(type); } WPGMZA.OLModernStoreLocatorCircle.prototype.getCanvasDimensions = function() { return { width: this.canvas.width, height: this.canvas.height }; } WPGMZA.OLModernStoreLocatorCircle.prototype.getCenterPixels = function() { var center = this.map.latLngToPixels(this.settings.center); return center; } WPGMZA.OLModernStoreLocatorCircle.prototype.getWorldOriginOffset = function() { return { x: 0, y: 0 }; } WPGMZA.OLModernStoreLocatorCircle.prototype.getTransformedRadius = function(km) { var center = new WPGMZA.LatLng(this.settings.center); var outer = new WPGMZA.LatLng(center); outer.moveByDistance(km, 90); var centerPixels = this.map.latLngToPixels(center); var outerPixels = this.map.latLngToPixels(outer); return Math.abs(outerPixels.x - centerPixels.x); if(!window.testMarker){ window.testMarker = WPGMZA.Marker.createInstance({ position: outer }); WPGMZA.maps[0].addMarker(window.testMarker); } return 100; } WPGMZA.OLModernStoreLocatorCircle.prototype.getScale = function() { return 1; } WPGMZA.OLModernStoreLocatorCircle.prototype.destroy = function() { $(this.canvas).remove(); this.map.olMap.un("postrender", this.renderFunction); this.map = null; this.canvas = null; } })(jQuery); // js/v8/open-layers/ol-modern-store-locator.js /** * @namespace WPGMZA * @module OLModernStoreLocator * @requires WPGMZA.ModernStoreLocator */ (function($) { WPGMZA.OLModernStoreLocator = function(map_id) { var element; WPGMZA.ModernStoreLocator.call(this, map_id); if(WPGMZA.isProVersion()) element = $(".wpgmza_map[data-map-id='" + map_id + "']"); else element = $("#wpgmza_map"); element.append(this.element); } WPGMZA.OLModernStoreLocator.prototype = Object.create(WPGMZA.ModernStoreLocator); WPGMZA.OLModernStoreLocator.prototype.constructor = WPGMZA.OLModernStoreLocator; })(jQuery); // js/v8/open-layers/ol-polygon.js /** * @namespace WPGMZA * @module OLPolygon * @requires WPGMZA.Polygon * @pro-requires WPGMZA.ProPolygon */ (function($) { var Parent; WPGMZA.OLPolygon = function(row, olFeature) { var self = this; Parent.call(this, row, olFeature); this.olStyle = new ol.style.Style(); if(olFeature) { this.olFeature = olFeature; } else { var coordinates = [[]]; if(row && row.points) { var paths = this.parseGeometry(row.points); for(var i = 0; i < paths.length; i++) coordinates[0].push(ol.proj.fromLonLat([ parseFloat(paths[i].lng), parseFloat(paths[i].lat) ])); this.olStyle = new ol.style.Style(this.getStyleFromSettings()); } this.olFeature = new ol.Feature({ geometry: new ol.geom.Polygon(coordinates) }); } this.layer = new ol.layer.Vector({ source: new ol.source.Vector({ features: [this.olFeature] }), style: this.olStyle }); this.layer.getSource().getFeatures()[0].setProperties({ wpgmzaPolygon: this }); } if(WPGMZA.isProVersion()) Parent = WPGMZA.ProPolygon; else Parent = WPGMZA.Polygon; WPGMZA.OLPolygon.prototype = Object.create(Parent.prototype); WPGMZA.OLPolygon.prototype.constructor = WPGMZA.OLPolygon; WPGMZA.OLPolygon.prototype.getStyleFromSettings = function() { var params = {}; if(this.settings.strokeOpacity) params.stroke = new ol.style.Stroke({ color: WPGMZA.hexOpacityToRGBA(this.settings.strokeColor, this.settings.strokeOpacity) }); if(this.settings.fillOpacity) params.fill = new ol.style.Fill({ color: WPGMZA.hexOpacityToRGBA(this.settings.fillColor, this.settings.fillOpacity) }); return params; } WPGMZA.OLPolygon.prototype.updateStyleFromSettings = function() { // Re-create the style - working on it directly doesn't cause a re-render var params = this.getStyleFromSettings(); this.olStyle = new ol.style.Style(params); this.layer.setStyle(this.olStyle); } WPGMZA.OLPolygon.prototype.setEditable = function(editable) { } WPGMZA.OLPolygon.prototype.toJSON = function() { var result = Parent.prototype.toJSON.call(this); var coordinates = this.olFeature.getGeometry().getCoordinates()[0]; result.points = []; for(var i = 0; i < coordinates.length; i++) { var lonLat = ol.proj.toLonLat(coordinates[i]); var latLng = { lat: lonLat[1], lng: lonLat[0] }; result.points.push(latLng); } return result; } })(jQuery); // js/v8/open-layers/ol-polyline.js /** * @namespace WPGMZA * @module OLPolyline * @requires WPGMZA.Polyline */ (function($) { var Parent; WPGMZA.OLPolyline = function(row, olFeature) { var self = this; WPGMZA.Polyline.call(this, row); this.olStyle = new ol.style.Style(); if(olFeature) { this.olFeature = olFeature; } else { var coordinates = []; if(row && row.points) { var path = this.parseGeometry(row.points); for(var i = 0; i < path.length; i++) coordinates.push(ol.proj.fromLonLat([ parseFloat(path[i].lng), parseFloat(path[i].lat) ])); } var params = this.getStyleFromSettings(); this.olStyle = new ol.style.Style(params); this.olFeature = new ol.Feature({ geometry: new ol.geom.LineString(coordinates) }); } this.layer = new ol.layer.Vector({ source: new ol.source.Vector({ features: [this.olFeature] }), style: this.olStyle }); this.layer.getSource().getFeatures()[0].setProperties({ wpgmzaPolyling: this }); } Parent = WPGMZA.Polyline; WPGMZA.OLPolyline.prototype = Object.create(Parent.prototype); WPGMZA.OLPolyline.prototype.constructor = WPGMZA.OLPolyline; WPGMZA.OLPolyline.prototype.getStyleFromSettings = function() { var params = {}; if(this.settings.strokeOpacity) params.stroke = new ol.style.Stroke({ color: WPGMZA.hexOpacityToRGBA(this.settings.strokeColor, this.settings.strokeOpacity), width: parseInt(this.settings.strokeWeight) }); return params; } WPGMZA.OLPolyline.prototype.updateStyleFromSettings = function() { // Re-create the style - working on it directly doesn't cause a re-render var params = this.getStyleFromSettings(); this.olStyle = new ol.style.Style(params); this.layer.setStyle(this.olStyle); } WPGMZA.OLPolyline.prototype.setEditable = function(editable) { } WPGMZA.OLPolyline.prototype.setPoints = function(points) { if(this.olFeature) this.layer.getSource().removeFeature(this.olFeature); var coordinates = []; for(var i = 0; i < points.length; i++) coordinates.push(ol.proj.fromLonLat([ parseFloat(points[i].lng), parseFloat(points[i].lat) ])); this.olFeature = new ol.Feature({ geometry: new ol.geom.LineString(coordinates) }); this.layer.getSource().addFeature(this.olFeature); } WPGMZA.OLPolyline.prototype.toJSON = function() { var result = Parent.prototype.toJSON.call(this); var coordinates = this.olFeature.getGeometry().getCoordinates(); result.points = []; for(var i = 0; i < coordinates.length; i++) { var lonLat = ol.proj.toLonLat(coordinates[i]); var latLng = { lat: lonLat[1], lng: lonLat[0] }; result.points.push(latLng); } return result; } })(jQuery);
Google Maps Markerlabel This.draw Is Not a Function
Source: http://www.venuworks.com/wp-content/plugins/wp-google-maps/docs/wp-google-maps.combined.js.html