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