# Source: 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);