/**
 * @class Ext.util.Geolocation
 * @extend Ext.Evented
 * Provides a cross browser class for retrieving location information.
 *
 * Based on the [Geolocation API Specification](http://dev.w3.org/geo/api/spec-source.html)
 *
 * When instantiated, by default this class immediately begins tracking location information,
 * firing a {@link #locationupdate} event when new location information is available.  To disable this
 * location tracking (which may be battery intensive on mobile devices), set {@link #autoUpdate} to `false`.
 *
 * When this is done, only calls to {@link #updateLocation} will trigger a location retrieval.
 *
 * A {@link #locationerror} event is raised when an error occurs retrieving the location, either due to a user
 * denying the application access to it, or the browser not supporting it.
 *
 * The below code shows a GeoLocation making a single retrieval of location information.
 *
 *     var geo = Ext.create('Ext.util.Geolocation', {
 *         autoUpdate: false,
 *         listeners: {
 *             locationupdate: function(geo) {
 *                 alert('New latitude: ' + geo.getLatitude());
 *             },
 *             locationerror: function(geo, bTimeout, bPermissionDenied, bLocationUnavailable, message) {
 *                 if(bTimeout){
 *                     alert('Timeout occurred.');
 *                 } else {
 *                     alert('Error occurred.');
 *                 }
 *             }
 *         }
 *     });
 *     geo.updateLocation();
 */
 
/**
 * @event locationerror
 * Raised when a location retrieval operation failed.
 *
 * In the case of calling updateLocation, this event will be raised only once.
 *
 * If {@link #autoUpdate} is set to `true`, this event could be raised repeatedly.
 * The first error is relative to the moment {@link #autoUpdate} was set to `true`
 * (or this {@link Ext.util.Geolocation} was initialized with the {@link #autoUpdate} config option set to `true`).
 * Subsequent errors are relative to the moment when the device determines that it's position has changed.
 * @param {Ext.util.Geolocation} this
 * @param {Boolean} timeout 
 * Boolean indicating a timeout occurred
 * @param {Boolean} permissionDenied 
 * Boolean indicating the user denied the location request
 * @param {Boolean} locationUnavailable 
 * Boolean indicating that the location of the device could not be determined.
 * For instance, one or more of the location providers used in the location acquisition
 * process reported an internal error that caused the process to fail entirely.
 * @param {String} message An error message describing the details of the error encountered.
 *
 * This attribute is primarily intended for debugging and should not be used
 * directly in an application user interface.
 * @accessor
 */
 
/**
 * @event locationupdate
 * Raised when a location retrieval operation has been completed successfully.
 * @param {Ext.util.Geolocation} this
 * Retrieve the current location information from the GeoLocation object by using the read-only
 * properties: {@link #latitude}, {@link #longitude}, {@link #accuracy},
 * {@link #altitude}, {@link #altitudeAccuracy}, {@link #heading}, and {@link #speed}.
 * @accessor
 */
 
/**
 * @cfg {Boolean} [autoUpdate=true]
 * When set to `true`, continually monitor the location of the device (beginning immediately)
 * and fire {@link #locationupdate} and {@link #locationerror} events.
 * @accessor
 */
 
/**
 * @cfg {Number} [frequency=10000]
 * The frequency of each update if {@link #autoUpdate} is set to `true`.
 * @accessor
 */
 
/**
 * @cfg {Number} latitude 
 * Read-only property representing the last retrieved
 * geographical coordinate specified in degrees.
 * @readonly
 * @accessor
 */
 
/**
 * @cfg {Number} longitude 
 * Read-only property representing the last retrieved
 * geographical coordinate specified in degrees.
 * @readonly
 * @accessor
 */
 
/**
 * @cfg {Number} accuracy 
 * Read-only property representing the last retrieved
 * accuracy level of the latitude and longitude coordinates,
 * specified in meters.
 *
 * This will always be a non-negative number.
 *
 * This corresponds to a 95% confidence level.
 * @readonly
 * @accessor
 */
 
/**
 * @cfg {Number} altitude 
 * Read-only property representing the last retrieved
 * height of the position, specified in meters above the ellipsoid
 * [WGS84](http://dev.w3.org/geo/api/spec-source.html#ref-wgs).
 * @readonly
 * @accessor
 */
 
/**
 * @cfg {Number} altitudeAccuracy 
 * Read-only property representing the last retrieved
 * accuracy level of the altitude coordinate, specified in meters.
 *
 * If altitude is not null then this will be a non-negative number.
 * Otherwise this returns `null`.
 *
 * This corresponds to a 95% confidence level.
 * @readonly
 * @accessor
 */
 
/**
 * @cfg {Number} heading 
 * Read-only property representing the last retrieved
 * direction of travel of the hosting device,
 * specified in non-negative degrees between 0 and 359,
 * counting clockwise relative to the true north.
 *
 * If speed is 0 (device is stationary), then this returns `NaN`.
 * @readonly
 * @accessor
 */
 
/**
 * @cfg {Number} speed 
 * Read-only property representing the last retrieved
 * current ground speed of the device, specified in meters per second.
 *
 * If this feature is unsupported by the device, this returns `null`.
 *
 * If the device is stationary, this returns 0,
 * otherwise it returns a non-negative number.
 * @readonly
 * @accessor
 */
 
/**
 * @cfg {Date} timestamp 
 * Read-only property representing when the last retrieved
 * positioning information was acquired by the device.
 * @readonly
 * @accessor
 */
 
/**
 * @cfg {Boolean} [allowHighAccuracy=false]
 * When set to `true`, provide a hint that the application would like to receive
 * the best possible results. This may result in slower response times or increased power consumption.
 * The user might also deny this capability, or the device might not be able to provide more accurate
 * results than if this option was set to `false`.
 * @accessor
 */
 
/**
 * @cfg {Number} [timeout=Infinity]
 * The maximum number of milliseconds allowed to elapse between a location update operation
 * and the corresponding {@link #locationupdate} event being raised.  If a location was not successfully
 * acquired before the given timeout elapses (and no other internal errors have occurred in this interval),
 * then a {@link #locationerror} event will be raised indicating a timeout as the cause.
 *
 * Note that the time that is spent obtaining the user permission is **not** included in the period
 * covered by the timeout.  The `timeout` attribute only applies to the location acquisition operation.
 *
 * In the case of calling `updateLocation`, the {@link #locationerror} event will be raised only once.
 *
 * If {@link #autoUpdate} is set to `true`, the {@link #locationerror} event could be raised repeatedly.
 * The first timeout is relative to the moment {@link #autoUpdate} was set to `true`
 * (or this {@link Ext.util.Geolocation} was initialized with the {@link #autoUpdate} config option set to `true`).
 * Subsequent timeouts are relative to the moment when the device determines that it's position has changed.
 * @accessor
 */
 
/**
 * @cfg {Number} [maximumAge=0]
 * This option indicates that the application is willing to accept cached location information whose age
 * is no greater than the specified time in milliseconds. If `maximumAge` is set to 0, an attempt to retrieve
 * new location information is made immediately.
 *
 * Setting the `maximumAge` to Infinity returns a cached position regardless of its age.
 *
 * If the device does not have cached location information available whose age is no
 * greater than the specified `maximumAge`, then it must acquire new location information.
 *
 * For example, if location information no older than 10 minutes is required, set this property to 600000.
 * @accessor
 */