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