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