/**
* @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);